@lobehub/ui 4.1.9 → 4.2.1

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 (161) hide show
  1. package/es/Accordion/Accordion.d.mts +2 -2
  2. package/es/Accordion/Accordion.mjs +2 -2
  3. package/es/Accordion/Accordion.mjs.map +1 -1
  4. package/es/Accordion/AccordionItem.d.mts +2 -2
  5. package/es/Accordion/AccordionItem.mjs +161 -93
  6. package/es/Accordion/AccordionItem.mjs.map +1 -1
  7. package/es/Accordion/context.mjs +1 -3
  8. package/es/Accordion/context.mjs.map +1 -1
  9. package/es/Accordion/type.d.mts +17 -0
  10. package/es/ActionIcon/ActionIcon.d.mts +2 -2
  11. package/es/Alert/Alert.d.mts +2 -2
  12. package/es/AutoComplete/Select.d.mts +2 -2
  13. package/es/Avatar/AvatarGroup/index.d.mts +2 -2
  14. package/es/Burger/Burger.d.mts +2 -2
  15. package/es/Checkbox/Checkbox.d.mts +8 -0
  16. package/es/Checkbox/Checkbox.mjs +63 -0
  17. package/es/Checkbox/Checkbox.mjs.map +1 -0
  18. package/es/Checkbox/index.d.mts +3 -0
  19. package/es/Checkbox/index.d.ts +1 -0
  20. package/es/Checkbox/index.js +1 -0
  21. package/es/Checkbox/index.mjs +3 -0
  22. package/es/Checkbox/style.mjs +21 -0
  23. package/es/Checkbox/style.mjs.map +1 -0
  24. package/es/Checkbox/type.d.mts +31 -0
  25. package/es/CodeEditor/CodeEditor.d.mts +2 -2
  26. package/es/CodeEditor/CodeEditor.mjs +2 -2
  27. package/es/CodeEditor/CodeEditor.mjs.map +1 -1
  28. package/es/Collapse/Collapse.d.mts +2 -2
  29. package/es/ColorSwatches/ColorSwatches.mjs +2 -2
  30. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  31. package/es/ConfigProvider/index.d.mts +2 -2
  32. package/es/CopyButton/CopyButton.d.mts +2 -2
  33. package/es/DatePicker/DatePicker.d.mts +2 -2
  34. package/es/DraggablePanel/DraggablePanel.mjs +2 -2
  35. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
  36. package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
  37. package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
  38. package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
  39. package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
  40. package/es/DraggablePanel/components/DraggablePanelHeader.mjs +2 -2
  41. package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
  42. package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
  43. package/es/DraggableSideNav/DraggableSideNav.mjs +2 -2
  44. package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
  45. package/es/Drawer/Drawer.d.mts +2 -2
  46. package/es/Dropdown/Dropdown.d.mts +2 -2
  47. package/es/EditableText/EditableText.d.mts +2 -2
  48. package/es/EditableText/EditableText.mjs +2 -2
  49. package/es/EditableText/EditableText.mjs.map +1 -1
  50. package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
  51. package/es/EmojiPicker/EmojiPicker.mjs +3 -3
  52. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  53. package/es/Flex/FlexBasic.d.mts +2 -2
  54. package/es/FontLoader/index.d.mts +2 -2
  55. package/es/Footer/Footer.d.mts +2 -2
  56. package/es/Form/components/FormGroup.d.mts +2 -2
  57. package/es/Form/components/FormItem.d.mts +2 -2
  58. package/es/Form/components/FormSubmitFooter.d.mts +2 -2
  59. package/es/FormModal/FormModal.d.mts +2 -2
  60. package/es/Header/Header.d.mts +2 -2
  61. package/es/Highlighter/Highlighter.d.mts +2 -2
  62. package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
  63. package/es/Highlighter/SyntaxHighlighter/index.mjs +7 -0
  64. package/es/Highlighter/SyntaxHighlighter/index.mjs.map +1 -1
  65. package/es/Highlighter/SyntaxHighlighter/style.mjs +17 -1
  66. package/es/Highlighter/SyntaxHighlighter/style.mjs.map +1 -1
  67. package/es/Hotkey/Hotkey.d.mts +2 -2
  68. package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
  69. package/es/HotkeyInput/HotkeyInput.mjs +2 -2
  70. package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
  71. package/es/Icon/Icon.d.mts +2 -2
  72. package/es/Icon/components/IconProvider.d.mts +3 -3
  73. package/es/Image/PreviewGroup.d.mts +2 -2
  74. package/es/ImageSelect/ImageSelect.d.mts +2 -2
  75. package/es/ImageSelect/ImageSelect.mjs +2 -2
  76. package/es/ImageSelect/ImageSelect.mjs.map +1 -1
  77. package/es/Input/Input.d.mts +2 -2
  78. package/es/Input/InputNumber.d.mts +2 -2
  79. package/es/Input/InputOPT.d.mts +2 -2
  80. package/es/Input/InputPassword.d.mts +2 -2
  81. package/es/Input/TextArea.d.mts +2 -2
  82. package/es/Layout/components/LayoutFooter.d.mts +2 -2
  83. package/es/Layout/components/LayoutHeader.d.mts +2 -2
  84. package/es/Layout/components/LayoutMain.d.mts +2 -2
  85. package/es/Layout/components/LayoutSidebar.d.mts +2 -2
  86. package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
  87. package/es/Layout/components/LayoutToc.d.mts +2 -2
  88. package/es/List/ListItem/index.d.mts +2 -2
  89. package/es/Markdown/Markdown.d.mts +2 -2
  90. package/es/Markdown/SyntaxMarkdown/style.mjs +9 -8
  91. package/es/Markdown/SyntaxMarkdown/style.mjs.map +1 -1
  92. package/es/Markdown/Typography.d.mts +2 -2
  93. package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
  94. package/es/MaskShadow/MaskShadow.d.mts +2 -2
  95. package/es/Menu/Menu.d.mts +2 -2
  96. package/es/Mermaid/Mermaid.d.mts +2 -2
  97. package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
  98. package/es/Modal/Modal.d.mts +2 -2
  99. package/es/MotionProvider/index.d.mts +2 -2
  100. package/es/SearchBar/SearchBar.d.mts +2 -2
  101. package/es/SearchBar/SearchBar.mjs +2 -2
  102. package/es/SearchBar/SearchBar.mjs.map +1 -1
  103. package/es/Segmented/Segmented.d.mts +2 -2
  104. package/es/Select/Select.d.mts +2 -2
  105. package/es/SideNav/SideNav.d.mts +2 -2
  106. package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
  107. package/es/SortableList/components/DragHandle.d.mts +2 -2
  108. package/es/SortableList/components/SortableItem.d.mts +2 -2
  109. package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
  110. package/es/Toc/Toc.d.mts +2 -2
  111. package/es/Toc/TocMobile.mjs +2 -2
  112. package/es/Toc/TocMobile.mjs.map +1 -1
  113. package/es/Video/index.d.mts +2 -2
  114. package/es/awesome/Giscus/Giscus.d.mts +2 -2
  115. package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
  116. package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
  117. package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
  118. package/es/awesome/Hero/Hero.d.mts +2 -2
  119. package/es/awesome/Spline/Spine.d.mts +2 -2
  120. package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
  121. package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
  122. package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
  123. package/es/brand/BrandLoading/{style-Cof4dJBw.css → style-Ci5ZSi4a.css} +1 -1
  124. package/es/brand/BrandLoading/{style-Cof4dJBw.css.map → style-Ci5ZSi4a.css.map} +1 -1
  125. package/es/brand/LobeChat/index.d.mts +2 -2
  126. package/es/brand/LobeHub/index.d.mts +2 -2
  127. package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
  128. package/es/brand/LogoThree/index.d.mts +2 -2
  129. package/es/chat/BackBottom/BackBottom.d.mts +2 -2
  130. package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
  131. package/es/chat/ChatItem/ChatItem.d.mts +2 -2
  132. package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
  133. package/es/chat/EditableMessage/EditableMessage.mjs +3 -3
  134. package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
  135. package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
  136. package/es/chat/MessageModal/MessageModal.mjs +3 -3
  137. package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
  138. package/es/color/ColorScales/index.d.mts +2 -2
  139. package/es/i18n/context.d.mts +2 -2
  140. package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
  141. package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
  142. package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
  143. package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
  144. package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
  145. package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
  146. package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
  147. package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
  148. package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
  149. package/es/icons/lucideExtra/ProviderIcon.d.mts +2 -2
  150. package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
  151. package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +2 -2
  152. package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +2 -2
  153. package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +2 -2
  154. package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
  155. package/es/index.d.mts +7 -4
  156. package/es/index.mjs +2 -1
  157. package/es/mdx/Mdx/index.d.mts +2 -2
  158. package/es/mobile/TabBar/TabBar.mjs +2 -2
  159. package/es/mobile/TabBar/TabBar.mjs.map +1 -1
  160. package/es/storybook/StoryBook/index.d.mts +2 -2
  161. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableSideNav.mjs","names":["handleResize: ResizeCallback","ref","handleResizeStop: ResizeCallback","Center","Icon","Flexbox"],"sources":["../../src/DraggableSideNav/DraggableSideNav.tsx"],"sourcesContent":["'use client';\n\nimport { useHover } from 'ahooks';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Resizable, ResizeCallback } from 're-resizable';\nimport { CSSProperties, memo, useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { useStyles } 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 { styles, cx } = useStyles({ backgroundColor, showBorder });\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 className={cx(\n styles.toggleRoot,\n placement === 'left' ? styles.toggleLeft : styles.toggleRight,\n )}\n style={handleRootStyle}\n >\n <Center className={classNames?.handle} onClick={toggleExpand} style={handleCenterStyle}>\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: maxWidth,\n minWidth: 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 () => cx(styles.contentContainer, styles.menuOverride, classNames?.content),\n [cx, styles.contentContainer, styles.menuOverride, classNames?.content],\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 onResize={handleResize}\n onResizeStart={handleResizeStart}\n onResizeStop={handleResizeStop}\n style={containerStyle}\n >\n {handle}\n <Flexbox className={contentClassName} style={customStyles?.content}>\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","handleResize: ResizeCallback","ref","handleResizeStop: ResizeCallback","Center","Icon","Flexbox"],"sources":["../../src/DraggableSideNav/DraggableSideNav.tsx"],"sourcesContent":["'use client';\n\nimport { useHover } from 'ahooks';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Resizable, ResizeCallback } from 're-resizable';\nimport { CSSProperties, memo, useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\n\nimport { useStyles } 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 { styles, cx } = useStyles({ backgroundColor, showBorder });\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 className={cx(\n styles.toggleRoot,\n placement === 'left' ? styles.toggleLeft : styles.toggleRight,\n )}\n style={handleRootStyle}\n >\n <Center className={classNames?.handle} onClick={toggleExpand} style={handleCenterStyle}>\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: maxWidth,\n minWidth: 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 () => cx(styles.contentContainer, styles.menuOverride, classNames?.content),\n [cx, styles.contentContainer, styles.menuOverride, classNames?.content],\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 onResize={handleResize}\n onResizeStart={handleResizeStart}\n onResizeStop={handleResizeStop}\n style={containerStyle}\n >\n {handle}\n <Flexbox className={contentClassName} style={customStyles?.content}>\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,8 +1,8 @@
1
1
  import { DrawerProps } from "./type.mjs";
2
- import * as react21 from "react";
2
+ import * as react28 from "react";
3
3
 
4
4
  //#region src/Drawer/Drawer.d.ts
5
- declare const Drawer: react21.NamedExoticComponent<DrawerProps>;
5
+ declare const Drawer: react28.NamedExoticComponent<DrawerProps>;
6
6
  //#endregion
7
7
  export { Drawer };
8
8
  //# sourceMappingURL=Drawer.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { DropdownProps } from "./type.mjs";
2
- import * as react29 from "react";
2
+ import * as react27 from "react";
3
3
 
4
4
  //#region src/Dropdown/Dropdown.d.ts
5
- declare const Dropdown: react29.NamedExoticComponent<DropdownProps>;
5
+ declare const Dropdown: react27.NamedExoticComponent<DropdownProps>;
6
6
  //#endregion
7
7
  export { Dropdown };
8
8
  //# sourceMappingURL=Dropdown.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { EditableTextProps } from "./type.mjs";
2
- import * as react12 from "react";
2
+ import * as react25 from "react";
3
3
 
4
4
  //#region src/EditableText/EditableText.d.ts
5
- declare const EditableText: react12.NamedExoticComponent<EditableTextProps>;
5
+ declare const EditableText: react25.NamedExoticComponent<EditableTextProps>;
6
6
  //#endregion
7
7
  export { EditableText };
8
8
  //# sourceMappingURL=EditableText.d.mts.map
@@ -5,14 +5,14 @@ import ActionIcon_default from "../ActionIcon/ActionIcon.mjs";
5
5
  import ControlInput_default from "./ControlInput.mjs";
6
6
  import { memo, useMemo } from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
- import useControlledState from "use-merge-value";
8
+ import useMergeState from "use-merge-value";
9
9
  import { cx } from "antd-style";
10
10
  import { Edit3 } from "lucide-react";
11
11
  import { useHotkeys } from "react-hotkeys-hook";
12
12
 
13
13
  //#region src/EditableText/EditableText.tsx
14
14
  const EditableText = memo(({ value, showEditIcon = true, onChange, editing, onEditingChange, onChangeEnd, onFocus, onBlur, className, inputProps, onValueChanging, gap = 8, style, size = "small", styles, classNames, variant = "borderless", ...rest }) => {
15
- const [edited, setEdited] = useControlledState(false, {
15
+ const [edited, setEdited] = useMergeState(false, {
16
16
  onChange: onEditingChange,
17
17
  value: editing
18
18
  });
@@ -1 +1 @@
1
- {"version":3,"file":"EditableText.mjs","names":["ControlInput","ActionIcon","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 onBlur={onBlur}\n onChange={onChange}\n onChangeEnd={(v) => {\n onChangeEnd?.(v);\n setEdited(false);\n }}\n onFocus={onFocus}\n onValueChanging={onValueChanging}\n size={size}\n style={{\n height,\n ...style,\n ...styles?.input,\n }}\n value={value as string}\n variant={variant}\n {...inputProps}\n />\n );\n\n const content = (\n <>\n <span>{value}</span>\n {showEditIcon && (\n <ActionIcon\n icon={Edit3}\n onClick={() => {\n setEdited(!edited);\n }}\n size=\"small\"\n title={'Edit'}\n />\n )}\n </>\n );\n\n return (\n <Flexbox\n align={'center'}\n className={cx(className, classNames?.container)}\n gap={gap}\n horizontal\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,aAAa,mBAAmB,OAAO;EACpD,UAAU;EACV,OAAO;EACR,CAAC;AAEF,YACE,aACM;AACJ,YAAU,MAAM;IAElB;EACE,kBAAkB;EAClB,SAAS;EACT,gBAAgB;EACjB,CACF;CAED,MAAM,SAAS,cAAc;AAC3B,MAAI,CAAC,KAAM,QAAO;AAClB,UAAQ,MAAR;GACE,KAAK,QACH,QAAO;GAET,KAAK,SACH,QAAO;GAET,KAAK,QACH,QAAO;;IAGV,CAAC,KAAK,CAAC;CAEV,MAAM,QACJ,oBAACA;EACC,WAAW,GAAG,WAAW,YAAY,MAAM;EACnC;EACE;EACV,cAAc,MAAM;AAClB,iBAAc,EAAE;AAChB,aAAU,MAAM;;EAET;EACQ;EACX;EACN,OAAO;GACL;GACA,GAAG;GACH,GAAG,QAAQ;GACZ;EACM;EACE;EACT,GAAI;GACJ;CAGJ,MAAM,UACJ,8CACE,oBAAC,oBAAM,QAAa,EACnB,gBACC,oBAACC;EACC,MAAM;EACN,eAAe;AACb,aAAU,CAAC,OAAO;;EAEpB,MAAK;EACL,OAAO;GACP,IAEH;AAGL,QACE,oBAACC;EACC,OAAO;EACP,WAAW,GAAG,WAAW,YAAY,UAAU;EAC1C;EACL;EACA,OAAO;GACL;GACA,OAAO;GACP,GAAG;GACH,GAAG,QAAQ;GACZ;EACD,GAAI;YAEH,SAAS,QAAQ;GACV;EAGf;AAED,aAAa,cAAc;AAE3B,2BAAe"}
1
+ {"version":3,"file":"EditableText.mjs","names":["useControlledState","ControlInput","ActionIcon","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 onBlur={onBlur}\n onChange={onChange}\n onChangeEnd={(v) => {\n onChangeEnd?.(v);\n setEdited(false);\n }}\n onFocus={onFocus}\n onValueChanging={onValueChanging}\n size={size}\n style={{\n height,\n ...style,\n ...styles?.input,\n }}\n value={value as string}\n variant={variant}\n {...inputProps}\n />\n );\n\n const content = (\n <>\n <span>{value}</span>\n {showEditIcon && (\n <ActionIcon\n icon={Edit3}\n onClick={() => {\n setEdited(!edited);\n }}\n size=\"small\"\n title={'Edit'}\n />\n )}\n </>\n );\n\n return (\n <Flexbox\n align={'center'}\n className={cx(className, classNames?.container)}\n gap={gap}\n horizontal\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;EACR,CAAC;AAEF,YACE,aACM;AACJ,YAAU,MAAM;IAElB;EACE,kBAAkB;EAClB,SAAS;EACT,gBAAgB;EACjB,CACF;CAED,MAAM,SAAS,cAAc;AAC3B,MAAI,CAAC,KAAM,QAAO;AAClB,UAAQ,MAAR;GACE,KAAK,QACH,QAAO;GAET,KAAK,SACH,QAAO;GAET,KAAK,QACH,QAAO;;IAGV,CAAC,KAAK,CAAC;CAEV,MAAM,QACJ,oBAACC;EACC,WAAW,GAAG,WAAW,YAAY,MAAM;EACnC;EACE;EACV,cAAc,MAAM;AAClB,iBAAc,EAAE;AAChB,aAAU,MAAM;;EAET;EACQ;EACX;EACN,OAAO;GACL;GACA,GAAG;GACH,GAAG,QAAQ;GACZ;EACM;EACE;EACT,GAAI;GACJ;CAGJ,MAAM,UACJ,8CACE,oBAAC,oBAAM,QAAa,EACnB,gBACC,oBAACC;EACC,MAAM;EACN,eAAe;AACb,aAAU,CAAC,OAAO;;EAEpB,MAAK;EACL,OAAO;GACP,IAEH;AAGL,QACE,oBAACC;EACC,OAAO;EACP,WAAW,GAAG,WAAW,YAAY,UAAU;EAC1C;EACL;EACA,OAAO;GACL;GACA,OAAO;GACP,GAAG;GACH,GAAG,QAAQ;GACZ;EACD,GAAI;YAEH,SAAS,QAAQ;GACV;EAGf;AAED,aAAa,cAAc;AAE3B,2BAAe"}
@@ -1,8 +1,8 @@
1
1
  import { EmojiPickerProps } from "./type.mjs";
2
- import * as react11 from "react";
2
+ import * as react26 from "react";
3
3
 
4
4
  //#region src/EmojiPicker/EmojiPicker.d.ts
5
- declare const EmojiPicker: react11.NamedExoticComponent<EmojiPickerProps>;
5
+ declare const EmojiPicker: react26.NamedExoticComponent<EmojiPickerProps>;
6
6
  //#endregion
7
7
  export { EmojiPicker };
8
8
  //# sourceMappingURL=EmojiPicker.d.mts.map
@@ -13,7 +13,7 @@ import { useStyles } from "./style.mjs";
13
13
  import { memo, useRef, useState } from "react";
14
14
  import { jsx, jsxs } from "react/jsx-runtime";
15
15
  import { Popover } from "antd";
16
- import useControlledState from "use-merge-value";
16
+ import useMergeState from "use-merge-value";
17
17
  import { SmileIcon, TrashIcon, UploadIcon } from "lucide-react";
18
18
  import useSWR from "swr";
19
19
  import data from "@emoji-mart/data";
@@ -24,7 +24,7 @@ const DEFAULT_AVATAR = "🤖";
24
24
  const EmojiPicker = memo(({ value, defaultAvatar = DEFAULT_AVATAR, onChange, locale = "en-US", allowUpload, allowDelete, texts, onDelete, compressSize = 256, customEmojis, className, loading, onUpload, customTabs = [], popupClassName, popupStyle, customRender, open, defaultOpen = false, onOpenChange, popupProps, shape, ...rest }) => {
25
25
  const ref = useRef(null);
26
26
  const { t } = useTranslation(emojiPicker_default);
27
- const [visible, setVisible] = useControlledState(defaultOpen, {
27
+ const [visible, setVisible] = useMergeState(defaultOpen, {
28
28
  defaultValue: defaultOpen,
29
29
  onChange: onOpenChange,
30
30
  value: open
@@ -35,7 +35,7 @@ const EmojiPicker = memo(({ value, defaultAvatar = DEFAULT_AVATAR, onChange, loc
35
35
  revalidateOnFocus: false,
36
36
  revalidateOnMount: false
37
37
  });
38
- const [ava, setAva] = useControlledState(defaultAvatar, {
38
+ const [ava, setAva] = useMergeState(defaultAvatar, {
39
39
  defaultValue: defaultAvatar,
40
40
  onChange,
41
41
  value
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiPicker.mjs","names":["emojiPickerMessages","useMergeState","items: TabsProps['items']","Tooltip","Icon","tab","Flexbox","Tabs","ActionIcon","AvatarUploader","Avatar"],"sources":["../../src/EmojiPicker/EmojiPicker.tsx"],"sourcesContent":["'use client';\n\nimport data from '@emoji-mart/data';\nimport Picker from '@emoji-mart/react';\nimport { Popover } from 'antd';\nimport { SmileIcon, TrashIcon, UploadIcon } from 'lucide-react';\nimport { memo, useRef, useState } from 'react';\nimport useSWR from 'swr';\nimport useMergeState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport Avatar from '@/Avatar';\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport Tabs, { TabsProps } from '@/Tabs';\nimport Tooltip from '@/Tooltip';\nimport emojiPickerMessages from '@/i18n/resources/en/emojiPicker';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport AvatarUploader from './AvatarUploader';\nimport { useStyles } from './style';\nimport type { EmojiPickerProps } from './type';\n\nconst DEFAULT_AVATAR = '🤖';\n\nconst EmojiPicker = memo<EmojiPickerProps>(\n ({\n value,\n defaultAvatar = DEFAULT_AVATAR,\n onChange,\n locale = 'en-US',\n allowUpload,\n allowDelete,\n texts,\n onDelete,\n compressSize = 256,\n customEmojis,\n className,\n loading,\n onUpload,\n customTabs = [],\n popupClassName,\n popupStyle,\n customRender,\n open,\n defaultOpen = false,\n onOpenChange,\n popupProps,\n shape,\n ...rest\n }) => {\n const ref = useRef<HTMLDivElement>(null);\n const { t } = useTranslation(emojiPickerMessages);\n const [visible, setVisible] = useMergeState(defaultOpen, {\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n value: open,\n });\n const [tab, setTab] = useState<'emoji' | 'upload'>('emoji');\n\n const { cx, styles, theme } = useStyles();\n\n const { data: i18n } = useSWR(\n locale,\n async () => await import(`@emoji-mart/data/i18n/${locale.split('-')[0]}.json`),\n { revalidateOnFocus: false, revalidateOnMount: false },\n );\n\n const [ava, setAva] = useMergeState(defaultAvatar, {\n defaultValue: defaultAvatar,\n onChange,\n value,\n });\n\n const handleAvatarChange = (emoji: string) => {\n setAva(emoji);\n setVisible(false);\n };\n\n const emojiText = texts?.emoji ?? t('emojiPicker.emoji');\n const uploadText = texts?.upload ?? t('emojiPicker.upload');\n const deleteText = texts?.delete ?? t('emojiPicker.delete');\n\n const hideEmojiTab = typeof allowUpload === 'object' && allowUpload?.enableEmoji === false;\n\n const items: TabsProps['items'] = [\n !hideEmojiTab && {\n key: 'emoji',\n label: (\n <Tooltip title={emojiText}>\n <Icon icon={SmileIcon} size={{ size: 20, strokeWidth: 2.5 }} />\n </Tooltip>\n ),\n },\n allowUpload && {\n key: 'upload',\n label: (\n <Tooltip title={uploadText}>\n <Icon icon={UploadIcon} size={{ size: 20, strokeWidth: 2.5 }} />\n </Tooltip>\n ),\n },\n ...customTabs.map((tab) => ({ key: tab.value, label: tab.label })),\n ].filter(Boolean) as TabsProps['items'];\n\n const showTabs = allowDelete || (items && items.length > 1);\n\n const content = (\n <Flexbox\n className={cx(styles.picker, popupClassName)}\n ref={ref}\n style={{ minWidth: 310, paddingTop: showTabs ? 4 : 0, ...popupStyle }}\n >\n {showTabs && (\n <Flexbox\n align={'center'}\n className={styles.tabs}\n horizontal\n justify={'space-between'}\n paddingInline={10}\n >\n <Tabs\n activeKey={tab}\n compact\n items={items}\n onChange={(key) => setTab(key as any)}\n size={'small'}\n />\n {allowDelete && (\n <ActionIcon\n icon={TrashIcon}\n onClick={() => {\n handleAvatarChange(defaultAvatar);\n onDelete?.();\n }}\n size={{\n blockSize: 32,\n size: 18,\n }}\n title={deleteText}\n />\n )}\n </Flexbox>\n )}\n {tab === 'emoji' && (\n <Picker\n custom={customEmojis}\n data={data}\n i18n={i18n}\n icons={'outline'}\n locale={locale.split('-')[0]}\n navPosition={showTabs ? 'bottom' : 'top'}\n onEmojiSelect={(e: any) => handleAvatarChange(e.src || e.native)}\n previewPosition={'none'}\n skinTonePosition={'none'}\n theme={theme.isDarkMode ? 'dark' : 'light'}\n />\n )}\n {tab === 'upload' && (\n <AvatarUploader\n compressSize={compressSize}\n onChange={handleAvatarChange}\n onUpload={onUpload}\n shape={shape}\n texts={texts}\n />\n )}\n {customTabs.map(\n (item) =>\n tab === item.value && (\n <Flexbox key={item.value} padding={10}>\n {item.render(handleAvatarChange)}\n </Flexbox>\n ),\n )}\n </Flexbox>\n );\n\n return (\n <Popover\n arrow={false}\n content={content}\n defaultOpen={defaultOpen}\n onOpenChange={(v) => {\n if (loading) return;\n setVisible(v);\n }}\n open={visible}\n placement={'bottom'}\n rootClassName={styles.popover}\n trigger={['click']}\n {...popupProps}\n >\n {customRender ? (\n customRender(ava)\n ) : (\n <Avatar\n avatar={ava}\n className={cx(styles.root, className)}\n loading={loading}\n shape={shape}\n {...rest}\n />\n )}\n </Popover>\n );\n },\n);\n\nEmojiPicker.displayName = 'EmojiPicker';\n\nexport default EmojiPicker;\n"],"mappings":"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"}
1
+ {"version":3,"file":"EmojiPicker.mjs","names":["emojiPickerMessages","items: TabsProps['items']","Tooltip","Icon","tab","Flexbox","Tabs","ActionIcon","AvatarUploader","Avatar"],"sources":["../../src/EmojiPicker/EmojiPicker.tsx"],"sourcesContent":["'use client';\n\nimport data from '@emoji-mart/data';\nimport Picker from '@emoji-mart/react';\nimport { Popover } from 'antd';\nimport { SmileIcon, TrashIcon, UploadIcon } from 'lucide-react';\nimport { memo, useRef, useState } from 'react';\nimport useSWR from 'swr';\nimport useMergeState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport Avatar from '@/Avatar';\nimport { Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport Tabs, { TabsProps } from '@/Tabs';\nimport Tooltip from '@/Tooltip';\nimport emojiPickerMessages from '@/i18n/resources/en/emojiPicker';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport AvatarUploader from './AvatarUploader';\nimport { useStyles } from './style';\nimport type { EmojiPickerProps } from './type';\n\nconst DEFAULT_AVATAR = '🤖';\n\nconst EmojiPicker = memo<EmojiPickerProps>(\n ({\n value,\n defaultAvatar = DEFAULT_AVATAR,\n onChange,\n locale = 'en-US',\n allowUpload,\n allowDelete,\n texts,\n onDelete,\n compressSize = 256,\n customEmojis,\n className,\n loading,\n onUpload,\n customTabs = [],\n popupClassName,\n popupStyle,\n customRender,\n open,\n defaultOpen = false,\n onOpenChange,\n popupProps,\n shape,\n ...rest\n }) => {\n const ref = useRef<HTMLDivElement>(null);\n const { t } = useTranslation(emojiPickerMessages);\n const [visible, setVisible] = useMergeState(defaultOpen, {\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n value: open,\n });\n const [tab, setTab] = useState<'emoji' | 'upload'>('emoji');\n\n const { cx, styles, theme } = useStyles();\n\n const { data: i18n } = useSWR(\n locale,\n async () => await import(`@emoji-mart/data/i18n/${locale.split('-')[0]}.json`),\n { revalidateOnFocus: false, revalidateOnMount: false },\n );\n\n const [ava, setAva] = useMergeState(defaultAvatar, {\n defaultValue: defaultAvatar,\n onChange,\n value,\n });\n\n const handleAvatarChange = (emoji: string) => {\n setAva(emoji);\n setVisible(false);\n };\n\n const emojiText = texts?.emoji ?? t('emojiPicker.emoji');\n const uploadText = texts?.upload ?? t('emojiPicker.upload');\n const deleteText = texts?.delete ?? t('emojiPicker.delete');\n\n const hideEmojiTab = typeof allowUpload === 'object' && allowUpload?.enableEmoji === false;\n\n const items: TabsProps['items'] = [\n !hideEmojiTab && {\n key: 'emoji',\n label: (\n <Tooltip title={emojiText}>\n <Icon icon={SmileIcon} size={{ size: 20, strokeWidth: 2.5 }} />\n </Tooltip>\n ),\n },\n allowUpload && {\n key: 'upload',\n label: (\n <Tooltip title={uploadText}>\n <Icon icon={UploadIcon} size={{ size: 20, strokeWidth: 2.5 }} />\n </Tooltip>\n ),\n },\n ...customTabs.map((tab) => ({ key: tab.value, label: tab.label })),\n ].filter(Boolean) as TabsProps['items'];\n\n const showTabs = allowDelete || (items && items.length > 1);\n\n const content = (\n <Flexbox\n className={cx(styles.picker, popupClassName)}\n ref={ref}\n style={{ minWidth: 310, paddingTop: showTabs ? 4 : 0, ...popupStyle }}\n >\n {showTabs && (\n <Flexbox\n align={'center'}\n className={styles.tabs}\n horizontal\n justify={'space-between'}\n paddingInline={10}\n >\n <Tabs\n activeKey={tab}\n compact\n items={items}\n onChange={(key) => setTab(key as any)}\n size={'small'}\n />\n {allowDelete && (\n <ActionIcon\n icon={TrashIcon}\n onClick={() => {\n handleAvatarChange(defaultAvatar);\n onDelete?.();\n }}\n size={{\n blockSize: 32,\n size: 18,\n }}\n title={deleteText}\n />\n )}\n </Flexbox>\n )}\n {tab === 'emoji' && (\n <Picker\n custom={customEmojis}\n data={data}\n i18n={i18n}\n icons={'outline'}\n locale={locale.split('-')[0]}\n navPosition={showTabs ? 'bottom' : 'top'}\n onEmojiSelect={(e: any) => handleAvatarChange(e.src || e.native)}\n previewPosition={'none'}\n skinTonePosition={'none'}\n theme={theme.isDarkMode ? 'dark' : 'light'}\n />\n )}\n {tab === 'upload' && (\n <AvatarUploader\n compressSize={compressSize}\n onChange={handleAvatarChange}\n onUpload={onUpload}\n shape={shape}\n texts={texts}\n />\n )}\n {customTabs.map(\n (item) =>\n tab === item.value && (\n <Flexbox key={item.value} padding={10}>\n {item.render(handleAvatarChange)}\n </Flexbox>\n ),\n )}\n </Flexbox>\n );\n\n return (\n <Popover\n arrow={false}\n content={content}\n defaultOpen={defaultOpen}\n onOpenChange={(v) => {\n if (loading) return;\n setVisible(v);\n }}\n open={visible}\n placement={'bottom'}\n rootClassName={styles.popover}\n trigger={['click']}\n {...popupProps}\n >\n {customRender ? (\n customRender(ava)\n ) : (\n <Avatar\n avatar={ava}\n className={cx(styles.root, className)}\n loading={loading}\n shape={shape}\n {...rest}\n />\n )}\n </Popover>\n );\n },\n);\n\nEmojiPicker.displayName = 'EmojiPicker';\n\nexport default EmojiPicker;\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { FlexBasicProps } from "./type.mjs";
2
- import * as react8 from "react";
2
+ import * as react24 from "react";
3
3
 
4
4
  //#region src/Flex/FlexBasic.d.ts
5
- declare const _default: react8.NamedExoticComponent<FlexBasicProps>;
5
+ declare const _default: react24.NamedExoticComponent<FlexBasicProps>;
6
6
  //#endregion
7
7
  export { _default };
8
8
  //# sourceMappingURL=FlexBasic.d.mts.map
@@ -1,10 +1,10 @@
1
- import * as react62 from "react";
1
+ import * as react55 from "react";
2
2
 
3
3
  //#region src/FontLoader/index.d.ts
4
4
  interface FontLoaderProps {
5
5
  url: string;
6
6
  }
7
- declare const FontLoader: react62.NamedExoticComponent<FontLoaderProps>;
7
+ declare const FontLoader: react55.NamedExoticComponent<FontLoaderProps>;
8
8
  //#endregion
9
9
  export { FontLoader, FontLoaderProps };
10
10
  //# sourceMappingURL=index.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { FooterProps } from "./type.mjs";
2
- import * as react7 from "react";
2
+ import * as react23 from "react";
3
3
 
4
4
  //#region src/Footer/Footer.d.ts
5
- declare const Footer: react7.NamedExoticComponent<FooterProps>;
5
+ declare const Footer: react23.NamedExoticComponent<FooterProps>;
6
6
  //#endregion
7
7
  export { Footer };
8
8
  //# sourceMappingURL=Footer.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { FormGroupProps } from "../type.mjs";
2
- import * as react66 from "react";
2
+ import * as react20 from "react";
3
3
 
4
4
  //#region src/Form/components/FormGroup.d.ts
5
- declare const FormGroup: react66.NamedExoticComponent<FormGroupProps>;
5
+ declare const FormGroup: react20.NamedExoticComponent<FormGroupProps>;
6
6
  //#endregion
7
7
  export { FormGroup };
8
8
  //# sourceMappingURL=FormGroup.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { FormItemProps } from "../type.mjs";
2
- import * as react67 from "react";
2
+ import * as react21 from "react";
3
3
 
4
4
  //#region src/Form/components/FormItem.d.ts
5
- declare const FormItem: react67.NamedExoticComponent<FormItemProps>;
5
+ declare const FormItem: react21.NamedExoticComponent<FormItemProps>;
6
6
  //#endregion
7
7
  export { FormItem };
8
8
  //# sourceMappingURL=FormItem.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { FormSubmitFooterProps } from "../type.mjs";
2
- import * as react68 from "react";
2
+ import * as react22 from "react";
3
3
 
4
4
  //#region src/Form/components/FormSubmitFooter.d.ts
5
- declare const FormSubmitFooter: react68.NamedExoticComponent<FormSubmitFooterProps>;
5
+ declare const FormSubmitFooter: react22.NamedExoticComponent<FormSubmitFooterProps>;
6
6
  //#endregion
7
7
  export { FormSubmitFooter };
8
8
  //# sourceMappingURL=FormSubmitFooter.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { FormModalProps } from "./type.mjs";
2
- import * as react5 from "react";
2
+ import * as react34 from "react";
3
3
 
4
4
  //#region src/FormModal/FormModal.d.ts
5
- declare const FormModal: react5.NamedExoticComponent<FormModalProps>;
5
+ declare const FormModal: react34.NamedExoticComponent<FormModalProps>;
6
6
  //#endregion
7
7
  export { FormModal };
8
8
  //# sourceMappingURL=FormModal.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { HeaderProps } from "./type.mjs";
2
- import * as react4 from "react";
2
+ import * as react5 from "react";
3
3
 
4
4
  //#region src/Header/Header.d.ts
5
- declare const Header: react4.NamedExoticComponent<HeaderProps>;
5
+ declare const Header: react5.NamedExoticComponent<HeaderProps>;
6
6
  //#endregion
7
7
  export { Header };
8
8
  //# sourceMappingURL=Header.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { HighlighterProps } from "./type.mjs";
2
- import * as react9 from "react";
2
+ import * as react47 from "react";
3
3
 
4
4
  //#region src/Highlighter/Highlighter.d.ts
5
- declare const Highlighter: react9.NamedExoticComponent<HighlighterProps>;
5
+ declare const Highlighter: react47.NamedExoticComponent<HighlighterProps>;
6
6
  //#endregion
7
7
  export { Highlighter };
8
8
  //# sourceMappingURL=Highlighter.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { SyntaxHighlighterProps } from "../type.mjs";
2
- import * as react10 from "react";
2
+ import * as react48 from "react";
3
3
 
4
4
  //#region src/Highlighter/SyntaxHighlighter/index.d.ts
5
- declare const SyntaxHighlighter: react10.NamedExoticComponent<SyntaxHighlighterProps>;
5
+ declare const SyntaxHighlighter: react48.NamedExoticComponent<SyntaxHighlighterProps>;
6
6
  //#endregion
7
7
  export { SyntaxHighlighter };
8
8
  //# sourceMappingURL=index.d.mts.map
@@ -15,6 +15,7 @@ const SyntaxHighlighter = memo(({ animated, children, className, enableTransform
15
15
  const resolvedTheme = isDefaultTheme ? void 0 : theme;
16
16
  const variants = useMemo(() => cva(styles.root, {
17
17
  defaultVariants: {
18
+ animated: false,
18
19
  shiki: true,
19
20
  showBackground: false,
20
21
  variant: "borderless"
@@ -32,15 +33,21 @@ const SyntaxHighlighter = memo(({ animated, children, className, enableTransform
32
33
  showBackground: {
33
34
  false: styles.noBackground,
34
35
  true: null
36
+ },
37
+ animated: {
38
+ true: styles.animated,
39
+ false: null
35
40
  }
36
41
  }
37
42
  }), [styles]);
38
43
  const shikiClassName = cx(variants({
44
+ animated,
39
45
  shiki: true,
40
46
  showBackground,
41
47
  variant
42
48
  }), className);
43
49
  const fallbackClassName = cx(variants({
50
+ animated,
44
51
  shiki: false,
45
52
  showBackground,
46
53
  variant
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["StreamRenderer","StaticRenderer"],"sources":["../../../src/Highlighter/SyntaxHighlighter/index.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { memo, useMemo } from 'react';\n\nimport type { SyntaxHighlighterProps } from '../type';\nimport StaticRenderer from './StaticRenderer';\nimport StreamRenderer from './StreamRenderer';\nimport { useStyles } from './style';\n\nconst SyntaxHighlighter = memo<SyntaxHighlighterProps>(\n ({\n animated,\n children,\n className,\n enableTransformer,\n language,\n style,\n theme,\n variant = 'borderless',\n }) => {\n const { styles, cx } = useStyles();\n const isDefaultTheme = theme === 'lobe-theme' || !theme;\n const showBackground = !isDefaultTheme && variant === 'filled';\n const resolvedTheme = isDefaultTheme ? undefined : theme;\n\n const variants = useMemo(\n () =>\n cva(styles.root, {\n defaultVariants: {\n shiki: true,\n showBackground: false,\n variant: 'borderless',\n },\n /* eslint-disable sort-keys-fix/sort-keys-fix */\n variants: {\n shiki: {\n false: styles.unshiki,\n true: styles.shiki,\n },\n variant: {\n filled: styles.padding,\n outlined: styles.padding,\n borderless: styles.noPadding,\n },\n showBackground: {\n false: styles.noBackground,\n true: null,\n },\n },\n /* eslint-enable sort-keys-fix/sort-keys-fix */\n }),\n [styles],\n );\n\n const shikiClassName = cx(variants({ shiki: true, showBackground, variant }), className);\n const fallbackClassName = cx(variants({ shiki: false, showBackground, variant }), className);\n\n if (animated) {\n return (\n <StreamRenderer\n className={shikiClassName}\n enableTransformer={enableTransformer}\n fallbackClassName={fallbackClassName}\n language={language}\n style={style}\n theme={resolvedTheme}\n >\n {children}\n </StreamRenderer>\n );\n }\n\n return (\n <StaticRenderer\n className={shikiClassName}\n enableTransformer={enableTransformer}\n fallbackClassName={fallbackClassName}\n language={language}\n style={style}\n theme={resolvedTheme}\n >\n {children}\n </StaticRenderer>\n );\n },\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children && prevProps.language === nextProps.language,\n);\n\nSyntaxHighlighter.displayName = 'SyntaxHighlighter';\n\nexport default SyntaxHighlighter;\n"],"mappings":";;;;;;;;;;AAUA,MAAM,oBAAoB,MACvB,EACC,UACA,UACA,WACA,mBACA,UACA,OACA,OACA,UAAU,mBACN;CACJ,MAAM,EAAE,QAAQ,OAAO,WAAW;CAClC,MAAM,iBAAiB,UAAU,gBAAgB,CAAC;CAClD,MAAM,iBAAiB,CAAC,kBAAkB,YAAY;CACtD,MAAM,gBAAgB,iBAAiB,SAAY;CAEnD,MAAM,WAAW,cAEb,IAAI,OAAO,MAAM;EACf,iBAAiB;GACf,OAAO;GACP,gBAAgB;GAChB,SAAS;GACV;EAED,UAAU;GACR,OAAO;IACL,OAAO,OAAO;IACd,MAAM,OAAO;IACd;GACD,SAAS;IACP,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,YAAY,OAAO;IACpB;GACD,gBAAgB;IACd,OAAO,OAAO;IACd,MAAM;IACP;GACF;EAEF,CAAC,EACJ,CAAC,OAAO,CACT;CAED,MAAM,iBAAiB,GAAG,SAAS;EAAE,OAAO;EAAM;EAAgB;EAAS,CAAC,EAAE,UAAU;CACxF,MAAM,oBAAoB,GAAG,SAAS;EAAE,OAAO;EAAO;EAAgB;EAAS,CAAC,EAAE,UAAU;AAE5F,KAAI,SACF,QACE,oBAACA;EACC,WAAW;EACQ;EACA;EACT;EACH;EACP,OAAO;EAEN;GACc;AAIrB,QACE,oBAACC;EACC,WAAW;EACQ;EACA;EACT;EACH;EACP,OAAO;EAEN;GACc;IAGpB,WAAW,cACV,UAAU,aAAa,UAAU,YAAY,UAAU,aAAa,UAAU,SACjF;AAED,kBAAkB,cAAc;AAEhC,gCAAe"}
1
+ {"version":3,"file":"index.mjs","names":["StreamRenderer","StaticRenderer"],"sources":["../../../src/Highlighter/SyntaxHighlighter/index.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { memo, useMemo } from 'react';\n\nimport type { SyntaxHighlighterProps } from '../type';\nimport StaticRenderer from './StaticRenderer';\nimport StreamRenderer from './StreamRenderer';\nimport { useStyles } from './style';\n\nconst SyntaxHighlighter = memo<SyntaxHighlighterProps>(\n ({\n animated,\n children,\n className,\n enableTransformer,\n language,\n style,\n theme,\n variant = 'borderless',\n }) => {\n const { styles, cx } = useStyles();\n const isDefaultTheme = theme === 'lobe-theme' || !theme;\n const showBackground = !isDefaultTheme && variant === 'filled';\n const resolvedTheme = isDefaultTheme ? undefined : theme;\n\n const variants = useMemo(\n () =>\n cva(styles.root, {\n defaultVariants: {\n animated: false,\n shiki: true,\n showBackground: false,\n variant: 'borderless',\n },\n /* eslint-disable sort-keys-fix/sort-keys-fix */\n variants: {\n shiki: {\n false: styles.unshiki,\n true: styles.shiki,\n },\n variant: {\n filled: styles.padding,\n outlined: styles.padding,\n borderless: styles.noPadding,\n },\n showBackground: {\n false: styles.noBackground,\n true: null,\n },\n animated: {\n true: styles.animated,\n false: null,\n },\n },\n /* eslint-enable sort-keys-fix/sort-keys-fix */\n }),\n [styles],\n );\n\n const shikiClassName = cx(\n variants({ animated, shiki: true, showBackground, variant }),\n className,\n );\n const fallbackClassName = cx(\n variants({ animated, shiki: false, showBackground, variant }),\n className,\n );\n\n if (animated) {\n return (\n <StreamRenderer\n className={shikiClassName}\n enableTransformer={enableTransformer}\n fallbackClassName={fallbackClassName}\n language={language}\n style={style}\n theme={resolvedTheme}\n >\n {children}\n </StreamRenderer>\n );\n }\n\n return (\n <StaticRenderer\n className={shikiClassName}\n enableTransformer={enableTransformer}\n fallbackClassName={fallbackClassName}\n language={language}\n style={style}\n theme={resolvedTheme}\n >\n {children}\n </StaticRenderer>\n );\n },\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children && prevProps.language === nextProps.language,\n);\n\nSyntaxHighlighter.displayName = 'SyntaxHighlighter';\n\nexport default SyntaxHighlighter;\n"],"mappings":";;;;;;;;;;AAUA,MAAM,oBAAoB,MACvB,EACC,UACA,UACA,WACA,mBACA,UACA,OACA,OACA,UAAU,mBACN;CACJ,MAAM,EAAE,QAAQ,OAAO,WAAW;CAClC,MAAM,iBAAiB,UAAU,gBAAgB,CAAC;CAClD,MAAM,iBAAiB,CAAC,kBAAkB,YAAY;CACtD,MAAM,gBAAgB,iBAAiB,SAAY;CAEnD,MAAM,WAAW,cAEb,IAAI,OAAO,MAAM;EACf,iBAAiB;GACf,UAAU;GACV,OAAO;GACP,gBAAgB;GAChB,SAAS;GACV;EAED,UAAU;GACR,OAAO;IACL,OAAO,OAAO;IACd,MAAM,OAAO;IACd;GACD,SAAS;IACP,QAAQ,OAAO;IACf,UAAU,OAAO;IACjB,YAAY,OAAO;IACpB;GACD,gBAAgB;IACd,OAAO,OAAO;IACd,MAAM;IACP;GACD,UAAU;IACR,MAAM,OAAO;IACb,OAAO;IACR;GACF;EAEF,CAAC,EACJ,CAAC,OAAO,CACT;CAED,MAAM,iBAAiB,GACrB,SAAS;EAAE;EAAU,OAAO;EAAM;EAAgB;EAAS,CAAC,EAC5D,UACD;CACD,MAAM,oBAAoB,GACxB,SAAS;EAAE;EAAU,OAAO;EAAO;EAAgB;EAAS,CAAC,EAC7D,UACD;AAED,KAAI,SACF,QACE,oBAACA;EACC,WAAW;EACQ;EACA;EACT;EACH;EACP,OAAO;EAEN;GACc;AAIrB,QACE,oBAACC;EACC,WAAW;EACQ;EACA;EACT;EACH;EACP,OAAO;EAEN;GACc;IAGpB,WAAW,cACV,UAAU,aAAa,UAAU,YAAY,UAAU,aAAa,UAAU,SACjF;AAED,kBAAkB,cAAc;AAEhC,gCAAe"}
@@ -1,8 +1,24 @@
1
- import { createStyles } from "antd-style";
1
+ import { createStyles, keyframes } from "antd-style";
2
2
 
3
3
  //#region src/Highlighter/SyntaxHighlighter/style.ts
4
+ const fadeIn = keyframes`
5
+ 0% {
6
+ opacity: 0;
7
+ }
8
+ 100% {
9
+ opacity: 1;
10
+ }
11
+ `;
4
12
  const useStyles = createStyles(({ css: css$1, token, cx: cx$1, prefixCls }) => {
5
13
  return {
14
+ animated: css$1`
15
+ .animate-fade-in,
16
+ span.line > span,
17
+ code:not(:has(span.line)) {
18
+ opacity: 1;
19
+ animation: ${fadeIn} 1s ease-in-out;
20
+ }
21
+ `,
6
22
  noBackground: css$1`
7
23
  pre {
8
24
  background: transparent !important;
@@ -1 +1 @@
1
- {"version":3,"file":"style.mjs","names":["cx"],"sources":["../../../src/Highlighter/SyntaxHighlighter/style.ts"],"sourcesContent":["import { createStyles } from 'antd-style';\n\nexport const useStyles = createStyles(({ css, token, cx, prefixCls }) => {\n return {\n noBackground: css`\n pre {\n background: transparent !important;\n }\n `,\n\n noPadding: css`\n pre {\n padding: 0;\n }\n `,\n\n padding: css`\n pre {\n padding: 16px;\n }\n `,\n root: css`\n direction: ltr;\n margin: 0;\n padding: 0;\n text-align: start;\n\n pre {\n overflow-x: auto;\n margin: 0;\n padding: 0;\n }\n `,\n shiki: cx(\n `${prefixCls}-highlighter-shiki`,\n css`\n pre {\n code {\n display: block;\n\n .line {\n display: inline-block;\n\n width: calc(100% + 32px);\n margin-block: 0;\n margin-inline: -16px;\n padding-block: 0;\n padding-inline: 16px;\n }\n }\n\n &.has-focused {\n .line:not(.focused) {\n opacity: 0.5;\n }\n }\n\n .highlighted {\n background: ${token.colorFillTertiary};\n\n &.warning {\n background: ${token.colorWarningBg};\n }\n\n &.error {\n background: ${token.colorErrorBg};\n }\n }\n\n .highlighted-word {\n padding-block: 0.1em;\n padding-inline: 0.2em;\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: ${token.borderRadius}px;\n\n background: ${token.colorFillTertiary};\n }\n\n .diff {\n &.remove {\n background: ${token.colorErrorBg};\n\n &::before {\n content: '-';\n\n position: absolute;\n inset-inline-start: 4px;\n\n display: inline-block;\n\n color: ${token.colorErrorText};\n }\n }\n\n &.add {\n background: ${token.colorSuccessBg};\n\n &::before {\n content: '+';\n\n position: absolute;\n inset-inline-start: 4px;\n\n display: inline-block;\n\n color: ${token.colorSuccessText};\n }\n }\n }\n }\n `,\n ),\n unshiki: css`\n color: ${token.colorTextDescription};\n `,\n };\n});\n"],"mappings":";;;AAEA,MAAa,YAAY,cAAc,EAAE,YAAK,OAAO,UAAI,gBAAgB;AACvE,QAAO;EACL,cAAc,KAAG;;;;;EAMjB,WAAW,KAAG;;;;;EAMd,SAAS,KAAG;;;;;EAKZ,MAAM,KAAG;;;;;;;;;;;;EAYT,OAAOA,KACL,GAAG,UAAU,qBACb,KAAG;;;;;;;;;;;;;;;;;;;;;;;0BAuBiB,MAAM,kBAAkB;;;4BAGtB,MAAM,eAAe;;;;4BAIrB,MAAM,aAAa;;;;;;;gCAOf,MAAM,qBAAqB;6BAC9B,MAAM,aAAa;;0BAEtB,MAAM,kBAAkB;;;;;4BAKtB,MAAM,aAAa;;;;;;;;;;yBAUtB,MAAM,eAAe;;;;;4BAKlB,MAAM,eAAe;;;;;;;;;;yBAUxB,MAAM,iBAAiB;;;;;QAM3C;EACD,SAAS,KAAG;eACD,MAAM,qBAAqB;;EAEvC;EACD"}
1
+ {"version":3,"file":"style.mjs","names":["cx"],"sources":["../../../src/Highlighter/SyntaxHighlighter/style.ts"],"sourcesContent":["import { createStyles, keyframes } from 'antd-style';\n\nconst fadeIn = keyframes`\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n `;\n\nexport const useStyles = createStyles(({ css, token, cx, prefixCls }) => {\n return {\n animated: css`\n .animate-fade-in,\n span.line > span,\n code:not(:has(span.line)) {\n opacity: 1;\n animation: ${fadeIn} 1s ease-in-out;\n }\n `,\n\n noBackground: css`\n pre {\n background: transparent !important;\n }\n `,\n\n noPadding: css`\n pre {\n padding: 0;\n }\n `,\n\n padding: css`\n pre {\n padding: 16px;\n }\n `,\n root: css`\n direction: ltr;\n margin: 0;\n padding: 0;\n text-align: start;\n\n pre {\n overflow-x: auto;\n margin: 0;\n padding: 0;\n }\n `,\n shiki: cx(\n `${prefixCls}-highlighter-shiki`,\n css`\n pre {\n code {\n display: block;\n\n .line {\n display: inline-block;\n\n width: calc(100% + 32px);\n margin-block: 0;\n margin-inline: -16px;\n padding-block: 0;\n padding-inline: 16px;\n }\n }\n\n &.has-focused {\n .line:not(.focused) {\n opacity: 0.5;\n }\n }\n\n .highlighted {\n background: ${token.colorFillTertiary};\n\n &.warning {\n background: ${token.colorWarningBg};\n }\n\n &.error {\n background: ${token.colorErrorBg};\n }\n }\n\n .highlighted-word {\n padding-block: 0.1em;\n padding-inline: 0.2em;\n border: 1px solid ${token.colorBorderSecondary};\n border-radius: ${token.borderRadius}px;\n\n background: ${token.colorFillTertiary};\n }\n\n .diff {\n &.remove {\n background: ${token.colorErrorBg};\n\n &::before {\n content: '-';\n\n position: absolute;\n inset-inline-start: 4px;\n\n display: inline-block;\n\n color: ${token.colorErrorText};\n }\n }\n\n &.add {\n background: ${token.colorSuccessBg};\n\n &::before {\n content: '+';\n\n position: absolute;\n inset-inline-start: 4px;\n\n display: inline-block;\n\n color: ${token.colorSuccessText};\n }\n }\n }\n }\n `,\n ),\n unshiki: css`\n color: ${token.colorTextDescription};\n `,\n };\n});\n"],"mappings":";;;AAEA,MAAM,SAAS,SAAS;;;;;;;;AASxB,MAAa,YAAY,cAAc,EAAE,YAAK,OAAO,UAAI,gBAAgB;AACvE,QAAO;EACL,UAAU,KAAG;;;;;qBAKI,OAAO;;;EAIxB,cAAc,KAAG;;;;;EAMjB,WAAW,KAAG;;;;;EAMd,SAAS,KAAG;;;;;EAKZ,MAAM,KAAG;;;;;;;;;;;;EAYT,OAAOA,KACL,GAAG,UAAU,qBACb,KAAG;;;;;;;;;;;;;;;;;;;;;;;0BAuBiB,MAAM,kBAAkB;;;4BAGtB,MAAM,eAAe;;;;4BAIrB,MAAM,aAAa;;;;;;;gCAOf,MAAM,qBAAqB;6BAC9B,MAAM,aAAa;;0BAEtB,MAAM,kBAAkB;;;;;4BAKtB,MAAM,aAAa;;;;;;;;;;yBAUtB,MAAM,eAAe;;;;;4BAKlB,MAAM,eAAe;;;;;;;;;;yBAUxB,MAAM,iBAAiB;;;;;QAM3C;EACD,SAAS,KAAG;eACD,MAAM,qBAAqB;;EAEvC;EACD"}
@@ -1,8 +1,8 @@
1
1
  import { HotkeyProps } from "./type.mjs";
2
- import * as react56 from "react";
2
+ import * as react11 from "react";
3
3
 
4
4
  //#region src/Hotkey/Hotkey.d.ts
5
- declare const Hotkey: react56.NamedExoticComponent<HotkeyProps>;
5
+ declare const Hotkey: react11.NamedExoticComponent<HotkeyProps>;
6
6
  //#endregion
7
7
  export { Hotkey };
8
8
  //# sourceMappingURL=Hotkey.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { HotkeyInputProps } from "./type.mjs";
2
- import * as react6 from "react";
2
+ import * as react51 from "react";
3
3
 
4
4
  //#region src/HotkeyInput/HotkeyInput.d.ts
5
- declare const HotkeyInput: react6.NamedExoticComponent<HotkeyInputProps>;
5
+ declare const HotkeyInput: react51.NamedExoticComponent<HotkeyInputProps>;
6
6
  //#endregion
7
7
  export { HotkeyInput };
8
8
  //# sourceMappingURL=HotkeyInput.d.mts.map
@@ -9,7 +9,7 @@ import hotkey_default from "../i18n/resources/en/hotkey.mjs";
9
9
  import { useStyles } from "./style.mjs";
10
10
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
- import useControlledState from "use-merge-value";
12
+ import useMergeState from "use-merge-value";
13
13
  import { cva } from "class-variance-authority";
14
14
  import { Undo2Icon } from "lucide-react";
15
15
  import { isEqual } from "es-toolkit/compat";
@@ -24,7 +24,7 @@ const HotkeyInput = memo(({ value = "", defaultValue = "", resetValue = "", onCh
24
24
  const { cx, styles, theme } = useStyles();
25
25
  const { t } = useTranslation(hotkey_default);
26
26
  const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);
27
- const [hotkeyValue, setHotkeyValue] = useControlledState(defaultValue, {
27
+ const [hotkeyValue, setHotkeyValue] = useMergeState(defaultValue, {
28
28
  defaultValue,
29
29
  onChange,
30
30
  value