@lobehub/ui 5.23.4 → 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 +1 @@
1
- {"version":3,"file":"Avatar.mjs","names":["A","Flexbox"],"sources":["../../../../src/chat/ChatItem/components/Avatar.tsx"],"sourcesContent":["import { type CSSProperties, type FC, useMemo } from 'react';\n\nimport A from '@/Avatar';\nimport { Flexbox } from '@/Flex';\n\nimport { styles } from '../style';\nimport type { ChatItemProps } from '../type';\nimport Loading from './Loading';\n\nexport interface AvatarProps {\n addon?: ChatItemProps['avatarAddon'];\n alt?: string;\n avatar: ChatItemProps['avatar'];\n loading?: ChatItemProps['loading'];\n onClick?: ChatItemProps['onAvatarClick'];\n placement?: ChatItemProps['placement'];\n size?: number;\n style?: CSSProperties;\n unoptimized?: boolean;\n}\n\nconst Avatar: FC<AvatarProps> = ({\n loading,\n avatar,\n placement,\n unoptimized,\n addon,\n onClick,\n size = 40,\n style,\n alt,\n}) => {\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--chat-item-avatar-size': `${size}px`,\n }),\n [size],\n );\n\n const avatarContent = (\n <div className={styles.avatarContainer} style={{ ...cssVariables, ...style }}>\n <A\n alt={alt || avatar.title}\n animation={loading}\n avatar={avatar.avatar}\n background={avatar.backgroundColor}\n size={size}\n title={avatar.title}\n unoptimized={unoptimized}\n onClick={onClick}\n />\n <Loading loading={loading} placement={placement} />\n </div>\n );\n\n if (!addon) return avatarContent;\n return (\n <Flexbox align={'center'} className={styles.avatarGroupContainer} gap={8}>\n {avatarContent}\n {addon}\n </Flexbox>\n );\n};\n\nexport default Avatar;\n"],"mappings":";;;;;;;AAqBA,MAAM,UAA2B,EAC/B,SACA,QACA,WACA,aACA,OACA,SACA,OAAO,IACP,OACA,UACI;CACJ,MAAM,eAAe,eACZ,EACL,2BAA2B,GAAG,KAAK,IACrC,IACA,CAAC,IAAI,CACP;CAEA,MAAM,gBACJ,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAiB,OAAO;GAAE,GAAG;GAAc,GAAG;EAAM;YAA3E,CACE,oBAACA,UAAD;GACE,KAAK,OAAO,OAAO;GACnB,WAAW;GACX,QAAQ,OAAO;GACf,YAAY,OAAO;GACb;GACN,OAAO,OAAO;GACD;GACJ;EACV,CAAA,GACD,oBAAC,SAAD;GAAkB;GAAoB;EAAY,CAAA,CAC/C;;CAGP,IAAI,CAAC,OAAO,OAAO;CACnB,OACE,qBAACC,mBAAD;EAAS,OAAO;EAAU,WAAW,OAAO;EAAsB,KAAK;YAAvE,CACG,eACA,KACM;;AAEb"}
1
+ {"version":3,"file":"Avatar.mjs","names":["A","Flexbox"],"sources":["../../../../src/chat/ChatItem/components/Avatar.tsx"],"sourcesContent":["import { type CSSProperties, type FC, useMemo } from 'react';\n\nimport A from '@/Avatar';\nimport { Flexbox } from '@/Flex';\n\nimport { styles } from '../style';\nimport type { ChatItemProps } from '../type';\nimport Loading from './Loading';\n\nexport interface AvatarProps {\n addon?: ChatItemProps['avatarAddon'];\n alt?: string;\n avatar: ChatItemProps['avatar'];\n loading?: ChatItemProps['loading'];\n onClick?: ChatItemProps['onAvatarClick'];\n placement?: ChatItemProps['placement'];\n size?: number;\n style?: CSSProperties;\n unoptimized?: boolean;\n}\n\nconst Avatar: FC<AvatarProps> = ({\n loading,\n avatar,\n placement,\n unoptimized,\n addon,\n onClick,\n size = 40,\n style,\n alt,\n}) => {\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--chat-item-avatar-size': `${size}px`,\n }),\n [size],\n );\n\n const avatarContent = (\n <div className={styles.avatarContainer} style={{ ...cssVariables, ...style }}>\n <A\n alt={alt || avatar.title}\n animation={loading}\n avatar={avatar.avatar}\n background={avatar.backgroundColor}\n size={size}\n title={avatar.title}\n unoptimized={unoptimized}\n onClick={onClick}\n />\n <Loading loading={loading} placement={placement} />\n </div>\n );\n\n if (!addon) return avatarContent;\n return (\n <Flexbox align={'center'} className={styles.avatarGroupContainer} gap={8}>\n {avatarContent}\n {addon}\n </Flexbox>\n );\n};\n\nexport default Avatar;\n"],"mappings":";;;;;;;AAqBA,MAAM,UAA2B,EAC/B,SACA,QACA,WACA,aACA,OACA,SACA,OAAO,IACP,OACA,UACI;CACJ,MAAM,eAAe,eACZ,EACL,2BAA2B,GAAG,KAAK,IACrC,IACA,CAAC,IAAI,CACP;CAEA,MAAM,gBACJ,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAiB,OAAO;GAAE,GAAG;GAAc,GAAG;EAAM;EAA3E,UAAA,CACE,oBAACA,UAAD;GACE,KAAK,OAAO,OAAO;GACnB,WAAW;GACX,QAAQ,OAAO;GACf,YAAY,OAAO;GACb;GACN,OAAO,OAAO;GACD;GACJ;EACV,CAAA,GACD,oBAAC,SAAD;GAAkB;GAAoB;EAAY,CAAA,CAC/C;;CAGP,IAAI,CAAC,OAAO,OAAO;CACnB,OACE,qBAACC,mBAAD;EAAS,OAAO;EAAU,WAAW,OAAO;EAAsB,KAAK;EAAvE,UAAA,CACG,eACA,KACM;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorContent.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/ErrorContent.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport Alert from '@/Alert';\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport { Flexbox } from '@/Flex';\n\nimport { styles } from '../style';\n\nexport interface ErrorContentProps {\n error?: ChatItemProps['error'];\n message?: ChatItemProps['errorMessage'];\n placement?: ChatItemProps['placement'];\n}\n\nconst ErrorContent: FC<ErrorContentProps> = ({ message, error }) => {\n return (\n <Flexbox className={styles.errorContainer}>\n <Alert showIcon closable={false} extra={message} type={'error'} {...error} />\n </Flexbox>\n );\n};\n\nexport default ErrorContent;\n"],"mappings":";;;;;AAcA,MAAM,gBAAuC,EAAE,SAAS,YAAY;CAClE,OACE,oBAACA,mBAAD;EAAS,WAAW,OAAO;YACzB,oBAAC,OAAD;GAAO,UAAA;GAAS,UAAU;GAAO,OAAO;GAAS,MAAM;GAAS,GAAI;EAAQ,CAAA;CACrE,CAAA;AAEb"}
1
+ {"version":3,"file":"ErrorContent.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/ErrorContent.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport Alert from '@/Alert';\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport { Flexbox } from '@/Flex';\n\nimport { styles } from '../style';\n\nexport interface ErrorContentProps {\n error?: ChatItemProps['error'];\n message?: ChatItemProps['errorMessage'];\n placement?: ChatItemProps['placement'];\n}\n\nconst ErrorContent: FC<ErrorContentProps> = ({ message, error }) => {\n return (\n <Flexbox className={styles.errorContainer}>\n <Alert showIcon closable={false} extra={message} type={'error'} {...error} />\n </Flexbox>\n );\n};\n\nexport default ErrorContent;\n"],"mappings":";;;;;AAcA,MAAM,gBAAuC,EAAE,SAAS,YAAY;CAClE,OACE,oBAACA,mBAAD;EAAS,WAAW,OAAO;EACzB,UAAA,oBAAC,OAAD;GAAO,UAAA;GAAS,UAAU;GAAO,OAAO;GAAS,MAAM;GAAS,GAAI;EAAQ,CAAA;CACrE,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Loading.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/Loading.tsx"],"sourcesContent":["import { Loader2 } from 'lucide-react';\nimport type { FC } from 'react';\n\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { styles } from '../style';\n\nexport interface LoadingProps {\n loading?: ChatItemProps['loading'];\n placement?: ChatItemProps['placement'];\n}\n\nconst Loading: FC<LoadingProps> = ({ loading, placement = 'left' }) => {\n if (!loading) return null;\n\n return (\n <Flexbox\n align={'center'}\n className={placement === 'left' ? styles.loadingLeft : styles.loadingRight}\n justify={'center'}\n >\n <Icon spin icon={Loader2} size={{ size: 12, strokeWidth: 3 }} />\n </Flexbox>\n );\n};\n\nexport default Loading;\n"],"mappings":";;;;;;AAcA,MAAM,WAA6B,EAAE,SAAS,YAAY,aAAa;CACrE,IAAI,CAAC,SAAS,OAAO;CAErB,OACE,oBAACA,mBAAD;EACE,OAAO;EACP,WAAW,cAAc,SAAS,OAAO,cAAc,OAAO;EAC9D,SAAS;YAET,oBAAC,MAAD;GAAM,MAAA;GAAK,MAAM;GAAS,MAAM;IAAE,MAAM;IAAI,aAAa;GAAE;EAAI,CAAA;CACxD,CAAA;AAEb"}
1
+ {"version":3,"file":"Loading.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/Loading.tsx"],"sourcesContent":["import { Loader2 } from 'lucide-react';\nimport type { FC } from 'react';\n\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { styles } from '../style';\n\nexport interface LoadingProps {\n loading?: ChatItemProps['loading'];\n placement?: ChatItemProps['placement'];\n}\n\nconst Loading: FC<LoadingProps> = ({ loading, placement = 'left' }) => {\n if (!loading) return null;\n\n return (\n <Flexbox\n align={'center'}\n className={placement === 'left' ? styles.loadingLeft : styles.loadingRight}\n justify={'center'}\n >\n <Icon spin icon={Loader2} size={{ size: 12, strokeWidth: 3 }} />\n </Flexbox>\n );\n};\n\nexport default Loading;\n"],"mappings":";;;;;;AAcA,MAAM,WAA6B,EAAE,SAAS,YAAY,aAAa;CACrE,IAAI,CAAC,SAAS,OAAO;CAErB,OACE,oBAACA,mBAAD;EACE,OAAO;EACP,WAAW,cAAc,SAAS,OAAO,cAAc,OAAO;EAC9D,SAAS;EAET,UAAA,oBAAC,MAAD;GAAM,MAAA;GAAK,MAAM;GAAS,MAAM;IAAE,MAAM;IAAI,aAAa;GAAE;EAAI,CAAA;CACxD,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageContent.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/MessageContent.tsx"],"sourcesContent":["import { cx, useResponsive } from 'antd-style';\nimport { memo, type ReactNode, useMemo } from 'react';\n\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport EditableMessage from '@/chat/EditableMessage';\nimport { Flexbox } from '@/Flex';\nimport { type MarkdownProps } from '@/Markdown';\n\nimport { styles } from '../style';\n\nexport interface MessageContentProps {\n editing?: ChatItemProps['editing'];\n fontSize?: number;\n markdownProps?: Omit<MarkdownProps, 'className' | 'style' | 'children'>;\n message?: ReactNode;\n messageExtra?: ChatItemProps['messageExtra'];\n onChange?: ChatItemProps['onChange'];\n onDoubleClick?: ChatItemProps['onDoubleClick'];\n onEditingChange?: ChatItemProps['onEditingChange'];\n placement?: ChatItemProps['placement'];\n primary?: ChatItemProps['primary'];\n renderMessage?: ChatItemProps['renderMessage'];\n text?: ChatItemProps['text'];\n variant?: ChatItemProps['variant'];\n}\n\nconst MessageContent = memo<MessageContentProps>(\n ({\n editing,\n onChange,\n onEditingChange,\n text,\n message,\n placement,\n messageExtra,\n renderMessage,\n variant,\n primary,\n onDoubleClick,\n fontSize,\n markdownProps,\n }) => {\n // placement and primary are part of the interface but not used in this component\n void placement;\n void primary;\n const { mobile } = useResponsive();\n\n const messageClassName = useMemo(() => {\n if (variant === 'bubble') return styles.messageBubble;\n // For docs variant, we need title info, but we don't have it here\n // Use withoutTitle as default\n return styles.messageDocsWithoutTitle;\n }, [variant]);\n\n const editingContainerClassName = useMemo(() => {\n return variant === 'docs' ? styles.editingContainerDocs : styles.editingContainer;\n }, [variant]);\n\n const content = (\n <EditableMessage\n fullFeaturedCodeBlock\n classNames={{ input: styles.editingInput }}\n editButtonSize={'small'}\n editing={editing}\n fontSize={fontSize}\n markdownProps={markdownProps}\n openModal={mobile ? editing : undefined}\n text={text}\n value={message ? String(message) : ''}\n onChange={onChange}\n onEditingChange={onEditingChange}\n />\n );\n const messageContent = renderMessage ? renderMessage(content) : content;\n\n return (\n <Flexbox\n className={cx(messageClassName, editing && editingContainerClassName)}\n onDoubleClick={onDoubleClick}\n >\n {messageContent}\n {messageExtra && !editing ? (\n <div className={styles.messageExtra}>{messageExtra}</div>\n ) : null}\n </Flexbox>\n );\n },\n);\n\nexport default MessageContent;\n"],"mappings":";;;;;;;AA0BA,MAAM,iBAAiB,MACpB,EACC,SACA,UACA,iBACA,MACA,SACA,WACA,cACA,eACA,SACA,SACA,eACA,UACA,oBACI;CAIJ,MAAM,EAAE,WAAW,cAAc;CAEjC,MAAM,mBAAmB,cAAc;EACrC,IAAI,YAAY,UAAU,OAAO,OAAO;EAGxC,OAAO,OAAO;CAChB,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,4BAA4B,cAAc;EAC9C,OAAO,YAAY,SAAS,OAAO,uBAAuB,OAAO;CACnE,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,UACJ,oBAAC,iBAAD;EACE,uBAAA;EACA,YAAY,EAAE,OAAO,OAAO,aAAa;EACzC,gBAAgB;EACP;EACC;EACK;EACf,WAAW,SAAS,UAAU,KAAA;EACxB;EACN,OAAO,UAAU,OAAO,OAAO,IAAI;EACzB;EACO;CAClB,CAAA;CAEH,MAAM,iBAAiB,gBAAgB,cAAc,OAAO,IAAI;CAEhE,OACE,qBAACA,mBAAD;EACE,WAAW,GAAG,kBAAkB,WAAW,yBAAyB;EACrD;YAFjB,CAIG,gBACA,gBAAgB,CAAC,UAChB,oBAAC,OAAD;GAAK,WAAW,OAAO;aAAe;EAAkB,CAAA,IACtD,IACG;;AAEb,CACF"}
1
+ {"version":3,"file":"MessageContent.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/MessageContent.tsx"],"sourcesContent":["import { cx, useResponsive } from 'antd-style';\nimport { memo, type ReactNode, useMemo } from 'react';\n\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport EditableMessage from '@/chat/EditableMessage';\nimport { Flexbox } from '@/Flex';\nimport { type MarkdownProps } from '@/Markdown';\n\nimport { styles } from '../style';\n\nexport interface MessageContentProps {\n editing?: ChatItemProps['editing'];\n fontSize?: number;\n markdownProps?: Omit<MarkdownProps, 'className' | 'style' | 'children'>;\n message?: ReactNode;\n messageExtra?: ChatItemProps['messageExtra'];\n onChange?: ChatItemProps['onChange'];\n onDoubleClick?: ChatItemProps['onDoubleClick'];\n onEditingChange?: ChatItemProps['onEditingChange'];\n placement?: ChatItemProps['placement'];\n primary?: ChatItemProps['primary'];\n renderMessage?: ChatItemProps['renderMessage'];\n text?: ChatItemProps['text'];\n variant?: ChatItemProps['variant'];\n}\n\nconst MessageContent = memo<MessageContentProps>(\n ({\n editing,\n onChange,\n onEditingChange,\n text,\n message,\n placement,\n messageExtra,\n renderMessage,\n variant,\n primary,\n onDoubleClick,\n fontSize,\n markdownProps,\n }) => {\n // placement and primary are part of the interface but not used in this component\n void placement;\n void primary;\n const { mobile } = useResponsive();\n\n const messageClassName = useMemo(() => {\n if (variant === 'bubble') return styles.messageBubble;\n // For docs variant, we need title info, but we don't have it here\n // Use withoutTitle as default\n return styles.messageDocsWithoutTitle;\n }, [variant]);\n\n const editingContainerClassName = useMemo(() => {\n return variant === 'docs' ? styles.editingContainerDocs : styles.editingContainer;\n }, [variant]);\n\n const content = (\n <EditableMessage\n fullFeaturedCodeBlock\n classNames={{ input: styles.editingInput }}\n editButtonSize={'small'}\n editing={editing}\n fontSize={fontSize}\n markdownProps={markdownProps}\n openModal={mobile ? editing : undefined}\n text={text}\n value={message ? String(message) : ''}\n onChange={onChange}\n onEditingChange={onEditingChange}\n />\n );\n const messageContent = renderMessage ? renderMessage(content) : content;\n\n return (\n <Flexbox\n className={cx(messageClassName, editing && editingContainerClassName)}\n onDoubleClick={onDoubleClick}\n >\n {messageContent}\n {messageExtra && !editing ? (\n <div className={styles.messageExtra}>{messageExtra}</div>\n ) : null}\n </Flexbox>\n );\n },\n);\n\nexport default MessageContent;\n"],"mappings":";;;;;;;AA0BA,MAAM,iBAAiB,MACpB,EACC,SACA,UACA,iBACA,MACA,SACA,WACA,cACA,eACA,SACA,SACA,eACA,UACA,oBACI;CAIJ,MAAM,EAAE,WAAW,cAAc;CAEjC,MAAM,mBAAmB,cAAc;EACrC,IAAI,YAAY,UAAU,OAAO,OAAO;EAGxC,OAAO,OAAO;CAChB,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,4BAA4B,cAAc;EAC9C,OAAO,YAAY,SAAS,OAAO,uBAAuB,OAAO;CACnE,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,UACJ,oBAAC,iBAAD;EACE,uBAAA;EACA,YAAY,EAAE,OAAO,OAAO,aAAa;EACzC,gBAAgB;EACP;EACC;EACK;EACf,WAAW,SAAS,UAAU,KAAA;EACxB;EACN,OAAO,UAAU,OAAO,OAAO,IAAI;EACzB;EACO;CAClB,CAAA;CAEH,MAAM,iBAAiB,gBAAgB,cAAc,OAAO,IAAI;CAEhE,OACE,qBAACA,mBAAD;EACE,WAAW,GAAG,kBAAkB,WAAW,yBAAyB;EACrD;EAFjB,UAAA,CAIG,gBACA,gBAAgB,CAAC,UAChB,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAe,UAAA;EAAkB,CAAA,IACtD,IACG;;AAEb,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"Title.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/Title.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport { Flexbox } from '@/Flex';\nimport { formatTime } from '@/utils/formatTime';\n\nimport { styles } from '../style';\n\nexport interface TitleProps {\n avatar: ChatItemProps['avatar'];\n placement?: ChatItemProps['placement'];\n showTitle?: ChatItemProps['showTitle'];\n time?: ChatItemProps['time'];\n titleAddon?: ChatItemProps['titleAddon'];\n}\n\nconst Title: FC<TitleProps> = ({ showTitle, placement = 'left', time, avatar, titleAddon }) => {\n return (\n <Flexbox\n align={'center'}\n className={placement === 'left' ? styles.nameLeft : styles.nameRight}\n direction={placement === 'left' ? 'horizontal' : 'horizontal-reverse'}\n gap={4}\n >\n {showTitle ? avatar.title || 'untitled' : undefined}\n {showTitle ? titleAddon : undefined}\n {time && <time>{formatTime(time)}</time>}\n </Flexbox>\n );\n};\n\nexport default Title;\n"],"mappings":";;;;;AAgBA,MAAM,SAAyB,EAAE,WAAW,YAAY,QAAQ,MAAM,QAAQ,iBAAiB;CAC7F,OACE,qBAACA,mBAAD;EACE,OAAO;EACP,WAAW,cAAc,SAAS,OAAO,WAAW,OAAO;EAC3D,WAAW,cAAc,SAAS,eAAe;EACjD,KAAK;YAJP;GAMG,YAAY,OAAO,SAAS,aAAa,KAAA;GACzC,YAAY,aAAa,KAAA;GACzB,QAAQ,oBAAC,QAAD,EAAA,UAAO,WAAW,IAAI,EAAQ,CAAA;EAChC;;AAEb"}
1
+ {"version":3,"file":"Title.mjs","names":["Flexbox"],"sources":["../../../../src/chat/ChatItem/components/Title.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport { type ChatItemProps } from '@/chat/ChatItem';\nimport { Flexbox } from '@/Flex';\nimport { formatTime } from '@/utils/formatTime';\n\nimport { styles } from '../style';\n\nexport interface TitleProps {\n avatar: ChatItemProps['avatar'];\n placement?: ChatItemProps['placement'];\n showTitle?: ChatItemProps['showTitle'];\n time?: ChatItemProps['time'];\n titleAddon?: ChatItemProps['titleAddon'];\n}\n\nconst Title: FC<TitleProps> = ({ showTitle, placement = 'left', time, avatar, titleAddon }) => {\n return (\n <Flexbox\n align={'center'}\n className={placement === 'left' ? styles.nameLeft : styles.nameRight}\n direction={placement === 'left' ? 'horizontal' : 'horizontal-reverse'}\n gap={4}\n >\n {showTitle ? avatar.title || 'untitled' : undefined}\n {showTitle ? titleAddon : undefined}\n {time && <time>{formatTime(time)}</time>}\n </Flexbox>\n );\n};\n\nexport default Title;\n"],"mappings":";;;;;AAgBA,MAAM,SAAyB,EAAE,WAAW,YAAY,QAAQ,MAAM,QAAQ,iBAAiB;CAC7F,OACE,qBAACA,mBAAD;EACE,OAAO;EACP,WAAW,cAAc,SAAS,OAAO,WAAW,OAAO;EAC3D,WAAW,cAAc,SAAS,eAAe;EACjD,KAAK;EAJP,UAAA;GAMG,YAAY,OAAO,SAAS,aAAa,KAAA;GACzC,YAAY,aAAa,KAAA;GACzB,QAAQ,oBAAC,QAAD,EAAA,UAAO,WAAW,IAAI,EAAQ,CAAA;EAChC;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatList.mjs","names":[],"sources":["../../../src/chat/ChatList/ChatList.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { Fragment, memo } from 'react';\n\nimport ChatListItem from './components/ChatListItem';\nimport HistoryDivider from './components/HistoryDivider';\nimport { styles } from './style';\nimport type { ChatListProps } from './type';\n\nconst ChatList = memo<ChatListProps>(\n ({\n onActionsClick,\n onAvatarsClick,\n renderMessagesExtra,\n className,\n data,\n variant = 'bubble',\n text,\n showTitle,\n onMessageChange,\n renderMessages,\n renderErrorMessages,\n loadingId,\n renderItems,\n enableHistoryCount,\n renderActions,\n historyCount = 0,\n showAvatar,\n ...rest\n }) => {\n return (\n <div className={cx(styles.container, className)} {...rest}>\n {data.map((item, index) => {\n const itemProps = {\n loading: loadingId === item.id,\n onActionsClick,\n onAvatarsClick,\n onMessageChange,\n renderActions,\n renderErrorMessages,\n renderItems,\n renderMessages,\n renderMessagesExtra,\n showAvatar,\n showTitle,\n text,\n variant,\n };\n\n const historyLength = data.length;\n const enableHistoryDivider =\n enableHistoryCount &&\n historyLength > historyCount &&\n historyCount === historyLength - index + 1;\n\n return (\n <Fragment key={item.id}>\n <HistoryDivider enable={enableHistoryDivider} text={text?.history} />\n <ChatListItem {...itemProps} {...item} />\n </Fragment>\n );\n })}\n </div>\n );\n },\n);\n\nexport default ChatList;\n"],"mappings":";;;;;;;;AAUA,MAAM,WAAW,MACd,EACC,gBACA,gBACA,qBACA,WACA,MACA,UAAU,UACV,MACA,WACA,iBACA,gBACA,qBACA,WACA,aACA,oBACA,eACA,eAAe,GACf,YACA,GAAG,WACC;CACJ,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,OAAO,WAAW,SAAS;EAAG,GAAI;YAClD,KAAK,KAAK,MAAM,UAAU;GACzB,MAAM,YAAY;IAChB,SAAS,cAAc,KAAK;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GAEA,MAAM,gBAAgB,KAAK;GAM3B,OACE,qBAAC,UAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;IAAgB,QANlB,sBACA,gBAAgB,gBAChB,iBAAiB,gBAAgB,QAAQ;IAIO,MAAM,MAAM;GAAU,CAAA,GACpE,oBAAC,cAAD;IAAc,GAAI;IAAW,GAAI;GAAO,CAAA,CAChC,EAAA,GAHK,KAAK,EAGV;EAEd,CAAC;CACE,CAAA;AAET,CACF"}
1
+ {"version":3,"file":"ChatList.mjs","names":[],"sources":["../../../src/chat/ChatList/ChatList.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { Fragment, memo } from 'react';\n\nimport ChatListItem from './components/ChatListItem';\nimport HistoryDivider from './components/HistoryDivider';\nimport { styles } from './style';\nimport type { ChatListProps } from './type';\n\nconst ChatList = memo<ChatListProps>(\n ({\n onActionsClick,\n onAvatarsClick,\n renderMessagesExtra,\n className,\n data,\n variant = 'bubble',\n text,\n showTitle,\n onMessageChange,\n renderMessages,\n renderErrorMessages,\n loadingId,\n renderItems,\n enableHistoryCount,\n renderActions,\n historyCount = 0,\n showAvatar,\n ...rest\n }) => {\n return (\n <div className={cx(styles.container, className)} {...rest}>\n {data.map((item, index) => {\n const itemProps = {\n loading: loadingId === item.id,\n onActionsClick,\n onAvatarsClick,\n onMessageChange,\n renderActions,\n renderErrorMessages,\n renderItems,\n renderMessages,\n renderMessagesExtra,\n showAvatar,\n showTitle,\n text,\n variant,\n };\n\n const historyLength = data.length;\n const enableHistoryDivider =\n enableHistoryCount &&\n historyLength > historyCount &&\n historyCount === historyLength - index + 1;\n\n return (\n <Fragment key={item.id}>\n <HistoryDivider enable={enableHistoryDivider} text={text?.history} />\n <ChatListItem {...itemProps} {...item} />\n </Fragment>\n );\n })}\n </div>\n );\n },\n);\n\nexport default ChatList;\n"],"mappings":";;;;;;;;AAUA,MAAM,WAAW,MACd,EACC,gBACA,gBACA,qBACA,WACA,MACA,UAAU,UACV,MACA,WACA,iBACA,gBACA,qBACA,WACA,aACA,oBACA,eACA,eAAe,GACf,YACA,GAAG,WACC;CACJ,OACE,oBAAC,OAAD;EAAK,WAAW,GAAG,OAAO,WAAW,SAAS;EAAG,GAAI;EAClD,UAAA,KAAK,KAAK,MAAM,UAAU;GACzB,MAAM,YAAY;IAChB,SAAS,cAAc,KAAK;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GAEA,MAAM,gBAAgB,KAAK;GAM3B,OACE,qBAAC,UAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;IAAgB,QANlB,sBACA,gBAAgB,gBAChB,iBAAiB,gBAAgB,QAAQ;IAIO,MAAM,MAAM;GAAU,CAAA,GACpE,oBAAC,cAAD;IAAc,GAAI;IAAW,GAAI;GAAO,CAAA,CAChC,EAAA,GAHK,KAAK,EAGV;EAEd,CAAC;CACE,CAAA;AAET,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"HistoryDivider.mjs","names":["Tag"],"sources":["../../../../src/chat/ChatList/components/HistoryDivider.tsx"],"sourcesContent":["import { Divider } from 'antd';\nimport { Timer } from 'lucide-react';\nimport { type FC } from 'react';\n\nimport Icon from '@/Icon';\nimport Tag from '@/Tag';\n\ninterface HistoryDividerProps {\n enable?: boolean;\n text?: string;\n}\n\nconst HistoryDivider: FC<HistoryDividerProps> = ({ enable, text }) => {\n if (!enable) return null;\n\n return (\n <div style={{ padding: '0 20px' }}>\n <Divider>\n <Tag icon={<Icon icon={Timer} />}>{text || 'History Message'}</Tag>\n </Divider>\n </div>\n );\n};\n\nexport default HistoryDivider;\n"],"mappings":";;;;;;AAYA,MAAM,kBAA2C,EAAE,QAAQ,WAAW;CACpE,IAAI,CAAC,QAAQ,OAAO;CAEpB,OACE,oBAAC,OAAD;EAAK,OAAO,EAAE,SAAS,SAAS;YAC9B,oBAAC,SAAD,EAAA,UACE,oBAACA,OAAD;GAAK,MAAM,oBAAC,MAAD,EAAM,MAAM,MAAQ,CAAA;aAAI,QAAQ;EAAuB,CAAA,EAC3D,CAAA;CACN,CAAA;AAET"}
1
+ {"version":3,"file":"HistoryDivider.mjs","names":["Tag"],"sources":["../../../../src/chat/ChatList/components/HistoryDivider.tsx"],"sourcesContent":["import { Divider } from 'antd';\nimport { Timer } from 'lucide-react';\nimport { type FC } from 'react';\n\nimport Icon from '@/Icon';\nimport Tag from '@/Tag';\n\ninterface HistoryDividerProps {\n enable?: boolean;\n text?: string;\n}\n\nconst HistoryDivider: FC<HistoryDividerProps> = ({ enable, text }) => {\n if (!enable) return null;\n\n return (\n <div style={{ padding: '0 20px' }}>\n <Divider>\n <Tag icon={<Icon icon={Timer} />}>{text || 'History Message'}</Tag>\n </Divider>\n </div>\n );\n};\n\nexport default HistoryDivider;\n"],"mappings":";;;;;;AAYA,MAAM,kBAA2C,EAAE,QAAQ,WAAW;CACpE,IAAI,CAAC,QAAQ,OAAO;CAEpB,OACE,oBAAC,OAAD;EAAK,OAAO,EAAE,SAAS,SAAS;EAC9B,UAAA,oBAAC,SAAD,EAAA,UACE,oBAACA,OAAD;GAAK,MAAM,oBAAC,MAAD,EAAM,MAAM,MAAQ,CAAA;GAAI,UAAA,QAAQ;EAAuB,CAAA,EAC3D,CAAA;CACN,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditableMessage.mjs","names":["useControlledState"],"sources":["../../../src/chat/EditableMessage/EditableMessage.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport MessageInput from '@/chat/MessageInput';\nimport MessageModal from '@/chat/MessageModal';\nimport Markdown from '@/Markdown';\n\nimport { type EditableMessageProps } from './type';\n\nconst EditableMessage = memo<EditableMessageProps>(\n ({\n value,\n onChange,\n classNames = {},\n onEditingChange,\n editing,\n openModal,\n onOpenChange,\n placeholder,\n showEditWhenEmpty = false,\n styles: customStyles,\n className,\n style,\n height,\n variant,\n editButtonSize,\n text,\n fullFeaturedCodeBlock,\n model,\n fontSize,\n language = 'markdown',\n markdownProps,\n }) => {\n const [isEdit, setTyping] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n const [expand, setExpand] = useControlledState<boolean>(false, {\n onChange: onOpenChange,\n value: openModal,\n });\n\n const isAutoSize = height === 'auto';\n\n const input = (\n <MessageInput\n shortcut\n className={cx(className, classNames?.input)}\n classNames={classNames}\n defaultValue={value}\n editButtonSize={editButtonSize}\n height={height}\n language={language}\n placeholder={placeholder}\n styles={customStyles}\n text={text}\n variant={variant}\n style={{\n ...style,\n ...customStyles?.input,\n }}\n onCancel={() => setTyping(false)}\n onConfirm={(text) => {\n onChange?.(text);\n setTyping(false);\n }}\n />\n );\n\n if (!value && showEditWhenEmpty) return input;\n\n return (\n <>\n {!expand && isEdit ? (\n input\n ) : (\n <Markdown\n className={cx(className, classNames?.markdown)}\n fontSize={fontSize}\n fullFeaturedCodeBlock={fullFeaturedCodeBlock}\n variant={'chat'}\n style={{\n height: isAutoSize ? 'unset' : height,\n ...style,\n ...customStyles?.markdown,\n }}\n {...markdownProps}\n >\n {value || placeholder || ''}\n </Markdown>\n )}\n {expand && (\n <MessageModal\n editing={isEdit}\n extra={model?.extra}\n footer={model?.footer}\n height={height}\n language={language}\n open={expand}\n placeholder={placeholder}\n text={text}\n value={value}\n onChange={onChange}\n onEditingChange={setTyping}\n onOpenChange={(e) => {\n setExpand(e);\n setTyping(false);\n }}\n />\n )}\n </>\n );\n },\n);\n\nEditableMessage.displayName = 'EditableMessage';\n\nexport default EditableMessage;\n"],"mappings":";;;;;;;;;AAYA,MAAM,kBAAkB,MACrB,EACC,OACA,UACA,aAAa,CAAC,GACd,iBACA,SACA,WACA,cACA,aACA,oBAAoB,OACpB,QAAQ,cACR,WACA,OACA,QACA,SACA,gBACA,MACA,uBACA,OACA,UACA,WAAW,YACX,oBACI;CACJ,MAAM,CAAC,QAAQ,aAAaA,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,CAAC,QAAQ,aAAaA,cAA4B,OAAO;EAC7D,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,aAAa,WAAW;CAE9B,MAAM,QACJ,oBAAC,cAAD;EACE,UAAA;EACA,WAAW,GAAG,WAAW,YAAY,KAAK;EAC9B;EACZ,cAAc;EACE;EACR;EACE;EACG;EACb,QAAQ;EACF;EACG;EACT,OAAO;GACL,GAAG;GACH,GAAG,cAAc;EACnB;EACA,gBAAgB,UAAU,KAAK;EAC/B,YAAY,SAAS;GACnB,WAAW,IAAI;GACf,UAAU,KAAK;EACjB;CACD,CAAA;CAGH,IAAI,CAAC,SAAS,mBAAmB,OAAO;CAExC,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,CAAC,UAAU,SACV,QAEA,oBAAC,UAAD;EACE,WAAW,GAAG,WAAW,YAAY,QAAQ;EACnC;EACa;EACvB,SAAS;EACT,OAAO;GACL,QAAQ,aAAa,UAAU;GAC/B,GAAG;GACH,GAAG,cAAc;EACnB;EACA,GAAI;YAEH,SAAS,eAAe;CACjB,CAAA,GAEX,UACC,oBAAC,cAAD;EACE,SAAS;EACT,OAAO,OAAO;EACd,QAAQ,OAAO;EACP;EACE;EACV,MAAM;EACO;EACP;EACC;EACG;EACV,iBAAiB;EACjB,eAAe,MAAM;GACnB,UAAU,CAAC;GACX,UAAU,KAAK;EACjB;CACD,CAAA,CAEH,EAAA,CAAA;AAEN,CACF;AAEA,gBAAgB,cAAc"}
1
+ {"version":3,"file":"EditableMessage.mjs","names":["useControlledState"],"sources":["../../../src/chat/EditableMessage/EditableMessage.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport MessageInput from '@/chat/MessageInput';\nimport MessageModal from '@/chat/MessageModal';\nimport Markdown from '@/Markdown';\n\nimport { type EditableMessageProps } from './type';\n\nconst EditableMessage = memo<EditableMessageProps>(\n ({\n value,\n onChange,\n classNames = {},\n onEditingChange,\n editing,\n openModal,\n onOpenChange,\n placeholder,\n showEditWhenEmpty = false,\n styles: customStyles,\n className,\n style,\n height,\n variant,\n editButtonSize,\n text,\n fullFeaturedCodeBlock,\n model,\n fontSize,\n language = 'markdown',\n markdownProps,\n }) => {\n const [isEdit, setTyping] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n const [expand, setExpand] = useControlledState<boolean>(false, {\n onChange: onOpenChange,\n value: openModal,\n });\n\n const isAutoSize = height === 'auto';\n\n const input = (\n <MessageInput\n shortcut\n className={cx(className, classNames?.input)}\n classNames={classNames}\n defaultValue={value}\n editButtonSize={editButtonSize}\n height={height}\n language={language}\n placeholder={placeholder}\n styles={customStyles}\n text={text}\n variant={variant}\n style={{\n ...style,\n ...customStyles?.input,\n }}\n onCancel={() => setTyping(false)}\n onConfirm={(text) => {\n onChange?.(text);\n setTyping(false);\n }}\n />\n );\n\n if (!value && showEditWhenEmpty) return input;\n\n return (\n <>\n {!expand && isEdit ? (\n input\n ) : (\n <Markdown\n className={cx(className, classNames?.markdown)}\n fontSize={fontSize}\n fullFeaturedCodeBlock={fullFeaturedCodeBlock}\n variant={'chat'}\n style={{\n height: isAutoSize ? 'unset' : height,\n ...style,\n ...customStyles?.markdown,\n }}\n {...markdownProps}\n >\n {value || placeholder || ''}\n </Markdown>\n )}\n {expand && (\n <MessageModal\n editing={isEdit}\n extra={model?.extra}\n footer={model?.footer}\n height={height}\n language={language}\n open={expand}\n placeholder={placeholder}\n text={text}\n value={value}\n onChange={onChange}\n onEditingChange={setTyping}\n onOpenChange={(e) => {\n setExpand(e);\n setTyping(false);\n }}\n />\n )}\n </>\n );\n },\n);\n\nEditableMessage.displayName = 'EditableMessage';\n\nexport default EditableMessage;\n"],"mappings":";;;;;;;;;AAYA,MAAM,kBAAkB,MACrB,EACC,OACA,UACA,aAAa,CAAC,GACd,iBACA,SACA,WACA,cACA,aACA,oBAAoB,OACpB,QAAQ,cACR,WACA,OACA,QACA,SACA,gBACA,MACA,uBACA,OACA,UACA,WAAW,YACX,oBACI;CACJ,MAAM,CAAC,QAAQ,aAAaA,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,CAAC,QAAQ,aAAaA,cAA4B,OAAO;EAC7D,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,aAAa,WAAW;CAE9B,MAAM,QACJ,oBAAC,cAAD;EACE,UAAA;EACA,WAAW,GAAG,WAAW,YAAY,KAAK;EAC9B;EACZ,cAAc;EACE;EACR;EACE;EACG;EACb,QAAQ;EACF;EACG;EACT,OAAO;GACL,GAAG;GACH,GAAG,cAAc;EACnB;EACA,gBAAgB,UAAU,KAAK;EAC/B,YAAY,SAAS;GACnB,WAAW,IAAI;GACf,UAAU,KAAK;EACjB;CACD,CAAA;CAGH,IAAI,CAAC,SAAS,mBAAmB,OAAO;CAExC,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,CAAC,UAAU,SACV,QAEA,oBAAC,UAAD;EACE,WAAW,GAAG,WAAW,YAAY,QAAQ;EACnC;EACa;EACvB,SAAS;EACT,OAAO;GACL,QAAQ,aAAa,UAAU;GAC/B,GAAG;GACH,GAAG,cAAc;EACnB;EACA,GAAI;EAEH,UAAA,SAAS,eAAe;CACjB,CAAA,GAEX,UACC,oBAAC,cAAD;EACE,SAAS;EACT,OAAO,OAAO;EACd,QAAQ,OAAO;EACP;EACE;EACV,MAAM;EACO;EACP;EACC;EACG;EACV,iBAAiB;EACjB,eAAe,MAAM;GACnB,UAAU,CAAC;GACX,UAAU,KAAK;EACjB;CACD,CAAA,CAEH,EAAA,CAAA;AAEN,CACF;AAEA,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditableMessageList.mjs","names":["editableMessageMessages","Flexbox"],"sources":["../../../src/chat/EditableMessageList/EditableMessageList.tsx"],"sourcesContent":["'use client';\n\nimport isEqual from 'fast-deep-equal';\nimport { Plus, Trash } from 'lucide-react';\nimport { memo, useEffect, useReducer } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport Button from '@/Button';\nimport ControlInput from '@/EditableText/ControlInput';\nimport { Flexbox } from '@/Flex';\nimport editableMessageMessages from '@/i18n/resources/en/editableMessage';\nimport { useTranslation } from '@/i18n/useTranslation';\nimport Select from '@/Select';\n\nimport { messagesReducer } from './messageReducer';\nimport { type EditableMessageListProps } from './type';\n\nconst EditableMessageList = memo<EditableMessageListProps>(\n ({ disabled, dataSources, onChange, texts }) => {\n const [chatMessages, dispatch] = useReducer(messagesReducer, dataSources);\n const { t } = useTranslation(editableMessageMessages);\n\n const addPropsText = texts?.addProps ?? t('editableMessage.addProps');\n const deleteText = texts?.delete ?? t('editableMessage.delete');\n const inputPlaceholderText = texts?.inputPlaceholder ?? t('editableMessage.inputPlaceholder');\n const outputPlaceholderText =\n texts?.outputPlaceholder ?? t('editableMessage.outputPlaceholder');\n const systemText = texts?.system ?? t('editableMessage.system');\n const inputText = texts?.input ?? t('editableMessage.input');\n const outputText = texts?.output ?? t('editableMessage.output');\n\n useEffect(() => {\n if (!isEqual(dataSources, chatMessages)) {\n onChange?.(chatMessages);\n }\n }, [chatMessages]);\n\n return dataSources ? (\n <Flexbox gap={12}>\n {chatMessages.map((item, index) => (\n <Flexbox\n horizontal\n align={'center'}\n gap={8}\n key={`${index}-${item.content}`}\n width={'100%'}\n >\n <Select\n disabled={disabled}\n style={{ width: 120 }}\n styles={{ popup: { root: { zIndex: 100 } } }}\n value={item.role}\n options={[\n { label: systemText, value: 'system' },\n { label: inputText, value: 'user' },\n { label: outputText, value: 'assistant' },\n ]}\n onChange={(value) => {\n dispatch({ index, role: value, type: 'updateMessageRole' });\n }}\n />\n <ControlInput\n disabled={disabled}\n placeholder={item.role === 'user' ? inputPlaceholderText : outputPlaceholderText}\n value={item.content}\n onChange={(e) => {\n dispatch({ index, message: e, type: 'updateMessage' });\n }}\n />\n <ActionIcon\n icon={Trash}\n title={deleteText}\n variant={'filled'}\n onClick={() => {\n dispatch({ index, type: 'deleteMessage' });\n }}\n />\n </Flexbox>\n ))}\n\n <Button\n block\n disabled={disabled}\n icon={Plus}\n onClick={() => {\n const lastMeg = chatMessages.at(-1);\n\n dispatch({\n message: { content: '', role: lastMeg?.role === 'user' ? 'assistant' : 'user' },\n type: 'addMessage',\n });\n }}\n >\n {addPropsText}\n </Button>\n </Flexbox>\n ) : undefined;\n },\n isEqual,\n);\n\nEditableMessageList.displayName = 'EditableMessageList';\n\nexport default EditableMessageList;\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,sBAAsB,MACzB,EAAE,UAAU,aAAa,UAAU,YAAY;CAC9C,MAAM,CAAC,cAAc,YAAY,WAAW,iBAAiB,WAAW;CACxE,MAAM,EAAE,MAAM,eAAeA,uBAAuB;CAEpD,MAAM,eAAe,OAAO,YAAY,EAAE,0BAA0B;CACpE,MAAM,aAAa,OAAO,UAAU,EAAE,wBAAwB;CAC9D,MAAM,uBAAuB,OAAO,oBAAoB,EAAE,kCAAkC;CAC5F,MAAM,wBACJ,OAAO,qBAAqB,EAAE,mCAAmC;CACnE,MAAM,aAAa,OAAO,UAAU,EAAE,wBAAwB;CAC9D,MAAM,YAAY,OAAO,SAAS,EAAE,uBAAuB;CAC3D,MAAM,aAAa,OAAO,UAAU,EAAE,wBAAwB;CAE9D,gBAAgB;EACd,IAAI,CAAC,QAAQ,aAAa,YAAY,GACpC,WAAW,YAAY;CAE3B,GAAG,CAAC,YAAY,CAAC;CAEjB,OAAO,cACL,qBAACC,mBAAD;EAAS,KAAK;YAAd,CACG,aAAa,KAAK,MAAM,UACvB,qBAACA,mBAAD;GACE,YAAA;GACA,OAAO;GACP,KAAK;GAEL,OAAO;aALT;IAOE,oBAAC,QAAD;KACY;KACV,OAAO,EAAE,OAAO,IAAI;KACpB,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE;KAC3C,OAAO,KAAK;KACZ,SAAS;MACP;OAAE,OAAO;OAAY,OAAO;MAAS;MACrC;OAAE,OAAO;OAAW,OAAO;MAAO;MAClC;OAAE,OAAO;OAAY,OAAO;MAAY;KAC1C;KACA,WAAW,UAAU;MACnB,SAAS;OAAE;OAAO,MAAM;OAAO,MAAM;MAAoB,CAAC;KAC5D;IACD,CAAA;IACD,oBAAC,cAAD;KACY;KACV,aAAa,KAAK,SAAS,SAAS,uBAAuB;KAC3D,OAAO,KAAK;KACZ,WAAW,MAAM;MACf,SAAS;OAAE;OAAO,SAAS;OAAG,MAAM;MAAgB,CAAC;KACvD;IACD,CAAA;IACD,oBAAC,YAAD;KACE,MAAM;KACN,OAAO;KACP,SAAS;KACT,eAAe;MACb,SAAS;OAAE;OAAO,MAAM;MAAgB,CAAC;KAC3C;IACD,CAAA;GACM;KAjCF,GAAG,MAAM,GAAG,KAAK,SAiCf,CACV,GAED,oBAAC,QAAD;GACE,OAAA;GACU;GACV,MAAM;GACN,eAAe;IACb,MAAM,UAAU,aAAa,GAAG,EAAE;IAElC,SAAS;KACP,SAAS;MAAE,SAAS;MAAI,MAAM,SAAS,SAAS,SAAS,cAAc;KAAO;KAC9E,MAAM;IACR,CAAC;GACH;aAEC;EACK,CAAA,CACD;MACP,KAAA;AACN,GACA,OACF;AAEA,oBAAoB,cAAc"}
1
+ {"version":3,"file":"EditableMessageList.mjs","names":["editableMessageMessages","Flexbox"],"sources":["../../../src/chat/EditableMessageList/EditableMessageList.tsx"],"sourcesContent":["'use client';\n\nimport isEqual from 'fast-deep-equal';\nimport { Plus, Trash } from 'lucide-react';\nimport { memo, useEffect, useReducer } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport Button from '@/Button';\nimport ControlInput from '@/EditableText/ControlInput';\nimport { Flexbox } from '@/Flex';\nimport editableMessageMessages from '@/i18n/resources/en/editableMessage';\nimport { useTranslation } from '@/i18n/useTranslation';\nimport Select from '@/Select';\n\nimport { messagesReducer } from './messageReducer';\nimport { type EditableMessageListProps } from './type';\n\nconst EditableMessageList = memo<EditableMessageListProps>(\n ({ disabled, dataSources, onChange, texts }) => {\n const [chatMessages, dispatch] = useReducer(messagesReducer, dataSources);\n const { t } = useTranslation(editableMessageMessages);\n\n const addPropsText = texts?.addProps ?? t('editableMessage.addProps');\n const deleteText = texts?.delete ?? t('editableMessage.delete');\n const inputPlaceholderText = texts?.inputPlaceholder ?? t('editableMessage.inputPlaceholder');\n const outputPlaceholderText =\n texts?.outputPlaceholder ?? t('editableMessage.outputPlaceholder');\n const systemText = texts?.system ?? t('editableMessage.system');\n const inputText = texts?.input ?? t('editableMessage.input');\n const outputText = texts?.output ?? t('editableMessage.output');\n\n useEffect(() => {\n if (!isEqual(dataSources, chatMessages)) {\n onChange?.(chatMessages);\n }\n }, [chatMessages]);\n\n return dataSources ? (\n <Flexbox gap={12}>\n {chatMessages.map((item, index) => (\n <Flexbox\n horizontal\n align={'center'}\n gap={8}\n key={`${index}-${item.content}`}\n width={'100%'}\n >\n <Select\n disabled={disabled}\n style={{ width: 120 }}\n styles={{ popup: { root: { zIndex: 100 } } }}\n value={item.role}\n options={[\n { label: systemText, value: 'system' },\n { label: inputText, value: 'user' },\n { label: outputText, value: 'assistant' },\n ]}\n onChange={(value) => {\n dispatch({ index, role: value, type: 'updateMessageRole' });\n }}\n />\n <ControlInput\n disabled={disabled}\n placeholder={item.role === 'user' ? inputPlaceholderText : outputPlaceholderText}\n value={item.content}\n onChange={(e) => {\n dispatch({ index, message: e, type: 'updateMessage' });\n }}\n />\n <ActionIcon\n icon={Trash}\n title={deleteText}\n variant={'filled'}\n onClick={() => {\n dispatch({ index, type: 'deleteMessage' });\n }}\n />\n </Flexbox>\n ))}\n\n <Button\n block\n disabled={disabled}\n icon={Plus}\n onClick={() => {\n const lastMeg = chatMessages.at(-1);\n\n dispatch({\n message: { content: '', role: lastMeg?.role === 'user' ? 'assistant' : 'user' },\n type: 'addMessage',\n });\n }}\n >\n {addPropsText}\n </Button>\n </Flexbox>\n ) : undefined;\n },\n isEqual,\n);\n\nEditableMessageList.displayName = 'EditableMessageList';\n\nexport default EditableMessageList;\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,sBAAsB,MACzB,EAAE,UAAU,aAAa,UAAU,YAAY;CAC9C,MAAM,CAAC,cAAc,YAAY,WAAW,iBAAiB,WAAW;CACxE,MAAM,EAAE,MAAM,eAAeA,uBAAuB;CAEpD,MAAM,eAAe,OAAO,YAAY,EAAE,0BAA0B;CACpE,MAAM,aAAa,OAAO,UAAU,EAAE,wBAAwB;CAC9D,MAAM,uBAAuB,OAAO,oBAAoB,EAAE,kCAAkC;CAC5F,MAAM,wBACJ,OAAO,qBAAqB,EAAE,mCAAmC;CACnE,MAAM,aAAa,OAAO,UAAU,EAAE,wBAAwB;CAC9D,MAAM,YAAY,OAAO,SAAS,EAAE,uBAAuB;CAC3D,MAAM,aAAa,OAAO,UAAU,EAAE,wBAAwB;CAE9D,gBAAgB;EACd,IAAI,CAAC,QAAQ,aAAa,YAAY,GACpC,WAAW,YAAY;CAE3B,GAAG,CAAC,YAAY,CAAC;CAEjB,OAAO,cACL,qBAACC,mBAAD;EAAS,KAAK;EAAd,UAAA,CACG,aAAa,KAAK,MAAM,UACvB,qBAACA,mBAAD;GACE,YAAA;GACA,OAAO;GACP,KAAK;GAEL,OAAO;GALT,UAAA;IAOE,oBAAC,QAAD;KACY;KACV,OAAO,EAAE,OAAO,IAAI;KACpB,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE;KAC3C,OAAO,KAAK;KACZ,SAAS;MACP;OAAE,OAAO;OAAY,OAAO;MAAS;MACrC;OAAE,OAAO;OAAW,OAAO;MAAO;MAClC;OAAE,OAAO;OAAY,OAAO;MAAY;KAC1C;KACA,WAAW,UAAU;MACnB,SAAS;OAAE;OAAO,MAAM;OAAO,MAAM;MAAoB,CAAC;KAC5D;IACD,CAAA;IACD,oBAAC,cAAD;KACY;KACV,aAAa,KAAK,SAAS,SAAS,uBAAuB;KAC3D,OAAO,KAAK;KACZ,WAAW,MAAM;MACf,SAAS;OAAE;OAAO,SAAS;OAAG,MAAM;MAAgB,CAAC;KACvD;IACD,CAAA;IACD,oBAAC,YAAD;KACE,MAAM;KACN,OAAO;KACP,SAAS;KACT,eAAe;MACb,SAAS;OAAE;OAAO,MAAM;MAAgB,CAAC;KAC3C;IACD,CAAA;GACM;EAjCF,GAAA,GAAG,MAAM,GAAG,KAAK,SAiCf,CACV,GAED,oBAAC,QAAD;GACE,OAAA;GACU;GACV,MAAM;GACN,eAAe;IACb,MAAM,UAAU,aAAa,GAAG,EAAE;IAElC,SAAS;KACP,SAAS;MAAE,SAAS;MAAI,MAAM,SAAS,SAAS,SAAS,cAAc;KAAO;KAC9E,MAAM;IACR,CAAC;GACH;GAEC,UAAA;EACK,CAAA,CACD;CACP,CAAA,IAAA,KAAA;AACN,GACA,OACF;AAEA,oBAAoB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingDots.mjs","names":[],"sources":["../../../src/chat/LoadingDots/LoadingDots.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { type FC, useMemo } from 'react';\n\nimport { styles } from './style';\nimport type { LoadingDotsProps } from './type';\n\nconst LoadingDots: FC<LoadingDotsProps> = ({\n size = 8,\n color,\n variant = 'dots',\n className,\n style,\n}) => {\n // Convert props to CSS variables\n const cssVariables = useMemo<Record<string, string>>(() => {\n const vars: Record<string, string> = {\n '--loading-dots-size': `${size}px`,\n };\n if (color) {\n vars['--loading-dots-color'] = color;\n }\n return vars;\n }, [color, size]);\n\n const renderDots = () => {\n switch (variant) {\n case 'pulse': {\n return <div className={styles.pulseDot} style={{ animationDelay: '0s' }} />;\n }\n\n case 'wave': {\n return (\n <>\n <div className={styles.waveDot} style={{ animationDelay: '0s' }} />\n <div className={styles.waveDot} style={{ animationDelay: '0.12s' }} />\n <div className={styles.waveDot} style={{ animationDelay: '0.24s' }} />\n </>\n );\n }\n\n case 'orbit': {\n return (\n <div className={styles.orbitContainer}>\n <div className={styles.orbitDot} style={{ animationDelay: '0s' }} />\n <div className={styles.orbitDot} style={{ animationDelay: '-0.4s' }} />\n <div className={styles.orbitDot} style={{ animationDelay: '-0.8s' }} />\n </div>\n );\n }\n\n case 'typing': {\n return (\n <>\n <div className={styles.typingDot} style={{ animationDelay: '0s' }} />\n <div className={styles.typingDot} style={{ animationDelay: '0.15s' }} />\n <div className={styles.typingDot} style={{ animationDelay: '0.3s' }} />\n </>\n );\n }\n\n default: {\n return (\n <>\n <div className={styles.defaultDot} style={{ animationDelay: '0s' }} />\n <div className={styles.defaultDot} style={{ animationDelay: '0.15s' }} />\n <div className={styles.defaultDot} style={{ animationDelay: '0.3s' }} />\n </>\n );\n }\n }\n };\n\n return (\n <div\n className={cx(variant === 'orbit' ? styles.orbitWrapper : styles.container, className)}\n style={{\n ...cssVariables,\n ...style,\n }}\n >\n {renderDots()}\n </div>\n );\n};\n\nLoadingDots.displayName = 'LoadingDots';\n\nexport default LoadingDots;\n"],"mappings":";;;;;;AAQA,MAAM,eAAqC,EACzC,OAAO,GACP,OACA,UAAU,QACV,WACA,YACI;CAEJ,MAAM,eAAe,cAAsC;EACzD,MAAM,OAA+B,EACnC,uBAAuB,GAAG,KAAK,IACjC;EACA,IAAI,OACF,KAAK,0BAA0B;EAEjC,OAAO;CACT,GAAG,CAAC,OAAO,IAAI,CAAC;CAEhB,MAAM,mBAAmB;EACvB,QAAQ,SAAR;GACE,KAAK,SACH,OAAO,oBAAC,OAAD;IAAK,WAAW,OAAO;IAAU,OAAO,EAAE,gBAAgB,KAAK;GAAI,CAAA;GAG5E,KAAK,QACH,OACE,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAS,OAAO,EAAE,gBAAgB,KAAK;IAAI,CAAA;IAClE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAS,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;IACrE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAS,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;GACrE,EAAA,CAAA;GAIN,KAAK,SACH,OACE,qBAAC,OAAD;IAAK,WAAW,OAAO;cAAvB;KACE,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAU,OAAO,EAAE,gBAAgB,KAAK;KAAI,CAAA;KACnE,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAU,OAAO,EAAE,gBAAgB,QAAQ;KAAI,CAAA;KACtE,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAU,OAAO,EAAE,gBAAgB,QAAQ;KAAI,CAAA;IACnE;;GAIT,KAAK,UACH,OACE,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAW,OAAO,EAAE,gBAAgB,KAAK;IAAI,CAAA;IACpE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAW,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;IACvE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAW,OAAO,EAAE,gBAAgB,OAAO;IAAI,CAAA;GACtE,EAAA,CAAA;GAIN,SACE,OACE,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAY,OAAO,EAAE,gBAAgB,KAAK;IAAI,CAAA;IACrE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAY,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;IACxE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAY,OAAO,EAAE,gBAAgB,OAAO;IAAI,CAAA;GACvE,EAAA,CAAA;EAGR;CACF;CAEA,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,YAAY,UAAU,OAAO,eAAe,OAAO,WAAW,SAAS;EACrF,OAAO;GACL,GAAG;GACH,GAAG;EACL;YAEC,WAAW;CACT,CAAA;AAET;AAEA,YAAY,cAAc"}
1
+ {"version":3,"file":"LoadingDots.mjs","names":[],"sources":["../../../src/chat/LoadingDots/LoadingDots.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { type FC, useMemo } from 'react';\n\nimport { styles } from './style';\nimport type { LoadingDotsProps } from './type';\n\nconst LoadingDots: FC<LoadingDotsProps> = ({\n size = 8,\n color,\n variant = 'dots',\n className,\n style,\n}) => {\n // Convert props to CSS variables\n const cssVariables = useMemo<Record<string, string>>(() => {\n const vars: Record<string, string> = {\n '--loading-dots-size': `${size}px`,\n };\n if (color) {\n vars['--loading-dots-color'] = color;\n }\n return vars;\n }, [color, size]);\n\n const renderDots = () => {\n switch (variant) {\n case 'pulse': {\n return <div className={styles.pulseDot} style={{ animationDelay: '0s' }} />;\n }\n\n case 'wave': {\n return (\n <>\n <div className={styles.waveDot} style={{ animationDelay: '0s' }} />\n <div className={styles.waveDot} style={{ animationDelay: '0.12s' }} />\n <div className={styles.waveDot} style={{ animationDelay: '0.24s' }} />\n </>\n );\n }\n\n case 'orbit': {\n return (\n <div className={styles.orbitContainer}>\n <div className={styles.orbitDot} style={{ animationDelay: '0s' }} />\n <div className={styles.orbitDot} style={{ animationDelay: '-0.4s' }} />\n <div className={styles.orbitDot} style={{ animationDelay: '-0.8s' }} />\n </div>\n );\n }\n\n case 'typing': {\n return (\n <>\n <div className={styles.typingDot} style={{ animationDelay: '0s' }} />\n <div className={styles.typingDot} style={{ animationDelay: '0.15s' }} />\n <div className={styles.typingDot} style={{ animationDelay: '0.3s' }} />\n </>\n );\n }\n\n default: {\n return (\n <>\n <div className={styles.defaultDot} style={{ animationDelay: '0s' }} />\n <div className={styles.defaultDot} style={{ animationDelay: '0.15s' }} />\n <div className={styles.defaultDot} style={{ animationDelay: '0.3s' }} />\n </>\n );\n }\n }\n };\n\n return (\n <div\n className={cx(variant === 'orbit' ? styles.orbitWrapper : styles.container, className)}\n style={{\n ...cssVariables,\n ...style,\n }}\n >\n {renderDots()}\n </div>\n );\n};\n\nLoadingDots.displayName = 'LoadingDots';\n\nexport default LoadingDots;\n"],"mappings":";;;;;;AAQA,MAAM,eAAqC,EACzC,OAAO,GACP,OACA,UAAU,QACV,WACA,YACI;CAEJ,MAAM,eAAe,cAAsC;EACzD,MAAM,OAA+B,EACnC,uBAAuB,GAAG,KAAK,IACjC;EACA,IAAI,OACF,KAAK,0BAA0B;EAEjC,OAAO;CACT,GAAG,CAAC,OAAO,IAAI,CAAC;CAEhB,MAAM,mBAAmB;EACvB,QAAQ,SAAR;GACE,KAAK,SACH,OAAO,oBAAC,OAAD;IAAK,WAAW,OAAO;IAAU,OAAO,EAAE,gBAAgB,KAAK;GAAI,CAAA;GAG5E,KAAK,QACH,OACE,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAS,OAAO,EAAE,gBAAgB,KAAK;IAAI,CAAA;IAClE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAS,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;IACrE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAS,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;GACrE,EAAA,CAAA;GAIN,KAAK,SACH,OACE,qBAAC,OAAD;IAAK,WAAW,OAAO;IAAvB,UAAA;KACE,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAU,OAAO,EAAE,gBAAgB,KAAK;KAAI,CAAA;KACnE,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAU,OAAO,EAAE,gBAAgB,QAAQ;KAAI,CAAA;KACtE,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAU,OAAO,EAAE,gBAAgB,QAAQ;KAAI,CAAA;IACnE;;GAIT,KAAK,UACH,OACE,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAW,OAAO,EAAE,gBAAgB,KAAK;IAAI,CAAA;IACpE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAW,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;IACvE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAW,OAAO,EAAE,gBAAgB,OAAO;IAAI,CAAA;GACtE,EAAA,CAAA;GAIN,SACE,OACE,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAY,OAAO,EAAE,gBAAgB,KAAK;IAAI,CAAA;IACrE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAY,OAAO,EAAE,gBAAgB,QAAQ;IAAI,CAAA;IACxE,oBAAC,OAAD;KAAK,WAAW,OAAO;KAAY,OAAO,EAAE,gBAAgB,OAAO;IAAI,CAAA;GACvE,EAAA,CAAA;EAGR;CACF;CAEA,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,YAAY,UAAU,OAAO,eAAe,OAAO,WAAW,SAAS;EACrF,OAAO;GACL,GAAG;GACH,GAAG;EACL;EAEC,UAAA,WAAW;CACT,CAAA;AAET;AAEA,YAAY,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageInput.mjs","names":["Flexbox"],"sources":["../../../src/chat/MessageInput/MessageInput.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useResponsive } from 'antd-style';\nimport { memo, useState } from 'react';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport Button from '@/Button';\nimport CodeEditor from '@/CodeEditor';\nimport { Flexbox } from '@/Flex';\nimport { KeyMapEnum } from '@/Hotkey/const';\nimport { combineKeys } from '@/Hotkey/utils';\nimport TextArea from '@/Input/TextArea';\nimport Tooltip from '@/Tooltip';\n\nimport { styles } from './style';\nimport type { MessageInputProps } from './type';\n\nconst MessageInput = memo<MessageInputProps>(\n ({\n text,\n variant = 'borderless',\n onCancel,\n defaultValue,\n onConfirm,\n renderButtons,\n placeholder,\n styles: customStyles,\n style,\n editButtonSize = 'middle',\n classNames,\n shortcut,\n language = 'markdown',\n ...rest\n }) => {\n const { mobile } = useResponsive();\n const [temporaryValue, setValue] = useState<string>(defaultValue || '');\n const confirmHotkey = combineKeys([KeyMapEnum.Mod, KeyMapEnum.Enter]);\n const confirmText = text?.confirm || 'Confirm';\n const cancelHotkey = combineKeys([KeyMapEnum.Esc]);\n const cancelText = text?.cancel || 'Cancel';\n\n const handleConfirm = () => onConfirm?.(temporaryValue);\n const handleCancel = () => onCancel?.();\n\n useHotkeys(confirmHotkey, handleConfirm, {\n enableOnFormTags: true,\n enabled: shortcut,\n preventDefault: true,\n });\n\n const confirmButton = (\n <Button size={editButtonSize} type=\"primary\" onClick={handleConfirm}>\n {confirmText}\n </Button>\n );\n\n const cancllButton = (\n <Button size={editButtonSize} variant={'filled'} onClick={handleCancel}>\n {text?.cancel || 'Cancel'}\n </Button>\n );\n\n return (\n <Flexbox gap={16} style={{ flex: 1, width: '100%', ...style }} {...rest}>\n {mobile ? (\n <TextArea\n autoSize\n className={cx(styles, classNames?.editor)}\n placeholder={placeholder}\n style={customStyles?.editor}\n value={temporaryValue}\n variant={variant}\n onBlur={(e) => setValue(e.target.value)}\n onChange={(e) => setValue(e.target.value)}\n />\n ) : (\n <CodeEditor\n className={cx(styles, classNames?.editor)}\n classNames={classNames}\n language={language}\n placeholder={placeholder}\n style={customStyles?.editor}\n styles={customStyles}\n value={temporaryValue}\n variant={variant}\n onBlur={(e) => setValue(e.target.value)}\n onValueChange={(e) => setValue(e)}\n />\n )}\n <Flexbox direction={'horizontal-reverse'} gap={8}>\n {renderButtons ? (\n renderButtons(temporaryValue).map((buttonProps, index) => (\n <Button key={index} size={editButtonSize} {...buttonProps} />\n ))\n ) : (\n <>\n {shortcut ? (\n <Tooltip hotkey={confirmHotkey} title={confirmText}>\n {confirmButton}\n </Tooltip>\n ) : (\n confirmButton\n )}\n {shortcut ? (\n <Tooltip hotkey={cancelHotkey} title={cancelText}>\n {cancllButton}\n </Tooltip>\n ) : (\n cancllButton\n )}\n </>\n )}\n </Flexbox>\n </Flexbox>\n );\n },\n);\n\nexport default MessageInput;\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,eAAe,MAClB,EACC,MACA,UAAU,cACV,UACA,cACA,WACA,eACA,aACA,QAAQ,cACR,OACA,iBAAiB,UACjB,YACA,UACA,WAAW,YACX,GAAG,WACC;CACJ,MAAM,EAAE,WAAW,cAAc;CACjC,MAAM,CAAC,gBAAgB,YAAY,SAAiB,gBAAgB,EAAE;CACtE,MAAM,gBAAgB,YAAY,CAAC,WAAW,KAAK,WAAW,KAAK,CAAC;CACpE,MAAM,cAAc,MAAM,WAAW;CACrC,MAAM,eAAe,YAAY,CAAC,WAAW,GAAG,CAAC;CACjD,MAAM,aAAa,MAAM,UAAU;CAEnC,MAAM,sBAAsB,YAAY,cAAc;CACtD,MAAM,qBAAqB,WAAW;CAEtC,WAAW,eAAe,eAAe;EACvC,kBAAkB;EAClB,SAAS;EACT,gBAAgB;CAClB,CAAC;CAED,MAAM,gBACJ,oBAAC,QAAD;EAAQ,MAAM;EAAgB,MAAK;EAAU,SAAS;YACnD;CACK,CAAA;CAGV,MAAM,eACJ,oBAAC,QAAD;EAAQ,MAAM;EAAgB,SAAS;EAAU,SAAS;YACvD,MAAM,UAAU;CACX,CAAA;CAGV,OACE,qBAACA,mBAAD;EAAS,KAAK;EAAI,OAAO;GAAE,MAAM;GAAG,OAAO;GAAQ,GAAG;EAAM;EAAG,GAAI;YAAnE,CACG,SACC,oBAAC,UAAD;GACE,UAAA;GACA,WAAW,GAAG,QAAQ,YAAY,MAAM;GAC3B;GACb,OAAO,cAAc;GACrB,OAAO;GACE;GACT,SAAS,MAAM,SAAS,EAAE,OAAO,KAAK;GACtC,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;EACzC,CAAA,IAED,oBAAC,YAAD;GACE,WAAW,GAAG,QAAQ,YAAY,MAAM;GAC5B;GACF;GACG;GACb,OAAO,cAAc;GACrB,QAAQ;GACR,OAAO;GACE;GACT,SAAS,MAAM,SAAS,EAAE,OAAO,KAAK;GACtC,gBAAgB,MAAM,SAAS,CAAC;EACjC,CAAA,GAEH,oBAACA,mBAAD;GAAS,WAAW;GAAsB,KAAK;aAC5C,gBACC,cAAc,cAAc,CAAC,CAAC,KAAK,aAAa,UAC9C,oBAAC,QAAD;IAAoB,MAAM;IAAgB,GAAI;GAAc,GAA/C,KAA+C,CAC7D,IAED,qBAAA,YAAA,EAAA,UAAA,CACG,WACC,oBAAC,SAAD;IAAS,QAAQ;IAAe,OAAO;cACpC;GACM,CAAA,IAET,eAED,WACC,oBAAC,SAAD;IAAS,QAAQ;IAAc,OAAO;cACnC;GACM,CAAA,IAET,YAEF,EAAA,CAAA;EAEG,CAAA,CACF;;AAEb,CACF"}
1
+ {"version":3,"file":"MessageInput.mjs","names":["Flexbox"],"sources":["../../../src/chat/MessageInput/MessageInput.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useResponsive } from 'antd-style';\nimport { memo, useState } from 'react';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport Button from '@/Button';\nimport CodeEditor from '@/CodeEditor';\nimport { Flexbox } from '@/Flex';\nimport { KeyMapEnum } from '@/Hotkey/const';\nimport { combineKeys } from '@/Hotkey/utils';\nimport TextArea from '@/Input/TextArea';\nimport Tooltip from '@/Tooltip';\n\nimport { styles } from './style';\nimport type { MessageInputProps } from './type';\n\nconst MessageInput = memo<MessageInputProps>(\n ({\n text,\n variant = 'borderless',\n onCancel,\n defaultValue,\n onConfirm,\n renderButtons,\n placeholder,\n styles: customStyles,\n style,\n editButtonSize = 'middle',\n classNames,\n shortcut,\n language = 'markdown',\n ...rest\n }) => {\n const { mobile } = useResponsive();\n const [temporaryValue, setValue] = useState<string>(defaultValue || '');\n const confirmHotkey = combineKeys([KeyMapEnum.Mod, KeyMapEnum.Enter]);\n const confirmText = text?.confirm || 'Confirm';\n const cancelHotkey = combineKeys([KeyMapEnum.Esc]);\n const cancelText = text?.cancel || 'Cancel';\n\n const handleConfirm = () => onConfirm?.(temporaryValue);\n const handleCancel = () => onCancel?.();\n\n useHotkeys(confirmHotkey, handleConfirm, {\n enableOnFormTags: true,\n enabled: shortcut,\n preventDefault: true,\n });\n\n const confirmButton = (\n <Button size={editButtonSize} type=\"primary\" onClick={handleConfirm}>\n {confirmText}\n </Button>\n );\n\n const cancllButton = (\n <Button size={editButtonSize} variant={'filled'} onClick={handleCancel}>\n {text?.cancel || 'Cancel'}\n </Button>\n );\n\n return (\n <Flexbox gap={16} style={{ flex: 1, width: '100%', ...style }} {...rest}>\n {mobile ? (\n <TextArea\n autoSize\n className={cx(styles, classNames?.editor)}\n placeholder={placeholder}\n style={customStyles?.editor}\n value={temporaryValue}\n variant={variant}\n onBlur={(e) => setValue(e.target.value)}\n onChange={(e) => setValue(e.target.value)}\n />\n ) : (\n <CodeEditor\n className={cx(styles, classNames?.editor)}\n classNames={classNames}\n language={language}\n placeholder={placeholder}\n style={customStyles?.editor}\n styles={customStyles}\n value={temporaryValue}\n variant={variant}\n onBlur={(e) => setValue(e.target.value)}\n onValueChange={(e) => setValue(e)}\n />\n )}\n <Flexbox direction={'horizontal-reverse'} gap={8}>\n {renderButtons ? (\n renderButtons(temporaryValue).map((buttonProps, index) => (\n <Button key={index} size={editButtonSize} {...buttonProps} />\n ))\n ) : (\n <>\n {shortcut ? (\n <Tooltip hotkey={confirmHotkey} title={confirmText}>\n {confirmButton}\n </Tooltip>\n ) : (\n confirmButton\n )}\n {shortcut ? (\n <Tooltip hotkey={cancelHotkey} title={cancelText}>\n {cancllButton}\n </Tooltip>\n ) : (\n cancllButton\n )}\n </>\n )}\n </Flexbox>\n </Flexbox>\n );\n },\n);\n\nexport default MessageInput;\n"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,eAAe,MAClB,EACC,MACA,UAAU,cACV,UACA,cACA,WACA,eACA,aACA,QAAQ,cACR,OACA,iBAAiB,UACjB,YACA,UACA,WAAW,YACX,GAAG,WACC;CACJ,MAAM,EAAE,WAAW,cAAc;CACjC,MAAM,CAAC,gBAAgB,YAAY,SAAiB,gBAAgB,EAAE;CACtE,MAAM,gBAAgB,YAAY,CAAC,WAAW,KAAK,WAAW,KAAK,CAAC;CACpE,MAAM,cAAc,MAAM,WAAW;CACrC,MAAM,eAAe,YAAY,CAAC,WAAW,GAAG,CAAC;CACjD,MAAM,aAAa,MAAM,UAAU;CAEnC,MAAM,sBAAsB,YAAY,cAAc;CACtD,MAAM,qBAAqB,WAAW;CAEtC,WAAW,eAAe,eAAe;EACvC,kBAAkB;EAClB,SAAS;EACT,gBAAgB;CAClB,CAAC;CAED,MAAM,gBACJ,oBAAC,QAAD;EAAQ,MAAM;EAAgB,MAAK;EAAU,SAAS;EACnD,UAAA;CACK,CAAA;CAGV,MAAM,eACJ,oBAAC,QAAD;EAAQ,MAAM;EAAgB,SAAS;EAAU,SAAS;EACvD,UAAA,MAAM,UAAU;CACX,CAAA;CAGV,OACE,qBAACA,mBAAD;EAAS,KAAK;EAAI,OAAO;GAAE,MAAM;GAAG,OAAO;GAAQ,GAAG;EAAM;EAAG,GAAI;EAAnE,UAAA,CACG,SACC,oBAAC,UAAD;GACE,UAAA;GACA,WAAW,GAAG,QAAQ,YAAY,MAAM;GAC3B;GACb,OAAO,cAAc;GACrB,OAAO;GACE;GACT,SAAS,MAAM,SAAS,EAAE,OAAO,KAAK;GACtC,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;EACzC,CAAA,IAED,oBAAC,YAAD;GACE,WAAW,GAAG,QAAQ,YAAY,MAAM;GAC5B;GACF;GACG;GACb,OAAO,cAAc;GACrB,QAAQ;GACR,OAAO;GACE;GACT,SAAS,MAAM,SAAS,EAAE,OAAO,KAAK;GACtC,gBAAgB,MAAM,SAAS,CAAC;EACjC,CAAA,GAEH,oBAACA,mBAAD;GAAS,WAAW;GAAsB,KAAK;GAC5C,UAAA,gBACC,cAAc,cAAc,CAAC,CAAC,KAAK,aAAa,UAC9C,oBAAC,QAAD;IAAoB,MAAM;IAAgB,GAAI;GAAc,GAA/C,KAA+C,CAC7D,IAED,qBAAA,YAAA,EAAA,UAAA,CACG,WACC,oBAAC,SAAD;IAAS,QAAQ;IAAe,OAAO;IACpC,UAAA;GACM,CAAA,IAET,eAED,WACC,oBAAC,SAAD;IAAS,QAAQ;IAAc,OAAO;IACnC,UAAA;GACM,CAAA,IAET,YAEF,EAAA,CAAA;EAEG,CAAA,CACF;;AAEb,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"MessageModal.mjs","names":["messageModalMessages","useControlledState","Flexbox","textStyles"],"sources":["../../../src/chat/MessageModal/MessageModal.tsx"],"sourcesContent":["'use client';\n\nimport { useResponsive } from 'antd-style';\nimport { memo, useState } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport Button from '@/Button';\nimport { styles as textStyles } from '@/chat/MessageInput/style';\nimport CodeEditor from '@/CodeEditor';\nimport { Flexbox } from '@/Flex';\nimport messageModalMessages from '@/i18n/resources/en/messageModal';\nimport { useTranslation } from '@/i18n/useTranslation';\nimport TextArea from '@/Input/TextArea';\nimport Markdown from '@/Markdown';\nimport Modal from '@/Modal';\n\nimport { type MessageModalProps } from './type';\n\nconst MessageModal = memo<MessageModalProps>(\n ({\n panelRef,\n editing,\n open,\n height = '75vh',\n onOpenChange,\n onEditingChange,\n placeholder,\n value,\n language = 'markdown',\n onChange,\n text,\n footer,\n extra,\n }) => {\n const { mobile } = useResponsive();\n const { t } = useTranslation(messageModalMessages);\n const [isEdit, setTyping] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n const [showModal, setShowModal] = useControlledState(false, {\n onChange: onOpenChange,\n value: open,\n });\n\n const [temporaryValue, setMessage] = useState(value);\n\n const confirmText = text?.confirm ?? t('messageModal.confirm');\n const cancelText = text?.cancel ?? t('messageModal.cancel');\n const editText = text?.edit ?? t('messageModal.edit');\n\n const modalFooter = isEdit ? (\n <Flexbox direction={'horizontal-reverse'} gap={8}>\n <Button\n type=\"primary\"\n onClick={() => {\n setTyping(false);\n onChange?.(temporaryValue);\n setMessage(value);\n }}\n >\n {confirmText}\n </Button>\n <Button\n onClick={() => {\n setTyping(false);\n setMessage(value);\n }}\n >\n {cancelText}\n </Button>\n </Flexbox>\n ) : (\n footer\n );\n\n return (\n <Modal\n allowFullscreen\n destroyOnHidden\n cancelText={cancelText}\n footer={modalFooter}\n height={height}\n okText={editText}\n open={showModal}\n panelRef={panelRef}\n title={text?.title}\n onOk={() => setTyping(true)}\n onCancel={() => {\n setShowModal(false);\n setTyping(false);\n setMessage(value);\n }}\n >\n {isEdit ? (\n mobile ? (\n <TextArea\n autoSize\n className={textStyles}\n defaultValue={temporaryValue}\n placeholder={placeholder}\n value={temporaryValue}\n variant={'borderless'}\n onBlur={(e) => setMessage(e.target.value)}\n onChange={(value) => setMessage(value.target.value)}\n />\n ) : (\n <CodeEditor\n className={textStyles}\n defaultValue={temporaryValue}\n language={language}\n placeholder={placeholder}\n value={temporaryValue}\n variant={'borderless'}\n onBlur={(e) => setMessage(e.target.value)}\n onValueChange={(value) => setMessage(value)}\n />\n )\n ) : (\n <>\n {extra}\n <Markdown variant={'chat'}>{String(value || placeholder)}</Markdown>\n </>\n )}\n </Modal>\n );\n },\n);\n\nMessageModal.displayName = 'MessageModal';\n\nexport default MessageModal;\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,eAAe,MAClB,EACC,UACA,SACA,MACA,SAAS,QACT,cACA,iBACA,aACA,OACA,WAAW,YACX,UACA,MACA,QACA,YACI;CACJ,MAAM,EAAE,WAAW,cAAc;CACjC,MAAM,EAAE,MAAM,eAAeA,oBAAoB;CACjD,MAAM,CAAC,QAAQ,aAAaC,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,CAAC,WAAW,gBAAgBA,cAAmB,OAAO;EAC1D,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,CAAC,gBAAgB,cAAc,SAAS,KAAK;CAEnD,MAAM,cAAc,MAAM,WAAW,EAAE,sBAAsB;CAC7D,MAAM,aAAa,MAAM,UAAU,EAAE,qBAAqB;CAC1D,MAAM,WAAW,MAAM,QAAQ,EAAE,mBAAmB;CA2BpD,OACE,oBAAC,OAAD;EACE,iBAAA;EACA,iBAAA;EACY;EACZ,QA9BgB,SAClB,qBAACC,mBAAD;GAAS,WAAW;GAAsB,KAAK;aAA/C,CACE,oBAAC,QAAD;IACE,MAAK;IACL,eAAe;KACb,UAAU,KAAK;KACf,WAAW,cAAc;KACzB,WAAW,KAAK;IAClB;cAEC;GACK,CAAA,GACR,oBAAC,QAAD;IACE,eAAe;KACb,UAAU,KAAK;KACf,WAAW,KAAK;IAClB;cAEC;GACK,CAAA,CACD;OAET;EASU;EACR,QAAQ;EACR,MAAM;EACI;EACV,OAAO,MAAM;EACb,YAAY,UAAU,IAAI;EAC1B,gBAAgB;GACd,aAAa,KAAK;GAClB,UAAU,KAAK;GACf,WAAW,KAAK;EAClB;YAEC,SACC,SACE,oBAAC,UAAD;GACE,UAAA;GACA,WAAWC;GACX,cAAc;GACD;GACb,OAAO;GACP,SAAS;GACT,SAAS,MAAM,WAAW,EAAE,OAAO,KAAK;GACxC,WAAW,UAAU,WAAW,MAAM,OAAO,KAAK;EACnD,CAAA,IAED,oBAAC,YAAD;GACE,WAAWA;GACX,cAAc;GACJ;GACG;GACb,OAAO;GACP,SAAS;GACT,SAAS,MAAM,WAAW,EAAE,OAAO,KAAK;GACxC,gBAAgB,UAAU,WAAW,KAAK;EAC3C,CAAA,IAGH,qBAAA,YAAA,EAAA,UAAA,CACG,OACD,oBAAC,UAAD;GAAU,SAAS;aAAS,OAAO,SAAS,WAAW;EAAY,CAAA,CACnE,EAAA,CAAA;CAEC,CAAA;AAEX,CACF;AAEA,aAAa,cAAc"}
1
+ {"version":3,"file":"MessageModal.mjs","names":["messageModalMessages","useControlledState","Flexbox","textStyles"],"sources":["../../../src/chat/MessageModal/MessageModal.tsx"],"sourcesContent":["'use client';\n\nimport { useResponsive } from 'antd-style';\nimport { memo, useState } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport Button from '@/Button';\nimport { styles as textStyles } from '@/chat/MessageInput/style';\nimport CodeEditor from '@/CodeEditor';\nimport { Flexbox } from '@/Flex';\nimport messageModalMessages from '@/i18n/resources/en/messageModal';\nimport { useTranslation } from '@/i18n/useTranslation';\nimport TextArea from '@/Input/TextArea';\nimport Markdown from '@/Markdown';\nimport Modal from '@/Modal';\n\nimport { type MessageModalProps } from './type';\n\nconst MessageModal = memo<MessageModalProps>(\n ({\n panelRef,\n editing,\n open,\n height = '75vh',\n onOpenChange,\n onEditingChange,\n placeholder,\n value,\n language = 'markdown',\n onChange,\n text,\n footer,\n extra,\n }) => {\n const { mobile } = useResponsive();\n const { t } = useTranslation(messageModalMessages);\n const [isEdit, setTyping] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n const [showModal, setShowModal] = useControlledState(false, {\n onChange: onOpenChange,\n value: open,\n });\n\n const [temporaryValue, setMessage] = useState(value);\n\n const confirmText = text?.confirm ?? t('messageModal.confirm');\n const cancelText = text?.cancel ?? t('messageModal.cancel');\n const editText = text?.edit ?? t('messageModal.edit');\n\n const modalFooter = isEdit ? (\n <Flexbox direction={'horizontal-reverse'} gap={8}>\n <Button\n type=\"primary\"\n onClick={() => {\n setTyping(false);\n onChange?.(temporaryValue);\n setMessage(value);\n }}\n >\n {confirmText}\n </Button>\n <Button\n onClick={() => {\n setTyping(false);\n setMessage(value);\n }}\n >\n {cancelText}\n </Button>\n </Flexbox>\n ) : (\n footer\n );\n\n return (\n <Modal\n allowFullscreen\n destroyOnHidden\n cancelText={cancelText}\n footer={modalFooter}\n height={height}\n okText={editText}\n open={showModal}\n panelRef={panelRef}\n title={text?.title}\n onOk={() => setTyping(true)}\n onCancel={() => {\n setShowModal(false);\n setTyping(false);\n setMessage(value);\n }}\n >\n {isEdit ? (\n mobile ? (\n <TextArea\n autoSize\n className={textStyles}\n defaultValue={temporaryValue}\n placeholder={placeholder}\n value={temporaryValue}\n variant={'borderless'}\n onBlur={(e) => setMessage(e.target.value)}\n onChange={(value) => setMessage(value.target.value)}\n />\n ) : (\n <CodeEditor\n className={textStyles}\n defaultValue={temporaryValue}\n language={language}\n placeholder={placeholder}\n value={temporaryValue}\n variant={'borderless'}\n onBlur={(e) => setMessage(e.target.value)}\n onValueChange={(value) => setMessage(value)}\n />\n )\n ) : (\n <>\n {extra}\n <Markdown variant={'chat'}>{String(value || placeholder)}</Markdown>\n </>\n )}\n </Modal>\n );\n },\n);\n\nMessageModal.displayName = 'MessageModal';\n\nexport default MessageModal;\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAM,eAAe,MAClB,EACC,UACA,SACA,MACA,SAAS,QACT,cACA,iBACA,aACA,OACA,WAAW,YACX,UACA,MACA,QACA,YACI;CACJ,MAAM,EAAE,WAAW,cAAc;CACjC,MAAM,EAAE,MAAM,eAAeA,oBAAoB;CACjD,MAAM,CAAC,QAAQ,aAAaC,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,CAAC,WAAW,gBAAgBA,cAAmB,OAAO;EAC1D,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,CAAC,gBAAgB,cAAc,SAAS,KAAK;CAEnD,MAAM,cAAc,MAAM,WAAW,EAAE,sBAAsB;CAC7D,MAAM,aAAa,MAAM,UAAU,EAAE,qBAAqB;CAC1D,MAAM,WAAW,MAAM,QAAQ,EAAE,mBAAmB;CA2BpD,OACE,oBAAC,OAAD;EACE,iBAAA;EACA,iBAAA;EACY;EACZ,QA9BgB,SAClB,qBAACC,mBAAD;GAAS,WAAW;GAAsB,KAAK;GAA/C,UAAA,CACE,oBAAC,QAAD;IACE,MAAK;IACL,eAAe;KACb,UAAU,KAAK;KACf,WAAW,cAAc;KACzB,WAAW,KAAK;IAClB;IAEC,UAAA;GACK,CAAA,GACR,oBAAC,QAAD;IACE,eAAe;KACb,UAAU,KAAK;KACf,WAAW,KAAK;IAClB;IAEC,UAAA;GACK,CAAA,CACD;EAET,CAAA,IAAA;EASU;EACR,QAAQ;EACR,MAAM;EACI;EACV,OAAO,MAAM;EACb,YAAY,UAAU,IAAI;EAC1B,gBAAgB;GACd,aAAa,KAAK;GAClB,UAAU,KAAK;GACf,WAAW,KAAK;EAClB;EAEC,UAAA,SACC,SACE,oBAAC,UAAD;GACE,UAAA;GACA,WAAWC;GACX,cAAc;GACD;GACb,OAAO;GACP,SAAS;GACT,SAAS,MAAM,WAAW,EAAE,OAAO,KAAK;GACxC,WAAW,UAAU,WAAW,MAAM,OAAO,KAAK;EACnD,CAAA,IAED,oBAAC,YAAD;GACE,WAAWA;GACX,cAAc;GACJ;GACG;GACb,OAAO;GACP,SAAS;GACT,SAAS,MAAM,WAAW,EAAE,OAAO,KAAK;GACxC,gBAAgB,UAAU,WAAW,KAAK;EAC3C,CAAA,IAGH,qBAAA,YAAA,EAAA,UAAA,CACG,OACD,oBAAC,UAAD;GAAU,SAAS;GAAS,UAAA,OAAO,SAAS,WAAW;EAAY,CAAA,CACnE,EAAA,CAAA;CAEC,CAAA;AAEX,CACF;AAEA,aAAa,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScaleRow.mjs","names":["Flexbox"],"sources":["../../../src/color/ColorScales/ScaleRow.tsx"],"sourcesContent":["import { message, Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { alphaBg, styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n scale: string[];\n title: 'light' | 'lightA' | 'dark' | 'darkA';\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name, title, scale }) => {\n let style = {};\n let isAlpha = false;\n\n switch (title) {\n case 'lightA': {\n style = { background: alphaBg.light, backgroundColor: '#fff' };\n isAlpha = true;\n break;\n }\n case 'darkA': {\n style = { background: alphaBg.dark, backgroundColor: '#000' };\n isAlpha = true;\n break;\n }\n default: {\n break;\n }\n }\n\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={title}>\n <div className={styles.text}>{title}</div>\n </div>\n {scale.map((color, index) => {\n if (index === 0 || index === 12) return false;\n\n return (\n <div\n className={styles.scaleBox}\n key={index}\n style={style}\n title={color}\n onClick={async () => {\n const content = `token.${name}${index}${isAlpha ? 'A' : ''} /* ${color} */`;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;AAcA,MAAM,WAAW,MAAiB,EAAE,MAAM,OAAO,YAAY;CAC3D,IAAI,QAAQ,CAAC;CACb,IAAI,UAAU;CAEd,QAAQ,OAAR;EACE,KAAK;GACH,QAAQ;IAAE,YAAY,QAAQ;IAAO,iBAAiB;GAAO;GAC7D,UAAU;GACV;EAEF,KAAK;GACH,QAAQ;IAAE,YAAY,QAAQ;IAAM,iBAAiB;GAAO;GAC5D,UAAU;GACV;EAEF,SACE;CAEJ;CAEA,OACE,qBAAC,OAAD;EAAO,MAAM;YAAb,CACE,oBAAC,OAAD;GAAK,WAAW,OAAO;aACrB,oBAAC,OAAD;IAAK,WAAW,OAAO;cAAO;GAAW,CAAA;EACtC,GAFsC,KAEtC,GACJ,MAAM,KAAK,OAAO,UAAU;GAC3B,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;GAExC,OACE,oBAAC,OAAD;IACE,WAAW,OAAO;IAEX;IACP,OAAO;IACP,SAAS,YAAY;KACnB,MAAM,UAAU,SAAS,OAAO,QAAQ,UAAU,MAAM,GAAG,MAAM,MAAM;KAEvE,MAAM,gBAAgB,OAAO;KAC7B,QAAQ,QAAQ,OAAO;IACzB;cAEA,oBAACA,mBAAD;KACE,YAAA;KACA,OAAO;KACP,WAAW,OAAO;KAClB,SAAS;KACT,OAAO,EAAE,iBAAiB,MAAM;IACjC,CAAA;GACE,GAjBE,KAiBF;EAET,CAAC,CACI;;AAEX,CAAC"}
1
+ {"version":3,"file":"ScaleRow.mjs","names":["Flexbox"],"sources":["../../../src/color/ColorScales/ScaleRow.tsx"],"sourcesContent":["import { message, Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { alphaBg, styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n scale: string[];\n title: 'light' | 'lightA' | 'dark' | 'darkA';\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name, title, scale }) => {\n let style = {};\n let isAlpha = false;\n\n switch (title) {\n case 'lightA': {\n style = { background: alphaBg.light, backgroundColor: '#fff' };\n isAlpha = true;\n break;\n }\n case 'darkA': {\n style = { background: alphaBg.dark, backgroundColor: '#000' };\n isAlpha = true;\n break;\n }\n default: {\n break;\n }\n }\n\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={title}>\n <div className={styles.text}>{title}</div>\n </div>\n {scale.map((color, index) => {\n if (index === 0 || index === 12) return false;\n\n return (\n <div\n className={styles.scaleBox}\n key={index}\n style={style}\n title={color}\n onClick={async () => {\n const content = `token.${name}${index}${isAlpha ? 'A' : ''} /* ${color} */`;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;AAcA,MAAM,WAAW,MAAiB,EAAE,MAAM,OAAO,YAAY;CAC3D,IAAI,QAAQ,CAAC;CACb,IAAI,UAAU;CAEd,QAAQ,OAAR;EACE,KAAK;GACH,QAAQ;IAAE,YAAY,QAAQ;IAAO,iBAAiB;GAAO;GAC7D,UAAU;GACV;EAEF,KAAK;GACH,QAAQ;IAAE,YAAY,QAAQ;IAAM,iBAAiB;GAAO;GAC5D,UAAU;GACV;EAEF,SACE;CAEJ;CAEA,OACE,qBAAC,OAAD;EAAO,MAAM;EAAb,UAAA,CACE,oBAAC,OAAD;GAAK,WAAW,OAAO;GACrB,UAAA,oBAAC,OAAD;IAAK,WAAW,OAAO;IAAO,UAAA;GAAW,CAAA;EACtC,GAFsC,KAEtC,GACJ,MAAM,KAAK,OAAO,UAAU;GAC3B,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;GAExC,OACE,oBAAC,OAAD;IACE,WAAW,OAAO;IAEX;IACP,OAAO;IACP,SAAS,YAAY;KACnB,MAAM,UAAU,SAAS,OAAO,QAAQ,UAAU,MAAM,GAAG,MAAM,MAAM;KAEvE,MAAM,gBAAgB,OAAO;KAC7B,QAAQ,QAAQ,OAAO;IACzB;IAEA,UAAA,oBAACA,mBAAD;KACE,YAAA;KACA,OAAO;KACP,WAAW,OAAO;KAClB,SAAS;KACT,OAAO,EAAE,iBAAiB,MAAM;IACjC,CAAA;GACE,GAjBE,KAiBF;EAET,CAAC,CACI;;AAEX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Flexbox"],"sources":["../../../src/color/ColorScales/index.tsx"],"sourcesContent":["'use client';\n\nimport { Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport type { ColorScaleItem } from '../types';\nimport ScaleRow from './ScaleRow';\nimport { styles } from './style';\n\nexport interface ColorScalesProps {\n /**\n * @description Index of the mid highlight color in the scale\n */\n midHighLight: number;\n /**\n * @description Name of the color scale\n */\n name: string;\n /**\n * @description Color scale item object\n */\n scale: ColorScaleItem;\n}\n\nconst ColorScales = memo<ColorScalesProps>(({ name, scale, midHighLight }) => {\n return (\n <Flexbox horizontal align={'center'} flex={1} justify={'center'}>\n <div style={{ padding: '8px 16px 32px 0' }}>\n <Space direction={'vertical'} size={2}>\n <Space key=\"scale-title\" size={2}>\n <Flexbox horizontal align={'center'} className={styles.scaleRowTitle} key=\"scale-num\" />\n {Array.from({ length: scale.light.length })\n .fill('')\n .map((_, index) => {\n if (index === 0 || index === 12) return false;\n\n const isMidHighlight = midHighLight === index;\n\n return (\n <div className={styles.scaleBox} key={`num${index}`}>\n <div className={styles.scaleBox}>\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{\n fontWeight: isMidHighlight ? 700 : 400,\n opacity: 0.5,\n }}\n >\n {index}\n </Flexbox>\n </div>\n </div>\n );\n })}\n </Space>\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n <ScaleRow key=\"lightA\" name={name} scale={scale.lightA} title=\"lightA\" />\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n <ScaleRow key=\"darkA\" name={name} scale={scale.darkA} title=\"darkA\" />\n </Space>\n </div>\n </Flexbox>\n );\n});\n\nexport default ColorScales;\n"],"mappings":";;;;;;;;AA0BA,MAAM,cAAc,MAAwB,EAAE,MAAM,OAAO,mBAAmB;CAC5E,OACE,oBAACA,mBAAD;EAAS,YAAA;EAAW,OAAO;EAAU,MAAM;EAAG,SAAS;YACrD,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,kBAAkB;aACvC,qBAAC,OAAD;IAAO,WAAW;IAAY,MAAM;cAApC;KACE,qBAAC,OAAD;MAAyB,MAAM;gBAA/B,CACE,oBAACA,mBAAD;OAAS,YAAA;OAAW,OAAO;OAAU,WAAW,OAAO;MAAgC,GAAb,WAAa,GACtF,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC,CACxC,KAAK,EAAE,CAAC,CACR,KAAK,GAAG,UAAU;OACjB,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;OAExC,MAAM,iBAAiB,iBAAiB;OAExC,OACE,oBAAC,OAAD;QAAK,WAAW,OAAO;kBACrB,oBAAC,OAAD;SAAK,WAAW,OAAO;mBACrB,oBAACA,mBAAD;UACE,YAAA;UACA,OAAO;UACP,WAAW,OAAO;UAClB,SAAS;UACT,OAAO;WACL,YAAY,iBAAiB,MAAM;WACnC,SAAS;UACX;oBAEC;SACM,CAAA;QACN,CAAA;OACF,GAfiC,MAAM,OAevC;MAET,CAAC,CACE;QA5BI,aA4BJ;KACP,oBAAC,UAAD;MAA4B;MAAM,OAAO,MAAM;MAAO,OAAM;KAAS,GAAvD,OAAuD;KACrE,oBAAC,UAAD;MAA6B;MAAM,OAAO,MAAM;MAAQ,OAAM;KAAU,GAA1D,QAA0D;KACxE,oBAAC,UAAD;MAA2B;MAAM,OAAO,MAAM;MAAM,OAAM;KAAQ,GAApD,MAAoD;KAClE,oBAAC,UAAD;MAA4B;MAAM,OAAO,MAAM;MAAO,OAAM;KAAS,GAAvD,OAAuD;IAChE;;EACJ,CAAA;CACE,CAAA;AAEb,CAAC"}
1
+ {"version":3,"file":"index.mjs","names":["Flexbox"],"sources":["../../../src/color/ColorScales/index.tsx"],"sourcesContent":["'use client';\n\nimport { Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport type { ColorScaleItem } from '../types';\nimport ScaleRow from './ScaleRow';\nimport { styles } from './style';\n\nexport interface ColorScalesProps {\n /**\n * @description Index of the mid highlight color in the scale\n */\n midHighLight: number;\n /**\n * @description Name of the color scale\n */\n name: string;\n /**\n * @description Color scale item object\n */\n scale: ColorScaleItem;\n}\n\nconst ColorScales = memo<ColorScalesProps>(({ name, scale, midHighLight }) => {\n return (\n <Flexbox horizontal align={'center'} flex={1} justify={'center'}>\n <div style={{ padding: '8px 16px 32px 0' }}>\n <Space direction={'vertical'} size={2}>\n <Space key=\"scale-title\" size={2}>\n <Flexbox horizontal align={'center'} className={styles.scaleRowTitle} key=\"scale-num\" />\n {Array.from({ length: scale.light.length })\n .fill('')\n .map((_, index) => {\n if (index === 0 || index === 12) return false;\n\n const isMidHighlight = midHighLight === index;\n\n return (\n <div className={styles.scaleBox} key={`num${index}`}>\n <div className={styles.scaleBox}>\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{\n fontWeight: isMidHighlight ? 700 : 400,\n opacity: 0.5,\n }}\n >\n {index}\n </Flexbox>\n </div>\n </div>\n );\n })}\n </Space>\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n <ScaleRow key=\"lightA\" name={name} scale={scale.lightA} title=\"lightA\" />\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n <ScaleRow key=\"darkA\" name={name} scale={scale.darkA} title=\"darkA\" />\n </Space>\n </div>\n </Flexbox>\n );\n});\n\nexport default ColorScales;\n"],"mappings":";;;;;;;;AA0BA,MAAM,cAAc,MAAwB,EAAE,MAAM,OAAO,mBAAmB;CAC5E,OACE,oBAACA,mBAAD;EAAS,YAAA;EAAW,OAAO;EAAU,MAAM;EAAG,SAAS;EACrD,UAAA,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,kBAAkB;GACvC,UAAA,qBAAC,OAAD;IAAO,WAAW;IAAY,MAAM;IAApC,UAAA;KACE,qBAAC,OAAD;MAAyB,MAAM;MAA/B,UAAA,CACE,oBAACA,mBAAD;OAAS,YAAA;OAAW,OAAO;OAAU,WAAW,OAAO;MAAgC,GAAb,WAAa,GACtF,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC,CACxC,KAAK,EAAE,CAAC,CACR,KAAK,GAAG,UAAU;OACjB,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;OAExC,MAAM,iBAAiB,iBAAiB;OAExC,OACE,oBAAC,OAAD;QAAK,WAAW,OAAO;QACrB,UAAA,oBAAC,OAAD;SAAK,WAAW,OAAO;SACrB,UAAA,oBAACA,mBAAD;UACE,YAAA;UACA,OAAO;UACP,WAAW,OAAO;UAClB,SAAS;UACT,OAAO;WACL,YAAY,iBAAiB,MAAM;WACnC,SAAS;UACX;UAEC,UAAA;SACM,CAAA;QACN,CAAA;OACF,GAfiC,MAAM,OAevC;MAET,CAAC,CACE;KA5BI,GAAA,aA4BJ;KACP,oBAAC,UAAD;MAA4B;MAAM,OAAO,MAAM;MAAO,OAAM;KAAS,GAAvD,OAAuD;KACrE,oBAAC,UAAD;MAA6B;MAAM,OAAO,MAAM;MAAQ,OAAM;KAAU,GAA1D,QAA0D;KACxE,oBAAC,UAAD;MAA2B;MAAM,OAAO,MAAM;MAAM,OAAM;KAAQ,GAApD,MAAoD;KAClE,oBAAC,UAAD;MAA4B;MAAM,OAAO,MAAM;MAAO,OAAM;KAAS,GAAvD,OAAuD;IAChE;;EACJ,CAAA;CACE,CAAA;AAEb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScaleRow.mjs","names":["Flexbox"],"sources":["../../../src/color/CssVar/ScaleRow.tsx"],"sourcesContent":["import { message, Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n scale: string[];\n title: 'light' | 'dark';\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name, title, scale }) => {\n const style = {};\n const isAlpha = false;\n\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={title}>\n <div className={styles.text}>{title}</div>\n </div>\n {scale.map((color, index) => {\n if (index === 0 || index === 12) return false;\n\n return (\n <div\n className={styles.scaleBox}\n key={index}\n style={style}\n title={color}\n onClick={async () => {\n const content = `token.${name}${index}${isAlpha ? 'A' : ''} /* ${color} */`;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;AAcA,MAAM,WAAW,MAAiB,EAAE,MAAM,OAAO,YAAY;CAC3D,MAAM,QAAQ,CAAC;CAGf,OACE,qBAAC,OAAD;EAAO,MAAM;YAAb,CACE,oBAAC,OAAD;GAAK,WAAW,OAAO;aACrB,oBAAC,OAAD;IAAK,WAAW,OAAO;cAAO;GAAW,CAAA;EACtC,GAFsC,KAEtC,GACJ,MAAM,KAAK,OAAO,UAAU;GAC3B,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;GAExC,OACE,oBAAC,OAAD;IACE,WAAW,OAAO;IAEX;IACP,OAAO;IACP,SAAS,YAAY;KACnB,MAAM,UAAU,SAAS,OAAO,MAAA,MAAiC,MAAM;KAEvE,MAAM,gBAAgB,OAAO;KAC7B,QAAQ,QAAQ,OAAO;IACzB;cAEA,oBAACA,mBAAD;KACE,YAAA;KACA,OAAO;KACP,WAAW,OAAO;KAClB,SAAS;KACT,OAAO,EAAE,iBAAiB,MAAM;IACjC,CAAA;GACE,GAjBE,KAiBF;EAET,CAAC,CACI;;AAEX,CAAC"}
1
+ {"version":3,"file":"ScaleRow.mjs","names":["Flexbox"],"sources":["../../../src/color/CssVar/ScaleRow.tsx"],"sourcesContent":["import { message, Space } from 'antd';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n scale: string[];\n title: 'light' | 'dark';\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name, title, scale }) => {\n const style = {};\n const isAlpha = false;\n\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={title}>\n <div className={styles.text}>{title}</div>\n </div>\n {scale.map((color, index) => {\n if (index === 0 || index === 12) return false;\n\n return (\n <div\n className={styles.scaleBox}\n key={index}\n style={style}\n title={color}\n onClick={async () => {\n const content = `token.${name}${index}${isAlpha ? 'A' : ''} /* ${color} */`;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;AAcA,MAAM,WAAW,MAAiB,EAAE,MAAM,OAAO,YAAY;CAC3D,MAAM,QAAQ,CAAC;CAGf,OACE,qBAAC,OAAD;EAAO,MAAM;EAAb,UAAA,CACE,oBAAC,OAAD;GAAK,WAAW,OAAO;GACrB,UAAA,oBAAC,OAAD;IAAK,WAAW,OAAO;IAAO,UAAA;GAAW,CAAA;EACtC,GAFsC,KAEtC,GACJ,MAAM,KAAK,OAAO,UAAU;GAC3B,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;GAExC,OACE,oBAAC,OAAD;IACE,WAAW,OAAO;IAEX;IACP,OAAO;IACP,SAAS,YAAY;KACnB,MAAM,UAAU,SAAS,OAAO,MAAA,MAAiC,MAAM;KAEvE,MAAM,gBAAgB,OAAO;KAC7B,QAAQ,QAAQ,OAAO;IACzB;IAEA,UAAA,oBAACA,mBAAD;KACE,YAAA;KACA,OAAO;KACP,WAAW,OAAO;KAClB,SAAS;KACT,OAAO,EAAE,iBAAiB,MAAM;IACjC,CAAA;GACE,GAjBE,KAiBF;EAET,CAAC,CACI;;AAEX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"VarRow.mjs","names":["Flexbox"],"sources":["../../../src/color/CssVar/VarRow.tsx"],"sourcesContent":["import { message, Space } from 'antd';\nimport { cssVar } from 'antd-style';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name }) => {\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={name}>\n <div className={styles.text}>cssVar</div>\n </div>\n {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((color) => {\n return (\n <div\n className={styles.scaleBox}\n key={color}\n title={(cssVar as any)[`${name}${color}`] as any}\n onClick={async () => {\n const content = (cssVar as any)[`${name}${color}`] as any;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{ backgroundColor: (cssVar as any)[`${name}${color}`] as any }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;;AAaA,MAAM,WAAW,MAAiB,EAAE,WAAW;CAC7C,OACE,qBAAC,OAAD;EAAO,MAAM;YAAb,CACE,oBAAC,OAAD;GAAK,WAAW,OAAO;aACrB,oBAAC,OAAD;IAAK,WAAW,OAAO;cAAM;GAAW,CAAA;EACrC,GAFsC,IAEtC,GACJ;GAAC;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;EAAE,CAAC,CAAC,KAAK,UAAU;GAC9C,OACE,oBAAC,OAAD;IACE,WAAW,OAAO;IAElB,OAAQ,OAAe,GAAG,OAAO;IACjC,SAAS,YAAY;KACnB,MAAM,UAAW,OAAe,GAAG,OAAO;KAE1C,MAAM,gBAAgB,OAAO;KAC7B,QAAQ,QAAQ,OAAO;IACzB;cAEA,oBAACA,mBAAD;KACE,YAAA;KACA,OAAO;KACP,WAAW,OAAO;KAClB,SAAS;KACT,OAAO,EAAE,iBAAkB,OAAe,GAAG,OAAO,SAAgB;IACrE,CAAA;GACE,GAhBE,KAgBF;EAET,CAAC,CACI;;AAEX,CAAC"}
1
+ {"version":3,"file":"VarRow.mjs","names":["Flexbox"],"sources":["../../../src/color/CssVar/VarRow.tsx"],"sourcesContent":["import { message, Space } from 'antd';\nimport { cssVar } from 'antd-style';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport { styles } from './style';\n\nexport interface IScaleRow {\n name: string;\n}\n\nconst ScaleRow = memo<IScaleRow>(({ name }) => {\n return (\n <Space size={2}>\n <div className={styles.scaleRowTitle} key={name}>\n <div className={styles.text}>cssVar</div>\n </div>\n {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((color) => {\n return (\n <div\n className={styles.scaleBox}\n key={color}\n title={(cssVar as any)[`${name}${color}`] as any}\n onClick={async () => {\n const content = (cssVar as any)[`${name}${color}`] as any;\n\n await copyToClipboard(content);\n message.success(content);\n }}\n >\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{ backgroundColor: (cssVar as any)[`${name}${color}`] as any }}\n />\n </div>\n );\n })}\n </Space>\n );\n});\n\nexport default ScaleRow;\n"],"mappings":";;;;;;;;AAaA,MAAM,WAAW,MAAiB,EAAE,WAAW;CAC7C,OACE,qBAAC,OAAD;EAAO,MAAM;EAAb,UAAA,CACE,oBAAC,OAAD;GAAK,WAAW,OAAO;GACrB,UAAA,oBAAC,OAAD;IAAK,WAAW,OAAO;IAAM,UAAA;GAAW,CAAA;EACrC,GAFsC,IAEtC,GACJ;GAAC;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;EAAE,CAAC,CAAC,KAAK,UAAU;GAC9C,OACE,oBAAC,OAAD;IACE,WAAW,OAAO;IAElB,OAAQ,OAAe,GAAG,OAAO;IACjC,SAAS,YAAY;KACnB,MAAM,UAAW,OAAe,GAAG,OAAO;KAE1C,MAAM,gBAAgB,OAAO;KAC7B,QAAQ,QAAQ,OAAO;IACzB;IAEA,UAAA,oBAACA,mBAAD;KACE,YAAA;KACA,OAAO;KACP,WAAW,OAAO;KAClB,SAAS;KACT,OAAO,EAAE,iBAAkB,OAAe,GAAG,OAAO,SAAgB;IACrE,CAAA;GACE,GAhBE,KAgBF;EAET,CAAC,CACI;;AAEX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Flexbox","VarRow"],"sources":["../../../src/color/CssVar/index.tsx"],"sourcesContent":["'use client';\n\nimport { Space } from 'antd';\nimport { useThemeMode } from 'antd-style';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport { type ColorScaleItem } from '../types';\nimport ScaleRow from './ScaleRow';\nimport { styles } from './style';\nimport VarRow from './VarRow';\n\nexport interface ColorScalesProps {\n /**\n * @description Index of the mid highlight color in the scale\n */\n midHighLight: number;\n /**\n * @description Name of the color scale\n */\n name: string;\n /**\n * @description Color scale item object\n */\n scale: ColorScaleItem;\n}\n\nconst ColorScales = memo<ColorScalesProps>(({ name, scale, midHighLight }) => {\n const { isDarkMode } = useThemeMode();\n return (\n <Flexbox horizontal align={'center'} flex={1} justify={'center'}>\n <div style={{ padding: '8px 16px 32px 0' }}>\n <Space direction={'vertical'} size={2}>\n <Space key=\"scale-title\" size={2}>\n <Flexbox horizontal align={'center'} className={styles.scaleRowTitle} key=\"scale-num\" />\n {Array.from({ length: scale.light.length })\n .fill('')\n .map((_, index) => {\n if (index === 0 || index === 12) return false;\n\n const isMidHighlight = midHighLight === index;\n\n return (\n <div className={styles.scaleBox} key={`num${index}`}>\n <div className={styles.scaleBox}>\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{\n fontWeight: isMidHighlight ? 700 : 400,\n opacity: 0.5,\n }}\n >\n {index}\n </Flexbox>\n </div>\n </div>\n );\n })}\n </Space>\n <VarRow name={name} />\n {isDarkMode ? (\n <>\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n </>\n ) : (\n <>\n {' '}\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n </>\n )}\n </Space>\n </div>\n </Flexbox>\n );\n});\n\nexport default ColorScales;\n"],"mappings":";;;;;;;;;;AA4BA,MAAM,cAAc,MAAwB,EAAE,MAAM,OAAO,mBAAmB;CAC5E,MAAM,EAAE,eAAe,aAAa;CACpC,OACE,oBAACA,mBAAD;EAAS,YAAA;EAAW,OAAO;EAAU,MAAM;EAAG,SAAS;YACrD,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,kBAAkB;aACvC,qBAAC,OAAD;IAAO,WAAW;IAAY,MAAM;cAApC;KACE,qBAAC,OAAD;MAAyB,MAAM;gBAA/B,CACE,oBAACA,mBAAD;OAAS,YAAA;OAAW,OAAO;OAAU,WAAW,OAAO;MAAgC,GAAb,WAAa,GACtF,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC,CACxC,KAAK,EAAE,CAAC,CACR,KAAK,GAAG,UAAU;OACjB,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;OAExC,MAAM,iBAAiB,iBAAiB;OAExC,OACE,oBAAC,OAAD;QAAK,WAAW,OAAO;kBACrB,oBAAC,OAAD;SAAK,WAAW,OAAO;mBACrB,oBAACA,mBAAD;UACE,YAAA;UACA,OAAO;UACP,WAAW,OAAO;UAClB,SAAS;UACT,OAAO;WACL,YAAY,iBAAiB,MAAM;WACnC,SAAS;UACX;oBAEC;SACM,CAAA;QACN,CAAA;OACF,GAfiC,MAAM,OAevC;MAET,CAAC,CACE;QA5BI,aA4BJ;KACP,oBAACC,YAAD,EAAc,KAAO,CAAA;KACpB,aACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;MAA2B;MAAM,OAAO,MAAM;MAAM,OAAM;KAAQ,GAApD,MAAoD,GAClE,oBAAC,UAAD;MAA4B;MAAM,OAAO,MAAM;MAAO,OAAM;KAAS,GAAvD,OAAuD,CACrE,EAAA,CAAA,IAEF,qBAAA,YAAA,EAAA,UAAA;MACG;MACD,oBAAC,UAAD;OAA4B;OAAM,OAAO,MAAM;OAAO,OAAM;MAAS,GAAvD,OAAuD;MACrE,oBAAC,UAAD;OAA2B;OAAM,OAAO,MAAM;OAAM,OAAM;MAAQ,GAApD,MAAoD;KAClE,EAAA,CAAA;IAEC;;EACJ,CAAA;CACE,CAAA;AAEb,CAAC"}
1
+ {"version":3,"file":"index.mjs","names":["Flexbox","VarRow"],"sources":["../../../src/color/CssVar/index.tsx"],"sourcesContent":["'use client';\n\nimport { Space } from 'antd';\nimport { useThemeMode } from 'antd-style';\nimport { memo } from 'react';\n\nimport { Flexbox } from '@/Flex';\n\nimport { type ColorScaleItem } from '../types';\nimport ScaleRow from './ScaleRow';\nimport { styles } from './style';\nimport VarRow from './VarRow';\n\nexport interface ColorScalesProps {\n /**\n * @description Index of the mid highlight color in the scale\n */\n midHighLight: number;\n /**\n * @description Name of the color scale\n */\n name: string;\n /**\n * @description Color scale item object\n */\n scale: ColorScaleItem;\n}\n\nconst ColorScales = memo<ColorScalesProps>(({ name, scale, midHighLight }) => {\n const { isDarkMode } = useThemeMode();\n return (\n <Flexbox horizontal align={'center'} flex={1} justify={'center'}>\n <div style={{ padding: '8px 16px 32px 0' }}>\n <Space direction={'vertical'} size={2}>\n <Space key=\"scale-title\" size={2}>\n <Flexbox horizontal align={'center'} className={styles.scaleRowTitle} key=\"scale-num\" />\n {Array.from({ length: scale.light.length })\n .fill('')\n .map((_, index) => {\n if (index === 0 || index === 12) return false;\n\n const isMidHighlight = midHighLight === index;\n\n return (\n <div className={styles.scaleBox} key={`num${index}`}>\n <div className={styles.scaleBox}>\n <Flexbox\n horizontal\n align={'center'}\n className={styles.scaleItem}\n justify={'center'}\n style={{\n fontWeight: isMidHighlight ? 700 : 400,\n opacity: 0.5,\n }}\n >\n {index}\n </Flexbox>\n </div>\n </div>\n );\n })}\n </Space>\n <VarRow name={name} />\n {isDarkMode ? (\n <>\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n </>\n ) : (\n <>\n {' '}\n <ScaleRow key=\"light\" name={name} scale={scale.light} title=\"light\" />\n <ScaleRow key=\"dark\" name={name} scale={scale.dark} title=\"dark\" />\n </>\n )}\n </Space>\n </div>\n </Flexbox>\n );\n});\n\nexport default ColorScales;\n"],"mappings":";;;;;;;;;;AA4BA,MAAM,cAAc,MAAwB,EAAE,MAAM,OAAO,mBAAmB;CAC5E,MAAM,EAAE,eAAe,aAAa;CACpC,OACE,oBAACA,mBAAD;EAAS,YAAA;EAAW,OAAO;EAAU,MAAM;EAAG,SAAS;EACrD,UAAA,oBAAC,OAAD;GAAK,OAAO,EAAE,SAAS,kBAAkB;GACvC,UAAA,qBAAC,OAAD;IAAO,WAAW;IAAY,MAAM;IAApC,UAAA;KACE,qBAAC,OAAD;MAAyB,MAAM;MAA/B,UAAA,CACE,oBAACA,mBAAD;OAAS,YAAA;OAAW,OAAO;OAAU,WAAW,OAAO;MAAgC,GAAb,WAAa,GACtF,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC,CACxC,KAAK,EAAE,CAAC,CACR,KAAK,GAAG,UAAU;OACjB,IAAI,UAAU,KAAK,UAAU,IAAI,OAAO;OAExC,MAAM,iBAAiB,iBAAiB;OAExC,OACE,oBAAC,OAAD;QAAK,WAAW,OAAO;QACrB,UAAA,oBAAC,OAAD;SAAK,WAAW,OAAO;SACrB,UAAA,oBAACA,mBAAD;UACE,YAAA;UACA,OAAO;UACP,WAAW,OAAO;UAClB,SAAS;UACT,OAAO;WACL,YAAY,iBAAiB,MAAM;WACnC,SAAS;UACX;UAEC,UAAA;SACM,CAAA;QACN,CAAA;OACF,GAfiC,MAAM,OAevC;MAET,CAAC,CACE;KA5BI,GAAA,aA4BJ;KACP,oBAACC,YAAD,EAAc,KAAO,CAAA;KACpB,aACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;MAA2B;MAAM,OAAO,MAAM;MAAM,OAAM;KAAQ,GAApD,MAAoD,GAClE,oBAAC,UAAD;MAA4B;MAAM,OAAO,MAAM;MAAO,OAAM;KAAS,GAAvD,OAAuD,CACrE,EAAA,CAAA,IAEF,qBAAA,YAAA,EAAA,UAAA;MACG;MACD,oBAAC,UAAD;OAA4B;OAAM,OAAO,MAAM;OAAO,OAAM;MAAS,GAAvD,OAAuD;MACrE,oBAAC,UAAD;OAA2B;OAAM,OAAO,MAAM;OAAM,OAAM;MAAQ,GAApD,MAAoD;KAClE,EAAA,CAAA;IAEC;;EACJ,CAAA;CACE,CAAA;AAEb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"latex.mjs","names":[],"sources":["../../../src/hooks/useMarkdown/latex.ts"],"sourcesContent":["import { renderToString } from 'katex';\n\n// ============================================================================\n// Utility Classes\n// ============================================================================\n\n/**\n * PlaceholderManager - Manages temporary replacement and restoration of protected content\n * Used to protect code blocks and LaTeX expressions during preprocessing\n */\nclass PlaceholderManager {\n private placeholders: string[] = [];\n private prefix: string;\n\n constructor(prefix = 'PROTECTED') {\n this.prefix = prefix;\n }\n\n add(content: string): string {\n const index = this.placeholders.length;\n this.placeholders.push(content);\n return `<<${this.prefix}_${index}>>`;\n }\n\n restore(text: string): string {\n return text.replaceAll(new RegExp(`<<${this.prefix}_(\\\\d+)>>`, 'g'), (_, index) => {\n return this.placeholders[Number.parseInt(index)] || '';\n });\n }\n\n clear(): void {\n this.placeholders = [];\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// Helper: replace unescaped pipes with \\vert within a LaTeX math fragment\nconst replaceUnescapedPipes = (formula: string): string =>\n // Use \\vert{} so the control sequence terminates before the next token\n formula.replaceAll(/(?<!\\\\)\\|/g, '\\\\vert{}');\n\n/**\n * Converts LaTeX bracket delimiters to dollar sign delimiters.\n * Converts \\[...\\] to $$...$$ and \\(...\\) to $...$\n * Preserves code blocks during the conversion.\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with LaTeX bracket delimiters converted to dollar sign delimiters\n */\nexport function convertLatexDelimiters(text: string): string {\n const pattern = /(```[\\s\\S]*?```|`.*?`)|\\\\\\[([\\s\\S]*?[^\\\\])\\\\\\]|\\\\\\((.*?)\\\\\\)/g;\n return text.replaceAll(\n pattern,\n (\n match: string,\n codeBlock: string | undefined,\n squareBracket: string | undefined,\n roundBracket: string | undefined,\n ): string => {\n if (codeBlock !== undefined) {\n return codeBlock;\n } else if (squareBracket !== undefined) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket !== undefined) {\n return `$${roundBracket}$`;\n }\n return match;\n },\n );\n}\n\n/**\n * Escapes mhchem commands in LaTeX expressions to ensure proper rendering.\n *\n * @param text The input string containing LaTeX expressions with mhchem commands\n * @returns The string with escaped mhchem commands\n */\nexport function escapeMhchemCommands(text: string) {\n return text.replaceAll('$\\\\ce{', '$\\\\\\\\ce{').replaceAll('$\\\\pu{', '$\\\\\\\\pu{');\n}\n\n/**\n * Escapes pipe characters within LaTeX expressions to prevent them from being interpreted\n * as table column separators in markdown tables.\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with pipe characters escaped in LaTeX expressions\n */\nexport function escapeLatexPipes(text: string): string {\n // Replace unescaped '|' inside LaTeX math spans with '\\vert' so that\n // remark-gfm table parsing won't treat them as column separators.\n // Leave code blocks/inline code untouched.\n // Also ignore escaped dollars (\\$) which are currency symbols\n\n // Process code blocks first to protect them\n const codeBlocks: string[] = [];\n let content = text.replaceAll(/(```[\\s\\S]*?```|`[^\\n`]*`)/g, (match) => {\n codeBlocks.push(match);\n return `<<CODE_${codeBlocks.length - 1}>>`;\n });\n\n // For display math, allow multiline\n content = content.replaceAll(/\\$\\$([\\s\\S]*?)\\$\\$/g, (match, display) => {\n return `$$${replaceUnescapedPipes(display)}$$`;\n });\n\n // For inline math, use non-greedy match that DOES NOT cross newlines\n // This prevents issues in tables where $ might appear in different cells\n content = content.replaceAll(/(?<!\\\\)\\$(?!\\$)([^\\n$]*)(?<!\\\\)\\$(?!\\$)/g, (match, inline) => {\n return `$${replaceUnescapedPipes(inline)}$`;\n });\n\n // Restore code blocks\n content = content.replaceAll(/<<CODE_(\\d+)>>/g, (_, index) => {\n return codeBlocks[Number.parseInt(index)];\n });\n\n return content;\n}\n\n/**\n * Escapes underscores within \\text{...} commands in LaTeX expressions\n * that are not already escaped.\n * For example, \\text{node_domain} becomes \\text{node\\_domain},\n * but \\text{node\\_domain} remains \\text{node\\_domain}.\n *\n * @param text The input string potentially containing LaTeX expressions\n * @returns The string with unescaped underscores escaped within \\text{...} commands\n */\nexport function escapeTextUnderscores(text: string): string {\n return text.replaceAll(/\\\\text\\{([^}]*)\\}/g, (match, textContent: string) => {\n // textContent is the content within the braces, e.g., \"node_domain\" or \"already\\_escaped\"\n // Replace underscores '_' with '\\_' only if they are NOT preceded by a backslash '\\'.\n // The (?<!\\\\) is a negative lookbehind assertion that ensures the character before '_' is not a '\\'.\n const escapedTextContent = textContent.replaceAll(/(?<!\\\\)_/g, '\\\\_');\n return `\\\\text{${escapedTextContent}}`;\n });\n}\n\n/**\n * Escapes dollar signs that appear to be currency symbols to prevent them from being\n * interpreted as LaTeX math delimiters.\n *\n * This function identifies currency patterns such as:\n * - $20, $100, $1,000\n * - $20-50, $100+\n * - Patterns within markdown tables\n *\n * @param text The input string containing potential currency symbols\n * @returns The string with currency dollar signs escaped\n */\nexport function escapeCurrencyDollars(text: string): string {\n // Protect code blocks and existing LaTeX expressions from processing\n const manager = new PlaceholderManager('PROTECTED');\n\n let content = text.replaceAll(\n // Match patterns to protect (in order):\n // 1. Code blocks: ```...```\n // 2. Inline code: `...`\n // 3. Display math: $$...$$\n // 4. Inline math with LaTeX commands: $...\\...$ (must contain backslash to distinguish from currency)\n // 5. Simple number formulas: $1$, $10$, $100$ (pure digits in math mode)\n // 6. Number lists in math mode: $1,-1,0$ or $1,2,3$ (comma-separated numbers, possibly negative)\n // 7. LaTeX bracket notation: \\[...\\]\n // 8. LaTeX parenthesis notation: \\(...\\)\n /(```[\\s\\S]*?```|`[^\\n`]*`|\\$\\$[\\s\\S]*?\\$\\$|(?<!\\\\)\\$(?!\\$)(?=[\\s\\S]*?\\\\)[\\s\\S]*?(?<!\\\\)\\$(?!\\$)|\\$\\d+\\$|\\$-?\\d+(?:,-?\\d+)+\\$|\\\\\\[[\\s\\S]*?\\\\\\]|\\\\\\(.*?\\\\\\))/g,\n (match) => manager.add(match),\n );\n\n // Escape dollar signs that are clearly currency:\n // - $ followed by a digit\n // - Not preceded by another $ (to avoid breaking $$)\n // - Not followed immediately by another $ (to avoid breaking $1$ LaTeX)\n // - Followed by number patterns with optional commas, decimals, ranges, or plus signs\n // Match patterns like: $20, $1,000, $19.99, $20-50, $300+, $1,000-2,000+\n // But NOT: $1$, $2$ (these are LaTeX formulas)\n // In the replacement: \\\\ = backslash, $$ = literal $, $1 = capture group 1\n content = content.replaceAll(\n /(?<!\\$)\\$(\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?(?:-\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?)?\\+?)(?!\\$)/g,\n '\\\\$$$1',\n );\n\n // Restore protected content\n content = manager.restore(content);\n\n return content;\n}\n\n// Old simple preprocessLaTeX has been replaced by the comprehensive version below\n// The new preprocessLaTeX provides the same default behavior with optional advanced featuresgit\n\n/**\n * Extracts the LaTeX formula after the last $$ delimiter if there's an odd number of $$ delimiters.\n *\n * @param text The input string containing LaTeX formulas\n * @returns The content after the last $$ if there's an odd number of $$, otherwise an empty string\n */\nconst extractIncompleteFormula = (text: string) => {\n // Count the number of $$ delimiters\n const dollarsCount = (text.match(/\\$\\$/g) || []).length;\n\n // If odd number of $$ delimiters, extract content after the last $$\n if (dollarsCount % 2 === 1) {\n const match = text.match(/\\$\\$([\\s\\S]*)$/);\n return match ? match[1] : '';\n }\n\n // If even number of $$ delimiters, return empty string\n return '';\n};\n\n/**\n * Checks if the last LaTeX formula in the text is renderable.\n * Only validates the formula after the last $$ if there's an odd number of $$.\n *\n * @param text The input string containing LaTeX formulas\n * @returns True if the last formula is renderable or if there's no incomplete formula\n */\nexport const isLastFormulaRenderable = (text: string) => {\n const formula = extractIncompleteFormula(text);\n\n // If no incomplete formula, return true\n if (!formula) return true;\n\n // Try to render the last formula\n try {\n renderToString(formula, {\n displayMode: true,\n throwOnError: true,\n });\n return true;\n } catch (error) {\n console.error(`LaTeX formula rendering error: ${error}`);\n return false;\n }\n};\n\n// ============================================================================\n// Advanced Preprocessing Functions\n// ============================================================================\n\n/**\n * Fixes common LaTeX syntax errors automatically\n * - Balances unmatched braces\n * - Balances \\left and \\right delimiters\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with fixed LaTeX expressions\n */\nexport function fixCommonLaTeXErrors(text: string): string {\n return text.replaceAll(/(\\$\\$[\\s\\S]*?\\$\\$|\\$[\\s\\S]*?\\$)/g, (match) => {\n let fixed = match;\n\n // Fix unbalanced braces\n const openBraces = (fixed.match(/(?<!\\\\)\\{/g) || []).length;\n const closeBraces = (fixed.match(/(?<!\\\\)\\}/g) || []).length;\n if (openBraces > closeBraces) {\n const diff = openBraces - closeBraces;\n const closingBraces = '}'.repeat(diff);\n // Insert before the closing delimiter\n fixed = fixed.replace(/(\\$\\$?)$/, closingBraces + '$1');\n }\n\n // Fix unbalanced \\left and \\right\n const leftDelims = (fixed.match(/\\\\left[(.<[{|]/g) || []).length;\n const rightDelims = (fixed.match(/\\\\right[).>\\]|}]/g) || []).length;\n if (leftDelims > rightDelims) {\n const diff = leftDelims - rightDelims;\n const rightDots = '\\\\right.'.repeat(diff);\n fixed = fixed.replace(/(\\$\\$?)$/, rightDots + '$1');\n }\n\n return fixed;\n });\n}\n\n/**\n * Normalizes whitespace in LaTeX expressions\n * - Removes extra spaces around $ delimiters\n * - Normalizes multiple spaces to single space inside formulas\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with normalized whitespace\n */\nexport function normalizeLatexSpacing(text: string): string {\n let result = text;\n\n // Remove spaces inside $ delimiters (at the edges)\n result = result.replaceAll(/\\$\\s+/g, '$');\n result = result.replaceAll(/\\s+\\$/g, '$');\n result = result.replaceAll(/\\$\\$\\s+/g, '$$');\n result = result.replaceAll(/\\s+\\$\\$/g, '$$');\n\n // Normalize multiple spaces inside formulas to single space\n result = result.replaceAll(/(\\$\\$[\\s\\S]*?\\$\\$|\\$[\\s\\S]*?\\$)/g, (match) => {\n return match.replaceAll(/\\s{2,}/g, ' ');\n });\n\n return result;\n}\n\n/**\n * Validates all LaTeX expressions in the text\n * Returns detailed information about validation results\n *\n * @param text The input string containing LaTeX expressions\n * @returns Validation results with errors if any\n */\nexport function validateLatexExpressions(text: string): {\n errors: Array<{\n formula: string;\n message: string;\n position: number;\n type: 'display' | 'inline';\n }>;\n totalExpressions: number;\n valid: boolean;\n} {\n const errors: Array<{\n formula: string;\n message: string;\n position: number;\n type: 'display' | 'inline';\n }> = [];\n\n let totalExpressions = 0;\n const pattern = /\\$\\$([\\s\\S]*?)\\$\\$|(?<!\\\\)\\$(?!\\$)([\\s\\S]*?)(?<!\\\\)\\$(?!\\$)/g;\n let match;\n\n while ((match = pattern.exec(text)) !== null) {\n totalExpressions++;\n const formula = match[1] || match[2];\n const isDisplay = match[0].startsWith('$$');\n\n try {\n renderToString(formula, {\n displayMode: isDisplay,\n strict: 'warn',\n throwOnError: true,\n trust: false,\n });\n } catch (error) {\n errors.push({\n formula: formula.slice(0, 50) + (formula.length > 50 ? '...' : ''),\n message: error instanceof Error ? error.message : String(error),\n position: match.index,\n type: isDisplay ? 'display' : 'inline',\n });\n }\n }\n\n return {\n errors,\n totalExpressions,\n valid: errors.length === 0,\n };\n}\n\n/**\n * Handles CJK (Chinese, Japanese, Korean) characters mixed with LaTeX\n * Optionally adds spaces between CJK characters and LaTeX expressions for better rendering\n *\n * @param text The input string\n * @param addSpaces Whether to add spaces between CJK and LaTeX (default: false)\n * @returns The processed string\n */\nexport function handleCJKWithLatex(text: string, addSpaces = false): string {\n if (!addSpaces) return text;\n\n let result = text;\n\n // Add space between CJK character and opening $\n result = result.replaceAll(/([\\u3040-\\u30FF\\u4E00-\\u9FA5])(\\$)/g, '$1 $2');\n\n // Add space between closing $ and CJK character\n result = result.replaceAll(/(\\$)([\\u3040-\\u30FF\\u4E00-\\u9FA5])/g, '$1 $2');\n\n return result;\n}\n\n// ============================================================================\n// Advanced Preprocessing Options\n// ============================================================================\n\nexport interface AdvancedPreprocessOptions {\n /** Add spaces between CJK and LaTeX (default: false, requires handleCJK: true) */\n addCJKSpaces?: boolean;\n /** Convert bracket notation \\[...\\] to $$...$$ (default: true) */\n convertBrackets?: boolean;\n /** Enable currency escaping (default: true) */\n escapeCurrency?: boolean;\n /** Escape mhchem commands (default: true) */\n escapeMhchem?: boolean;\n /** Escape pipe symbols in LaTeX (default: true) */\n escapePipes?: boolean;\n /** Escape underscores in \\text{} (default: true) */\n escapeUnderscores?: boolean;\n /** Automatically fix common LaTeX errors (default: false) */\n fixErrors?: boolean;\n /** Handle CJK characters (default: false) */\n handleCJK?: boolean;\n /** Normalize whitespace (default: false) */\n normalizeSpacing?: boolean;\n /** Throw error on validation failure (default: false, requires validate: true) */\n throwOnValidationError?: boolean;\n /** Validate LaTeX syntax (default: false) */\n validate?: boolean;\n}\n\n/**\n * Comprehensive LaTeX preprocessing with configurable options\n *\n * This is the main preprocessing function that handles:\n * - Currency symbol escaping (e.g., $20 → \\$20)\n * - LaTeX delimiter conversion (\\[...\\] → $$...$$)\n * - Special character escaping (pipes, underscores, mhchem)\n * - Optional error fixing and validation\n * - Optional CJK character handling\n *\n * @param text The input string containing LaTeX and Markdown\n * @param options Configuration options for fine-grained control\n * @returns The preprocessed string\n *\n * @example\n * ```ts\n * // Default behavior (same as old preprocessLaTeX)\n * preprocessLaTeX('向量$90^\\\\circ$,非 $0^\\\\circ$ 和 $180^\\\\circ$')\n *\n * // With custom options\n * preprocessLaTeX(text, {\n * fixErrors: true,\n * validate: true,\n * handleCJK: true\n * })\n * ```\n */\nexport function preprocessLaTeX(text: string, options: AdvancedPreprocessOptions = {}): string {\n const {\n addCJKSpaces = false,\n convertBrackets = true,\n escapeCurrency = true,\n escapeMhchem = true,\n escapePipes = true,\n escapeUnderscores = true,\n fixErrors = false,\n handleCJK = false,\n normalizeSpacing = false,\n throwOnValidationError = false,\n validate = false,\n } = options;\n\n let content = text;\n\n // Phase 1: Currency escaping (if enabled)\n if (escapeCurrency) {\n content = escapeCurrencyDollars(content);\n }\n\n // Phase 2: Bracket conversion (if enabled)\n if (convertBrackets) {\n content = convertLatexDelimiters(content);\n }\n\n // Phase 3: LaTeX-specific escaping\n if (escapeMhchem) {\n content = escapeMhchemCommands(content);\n }\n\n if (escapePipes) {\n content = escapeLatexPipes(content);\n }\n\n if (escapeUnderscores) {\n content = escapeTextUnderscores(content);\n }\n\n // Phase 4: Error fixing (if enabled)\n if (fixErrors) {\n content = fixCommonLaTeXErrors(content);\n }\n\n // Phase 5: Whitespace normalization (if enabled)\n if (normalizeSpacing) {\n content = normalizeLatexSpacing(content);\n }\n\n // Phase 6: CJK handling (if enabled)\n if (handleCJK) {\n content = handleCJKWithLatex(content, addCJKSpaces);\n }\n\n // Phase 7: Validation (if enabled)\n if (validate) {\n const validation = validateLatexExpressions(content);\n if (!validation.valid) {\n const errorMessage = `LaTeX validation failed (${validation.errors.length}/${validation.totalExpressions} expressions have errors):\\n${validation.errors.map((e) => ` - [${e.type}] at position ${e.position}: ${e.message}\\n Formula: ${e.formula}`).join('\\n')}`;\n\n if (throwOnValidationError) {\n throw new Error(errorMessage);\n } else {\n console.warn(errorMessage);\n }\n }\n }\n\n return content;\n}\n\n/**\n * Strict preprocessing mode - enables all safety features and validations\n * Use this when you want maximum correctness and are willing to accept the performance cost\n *\n * @param text The input string\n * @returns The preprocessed string with all features enabled\n *\n * @example\n * ```ts\n * const processed = preprocessLaTeXStrict(userInput)\n * // Enables: error fixing, validation, CJK handling, space normalization\n * ```\n */\nexport function preprocessLaTeXStrict(text: string): string {\n return preprocessLaTeX(text, {\n addCJKSpaces: false, // Usually don't want extra spaces\n convertBrackets: true,\n escapeCurrency: true,\n escapeMhchem: true,\n escapePipes: true,\n escapeUnderscores: true,\n fixErrors: true,\n handleCJK: true,\n normalizeSpacing: true,\n throwOnValidationError: false, // Warn but don't throw\n validate: true,\n });\n}\n\n/**\n * Minimal preprocessing mode - only essential operations\n * Use this for better performance when you control the input\n *\n * @param text The input string\n * @returns The preprocessed string with minimal processing\n *\n * @example\n * ```ts\n * const processed = preprocessLaTeXMinimal(trustedInput)\n * // Only escapes currency and converts brackets\n * ```\n */\nexport function preprocessLaTeXMinimal(text: string): string {\n return preprocessLaTeX(text, {\n convertBrackets: true,\n escapeCurrency: true,\n escapeMhchem: false,\n escapePipes: false,\n escapeUnderscores: false,\n fixErrors: false,\n handleCJK: false,\n normalizeSpacing: false,\n validate: false,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"latex.mjs","names":[],"sources":["../../../src/hooks/useMarkdown/latex.ts"],"sourcesContent":["import { renderToString } from 'katex';\n\n// ============================================================================\n// Utility Classes\n// ============================================================================\n\n/**\n * PlaceholderManager - Manages temporary replacement and restoration of protected content\n * Used to protect code blocks and LaTeX expressions during preprocessing\n */\nclass PlaceholderManager {\n private placeholders: string[] = [];\n private prefix: string;\n\n constructor(prefix = 'PROTECTED') {\n this.prefix = prefix;\n }\n\n add(content: string): string {\n const index = this.placeholders.length;\n this.placeholders.push(content);\n return `<<${this.prefix}_${index}>>`;\n }\n\n restore(text: string): string {\n return text.replaceAll(new RegExp(`<<${this.prefix}_(\\\\d+)>>`, 'g'), (_, index) => {\n return this.placeholders[Number.parseInt(index)] || '';\n });\n }\n\n clear(): void {\n this.placeholders = [];\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// Helper: replace unescaped pipes with \\vert within a LaTeX math fragment\nconst replaceUnescapedPipes = (formula: string): string =>\n // Use \\vert{} so the control sequence terminates before the next token\n formula.replaceAll(/(?<!\\\\)\\|/g, '\\\\vert{}');\n\n/**\n * Converts LaTeX bracket delimiters to dollar sign delimiters.\n * Converts \\[...\\] to $$...$$ and \\(...\\) to $...$\n * Preserves code blocks during the conversion.\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with LaTeX bracket delimiters converted to dollar sign delimiters\n */\nexport function convertLatexDelimiters(text: string): string {\n const pattern = /(```[\\s\\S]*?```|`.*?`)|\\\\\\[([\\s\\S]*?[^\\\\])\\\\\\]|\\\\\\((.*?)\\\\\\)/g;\n return text.replaceAll(\n pattern,\n (\n match: string,\n codeBlock: string | undefined,\n squareBracket: string | undefined,\n roundBracket: string | undefined,\n ): string => {\n if (codeBlock !== undefined) {\n return codeBlock;\n } else if (squareBracket !== undefined) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket !== undefined) {\n return `$${roundBracket}$`;\n }\n return match;\n },\n );\n}\n\n/**\n * Escapes mhchem commands in LaTeX expressions to ensure proper rendering.\n *\n * @param text The input string containing LaTeX expressions with mhchem commands\n * @returns The string with escaped mhchem commands\n */\nexport function escapeMhchemCommands(text: string) {\n return text.replaceAll('$\\\\ce{', '$\\\\\\\\ce{').replaceAll('$\\\\pu{', '$\\\\\\\\pu{');\n}\n\n/**\n * Escapes pipe characters within LaTeX expressions to prevent them from being interpreted\n * as table column separators in markdown tables.\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with pipe characters escaped in LaTeX expressions\n */\nexport function escapeLatexPipes(text: string): string {\n // Replace unescaped '|' inside LaTeX math spans with '\\vert' so that\n // remark-gfm table parsing won't treat them as column separators.\n // Leave code blocks/inline code untouched.\n // Also ignore escaped dollars (\\$) which are currency symbols\n\n // Process code blocks first to protect them\n const codeBlocks: string[] = [];\n let content = text.replaceAll(/(```[\\s\\S]*?```|`[^\\n`]*`)/g, (match) => {\n codeBlocks.push(match);\n return `<<CODE_${codeBlocks.length - 1}>>`;\n });\n\n // For display math, allow multiline\n content = content.replaceAll(/\\$\\$([\\s\\S]*?)\\$\\$/g, (match, display) => {\n return `$$${replaceUnescapedPipes(display)}$$`;\n });\n\n // For inline math, use non-greedy match that DOES NOT cross newlines\n // This prevents issues in tables where $ might appear in different cells\n content = content.replaceAll(/(?<!\\\\)\\$(?!\\$)([^\\n$]*)(?<!\\\\)\\$(?!\\$)/g, (match, inline) => {\n return `$${replaceUnescapedPipes(inline)}$`;\n });\n\n // Restore code blocks\n content = content.replaceAll(/<<CODE_(\\d+)>>/g, (_, index) => {\n return codeBlocks[Number.parseInt(index)];\n });\n\n return content;\n}\n\n/**\n * Escapes underscores within \\text{...} commands in LaTeX expressions\n * that are not already escaped.\n * For example, \\text{node_domain} becomes \\text{node\\_domain},\n * but \\text{node\\_domain} remains \\text{node\\_domain}.\n *\n * @param text The input string potentially containing LaTeX expressions\n * @returns The string with unescaped underscores escaped within \\text{...} commands\n */\nexport function escapeTextUnderscores(text: string): string {\n return text.replaceAll(/\\\\text\\{([^}]*)\\}/g, (match, textContent: string) => {\n // textContent is the content within the braces, e.g., \"node_domain\" or \"already\\_escaped\"\n // Replace underscores '_' with '\\_' only if they are NOT preceded by a backslash '\\'.\n // The (?<!\\\\) is a negative lookbehind assertion that ensures the character before '_' is not a '\\'.\n const escapedTextContent = textContent.replaceAll(/(?<!\\\\)_/g, '\\\\_');\n return `\\\\text{${escapedTextContent}}`;\n });\n}\n\n/**\n * Escapes dollar signs that appear to be currency symbols to prevent them from being\n * interpreted as LaTeX math delimiters.\n *\n * This function identifies currency patterns such as:\n * - $20, $100, $1,000\n * - $20-50, $100+\n * - Patterns within markdown tables\n *\n * @param text The input string containing potential currency symbols\n * @returns The string with currency dollar signs escaped\n */\nexport function escapeCurrencyDollars(text: string): string {\n // Protect code blocks and existing LaTeX expressions from processing\n const manager = new PlaceholderManager('PROTECTED');\n\n let content = text.replaceAll(\n // Match patterns to protect (in order):\n // 1. Code blocks: ```...```\n // 2. Inline code: `...`\n // 3. Display math: $$...$$\n // 4. Inline math with LaTeX commands: $...\\...$ (must contain backslash to distinguish from currency)\n // 5. Simple number formulas: $1$, $10$, $100$ (pure digits in math mode)\n // 6. Number lists in math mode: $1,-1,0$ or $1,2,3$ (comma-separated numbers, possibly negative)\n // 7. LaTeX bracket notation: \\[...\\]\n // 8. LaTeX parenthesis notation: \\(...\\)\n /(```[\\s\\S]*?```|`[^\\n`]*`|\\$\\$[\\s\\S]*?\\$\\$|(?<!\\\\)\\$(?!\\$)(?=[\\s\\S]*?\\\\)[\\s\\S]*?(?<!\\\\)\\$(?!\\$)|\\$\\d+\\$|\\$-?\\d+(?:,-?\\d+)+\\$|\\\\\\[[\\s\\S]*?\\\\\\]|\\\\\\(.*?\\\\\\))/g,\n (match) => manager.add(match),\n );\n\n // Escape dollar signs that are clearly currency:\n // - $ followed by a digit\n // - Not preceded by another $ (to avoid breaking $$)\n // - Not followed immediately by another $ (to avoid breaking $1$ LaTeX)\n // - Followed by number patterns with optional commas, decimals, ranges, or plus signs\n // Match patterns like: $20, $1,000, $19.99, $20-50, $300+, $1,000-2,000+\n // But NOT: $1$, $2$ (these are LaTeX formulas)\n // In the replacement: \\\\ = backslash, $$ = literal $, $1 = capture group 1\n content = content.replaceAll(\n /(?<!\\$)\\$(\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?(?:-\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?)?\\+?)(?!\\$)/g,\n '\\\\$$$1',\n );\n\n // Restore protected content\n content = manager.restore(content);\n\n return content;\n}\n\n// Old simple preprocessLaTeX has been replaced by the comprehensive version below\n// The new preprocessLaTeX provides the same default behavior with optional advanced featuresgit\n\n/**\n * Extracts the LaTeX formula after the last $$ delimiter if there's an odd number of $$ delimiters.\n *\n * @param text The input string containing LaTeX formulas\n * @returns The content after the last $$ if there's an odd number of $$, otherwise an empty string\n */\nconst extractIncompleteFormula = (text: string) => {\n // Count the number of $$ delimiters\n const dollarsCount = (text.match(/\\$\\$/g) || []).length;\n\n // If odd number of $$ delimiters, extract content after the last $$\n if (dollarsCount % 2 === 1) {\n const match = text.match(/\\$\\$([\\s\\S]*)$/);\n return match ? match[1] : '';\n }\n\n // If even number of $$ delimiters, return empty string\n return '';\n};\n\n/**\n * Checks if the last LaTeX formula in the text is renderable.\n * Only validates the formula after the last $$ if there's an odd number of $$.\n *\n * @param text The input string containing LaTeX formulas\n * @returns True if the last formula is renderable or if there's no incomplete formula\n */\nexport const isLastFormulaRenderable = (text: string) => {\n const formula = extractIncompleteFormula(text);\n\n // If no incomplete formula, return true\n if (!formula) return true;\n\n // Try to render the last formula\n try {\n renderToString(formula, {\n displayMode: true,\n throwOnError: true,\n });\n return true;\n } catch (error) {\n console.error(`LaTeX formula rendering error: ${error}`);\n return false;\n }\n};\n\n// ============================================================================\n// Advanced Preprocessing Functions\n// ============================================================================\n\n/**\n * Fixes common LaTeX syntax errors automatically\n * - Balances unmatched braces\n * - Balances \\left and \\right delimiters\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with fixed LaTeX expressions\n */\nexport function fixCommonLaTeXErrors(text: string): string {\n return text.replaceAll(/(\\$\\$[\\s\\S]*?\\$\\$|\\$[\\s\\S]*?\\$)/g, (match) => {\n let fixed = match;\n\n // Fix unbalanced braces\n const openBraces = (fixed.match(/(?<!\\\\)\\{/g) || []).length;\n const closeBraces = (fixed.match(/(?<!\\\\)\\}/g) || []).length;\n if (openBraces > closeBraces) {\n const diff = openBraces - closeBraces;\n const closingBraces = '}'.repeat(diff);\n // Insert before the closing delimiter\n fixed = fixed.replace(/(\\$\\$?)$/, closingBraces + '$1');\n }\n\n // Fix unbalanced \\left and \\right\n const leftDelims = (fixed.match(/\\\\left[(.<[{|]/g) || []).length;\n const rightDelims = (fixed.match(/\\\\right[).>\\]|}]/g) || []).length;\n if (leftDelims > rightDelims) {\n const diff = leftDelims - rightDelims;\n const rightDots = '\\\\right.'.repeat(diff);\n fixed = fixed.replace(/(\\$\\$?)$/, rightDots + '$1');\n }\n\n return fixed;\n });\n}\n\n/**\n * Normalizes whitespace in LaTeX expressions\n * - Removes extra spaces around $ delimiters\n * - Normalizes multiple spaces to single space inside formulas\n *\n * @param text The input string containing LaTeX expressions\n * @returns The string with normalized whitespace\n */\nexport function normalizeLatexSpacing(text: string): string {\n let result = text;\n\n // Remove spaces inside $ delimiters (at the edges)\n result = result.replaceAll(/\\$\\s+/g, '$');\n result = result.replaceAll(/\\s+\\$/g, '$');\n result = result.replaceAll(/\\$\\$\\s+/g, '$$');\n result = result.replaceAll(/\\s+\\$\\$/g, '$$');\n\n // Normalize multiple spaces inside formulas to single space\n result = result.replaceAll(/(\\$\\$[\\s\\S]*?\\$\\$|\\$[\\s\\S]*?\\$)/g, (match) => {\n return match.replaceAll(/\\s{2,}/g, ' ');\n });\n\n return result;\n}\n\n/**\n * Validates all LaTeX expressions in the text\n * Returns detailed information about validation results\n *\n * @param text The input string containing LaTeX expressions\n * @returns Validation results with errors if any\n */\nexport function validateLatexExpressions(text: string): {\n errors: Array<{\n formula: string;\n message: string;\n position: number;\n type: 'display' | 'inline';\n }>;\n totalExpressions: number;\n valid: boolean;\n} {\n const errors: Array<{\n formula: string;\n message: string;\n position: number;\n type: 'display' | 'inline';\n }> = [];\n\n let totalExpressions = 0;\n const pattern = /\\$\\$([\\s\\S]*?)\\$\\$|(?<!\\\\)\\$(?!\\$)([\\s\\S]*?)(?<!\\\\)\\$(?!\\$)/g;\n let match;\n\n while ((match = pattern.exec(text)) !== null) {\n totalExpressions++;\n const formula = match[1] || match[2];\n const isDisplay = match[0].startsWith('$$');\n\n try {\n renderToString(formula, {\n displayMode: isDisplay,\n strict: 'warn',\n throwOnError: true,\n trust: false,\n });\n } catch (error) {\n errors.push({\n formula: formula.slice(0, 50) + (formula.length > 50 ? '...' : ''),\n message: error instanceof Error ? error.message : String(error),\n position: match.index,\n type: isDisplay ? 'display' : 'inline',\n });\n }\n }\n\n return {\n errors,\n totalExpressions,\n valid: errors.length === 0,\n };\n}\n\n/**\n * Handles CJK (Chinese, Japanese, Korean) characters mixed with LaTeX\n * Optionally adds spaces between CJK characters and LaTeX expressions for better rendering\n *\n * @param text The input string\n * @param addSpaces Whether to add spaces between CJK and LaTeX (default: false)\n * @returns The processed string\n */\nexport function handleCJKWithLatex(text: string, addSpaces = false): string {\n if (!addSpaces) return text;\n\n let result = text;\n\n // Add space between CJK character and opening $\n result = result.replaceAll(/([\\u3040-\\u30FF\\u4E00-\\u9FA5])(\\$)/g, '$1 $2');\n\n // Add space between closing $ and CJK character\n result = result.replaceAll(/(\\$)([\\u3040-\\u30FF\\u4E00-\\u9FA5])/g, '$1 $2');\n\n return result;\n}\n\n// ============================================================================\n// Advanced Preprocessing Options\n// ============================================================================\n\nexport interface AdvancedPreprocessOptions {\n /** Add spaces between CJK and LaTeX (default: false, requires handleCJK: true) */\n addCJKSpaces?: boolean;\n /** Convert bracket notation \\[...\\] to $$...$$ (default: true) */\n convertBrackets?: boolean;\n /** Enable currency escaping (default: true) */\n escapeCurrency?: boolean;\n /** Escape mhchem commands (default: true) */\n escapeMhchem?: boolean;\n /** Escape pipe symbols in LaTeX (default: true) */\n escapePipes?: boolean;\n /** Escape underscores in \\text{} (default: true) */\n escapeUnderscores?: boolean;\n /** Automatically fix common LaTeX errors (default: false) */\n fixErrors?: boolean;\n /** Handle CJK characters (default: false) */\n handleCJK?: boolean;\n /** Normalize whitespace (default: false) */\n normalizeSpacing?: boolean;\n /** Throw error on validation failure (default: false, requires validate: true) */\n throwOnValidationError?: boolean;\n /** Validate LaTeX syntax (default: false) */\n validate?: boolean;\n}\n\n/**\n * Comprehensive LaTeX preprocessing with configurable options\n *\n * This is the main preprocessing function that handles:\n * - Currency symbol escaping (e.g., $20 → \\$20)\n * - LaTeX delimiter conversion (\\[...\\] → $$...$$)\n * - Special character escaping (pipes, underscores, mhchem)\n * - Optional error fixing and validation\n * - Optional CJK character handling\n *\n * @param text The input string containing LaTeX and Markdown\n * @param options Configuration options for fine-grained control\n * @returns The preprocessed string\n *\n * @example\n * ```ts\n * // Default behavior (same as old preprocessLaTeX)\n * preprocessLaTeX('向量$90^\\\\circ$,非 $0^\\\\circ$ 和 $180^\\\\circ$')\n *\n * // With custom options\n * preprocessLaTeX(text, {\n * fixErrors: true,\n * validate: true,\n * handleCJK: true\n * })\n * ```\n */\nexport function preprocessLaTeX(text: string, options: AdvancedPreprocessOptions = {}): string {\n const {\n addCJKSpaces = false,\n convertBrackets = true,\n escapeCurrency = true,\n escapeMhchem = true,\n escapePipes = true,\n escapeUnderscores = true,\n fixErrors = false,\n handleCJK = false,\n normalizeSpacing = false,\n throwOnValidationError = false,\n validate = false,\n } = options;\n\n let content = text;\n\n // Phase 1: Currency escaping (if enabled)\n if (escapeCurrency) {\n content = escapeCurrencyDollars(content);\n }\n\n // Phase 2: Bracket conversion (if enabled)\n if (convertBrackets) {\n content = convertLatexDelimiters(content);\n }\n\n // Phase 3: LaTeX-specific escaping\n if (escapeMhchem) {\n content = escapeMhchemCommands(content);\n }\n\n if (escapePipes) {\n content = escapeLatexPipes(content);\n }\n\n if (escapeUnderscores) {\n content = escapeTextUnderscores(content);\n }\n\n // Phase 4: Error fixing (if enabled)\n if (fixErrors) {\n content = fixCommonLaTeXErrors(content);\n }\n\n // Phase 5: Whitespace normalization (if enabled)\n if (normalizeSpacing) {\n content = normalizeLatexSpacing(content);\n }\n\n // Phase 6: CJK handling (if enabled)\n if (handleCJK) {\n content = handleCJKWithLatex(content, addCJKSpaces);\n }\n\n // Phase 7: Validation (if enabled)\n if (validate) {\n const validation = validateLatexExpressions(content);\n if (!validation.valid) {\n const errorMessage = `LaTeX validation failed (${validation.errors.length}/${validation.totalExpressions} expressions have errors):\\n${validation.errors.map((e) => ` - [${e.type}] at position ${e.position}: ${e.message}\\n Formula: ${e.formula}`).join('\\n')}`;\n\n if (throwOnValidationError) {\n throw new Error(errorMessage);\n } else {\n console.warn(errorMessage);\n }\n }\n }\n\n return content;\n}\n\n/**\n * Strict preprocessing mode - enables all safety features and validations\n * Use this when you want maximum correctness and are willing to accept the performance cost\n *\n * @param text The input string\n * @returns The preprocessed string with all features enabled\n *\n * @example\n * ```ts\n * const processed = preprocessLaTeXStrict(userInput)\n * // Enables: error fixing, validation, CJK handling, space normalization\n * ```\n */\nexport function preprocessLaTeXStrict(text: string): string {\n return preprocessLaTeX(text, {\n addCJKSpaces: false, // Usually don't want extra spaces\n convertBrackets: true,\n escapeCurrency: true,\n escapeMhchem: true,\n escapePipes: true,\n escapeUnderscores: true,\n fixErrors: true,\n handleCJK: true,\n normalizeSpacing: true,\n throwOnValidationError: false, // Warn but don't throw\n validate: true,\n });\n}\n\n/**\n * Minimal preprocessing mode - only essential operations\n * Use this for better performance when you control the input\n *\n * @param text The input string\n * @returns The preprocessed string with minimal processing\n *\n * @example\n * ```ts\n * const processed = preprocessLaTeXMinimal(trustedInput)\n * // Only escapes currency and converts brackets\n * ```\n */\nexport function preprocessLaTeXMinimal(text: string): string {\n return preprocessLaTeX(text, {\n convertBrackets: true,\n escapeCurrency: true,\n escapeMhchem: false,\n escapePipes: false,\n escapeUnderscores: false,\n fixErrors: false,\n handleCJK: false,\n normalizeSpacing: false,\n validate: false,\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMarkdownContent.mjs","names":[],"sources":["../../../src/hooks/useMarkdown/useMarkdownContent.ts"],"sourcesContent":["'use client';\n\nimport { useMemo, useRef, useState } from 'react';\n\nimport { useMarkdownContext } from '@/Markdown/components/MarkdownProvider';\n\nimport { isLastFormulaRenderable } from './latex';\nimport { addToCache, contentCache, preprocessMarkdownContent } from './utils';\n\nexport const useMarkdownContent = (children: string): string | undefined => {\n const { animated, enableLatex = true, enableCustomFootnotes, citations } = useMarkdownContext();\n const [validContent, setValidContent] = useState<string>('');\n const prevProcessedContent = useRef<string>('');\n\n const citationsLength = citations?.length || 0;\n\n // Calculate cache key with fewer string concatenations and better performance\n const cacheKey = useMemo(\n () => `${children}|${enableLatex ? 1 : 0}|${enableCustomFootnotes ? 1 : 0}|${citationsLength}`,\n [children, enableLatex, enableCustomFootnotes, citationsLength],\n );\n\n // Process content and use cache to avoid repeated calculations\n return useMemo(() => {\n // Try to get from cache first for best performance\n if (contentCache.has(cacheKey)) {\n return contentCache.get(cacheKey);\n }\n\n // Process new content only if needed\n let processedContent = preprocessMarkdownContent(children, {\n citationsLength,\n enableCustomFootnotes,\n enableLatex,\n });\n\n // Special handling for LaTeX content when animated\n if (animated && enableLatex) {\n const isRenderable = isLastFormulaRenderable(processedContent);\n if (!isRenderable && validContent) {\n processedContent = validContent;\n }\n }\n\n // Only update state if content changed (prevents unnecessary re-renders)\n if (processedContent !== prevProcessedContent.current) {\n setValidContent(processedContent);\n prevProcessedContent.current = processedContent;\n }\n\n // Cache the processed result\n addToCache(cacheKey, processedContent);\n return processedContent;\n }, [\n cacheKey,\n children,\n enableLatex,\n enableCustomFootnotes,\n citationsLength,\n animated,\n validContent,\n ]);\n};\n"],"mappings":";;;;;;AASA,MAAa,sBAAsB,aAAyC;CAC1E,MAAM,EAAE,UAAU,cAAc,MAAM,uBAAuB,cAAc,mBAAmB;CAC9F,MAAM,CAAC,cAAc,mBAAmB,SAAiB,EAAE;CAC3D,MAAM,uBAAuB,OAAe,EAAE;CAE9C,MAAM,kBAAkB,WAAW,UAAU;CAG7C,MAAM,WAAW,cACT,GAAG,SAAS,GAAG,cAAc,IAAI,EAAE,GAAG,wBAAwB,IAAI,EAAE,GAAG,mBAC7E;EAAC;EAAU;EAAa;EAAuB;CAAe,CAChE;CAGA,OAAO,cAAc;EAEnB,IAAI,aAAa,IAAI,QAAQ,GAC3B,OAAO,aAAa,IAAI,QAAQ;EAIlC,IAAI,mBAAmB,0BAA0B,UAAU;GACzD;GACA;GACA;EACF,CAAC;EAGD,IAAI,YAAY;OAEV,CADiB,wBAAwB,gBAC7B,KAAK,cACnB,mBAAmB;EAAA;EAKvB,IAAI,qBAAqB,qBAAqB,SAAS;GACrD,gBAAgB,gBAAgB;GAChC,qBAAqB,UAAU;EACjC;EAGA,WAAW,UAAU,gBAAgB;EACrC,OAAO;CACT,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"useMarkdownContent.mjs","names":[],"sources":["../../../src/hooks/useMarkdown/useMarkdownContent.ts"],"sourcesContent":["'use client';\n\nimport { useMemo, useRef, useState } from 'react';\n\nimport { useMarkdownContext } from '@/Markdown/components/MarkdownProvider';\n\nimport { isLastFormulaRenderable } from './latex';\nimport { addToCache, contentCache, preprocessMarkdownContent } from './utils';\n\nexport const useMarkdownContent = (children: string): string | undefined => {\n const { animated, enableLatex = true, enableCustomFootnotes, citations } = useMarkdownContext();\n const [validContent, setValidContent] = useState<string>('');\n const prevProcessedContent = useRef<string>('');\n\n const citationsLength = citations?.length || 0;\n\n // Calculate cache key with fewer string concatenations and better performance\n const cacheKey = useMemo(\n () => `${children}|${enableLatex ? 1 : 0}|${enableCustomFootnotes ? 1 : 0}|${citationsLength}`,\n [children, enableLatex, enableCustomFootnotes, citationsLength],\n );\n\n // Process content and use cache to avoid repeated calculations\n return useMemo(() => {\n // Try to get from cache first for best performance\n if (contentCache.has(cacheKey)) {\n return contentCache.get(cacheKey);\n }\n\n // Process new content only if needed\n let processedContent = preprocessMarkdownContent(children, {\n citationsLength,\n enableCustomFootnotes,\n enableLatex,\n });\n\n // Special handling for LaTeX content when animated\n if (animated && enableLatex) {\n const isRenderable = isLastFormulaRenderable(processedContent);\n if (!isRenderable && validContent) {\n processedContent = validContent;\n }\n }\n\n // Only update state if content changed (prevents unnecessary re-renders)\n if (processedContent !== prevProcessedContent.current) {\n setValidContent(processedContent);\n prevProcessedContent.current = processedContent;\n }\n\n // Cache the processed result\n addToCache(cacheKey, processedContent);\n return processedContent;\n }, [\n cacheKey,\n children,\n enableLatex,\n enableCustomFootnotes,\n citationsLength,\n animated,\n validContent,\n ]);\n};\n"],"mappings":";;;;;;AASA,MAAa,sBAAsB,aAAyC;CAC1E,MAAM,EAAE,UAAU,cAAc,MAAM,uBAAuB,cAAc,mBAAmB;CAC9F,MAAM,CAAC,cAAc,mBAAmB,SAAiB,EAAE;CAC3D,MAAM,uBAAuB,OAAe,EAAE;CAE9C,MAAM,kBAAkB,WAAW,UAAU;CAG7C,MAAM,WAAW,cACT,GAAG,SAAS,GAAG,cAAc,IAAI,EAAE,GAAG,wBAAwB,IAAI,EAAE,GAAG,mBAC7E;EAAC;EAAU;EAAa;EAAuB;CAAe,CAChE;CAGA,OAAO,cAAc;EAEnB,IAAI,aAAa,IAAI,QAAQ,GAC3B,OAAO,aAAa,IAAI,QAAQ;EAIlC,IAAI,mBAAmB,0BAA0B,UAAU;GACzD;GACA;GACA;EACF,CAAC;EAGD,IAAI,YAAY,aAEV;OAAA,CADiB,wBAAwB,gBAC7B,KAAK,cACnB,mBAAmB;EAAA;EAKvB,IAAI,qBAAqB,qBAAqB,SAAS;GACrD,gBAAgB,gBAAgB;GAChC,qBAAqB,UAAU;EACjC;EAGA,WAAW,UAAU,gBAAgB;EACrC,OAAO;CACT,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH"}