@lobehub/ui 5.23.5 → 5.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/es/A/index.mjs +2 -1
  2. package/es/A/index.mjs.map +1 -1
  3. package/es/Accordion/Accordion.mjs.map +1 -1
  4. package/es/Accordion/AccordionItem.mjs +0 -1
  5. package/es/Accordion/AccordionItem.mjs.map +1 -1
  6. package/es/Accordion/ArrowIcon.mjs.map +1 -1
  7. package/es/ActionIcon/ActionIcon.mjs.map +1 -1
  8. package/es/ActionIcon/components/utils.mjs +7 -9
  9. package/es/ActionIcon/components/utils.mjs.map +1 -1
  10. package/es/ActionIconGroup/ActionIconGroup.mjs.map +1 -1
  11. package/es/Alert/Alert.mjs.map +1 -1
  12. package/es/Avatar/Avatar.mjs.map +1 -1
  13. package/es/Avatar/AvatarGroup/index.mjs.map +1 -1
  14. package/es/Burger/Burger.mjs.map +1 -1
  15. package/es/Checkbox/Checkbox.mjs.map +1 -1
  16. package/es/Checkbox/CheckboxGroup.mjs +4 -2
  17. package/es/Checkbox/CheckboxGroup.mjs.map +1 -1
  18. package/es/CodeDiff/CodeDiff.mjs +20 -18
  19. package/es/CodeDiff/CodeDiff.mjs.map +1 -1
  20. package/es/CodeDiff/DiffPanel.mjs.map +1 -1
  21. package/es/CodeDiff/PatchDiff.mjs +18 -16
  22. package/es/CodeDiff/PatchDiff.mjs.map +1 -1
  23. package/es/CodeEditor/CodeEditor.mjs.map +1 -1
  24. package/es/Collapse/Collapse.mjs.map +1 -1
  25. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  26. package/es/ConfigProvider/index.mjs.map +1 -1
  27. package/es/ContextMenu/index.d.mts +2 -2
  28. package/es/ContextMenu/index.mjs +2 -2
  29. package/es/CopyButton/CopyButton.mjs +2 -1
  30. package/es/CopyButton/CopyButton.mjs.map +1 -1
  31. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
  32. package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
  33. package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
  34. package/es/Drawer/Drawer.mjs.map +1 -1
  35. package/es/Dropdown/Dropdown.mjs.map +1 -1
  36. package/es/EditableText/ControlInput.mjs.map +1 -1
  37. package/es/EditableText/EditableText.mjs.map +1 -1
  38. package/es/EditorSlashMenu/EditorSlashMenu.mjs.map +1 -1
  39. package/es/EditorSlashMenu/MenuItemRenderer.mjs.map +1 -1
  40. package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
  41. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  42. package/es/Empty/Empty.mjs.map +1 -1
  43. package/es/FileTypeIcon/FileTypeIcon.mjs.map +1 -1
  44. package/es/FileTypeIcon/components/FileIcon.mjs.map +1 -1
  45. package/es/FileTypeIcon/components/FolderIcon.mjs.map +1 -1
  46. package/es/FluentEmoji/FluentEmoji.mjs.map +1 -1
  47. package/es/Footer/Footer.mjs.map +1 -1
  48. package/es/Form/Form.mjs.map +1 -1
  49. package/es/Form/components/FormGroup.mjs.map +1 -1
  50. package/es/Form/components/FormSubmitFooter.mjs.map +1 -1
  51. package/es/Form/components/FormTitle.mjs.map +1 -1
  52. package/es/FormModal/FormModal.mjs.map +1 -1
  53. package/es/Freeze/Freeze.mjs.map +1 -1
  54. package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
  55. package/es/GuideCard/GuideCard.mjs.map +1 -1
  56. package/es/Header/Header.mjs.map +1 -1
  57. package/es/Highlighter/FullFeatured.mjs.map +1 -1
  58. package/es/Highlighter/Highlighter.mjs.map +1 -1
  59. package/es/Highlighter/LangSelect.mjs +41 -40
  60. package/es/Highlighter/LangSelect.mjs.map +1 -1
  61. package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs +2 -1
  62. package/es/Highlighter/SyntaxHighlighter/StaticRenderer.mjs.map +1 -1
  63. package/es/Highlighter/SyntaxHighlighter/StreamRenderer.mjs.map +1 -1
  64. package/es/Highlighter/SyntaxHighlighter/style.mjs +2 -2
  65. package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
  66. package/es/Hotkey/Hotkey.mjs.map +1 -1
  67. package/es/HotkeyInput/HotkeyInput.mjs +3 -1
  68. package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
  69. package/es/HtmlPreview/HtmlPreview.mjs.map +1 -1
  70. package/es/HtmlPreview/Iframe.mjs.map +1 -1
  71. package/es/HtmlPreview/const.mjs +1 -1
  72. package/es/HtmlPreview/const.mjs.map +1 -1
  73. package/es/Icon/Icon.mjs.map +1 -1
  74. package/es/Icon/components/utils.mjs +7 -9
  75. package/es/Icon/components/utils.mjs.map +1 -1
  76. package/es/Image/Image.mjs.map +1 -1
  77. package/es/Image/components/Toolbar.mjs +2 -1
  78. package/es/Image/components/Toolbar.mjs.map +1 -1
  79. package/es/Image/components/usePreview.mjs.map +1 -1
  80. package/es/Image/components/usePreviewGroup.mjs.map +1 -1
  81. package/es/ImageSelect/ImageSelect.mjs.map +1 -1
  82. package/es/Img/index.mjs +2 -1
  83. package/es/Img/index.mjs.map +1 -1
  84. package/es/Layout/Layout.mjs.map +1 -1
  85. package/es/List/List.mjs.map +1 -1
  86. package/es/List/ListItem/index.mjs.map +1 -1
  87. package/es/Markdown/Markdown.mjs.map +1 -1
  88. package/es/Markdown/SyntaxMarkdown/MarkdownRender.mjs.map +1 -1
  89. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs +2 -1
  90. package/es/Markdown/SyntaxMarkdown/StreamdownRender.mjs.map +1 -1
  91. package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
  92. package/es/Markdown/SyntaxMarkdown/useSmoothStreamContent.mjs +2 -2
  93. package/es/Markdown/SyntaxMarkdown/useSmoothStreamContent.mjs.map +1 -1
  94. package/es/Markdown/components/CodeBlock.mjs.map +1 -1
  95. package/es/Markdown/components/Footnotes.mjs.map +1 -1
  96. package/es/Markdown/components/MarkdownTable/index.mjs.map +1 -1
  97. package/es/Markdown/components/SearchResultCards/SearchResultCard.mjs.map +1 -1
  98. package/es/Markdown/components/SearchResultCards/index.mjs.map +1 -1
  99. package/es/MaterialFileTypeIcon/MaterialFileTypeIcon.mjs.map +1 -1
  100. package/es/Menu/Menu.mjs.map +1 -1
  101. package/es/Mermaid/FullFeatured.mjs.map +1 -1
  102. package/es/Mermaid/Mermaid.mjs.map +1 -1
  103. package/es/Mermaid/SyntaxMermaid/MermaidFallback.mjs +35 -0
  104. package/es/Mermaid/SyntaxMermaid/MermaidFallback.mjs.map +1 -0
  105. package/es/Mermaid/SyntaxMermaid/MermaidSvg.mjs +52 -0
  106. package/es/Mermaid/SyntaxMermaid/MermaidSvg.mjs.map +1 -0
  107. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs +13 -42
  108. package/es/Mermaid/SyntaxMermaid/StaticMermaid.mjs.map +1 -1
  109. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs +13 -43
  110. package/es/Mermaid/SyntaxMermaid/StreamMermaid.mjs.map +1 -1
  111. package/es/Mermaid/SyntaxMermaid/prepareInlineSvg.mjs +52 -0
  112. package/es/Mermaid/SyntaxMermaid/prepareInlineSvg.mjs.map +1 -0
  113. package/es/Mermaid/SyntaxMermaid/prepareMermaidSvg.mjs +20 -0
  114. package/es/Mermaid/SyntaxMermaid/prepareMermaidSvg.mjs.map +1 -0
  115. package/es/Mermaid/SyntaxMermaid/style.mjs +11 -0
  116. package/es/Mermaid/SyntaxMermaid/style.mjs.map +1 -1
  117. package/es/Mermaid/const.mjs +10 -31
  118. package/es/Mermaid/const.mjs.map +1 -1
  119. package/es/Mermaid/index.d.mts +2 -1
  120. package/es/Mermaid/index.mjs +2 -1
  121. package/es/Mermaid/type.d.mts +2 -2
  122. package/es/Modal/Modal.mjs.map +1 -1
  123. package/es/Modal/ModalStackItem.mjs.map +1 -1
  124. package/es/Modal/RawModalStackItem.mjs +6 -5
  125. package/es/Modal/RawModalStackItem.mjs.map +1 -1
  126. package/es/Modal/imperative.mjs +4 -2
  127. package/es/Modal/imperative.mjs.map +1 -1
  128. package/es/Modal/style.mjs.map +1 -1
  129. package/es/NeuralNetworkLoading/NeuralNetworkLoading.mjs +1 -1
  130. package/es/NeuralNetworkLoading/NeuralNetworkLoading.mjs.map +1 -1
  131. package/es/ScrollShadow/ScrollShadow.mjs +13 -12
  132. package/es/ScrollShadow/ScrollShadow.mjs.map +1 -1
  133. package/es/SearchBar/SearchBar.mjs.map +1 -1
  134. package/es/SideNav/SideNav.mjs.map +1 -1
  135. package/es/Skeleton/Skeleton.mjs.map +1 -1
  136. package/es/Skeleton/SkeletonButton.mjs +2 -1
  137. package/es/Skeleton/SkeletonButton.mjs.map +1 -1
  138. package/es/Skeleton/SkeletonParagraph.mjs.map +1 -1
  139. package/es/Skeleton/SkeletonTags.mjs.map +1 -1
  140. package/es/SliderWithInput/SliderWithInput.mjs.map +1 -1
  141. package/es/Snippet/Snippet.mjs.map +1 -1
  142. package/es/SortableList/SortableList.mjs +5 -1
  143. package/es/SortableList/SortableList.mjs.map +1 -1
  144. package/es/SortableList/components/SortableItem.mjs.map +1 -1
  145. package/es/Text/Text.mjs +22 -21
  146. package/es/Text/Text.mjs.map +1 -1
  147. package/es/ThemeProvider/ThemeProvider.mjs +4 -3
  148. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
  149. package/es/ThemeSwitch/ThemeSwitch.mjs.map +1 -1
  150. package/es/Toc/Toc.mjs.map +1 -1
  151. package/es/Toc/TocMobile.mjs.map +1 -1
  152. package/es/Video/index.mjs.map +1 -1
  153. package/es/awesome/AuroraBackground/AuroraBackground.mjs.map +1 -1
  154. package/es/awesome/Features/FeatureItem.mjs.map +1 -1
  155. package/es/awesome/Giscus/Giscus.mjs.map +1 -1
  156. package/es/awesome/GradientButton/GradientButton.mjs +1 -3
  157. package/es/awesome/GradientButton/GradientButton.mjs.map +1 -1
  158. package/es/awesome/GridBackground/GridBackground.mjs.map +1 -1
  159. package/es/awesome/GridBackground/GridShowcase.mjs.map +1 -1
  160. package/es/awesome/GridBackground/components/Grid.mjs.map +1 -1
  161. package/es/awesome/Hero/Hero.mjs.map +1 -1
  162. package/es/awesome/Spline/ParentSize.mjs.map +1 -1
  163. package/es/awesome/Spline/Spine.mjs.map +1 -1
  164. package/es/awesome/Spotlight/Spotlight.mjs +2 -1
  165. package/es/awesome/Spotlight/Spotlight.mjs.map +1 -1
  166. package/es/awesome/SpotlightCard/SpotlightCard.mjs.map +1 -1
  167. package/es/awesome/SpotlightCard/SpotlightCardItem.mjs.map +1 -1
  168. package/es/awesome/TypewriterEffect/TypewriterEffect.mjs.map +1 -1
  169. package/es/base-ui/AutoComplete/AutoComplete.mjs.map +1 -1
  170. package/es/base-ui/Button/Button.mjs +13 -11
  171. package/es/base-ui/Button/Button.mjs.map +1 -1
  172. package/es/base-ui/Button/SplitButton.mjs +2 -1
  173. package/es/base-ui/Button/SplitButton.mjs.map +1 -1
  174. package/es/base-ui/Checkbox/Checkbox.mjs.map +1 -1
  175. package/es/base-ui/Checkbox/CheckboxGroup.mjs.map +1 -1
  176. package/es/base-ui/ContextMenu/ContextMenuHost.mjs.map +1 -1
  177. package/es/base-ui/ContextMenu/ContextMenuTrigger.mjs +2 -1
  178. package/es/base-ui/ContextMenu/ContextMenuTrigger.mjs.map +1 -1
  179. package/es/base-ui/ContextMenu/imperative.d.mts +2 -2
  180. package/es/base-ui/ContextMenu/index.d.mts +2 -2
  181. package/es/base-ui/ContextMenu/renderItems.mjs +2 -1
  182. package/es/base-ui/ContextMenu/renderItems.mjs.map +1 -1
  183. package/es/base-ui/ContextMenu/store.d.mts +13 -1
  184. package/es/base-ui/ContextMenu/store.mjs +29 -4
  185. package/es/base-ui/ContextMenu/store.mjs.map +1 -1
  186. package/es/base-ui/Drawer/Drawer.d.mts +6 -0
  187. package/es/base-ui/Drawer/Drawer.mjs +152 -0
  188. package/es/base-ui/Drawer/Drawer.mjs.map +1 -0
  189. package/es/base-ui/Drawer/DrawerLayerContext.mjs +10 -0
  190. package/es/base-ui/Drawer/DrawerLayerContext.mjs.map +1 -0
  191. package/es/base-ui/Drawer/DrawerPushContext.mjs +27 -0
  192. package/es/base-ui/Drawer/DrawerPushContext.mjs.map +1 -0
  193. package/es/base-ui/Drawer/atoms.d.mts +58 -0
  194. package/es/base-ui/Drawer/atoms.mjs +262 -0
  195. package/es/base-ui/Drawer/atoms.mjs.map +1 -0
  196. package/es/base-ui/Drawer/constants.d.mts +17 -0
  197. package/es/base-ui/Drawer/constants.mjs +72 -0
  198. package/es/base-ui/Drawer/constants.mjs.map +1 -0
  199. package/es/base-ui/Drawer/index.d.mts +5 -0
  200. package/es/base-ui/Drawer/style.mjs +295 -0
  201. package/es/base-ui/Drawer/style.mjs.map +1 -0
  202. package/es/base-ui/Drawer/type.d.mts +65 -0
  203. package/es/base-ui/DropdownMenu/DropdownMenu.mjs +2 -1
  204. package/es/base-ui/DropdownMenu/DropdownMenu.mjs.map +1 -1
  205. package/es/base-ui/DropdownMenu/atoms.mjs +2 -1
  206. package/es/base-ui/DropdownMenu/atoms.mjs.map +1 -1
  207. package/es/base-ui/DropdownMenu/renderItems.mjs +2 -1
  208. package/es/base-ui/DropdownMenu/renderItems.mjs.map +1 -1
  209. package/es/base-ui/DropdownMenu/sharedStyle.mjs +3 -0
  210. package/es/base-ui/DropdownMenu/sharedStyle.mjs.map +1 -1
  211. package/es/base-ui/FloatingPanel/FloatingPanel.mjs.map +1 -1
  212. package/es/base-ui/FloatingSheet/FloatingSheet.mjs +4 -1
  213. package/es/base-ui/FloatingSheet/FloatingSheet.mjs.map +1 -1
  214. package/es/base-ui/FloatingSheet/FloatingSheetHeader.mjs.map +1 -1
  215. package/es/base-ui/Form/Form.mjs.map +1 -1
  216. package/es/base-ui/Form/components/FormField.mjs.map +1 -1
  217. package/es/base-ui/Form/components/FormGroup.mjs.map +1 -1
  218. package/es/base-ui/Form/components/FormSubmitFooter.mjs.map +1 -1
  219. package/es/base-ui/Form/components/FormTitle.mjs.map +1 -1
  220. package/es/base-ui/Input/Input.mjs.map +1 -1
  221. package/es/base-ui/Input/InputNumber.mjs.map +1 -1
  222. package/es/base-ui/Input/InputOTP.mjs.map +1 -1
  223. package/es/base-ui/Input/InputPassword.mjs.map +1 -1
  224. package/es/base-ui/Input/TextArea.mjs.map +1 -1
  225. package/es/base-ui/Modal/Modal.mjs.map +1 -1
  226. package/es/base-ui/Modal/atoms.mjs +7 -5
  227. package/es/base-ui/Modal/atoms.mjs.map +1 -1
  228. package/es/base-ui/Modal/imperative.mjs +2 -1
  229. package/es/base-ui/Modal/imperative.mjs.map +1 -1
  230. package/es/base-ui/Popover/ArrowIcon.mjs.map +1 -1
  231. package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
  232. package/es/base-ui/Popover/PopoverStandalone.mjs.map +1 -1
  233. package/es/base-ui/Popover/atoms.mjs +2 -1
  234. package/es/base-ui/Popover/atoms.mjs.map +1 -1
  235. package/es/base-ui/Popover/context.mjs +4 -2
  236. package/es/base-ui/Popover/context.mjs.map +1 -1
  237. package/es/base-ui/Radio/Radio.mjs.map +1 -1
  238. package/es/base-ui/Radio/RadioGroup.mjs.map +1 -1
  239. package/es/base-ui/ScrollArea/ScrollArea.mjs.map +1 -1
  240. package/es/base-ui/Segmented/Segmented.mjs.map +1 -1
  241. package/es/base-ui/Select/Select.mjs.map +1 -1
  242. package/es/base-ui/Select/atoms.mjs +2 -1
  243. package/es/base-ui/Select/atoms.mjs.map +1 -1
  244. package/es/base-ui/Select/parts.mjs.map +1 -1
  245. package/es/base-ui/Select/renderOptions.mjs.map +1 -1
  246. package/es/base-ui/Slider/Slider.mjs.map +1 -1
  247. package/es/base-ui/Slider/SliderWithInput.mjs.map +1 -1
  248. package/es/base-ui/SubmenuArrowIcon.mjs.map +1 -1
  249. package/es/base-ui/Switch/Switch.mjs.map +1 -1
  250. package/es/base-ui/Switch/atoms.d.mts +3 -3
  251. package/es/base-ui/Switch/atoms.mjs +99 -50
  252. package/es/base-ui/Switch/atoms.mjs.map +1 -1
  253. package/es/base-ui/Switch/style.mjs +44 -1
  254. package/es/base-ui/Switch/style.mjs.map +1 -1
  255. package/es/base-ui/Switch/type.d.mts +3 -7
  256. package/es/base-ui/Tabs/Tabs.mjs.map +1 -1
  257. package/es/base-ui/Tabs/atoms.mjs.map +1 -1
  258. package/es/base-ui/Toast/Toast.mjs.map +1 -1
  259. package/es/base-ui/Toast/imperative.mjs.map +1 -1
  260. package/es/base-ui/Tooltip/ArrowIcon.mjs.map +1 -1
  261. package/es/base-ui/Tooltip/TooltipGroup.mjs.map +1 -1
  262. package/es/base-ui/Tooltip/TooltipStandalone.mjs.map +1 -1
  263. package/es/base-ui/index.d.mts +7 -2
  264. package/es/base-ui/index.mjs +5 -2
  265. package/es/brand/LobeChat/index.mjs +0 -1
  266. package/es/brand/LobeChat/index.mjs.map +1 -1
  267. package/es/brand/LobeChatText/index.mjs.map +1 -1
  268. package/es/brand/LobeHub/index.mjs +0 -1
  269. package/es/brand/LobeHub/index.mjs.map +1 -1
  270. package/es/brand/LobeHubText/index.mjs.map +1 -1
  271. package/es/brand/Logo3d/index.mjs +2 -1
  272. package/es/brand/Logo3d/index.mjs.map +1 -1
  273. package/es/brand/LogoThree/Loading.mjs.map +1 -1
  274. package/es/brand/LogoThree/LogoSpline.mjs.map +1 -1
  275. package/es/brand/LogoThree/index.mjs.map +1 -1
  276. package/es/brand/components/Divider.mjs.map +1 -1
  277. package/es/chat/BackBottom/BackBottom.mjs.map +1 -1
  278. package/es/chat/ChatHeader/ChatHeader.mjs.map +1 -1
  279. package/es/chat/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  280. package/es/chat/ChatInputArea/ChatInputArea.mjs.map +1 -1
  281. package/es/chat/ChatInputArea/components/ChatInputActionBar.mjs.map +1 -1
  282. package/es/chat/ChatInputArea/components/ChatSendButton.mjs.map +1 -1
  283. package/es/chat/ChatItem/ChatItem.mjs.map +1 -1
  284. package/es/chat/ChatItem/components/Actions.mjs +5 -4
  285. package/es/chat/ChatItem/components/Actions.mjs.map +1 -1
  286. package/es/chat/ChatItem/components/Avatar.mjs.map +1 -1
  287. package/es/chat/ChatItem/components/ErrorContent.mjs.map +1 -1
  288. package/es/chat/ChatItem/components/Loading.mjs.map +1 -1
  289. package/es/chat/ChatItem/components/MessageContent.mjs.map +1 -1
  290. package/es/chat/ChatItem/components/Title.mjs.map +1 -1
  291. package/es/chat/ChatList/ChatList.mjs +2 -1
  292. package/es/chat/ChatList/ChatList.mjs.map +1 -1
  293. package/es/chat/ChatList/components/HistoryDivider.mjs.map +1 -1
  294. package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
  295. package/es/chat/EditableMessageList/EditableMessageList.mjs.map +1 -1
  296. package/es/chat/LoadingDots/LoadingDots.mjs.map +1 -1
  297. package/es/chat/MessageInput/MessageInput.mjs.map +1 -1
  298. package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
  299. package/es/color/ColorScales/ScaleRow.mjs +0 -2
  300. package/es/color/ColorScales/ScaleRow.mjs.map +1 -1
  301. package/es/color/ColorScales/index.mjs.map +1 -1
  302. package/es/color/CssVar/ScaleRow.mjs.map +1 -1
  303. package/es/color/CssVar/VarRow.mjs.map +1 -1
  304. package/es/color/CssVar/index.mjs.map +1 -1
  305. package/es/hooks/useMarkdown/latex.mjs.map +1 -1
  306. package/es/hooks/useMarkdown/useMarkdownContent.mjs.map +1 -1
  307. package/es/hooks/useMermaid.mjs +81 -116
  308. package/es/hooks/useMermaid.mjs.map +1 -1
  309. package/es/hooks/useMermaidCdn.d.mts +10 -0
  310. package/es/hooks/useMermaidCdn.mjs +97 -0
  311. package/es/hooks/useMermaidCdn.mjs.map +1 -0
  312. package/es/hooks/useStreamMermaid.mjs +19 -70
  313. package/es/hooks/useStreamMermaid.mjs.map +1 -1
  314. package/es/icons/Auth0/components/Mono.mjs.map +1 -1
  315. package/es/icons/Authelia/components/Color.mjs.map +1 -1
  316. package/es/icons/Authelia/components/Mono.mjs.map +1 -1
  317. package/es/icons/Authentik/components/Color.mjs.map +1 -1
  318. package/es/icons/Authentik/components/Mono.mjs.map +1 -1
  319. package/es/icons/Casdoor/components/Color.mjs.map +1 -1
  320. package/es/icons/Casdoor/components/Mono.mjs.map +1 -1
  321. package/es/icons/Clerk/components/Color.mjs.map +1 -1
  322. package/es/icons/Clerk/components/Mono.mjs.map +1 -1
  323. package/es/icons/DingTalk/components/Color.mjs.map +1 -1
  324. package/es/icons/DingTalk/components/Mono.mjs.map +1 -1
  325. package/es/icons/Discord/components/Color.mjs.map +1 -1
  326. package/es/icons/Discord/components/Mono.mjs.map +1 -1
  327. package/es/icons/GoogleChat/components/Color.mjs.map +1 -1
  328. package/es/icons/GoogleChat/components/Mono.mjs.map +1 -1
  329. package/es/icons/IMessage/components/Color.mjs.map +1 -1
  330. package/es/icons/IMessage/components/Inner.mjs.map +1 -1
  331. package/es/icons/IMessage/components/Mono.mjs.map +1 -1
  332. package/es/icons/Lark/components/Color.mjs.map +1 -1
  333. package/es/icons/Lark/components/Mono.mjs.map +1 -1
  334. package/es/icons/Line/components/Color.mjs.map +1 -1
  335. package/es/icons/Line/components/Mono.mjs.map +1 -1
  336. package/es/icons/Logto/components/Color.mjs.map +1 -1
  337. package/es/icons/Logto/components/Mono.mjs.map +1 -1
  338. package/es/icons/MicrosoftEntra/components/Color.mjs.map +1 -1
  339. package/es/icons/MicrosoftEntra/components/Mono.mjs.map +1 -1
  340. package/es/icons/MicrosoftTeams/components/Color.mjs.map +1 -1
  341. package/es/icons/MicrosoftTeams/components/Mono.mjs.map +1 -1
  342. package/es/icons/NextAuth/components/Color.mjs.map +1 -1
  343. package/es/icons/NextAuth/components/Mono.mjs.map +1 -1
  344. package/es/icons/QQ/components/Color.mjs.map +1 -1
  345. package/es/icons/QQ/components/Mono.mjs.map +1 -1
  346. package/es/icons/Slack/components/Color.mjs.map +1 -1
  347. package/es/icons/Slack/components/Mono.mjs.map +1 -1
  348. package/es/icons/Telegram/components/Color.mjs.map +1 -1
  349. package/es/icons/Telegram/components/Inner.mjs.map +1 -1
  350. package/es/icons/Telegram/components/Mono.mjs.map +1 -1
  351. package/es/icons/WeChat/components/Color.mjs.map +1 -1
  352. package/es/icons/WeChat/components/Mono.mjs.map +1 -1
  353. package/es/icons/WhatsApp/components/Color.mjs.map +1 -1
  354. package/es/icons/WhatsApp/components/Mono.mjs.map +1 -1
  355. package/es/icons/Zitadel/components/Color.mjs.map +1 -1
  356. package/es/icons/Zitadel/components/Mono.mjs.map +1 -1
  357. package/es/index.d.mts +2 -2
  358. package/es/index.mjs +2 -2
  359. package/es/mdx/Callout/index.mjs.map +1 -1
  360. package/es/mdx/Cards/Card.mjs.map +1 -1
  361. package/es/mdx/FileTree/File.mjs.map +1 -1
  362. package/es/mdx/FileTree/Folder.mjs.map +1 -1
  363. package/es/mdx/Mdx/index.mjs.map +1 -1
  364. package/es/mdx/Tabs/Tab.mjs.map +1 -1
  365. package/es/mdx/Tabs/index.mjs.map +1 -1
  366. package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
  367. package/es/mdx/mdxComponents/Citation/index.mjs.map +1 -1
  368. package/es/mdx/mdxComponents/CodeBlock.mjs.map +1 -1
  369. package/es/mdx/mdxComponents/Link.mjs.map +1 -1
  370. package/es/mobile/ChatHeader/ChatHeader.mjs.map +1 -1
  371. package/es/mobile/ChatHeader/ChatHeaderTitle.mjs.map +1 -1
  372. package/es/mobile/ChatInputArea/ChatInputArea.mjs.map +1 -1
  373. package/es/mobile/TabBar/TabBar.mjs.map +1 -1
  374. package/es/storybook/StoryBook/index.mjs.map +1 -1
  375. package/package.json +3 -4
@@ -1 +1 @@
1
- {"version":3,"file":"PatchDiff.mjs","names":["PatchDiff","PierrePatchDiff"],"sources":["../../src/CodeDiff/PatchDiff.tsx"],"sourcesContent":["'use client';\n\nimport type { FileDiffOptions } from '@pierre/diffs';\nimport { PatchDiff as PierrePatchDiff } from '@pierre/diffs/react';\nimport { useThemeMode } from 'antd-style';\nimport { memo, useMemo } from 'react';\n\nimport { DiffPanel } from './DiffPanel';\nimport { getLobeDiffOptions, registerLobeDiffThemes } from './theme';\nimport type { PatchDiffProps } from './type';\n\nregisterLobeDiffThemes();\n\nconst countPatchChanges = (patch: string): { additions: number; deletions: number } => {\n const lines = patch.split('\\n');\n let additions = 0;\n let deletions = 0;\n\n for (const line of lines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n additions++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletions++;\n }\n }\n\n return { additions, deletions };\n};\n\nexport const PatchDiff = memo<PatchDiffProps>(\n ({\n patch,\n language,\n fileName,\n viewMode = 'split',\n showHeader = true,\n defaultExpand = true,\n fullFeatured = true,\n variant = 'filled',\n className,\n classNames,\n styles: customStyles,\n actionsRender,\n diffOptions,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n\n const displayName = useMemo(() => {\n if (fileName) return fileName;\n // Try to extract filename from patch header\n const match = patch.match(/^(?:-{3}|\\+{3})\\s+(?:a\\/|b\\/)?(.+?)(?:\\t|$)/m);\n if (match?.[1]) return match[1];\n if (language) return language;\n return 'patch';\n }, [fileName, patch, language]);\n\n const { additions, deletions } = useMemo(() => countPatchChanges(patch), [patch]);\n\n const actions = useMemo(() => {\n if (!actionsRender) return null;\n return actionsRender({\n originalNode: null,\n patch,\n });\n }, [actionsRender, patch]);\n\n const options = useMemo<FileDiffOptions<string>>(\n () => getLobeDiffOptions({ diffOptions, isDarkMode, viewMode }),\n [isDarkMode, viewMode, diffOptions],\n );\n\n return (\n <DiffPanel\n actions={actions}\n additions={additions}\n body={<PierrePatchDiff options={options} patch={patch} />}\n className={className}\n classNames={classNames}\n dataCodeType=\"patch-diff\"\n defaultExpand={defaultExpand}\n deletions={deletions}\n displayName={displayName}\n fileName={fileName}\n fullFeatured={fullFeatured}\n showHeader={showHeader}\n styles={customStyles}\n variant={variant}\n {...rest}\n />\n );\n },\n);\n\nPatchDiff.displayName = 'PatchDiff';\n\nexport default PatchDiff;\n"],"mappings":";;;;;;;;AAWA,uBAAuB;AAEvB,MAAM,qBAAqB,UAA4D;CACrF,MAAM,QAAQ,MAAM,MAAM,IAAI;CAC9B,IAAI,YAAY;CAChB,IAAI,YAAY;CAEhB,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAChD;MACK,IAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GACvD;CAIJ,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,MAAaA,cAAY,MACtB,EACC,OACA,UACA,UACA,WAAW,SACX,aAAa,MACb,gBAAgB,MAChB,eAAe,MACf,UAAU,UACV,WACA,YACA,QAAQ,cACR,eACA,aACA,GAAG,WACC;CACJ,MAAM,EAAE,eAAe,aAAa;CAEpC,MAAM,cAAc,cAAc;EAChC,IAAI,UAAU,OAAO;EAErB,MAAM,QAAQ,MAAM,MAAM,8CAA8C;EACxE,IAAI,QAAQ,IAAI,OAAO,MAAM;EAC7B,IAAI,UAAU,OAAO;EACrB,OAAO;CACT,GAAG;EAAC;EAAU;EAAO;CAAQ,CAAC;CAE9B,MAAM,EAAE,WAAW,cAAc,cAAc,kBAAkB,KAAK,GAAG,CAAC,KAAK,CAAC;CAehF,OACE,oBAAC,WAAD;EACE,SAfY,cAAc;GAC5B,IAAI,CAAC,eAAe,OAAO;GAC3B,OAAO,cAAc;IACnB,cAAc;IACd;GACF,CAAC;EACH,GAAG,CAAC,eAAe,KAAK,CASL;EACJ;EACX,MAAM,oBAACC,WAAD;GAAiB,SATX,cACR,mBAAmB;IAAE;IAAa;IAAY;GAAS,CAAC,GAC9D;IAAC;IAAY;IAAU;GAAW,CAOM;GAAU;EAAQ,CAAA;EAC7C;EACC;EACZ,cAAa;EACE;EACJ;EACE;EACH;EACI;EACF;EACZ,QAAQ;EACC;EACT,GAAI;CACL,CAAA;AAEL,CACF;AAEA,YAAU,cAAc"}
1
+ {"version":3,"file":"PatchDiff.mjs","names":["PatchDiff","PierrePatchDiff"],"sources":["../../src/CodeDiff/PatchDiff.tsx"],"sourcesContent":["'use client';\n\nimport type { FileDiffOptions } from '@pierre/diffs';\nimport { PatchDiff as PierrePatchDiff } from '@pierre/diffs/react';\nimport { useThemeMode } from 'antd-style';\nimport { memo, useMemo } from 'react';\n\nimport { DiffPanel } from './DiffPanel';\nimport { getLobeDiffOptions, registerLobeDiffThemes } from './theme';\nimport type { PatchDiffProps } from './type';\n\nregisterLobeDiffThemes();\n\nconst countPatchChanges = (patch: string): { additions: number; deletions: number } => {\n const lines = patch.split('\\n');\n let additions = 0;\n let deletions = 0;\n\n for (const line of lines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n additions++;\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n deletions++;\n }\n }\n\n return { additions, deletions };\n};\n\nexport const PatchDiff = memo<PatchDiffProps>(\n ({\n patch,\n language,\n fileName,\n viewMode = 'split',\n showHeader = true,\n defaultExpand = true,\n fullFeatured = true,\n variant = 'filled',\n className,\n classNames,\n styles: customStyles,\n actionsRender,\n diffOptions,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n\n const displayName = useMemo(() => {\n if (fileName) return fileName;\n // Try to extract filename from patch header\n const match = patch.match(/^(?:-{3}|\\+{3})\\s+(?:a\\/|b\\/)?(.+?)(?:\\t|$)/m);\n if (match?.[1]) return match[1];\n if (language) return language;\n return 'patch';\n }, [fileName, patch, language]);\n\n const { additions, deletions } = useMemo(() => countPatchChanges(patch), [patch]);\n\n const actions = useMemo(() => {\n if (!actionsRender) return null;\n return actionsRender({\n originalNode: null,\n patch,\n });\n }, [actionsRender, patch]);\n\n const options = useMemo<FileDiffOptions<string>>(\n () => getLobeDiffOptions({ diffOptions, isDarkMode, viewMode }),\n [isDarkMode, viewMode, diffOptions],\n );\n\n return (\n <DiffPanel\n actions={actions}\n additions={additions}\n body={<PierrePatchDiff options={options} patch={patch} />}\n className={className}\n classNames={classNames}\n dataCodeType=\"patch-diff\"\n defaultExpand={defaultExpand}\n deletions={deletions}\n displayName={displayName}\n fileName={fileName}\n fullFeatured={fullFeatured}\n showHeader={showHeader}\n styles={customStyles}\n variant={variant}\n {...rest}\n />\n );\n },\n);\n\nPatchDiff.displayName = 'PatchDiff';\n\nexport default PatchDiff;\n"],"mappings":";;;;;;;;AAWA,uBAAuB;AAEvB,MAAM,qBAAqB,UAA4D;CACrF,MAAM,QAAQ,MAAM,MAAM,IAAI;CAC9B,IAAI,YAAY;CAChB,IAAI,YAAY;CAEhB,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAChD;MACK,IAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GACvD;CAIJ,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,MAAaA,cAAY,MACtB,EACC,OACA,UACA,UACA,WAAW,SACX,aAAa,MACb,gBAAgB,MAChB,eAAe,MACf,UAAU,UACV,WACA,YACA,QAAQ,cACR,eACA,aACA,GAAG,WACC;CACJ,MAAM,EAAE,eAAe,aAAa;CAEpC,MAAM,cAAc,cAAc;EAChC,IAAI,UAAU,OAAO;EAErB,MAAM,QAAQ,MAAM,MAAM,8CAA8C;EACxE,IAAI,QAAQ,IAAI,OAAO,MAAM;EAC7B,IAAI,UAAU,OAAO;EACrB,OAAO;CACT,GAAG;EAAC;EAAU;EAAO;CAAQ,CAAC;CAE9B,MAAM,EAAE,WAAW,cAAc,cAAc,kBAAkB,KAAK,GAAG,CAAC,KAAK,CAAC;CAEhF,MAAM,UAAU,cAAc;EAC5B,IAAI,CAAC,eAAe,OAAO;EAC3B,OAAO,cAAc;GACnB,cAAc;GACd;EACF,CAAC;CACH,GAAG,CAAC,eAAe,KAAK,CAAC;CAEzB,MAAM,UAAU,cACR,mBAAmB;EAAE;EAAa;EAAY;CAAS,CAAC,GAC9D;EAAC;EAAY;EAAU;CAAW,CACpC;CAEA,OACE,oBAAC,WAAD;EACW;EACE;EACX,MAAM,oBAACC,WAAD;GAA0B;GAAgB;EAAQ,CAAA;EAC7C;EACC;EACZ,cAAa;EACE;EACJ;EACE;EACH;EACI;EACF;EACZ,QAAQ;EACC;EACT,GAAI;CACL,CAAA;AAEL,CACF;AAEA,YAAU,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.mjs","names":["Flexbox"],"sources":["../../src/CodeEditor/CodeEditor.tsx"],"sourcesContent":["'use client';\n\nimport { cssVar, cx } from 'antd-style';\nimport { memo } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { styles, variants } from '@/CodeEditor/style';\nimport { Flexbox } from '@/Flex';\nimport SyntaxHighlighter from '@/Highlighter/SyntaxHighlighter';\n\nimport type { CodeEditorProps } from './type';\n\nconst CodeEditor = memo<CodeEditorProps>(\n ({\n autoFocus,\n classNames,\n styles: customStyles,\n defaultValue = '',\n onChange,\n placeholder = '',\n style,\n className,\n onValueChange,\n value,\n language = 'markdown',\n variant = 'borderless',\n width,\n height,\n flex,\n ref,\n ...rest\n }) => {\n const [code, setCode] = useMergeState(defaultValue, {\n defaultValue,\n onChange: onValueChange,\n value,\n });\n\n return (\n <Flexbox\n className={cx(variants({ variant }), className)}\n flex={flex}\n height={height}\n style={style}\n width={width}\n >\n {value ? (\n <SyntaxHighlighter\n className={cx(styles.highlight, classNames?.highlight)}\n language={language}\n style={customStyles?.highlight}\n variant={variant}\n >\n {value}\n </SyntaxHighlighter>\n ) : (\n <pre\n className={cx(styles.highlight, classNames?.highlight)}\n style={{\n color: cssVar.colorTextDescription,\n }}\n >\n {placeholder || ' '}\n </pre>\n )}\n\n <textarea\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoFocus={autoFocus}\n className={cx(styles.textarea, classNames?.textarea)}\n data-gramm={false}\n ref={ref}\n style={customStyles?.textarea}\n value={code}\n onChange={(e) => {\n onChange?.(e);\n setCode(e.target.value);\n }}\n {...rest}\n />\n </Flexbox>\n );\n },\n);\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport default CodeEditor;\n"],"mappings":";;;;;;;;;AAYA,MAAM,aAAa,MAChB,EACC,WACA,YACA,QAAQ,cACR,eAAe,IACf,UACA,cAAc,IACd,OACA,WACA,eACA,OACA,WAAW,YACX,UAAU,cACV,OACA,QACA,MACA,KACA,GAAG,WACC;CACJ,MAAM,CAAC,MAAM,WAAW,cAAc,cAAc;EAClD;EACA,UAAU;EACV;CACF,CAAC;CAED,OACE,qBAACA,mBAAD;EACE,WAAW,GAAG,SAAS,EAAE,QAAQ,CAAC,GAAG,SAAS;EACxC;EACE;EACD;EACA;YALT,CAOG,QACC,oBAAC,mBAAD;GACE,WAAW,GAAG,OAAO,WAAW,YAAY,SAAS;GAC3C;GACV,OAAO,cAAc;GACZ;aAER;EACgB,CAAA,IAEnB,oBAAC,OAAD;GACE,WAAW,GAAG,OAAO,WAAW,YAAY,SAAS;GACrD,OAAO,EACL,OAAO,OAAO,qBAChB;aAEC,eAAe;EACb,CAAA,GAGP,oBAAC,YAAD;GACE,gBAAe;GACf,cAAa;GACb,aAAY;GACD;GACX,WAAW,GAAG,OAAO,UAAU,YAAY,QAAQ;GACnD,cAAY;GACP;GACL,OAAO,cAAc;GACrB,OAAO;GACP,WAAW,MAAM;IACf,WAAW,CAAC;IACZ,QAAQ,EAAE,OAAO,KAAK;GACxB;GACA,GAAI;EACL,CAAA,CACM;;AAEb,CACF;AAEA,WAAW,cAAc"}
1
+ {"version":3,"file":"CodeEditor.mjs","names":["Flexbox"],"sources":["../../src/CodeEditor/CodeEditor.tsx"],"sourcesContent":["'use client';\n\nimport { cssVar, cx } from 'antd-style';\nimport { memo } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { styles, variants } from '@/CodeEditor/style';\nimport { Flexbox } from '@/Flex';\nimport SyntaxHighlighter from '@/Highlighter/SyntaxHighlighter';\n\nimport type { CodeEditorProps } from './type';\n\nconst CodeEditor = memo<CodeEditorProps>(\n ({\n autoFocus,\n classNames,\n styles: customStyles,\n defaultValue = '',\n onChange,\n placeholder = '',\n style,\n className,\n onValueChange,\n value,\n language = 'markdown',\n variant = 'borderless',\n width,\n height,\n flex,\n ref,\n ...rest\n }) => {\n const [code, setCode] = useMergeState(defaultValue, {\n defaultValue,\n onChange: onValueChange,\n value,\n });\n\n return (\n <Flexbox\n className={cx(variants({ variant }), className)}\n flex={flex}\n height={height}\n style={style}\n width={width}\n >\n {value ? (\n <SyntaxHighlighter\n className={cx(styles.highlight, classNames?.highlight)}\n language={language}\n style={customStyles?.highlight}\n variant={variant}\n >\n {value}\n </SyntaxHighlighter>\n ) : (\n <pre\n className={cx(styles.highlight, classNames?.highlight)}\n style={{\n color: cssVar.colorTextDescription,\n }}\n >\n {placeholder || ' '}\n </pre>\n )}\n\n <textarea\n autoCapitalize=\"off\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoFocus={autoFocus}\n className={cx(styles.textarea, classNames?.textarea)}\n data-gramm={false}\n ref={ref}\n style={customStyles?.textarea}\n value={code}\n onChange={(e) => {\n onChange?.(e);\n setCode(e.target.value);\n }}\n {...rest}\n />\n </Flexbox>\n );\n },\n);\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport default CodeEditor;\n"],"mappings":";;;;;;;;;AAYA,MAAM,aAAa,MAChB,EACC,WACA,YACA,QAAQ,cACR,eAAe,IACf,UACA,cAAc,IACd,OACA,WACA,eACA,OACA,WAAW,YACX,UAAU,cACV,OACA,QACA,MACA,KACA,GAAG,WACC;CACJ,MAAM,CAAC,MAAM,WAAW,cAAc,cAAc;EAClD;EACA,UAAU;EACV;CACF,CAAC;CAED,OACE,qBAACA,mBAAD;EACE,WAAW,GAAG,SAAS,EAAE,QAAQ,CAAC,GAAG,SAAS;EACxC;EACE;EACD;EACA;EALT,UAAA,CAOG,QACC,oBAAC,mBAAD;GACE,WAAW,GAAG,OAAO,WAAW,YAAY,SAAS;GAC3C;GACV,OAAO,cAAc;GACZ;GAER,UAAA;EACgB,CAAA,IAEnB,oBAAC,OAAD;GACE,WAAW,GAAG,OAAO,WAAW,YAAY,SAAS;GACrD,OAAO,EACL,OAAO,OAAO,qBAChB;GAEC,UAAA,eAAe;EACb,CAAA,GAGP,oBAAC,YAAD;GACE,gBAAe;GACf,cAAa;GACb,aAAY;GACD;GACX,WAAW,GAAG,OAAO,UAAU,YAAY,QAAQ;GACnD,cAAY;GACP;GACL,OAAO,cAAc;GACrB,OAAO;GACP,WAAW,MAAM;IACf,WAAW,CAAC;IACZ,QAAQ,EAAE,OAAO,KAAK;GACxB;GACA,GAAI;EACL,CAAA,CACM;;AAEb,CACF;AAEA,WAAW,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"Collapse.mjs","names":["Collapse","Flexbox","AntdCollapse"],"sources":["../../src/Collapse/Collapse.tsx"],"sourcesContent":["'use client';\n\nimport { Collapse as AntdCollapse, ConfigProvider } from 'antd';\nimport { cx, useThemeMode } from 'antd-style';\nimport { ChevronDown } from 'lucide-react';\nimport { isValidElement, memo, useMemo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { DEFAULT_PADDING, getPadding, styles, variants } from './style';\nimport type { CollapseProps } from './type';\n\nconst Collapse = memo<CollapseProps>(\n ({\n style,\n variant = 'filled',\n gap = 0,\n className,\n padding = DEFAULT_PADDING,\n size,\n collapsible = true,\n items,\n styles: customStyles,\n classNames,\n ref,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n\n const antdItems = useMemo(\n () =>\n items.map(({ icon, desc, label, ...itemRest }) => {\n let content = (\n <div\n className={cx(styles.title, !icon && !desc && classNames?.header, classNames?.title)}\n style={{\n ...(!icon && !desc ? customStyles?.header : {}),\n ...customStyles?.title,\n }}\n >\n {label}\n </div>\n );\n\n if (icon) {\n content = (\n <Flexbox\n horizontal\n className={cx(styles.title, !desc && classNames?.header)}\n gap={8}\n style={desc ? undefined : customStyles?.header}\n >\n {isValidElement(icon) ? icon : <Icon icon={icon} size={{ size: '1.1em' }} />}\n {content}\n </Flexbox>\n );\n }\n\n if (desc) {\n content = (\n <Flexbox className={classNames?.header} style={customStyles?.header}>\n {content}\n <div className={cx(styles.desc, classNames?.desc)} style={customStyles?.desc}>\n {desc}\n </div>\n </Flexbox>\n );\n }\n\n return {\n label: content,\n ...itemRest,\n };\n }),\n [items, classNames, customStyles, styles],\n );\n\n return (\n <ConfigProvider\n theme={{\n components: {\n Collapse: {\n contentPadding: getPadding(typeof padding === 'object' ? padding?.body : padding),\n headerPadding: getPadding(typeof padding === 'object' ? padding?.header : padding),\n },\n },\n }}\n >\n <AntdCollapse\n ghost\n className={cx(variants({ collapsible, gap: !!gap, isDarkMode, variant }), className)}\n collapsible={collapsible ? 'header' : 'icon'}\n items={antdItems}\n ref={ref}\n size={size}\n expandIcon={({ isActive }) => (\n <Icon\n className={styles.icon}\n icon={ChevronDown}\n size={16}\n style={{ rotate: isActive ? undefined : '-90deg' }}\n />\n )}\n style={{\n gap,\n ...style,\n }}\n {...rest}\n />\n </ConfigProvider>\n );\n },\n);\n\nCollapse.displayName = 'Collapse';\n\nexport default Collapse;\n"],"mappings":";;;;;;;;;;AAaA,MAAMA,aAAW,MACd,EACC,OACA,UAAU,UACV,MAAM,GACN,WACA,UAAU,iBACV,MACA,cAAc,MACd,OACA,QAAQ,cACR,YACA,KACA,GAAG,WACC;CACJ,MAAM,EAAE,eAAe,aAAa;CAEpC,MAAM,YAAY,cAEd,MAAM,KAAK,EAAE,MAAM,MAAM,OAAO,GAAG,eAAe;EAChD,IAAI,UACF,oBAAC,OAAD;GACE,WAAW,GAAG,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,YAAY,QAAQ,YAAY,KAAK;GACnF,OAAO;IACL,GAAI,CAAC,QAAQ,CAAC,OAAO,cAAc,SAAS,CAAC;IAC7C,GAAG,cAAc;GACnB;aAEC;EACE,CAAA;EAGP,IAAI,MACF,UACE,qBAACC,mBAAD;GACE,YAAA;GACA,WAAW,GAAG,OAAO,OAAO,CAAC,QAAQ,YAAY,MAAM;GACvD,KAAK;GACL,OAAO,OAAO,KAAA,IAAY,cAAc;aAJ1C,CAMG,eAAe,IAAI,IAAI,OAAO,oBAAC,MAAD;IAAY;IAAM,MAAM,EAAE,MAAM,QAAQ;GAAI,CAAA,GAC1E,OACM;;EAIb,IAAI,MACF,UACE,qBAACA,mBAAD;GAAS,WAAW,YAAY;GAAQ,OAAO,cAAc;aAA7D,CACG,SACD,oBAAC,OAAD;IAAK,WAAW,GAAG,OAAO,MAAM,YAAY,IAAI;IAAG,OAAO,cAAc;cACrE;GACE,CAAA,CACE;;EAIb,OAAO;GACL,OAAO;GACP,GAAG;EACL;CACF,CAAC,GACH;EAAC;EAAO;EAAY;EAAc;CAAM,CAC1C;CAEA,OACE,oBAAC,gBAAD;EACE,OAAO,EACL,YAAY,EACV,UAAU;GACR,gBAAgB,WAAW,OAAO,YAAY,WAAW,SAAS,OAAO,OAAO;GAChF,eAAe,WAAW,OAAO,YAAY,WAAW,SAAS,SAAS,OAAO;EACnF,EACF,EACF;YAEA,oBAACC,UAAD;GACE,OAAA;GACA,WAAW,GAAG,SAAS;IAAE;IAAa,KAAK,CAAC,CAAC;IAAK;IAAY;GAAQ,CAAC,GAAG,SAAS;GACnF,aAAa,cAAc,WAAW;GACtC,OAAO;GACF;GACC;GACN,aAAa,EAAE,eACb,oBAAC,MAAD;IACE,WAAW,OAAO;IAClB,MAAM;IACN,MAAM;IACN,OAAO,EAAE,QAAQ,WAAW,KAAA,IAAY,SAAS;GAClD,CAAA;GAEH,OAAO;IACL;IACA,GAAG;GACL;GACA,GAAI;EACL,CAAA;CACa,CAAA;AAEpB,CACF;AAEA,WAAS,cAAc"}
1
+ {"version":3,"file":"Collapse.mjs","names":["Collapse","Flexbox","AntdCollapse"],"sources":["../../src/Collapse/Collapse.tsx"],"sourcesContent":["'use client';\n\nimport { Collapse as AntdCollapse, ConfigProvider } from 'antd';\nimport { cx, useThemeMode } from 'antd-style';\nimport { ChevronDown } from 'lucide-react';\nimport { isValidElement, memo, useMemo } from 'react';\n\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { DEFAULT_PADDING, getPadding, styles, variants } from './style';\nimport type { CollapseProps } from './type';\n\nconst Collapse = memo<CollapseProps>(\n ({\n style,\n variant = 'filled',\n gap = 0,\n className,\n padding = DEFAULT_PADDING,\n size,\n collapsible = true,\n items,\n styles: customStyles,\n classNames,\n ref,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n\n const antdItems = useMemo(\n () =>\n items.map(({ icon, desc, label, ...itemRest }) => {\n let content = (\n <div\n className={cx(styles.title, !icon && !desc && classNames?.header, classNames?.title)}\n style={{\n ...(!icon && !desc ? customStyles?.header : {}),\n ...customStyles?.title,\n }}\n >\n {label}\n </div>\n );\n\n if (icon) {\n content = (\n <Flexbox\n horizontal\n className={cx(styles.title, !desc && classNames?.header)}\n gap={8}\n style={desc ? undefined : customStyles?.header}\n >\n {isValidElement(icon) ? icon : <Icon icon={icon} size={{ size: '1.1em' }} />}\n {content}\n </Flexbox>\n );\n }\n\n if (desc) {\n content = (\n <Flexbox className={classNames?.header} style={customStyles?.header}>\n {content}\n <div className={cx(styles.desc, classNames?.desc)} style={customStyles?.desc}>\n {desc}\n </div>\n </Flexbox>\n );\n }\n\n return {\n label: content,\n ...itemRest,\n };\n }),\n [items, classNames, customStyles, styles],\n );\n\n return (\n <ConfigProvider\n theme={{\n components: {\n Collapse: {\n contentPadding: getPadding(typeof padding === 'object' ? padding?.body : padding),\n headerPadding: getPadding(typeof padding === 'object' ? padding?.header : padding),\n },\n },\n }}\n >\n <AntdCollapse\n ghost\n className={cx(variants({ collapsible, gap: !!gap, isDarkMode, variant }), className)}\n collapsible={collapsible ? 'header' : 'icon'}\n items={antdItems}\n ref={ref}\n size={size}\n expandIcon={({ isActive }) => (\n <Icon\n className={styles.icon}\n icon={ChevronDown}\n size={16}\n style={{ rotate: isActive ? undefined : '-90deg' }}\n />\n )}\n style={{\n gap,\n ...style,\n }}\n {...rest}\n />\n </ConfigProvider>\n );\n },\n);\n\nCollapse.displayName = 'Collapse';\n\nexport default Collapse;\n"],"mappings":";;;;;;;;;;AAaA,MAAMA,aAAW,MACd,EACC,OACA,UAAU,UACV,MAAM,GACN,WACA,UAAU,iBACV,MACA,cAAc,MACd,OACA,QAAQ,cACR,YACA,KACA,GAAG,WACC;CACJ,MAAM,EAAE,eAAe,aAAa;CAEpC,MAAM,YAAY,cAEd,MAAM,KAAK,EAAE,MAAM,MAAM,OAAO,GAAG,eAAe;EAChD,IAAI,UACF,oBAAC,OAAD;GACE,WAAW,GAAG,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,YAAY,QAAQ,YAAY,KAAK;GACnF,OAAO;IACL,GAAI,CAAC,QAAQ,CAAC,OAAO,cAAc,SAAS,CAAC;IAC7C,GAAG,cAAc;GACnB;GAEC,UAAA;EACE,CAAA;EAGP,IAAI,MACF,UACE,qBAACC,mBAAD;GACE,YAAA;GACA,WAAW,GAAG,OAAO,OAAO,CAAC,QAAQ,YAAY,MAAM;GACvD,KAAK;GACL,OAAO,OAAO,KAAA,IAAY,cAAc;GAJ1C,UAAA,CAMG,eAAe,IAAI,IAAI,OAAO,oBAAC,MAAD;IAAY;IAAM,MAAM,EAAE,MAAM,QAAQ;GAAI,CAAA,GAC1E,OACM;;EAIb,IAAI,MACF,UACE,qBAACA,mBAAD;GAAS,WAAW,YAAY;GAAQ,OAAO,cAAc;GAA7D,UAAA,CACG,SACD,oBAAC,OAAD;IAAK,WAAW,GAAG,OAAO,MAAM,YAAY,IAAI;IAAG,OAAO,cAAc;IACrE,UAAA;GACE,CAAA,CACE;;EAIb,OAAO;GACL,OAAO;GACP,GAAG;EACL;CACF,CAAC,GACH;EAAC;EAAO;EAAY;EAAc;CAAM,CAC1C;CAEA,OACE,oBAAC,gBAAD;EACE,OAAO,EACL,YAAY,EACV,UAAU;GACR,gBAAgB,WAAW,OAAO,YAAY,WAAW,SAAS,OAAO,OAAO;GAChF,eAAe,WAAW,OAAO,YAAY,WAAW,SAAS,SAAS,OAAO;EACnF,EACF,EACF;EAEA,UAAA,oBAACC,UAAD;GACE,OAAA;GACA,WAAW,GAAG,SAAS;IAAE;IAAa,KAAK,CAAC,CAAC;IAAK;IAAY;GAAQ,CAAC,GAAG,SAAS;GACnF,aAAa,cAAc,WAAW;GACtC,OAAO;GACF;GACC;GACN,aAAa,EAAE,eACb,oBAAC,MAAD;IACE,WAAW,OAAO;IAClB,MAAM;IACN,MAAM;IACN,OAAO,EAAE,QAAQ,WAAW,KAAA,IAAY,SAAS;GAClD,CAAA;GAEH,OAAO;IACL;IACA,GAAG;GACL;GACA,GAAI;EACL,CAAA;CACa,CAAA;AAEpB,CACF;AAEA,WAAS,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"ColorSwatches.mjs","names":["Flexbox"],"sources":["../../src/ColorSwatches/ColorSwatches.tsx"],"sourcesContent":["'use client';\n\nimport { ColorPicker } from 'antd';\nimport { cssVar, cx } from 'antd-style';\nimport chroma from 'chroma-js';\nimport { CheckIcon } from 'lucide-react';\nimport { rgba } from 'polished';\nimport { type FC, useMemo } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport Tooltip from '@/Tooltip';\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\nimport { styles } from './style';\nimport type { ColorSwatchesProps } from './type';\n\nconst ColorSwatches: FC<ColorSwatchesProps> = ({\n enableColorPicker,\n enableColorSwatches = true,\n defaultValue,\n value,\n style,\n colors,\n onChange,\n size = 24,\n shape = 'circle',\n texts,\n ref,\n ...rest\n}) => {\n const [active, setActive] = useMergeState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // Convert size prop to CSS variable\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--color-swatches-size': `${size}px`,\n }),\n [size],\n );\n\n const isCustomActive = useMemo(\n () => active && active !== cssVar.colorPrimary && !colors.some((c) => c.color === active),\n [active, colors],\n );\n\n return (\n <Flexbox\n horizontal\n gap={6}\n ref={ref}\n style={{\n ...cssVariables,\n flexWrap: 'wrap',\n ...style,\n }}\n {...rest}\n >\n {enableColorSwatches &&\n colors.map((c, i) => {\n const color = c.color || cssVar.colorPrimary;\n const isActive = (!active && !c.color) || color === active;\n // Check if color is transparent or CSS variable (which chroma can't parse)\n const isTransparent =\n c.color === 'transparent' ||\n (c.color &&\n !c.color.startsWith('var(') &&\n (() => {\n try {\n return chroma(c.color).alpha() === 0;\n } catch {\n return false;\n }\n })());\n // Get actual color value for readableColor (CSS variables can't be parsed)\n const actualColorForReadable = c.color?.startsWith('var(') ? cssVar.colorPrimary : color;\n return (\n <Tooltip key={c?.key || i} title={c.title}>\n <Center\n className={cx(\n styles.container,\n isTransparent && styles.transparent,\n isActive && styles.active,\n )}\n style={{\n background: isTransparent ? undefined : color,\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onClick={() => setActive(c.color || undefined)}\n >\n {isActive && (\n <Icon\n color={rgba(safeReadableColor(actualColorForReadable), 0.33)}\n icon={CheckIcon}\n size={{ size: 14, strokeWidth: 4 }}\n style={{\n pointerEvents: 'none',\n }}\n />\n )}\n </Center>\n </Tooltip>\n );\n })}\n {enableColorPicker && (\n <Tooltip title={texts?.custom || 'Custom'}>\n <ColorPicker\n disabledAlpha\n arrow={false}\n defaultValue={cssVar.colorPrimary}\n format={'hex'}\n value={enableColorSwatches ? undefined : active}\n className={cx(\n styles.picker,\n enableColorSwatches && styles.conic,\n isCustomActive && styles.active,\n )}\n presets={\n enableColorSwatches\n ? undefined\n : [\n {\n colors: colors.map((c) => c.color),\n label: texts?.presets || 'Presets',\n },\n ]\n }\n style={{\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onChangeComplete={(c) => {\n if (c.toHexString() === cssVar.colorPrimary) {\n setActive('');\n } else {\n setActive(c.toHexString());\n }\n }}\n />\n </Tooltip>\n )}\n </Flexbox>\n );\n};\n\nColorSwatches.displayName = 'ColorSwatches';\n\nexport default ColorSwatches;\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAM,iBAAyC,EAC7C,mBACA,sBAAsB,MACtB,cACA,OACA,OACA,QACA,UACA,OAAO,IACP,QAAQ,UACR,OACA,KACA,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAa,cAAc,cAAc;EACtD;EACA;EACA;CACF,CAAC;CAGD,MAAM,eAAe,eACZ,EACL,yBAAyB,GAAG,KAAK,IACnC,IACA,CAAC,IAAI,CACP;CAEA,MAAM,iBAAiB,cACf,UAAU,WAAW,OAAO,gBAAgB,CAAC,OAAO,MAAM,MAAM,EAAE,UAAU,MAAM,GACxF,CAAC,QAAQ,MAAM,CACjB;CAEA,OACE,qBAACA,mBAAD;EACE,YAAA;EACA,KAAK;EACA;EACL,OAAO;GACL,GAAG;GACH,UAAU;GACV,GAAG;EACL;EACA,GAAI;YATN,CAWG,uBACC,OAAO,KAAK,GAAG,MAAM;GACnB,MAAM,QAAQ,EAAE,SAAS,OAAO;GAChC,MAAM,WAAY,CAAC,UAAU,CAAC,EAAE,SAAU,UAAU;GAEpD,MAAM,gBACJ,EAAE,UAAU,iBACX,EAAE,SACD,CAAC,EAAE,MAAM,WAAW,MAAM,YACnB;IACL,IAAI;KACF,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM;IACrC,QAAQ;KACN,OAAO;IACT;GACF,EAAA,CAAG;GAEP,MAAM,yBAAyB,EAAE,OAAO,WAAW,MAAM,IAAI,OAAO,eAAe;GACnF,OACE,oBAAC,SAAD;IAA2B,OAAO,EAAE;cAClC,oBAAC,QAAD;KACE,WAAW,GACT,OAAO,WACP,iBAAiB,OAAO,aACxB,YAAY,OAAO,MACrB;KACA,OAAO;MACL,YAAY,gBAAgB,KAAA,IAAY;MACxC,cAAc,UAAU,WAAW,QAAQ,OAAO;KACpD;KACA,eAAe,UAAU,EAAE,SAAS,KAAA,CAAS;eAE5C,YACC,oBAAC,MAAD;MACE,OAAO,KAAK,kBAAkB,sBAAsB,GAAG,GAAI;MAC3D,MAAM;MACN,MAAM;OAAE,MAAM;OAAI,aAAa;MAAE;MACjC,OAAO,EACL,eAAe,OACjB;KACD,CAAA;IAEG,CAAA;GACD,GAxBK,GAAG,OAAO,CAwBf;EAEb,CAAC,GACF,qBACC,oBAAC,SAAD;GAAS,OAAO,OAAO,UAAU;aAC/B,oBAAC,aAAD;IACE,eAAA;IACA,OAAO;IACP,cAAc,OAAO;IACrB,QAAQ;IACR,OAAO,sBAAsB,KAAA,IAAY;IACzC,WAAW,GACT,OAAO,QACP,uBAAuB,OAAO,OAC9B,kBAAkB,OAAO,MAC3B;IACA,SACE,sBACI,KAAA,IACA,CACE;KACE,QAAQ,OAAO,KAAK,MAAM,EAAE,KAAK;KACjC,OAAO,OAAO,WAAW;IAC3B,CACF;IAEN,OAAO,EACL,cAAc,UAAU,WAAW,QAAQ,OAAO,aACpD;IACA,mBAAmB,MAAM;KACvB,IAAI,EAAE,YAAY,MAAM,OAAO,cAC7B,UAAU,EAAE;UAEZ,UAAU,EAAE,YAAY,CAAC;IAE7B;GACD,CAAA;EACM,CAAA,CAEJ;;AAEb;AAEA,cAAc,cAAc"}
1
+ {"version":3,"file":"ColorSwatches.mjs","names":["Flexbox"],"sources":["../../src/ColorSwatches/ColorSwatches.tsx"],"sourcesContent":["'use client';\n\nimport { ColorPicker } from 'antd';\nimport { cssVar, cx } from 'antd-style';\nimport chroma from 'chroma-js';\nimport { CheckIcon } from 'lucide-react';\nimport { rgba } from 'polished';\nimport { type FC, useMemo } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport Tooltip from '@/Tooltip';\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\nimport { styles } from './style';\nimport type { ColorSwatchesProps } from './type';\n\nconst ColorSwatches: FC<ColorSwatchesProps> = ({\n enableColorPicker,\n enableColorSwatches = true,\n defaultValue,\n value,\n style,\n colors,\n onChange,\n size = 24,\n shape = 'circle',\n texts,\n ref,\n ...rest\n}) => {\n const [active, setActive] = useMergeState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // Convert size prop to CSS variable\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--color-swatches-size': `${size}px`,\n }),\n [size],\n );\n\n const isCustomActive = useMemo(\n () => active && active !== cssVar.colorPrimary && !colors.some((c) => c.color === active),\n [active, colors],\n );\n\n return (\n <Flexbox\n horizontal\n gap={6}\n ref={ref}\n style={{\n ...cssVariables,\n flexWrap: 'wrap',\n ...style,\n }}\n {...rest}\n >\n {enableColorSwatches &&\n colors.map((c, i) => {\n const color = c.color || cssVar.colorPrimary;\n const isActive = (!active && !c.color) || color === active;\n // Check if color is transparent or CSS variable (which chroma can't parse)\n const isTransparent =\n c.color === 'transparent' ||\n (c.color &&\n !c.color.startsWith('var(') &&\n (() => {\n try {\n return chroma(c.color).alpha() === 0;\n } catch {\n return false;\n }\n })());\n // Get actual color value for readableColor (CSS variables can't be parsed)\n const actualColorForReadable = c.color?.startsWith('var(') ? cssVar.colorPrimary : color;\n return (\n <Tooltip key={c?.key || i} title={c.title}>\n <Center\n className={cx(\n styles.container,\n isTransparent && styles.transparent,\n isActive && styles.active,\n )}\n style={{\n background: isTransparent ? undefined : color,\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onClick={() => setActive(c.color || undefined)}\n >\n {isActive && (\n <Icon\n color={rgba(safeReadableColor(actualColorForReadable), 0.33)}\n icon={CheckIcon}\n size={{ size: 14, strokeWidth: 4 }}\n style={{\n pointerEvents: 'none',\n }}\n />\n )}\n </Center>\n </Tooltip>\n );\n })}\n {enableColorPicker && (\n <Tooltip title={texts?.custom || 'Custom'}>\n <ColorPicker\n disabledAlpha\n arrow={false}\n defaultValue={cssVar.colorPrimary}\n format={'hex'}\n value={enableColorSwatches ? undefined : active}\n className={cx(\n styles.picker,\n enableColorSwatches && styles.conic,\n isCustomActive && styles.active,\n )}\n presets={\n enableColorSwatches\n ? undefined\n : [\n {\n colors: colors.map((c) => c.color),\n label: texts?.presets || 'Presets',\n },\n ]\n }\n style={{\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onChangeComplete={(c) => {\n if (c.toHexString() === cssVar.colorPrimary) {\n setActive('');\n } else {\n setActive(c.toHexString());\n }\n }}\n />\n </Tooltip>\n )}\n </Flexbox>\n );\n};\n\nColorSwatches.displayName = 'ColorSwatches';\n\nexport default ColorSwatches;\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAM,iBAAyC,EAC7C,mBACA,sBAAsB,MACtB,cACA,OACA,OACA,QACA,UACA,OAAO,IACP,QAAQ,UACR,OACA,KACA,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAa,cAAc,cAAc;EACtD;EACA;EACA;CACF,CAAC;CAGD,MAAM,eAAe,eACZ,EACL,yBAAyB,GAAG,KAAK,IACnC,IACA,CAAC,IAAI,CACP;CAEA,MAAM,iBAAiB,cACf,UAAU,WAAW,OAAO,gBAAgB,CAAC,OAAO,MAAM,MAAM,EAAE,UAAU,MAAM,GACxF,CAAC,QAAQ,MAAM,CACjB;CAEA,OACE,qBAACA,mBAAD;EACE,YAAA;EACA,KAAK;EACA;EACL,OAAO;GACL,GAAG;GACH,UAAU;GACV,GAAG;EACL;EACA,GAAI;EATN,UAAA,CAWG,uBACC,OAAO,KAAK,GAAG,MAAM;GACnB,MAAM,QAAQ,EAAE,SAAS,OAAO;GAChC,MAAM,WAAY,CAAC,UAAU,CAAC,EAAE,SAAU,UAAU;GAEpD,MAAM,gBACJ,EAAE,UAAU,iBACX,EAAE,SACD,CAAC,EAAE,MAAM,WAAW,MAAM,YACnB;IACL,IAAI;KACF,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM;IACrC,QAAQ;KACN,OAAO;IACT;GACF,EAAA,CAAG;GAEP,MAAM,yBAAyB,EAAE,OAAO,WAAW,MAAM,IAAI,OAAO,eAAe;GACnF,OACE,oBAAC,SAAD;IAA2B,OAAO,EAAE;IAClC,UAAA,oBAAC,QAAD;KACE,WAAW,GACT,OAAO,WACP,iBAAiB,OAAO,aACxB,YAAY,OAAO,MACrB;KACA,OAAO;MACL,YAAY,gBAAgB,KAAA,IAAY;MACxC,cAAc,UAAU,WAAW,QAAQ,OAAO;KACpD;KACA,eAAe,UAAU,EAAE,SAAS,KAAA,CAAS;KAE5C,UAAA,YACC,oBAAC,MAAD;MACE,OAAO,KAAK,kBAAkB,sBAAsB,GAAG,GAAI;MAC3D,MAAM;MACN,MAAM;OAAE,MAAM;OAAI,aAAa;MAAE;MACjC,OAAO,EACL,eAAe,OACjB;KACD,CAAA;IAEG,CAAA;GACD,GAxBK,GAAG,OAAO,CAwBf;EAEb,CAAC,GACF,qBACC,oBAAC,SAAD;GAAS,OAAO,OAAO,UAAU;GAC/B,UAAA,oBAAC,aAAD;IACE,eAAA;IACA,OAAO;IACP,cAAc,OAAO;IACrB,QAAQ;IACR,OAAO,sBAAsB,KAAA,IAAY;IACzC,WAAW,GACT,OAAO,QACP,uBAAuB,OAAO,OAC9B,kBAAkB,OAAO,MAC3B;IACA,SACE,sBACI,KAAA,IACA,CACE;KACE,QAAQ,OAAO,KAAK,MAAM,EAAE,KAAK;KACjC,OAAO,OAAO,WAAW;IAC3B,CACF;IAEN,OAAO,EACL,cAAc,UAAU,WAAW,QAAQ,OAAO,aACpD;IACA,mBAAmB,MAAM;KACvB,IAAI,EAAE,YAAY,MAAM,OAAO,cAC7B,UAAU,EAAE;UAEZ,UAAU,EAAE,YAAY,CAAC;IAE7B;GACD,CAAA;EACM,CAAA,CAEJ;;AAEb;AAEA,cAAc,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/ConfigProvider/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n type ElementType,\n memo,\n type ReactNode,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {\n type I18nContextValue,\n type TranslationKey,\n type TranslationResourcesInput,\n type TranslationResourcesMap,\n} from '@/i18n/types';\nimport { MotionComponent, type MotionComponentType } from '@/MotionProvider';\nimport { type CDN, type CdnApi, genCdnUrl } from '@/utils/genCdnUrl';\n\nexport interface Config {\n aAs?: ElementType;\n customCdnFn?: CdnFn;\n imgAs?: ElementType;\n imgUnoptimized?: boolean;\n proxy?: CDN | 'custom';\n}\n\nexport const ConfigContext = createContext<Config | null>(null);\n\n// Internal i18n context\nconst I18nContextInternal = createContext<I18nContextValue>({\n locale: 'en',\n t: (key: TranslationKey) => key,\n});\n\nexport interface ConfigProviderProps {\n children: ReactNode;\n config?: Config;\n // i18n props - flattened at top level\n locale?: string;\n motion: MotionComponentType;\n resources?: TranslationResourcesInput;\n}\n\nconst isThenable = (value: unknown): value is Promise<TranslationResourcesMap> =>\n typeof (value as { then?: unknown })?.then === 'function';\n\nconst ConfigProvider = memo<ConfigProviderProps>(\n ({ children, config, locale, resources, motion }) => {\n const fallbackLocale = locale ?? 'en';\n const [resolvedResources, setResolvedResources] = useState<TranslationResourcesMap | undefined>(\n () => (resources && !isThenable(resources) ? resources : undefined),\n );\n const [resolvedLocale, setResolvedLocale] = useState(fallbackLocale);\n const latestRequestId = useRef(0);\n\n useEffect(() => {\n const requestId = ++latestRequestId.current;\n\n if (!resources) {\n setResolvedResources(undefined);\n setResolvedLocale(fallbackLocale);\n return;\n }\n\n if (isThenable(resources)) {\n const targetLocale = fallbackLocale;\n resources\n .then((nextResources) => {\n if (latestRequestId.current !== requestId) return;\n setResolvedResources(nextResources);\n setResolvedLocale(targetLocale);\n })\n .catch(() => {\n if (latestRequestId.current !== requestId) return;\n });\n return;\n }\n\n setResolvedResources(resources);\n setResolvedLocale(fallbackLocale);\n }, [fallbackLocale, resources]);\n\n const currentResources = isThenable(resources) ? resolvedResources : resources;\n const currentLocale = isThenable(resources) ? resolvedLocale : fallbackLocale;\n\n const i18nValue = useMemo((): I18nContextValue => {\n const resourceList = Array.isArray(currentResources)\n ? currentResources\n : currentResources\n ? Object.values(currentResources)\n : [];\n const mergedResources = Object.assign({}, ...resourceList);\n const t = (key: TranslationKey): string => mergedResources[key] || key;\n return { locale: currentLocale, t };\n }, [currentLocale, currentResources]);\n\n return (\n <I18nContextInternal value={i18nValue}>\n <ConfigContext value={config ?? null}>\n <MotionComponent value={motion}>{children}</MotionComponent>\n </ConfigContext>\n </I18nContextInternal>\n );\n },\n);\n\n// useCdnFn\nexport type CdnFn = ({ pkg, version, path }: CdnApi) => string;\n\nconst cdnFallback: CdnFn = ({ pkg, version, path }) =>\n genCdnUrl({ path, pkg, proxy: 'aliyun', version });\n\nexport const useCdnFn = (): CdnFn => {\n const config = use(ConfigContext);\n if (!config) return cdnFallback;\n if (config?.proxy !== 'custom')\n return ({ pkg, version, path }) =>\n genCdnUrl({ path, pkg, proxy: config.proxy as any, version });\n return config?.customCdnFn || cdnFallback;\n};\n\n// useI18n hook\nexport const useI18n = () => use(I18nContextInternal);\n\n// Export I18nContext for external reference\nexport { I18nContextInternal as I18nContext };\n\nexport default ConfigProvider;\n"],"mappings":";;;;;;AA+BA,MAAa,gBAAgB,cAA6B,IAAI;AAG9D,MAAM,sBAAsB,cAAgC;CAC1D,QAAQ;CACR,IAAI,QAAwB;AAC9B,CAAC;AAWD,MAAM,cAAc,UAClB,OAAQ,OAA8B,SAAS;AAEjD,MAAM,iBAAiB,MACpB,EAAE,UAAU,QAAQ,QAAQ,WAAW,aAAa;CACnD,MAAM,iBAAiB,UAAU;CACjC,MAAM,CAAC,mBAAmB,wBAAwB,eACzC,aAAa,CAAC,WAAW,SAAS,IAAI,YAAY,KAAA,CAC3D;CACA,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,cAAc;CACnE,MAAM,kBAAkB,OAAO,CAAC;CAEhC,gBAAgB;EACd,MAAM,YAAY,EAAE,gBAAgB;EAEpC,IAAI,CAAC,WAAW;GACd,qBAAqB,KAAA,CAAS;GAC9B,kBAAkB,cAAc;GAChC;EACF;EAEA,IAAI,WAAW,SAAS,GAAG;GACzB,MAAM,eAAe;GACrB,UACG,MAAM,kBAAkB;IACvB,IAAI,gBAAgB,YAAY,WAAW;IAC3C,qBAAqB,aAAa;IAClC,kBAAkB,YAAY;GAChC,CAAC,CAAC,CACD,YAAY;IACX,IAAI,gBAAgB,YAAY,WAAW;GAC7C,CAAC;GACH;EACF;EAEA,qBAAqB,SAAS;EAC9B,kBAAkB,cAAc;CAClC,GAAG,CAAC,gBAAgB,SAAS,CAAC;CAE9B,MAAM,mBAAmB,WAAW,SAAS,IAAI,oBAAoB;CACrE,MAAM,gBAAgB,WAAW,SAAS,IAAI,iBAAiB;CAE/D,MAAM,YAAY,cAAgC;EAChD,MAAM,eAAe,MAAM,QAAQ,gBAAgB,IAC/C,mBACA,mBACE,OAAO,OAAO,gBAAgB,IAC9B,CAAC;EACP,MAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,GAAG,YAAY;EACzD,MAAM,KAAK,QAAgC,gBAAgB,QAAQ;EACnE,OAAO;GAAE,QAAQ;GAAe;EAAE;CACpC,GAAG,CAAC,eAAe,gBAAgB,CAAC;CAEpC,OACE,oBAAC,qBAAD;EAAqB,OAAO;YAC1B,oBAAC,eAAD;GAAe,OAAO,UAAU;aAC9B,oBAAC,iBAAD;IAAiB,OAAO;IAAS;GAA0B,CAAA;EAC9C,CAAA;CACI,CAAA;AAEzB,CACF;AAKA,MAAM,eAAsB,EAAE,KAAK,SAAS,WAC1C,UAAU;CAAE;CAAM;CAAK,OAAO;CAAU;AAAQ,CAAC;AAEnD,MAAa,iBAAwB;CACnC,MAAM,SAAS,IAAI,aAAa;CAChC,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,QAAQ,UAAU,UACpB,QAAQ,EAAE,KAAK,SAAS,WACtB,UAAU;EAAE;EAAM;EAAK,OAAO,OAAO;EAAc;CAAQ,CAAC;CAChE,OAAO,QAAQ,eAAe;AAChC;AAGA,MAAa,gBAAgB,IAAI,mBAAmB"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/ConfigProvider/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n type ElementType,\n memo,\n type ReactNode,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {\n type I18nContextValue,\n type TranslationKey,\n type TranslationResourcesInput,\n type TranslationResourcesMap,\n} from '@/i18n/types';\nimport { MotionComponent, type MotionComponentType } from '@/MotionProvider';\nimport { type CDN, type CdnApi, genCdnUrl } from '@/utils/genCdnUrl';\n\nexport interface Config {\n aAs?: ElementType;\n customCdnFn?: CdnFn;\n imgAs?: ElementType;\n imgUnoptimized?: boolean;\n proxy?: CDN | 'custom';\n}\n\nexport const ConfigContext = createContext<Config | null>(null);\n\n// Internal i18n context\nconst I18nContextInternal = createContext<I18nContextValue>({\n locale: 'en',\n t: (key: TranslationKey) => key,\n});\n\nexport interface ConfigProviderProps {\n children: ReactNode;\n config?: Config;\n // i18n props - flattened at top level\n locale?: string;\n motion: MotionComponentType;\n resources?: TranslationResourcesInput;\n}\n\nconst isThenable = (value: unknown): value is Promise<TranslationResourcesMap> =>\n typeof (value as { then?: unknown })?.then === 'function';\n\nconst ConfigProvider = memo<ConfigProviderProps>(\n ({ children, config, locale, resources, motion }) => {\n const fallbackLocale = locale ?? 'en';\n const [resolvedResources, setResolvedResources] = useState<TranslationResourcesMap | undefined>(\n () => (resources && !isThenable(resources) ? resources : undefined),\n );\n const [resolvedLocale, setResolvedLocale] = useState(fallbackLocale);\n const latestRequestId = useRef(0);\n\n useEffect(() => {\n const requestId = ++latestRequestId.current;\n\n if (!resources) {\n setResolvedResources(undefined);\n setResolvedLocale(fallbackLocale);\n return;\n }\n\n if (isThenable(resources)) {\n const targetLocale = fallbackLocale;\n resources\n .then((nextResources) => {\n if (latestRequestId.current !== requestId) return;\n setResolvedResources(nextResources);\n setResolvedLocale(targetLocale);\n })\n .catch(() => {\n if (latestRequestId.current !== requestId) return;\n });\n return;\n }\n\n setResolvedResources(resources);\n setResolvedLocale(fallbackLocale);\n }, [fallbackLocale, resources]);\n\n const currentResources = isThenable(resources) ? resolvedResources : resources;\n const currentLocale = isThenable(resources) ? resolvedLocale : fallbackLocale;\n\n const i18nValue = useMemo((): I18nContextValue => {\n const resourceList = Array.isArray(currentResources)\n ? currentResources\n : currentResources\n ? Object.values(currentResources)\n : [];\n const mergedResources = Object.assign({}, ...resourceList);\n const t = (key: TranslationKey): string => mergedResources[key] || key;\n return { locale: currentLocale, t };\n }, [currentLocale, currentResources]);\n\n return (\n <I18nContextInternal value={i18nValue}>\n <ConfigContext value={config ?? null}>\n <MotionComponent value={motion}>{children}</MotionComponent>\n </ConfigContext>\n </I18nContextInternal>\n );\n },\n);\n\n// useCdnFn\nexport type CdnFn = ({ pkg, version, path }: CdnApi) => string;\n\nconst cdnFallback: CdnFn = ({ pkg, version, path }) =>\n genCdnUrl({ path, pkg, proxy: 'aliyun', version });\n\nexport const useCdnFn = (): CdnFn => {\n const config = use(ConfigContext);\n if (!config) return cdnFallback;\n if (config?.proxy !== 'custom')\n return ({ pkg, version, path }) =>\n genCdnUrl({ path, pkg, proxy: config.proxy as any, version });\n return config?.customCdnFn || cdnFallback;\n};\n\n// useI18n hook\nexport const useI18n = () => use(I18nContextInternal);\n\n// Export I18nContext for external reference\nexport { I18nContextInternal as I18nContext };\n\nexport default ConfigProvider;\n"],"mappings":";;;;;;AA+BA,MAAa,gBAAgB,cAA6B,IAAI;AAG9D,MAAM,sBAAsB,cAAgC;CAC1D,QAAQ;CACR,IAAI,QAAwB;AAC9B,CAAC;AAWD,MAAM,cAAc,UAClB,OAAQ,OAA8B,SAAS;AAEjD,MAAM,iBAAiB,MACpB,EAAE,UAAU,QAAQ,QAAQ,WAAW,aAAa;CACnD,MAAM,iBAAiB,UAAU;CACjC,MAAM,CAAC,mBAAmB,wBAAwB,eACzC,aAAa,CAAC,WAAW,SAAS,IAAI,YAAY,KAAA,CAC3D;CACA,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,cAAc;CACnE,MAAM,kBAAkB,OAAO,CAAC;CAEhC,gBAAgB;EACd,MAAM,YAAY,EAAE,gBAAgB;EAEpC,IAAI,CAAC,WAAW;GACd,qBAAqB,KAAA,CAAS;GAC9B,kBAAkB,cAAc;GAChC;EACF;EAEA,IAAI,WAAW,SAAS,GAAG;GACzB,MAAM,eAAe;GACrB,UACG,MAAM,kBAAkB;IACvB,IAAI,gBAAgB,YAAY,WAAW;IAC3C,qBAAqB,aAAa;IAClC,kBAAkB,YAAY;GAChC,CAAC,CAAC,CACD,YAAY;IACX,IAAI,gBAAgB,YAAY,WAAW;GAC7C,CAAC;GACH;EACF;EAEA,qBAAqB,SAAS;EAC9B,kBAAkB,cAAc;CAClC,GAAG,CAAC,gBAAgB,SAAS,CAAC;CAE9B,MAAM,mBAAmB,WAAW,SAAS,IAAI,oBAAoB;CACrE,MAAM,gBAAgB,WAAW,SAAS,IAAI,iBAAiB;CAE/D,MAAM,YAAY,cAAgC;EAChD,MAAM,eAAe,MAAM,QAAQ,gBAAgB,IAC/C,mBACA,mBACE,OAAO,OAAO,gBAAgB,IAC9B,CAAC;EACP,MAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,GAAG,YAAY;EACzD,MAAM,KAAK,QAAgC,gBAAgB,QAAQ;EACnE,OAAO;GAAE,QAAQ;GAAe;EAAE;CACpC,GAAG,CAAC,eAAe,gBAAgB,CAAC;CAEpC,OACE,oBAAC,qBAAD;EAAqB,OAAO;EAC1B,UAAA,oBAAC,eAAD;GAAe,OAAO,UAAU;GAC9B,UAAA,oBAAC,iBAAD;IAAiB,OAAO;IAAS;GAA0B,CAAA;EAC9C,CAAA;CACI,CAAA;AAEzB,CACF;AAKA,MAAM,eAAsB,EAAE,KAAK,SAAS,WAC1C,UAAU;CAAE;CAAM;CAAK,OAAO;CAAU;AAAQ,CAAC;AAEnD,MAAa,iBAAwB;CACnC,MAAM,SAAS,IAAI,aAAa;CAChC,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,QAAQ,UAAU,UACpB,QAAQ,EAAE,KAAK,SAAS,WACtB,UAAU;EAAE;EAAM;EAAK,OAAO,OAAO;EAAc;CAAQ,CAAC;CAChE,OAAO,QAAQ,eAAe;AAChC;AAGA,MAAa,gBAAgB,IAAI,mBAAmB"}
@@ -2,6 +2,6 @@ import { IconSpaceMode } from "../Menu/renderUtils.mjs";
2
2
  import { ContextMenuCheckboxItem, ContextMenuItem, ContextMenuSwitchItem } from "../base-ui/ContextMenu/type.mjs";
3
3
  import { ContextMenuTrigger, ContextMenuTriggerProps } from "../base-ui/ContextMenu/ContextMenuTrigger.mjs";
4
4
  import { ContextMenuHost } from "../base-ui/ContextMenu/ContextMenuHost.mjs";
5
- import { ShowContextMenuOptions, closeContextMenu, showContextMenu, updateContextMenuItems } from "../base-ui/ContextMenu/store.mjs";
5
+ import { ContextMenuInterceptor, ShowContextMenuOptions, closeContextMenu, setContextMenuInterceptor, showContextMenu, updateContextMenuItems } from "../base-ui/ContextMenu/store.mjs";
6
6
  import "../base-ui/ContextMenu/index.mjs";
7
- export { type ContextMenuCheckboxItem, ContextMenuHost, type ContextMenuItem, type ContextMenuSwitchItem, ContextMenuTrigger, type ContextMenuTriggerProps, type IconSpaceMode, type ShowContextMenuOptions, closeContextMenu, showContextMenu, updateContextMenuItems };
7
+ export { type ContextMenuCheckboxItem, ContextMenuHost, type ContextMenuInterceptor, type ContextMenuItem, type ContextMenuSwitchItem, ContextMenuTrigger, type ContextMenuTriggerProps, type IconSpaceMode, type ShowContextMenuOptions, closeContextMenu, setContextMenuInterceptor, showContextMenu, updateContextMenuItems };
@@ -1,4 +1,4 @@
1
- import { closeContextMenu, showContextMenu, updateContextMenuItems } from "../base-ui/ContextMenu/store.mjs";
1
+ import { closeContextMenu, setContextMenuInterceptor, showContextMenu, updateContextMenuItems } from "../base-ui/ContextMenu/store.mjs";
2
2
  import { ContextMenuHost } from "../base-ui/ContextMenu/ContextMenuHost.mjs";
3
3
  import { ContextMenuTrigger } from "../base-ui/ContextMenu/ContextMenuTrigger.mjs";
4
- export { ContextMenuHost, ContextMenuTrigger, closeContextMenu, showContextMenu, updateContextMenuItems };
4
+ export { ContextMenuHost, ContextMenuTrigger, closeContextMenu, setContextMenuInterceptor, showContextMenu, updateContextMenuItems };
@@ -17,7 +17,8 @@ const CopyButton = memo(({ active, content, size, icon, glass = true, onClick, .
17
17
  active: active || copied,
18
18
  icon: copied ? Check : Icon,
19
19
  onClick: async (e) => {
20
- await copyToClipboard(typeof content === "function" ? content() : content);
20
+ const resolvedContent = typeof content === "function" ? content() : content;
21
+ await copyToClipboard(resolvedContent);
21
22
  setCopied();
22
23
  onClick?.(e);
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CopyButton.mjs","names":[],"sources":["../../src/CopyButton/CopyButton.tsx"],"sourcesContent":["'use client';\n\nimport { Check, Copy } from 'lucide-react';\nimport { memo } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport { useCopied } from '@/hooks/useCopied';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport type { CopyButtonProps } from './type';\n\nconst CopyButton = memo<CopyButtonProps>(\n ({ active, content, size, icon, glass = true, onClick, ...rest }) => {\n const { copied, setCopied } = useCopied();\n const Icon = icon || Copy;\n\n return (\n <ActionIcon\n glass={glass}\n size={size}\n title={'Copy'}\n {...rest}\n active={active || copied}\n icon={copied ? Check : Icon}\n onClick={async (e) => {\n const resolvedContent = typeof content === 'function' ? content() : content;\n await copyToClipboard(resolvedContent);\n setCopied();\n onClick?.(e);\n }}\n />\n );\n },\n);\n\nCopyButton.displayName = 'CopyButton';\n\nexport default CopyButton;\n"],"mappings":";;;;;;;;AAWA,MAAM,aAAa,MAChB,EAAE,QAAQ,SAAS,MAAM,MAAM,QAAQ,MAAM,SAAS,GAAG,WAAW;CACnE,MAAM,EAAE,QAAQ,cAAc,UAAU;CACxC,MAAM,OAAO,QAAQ;CAErB,OACE,oBAAC,YAAD;EACS;EACD;EACN,OAAO;EACP,GAAI;EACJ,QAAQ,UAAU;EAClB,MAAM,SAAS,QAAQ;EACvB,SAAS,OAAO,MAAM;GAEpB,MAAM,gBADkB,OAAO,YAAY,aAAa,QAAQ,IAAI,OAC/B;GACrC,UAAU;GACV,UAAU,CAAC;EACb;CACD,CAAA;AAEL,CACF;AAEA,WAAW,cAAc"}
1
+ {"version":3,"file":"CopyButton.mjs","names":[],"sources":["../../src/CopyButton/CopyButton.tsx"],"sourcesContent":["'use client';\n\nimport { Check, Copy } from 'lucide-react';\nimport { memo } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport { useCopied } from '@/hooks/useCopied';\nimport { copyToClipboard } from '@/utils/copyToClipboard';\n\nimport type { CopyButtonProps } from './type';\n\nconst CopyButton = memo<CopyButtonProps>(\n ({ active, content, size, icon, glass = true, onClick, ...rest }) => {\n const { copied, setCopied } = useCopied();\n const Icon = icon || Copy;\n\n return (\n <ActionIcon\n glass={glass}\n size={size}\n title={'Copy'}\n {...rest}\n active={active || copied}\n icon={copied ? Check : Icon}\n onClick={async (e) => {\n const resolvedContent = typeof content === 'function' ? content() : content;\n await copyToClipboard(resolvedContent);\n setCopied();\n onClick?.(e);\n }}\n />\n );\n },\n);\n\nCopyButton.displayName = 'CopyButton';\n\nexport default CopyButton;\n"],"mappings":";;;;;;;;AAWA,MAAM,aAAa,MAChB,EAAE,QAAQ,SAAS,MAAM,MAAM,QAAQ,MAAM,SAAS,GAAG,WAAW;CACnE,MAAM,EAAE,QAAQ,cAAc,UAAU;CACxC,MAAM,OAAO,QAAQ;CAErB,OACE,oBAAC,YAAD;EACS;EACD;EACN,OAAO;EACP,GAAI;EACJ,QAAQ,UAAU;EAClB,MAAM,SAAS,QAAQ;EACvB,SAAS,OAAO,MAAM;GACpB,MAAM,kBAAkB,OAAO,YAAY,aAAa,QAAQ,IAAI;GACpE,MAAM,gBAAgB,eAAe;GACrC,UAAU;GACV,UAAU,CAAC;EACb;CACD,CAAA;AAEL,CACF;AAEA,WAAW,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"DraggablePanel.mjs","names":["useControlledState"],"sources":["../../src/DraggablePanel/DraggablePanel.tsx"],"sourcesContent":["'use client';\n\nimport { useHover } from 'ahooks';\nimport { ConfigProvider } from 'antd';\nimport { cx } from 'antd-style';\nimport isEqual from 'fast-deep-equal';\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport type { Enable, NumberSize, Size } from 're-resizable';\nimport { Resizable } from 're-resizable';\nimport {\n type CSSProperties,\n memo,\n startTransition,\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Center } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { handleVariants, panelVariants, styles, toggleVariants } from './style';\nimport type { DraggablePanelProps } from './type';\nimport { isBelowCollapseThreshold, reversePlacement } from './utils';\n\nconst ARROW_MAP = {\n bottom: ChevronUp,\n left: ChevronRight,\n right: ChevronLeft,\n top: ChevronDown,\n} as const;\n\nconst MARGIN_MAP = {\n bottom: { marginTop: 4 },\n left: { marginRight: 4 },\n right: { marginLeft: 4 },\n top: { marginBottom: 4 },\n} as const;\n\nconst DISABLED_RESIZING: Enable = {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: false,\n right: false,\n top: false,\n topLeft: false,\n topRight: false,\n};\n\nconst toCssSize = (value: string | number | undefined, fallback: string) => {\n if (typeof value === 'number') return `${Math.max(value, 0)}px`;\n if (typeof value === 'string' && value.length > 0) return value;\n return fallback;\n};\n\nconst DraggablePanel = memo<DraggablePanelProps>(\n ({\n headerHeight = 0,\n fullscreen,\n maxHeight,\n pin = true,\n mode = 'fixed',\n children,\n placement = 'right',\n resize,\n style,\n showBorder = true,\n showHandleHighlight = false,\n showHandleWideArea = true,\n backgroundColor,\n collapseThreshold,\n size,\n stableLayout = false,\n defaultSize: customizeDefaultSize,\n minWidth,\n minHeight,\n maxWidth,\n onSizeChange,\n onSizeDragging,\n expandable = true,\n expand,\n defaultExpand = true,\n onExpandChange,\n className,\n showHandleWhenCollapsed,\n destroyOnClose,\n styles: customStyles,\n classNames,\n dir,\n }) => {\n const ref = useRef<HTMLDivElement>(null);\n const isHovering = useHover(ref);\n const isVertical = placement === 'top' || placement === 'bottom';\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const resetTransitionTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const resizableRef = useRef<Resizable>(null);\n const initialExpandedSizeRef = useRef<Size | undefined>(undefined);\n const resizeStartSizeRef = useRef<Size | undefined>(undefined);\n const outerRef = useRef<HTMLDivElement>(null);\n\n const { direction: antdDirection } = use(ConfigProvider.ConfigContext);\n const direction = dir ?? antdDirection;\n\n const internalPlacement = useMemo(() => {\n if (direction !== 'rtl') return placement;\n if (placement === 'left') return 'right';\n if (placement === 'right') return 'left';\n return placement;\n }, [direction, placement]);\n\n const cssVariables = {\n '--draggable-panel-bg': backgroundColor || '',\n '--draggable-panel-header-height': `${headerHeight}px`,\n } as Record<string, string>;\n\n const [isExpand, setIsExpand] = useControlledState(defaultExpand, {\n onChange: onExpandChange,\n value: expand,\n });\n\n const [shouldTransition, setShouldTransition] = useState(true);\n const [showExpand, setShowExpand] = useState(true);\n const usesStableLayout = stableLayout || collapseThreshold !== undefined;\n\n useEffect(() => {\n if (pin) return;\n\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n\n if (isHovering && !isExpand) {\n startTransition(() => setIsExpand(true));\n } else if (!isHovering && isExpand) {\n hoverTimeoutRef.current = setTimeout(() => {\n startTransition(() => setIsExpand(false));\n }, 150);\n }\n }, [pin, isHovering, isExpand, setIsExpand]);\n\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n if (resetTransitionTimeoutRef.current) {\n clearTimeout(resetTransitionTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n initialExpandedSizeRef.current = undefined;\n }, [internalPlacement]);\n\n const reversed = reversePlacement(internalPlacement);\n const canResizing = resize !== false && isExpand;\n\n const resizing = useMemo(\n () => ({\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: false,\n right: false,\n top: false,\n topLeft: false,\n topRight: false,\n [reversed]: true,\n ...(resize as Enable),\n }),\n [reversed, resize],\n );\n\n const defaultSize: Size = useMemo(() => {\n if (isVertical) return { height: 180, width: '100%', ...customizeDefaultSize };\n return { height: '100%', width: 280, ...customizeDefaultSize };\n }, [isVertical, customizeDefaultSize]);\n const normalizedMaxHeight = typeof maxHeight === 'number' ? Math.max(maxHeight, 0) : undefined;\n const normalizedMaxWidth = typeof maxWidth === 'number' ? Math.max(maxWidth, 0) : undefined;\n const normalizedMinHeight = typeof minHeight === 'number' ? Math.max(minHeight, 0) : undefined;\n const normalizedMinWidth = typeof minWidth === 'number' ? Math.max(minWidth, 0) : undefined;\n\n const sizeProps = useMemo(() => {\n if (!usesStableLayout && !isExpand) {\n return isVertical\n ? { minHeight: 0, size: { height: 0 } }\n : { minWidth: 0, size: { width: 0 } };\n }\n\n return {\n defaultSize,\n maxHeight: normalizedMaxHeight,\n maxWidth: normalizedMaxWidth,\n minHeight: normalizedMinHeight,\n minWidth: normalizedMinWidth,\n size: size as Size,\n };\n }, [\n usesStableLayout,\n isExpand,\n isVertical,\n defaultSize,\n normalizedMaxHeight,\n normalizedMaxWidth,\n normalizedMinHeight,\n normalizedMinWidth,\n size,\n ]);\n\n const fallbackExpandedSize = isVertical ? '180px' : '280px';\n const controlledExpandedSize = useMemo(() => {\n const controlledSize = isVertical ? size?.height : size?.width;\n if (controlledSize === undefined) return undefined;\n return toCssSize(controlledSize, fallbackExpandedSize);\n }, [isVertical, size?.height, size?.width, fallbackExpandedSize]);\n const defaultExpandedSize = useMemo(() => {\n const initialSize = isVertical ? defaultSize.height : defaultSize.width;\n return toCssSize(initialSize, fallbackExpandedSize);\n }, [isVertical, defaultSize.height, defaultSize.width, fallbackExpandedSize]);\n const [resizedExpandedSize, setResizedExpandedSize] = useState<{\n horizontal?: string;\n vertical?: string;\n }>({});\n const expandedOuterSize =\n controlledExpandedSize ??\n (isVertical ? resizedExpandedSize.vertical : resizedExpandedSize.horizontal) ??\n defaultExpandedSize;\n\n const setExpandedMainSize = useCallback(\n (nextSize: Size) => {\n if (!usesStableLayout) return;\n\n const currentSize = isVertical ? nextSize.height : nextSize.width;\n if (!currentSize) return;\n\n const normalizedSize = toCssSize(currentSize, fallbackExpandedSize);\n setResizedExpandedSize((state) =>\n isVertical\n ? { ...state, vertical: normalizedSize }\n : { ...state, horizontal: normalizedSize },\n );\n },\n [fallbackExpandedSize, isVertical, usesStableLayout],\n );\n\n const readCurrentSize = useCallback((): Size | undefined => {\n const rect = resizableRef.current?.resizable?.getBoundingClientRect();\n if (!rect) return undefined;\n\n return isVertical\n ? { height: rect.height, width: '100%' }\n : { height: '100%', width: rect.width };\n }, [isVertical]);\n\n const captureInitialExpandedSize = useCallback(() => {\n if (initialExpandedSizeRef.current) return initialExpandedSizeRef.current;\n\n const nextInitialSize = readCurrentSize();\n if (!nextInitialSize) return undefined;\n\n initialExpandedSizeRef.current = nextInitialSize;\n return nextInitialSize;\n }, [readCurrentSize]);\n\n useEffect(() => {\n if (!isExpand) return;\n captureInitialExpandedSize();\n }, [captureInitialExpandedSize, isExpand]);\n\n const toggleExpand = useCallback(() => {\n if (expandable) setIsExpand(!isExpand);\n }, [expandable, isExpand, setIsExpand]);\n\n const clampResizeSize = useCallback(\n (el: HTMLElement) => {\n const rect = el.getBoundingClientRect();\n const currentMainSize = isVertical ? rect.height : rect.width;\n const minMainSize = isVertical ? normalizedMinHeight : normalizedMinWidth;\n const maxMainSize = isVertical ? normalizedMaxHeight : normalizedMaxWidth;\n\n let clampedMainSize = currentMainSize;\n if (typeof minMainSize === 'number')\n clampedMainSize = Math.max(clampedMainSize, minMainSize);\n if (typeof maxMainSize === 'number')\n clampedMainSize = Math.min(clampedMainSize, maxMainSize);\n\n if (\n !Number.isFinite(clampedMainSize) ||\n Math.abs(clampedMainSize - currentMainSize) < 0.5\n ) {\n return { height: el.style.height, width: el.style.width };\n }\n\n const width = isVertical ? el.style.width || '100%' : `${clampedMainSize}px`;\n const height = isVertical ? `${clampedMainSize}px` : el.style.height || '100%';\n resizableRef.current?.updateSize({ height, width });\n\n return { height, width };\n },\n [\n isVertical,\n normalizedMaxHeight,\n normalizedMaxWidth,\n normalizedMinHeight,\n normalizedMinWidth,\n ],\n );\n\n const handleResize = useCallback(\n (_event: unknown, _direction: unknown, el: HTMLElement, delta: NumberSize) => {\n const nextSize = clampResizeSize(el);\n const nextCollapsePreview = isBelowCollapseThreshold({\n axis: isVertical ? 'height' : 'width',\n collapseThreshold,\n size: nextSize,\n });\n\n if (usesStableLayout && outerRef.current) {\n // Sync outer DOM width immediately so it doesn't lag behind the\n // re-resizable inline style (which would otherwise trigger a 0.2s\n // width transition on the outer/aside each frame during drag).\n const dimension = isVertical ? nextSize.height : nextSize.width;\n if (dimension) {\n const previewDimension = nextCollapsePreview ? '0px' : dimension;\n if (isVertical) outerRef.current.style.height = previewDimension;\n else outerRef.current.style.width = previewDimension;\n }\n }\n // With drag-to-collapse enabled, defer the persisted expanded size until\n // pointer release. This keeps the pre-drag width as the single source of\n // truth while the outer stable-layout layer previews collapse/restore.\n if (collapseThreshold === undefined) setExpandedMainSize(nextSize);\n onSizeDragging?.(delta, nextSize);\n },\n [\n clampResizeSize,\n collapseThreshold,\n isVertical,\n onSizeDragging,\n setExpandedMainSize,\n usesStableLayout,\n ],\n );\n\n const triggerResetWithoutTransition = useCallback(() => {\n if (resetTransitionTimeoutRef.current) {\n clearTimeout(resetTransitionTimeoutRef.current);\n }\n\n setShouldTransition(false);\n resetTransitionTimeoutRef.current = setTimeout(() => {\n setShouldTransition(true);\n }, 0);\n }, []);\n\n const handleResetSize = useCallback(() => {\n if (!canResizing) return;\n\n const resetSize = captureInitialExpandedSize();\n if (!resetSize) return;\n\n triggerResetWithoutTransition();\n\n const rect = resizableRef.current?.resizable?.getBoundingClientRect();\n const prevMainSize = rect ? (isVertical ? rect.height : rect.width) : 0;\n const resetMainSize = isVertical ? resetSize.height : resetSize.width;\n const nextMainSize = typeof resetMainSize === 'number' ? resetMainSize : prevMainSize;\n\n resizableRef.current?.updateSize(resetSize);\n setExpandedMainSize(resetSize);\n\n onSizeChange?.(\n isVertical\n ? { height: nextMainSize - prevMainSize, width: 0 }\n : { height: 0, width: nextMainSize - prevMainSize },\n resetSize,\n );\n }, [\n canResizing,\n captureInitialExpandedSize,\n isVertical,\n onSizeChange,\n setExpandedMainSize,\n triggerResetWithoutTransition,\n ]);\n\n const handleResizeStart = useCallback(\n (event: { detail?: number }) => {\n if (event.detail === 2) {\n handleResetSize();\n return false;\n }\n\n if (resetTransitionTimeoutRef.current) {\n clearTimeout(resetTransitionTimeoutRef.current);\n resetTransitionTimeoutRef.current = undefined;\n }\n\n resizeStartSizeRef.current = readCurrentSize();\n\n // Synchronously disable the outer transition so the first drag frame\n // does not animate. `setShouldTransition(false)` below is asynchronous\n // and would only take effect after the next React commit.\n if (usesStableLayout && outerRef.current) {\n outerRef.current.style.transition = 'none';\n }\n setShouldTransition(false);\n setShowExpand(false);\n },\n [handleResetSize, readCurrentSize, usesStableLayout],\n );\n\n const handleResizeStop = useCallback(\n (_event: unknown, _direction: unknown, el: HTMLElement, delta: NumberSize) => {\n const nextSize = clampResizeSize(el);\n const shouldCollapse = isBelowCollapseThreshold({\n axis: isVertical ? 'height' : 'width',\n collapseThreshold,\n size: nextSize,\n });\n const committedSize = shouldCollapse ? (resizeStartSizeRef.current ?? nextSize) : nextSize;\n\n resizableRef.current?.updateSize(committedSize);\n if (!shouldCollapse) setExpandedMainSize(committedSize);\n setShouldTransition(true);\n setShowExpand(true);\n // Keep the collapsed main-axis size at zero until the controlled\n // `expand=false` value arrives. Clearing it here would reveal the panel\n // for one render between preview teardown and controlled-state commit.\n if (usesStableLayout && outerRef.current) {\n outerRef.current.style.removeProperty('transition');\n if (shouldCollapse) {\n if (isVertical) outerRef.current.style.height = '0px';\n else outerRef.current.style.width = '0px';\n } else {\n outerRef.current.style.removeProperty('width');\n outerRef.current.style.removeProperty('height');\n }\n }\n if (shouldCollapse) setIsExpand(false);\n\n resizeStartSizeRef.current = undefined;\n onSizeChange?.(delta, committedSize);\n },\n [\n clampResizeSize,\n collapseThreshold,\n isVertical,\n onSizeChange,\n setExpandedMainSize,\n setIsExpand,\n usesStableLayout,\n ],\n );\n\n const resizeHandleClassName = useMemo(\n () =>\n cx(handleVariants({ placement: reversed }), showHandleHighlight && styles.handleHighlight),\n [reversed, showHandleHighlight],\n );\n\n if (fullscreen) {\n return (\n <div className={cx(styles.fullscreen, className)} style={cssVariables}>\n {children}\n </div>\n );\n }\n\n const Arrow = ARROW_MAP[internalPlacement] ?? ChevronLeft;\n const stableOuterFlex = usesStableLayout\n ? ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n } as const)\n : {};\n\n const sidebarOuterStyle = isVertical\n ? {\n height: isExpand ? expandedOuterSize : 0,\n overflow: 'hidden',\n transition: shouldTransition ? 'height 0.2s var(--ant-motion-ease-out, ease)' : 'none',\n width: '100%',\n ...stableOuterFlex,\n }\n : {\n overflow: 'hidden',\n transition: shouldTransition ? 'width 0.2s var(--ant-motion-ease-out, ease)' : 'none',\n width: isExpand ? expandedOuterSize : 0,\n ...(usesStableLayout\n ? {\n ...stableOuterFlex,\n flex: 1,\n minWidth: 0,\n height: '100%',\n }\n : {}),\n };\n\n const stableInnerStyle: CSSProperties = {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n height: '100%',\n minHeight: 0,\n minWidth: 0,\n width: '100%',\n };\n const sidebarInnerStyle: CSSProperties = usesStableLayout\n ? stableInnerStyle\n : isVertical\n ? { height: '100%', width: '100%' }\n : { width: '100%' };\n\n const stableAsideStyle: CSSProperties = usesStableLayout\n ? {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n ...(mode === 'fixed' ? { height: '100%' } : {}),\n }\n : {};\n\n const stableResizableStyle: CSSProperties = {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n height: '100%',\n minHeight: 0,\n minWidth: 0,\n width: '100%',\n };\n\n const panelNode = (!destroyOnClose || isExpand) && (\n <Resizable\n ref={resizableRef}\n {...sizeProps}\n className={cx(styles.panel, classNames?.content)}\n enable={canResizing ? (resizing as Enable) : DISABLED_RESIZING}\n handleClasses={\n canResizing\n ? {\n [reversed]: resizeHandleClassName,\n }\n : {}\n }\n style={{\n ...cssVariables,\n transition: shouldTransition ? undefined : 'none',\n ...(usesStableLayout ? stableResizableStyle : {}),\n ...style,\n }}\n onResize={handleResize}\n onResizeStart={handleResizeStart}\n onResizeStop={handleResizeStop}\n >\n {usesStableLayout ? <div style={sidebarInnerStyle}>{children}</div> : children}\n </Resizable>\n );\n\n return (\n <aside\n dir={dir}\n ref={ref}\n style={{ ...cssVariables, ...stableAsideStyle }}\n className={cx(\n panelVariants({ isExpand, mode, placement: internalPlacement, showBorder }),\n className,\n )}\n >\n {expandable && showExpand && (\n <Center\n className={toggleVariants({ placement: internalPlacement, showHandleWideArea })}\n style={{\n opacity: isExpand ? (pin ? undefined : 0) : showHandleWhenCollapsed ? 1 : 0,\n }}\n >\n <Center\n className={classNames?.handle}\n style={customStyles?.handle}\n onClick={toggleExpand}\n >\n <Icon\n className={styles.handlerIcon}\n icon={Arrow}\n size={16}\n style={{\n ...MARGIN_MAP[internalPlacement],\n transform: `rotate(${isExpand ? 180 : 0}deg)`,\n transition: 'transform 0.3s ease',\n }}\n />\n </Center>\n </Center>\n )}\n {usesStableLayout ? (\n <div ref={outerRef} style={sidebarOuterStyle}>\n {panelNode}\n </div>\n ) : (\n panelNode\n )}\n </aside>\n );\n },\n isEqual,\n);\n\nDraggablePanel.displayName = 'DraggablePanel';\n\nexport default DraggablePanel;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DraggablePanel.mjs","names":["useControlledState"],"sources":["../../src/DraggablePanel/DraggablePanel.tsx"],"sourcesContent":["'use client';\n\nimport { useHover } from 'ahooks';\nimport { ConfigProvider } from 'antd';\nimport { cx } from 'antd-style';\nimport isEqual from 'fast-deep-equal';\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport type { Enable, NumberSize, Size } from 're-resizable';\nimport { Resizable } from 're-resizable';\nimport {\n type CSSProperties,\n memo,\n startTransition,\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Center } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { handleVariants, panelVariants, styles, toggleVariants } from './style';\nimport type { DraggablePanelProps } from './type';\nimport { isBelowCollapseThreshold, reversePlacement } from './utils';\n\nconst ARROW_MAP = {\n bottom: ChevronUp,\n left: ChevronRight,\n right: ChevronLeft,\n top: ChevronDown,\n} as const;\n\nconst MARGIN_MAP = {\n bottom: { marginTop: 4 },\n left: { marginRight: 4 },\n right: { marginLeft: 4 },\n top: { marginBottom: 4 },\n} as const;\n\nconst DISABLED_RESIZING: Enable = {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: false,\n right: false,\n top: false,\n topLeft: false,\n topRight: false,\n};\n\nconst toCssSize = (value: string | number | undefined, fallback: string) => {\n if (typeof value === 'number') return `${Math.max(value, 0)}px`;\n if (typeof value === 'string' && value.length > 0) return value;\n return fallback;\n};\n\nconst DraggablePanel = memo<DraggablePanelProps>(\n ({\n headerHeight = 0,\n fullscreen,\n maxHeight,\n pin = true,\n mode = 'fixed',\n children,\n placement = 'right',\n resize,\n style,\n showBorder = true,\n showHandleHighlight = false,\n showHandleWideArea = true,\n backgroundColor,\n collapseThreshold,\n size,\n stableLayout = false,\n defaultSize: customizeDefaultSize,\n minWidth,\n minHeight,\n maxWidth,\n onSizeChange,\n onSizeDragging,\n expandable = true,\n expand,\n defaultExpand = true,\n onExpandChange,\n className,\n showHandleWhenCollapsed,\n destroyOnClose,\n styles: customStyles,\n classNames,\n dir,\n }) => {\n const ref = useRef<HTMLDivElement>(null);\n const isHovering = useHover(ref);\n const isVertical = placement === 'top' || placement === 'bottom';\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const resetTransitionTimeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const resizableRef = useRef<Resizable>(null);\n const initialExpandedSizeRef = useRef<Size | undefined>(undefined);\n const resizeStartSizeRef = useRef<Size | undefined>(undefined);\n const outerRef = useRef<HTMLDivElement>(null);\n\n const { direction: antdDirection } = use(ConfigProvider.ConfigContext);\n const direction = dir ?? antdDirection;\n\n const internalPlacement = useMemo(() => {\n if (direction !== 'rtl') return placement;\n if (placement === 'left') return 'right';\n if (placement === 'right') return 'left';\n return placement;\n }, [direction, placement]);\n\n const cssVariables = {\n '--draggable-panel-bg': backgroundColor || '',\n '--draggable-panel-header-height': `${headerHeight}px`,\n } as Record<string, string>;\n\n const [isExpand, setIsExpand] = useControlledState(defaultExpand, {\n onChange: onExpandChange,\n value: expand,\n });\n\n const [shouldTransition, setShouldTransition] = useState(true);\n const [showExpand, setShowExpand] = useState(true);\n const usesStableLayout = stableLayout || collapseThreshold !== undefined;\n\n useEffect(() => {\n if (pin) return;\n\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n\n if (isHovering && !isExpand) {\n startTransition(() => setIsExpand(true));\n } else if (!isHovering && isExpand) {\n hoverTimeoutRef.current = setTimeout(() => {\n startTransition(() => setIsExpand(false));\n }, 150);\n }\n }, [pin, isHovering, isExpand, setIsExpand]);\n\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n if (resetTransitionTimeoutRef.current) {\n clearTimeout(resetTransitionTimeoutRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n initialExpandedSizeRef.current = undefined;\n }, [internalPlacement]);\n\n const reversed = reversePlacement(internalPlacement);\n const canResizing = resize !== false && isExpand;\n\n const resizing = useMemo(\n () => ({\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: false,\n right: false,\n top: false,\n topLeft: false,\n topRight: false,\n [reversed]: true,\n ...(resize as Enable),\n }),\n [reversed, resize],\n );\n\n const defaultSize: Size = useMemo(() => {\n if (isVertical) return { height: 180, width: '100%', ...customizeDefaultSize };\n return { height: '100%', width: 280, ...customizeDefaultSize };\n }, [isVertical, customizeDefaultSize]);\n const normalizedMaxHeight = typeof maxHeight === 'number' ? Math.max(maxHeight, 0) : undefined;\n const normalizedMaxWidth = typeof maxWidth === 'number' ? Math.max(maxWidth, 0) : undefined;\n const normalizedMinHeight = typeof minHeight === 'number' ? Math.max(minHeight, 0) : undefined;\n const normalizedMinWidth = typeof minWidth === 'number' ? Math.max(minWidth, 0) : undefined;\n\n const sizeProps = useMemo(() => {\n if (!usesStableLayout && !isExpand) {\n return isVertical\n ? { minHeight: 0, size: { height: 0 } }\n : { minWidth: 0, size: { width: 0 } };\n }\n\n return {\n defaultSize,\n maxHeight: normalizedMaxHeight,\n maxWidth: normalizedMaxWidth,\n minHeight: normalizedMinHeight,\n minWidth: normalizedMinWidth,\n size: size as Size,\n };\n }, [\n usesStableLayout,\n isExpand,\n isVertical,\n defaultSize,\n normalizedMaxHeight,\n normalizedMaxWidth,\n normalizedMinHeight,\n normalizedMinWidth,\n size,\n ]);\n\n const fallbackExpandedSize = isVertical ? '180px' : '280px';\n const controlledExpandedSize = useMemo(() => {\n const controlledSize = isVertical ? size?.height : size?.width;\n if (controlledSize === undefined) return undefined;\n return toCssSize(controlledSize, fallbackExpandedSize);\n }, [isVertical, size?.height, size?.width, fallbackExpandedSize]);\n const defaultExpandedSize = useMemo(() => {\n const initialSize = isVertical ? defaultSize.height : defaultSize.width;\n return toCssSize(initialSize, fallbackExpandedSize);\n }, [isVertical, defaultSize.height, defaultSize.width, fallbackExpandedSize]);\n const [resizedExpandedSize, setResizedExpandedSize] = useState<{\n horizontal?: string;\n vertical?: string;\n }>({});\n const expandedOuterSize =\n controlledExpandedSize ??\n (isVertical ? resizedExpandedSize.vertical : resizedExpandedSize.horizontal) ??\n defaultExpandedSize;\n\n const setExpandedMainSize = useCallback(\n (nextSize: Size) => {\n if (!usesStableLayout) return;\n\n const currentSize = isVertical ? nextSize.height : nextSize.width;\n if (!currentSize) return;\n\n const normalizedSize = toCssSize(currentSize, fallbackExpandedSize);\n setResizedExpandedSize((state) =>\n isVertical\n ? { ...state, vertical: normalizedSize }\n : { ...state, horizontal: normalizedSize },\n );\n },\n [fallbackExpandedSize, isVertical, usesStableLayout],\n );\n\n const readCurrentSize = useCallback((): Size | undefined => {\n const rect = resizableRef.current?.resizable?.getBoundingClientRect();\n if (!rect) return undefined;\n\n return isVertical\n ? { height: rect.height, width: '100%' }\n : { height: '100%', width: rect.width };\n }, [isVertical]);\n\n const captureInitialExpandedSize = useCallback(() => {\n if (initialExpandedSizeRef.current) return initialExpandedSizeRef.current;\n\n const nextInitialSize = readCurrentSize();\n if (!nextInitialSize) return undefined;\n\n initialExpandedSizeRef.current = nextInitialSize;\n return nextInitialSize;\n }, [readCurrentSize]);\n\n useEffect(() => {\n if (!isExpand) return;\n captureInitialExpandedSize();\n }, [captureInitialExpandedSize, isExpand]);\n\n const toggleExpand = useCallback(() => {\n if (expandable) setIsExpand(!isExpand);\n }, [expandable, isExpand, setIsExpand]);\n\n const clampResizeSize = useCallback(\n (el: HTMLElement) => {\n const rect = el.getBoundingClientRect();\n const currentMainSize = isVertical ? rect.height : rect.width;\n const minMainSize = isVertical ? normalizedMinHeight : normalizedMinWidth;\n const maxMainSize = isVertical ? normalizedMaxHeight : normalizedMaxWidth;\n\n let clampedMainSize = currentMainSize;\n if (typeof minMainSize === 'number')\n clampedMainSize = Math.max(clampedMainSize, minMainSize);\n if (typeof maxMainSize === 'number')\n clampedMainSize = Math.min(clampedMainSize, maxMainSize);\n\n if (\n !Number.isFinite(clampedMainSize) ||\n Math.abs(clampedMainSize - currentMainSize) < 0.5\n ) {\n return { height: el.style.height, width: el.style.width };\n }\n\n const width = isVertical ? el.style.width || '100%' : `${clampedMainSize}px`;\n const height = isVertical ? `${clampedMainSize}px` : el.style.height || '100%';\n resizableRef.current?.updateSize({ height, width });\n\n return { height, width };\n },\n [\n isVertical,\n normalizedMaxHeight,\n normalizedMaxWidth,\n normalizedMinHeight,\n normalizedMinWidth,\n ],\n );\n\n const handleResize = useCallback(\n (_event: unknown, _direction: unknown, el: HTMLElement, delta: NumberSize) => {\n const nextSize = clampResizeSize(el);\n const nextCollapsePreview = isBelowCollapseThreshold({\n axis: isVertical ? 'height' : 'width',\n collapseThreshold,\n size: nextSize,\n });\n\n if (usesStableLayout && outerRef.current) {\n // Sync outer DOM width immediately so it doesn't lag behind the\n // re-resizable inline style (which would otherwise trigger a 0.2s\n // width transition on the outer/aside each frame during drag).\n const dimension = isVertical ? nextSize.height : nextSize.width;\n if (dimension) {\n const previewDimension = nextCollapsePreview ? '0px' : dimension;\n if (isVertical) outerRef.current.style.height = previewDimension;\n else outerRef.current.style.width = previewDimension;\n }\n }\n // With drag-to-collapse enabled, defer the persisted expanded size until\n // pointer release. This keeps the pre-drag width as the single source of\n // truth while the outer stable-layout layer previews collapse/restore.\n if (collapseThreshold === undefined) setExpandedMainSize(nextSize);\n onSizeDragging?.(delta, nextSize);\n },\n [\n clampResizeSize,\n collapseThreshold,\n isVertical,\n onSizeDragging,\n setExpandedMainSize,\n usesStableLayout,\n ],\n );\n\n const triggerResetWithoutTransition = useCallback(() => {\n if (resetTransitionTimeoutRef.current) {\n clearTimeout(resetTransitionTimeoutRef.current);\n }\n\n setShouldTransition(false);\n resetTransitionTimeoutRef.current = setTimeout(() => {\n setShouldTransition(true);\n }, 0);\n }, []);\n\n const handleResetSize = useCallback(() => {\n if (!canResizing) return;\n\n const resetSize = captureInitialExpandedSize();\n if (!resetSize) return;\n\n triggerResetWithoutTransition();\n\n const rect = resizableRef.current?.resizable?.getBoundingClientRect();\n const prevMainSize = rect ? (isVertical ? rect.height : rect.width) : 0;\n const resetMainSize = isVertical ? resetSize.height : resetSize.width;\n const nextMainSize = typeof resetMainSize === 'number' ? resetMainSize : prevMainSize;\n\n resizableRef.current?.updateSize(resetSize);\n setExpandedMainSize(resetSize);\n\n onSizeChange?.(\n isVertical\n ? { height: nextMainSize - prevMainSize, width: 0 }\n : { height: 0, width: nextMainSize - prevMainSize },\n resetSize,\n );\n }, [\n canResizing,\n captureInitialExpandedSize,\n isVertical,\n onSizeChange,\n setExpandedMainSize,\n triggerResetWithoutTransition,\n ]);\n\n const handleResizeStart = useCallback(\n (event: { detail?: number }) => {\n if (event.detail === 2) {\n handleResetSize();\n return false;\n }\n\n if (resetTransitionTimeoutRef.current) {\n clearTimeout(resetTransitionTimeoutRef.current);\n resetTransitionTimeoutRef.current = undefined;\n }\n\n resizeStartSizeRef.current = readCurrentSize();\n\n // Synchronously disable the outer transition so the first drag frame\n // does not animate. `setShouldTransition(false)` below is asynchronous\n // and would only take effect after the next React commit.\n if (usesStableLayout && outerRef.current) {\n outerRef.current.style.transition = 'none';\n }\n setShouldTransition(false);\n setShowExpand(false);\n },\n [handleResetSize, readCurrentSize, usesStableLayout],\n );\n\n const handleResizeStop = useCallback(\n (_event: unknown, _direction: unknown, el: HTMLElement, delta: NumberSize) => {\n const nextSize = clampResizeSize(el);\n const shouldCollapse = isBelowCollapseThreshold({\n axis: isVertical ? 'height' : 'width',\n collapseThreshold,\n size: nextSize,\n });\n const committedSize = shouldCollapse ? (resizeStartSizeRef.current ?? nextSize) : nextSize;\n\n resizableRef.current?.updateSize(committedSize);\n if (!shouldCollapse) setExpandedMainSize(committedSize);\n setShouldTransition(true);\n setShowExpand(true);\n // Keep the collapsed main-axis size at zero until the controlled\n // `expand=false` value arrives. Clearing it here would reveal the panel\n // for one render between preview teardown and controlled-state commit.\n if (usesStableLayout && outerRef.current) {\n outerRef.current.style.removeProperty('transition');\n if (shouldCollapse) {\n if (isVertical) outerRef.current.style.height = '0px';\n else outerRef.current.style.width = '0px';\n } else {\n outerRef.current.style.removeProperty('width');\n outerRef.current.style.removeProperty('height');\n }\n }\n if (shouldCollapse) setIsExpand(false);\n\n resizeStartSizeRef.current = undefined;\n onSizeChange?.(delta, committedSize);\n },\n [\n clampResizeSize,\n collapseThreshold,\n isVertical,\n onSizeChange,\n setExpandedMainSize,\n setIsExpand,\n usesStableLayout,\n ],\n );\n\n const resizeHandleClassName = useMemo(\n () =>\n cx(handleVariants({ placement: reversed }), showHandleHighlight && styles.handleHighlight),\n [reversed, showHandleHighlight],\n );\n\n if (fullscreen) {\n return (\n <div className={cx(styles.fullscreen, className)} style={cssVariables}>\n {children}\n </div>\n );\n }\n\n const Arrow = ARROW_MAP[internalPlacement] ?? ChevronLeft;\n const stableOuterFlex = usesStableLayout\n ? ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n } as const)\n : {};\n\n const sidebarOuterStyle = isVertical\n ? {\n height: isExpand ? expandedOuterSize : 0,\n overflow: 'hidden',\n transition: shouldTransition ? 'height 0.2s var(--ant-motion-ease-out, ease)' : 'none',\n width: '100%',\n ...stableOuterFlex,\n }\n : {\n overflow: 'hidden',\n transition: shouldTransition ? 'width 0.2s var(--ant-motion-ease-out, ease)' : 'none',\n width: isExpand ? expandedOuterSize : 0,\n ...(usesStableLayout\n ? {\n ...stableOuterFlex,\n flex: 1,\n minWidth: 0,\n height: '100%',\n }\n : {}),\n };\n\n const stableInnerStyle: CSSProperties = {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n height: '100%',\n minHeight: 0,\n minWidth: 0,\n width: '100%',\n };\n const sidebarInnerStyle: CSSProperties = usesStableLayout\n ? stableInnerStyle\n : isVertical\n ? { height: '100%', width: '100%' }\n : { width: '100%' };\n\n const stableAsideStyle: CSSProperties = usesStableLayout\n ? {\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n ...(mode === 'fixed' ? { height: '100%' } : {}),\n }\n : {};\n\n const stableResizableStyle: CSSProperties = {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n height: '100%',\n minHeight: 0,\n minWidth: 0,\n width: '100%',\n };\n\n const panelNode = (!destroyOnClose || isExpand) && (\n <Resizable\n ref={resizableRef}\n {...sizeProps}\n className={cx(styles.panel, classNames?.content)}\n enable={canResizing ? (resizing as Enable) : DISABLED_RESIZING}\n handleClasses={\n canResizing\n ? {\n [reversed]: resizeHandleClassName,\n }\n : {}\n }\n style={{\n ...cssVariables,\n transition: shouldTransition ? undefined : 'none',\n ...(usesStableLayout ? stableResizableStyle : {}),\n ...style,\n }}\n onResize={handleResize}\n onResizeStart={handleResizeStart}\n onResizeStop={handleResizeStop}\n >\n {usesStableLayout ? <div style={sidebarInnerStyle}>{children}</div> : children}\n </Resizable>\n );\n\n return (\n <aside\n dir={dir}\n ref={ref}\n style={{ ...cssVariables, ...stableAsideStyle }}\n className={cx(\n panelVariants({ isExpand, mode, placement: internalPlacement, showBorder }),\n className,\n )}\n >\n {expandable && showExpand && (\n <Center\n className={toggleVariants({ placement: internalPlacement, showHandleWideArea })}\n style={{\n opacity: isExpand ? (pin ? undefined : 0) : showHandleWhenCollapsed ? 1 : 0,\n }}\n >\n <Center\n className={classNames?.handle}\n style={customStyles?.handle}\n onClick={toggleExpand}\n >\n <Icon\n className={styles.handlerIcon}\n icon={Arrow}\n size={16}\n style={{\n ...MARGIN_MAP[internalPlacement],\n transform: `rotate(${isExpand ? 180 : 0}deg)`,\n transition: 'transform 0.3s ease',\n }}\n />\n </Center>\n </Center>\n )}\n {usesStableLayout ? (\n <div ref={outerRef} style={sidebarOuterStyle}>\n {panelNode}\n </div>\n ) : (\n panelNode\n )}\n </aside>\n );\n },\n isEqual,\n);\n\nDraggablePanel.displayName = 'DraggablePanel';\n\nexport default DraggablePanel;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DraggablePanelHeader.mjs","names":["useControlledState","Flexbox"],"sources":["../../../src/DraggablePanel/components/DraggablePanelHeader.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { PanelLeft, Pin, PinOff } from 'lucide-react';\nimport { memo } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport { type DivProps } from '@/types';\n\nimport { styles } from './style';\n\nexport interface DraggablePanelHeaderProps extends Omit<DivProps, 'children'> {\n pin?: boolean;\n position?: 'left' | 'right';\n setExpand?: (expand: boolean) => void;\n setPin?: (pin: boolean) => void;\n title?: string;\n}\n\nconst DraggablePanelHeader = memo<DraggablePanelHeaderProps>((props) => {\n const { pin, setPin, className, setExpand, title, position = 'left', ...rest } = props;\n\n const [isPinned, setIsPinned] = useControlledState(false, {\n onChange: setPin,\n value: pin,\n });\n\n const panelIcon = (\n <ActionIcon icon={PanelLeft} size={'small'} onClick={() => setExpand?.(false)} />\n );\n const pinIcon = (\n <ActionIcon\n active={pin}\n icon={pin ? Pin : PinOff}\n size={'small'}\n onClick={() => setIsPinned(!isPinned)}\n />\n );\n return (\n <Flexbox\n horizontal\n align={'center'}\n className={cx(styles.header, className)}\n flex={'none'}\n gap={8}\n justify={'space-between'}\n {...rest}\n >\n {position === 'left' ? panelIcon : pinIcon}\n {title}\n {position === 'left' ? pinIcon : panelIcon}\n </Flexbox>\n );\n});\n\nDraggablePanelHeader.displayName = 'DraggablePanelHeader';\n\nexport default DraggablePanelHeader;\n"],"mappings":";;;;;;;;;;AAqBA,MAAM,uBAAuB,MAAiC,UAAU;CACtE,MAAM,EAAE,KAAK,QAAQ,WAAW,WAAW,OAAO,WAAW,QAAQ,GAAG,SAAS;CAEjF,MAAM,CAAC,UAAU,eAAeA,cAAmB,OAAO;EACxD,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,YACJ,oBAAC,YAAD;EAAY,MAAM;EAAW,MAAM;EAAS,eAAe,YAAY,KAAK;CAAI,CAAA;CAElF,MAAM,UACJ,oBAAC,YAAD;EACE,QAAQ;EACR,MAAM,MAAM,MAAM;EAClB,MAAM;EACN,eAAe,YAAY,CAAC,QAAQ;CACrC,CAAA;CAEH,OACE,qBAACC,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW,GAAG,OAAO,QAAQ,SAAS;EACtC,MAAM;EACN,KAAK;EACL,SAAS;EACT,GAAI;YAPN;GASG,aAAa,SAAS,YAAY;GAClC;GACA,aAAa,SAAS,UAAU;EAC1B;;AAEb,CAAC;AAED,qBAAqB,cAAc"}
1
+ {"version":3,"file":"DraggablePanelHeader.mjs","names":["useControlledState","Flexbox"],"sources":["../../../src/DraggablePanel/components/DraggablePanelHeader.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { PanelLeft, Pin, PinOff } from 'lucide-react';\nimport { memo } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport { type DivProps } from '@/types';\n\nimport { styles } from './style';\n\nexport interface DraggablePanelHeaderProps extends Omit<DivProps, 'children'> {\n pin?: boolean;\n position?: 'left' | 'right';\n setExpand?: (expand: boolean) => void;\n setPin?: (pin: boolean) => void;\n title?: string;\n}\n\nconst DraggablePanelHeader = memo<DraggablePanelHeaderProps>((props) => {\n const { pin, setPin, className, setExpand, title, position = 'left', ...rest } = props;\n\n const [isPinned, setIsPinned] = useControlledState(false, {\n onChange: setPin,\n value: pin,\n });\n\n const panelIcon = (\n <ActionIcon icon={PanelLeft} size={'small'} onClick={() => setExpand?.(false)} />\n );\n const pinIcon = (\n <ActionIcon\n active={pin}\n icon={pin ? Pin : PinOff}\n size={'small'}\n onClick={() => setIsPinned(!isPinned)}\n />\n );\n return (\n <Flexbox\n horizontal\n align={'center'}\n className={cx(styles.header, className)}\n flex={'none'}\n gap={8}\n justify={'space-between'}\n {...rest}\n >\n {position === 'left' ? panelIcon : pinIcon}\n {title}\n {position === 'left' ? pinIcon : panelIcon}\n </Flexbox>\n );\n});\n\nDraggablePanelHeader.displayName = 'DraggablePanelHeader';\n\nexport default DraggablePanelHeader;\n"],"mappings":";;;;;;;;;;AAqBA,MAAM,uBAAuB,MAAiC,UAAU;CACtE,MAAM,EAAE,KAAK,QAAQ,WAAW,WAAW,OAAO,WAAW,QAAQ,GAAG,SAAS;CAEjF,MAAM,CAAC,UAAU,eAAeA,cAAmB,OAAO;EACxD,UAAU;EACV,OAAO;CACT,CAAC;CAED,MAAM,YACJ,oBAAC,YAAD;EAAY,MAAM;EAAW,MAAM;EAAS,eAAe,YAAY,KAAK;CAAI,CAAA;CAElF,MAAM,UACJ,oBAAC,YAAD;EACE,QAAQ;EACR,MAAM,MAAM,MAAM;EAClB,MAAM;EACN,eAAe,YAAY,CAAC,QAAQ;CACrC,CAAA;CAEH,OACE,qBAACC,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW,GAAG,OAAO,QAAQ,SAAS;EACtC,MAAM;EACN,KAAK;EACL,SAAS;EACT,GAAI;EAPN,UAAA;GASG,aAAa,SAAS,YAAY;GAClC;GACA,aAAa,SAAS,UAAU;EAC1B;;AAEb,CAAC;AAED,qBAAqB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableSideNav.mjs","names":["useControlledState","Flexbox"],"sources":["../../src/DraggableSideNav/DraggableSideNav.tsx"],"sourcesContent":["'use client';\n\nimport { useHover } from 'ahooks';\nimport { cx } from 'antd-style';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Resizable, type ResizeCallback } from 're-resizable';\nimport {\n type CSSProperties,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { styles } from './style';\nimport type { DraggableSideNavProps } from './type';\n\nconst DEFAULT_MIN_WIDTH = 64; // 最小宽度即折叠宽度\nconst DEFAULT_EXPAND = true;\nconst DEFAULT_EXPANDED_WIDTH = 280;\nconst ANIMATION_DURATION = 300;\nconst COLLAPSE_ANIMATION_DELAY = 200;\n\n// Pre-define static objects to avoid recreating\nconst RESIZE_DISABLED = {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: false,\n right: false,\n top: false,\n topLeft: false,\n topRight: false,\n};\n\n// State reducer for better state management\ninterface SideNavState {\n expandedWidth: number;\n internalWidth: number;\n isAnimating: boolean;\n isResizing: boolean;\n renderExpand: boolean;\n}\n\ntype SideNavAction =\n | { type: 'START_RESIZE' }\n | { type: 'STOP_RESIZE' }\n | { type: 'START_ANIMATION' }\n | { type: 'STOP_ANIMATION' }\n | { payload: number; type: 'SET_WIDTH' }\n | { payload: number; type: 'SET_EXPANDED_WIDTH' }\n | { payload: boolean; type: 'SET_RENDER_EXPAND' }\n | { payload: number; type: 'ANIMATE_EXPAND' }\n | { payload: number; type: 'ANIMATE_COLLAPSE' };\n\nfunction sideNavReducer(state: SideNavState, action: SideNavAction): SideNavState {\n switch (action.type) {\n case 'START_RESIZE': {\n return { ...state, isResizing: true };\n }\n case 'STOP_RESIZE': {\n return { ...state, isResizing: false };\n }\n case 'START_ANIMATION': {\n return { ...state, isAnimating: true };\n }\n case 'STOP_ANIMATION': {\n return { ...state, isAnimating: false };\n }\n case 'SET_WIDTH': {\n return { ...state, internalWidth: action.payload };\n }\n case 'SET_EXPANDED_WIDTH': {\n return { ...state, expandedWidth: action.payload };\n }\n case 'SET_RENDER_EXPAND': {\n return { ...state, renderExpand: action.payload };\n }\n case 'ANIMATE_EXPAND': {\n return { ...state, internalWidth: action.payload, renderExpand: true };\n }\n case 'ANIMATE_COLLAPSE': {\n return { ...state, internalWidth: action.payload };\n }\n default: {\n return state;\n }\n }\n}\n\nconst DraggableSideNav = memo<DraggableSideNavProps>(\n ({\n body,\n className,\n classNames,\n defaultExpand = DEFAULT_EXPAND,\n defaultWidth,\n expand,\n expandable = true,\n footer,\n header,\n maxWidth,\n minWidth = DEFAULT_MIN_WIDTH,\n onExpandChange,\n onWidthChange,\n onWidthDragging,\n placement = 'left',\n resizable = true,\n showBorder = true,\n showHandle = true,\n showHandleWhenCollapsed = false,\n showHandleHighlight = false,\n backgroundColor,\n styles: customStyles,\n width,\n ...rest\n }) => {\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--draggable-side-nav-bg': backgroundColor || '',\n }),\n [backgroundColor],\n );\n const ref = useRef<HTMLDivElement>(null);\n const isHovering = useHover(ref);\n\n // Expand state management\n const [isExpand, setIsExpand] = useControlledState(defaultExpand, {\n onChange: onExpandChange,\n value: expand,\n });\n\n // Use refs for animation timeouts to avoid memory leaks\n const animationTimeoutRef = useRef<any>(undefined);\n const collapseTimeoutRef = useRef<any>(undefined);\n\n // Compute default expanded width - memoize to avoid recalculation\n const computedDefaultExpandedWidth = useMemo(\n () => defaultWidth || DEFAULT_EXPANDED_WIDTH,\n [defaultWidth],\n );\n\n // Initialize state with useReducer for better performance\n const initialState: SideNavState = {\n expandedWidth: width ?? computedDefaultExpandedWidth,\n internalWidth: isExpand ? (width ?? computedDefaultExpandedWidth) : minWidth,\n isAnimating: false,\n isResizing: false,\n renderExpand: isExpand,\n };\n\n const [state, dispatch] = useReducer(sideNavReducer, initialState);\n\n // 计算折叠阈值:展开最小宽度和折叠宽度的中间值\n const collapseThreshold = useMemo(() => {\n return minWidth + (state.expandedWidth - minWidth) / 3;\n }, [minWidth, state.expandedWidth]);\n\n // Toggle expand state with smooth animation\n const toggleExpand = useCallback(() => {\n if (!expandable) return;\n\n // 在动画或拖拽期间阻止新的切换操作,避免状态混乱\n if (state.isAnimating || state.isResizing) return;\n\n // 清除之前的动画\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n\n // 立即设置动画状态,避免其他 useEffect 干扰\n dispatch({ type: 'START_ANIMATION' });\n setIsExpand(!isExpand);\n\n // 动画完成后重置状态 - 与宽度动画时长一致\n animationTimeoutRef.current = setTimeout(() => {\n dispatch({ type: 'STOP_ANIMATION' });\n }, ANIMATION_DURATION);\n }, [expandable, isExpand, setIsExpand, state.isAnimating, state.isResizing]);\n\n // 用于跟踪上一次的 expand 状态,以检测外部变化\n const prevExpandRef = useRef(isExpand);\n\n // 监听外部 expand prop 变化,触发动画\n useEffect(() => {\n // 检测到 expand 状态变化,且不在拖拽和动画中\n if (prevExpandRef.current !== isExpand && !state.isResizing && !state.isAnimating) {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n\n // 立即设置动画状态,避免其他 useEffect 干扰\n dispatch({ type: 'START_ANIMATION' });\n\n animationTimeoutRef.current = setTimeout(() => {\n dispatch({ type: 'STOP_ANIMATION' });\n }, ANIMATION_DURATION);\n\n prevExpandRef.current = isExpand;\n }\n }, [isExpand, state.isResizing, state.isAnimating]);\n\n // 处理展开/折叠状态变化时的宽度动画和内容切换时机\n useEffect(() => {\n if (state.isAnimating) {\n // 使用 requestAnimationFrame 确保动画平滑\n const rafId = requestAnimationFrame(() => {\n if (isExpand) {\n // 展开动画:立即切换内容(先切换内容,再开始宽度动画)\n dispatch({ payload: state.expandedWidth, type: 'ANIMATE_EXPAND' });\n } else {\n // 折叠动画:延迟切换内容,在动画接近结束时才切换(300ms,略早于动画结束)\n dispatch({ payload: minWidth, type: 'ANIMATE_COLLAPSE' });\n\n if (collapseTimeoutRef.current) {\n clearTimeout(collapseTimeoutRef.current);\n }\n collapseTimeoutRef.current = setTimeout(() => {\n dispatch({ payload: false, type: 'SET_RENDER_EXPAND' });\n }, COLLAPSE_ANIMATION_DELAY);\n }\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }\n }, [isExpand, state.isAnimating, minWidth, state.expandedWidth]);\n\n // 同步非动画期间的 renderExpand 状态(如拖拽)\n // 使用 ref 追踪上一次的 isResizing 状态,只在拖拽结束时同步\n const prevIsResizingRef = useRef(state.isResizing);\n useEffect(() => {\n const wasResizing = prevIsResizingRef.current;\n prevIsResizingRef.current = state.isResizing;\n\n // 只在拖拽刚结束时同步 renderExpand,避免干扰正常的展开/折叠动画\n if (wasResizing && !state.isResizing && !state.isAnimating) {\n dispatch({ payload: isExpand, type: 'SET_RENDER_EXPAND' });\n }\n }, [isExpand, state.isAnimating, state.isResizing]);\n\n // 处理外部 width prop 变化\n // width 表示展开时的宽度,实际显示宽度根据 isExpand 状态决定\n useEffect(() => {\n if (width !== undefined && !state.isResizing && !state.isAnimating) {\n // 更新展开宽度记录\n dispatch({ payload: width, type: 'SET_EXPANDED_WIDTH' });\n // 根据当前状态设置实际宽度\n if (isExpand) {\n dispatch({ payload: width, type: 'SET_WIDTH' });\n }\n // 如果是折叠状态,保持 minWidth,不改变 internalWidth\n }\n }, [width, state.isResizing, state.isAnimating, isExpand]);\n\n // 计算当前的 body 内容 - 使用 renderExpand\n const currentBody = useMemo(() => {\n return body(state.renderExpand);\n }, [body, state.renderExpand]);\n\n // 计算当前的 header(支持函数和静态值)- 使用 renderExpand\n const currentHeader = useMemo(() => {\n return typeof header === 'function' ? header(state.renderExpand) : header;\n }, [header, state.renderExpand]);\n\n // 计算当前的 footer(支持函数和静态值)- 使用 renderExpand\n const currentFooter = useMemo(() => {\n return typeof footer === 'function' ? footer(state.renderExpand) : footer;\n }, [footer, state.renderExpand]);\n\n // Handle resize - memoize to prevent recreating on every render\n const handleResize: ResizeCallback = useCallback(\n (_, __, ref, delta) => {\n const currentWidth = ref.offsetWidth;\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n\n onWidthDragging?.(delta, currentWidth);\n },\n [onWidthDragging],\n );\n\n const handleResizeStart = useCallback(() => {\n dispatch({ type: 'START_RESIZE' });\n }, []);\n\n const handleResizeStop: ResizeCallback = useCallback(\n (_, __, ref, delta) => {\n dispatch({ type: 'STOP_RESIZE' });\n\n const currentWidth = ref.offsetWidth;\n\n // 清除之前的动画\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n\n // 根据拖拽后的宽度决定是折叠还是展开\n if (expandable) {\n const shouldCollapse = currentWidth <= minWidth || currentWidth < collapseThreshold;\n const shouldExpand =\n !isExpand && currentWidth > minWidth && currentWidth >= collapseThreshold;\n\n if (shouldCollapse || shouldExpand) {\n // 立即设置动画状态\n dispatch({ type: 'START_ANIMATION' });\n\n if (shouldCollapse) {\n setIsExpand(false);\n dispatch({ payload: minWidth, type: 'SET_WIDTH' });\n } else {\n setIsExpand(true);\n dispatch({ payload: currentWidth, type: 'SET_EXPANDED_WIDTH' });\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n }\n\n animationTimeoutRef.current = setTimeout(() => {\n dispatch({ type: 'STOP_ANIMATION' });\n }, ANIMATION_DURATION);\n } else if (isExpand) {\n // 展开状态下正常拖拽,记住宽度\n dispatch({ payload: currentWidth, type: 'SET_EXPANDED_WIDTH' });\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n }\n } else {\n // 如果不可折叠,仅更新宽度\n dispatch({ payload: currentWidth, type: 'SET_EXPANDED_WIDTH' });\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n }\n\n onWidthChange?.(delta, currentWidth);\n },\n [expandable, minWidth, collapseThreshold, isExpand, onWidthChange, setIsExpand],\n );\n\n // Arrow icon based on placement and expand state\n const ArrowIcon = useMemo(() => {\n if (placement === 'left') {\n // 左侧:展开时箭头向左(折叠方向),折叠时箭头向右(展开方向)\n return ChevronLeft;\n }\n // 右侧:展开时箭头向右(折叠方向),折叠时箭头向左(展开方向)\n return ChevronRight;\n }, [placement]);\n\n // Memoize handle styles to prevent recreation\n const handleRootStyle = useMemo<CSSProperties>(\n () => ({\n display: 'flex',\n opacity: !isExpand && showHandleWhenCollapsed ? 1 : isHovering ? 1 : 0,\n transition: 'opacity 0.25s ease',\n }),\n [isExpand, showHandleWhenCollapsed, isHovering],\n );\n\n const handleCenterStyle = useMemo<CSSProperties>(\n () => ({\n ...customStyles?.handle,\n cursor: 'pointer',\n }),\n [customStyles?.handle],\n );\n\n const handleIconWrapperStyle = useMemo<CSSProperties>(\n () => ({\n marginLeft: placement === 'right' ? 4 : 0,\n marginRight: placement === 'left' ? 4 : 0,\n transform: isExpand ? 'rotate(0deg)' : 'rotate(180deg)',\n transition: `transform ${COLLAPSE_ANIMATION_DELAY} ease`,\n }),\n [placement, isExpand],\n );\n\n // Toggle handle with smooth transitions\n const handle = useMemo(\n () =>\n showHandle &&\n expandable && (\n <div\n style={handleRootStyle}\n className={cx(\n styles.toggleRoot,\n placement === 'left' ? styles.toggleLeft : styles.toggleRight,\n )}\n >\n <Center className={classNames?.handle} style={handleCenterStyle} onClick={toggleExpand}>\n <div style={handleIconWrapperStyle}>\n <Icon className={styles.handlerIcon} icon={ArrowIcon} size={16} />\n </div>\n </Center>\n </div>\n ),\n [\n showHandle,\n expandable,\n styles.toggleRoot,\n styles.toggleLeft,\n styles.toggleRight,\n styles.handlerIcon,\n placement,\n handleRootStyle,\n classNames?.handle,\n toggleExpand,\n handleCenterStyle,\n handleIconWrapperStyle,\n ArrowIcon,\n cx,\n ],\n );\n\n // Size configuration - 使用内部宽度状态\n const sizeConfig = useMemo(() => {\n return {\n maxWidth,\n minWidth,\n size: { height: '100%', width: state.internalWidth },\n };\n }, [state.internalWidth, minWidth, maxWidth]);\n\n // Resize enable configuration - 始终允许拖拽\n const resizeEnable = useMemo(() => {\n if (!resizable) {\n return RESIZE_DISABLED;\n }\n return {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: placement === 'right',\n right: placement === 'left',\n top: false,\n topLeft: false,\n topRight: false,\n };\n }, [resizable, placement]);\n\n // Memoize handle classes to prevent recreation\n const handleClasses = useMemo(\n () => ({\n [placement === 'left' ? 'right' : 'left']: cx(\n styles.resizeHandle,\n showHandleHighlight && styles.resizeHandleHighlight,\n placement === 'left' ? styles.resizeHandleLeft : styles.resizeHandleRight,\n ),\n }),\n [placement, styles, showHandleHighlight, cx],\n );\n\n // Memoize container style to prevent recreation\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n ...customStyles?.container,\n ...rest.style,\n // 拖拽时不要动画,点击 handle 时有流畅的弹性动画\n transition: state.isResizing\n ? 'none'\n : state.isAnimating\n ? `width ${ANIMATION_DURATION}ms cubic-bezier(0.22, 1, 0.36, 1)`\n : 'none',\n }),\n [customStyles?.container, rest.style, state.isResizing, state.isAnimating],\n );\n\n // Memoize class names\n const containerClassName = useMemo(\n () => cx(styles.container, classNames?.container, className),\n [cx, styles.container, classNames?.container, className],\n );\n\n const contentClassName = useMemo(\n () =>\n cx(\n showBorder ? styles.contentContainer : styles.contentContainerNoBorder,\n styles.menuOverride,\n classNames?.content,\n ),\n [\n cx,\n styles.contentContainer,\n styles.contentContainerNoBorder,\n styles.menuOverride,\n classNames?.content,\n showBorder,\n ],\n );\n\n const headerClassName = useMemo(\n () => cx(styles.header, classNames?.header),\n [cx, styles.header, classNames?.header],\n );\n\n const bodyClassName = useMemo(\n () => cx(styles.body, classNames?.body),\n [cx, styles.body, classNames?.body],\n );\n\n const footerClassName = useMemo(\n () => cx(styles.footer, classNames?.footer),\n [cx, styles.footer, classNames?.footer],\n );\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n if (collapseTimeoutRef.current) {\n clearTimeout(collapseTimeoutRef.current);\n }\n };\n }, []);\n\n return (\n <aside ref={ref}>\n <Resizable\n {...sizeConfig}\n className={containerClassName}\n enable={resizeEnable}\n handleClasses={handleClasses}\n style={containerStyle}\n onResize={handleResize}\n onResizeStart={handleResizeStart}\n onResizeStop={handleResizeStop}\n >\n {handle}\n <Flexbox\n className={contentClassName}\n style={{\n ...cssVariables,\n ...customStyles?.content,\n }}\n >\n {currentHeader && (\n <div className={headerClassName} style={customStyles?.header}>\n {currentHeader}\n </div>\n )}\n <div className={bodyClassName} style={customStyles?.body}>\n {currentBody}\n </div>\n {currentFooter && (\n <div className={footerClassName} style={customStyles?.footer}>\n {currentFooter}\n </div>\n )}\n </Flexbox>\n </Resizable>\n </aside>\n );\n },\n);\n\nDraggableSideNav.displayName = 'DraggableSideNav';\n\nexport default DraggableSideNav;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DraggableSideNav.mjs","names":["useControlledState","Flexbox"],"sources":["../../src/DraggableSideNav/DraggableSideNav.tsx"],"sourcesContent":["'use client';\n\nimport { useHover } from 'ahooks';\nimport { cx } from 'antd-style';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Resizable, type ResizeCallback } from 're-resizable';\nimport {\n type CSSProperties,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { styles } from './style';\nimport type { DraggableSideNavProps } from './type';\n\nconst DEFAULT_MIN_WIDTH = 64; // 最小宽度即折叠宽度\nconst DEFAULT_EXPAND = true;\nconst DEFAULT_EXPANDED_WIDTH = 280;\nconst ANIMATION_DURATION = 300;\nconst COLLAPSE_ANIMATION_DELAY = 200;\n\n// Pre-define static objects to avoid recreating\nconst RESIZE_DISABLED = {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: false,\n right: false,\n top: false,\n topLeft: false,\n topRight: false,\n};\n\n// State reducer for better state management\ninterface SideNavState {\n expandedWidth: number;\n internalWidth: number;\n isAnimating: boolean;\n isResizing: boolean;\n renderExpand: boolean;\n}\n\ntype SideNavAction =\n | { type: 'START_RESIZE' }\n | { type: 'STOP_RESIZE' }\n | { type: 'START_ANIMATION' }\n | { type: 'STOP_ANIMATION' }\n | { payload: number; type: 'SET_WIDTH' }\n | { payload: number; type: 'SET_EXPANDED_WIDTH' }\n | { payload: boolean; type: 'SET_RENDER_EXPAND' }\n | { payload: number; type: 'ANIMATE_EXPAND' }\n | { payload: number; type: 'ANIMATE_COLLAPSE' };\n\nfunction sideNavReducer(state: SideNavState, action: SideNavAction): SideNavState {\n switch (action.type) {\n case 'START_RESIZE': {\n return { ...state, isResizing: true };\n }\n case 'STOP_RESIZE': {\n return { ...state, isResizing: false };\n }\n case 'START_ANIMATION': {\n return { ...state, isAnimating: true };\n }\n case 'STOP_ANIMATION': {\n return { ...state, isAnimating: false };\n }\n case 'SET_WIDTH': {\n return { ...state, internalWidth: action.payload };\n }\n case 'SET_EXPANDED_WIDTH': {\n return { ...state, expandedWidth: action.payload };\n }\n case 'SET_RENDER_EXPAND': {\n return { ...state, renderExpand: action.payload };\n }\n case 'ANIMATE_EXPAND': {\n return { ...state, internalWidth: action.payload, renderExpand: true };\n }\n case 'ANIMATE_COLLAPSE': {\n return { ...state, internalWidth: action.payload };\n }\n default: {\n return state;\n }\n }\n}\n\nconst DraggableSideNav = memo<DraggableSideNavProps>(\n ({\n body,\n className,\n classNames,\n defaultExpand = DEFAULT_EXPAND,\n defaultWidth,\n expand,\n expandable = true,\n footer,\n header,\n maxWidth,\n minWidth = DEFAULT_MIN_WIDTH,\n onExpandChange,\n onWidthChange,\n onWidthDragging,\n placement = 'left',\n resizable = true,\n showBorder = true,\n showHandle = true,\n showHandleWhenCollapsed = false,\n showHandleHighlight = false,\n backgroundColor,\n styles: customStyles,\n width,\n ...rest\n }) => {\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--draggable-side-nav-bg': backgroundColor || '',\n }),\n [backgroundColor],\n );\n const ref = useRef<HTMLDivElement>(null);\n const isHovering = useHover(ref);\n\n // Expand state management\n const [isExpand, setIsExpand] = useControlledState(defaultExpand, {\n onChange: onExpandChange,\n value: expand,\n });\n\n // Use refs for animation timeouts to avoid memory leaks\n const animationTimeoutRef = useRef<any>(undefined);\n const collapseTimeoutRef = useRef<any>(undefined);\n\n // Compute default expanded width - memoize to avoid recalculation\n const computedDefaultExpandedWidth = useMemo(\n () => defaultWidth || DEFAULT_EXPANDED_WIDTH,\n [defaultWidth],\n );\n\n // Initialize state with useReducer for better performance\n const initialState: SideNavState = {\n expandedWidth: width ?? computedDefaultExpandedWidth,\n internalWidth: isExpand ? (width ?? computedDefaultExpandedWidth) : minWidth,\n isAnimating: false,\n isResizing: false,\n renderExpand: isExpand,\n };\n\n const [state, dispatch] = useReducer(sideNavReducer, initialState);\n\n // 计算折叠阈值:展开最小宽度和折叠宽度的中间值\n const collapseThreshold = useMemo(() => {\n return minWidth + (state.expandedWidth - minWidth) / 3;\n }, [minWidth, state.expandedWidth]);\n\n // Toggle expand state with smooth animation\n const toggleExpand = useCallback(() => {\n if (!expandable) return;\n\n // 在动画或拖拽期间阻止新的切换操作,避免状态混乱\n if (state.isAnimating || state.isResizing) return;\n\n // 清除之前的动画\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n\n // 立即设置动画状态,避免其他 useEffect 干扰\n dispatch({ type: 'START_ANIMATION' });\n setIsExpand(!isExpand);\n\n // 动画完成后重置状态 - 与宽度动画时长一致\n animationTimeoutRef.current = setTimeout(() => {\n dispatch({ type: 'STOP_ANIMATION' });\n }, ANIMATION_DURATION);\n }, [expandable, isExpand, setIsExpand, state.isAnimating, state.isResizing]);\n\n // 用于跟踪上一次的 expand 状态,以检测外部变化\n const prevExpandRef = useRef(isExpand);\n\n // 监听外部 expand prop 变化,触发动画\n useEffect(() => {\n // 检测到 expand 状态变化,且不在拖拽和动画中\n if (prevExpandRef.current !== isExpand && !state.isResizing && !state.isAnimating) {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n\n // 立即设置动画状态,避免其他 useEffect 干扰\n dispatch({ type: 'START_ANIMATION' });\n\n animationTimeoutRef.current = setTimeout(() => {\n dispatch({ type: 'STOP_ANIMATION' });\n }, ANIMATION_DURATION);\n\n prevExpandRef.current = isExpand;\n }\n }, [isExpand, state.isResizing, state.isAnimating]);\n\n // 处理展开/折叠状态变化时的宽度动画和内容切换时机\n useEffect(() => {\n if (state.isAnimating) {\n // 使用 requestAnimationFrame 确保动画平滑\n const rafId = requestAnimationFrame(() => {\n if (isExpand) {\n // 展开动画:立即切换内容(先切换内容,再开始宽度动画)\n dispatch({ payload: state.expandedWidth, type: 'ANIMATE_EXPAND' });\n } else {\n // 折叠动画:延迟切换内容,在动画接近结束时才切换(300ms,略早于动画结束)\n dispatch({ payload: minWidth, type: 'ANIMATE_COLLAPSE' });\n\n if (collapseTimeoutRef.current) {\n clearTimeout(collapseTimeoutRef.current);\n }\n collapseTimeoutRef.current = setTimeout(() => {\n dispatch({ payload: false, type: 'SET_RENDER_EXPAND' });\n }, COLLAPSE_ANIMATION_DELAY);\n }\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }\n }, [isExpand, state.isAnimating, minWidth, state.expandedWidth]);\n\n // 同步非动画期间的 renderExpand 状态(如拖拽)\n // 使用 ref 追踪上一次的 isResizing 状态,只在拖拽结束时同步\n const prevIsResizingRef = useRef(state.isResizing);\n useEffect(() => {\n const wasResizing = prevIsResizingRef.current;\n prevIsResizingRef.current = state.isResizing;\n\n // 只在拖拽刚结束时同步 renderExpand,避免干扰正常的展开/折叠动画\n if (wasResizing && !state.isResizing && !state.isAnimating) {\n dispatch({ payload: isExpand, type: 'SET_RENDER_EXPAND' });\n }\n }, [isExpand, state.isAnimating, state.isResizing]);\n\n // 处理外部 width prop 变化\n // width 表示展开时的宽度,实际显示宽度根据 isExpand 状态决定\n useEffect(() => {\n if (width !== undefined && !state.isResizing && !state.isAnimating) {\n // 更新展开宽度记录\n dispatch({ payload: width, type: 'SET_EXPANDED_WIDTH' });\n // 根据当前状态设置实际宽度\n if (isExpand) {\n dispatch({ payload: width, type: 'SET_WIDTH' });\n }\n // 如果是折叠状态,保持 minWidth,不改变 internalWidth\n }\n }, [width, state.isResizing, state.isAnimating, isExpand]);\n\n // 计算当前的 body 内容 - 使用 renderExpand\n const currentBody = useMemo(() => {\n return body(state.renderExpand);\n }, [body, state.renderExpand]);\n\n // 计算当前的 header(支持函数和静态值)- 使用 renderExpand\n const currentHeader = useMemo(() => {\n return typeof header === 'function' ? header(state.renderExpand) : header;\n }, [header, state.renderExpand]);\n\n // 计算当前的 footer(支持函数和静态值)- 使用 renderExpand\n const currentFooter = useMemo(() => {\n return typeof footer === 'function' ? footer(state.renderExpand) : footer;\n }, [footer, state.renderExpand]);\n\n // Handle resize - memoize to prevent recreating on every render\n const handleResize: ResizeCallback = useCallback(\n (_, __, ref, delta) => {\n const currentWidth = ref.offsetWidth;\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n\n onWidthDragging?.(delta, currentWidth);\n },\n [onWidthDragging],\n );\n\n const handleResizeStart = useCallback(() => {\n dispatch({ type: 'START_RESIZE' });\n }, []);\n\n const handleResizeStop: ResizeCallback = useCallback(\n (_, __, ref, delta) => {\n dispatch({ type: 'STOP_RESIZE' });\n\n const currentWidth = ref.offsetWidth;\n\n // 清除之前的动画\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n\n // 根据拖拽后的宽度决定是折叠还是展开\n if (expandable) {\n const shouldCollapse = currentWidth <= minWidth || currentWidth < collapseThreshold;\n const shouldExpand =\n !isExpand && currentWidth > minWidth && currentWidth >= collapseThreshold;\n\n if (shouldCollapse || shouldExpand) {\n // 立即设置动画状态\n dispatch({ type: 'START_ANIMATION' });\n\n if (shouldCollapse) {\n setIsExpand(false);\n dispatch({ payload: minWidth, type: 'SET_WIDTH' });\n } else {\n setIsExpand(true);\n dispatch({ payload: currentWidth, type: 'SET_EXPANDED_WIDTH' });\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n }\n\n animationTimeoutRef.current = setTimeout(() => {\n dispatch({ type: 'STOP_ANIMATION' });\n }, ANIMATION_DURATION);\n } else if (isExpand) {\n // 展开状态下正常拖拽,记住宽度\n dispatch({ payload: currentWidth, type: 'SET_EXPANDED_WIDTH' });\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n }\n } else {\n // 如果不可折叠,仅更新宽度\n dispatch({ payload: currentWidth, type: 'SET_EXPANDED_WIDTH' });\n dispatch({ payload: currentWidth, type: 'SET_WIDTH' });\n }\n\n onWidthChange?.(delta, currentWidth);\n },\n [expandable, minWidth, collapseThreshold, isExpand, onWidthChange, setIsExpand],\n );\n\n // Arrow icon based on placement and expand state\n const ArrowIcon = useMemo(() => {\n if (placement === 'left') {\n // 左侧:展开时箭头向左(折叠方向),折叠时箭头向右(展开方向)\n return ChevronLeft;\n }\n // 右侧:展开时箭头向右(折叠方向),折叠时箭头向左(展开方向)\n return ChevronRight;\n }, [placement]);\n\n // Memoize handle styles to prevent recreation\n const handleRootStyle = useMemo<CSSProperties>(\n () => ({\n display: 'flex',\n opacity: !isExpand && showHandleWhenCollapsed ? 1 : isHovering ? 1 : 0,\n transition: 'opacity 0.25s ease',\n }),\n [isExpand, showHandleWhenCollapsed, isHovering],\n );\n\n const handleCenterStyle = useMemo<CSSProperties>(\n () => ({\n ...customStyles?.handle,\n cursor: 'pointer',\n }),\n [customStyles?.handle],\n );\n\n const handleIconWrapperStyle = useMemo<CSSProperties>(\n () => ({\n marginLeft: placement === 'right' ? 4 : 0,\n marginRight: placement === 'left' ? 4 : 0,\n transform: isExpand ? 'rotate(0deg)' : 'rotate(180deg)',\n transition: `transform ${COLLAPSE_ANIMATION_DELAY} ease`,\n }),\n [placement, isExpand],\n );\n\n // Toggle handle with smooth transitions\n const handle = useMemo(\n () =>\n showHandle &&\n expandable && (\n <div\n style={handleRootStyle}\n className={cx(\n styles.toggleRoot,\n placement === 'left' ? styles.toggleLeft : styles.toggleRight,\n )}\n >\n <Center className={classNames?.handle} style={handleCenterStyle} onClick={toggleExpand}>\n <div style={handleIconWrapperStyle}>\n <Icon className={styles.handlerIcon} icon={ArrowIcon} size={16} />\n </div>\n </Center>\n </div>\n ),\n [\n showHandle,\n expandable,\n styles.toggleRoot,\n styles.toggleLeft,\n styles.toggleRight,\n styles.handlerIcon,\n placement,\n handleRootStyle,\n classNames?.handle,\n toggleExpand,\n handleCenterStyle,\n handleIconWrapperStyle,\n ArrowIcon,\n cx,\n ],\n );\n\n // Size configuration - 使用内部宽度状态\n const sizeConfig = useMemo(() => {\n return {\n maxWidth,\n minWidth,\n size: { height: '100%', width: state.internalWidth },\n };\n }, [state.internalWidth, minWidth, maxWidth]);\n\n // Resize enable configuration - 始终允许拖拽\n const resizeEnable = useMemo(() => {\n if (!resizable) {\n return RESIZE_DISABLED;\n }\n return {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: placement === 'right',\n right: placement === 'left',\n top: false,\n topLeft: false,\n topRight: false,\n };\n }, [resizable, placement]);\n\n // Memoize handle classes to prevent recreation\n const handleClasses = useMemo(\n () => ({\n [placement === 'left' ? 'right' : 'left']: cx(\n styles.resizeHandle,\n showHandleHighlight && styles.resizeHandleHighlight,\n placement === 'left' ? styles.resizeHandleLeft : styles.resizeHandleRight,\n ),\n }),\n [placement, styles, showHandleHighlight, cx],\n );\n\n // Memoize container style to prevent recreation\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n ...customStyles?.container,\n ...rest.style,\n // 拖拽时不要动画,点击 handle 时有流畅的弹性动画\n transition: state.isResizing\n ? 'none'\n : state.isAnimating\n ? `width ${ANIMATION_DURATION}ms cubic-bezier(0.22, 1, 0.36, 1)`\n : 'none',\n }),\n [customStyles?.container, rest.style, state.isResizing, state.isAnimating],\n );\n\n // Memoize class names\n const containerClassName = useMemo(\n () => cx(styles.container, classNames?.container, className),\n [cx, styles.container, classNames?.container, className],\n );\n\n const contentClassName = useMemo(\n () =>\n cx(\n showBorder ? styles.contentContainer : styles.contentContainerNoBorder,\n styles.menuOverride,\n classNames?.content,\n ),\n [\n cx,\n styles.contentContainer,\n styles.contentContainerNoBorder,\n styles.menuOverride,\n classNames?.content,\n showBorder,\n ],\n );\n\n const headerClassName = useMemo(\n () => cx(styles.header, classNames?.header),\n [cx, styles.header, classNames?.header],\n );\n\n const bodyClassName = useMemo(\n () => cx(styles.body, classNames?.body),\n [cx, styles.body, classNames?.body],\n );\n\n const footerClassName = useMemo(\n () => cx(styles.footer, classNames?.footer),\n [cx, styles.footer, classNames?.footer],\n );\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current);\n }\n if (collapseTimeoutRef.current) {\n clearTimeout(collapseTimeoutRef.current);\n }\n };\n }, []);\n\n return (\n <aside ref={ref}>\n <Resizable\n {...sizeConfig}\n className={containerClassName}\n enable={resizeEnable}\n handleClasses={handleClasses}\n style={containerStyle}\n onResize={handleResize}\n onResizeStart={handleResizeStart}\n onResizeStop={handleResizeStop}\n >\n {handle}\n <Flexbox\n className={contentClassName}\n style={{\n ...cssVariables,\n ...customStyles?.content,\n }}\n >\n {currentHeader && (\n <div className={headerClassName} style={customStyles?.header}>\n {currentHeader}\n </div>\n )}\n <div className={bodyClassName} style={customStyles?.body}>\n {currentBody}\n </div>\n {currentFooter && (\n <div className={footerClassName} style={customStyles?.footer}>\n {currentFooter}\n </div>\n )}\n </Flexbox>\n </Resizable>\n </aside>\n );\n },\n);\n\nDraggableSideNav.displayName = 'DraggableSideNav';\n\nexport default DraggableSideNav;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.mjs","names":["Drawer","Flexbox","AntdDrawer"],"sources":["../../src/Drawer/Drawer.tsx"],"sourcesContent":["'use client';\n\nimport { Drawer as AntdDrawer } from 'antd';\nimport { cssVar } from 'antd-style';\nimport { XIcon } from 'lucide-react';\nimport { type CSSProperties, memo, useMemo } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\n\nimport type { DrawerProps } from './type';\n\nconst Drawer = memo<DrawerProps>(\n ({\n onClose,\n containerMaxWidth = 1024,\n classNames,\n title,\n placement,\n styles,\n children,\n height,\n width,\n extra,\n closeIconProps,\n noHeader,\n sidebarWidth = 280,\n sidebar,\n closeIcon,\n ref,\n ...rest\n }) => {\n const headerBorder: CSSProperties = useMemo(() => {\n if (height === '100%' || width === '100%' || height === '100vh' || width === '100vw')\n return {};\n\n switch (placement) {\n case 'top': {\n return {\n borderBottom: `1px solid ${cssVar.colorBorder}`,\n };\n }\n case 'bottom': {\n return {\n borderTop: `1px solid ${cssVar.colorBorder}`,\n };\n }\n case 'left': {\n return {\n borderRight: `1px solid ${cssVar.colorBorder}`,\n };\n }\n case 'right': {\n return {\n borderLeft: `1px solid ${cssVar.colorBorder}`,\n };\n }\n default: {\n return {};\n }\n }\n }, [placement, height, width]);\n\n const extraNode = (\n <Flexbox\n horizontal\n align={'center'}\n className={classNames?.extra}\n gap={4}\n justify={'flex-end'}\n style={{\n position: 'absolute',\n right: 4,\n top: 4,\n ...styles?.extra,\n }}\n >\n {extra}\n {closeIcon || <ActionIcon icon={XIcon} onClick={onClose} {...closeIconProps} />}\n </Flexbox>\n );\n\n const sidebarContent = (\n <>\n <Flexbox\n className={classNames?.sidebar}\n paddingBlock={12}\n paddingInline={16}\n width={sidebarWidth}\n style={{\n background: cssVar.colorBgLayout,\n borderRight: `1px solid ${cssVar.colorBorderSecondary}`,\n height: '100vh',\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'sticky',\n top: 0,\n ...styles?.sidebar,\n }}\n >\n {sidebar}\n </Flexbox>\n <Flexbox\n className={classNames?.sidebarContent}\n flex={1}\n paddingBlock={12}\n paddingInline={16}\n style={{\n background: cssVar.colorBgContainer,\n overflowX: 'hidden',\n overflowY: 'auto',\n ...styles?.sidebarContent,\n }}\n >\n {children}\n </Flexbox>\n </>\n );\n\n return (\n <AntdDrawer\n classNames={classNames}\n closable={false}\n extra={noHeader ? undefined : extraNode}\n height={height}\n keyboard={true}\n panelRef={ref}\n placement={placement}\n width={width}\n styles={\n typeof styles === 'function'\n ? styles\n : {\n ...styles,\n body: {\n background: 'transparent',\n paddingBlock: sidebar ? 0 : 12,\n paddingInline: sidebar ? 0 : 16,\n ...styles?.body,\n },\n header: {\n background: 'transparent',\n display: noHeader ? 'none' : undefined,\n padding: 4,\n ...styles?.header,\n },\n section: {\n background: sidebar\n ? `linear-gradient(to right, ${cssVar.colorBgLayout} 49.9%, ${cssVar.colorBgContainer} 50%)`\n : cssVar.colorBgContainer,\n ...styles?.section,\n },\n wrapper: {\n background: cssVar.colorBgContainer,\n ...headerBorder,\n ...styles?.wrapper,\n },\n }\n }\n title={\n <Flexbox\n horizontal\n align={'center'}\n className={classNames?.title}\n justify={'flex-start'}\n paddingBlock={8}\n paddingInline={16}\n style={{\n justifySelf: 'center',\n maxWidth: containerMaxWidth,\n width: '100%',\n ...styles?.title,\n }}\n >\n {title}\n </Flexbox>\n }\n onClose={onClose}\n {...rest}\n >\n <Flexbox\n className={classNames?.bodyContent}\n horizontal={!!sidebar}\n style={{\n justifySelf: 'center',\n maxWidth: containerMaxWidth,\n minHeight: '100%',\n overflow: sidebar ? 'visible' : undefined,\n width: '100%',\n ...styles?.bodyContent,\n }}\n >\n {noHeader && extraNode}\n {sidebar ? sidebarContent : children}\n </Flexbox>\n </AntdDrawer>\n );\n },\n);\n\nDrawer.displayName = 'Drawer';\n\nexport default Drawer;\n"],"mappings":";;;;;;;;;AAYA,MAAMA,WAAS,MACZ,EACC,SACA,oBAAoB,MACpB,YACA,OACA,WACA,QACA,UACA,QACA,OACA,OACA,gBACA,UACA,eAAe,KACf,SACA,WACA,KACA,GAAG,WACC;CACJ,MAAM,eAA8B,cAAc;EAChD,IAAI,WAAW,UAAU,UAAU,UAAU,WAAW,WAAW,UAAU,SAC3E,OAAO,CAAC;EAEV,QAAQ,WAAR;GACE,KAAK,OACH,OAAO,EACL,cAAc,aAAa,OAAO,cACpC;GAEF,KAAK,UACH,OAAO,EACL,WAAW,aAAa,OAAO,cACjC;GAEF,KAAK,QACH,OAAO,EACL,aAAa,aAAa,OAAO,cACnC;GAEF,KAAK,SACH,OAAO,EACL,YAAY,aAAa,OAAO,cAClC;GAEF,SACE,OAAO,CAAC;EAEZ;CACF,GAAG;EAAC;EAAW;EAAQ;CAAK,CAAC;CAE7B,MAAM,YACJ,qBAACC,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW,YAAY;EACvB,KAAK;EACL,SAAS;EACT,OAAO;GACL,UAAU;GACV,OAAO;GACP,KAAK;GACL,GAAG,QAAQ;EACb;YAXF,CAaG,OACA,aAAa,oBAAC,YAAD;GAAY,MAAM;GAAO,SAAS;GAAS,GAAI;EAAiB,CAAA,CACvE;;CAGX,MAAM,iBACJ,qBAAA,YAAA,EAAA,UAAA,CACE,oBAACA,mBAAD;EACE,WAAW,YAAY;EACvB,cAAc;EACd,eAAe;EACf,OAAO;EACP,OAAO;GACL,YAAY,OAAO;GACnB,aAAa,aAAa,OAAO;GACjC,QAAQ;GACR,WAAW;GACX,WAAW;GACX,UAAU;GACV,KAAK;GACL,GAAG,QAAQ;EACb;YAEC;CACM,CAAA,GACT,oBAACA,mBAAD;EACE,WAAW,YAAY;EACvB,MAAM;EACN,cAAc;EACd,eAAe;EACf,OAAO;GACL,YAAY,OAAO;GACnB,WAAW;GACX,WAAW;GACX,GAAG,QAAQ;EACb;EAEC;CACM,CAAA,CACT,EAAA,CAAA;CAGJ,OACE,oBAACC,QAAD;EACc;EACZ,UAAU;EACV,OAAO,WAAW,KAAA,IAAY;EACtB;EACR,UAAU;EACV,UAAU;EACC;EACJ;EACP,QACE,OAAO,WAAW,aACd,SACA;GACE,GAAG;GACH,MAAM;IACJ,YAAY;IACZ,cAAc,UAAU,IAAI;IAC5B,eAAe,UAAU,IAAI;IAC7B,GAAG,QAAQ;GACb;GACA,QAAQ;IACN,YAAY;IACZ,SAAS,WAAW,SAAS,KAAA;IAC7B,SAAS;IACT,GAAG,QAAQ;GACb;GACA,SAAS;IACP,YAAY,UACR,6BAA6B,OAAO,cAAc,UAAU,OAAO,iBAAiB,SACpF,OAAO;IACX,GAAG,QAAQ;GACb;GACA,SAAS;IACP,YAAY,OAAO;IACnB,GAAG;IACH,GAAG,QAAQ;GACb;EACF;EAEN,OACE,oBAACD,mBAAD;GACE,YAAA;GACA,OAAO;GACP,WAAW,YAAY;GACvB,SAAS;GACT,cAAc;GACd,eAAe;GACf,OAAO;IACL,aAAa;IACb,UAAU;IACV,OAAO;IACP,GAAG,QAAQ;GACb;aAEC;EACM,CAAA;EAEF;EACT,GAAI;YAEJ,qBAACA,mBAAD;GACE,WAAW,YAAY;GACvB,YAAY,CAAC,CAAC;GACd,OAAO;IACL,aAAa;IACb,UAAU;IACV,WAAW;IACX,UAAU,UAAU,YAAY,KAAA;IAChC,OAAO;IACP,GAAG,QAAQ;GACb;aAVF,CAYG,YAAY,WACZ,UAAU,iBAAiB,QACrB;;CACC,CAAA;AAEhB,CACF;AAEA,SAAO,cAAc"}
1
+ {"version":3,"file":"Drawer.mjs","names":["Drawer","Flexbox","AntdDrawer"],"sources":["../../src/Drawer/Drawer.tsx"],"sourcesContent":["'use client';\n\nimport { Drawer as AntdDrawer } from 'antd';\nimport { cssVar } from 'antd-style';\nimport { XIcon } from 'lucide-react';\nimport { type CSSProperties, memo, useMemo } from 'react';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\n\nimport type { DrawerProps } from './type';\n\nconst Drawer = memo<DrawerProps>(\n ({\n onClose,\n containerMaxWidth = 1024,\n classNames,\n title,\n placement,\n styles,\n children,\n height,\n width,\n extra,\n closeIconProps,\n noHeader,\n sidebarWidth = 280,\n sidebar,\n closeIcon,\n ref,\n ...rest\n }) => {\n const headerBorder: CSSProperties = useMemo(() => {\n if (height === '100%' || width === '100%' || height === '100vh' || width === '100vw')\n return {};\n\n switch (placement) {\n case 'top': {\n return {\n borderBottom: `1px solid ${cssVar.colorBorder}`,\n };\n }\n case 'bottom': {\n return {\n borderTop: `1px solid ${cssVar.colorBorder}`,\n };\n }\n case 'left': {\n return {\n borderRight: `1px solid ${cssVar.colorBorder}`,\n };\n }\n case 'right': {\n return {\n borderLeft: `1px solid ${cssVar.colorBorder}`,\n };\n }\n default: {\n return {};\n }\n }\n }, [placement, height, width]);\n\n const extraNode = (\n <Flexbox\n horizontal\n align={'center'}\n className={classNames?.extra}\n gap={4}\n justify={'flex-end'}\n style={{\n position: 'absolute',\n right: 4,\n top: 4,\n ...styles?.extra,\n }}\n >\n {extra}\n {closeIcon || <ActionIcon icon={XIcon} onClick={onClose} {...closeIconProps} />}\n </Flexbox>\n );\n\n const sidebarContent = (\n <>\n <Flexbox\n className={classNames?.sidebar}\n paddingBlock={12}\n paddingInline={16}\n width={sidebarWidth}\n style={{\n background: cssVar.colorBgLayout,\n borderRight: `1px solid ${cssVar.colorBorderSecondary}`,\n height: '100vh',\n overflowX: 'hidden',\n overflowY: 'auto',\n position: 'sticky',\n top: 0,\n ...styles?.sidebar,\n }}\n >\n {sidebar}\n </Flexbox>\n <Flexbox\n className={classNames?.sidebarContent}\n flex={1}\n paddingBlock={12}\n paddingInline={16}\n style={{\n background: cssVar.colorBgContainer,\n overflowX: 'hidden',\n overflowY: 'auto',\n ...styles?.sidebarContent,\n }}\n >\n {children}\n </Flexbox>\n </>\n );\n\n return (\n <AntdDrawer\n classNames={classNames}\n closable={false}\n extra={noHeader ? undefined : extraNode}\n height={height}\n keyboard={true}\n panelRef={ref}\n placement={placement}\n width={width}\n styles={\n typeof styles === 'function'\n ? styles\n : {\n ...styles,\n body: {\n background: 'transparent',\n paddingBlock: sidebar ? 0 : 12,\n paddingInline: sidebar ? 0 : 16,\n ...styles?.body,\n },\n header: {\n background: 'transparent',\n display: noHeader ? 'none' : undefined,\n padding: 4,\n ...styles?.header,\n },\n section: {\n background: sidebar\n ? `linear-gradient(to right, ${cssVar.colorBgLayout} 49.9%, ${cssVar.colorBgContainer} 50%)`\n : cssVar.colorBgContainer,\n ...styles?.section,\n },\n wrapper: {\n background: cssVar.colorBgContainer,\n ...headerBorder,\n ...styles?.wrapper,\n },\n }\n }\n title={\n <Flexbox\n horizontal\n align={'center'}\n className={classNames?.title}\n justify={'flex-start'}\n paddingBlock={8}\n paddingInline={16}\n style={{\n justifySelf: 'center',\n maxWidth: containerMaxWidth,\n width: '100%',\n ...styles?.title,\n }}\n >\n {title}\n </Flexbox>\n }\n onClose={onClose}\n {...rest}\n >\n <Flexbox\n className={classNames?.bodyContent}\n horizontal={!!sidebar}\n style={{\n justifySelf: 'center',\n maxWidth: containerMaxWidth,\n minHeight: '100%',\n overflow: sidebar ? 'visible' : undefined,\n width: '100%',\n ...styles?.bodyContent,\n }}\n >\n {noHeader && extraNode}\n {sidebar ? sidebarContent : children}\n </Flexbox>\n </AntdDrawer>\n );\n },\n);\n\nDrawer.displayName = 'Drawer';\n\nexport default Drawer;\n"],"mappings":";;;;;;;;;AAYA,MAAMA,WAAS,MACZ,EACC,SACA,oBAAoB,MACpB,YACA,OACA,WACA,QACA,UACA,QACA,OACA,OACA,gBACA,UACA,eAAe,KACf,SACA,WACA,KACA,GAAG,WACC;CACJ,MAAM,eAA8B,cAAc;EAChD,IAAI,WAAW,UAAU,UAAU,UAAU,WAAW,WAAW,UAAU,SAC3E,OAAO,CAAC;EAEV,QAAQ,WAAR;GACE,KAAK,OACH,OAAO,EACL,cAAc,aAAa,OAAO,cACpC;GAEF,KAAK,UACH,OAAO,EACL,WAAW,aAAa,OAAO,cACjC;GAEF,KAAK,QACH,OAAO,EACL,aAAa,aAAa,OAAO,cACnC;GAEF,KAAK,SACH,OAAO,EACL,YAAY,aAAa,OAAO,cAClC;GAEF,SACE,OAAO,CAAC;EAEZ;CACF,GAAG;EAAC;EAAW;EAAQ;CAAK,CAAC;CAE7B,MAAM,YACJ,qBAACC,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW,YAAY;EACvB,KAAK;EACL,SAAS;EACT,OAAO;GACL,UAAU;GACV,OAAO;GACP,KAAK;GACL,GAAG,QAAQ;EACb;EAXF,UAAA,CAaG,OACA,aAAa,oBAAC,YAAD;GAAY,MAAM;GAAO,SAAS;GAAS,GAAI;EAAiB,CAAA,CACvE;;CAGX,MAAM,iBACJ,qBAAA,YAAA,EAAA,UAAA,CACE,oBAACA,mBAAD;EACE,WAAW,YAAY;EACvB,cAAc;EACd,eAAe;EACf,OAAO;EACP,OAAO;GACL,YAAY,OAAO;GACnB,aAAa,aAAa,OAAO;GACjC,QAAQ;GACR,WAAW;GACX,WAAW;GACX,UAAU;GACV,KAAK;GACL,GAAG,QAAQ;EACb;EAEC,UAAA;CACM,CAAA,GACT,oBAACA,mBAAD;EACE,WAAW,YAAY;EACvB,MAAM;EACN,cAAc;EACd,eAAe;EACf,OAAO;GACL,YAAY,OAAO;GACnB,WAAW;GACX,WAAW;GACX,GAAG,QAAQ;EACb;EAEC;CACM,CAAA,CACT,EAAA,CAAA;CAGJ,OACE,oBAACC,QAAD;EACc;EACZ,UAAU;EACV,OAAO,WAAW,KAAA,IAAY;EACtB;EACR,UAAU;EACV,UAAU;EACC;EACJ;EACP,QACE,OAAO,WAAW,aACd,SACA;GACE,GAAG;GACH,MAAM;IACJ,YAAY;IACZ,cAAc,UAAU,IAAI;IAC5B,eAAe,UAAU,IAAI;IAC7B,GAAG,QAAQ;GACb;GACA,QAAQ;IACN,YAAY;IACZ,SAAS,WAAW,SAAS,KAAA;IAC7B,SAAS;IACT,GAAG,QAAQ;GACb;GACA,SAAS;IACP,YAAY,UACR,6BAA6B,OAAO,cAAc,UAAU,OAAO,iBAAiB,SACpF,OAAO;IACX,GAAG,QAAQ;GACb;GACA,SAAS;IACP,YAAY,OAAO;IACnB,GAAG;IACH,GAAG,QAAQ;GACb;EACF;EAEN,OACE,oBAACD,mBAAD;GACE,YAAA;GACA,OAAO;GACP,WAAW,YAAY;GACvB,SAAS;GACT,cAAc;GACd,eAAe;GACf,OAAO;IACL,aAAa;IACb,UAAU;IACV,OAAO;IACP,GAAG,QAAQ;GACb;GAEC,UAAA;EACM,CAAA;EAEF;EACT,GAAI;EAEJ,UAAA,qBAACA,mBAAD;GACE,WAAW,YAAY;GACvB,YAAY,CAAC,CAAC;GACd,OAAO;IACL,aAAa;IACb,UAAU;IACV,WAAW;IACX,UAAU,UAAU,YAAY,KAAA;IAChC,OAAO;IACP,GAAG,QAAQ;GACb;GAVF,UAAA,CAYG,YAAY,WACZ,UAAU,iBAAiB,QACrB;;CACC,CAAA;AAEhB,CACF;AAEA,SAAO,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.mjs","names":["Dropdown","AntdDropdown"],"sources":["../../src/Dropdown/Dropdown.tsx"],"sourcesContent":["'use client';\n\nimport { Dropdown as AntdDropdown } from 'antd';\nimport { memo, useMemo } from 'react';\n\nimport { IconProvider } from '@/Icon';\nimport { mapItems } from '@/Menu';\n\nimport type { DropdownProps } from './type';\n\n/**\n * @deprecated\n * Use `DropdownMenu` or `ContextMenu` instead\n * @see https://ui.lobehub.com/components/context-menu\n * @see https://ui.lobehub.com/components/dropdown-menu\n */\nconst Dropdown = memo<DropdownProps>(({ children, iconProps, menu, ...rest }) => {\n const { items, ...menuProps } = menu;\n\n const antdItems = useMemo(() => items.map((item) => mapItems(item)), [items]);\n\n return (\n <IconProvider\n config={{\n size: 'small',\n ...iconProps,\n }}\n >\n <AntdDropdown\n menu={{\n ...menuProps,\n items: antdItems,\n }}\n {...rest}\n >\n {children}\n </AntdDropdown>\n </IconProvider>\n );\n});\n\nDropdown.displayName = 'Dropdown';\n\nexport default Dropdown;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,aAAW,MAAqB,EAAE,UAAU,WAAW,MAAM,GAAG,WAAW;CAC/E,MAAM,EAAE,OAAO,GAAG,cAAc;CAEhC,MAAM,YAAY,cAAc,MAAM,KAAK,SAAS,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;CAE5E,OACE,oBAAC,cAAD;EACE,QAAQ;GACN,MAAM;GACN,GAAG;EACL;YAEA,oBAACC,UAAD;GACE,MAAM;IACJ,GAAG;IACH,OAAO;GACT;GACA,GAAI;GAEH;EACW,CAAA;CACF,CAAA;AAElB,CAAC;AAED,WAAS,cAAc"}
1
+ {"version":3,"file":"Dropdown.mjs","names":["Dropdown","AntdDropdown"],"sources":["../../src/Dropdown/Dropdown.tsx"],"sourcesContent":["'use client';\n\nimport { Dropdown as AntdDropdown } from 'antd';\nimport { memo, useMemo } from 'react';\n\nimport { IconProvider } from '@/Icon';\nimport { mapItems } from '@/Menu';\n\nimport type { DropdownProps } from './type';\n\n/**\n * @deprecated\n * Use `DropdownMenu` or `ContextMenu` instead\n * @see https://ui.lobehub.com/components/context-menu\n * @see https://ui.lobehub.com/components/dropdown-menu\n */\nconst Dropdown = memo<DropdownProps>(({ children, iconProps, menu, ...rest }) => {\n const { items, ...menuProps } = menu;\n\n const antdItems = useMemo(() => items.map((item) => mapItems(item)), [items]);\n\n return (\n <IconProvider\n config={{\n size: 'small',\n ...iconProps,\n }}\n >\n <AntdDropdown\n menu={{\n ...menuProps,\n items: antdItems,\n }}\n {...rest}\n >\n {children}\n </AntdDropdown>\n </IconProvider>\n );\n});\n\nDropdown.displayName = 'Dropdown';\n\nexport default Dropdown;\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,aAAW,MAAqB,EAAE,UAAU,WAAW,MAAM,GAAG,WAAW;CAC/E,MAAM,EAAE,OAAO,GAAG,cAAc;CAEhC,MAAM,YAAY,cAAc,MAAM,KAAK,SAAS,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;CAE5E,OACE,oBAAC,cAAD;EACE,QAAQ;GACN,MAAM;GACN,GAAG;EACL;EAEA,UAAA,oBAACC,UAAD;GACE,MAAM;IACJ,GAAG;IACH,OAAO;GACT;GACA,GAAI;GAEH;EACW,CAAA;CACF,CAAA;AAElB,CAAC;AAED,WAAS,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"ControlInput.mjs","names":["Flexbox"],"sources":["../../src/EditableText/ControlInput.tsx"],"sourcesContent":["'use client';\n\nimport type { InputRef } from 'antd';\nimport { RotateCcw, Save } from 'lucide-react';\nimport { memo, useEffect, useRef, useState } from 'react';\n\nimport ActionIcon, { type ActionIconProps } from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport Input, { type InputProps } from '@/Input';\n\nexport interface ControlInputProps extends Omit<InputProps, 'onChange' | 'value' | 'onAbort'> {\n onChange?: (value: string) => void;\n onChangeEnd?: (value: string) => void;\n onValueChanging?: (value: string) => void;\n submitIcon?: ActionIconProps['icon'];\n texts?: {\n reset?: string;\n submit?: string;\n };\n value?: string;\n}\n\nconst ControlInput = memo<ControlInputProps>(\n ({\n value,\n onChange,\n onValueChanging,\n onChangeEnd,\n onCompositionEnd,\n onCompositionStart,\n onPressEnter,\n onFocus,\n submitIcon,\n style,\n texts,\n ...rest\n }) => {\n const ref = useRef<InputRef>(null);\n const [input, setInput] = useState<string>(value || '');\n\n const isChineseInput = useRef(false);\n\n useEffect(() => {\n if (value !== undefined) setInput(value);\n }, [value]);\n\n const handleUpload = () => {\n onChange?.(input);\n ref?.current?.blur();\n onChangeEnd?.(input);\n };\n\n return (\n <Input\n autoFocus\n ref={ref}\n value={input}\n style={{\n width: '100%',\n ...style,\n }}\n suffix={\n value === input ? (\n <span />\n ) : (\n <Flexbox\n horizontal\n gap={2}\n style={{\n marginRight: -4,\n zIndex: 1,\n }}\n >\n <ActionIcon\n icon={RotateCcw}\n size=\"small\"\n title={texts?.reset || 'Reset'}\n onClick={(e) => {\n e.preventDefault();\n setInput(value || '');\n }}\n />\n <ActionIcon\n icon={submitIcon || Save}\n size=\"small\"\n title={texts?.submit || 'Submit'}\n variant={'filled'}\n onClick={(e) => {\n e.preventDefault();\n handleUpload();\n }}\n />\n </Flexbox>\n )\n }\n onFocus={onFocus}\n onChange={(e) => {\n setInput(e.target.value);\n onValueChanging?.(e.target.value);\n }}\n onCompositionEnd={(e) => {\n isChineseInput.current = false;\n onCompositionEnd?.(e);\n }}\n onCompositionStart={(e) => {\n isChineseInput.current = true;\n onCompositionStart?.(e);\n }}\n onPressEnter={(e) => {\n if (!e.shiftKey && !isChineseInput.current) {\n e.preventDefault();\n handleUpload();\n onPressEnter?.(e);\n }\n }}\n {...rest}\n />\n );\n },\n);\n\nControlInput.displayName = 'ControlInput';\n\nexport default ControlInput;\n"],"mappings":";;;;;;;;AAsBA,MAAM,eAAe,MAClB,EACC,OACA,UACA,iBACA,aACA,kBACA,oBACA,cACA,SACA,YACA,OACA,OACA,GAAG,WACC;CACJ,MAAM,MAAM,OAAiB,IAAI;CACjC,MAAM,CAAC,OAAO,YAAY,SAAiB,SAAS,EAAE;CAEtD,MAAM,iBAAiB,OAAO,KAAK;CAEnC,gBAAgB;EACd,IAAI,UAAU,KAAA,GAAW,SAAS,KAAK;CACzC,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,qBAAqB;EACzB,WAAW,KAAK;EAChB,KAAK,SAAS,KAAK;EACnB,cAAc,KAAK;CACrB;CAEA,OACE,oBAAC,OAAD;EACE,WAAA;EACK;EACL,OAAO;EACP,OAAO;GACL,OAAO;GACP,GAAG;EACL;EACA,QACE,UAAU,QACR,oBAAC,QAAD,CAAO,CAAA,IAEP,qBAACA,mBAAD;GACE,YAAA;GACA,KAAK;GACL,OAAO;IACL,aAAa;IACb,QAAQ;GACV;aANF,CAQE,oBAAC,YAAD;IACE,MAAM;IACN,MAAK;IACL,OAAO,OAAO,SAAS;IACvB,UAAU,MAAM;KACd,EAAE,eAAe;KACjB,SAAS,SAAS,EAAE;IACtB;GACD,CAAA,GACD,oBAAC,YAAD;IACE,MAAM,cAAc;IACpB,MAAK;IACL,OAAO,OAAO,UAAU;IACxB,SAAS;IACT,UAAU,MAAM;KACd,EAAE,eAAe;KACjB,aAAa;IACf;GACD,CAAA,CACM;;EAGJ;EACT,WAAW,MAAM;GACf,SAAS,EAAE,OAAO,KAAK;GACvB,kBAAkB,EAAE,OAAO,KAAK;EAClC;EACA,mBAAmB,MAAM;GACvB,eAAe,UAAU;GACzB,mBAAmB,CAAC;EACtB;EACA,qBAAqB,MAAM;GACzB,eAAe,UAAU;GACzB,qBAAqB,CAAC;EACxB;EACA,eAAe,MAAM;GACnB,IAAI,CAAC,EAAE,YAAY,CAAC,eAAe,SAAS;IAC1C,EAAE,eAAe;IACjB,aAAa;IACb,eAAe,CAAC;GAClB;EACF;EACA,GAAI;CACL,CAAA;AAEL,CACF;AAEA,aAAa,cAAc"}
1
+ {"version":3,"file":"ControlInput.mjs","names":["Flexbox"],"sources":["../../src/EditableText/ControlInput.tsx"],"sourcesContent":["'use client';\n\nimport type { InputRef } from 'antd';\nimport { RotateCcw, Save } from 'lucide-react';\nimport { memo, useEffect, useRef, useState } from 'react';\n\nimport ActionIcon, { type ActionIconProps } from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport Input, { type InputProps } from '@/Input';\n\nexport interface ControlInputProps extends Omit<InputProps, 'onChange' | 'value' | 'onAbort'> {\n onChange?: (value: string) => void;\n onChangeEnd?: (value: string) => void;\n onValueChanging?: (value: string) => void;\n submitIcon?: ActionIconProps['icon'];\n texts?: {\n reset?: string;\n submit?: string;\n };\n value?: string;\n}\n\nconst ControlInput = memo<ControlInputProps>(\n ({\n value,\n onChange,\n onValueChanging,\n onChangeEnd,\n onCompositionEnd,\n onCompositionStart,\n onPressEnter,\n onFocus,\n submitIcon,\n style,\n texts,\n ...rest\n }) => {\n const ref = useRef<InputRef>(null);\n const [input, setInput] = useState<string>(value || '');\n\n const isChineseInput = useRef(false);\n\n useEffect(() => {\n if (value !== undefined) setInput(value);\n }, [value]);\n\n const handleUpload = () => {\n onChange?.(input);\n ref?.current?.blur();\n onChangeEnd?.(input);\n };\n\n return (\n <Input\n autoFocus\n ref={ref}\n value={input}\n style={{\n width: '100%',\n ...style,\n }}\n suffix={\n value === input ? (\n <span />\n ) : (\n <Flexbox\n horizontal\n gap={2}\n style={{\n marginRight: -4,\n zIndex: 1,\n }}\n >\n <ActionIcon\n icon={RotateCcw}\n size=\"small\"\n title={texts?.reset || 'Reset'}\n onClick={(e) => {\n e.preventDefault();\n setInput(value || '');\n }}\n />\n <ActionIcon\n icon={submitIcon || Save}\n size=\"small\"\n title={texts?.submit || 'Submit'}\n variant={'filled'}\n onClick={(e) => {\n e.preventDefault();\n handleUpload();\n }}\n />\n </Flexbox>\n )\n }\n onFocus={onFocus}\n onChange={(e) => {\n setInput(e.target.value);\n onValueChanging?.(e.target.value);\n }}\n onCompositionEnd={(e) => {\n isChineseInput.current = false;\n onCompositionEnd?.(e);\n }}\n onCompositionStart={(e) => {\n isChineseInput.current = true;\n onCompositionStart?.(e);\n }}\n onPressEnter={(e) => {\n if (!e.shiftKey && !isChineseInput.current) {\n e.preventDefault();\n handleUpload();\n onPressEnter?.(e);\n }\n }}\n {...rest}\n />\n );\n },\n);\n\nControlInput.displayName = 'ControlInput';\n\nexport default ControlInput;\n"],"mappings":";;;;;;;;AAsBA,MAAM,eAAe,MAClB,EACC,OACA,UACA,iBACA,aACA,kBACA,oBACA,cACA,SACA,YACA,OACA,OACA,GAAG,WACC;CACJ,MAAM,MAAM,OAAiB,IAAI;CACjC,MAAM,CAAC,OAAO,YAAY,SAAiB,SAAS,EAAE;CAEtD,MAAM,iBAAiB,OAAO,KAAK;CAEnC,gBAAgB;EACd,IAAI,UAAU,KAAA,GAAW,SAAS,KAAK;CACzC,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,qBAAqB;EACzB,WAAW,KAAK;EAChB,KAAK,SAAS,KAAK;EACnB,cAAc,KAAK;CACrB;CAEA,OACE,oBAAC,OAAD;EACE,WAAA;EACK;EACL,OAAO;EACP,OAAO;GACL,OAAO;GACP,GAAG;EACL;EACA,QACE,UAAU,QACR,oBAAC,QAAD,CAAO,CAAA,IAEP,qBAACA,mBAAD;GACE,YAAA;GACA,KAAK;GACL,OAAO;IACL,aAAa;IACb,QAAQ;GACV;GANF,UAAA,CAQE,oBAAC,YAAD;IACE,MAAM;IACN,MAAK;IACL,OAAO,OAAO,SAAS;IACvB,UAAU,MAAM;KACd,EAAE,eAAe;KACjB,SAAS,SAAS,EAAE;IACtB;GACD,CAAA,GACD,oBAAC,YAAD;IACE,MAAM,cAAc;IACpB,MAAK;IACL,OAAO,OAAO,UAAU;IACxB,SAAS;IACT,UAAU,MAAM;KACd,EAAE,eAAe;KACjB,aAAa;IACf;GACD,CAAA,CACM;;EAGJ;EACT,WAAW,MAAM;GACf,SAAS,EAAE,OAAO,KAAK;GACvB,kBAAkB,EAAE,OAAO,KAAK;EAClC;EACA,mBAAmB,MAAM;GACvB,eAAe,UAAU;GACzB,mBAAmB,CAAC;EACtB;EACA,qBAAqB,MAAM;GACzB,eAAe,UAAU;GACzB,qBAAqB,CAAC;EACxB;EACA,eAAe,MAAM;GACnB,IAAI,CAAC,EAAE,YAAY,CAAC,eAAe,SAAS;IAC1C,EAAE,eAAe;IACjB,aAAa;IACb,eAAe,CAAC;GAClB;EACF;EACA,GAAI;CACL,CAAA;AAEL,CACF;AAEA,aAAa,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditableText.mjs","names":["useControlledState","Flexbox"],"sources":["../../src/EditableText/EditableText.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { Edit3 } from 'lucide-react';\nimport { memo, useMemo } from 'react';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\n\nimport ControlInput from './ControlInput';\nimport type { EditableTextProps } from './type';\n\nconst EditableText = memo<EditableTextProps>(\n ({\n value,\n showEditIcon = true,\n onChange,\n editing,\n onEditingChange,\n onChangeEnd,\n onFocus,\n onBlur,\n className,\n inputProps,\n onValueChanging,\n gap = 8,\n style,\n size = 'small',\n styles,\n classNames,\n variant = 'borderless',\n ...rest\n }) => {\n const [edited, setEdited] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n useHotkeys(\n 'esc',\n () => {\n setEdited(false);\n },\n {\n enableOnFormTags: true,\n enabled: edited,\n preventDefault: true,\n },\n );\n\n const height = useMemo(() => {\n if (!size) return 32;\n switch (size) {\n case 'large': {\n return 40;\n }\n case 'middle': {\n return 32;\n }\n case 'small': {\n return 24;\n }\n }\n }, [size]);\n\n const input = (\n <ControlInput\n className={cx(className, classNames?.input)}\n size={size}\n value={value as string}\n variant={variant}\n style={{\n height,\n ...style,\n ...styles?.input,\n }}\n onBlur={onBlur}\n onChange={onChange}\n onFocus={onFocus}\n onValueChanging={onValueChanging}\n onChangeEnd={(v) => {\n onChangeEnd?.(v);\n setEdited(false);\n }}\n {...inputProps}\n />\n );\n\n const content = (\n <>\n <span>{value}</span>\n {showEditIcon && (\n <ActionIcon\n icon={Edit3}\n size=\"small\"\n title={'Edit'}\n onClick={() => {\n setEdited(!edited);\n }}\n />\n )}\n </>\n );\n\n return (\n <Flexbox\n horizontal\n align={'center'}\n className={cx(className, classNames?.container)}\n gap={gap}\n style={{\n height,\n width: '100%',\n ...style,\n ...styles?.container,\n }}\n {...rest}\n >\n {edited ? input : content}\n </Flexbox>\n );\n },\n);\n\nEditableText.displayName = 'EditableText';\n\nexport default EditableText;\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,eAAe,MAClB,EACC,OACA,eAAe,MACf,UACA,SACA,iBACA,aACA,SACA,QACA,WACA,YACA,iBACA,MAAM,GACN,OACA,OAAO,SACP,QACA,YACA,UAAU,cACV,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAaA,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;CACT,CAAC;CAED,WACE,aACM;EACJ,UAAU,KAAK;CACjB,GACA;EACE,kBAAkB;EAClB,SAAS;EACT,gBAAgB;CAClB,CACF;CAEA,MAAM,SAAS,cAAc;EAC3B,IAAI,CAAC,MAAM,OAAO;EAClB,QAAQ,MAAR;GACE,KAAK,SACH,OAAO;GAET,KAAK,UACH,OAAO;GAET,KAAK,SACH,OAAO;EAEX;CACF,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,QACJ,oBAAC,cAAD;EACE,WAAW,GAAG,WAAW,YAAY,KAAK;EACpC;EACC;EACE;EACT,OAAO;GACL;GACA,GAAG;GACH,GAAG,QAAQ;EACb;EACQ;EACE;EACD;EACQ;EACjB,cAAc,MAAM;GAClB,cAAc,CAAC;GACf,UAAU,KAAK;EACjB;EACA,GAAI;CACL,CAAA;CAGH,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAClB,gBACC,oBAAC,YAAD;EACE,MAAM;EACN,MAAK;EACL,OAAO;EACP,eAAe;GACb,UAAU,CAAC,MAAM;EACnB;CACD,CAAA,CAEH,EAAA,CAAA;CAGJ,OACE,oBAACC,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW,GAAG,WAAW,YAAY,SAAS;EACzC;EACL,OAAO;GACL;GACA,OAAO;GACP,GAAG;GACH,GAAG,QAAQ;EACb;EACA,GAAI;YAEH,SAAS,QAAQ;CACX,CAAA;AAEb,CACF;AAEA,aAAa,cAAc"}
1
+ {"version":3,"file":"EditableText.mjs","names":["useControlledState","Flexbox"],"sources":["../../src/EditableText/EditableText.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { Edit3 } from 'lucide-react';\nimport { memo, useMemo } from 'react';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\n\nimport ControlInput from './ControlInput';\nimport type { EditableTextProps } from './type';\n\nconst EditableText = memo<EditableTextProps>(\n ({\n value,\n showEditIcon = true,\n onChange,\n editing,\n onEditingChange,\n onChangeEnd,\n onFocus,\n onBlur,\n className,\n inputProps,\n onValueChanging,\n gap = 8,\n style,\n size = 'small',\n styles,\n classNames,\n variant = 'borderless',\n ...rest\n }) => {\n const [edited, setEdited] = useControlledState(false, {\n onChange: onEditingChange,\n value: editing,\n });\n\n useHotkeys(\n 'esc',\n () => {\n setEdited(false);\n },\n {\n enableOnFormTags: true,\n enabled: edited,\n preventDefault: true,\n },\n );\n\n const height = useMemo(() => {\n if (!size) return 32;\n switch (size) {\n case 'large': {\n return 40;\n }\n case 'middle': {\n return 32;\n }\n case 'small': {\n return 24;\n }\n }\n }, [size]);\n\n const input = (\n <ControlInput\n className={cx(className, classNames?.input)}\n size={size}\n value={value as string}\n variant={variant}\n style={{\n height,\n ...style,\n ...styles?.input,\n }}\n onBlur={onBlur}\n onChange={onChange}\n onFocus={onFocus}\n onValueChanging={onValueChanging}\n onChangeEnd={(v) => {\n onChangeEnd?.(v);\n setEdited(false);\n }}\n {...inputProps}\n />\n );\n\n const content = (\n <>\n <span>{value}</span>\n {showEditIcon && (\n <ActionIcon\n icon={Edit3}\n size=\"small\"\n title={'Edit'}\n onClick={() => {\n setEdited(!edited);\n }}\n />\n )}\n </>\n );\n\n return (\n <Flexbox\n horizontal\n align={'center'}\n className={cx(className, classNames?.container)}\n gap={gap}\n style={{\n height,\n width: '100%',\n ...style,\n ...styles?.container,\n }}\n {...rest}\n >\n {edited ? input : content}\n </Flexbox>\n );\n },\n);\n\nEditableText.displayName = 'EditableText';\n\nexport default EditableText;\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,eAAe,MAClB,EACC,OACA,eAAe,MACf,UACA,SACA,iBACA,aACA,SACA,QACA,WACA,YACA,iBACA,MAAM,GACN,OACA,OAAO,SACP,QACA,YACA,UAAU,cACV,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAaA,cAAmB,OAAO;EACpD,UAAU;EACV,OAAO;CACT,CAAC;CAED,WACE,aACM;EACJ,UAAU,KAAK;CACjB,GACA;EACE,kBAAkB;EAClB,SAAS;EACT,gBAAgB;CAClB,CACF;CAEA,MAAM,SAAS,cAAc;EAC3B,IAAI,CAAC,MAAM,OAAO;EAClB,QAAQ,MAAR;GACE,KAAK,SACH,OAAO;GAET,KAAK,UACH,OAAO;GAET,KAAK,SACH,OAAO;EAEX;CACF,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,QACJ,oBAAC,cAAD;EACE,WAAW,GAAG,WAAW,YAAY,KAAK;EACpC;EACC;EACE;EACT,OAAO;GACL;GACA,GAAG;GACH,GAAG,QAAQ;EACb;EACQ;EACE;EACD;EACQ;EACjB,cAAc,MAAM;GAClB,cAAc,CAAC;GACf,UAAU,KAAK;EACjB;EACA,GAAI;CACL,CAAA;CAGH,MAAM,UACJ,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAClB,gBACC,oBAAC,YAAD;EACE,MAAM;EACN,MAAK;EACL,OAAO;EACP,eAAe;GACb,UAAU,CAAC,MAAM;EACnB;CACD,CAAA,CAEH,EAAA,CAAA;CAGJ,OACE,oBAACC,mBAAD;EACE,YAAA;EACA,OAAO;EACP,WAAW,GAAG,WAAW,YAAY,SAAS;EACzC;EACL,OAAO;GACL;GACA,OAAO;GACP,GAAG;GACH,GAAG,QAAQ;EACb;EACA,GAAI;EAEH,UAAA,SAAS,QAAQ;CACX,CAAA;AAEb,CACF;AAEA,aAAa,cAAc"}