@lobehub/ui 4.32.2 → 4.33.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 (203) 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 +2 -2
  6. package/es/Accordion/AccordionItem.mjs.map +1 -1
  7. package/es/ActionIcon/ActionIcon.d.mts +2 -2
  8. package/es/Alert/Alert.d.mts +2 -2
  9. package/es/AutoComplete/Select.d.mts +2 -2
  10. package/es/Avatar/AvatarGroup/index.d.mts +2 -2
  11. package/es/Burger/Burger.d.mts +2 -2
  12. package/es/Checkbox/Checkbox.mjs +2 -2
  13. package/es/Checkbox/Checkbox.mjs.map +1 -1
  14. package/es/Checkbox/CheckboxGroup.mjs +2 -2
  15. package/es/Checkbox/CheckboxGroup.mjs.map +1 -1
  16. package/es/CodeDiff/CodeDiff.d.mts +2 -2
  17. package/es/CodeDiff/PatchDiff.d.mts +2 -2
  18. package/es/CodeEditor/CodeEditor.d.mts +2 -2
  19. package/es/CodeEditor/CodeEditor.mjs +2 -2
  20. package/es/CodeEditor/CodeEditor.mjs.map +1 -1
  21. package/es/Collapse/Collapse.d.mts +2 -2
  22. package/es/ColorSwatches/ColorSwatches.mjs +2 -2
  23. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  24. package/es/ConfigProvider/index.d.mts +2 -2
  25. package/es/ContextMenu/ContextMenuHost.d.mts +3 -3
  26. package/es/ContextMenu/renderItems.mjs +1 -0
  27. package/es/ContextMenu/renderItems.mjs.map +1 -1
  28. package/es/CopyButton/CopyButton.d.mts +2 -2
  29. package/es/DatePicker/DatePicker.d.mts +2 -2
  30. package/es/DraggablePanel/DraggablePanel.mjs +2 -2
  31. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -1
  32. package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
  33. package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
  34. package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
  35. package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
  36. package/es/DraggablePanel/components/DraggablePanelHeader.mjs +2 -2
  37. package/es/DraggablePanel/components/DraggablePanelHeader.mjs.map +1 -1
  38. package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
  39. package/es/DraggableSideNav/DraggableSideNav.mjs +2 -2
  40. package/es/DraggableSideNav/DraggableSideNav.mjs.map +1 -1
  41. package/es/Drawer/Drawer.d.mts +2 -2
  42. package/es/Dropdown/Dropdown.d.mts +2 -2
  43. package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
  44. package/es/DropdownMenu/atoms.d.mts +16 -16
  45. package/es/DropdownMenu/renderItems.mjs +1 -0
  46. package/es/DropdownMenu/renderItems.mjs.map +1 -1
  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/EditorSlashMenu/atoms.d.mts +12 -12
  51. package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
  52. package/es/EmojiPicker/EmojiPicker.mjs +3 -3
  53. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  54. package/es/Flex/FlexBasic.d.mts +2 -2
  55. package/es/FontLoader/index.d.mts +2 -2
  56. package/es/Footer/Footer.d.mts +2 -2
  57. package/es/Form/components/FormGroup.d.mts +2 -2
  58. package/es/Form/components/FormItem.d.mts +2 -2
  59. package/es/Form/components/FormSubmitFooter.d.mts +2 -2
  60. package/es/FormModal/FormModal.d.mts +2 -2
  61. package/es/GuideCard/GuideCard.d.mts +2 -2
  62. package/es/Header/Header.d.mts +2 -2
  63. package/es/Highlighter/FullFeatured.mjs +1 -1
  64. package/es/Highlighter/Highlighter.d.mts +2 -2
  65. package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
  66. package/es/Hotkey/Hotkey.d.mts +2 -2
  67. package/es/Hotkey/Hotkey.mjs +6 -1
  68. package/es/Hotkey/Hotkey.mjs.map +1 -1
  69. package/es/Hotkey/const.d.mts +1 -0
  70. package/es/Hotkey/const.mjs +1 -0
  71. package/es/Hotkey/const.mjs.map +1 -1
  72. package/es/Hotkey/utils.mjs +1 -0
  73. package/es/Hotkey/utils.mjs.map +1 -1
  74. package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
  75. package/es/HotkeyInput/HotkeyInput.mjs +2 -2
  76. package/es/HotkeyInput/HotkeyInput.mjs.map +1 -1
  77. package/es/Icon/Icon.d.mts +2 -2
  78. package/es/Icon/components/IconProvider.d.mts +3 -3
  79. package/es/Image/PreviewGroup.d.mts +2 -2
  80. package/es/ImageSelect/ImageSelect.d.mts +2 -2
  81. package/es/ImageSelect/ImageSelect.mjs +2 -2
  82. package/es/ImageSelect/ImageSelect.mjs.map +1 -1
  83. package/es/Input/Input.d.mts +2 -2
  84. package/es/Input/InputNumber.d.mts +2 -2
  85. package/es/Input/InputOPT.d.mts +2 -2
  86. package/es/Input/InputPassword.d.mts +2 -2
  87. package/es/Input/TextArea.d.mts +2 -2
  88. package/es/Layout/components/LayoutFooter.d.mts +2 -2
  89. package/es/Layout/components/LayoutHeader.d.mts +2 -2
  90. package/es/Layout/components/LayoutMain.d.mts +2 -2
  91. package/es/Layout/components/LayoutSidebar.d.mts +2 -2
  92. package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
  93. package/es/Layout/components/LayoutToc.d.mts +2 -2
  94. package/es/List/ListItem/index.d.mts +2 -2
  95. package/es/LobeSelect/LobeSelect.d.mts +2 -2
  96. package/es/LobeSelect/atoms.d.mts +19 -19
  97. package/es/LobeSwitch/LobeSwitch.d.mts +2 -2
  98. package/es/LobeSwitch/atoms.d.mts +4 -4
  99. package/es/LobeSwitch/atoms.mjs +2 -2
  100. package/es/LobeSwitch/atoms.mjs.map +1 -1
  101. package/es/Markdown/Markdown.d.mts +2 -2
  102. package/es/Markdown/Typography.d.mts +2 -2
  103. package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
  104. package/es/MaskShadow/MaskShadow.d.mts +2 -2
  105. package/es/Menu/Menu.d.mts +2 -2
  106. package/es/Menu/sharedStyle.mjs +5 -0
  107. package/es/Menu/sharedStyle.mjs.map +1 -1
  108. package/es/Mermaid/FullFeatured.mjs +1 -1
  109. package/es/Mermaid/Mermaid.d.mts +2 -2
  110. package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
  111. package/es/Modal/Modal.d.mts +2 -2
  112. package/es/Modal/ModalProvider.d.mts +2 -2
  113. package/es/Modal/imperative.d.mts +2 -2
  114. package/es/MotionProvider/index.d.mts +2 -2
  115. package/es/Popover/ArrowIcon.d.mts +2 -2
  116. package/es/Popover/atoms.d.mts +9 -9
  117. package/es/Popover/context.d.mts +2 -2
  118. package/es/ScrollArea/ScrollArea.d.mts +8 -0
  119. package/es/ScrollArea/ScrollArea.mjs +32 -0
  120. package/es/ScrollArea/ScrollArea.mjs.map +1 -0
  121. package/es/ScrollArea/atoms.d.mts +63 -0
  122. package/es/ScrollArea/atoms.mjs +59 -0
  123. package/es/ScrollArea/atoms.mjs.map +1 -0
  124. package/es/ScrollArea/globalStyle.mjs +29 -0
  125. package/es/ScrollArea/globalStyle.mjs.map +1 -0
  126. package/es/ScrollArea/index.d.mts +4 -0
  127. package/es/ScrollArea/index.d.ts +1 -0
  128. package/es/ScrollArea/index.js +1 -0
  129. package/es/ScrollArea/index.mjs +4 -0
  130. package/es/ScrollArea/style.mjs +172 -0
  131. package/es/ScrollArea/style.mjs.map +1 -0
  132. package/es/ScrollArea/type.d.mts +17 -0
  133. package/es/SearchBar/SearchBar.d.mts +2 -2
  134. package/es/SearchBar/SearchBar.mjs +2 -2
  135. package/es/SearchBar/SearchBar.mjs.map +1 -1
  136. package/es/Segmented/Segmented.d.mts +2 -2
  137. package/es/Select/Select.d.mts +2 -2
  138. package/es/SideNav/SideNav.d.mts +2 -2
  139. package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
  140. package/es/SortableList/components/DragHandle.d.mts +2 -2
  141. package/es/SortableList/components/SortableItem.d.mts +2 -2
  142. package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
  143. package/es/Toast/imperative.d.mts +3 -3
  144. package/es/Toc/Toc.d.mts +2 -2
  145. package/es/Toc/TocMobile.mjs +2 -2
  146. package/es/Toc/TocMobile.mjs.map +1 -1
  147. package/es/Video/index.d.mts +2 -2
  148. package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
  149. package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
  150. package/es/awesome/Features/Features.d.mts +2 -2
  151. package/es/awesome/Giscus/Giscus.d.mts +2 -2
  152. package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
  153. package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
  154. package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
  155. package/es/awesome/Hero/Hero.d.mts +2 -2
  156. package/es/awesome/Spline/Spine.d.mts +2 -2
  157. package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
  158. package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
  159. package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
  160. package/es/brand/LobeChat/index.d.mts +2 -2
  161. package/es/brand/LobeHub/index.d.mts +2 -2
  162. package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
  163. package/es/brand/LogoThree/index.d.mts +2 -2
  164. package/es/chat/BackBottom/BackBottom.d.mts +2 -2
  165. package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
  166. package/es/chat/ChatItem/ChatItem.d.mts +2 -2
  167. package/es/chat/ChatList/ChatList.d.mts +2 -2
  168. package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
  169. package/es/chat/EditableMessage/EditableMessage.mjs +3 -3
  170. package/es/chat/EditableMessage/EditableMessage.mjs.map +1 -1
  171. package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
  172. package/es/chat/MessageInput/MessageInput.d.mts +2 -2
  173. package/es/chat/MessageModal/MessageModal.d.mts +2 -2
  174. package/es/chat/MessageModal/MessageModal.mjs +3 -3
  175. package/es/chat/MessageModal/MessageModal.mjs.map +1 -1
  176. package/es/color/ColorScales/index.d.mts +2 -2
  177. package/es/color/CssVar/index.d.mts +2 -2
  178. package/es/i18n/context.d.mts +2 -2
  179. package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
  180. package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
  181. package/es/icons/lucideExtra/DiscordIcon.d.mts +2 -2
  182. package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
  183. package/es/icons/lucideExtra/GroupBotIcon.d.mts +2 -2
  184. package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
  185. package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
  186. package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
  187. package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
  188. package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
  189. package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
  190. package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +2 -2
  191. package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
  192. package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +2 -2
  193. package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
  194. package/es/index.d.mts +9 -1
  195. package/es/index.mjs +7 -3
  196. package/es/mdx/Mdx/index.d.mts +2 -2
  197. package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
  198. package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
  199. package/es/mobile/TabBar/TabBar.d.mts +2 -2
  200. package/es/mobile/TabBar/TabBar.mjs +2 -2
  201. package/es/mobile/TabBar/TabBar.mjs.map +1 -1
  202. package/es/storybook/StoryBook/index.d.mts +2 -2
  203. package/package.json +17 -17
@@ -6,13 +6,13 @@ 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
8
  import { cx } from "antd-style";
9
- import useMergeState from "use-merge-value";
9
+ import useControlledState from "use-merge-value";
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] = useMergeState(false, {
15
+ const [edited, setEdited] = useControlledState(false, {
16
16
  onChange: onEditingChange,
17
17
  value: editing
18
18
  });
@@ -1 +1 @@
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
+ {"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,5 +1,5 @@
1
1
  import React from "react";
2
- import * as react_jsx_runtime17 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime31 from "react/jsx-runtime";
3
3
  import * as _base_ui_react_autocomplete0 from "@base-ui/react/autocomplete";
4
4
  import { Autocomplete } from "@base-ui/react/autocomplete";
5
5
 
@@ -17,7 +17,7 @@ declare const EditorSlashMenuPortal: {
17
17
  ({
18
18
  container,
19
19
  ...rest
20
- }: EditorSlashMenuPortalProps): react_jsx_runtime17.JSX.Element;
20
+ }: EditorSlashMenuPortalProps): react_jsx_runtime31.JSX.Element;
21
21
  displayName: string;
22
22
  };
23
23
  type EditorSlashMenuPositionerProps = React.ComponentProps<typeof Autocomplete.Positioner>;
@@ -29,7 +29,7 @@ declare const EditorSlashMenuPositioner: {
29
29
  side,
30
30
  sideOffset,
31
31
  ...rest
32
- }: EditorSlashMenuPositionerProps): react_jsx_runtime17.JSX.Element;
32
+ }: EditorSlashMenuPositionerProps): react_jsx_runtime31.JSX.Element;
33
33
  displayName: string;
34
34
  };
35
35
  type EditorSlashMenuPopupProps = React.ComponentProps<typeof Autocomplete.Popup>;
@@ -38,7 +38,7 @@ declare const EditorSlashMenuPopup: {
38
38
  className,
39
39
  initialFocus,
40
40
  ...rest
41
- }: EditorSlashMenuPopupProps): react_jsx_runtime17.JSX.Element;
41
+ }: EditorSlashMenuPopupProps): react_jsx_runtime31.JSX.Element;
42
42
  displayName: string;
43
43
  };
44
44
  type EditorSlashMenuItemProps = React.ComponentProps<typeof Autocomplete.Item> & {
@@ -49,7 +49,7 @@ declare const EditorSlashMenuItem: {
49
49
  className,
50
50
  danger,
51
51
  ...rest
52
- }: EditorSlashMenuItemProps): react_jsx_runtime17.JSX.Element;
52
+ }: EditorSlashMenuItemProps): react_jsx_runtime31.JSX.Element;
53
53
  displayName: string;
54
54
  };
55
55
  declare const EditorSlashMenuGroup: React.ForwardRefExoticComponent<_base_ui_react_autocomplete0.AutocompleteGroupProps & React.RefAttributes<HTMLDivElement>>;
@@ -58,7 +58,7 @@ declare const EditorSlashMenuGroupLabel: {
58
58
  ({
59
59
  className,
60
60
  ...rest
61
- }: EditorSlashMenuGroupLabelProps): react_jsx_runtime17.JSX.Element;
61
+ }: EditorSlashMenuGroupLabelProps): react_jsx_runtime31.JSX.Element;
62
62
  displayName: string;
63
63
  };
64
64
  type EditorSlashMenuEmptyProps = React.ComponentProps<typeof Autocomplete.Empty>;
@@ -66,7 +66,7 @@ declare const EditorSlashMenuEmpty: {
66
66
  ({
67
67
  className,
68
68
  ...rest
69
- }: EditorSlashMenuEmptyProps): react_jsx_runtime17.JSX.Element;
69
+ }: EditorSlashMenuEmptyProps): react_jsx_runtime31.JSX.Element;
70
70
  displayName: string;
71
71
  };
72
72
  type EditorSlashMenuItemContentProps = React.HTMLAttributes<HTMLDivElement>;
@@ -74,7 +74,7 @@ declare const EditorSlashMenuItemContent: {
74
74
  ({
75
75
  className,
76
76
  ...rest
77
- }: EditorSlashMenuItemContentProps): react_jsx_runtime17.JSX.Element;
77
+ }: EditorSlashMenuItemContentProps): react_jsx_runtime31.JSX.Element;
78
78
  displayName: string;
79
79
  };
80
80
  type EditorSlashMenuItemIconProps = React.HTMLAttributes<HTMLSpanElement>;
@@ -82,7 +82,7 @@ declare const EditorSlashMenuItemIcon: {
82
82
  ({
83
83
  className,
84
84
  ...rest
85
- }: EditorSlashMenuItemIconProps): react_jsx_runtime17.JSX.Element;
85
+ }: EditorSlashMenuItemIconProps): react_jsx_runtime31.JSX.Element;
86
86
  displayName: string;
87
87
  };
88
88
  type EditorSlashMenuItemLabelProps = React.HTMLAttributes<HTMLSpanElement>;
@@ -90,7 +90,7 @@ declare const EditorSlashMenuItemLabel: {
90
90
  ({
91
91
  className,
92
92
  ...rest
93
- }: EditorSlashMenuItemLabelProps): react_jsx_runtime17.JSX.Element;
93
+ }: EditorSlashMenuItemLabelProps): react_jsx_runtime31.JSX.Element;
94
94
  displayName: string;
95
95
  };
96
96
  type EditorSlashMenuItemExtraProps = React.HTMLAttributes<HTMLSpanElement>;
@@ -98,7 +98,7 @@ declare const EditorSlashMenuItemExtra: {
98
98
  ({
99
99
  className,
100
100
  ...rest
101
- }: EditorSlashMenuItemExtraProps): react_jsx_runtime17.JSX.Element;
101
+ }: EditorSlashMenuItemExtraProps): react_jsx_runtime31.JSX.Element;
102
102
  displayName: string;
103
103
  };
104
104
  type EditorSlashMenuHiddenInputProps = React.ComponentProps<typeof Autocomplete.Input>;
@@ -106,7 +106,7 @@ declare const EditorSlashMenuHiddenInput: {
106
106
  ({
107
107
  className,
108
108
  ...rest
109
- }: EditorSlashMenuHiddenInputProps): react_jsx_runtime17.JSX.Element;
109
+ }: EditorSlashMenuHiddenInputProps): react_jsx_runtime31.JSX.Element;
110
110
  displayName: string;
111
111
  };
112
112
  //#endregion
@@ -1,8 +1,8 @@
1
1
  import { EmojiPickerProps } from "./type.mjs";
2
- import * as react26 from "react";
2
+ import * as react5 from "react";
3
3
 
4
4
  //#region src/EmojiPicker/EmojiPicker.d.ts
5
- declare const EmojiPicker: react26.NamedExoticComponent<EmojiPickerProps>;
5
+ declare const EmojiPicker: react5.NamedExoticComponent<EmojiPickerProps>;
6
6
  //#endregion
7
7
  export { EmojiPicker };
8
8
  //# sourceMappingURL=EmojiPicker.d.mts.map
@@ -14,7 +14,7 @@ import { styles } from "./style.mjs";
14
14
  import { memo, useMemo, useRef, useState } from "react";
15
15
  import { jsx, jsxs } from "react/jsx-runtime";
16
16
  import { cx, useTheme } from "antd-style";
17
- import useMergeState from "use-merge-value";
17
+ import useControlledState from "use-merge-value";
18
18
  import { SmileIcon, TrashIcon, UploadIcon } from "lucide-react";
19
19
  import chroma from "chroma-js";
20
20
  import data from "@emoji-mart/data";
@@ -26,7 +26,7 @@ const DEFAULT_AVATAR = "🤖";
26
26
  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, contentProps, ...rest }) => {
27
27
  const ref = useRef(null);
28
28
  const { t } = useTranslation(emojiPicker_default);
29
- const [visible, setVisible] = useMergeState(defaultOpen, {
29
+ const [visible, setVisible] = useControlledState(defaultOpen, {
30
30
  defaultValue: defaultOpen,
31
31
  onChange: onOpenChange,
32
32
  value: open
@@ -41,7 +41,7 @@ const EmojiPicker = memo(({ value, defaultAvatar = DEFAULT_AVATAR, onChange, loc
41
41
  revalidateOnFocus: false,
42
42
  revalidateOnMount: false
43
43
  });
44
- const [ava, setAva] = useMergeState(defaultAvatar, {
44
+ const [ava, setAva] = useControlledState(defaultAvatar, {
45
45
  defaultValue: defaultAvatar,
46
46
  onChange,
47
47
  value
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiPicker.mjs","names":["emojiPickerMessages","items: TabsProps['items']","Tooltip","Icon","tab","Flexbox","Tabs","ActionIcon","AvatarUploader","Popover","Avatar"],"sources":["../../src/EmojiPicker/EmojiPicker.tsx"],"sourcesContent":["'use client';\n\nimport data from '@emoji-mart/data';\nimport Picker from '@emoji-mart/react';\nimport { cx, useTheme } from 'antd-style';\nimport chroma from 'chroma-js';\nimport { SmileIcon, TrashIcon, UploadIcon } from 'lucide-react';\nimport { memo, useMemo, 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 Popover from '@/Popover';\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 { styles } 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 contentProps,\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 theme = useTheme();\n const pickerCssVariables = useMemo<Record<string, string>>(\n () => ({\n '--emoji-picker-rgb-accent': chroma(theme.colorPrimary).rgb().join(', '),\n '--emoji-picker-rgb-background': chroma(theme.colorBgElevated).rgb().join(', '),\n }),\n [theme.colorPrimary, theme.colorBgElevated],\n );\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={{\n minWidth: 310,\n paddingTop: showTabs ? 4 : 0,\n ...pickerCssVariables,\n ...popupStyle,\n }}\n {...contentProps}\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 className={cx(styles.popover)}\n classNames={{\n content: styles.popover,\n root: styles.positioner,\n }}\n content={content}\n defaultOpen={defaultOpen}\n onOpenChange={(v) => {\n if (loading) return;\n setVisible(v);\n }}\n open={visible}\n placement={'bottom'}\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","useMergeState","items: TabsProps['items']","Tooltip","Icon","tab","Flexbox","Tabs","ActionIcon","AvatarUploader","Popover","Avatar"],"sources":["../../src/EmojiPicker/EmojiPicker.tsx"],"sourcesContent":["'use client';\n\nimport data from '@emoji-mart/data';\nimport Picker from '@emoji-mart/react';\nimport { cx, useTheme } from 'antd-style';\nimport chroma from 'chroma-js';\nimport { SmileIcon, TrashIcon, UploadIcon } from 'lucide-react';\nimport { memo, useMemo, 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 Popover from '@/Popover';\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 { styles } 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 contentProps,\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 theme = useTheme();\n const pickerCssVariables = useMemo<Record<string, string>>(\n () => ({\n '--emoji-picker-rgb-accent': chroma(theme.colorPrimary).rgb().join(', '),\n '--emoji-picker-rgb-background': chroma(theme.colorBgElevated).rgb().join(', '),\n }),\n [theme.colorPrimary, theme.colorBgElevated],\n );\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={{\n minWidth: 310,\n paddingTop: showTabs ? 4 : 0,\n ...pickerCssVariables,\n ...popupStyle,\n }}\n {...contentProps}\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 className={cx(styles.popover)}\n classNames={{\n content: styles.popover,\n root: styles.positioner,\n }}\n content={content}\n defaultOpen={defaultOpen}\n onOpenChange={(v) => {\n if (loading) return;\n setVisible(v);\n }}\n open={visible}\n placement={'bottom'}\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 react37 from "react";
2
+ import * as react20 from "react";
3
3
 
4
4
  //#region src/Flex/FlexBasic.d.ts
5
- declare const _default: react37.NamedExoticComponent<FlexBasicProps>;
5
+ declare const _default: react20.NamedExoticComponent<FlexBasicProps>;
6
6
  //#endregion
7
7
  export { _default };
8
8
  //# sourceMappingURL=FlexBasic.d.mts.map
@@ -1,10 +1,10 @@
1
- import * as react52 from "react";
1
+ import * as react84 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: react52.NamedExoticComponent<FontLoaderProps>;
7
+ declare const FontLoader: react84.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 react31 from "react";
2
+ import * as react39 from "react";
3
3
 
4
4
  //#region src/Footer/Footer.d.ts
5
- declare const Footer: react31.NamedExoticComponent<FooterProps>;
5
+ declare const Footer: react39.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 react27 from "react";
2
+ import * as react36 from "react";
3
3
 
4
4
  //#region src/Form/components/FormGroup.d.ts
5
- declare const FormGroup: react27.NamedExoticComponent<FormGroupProps>;
5
+ declare const FormGroup: react36.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 react28 from "react";
2
+ import * as react37 from "react";
3
3
 
4
4
  //#region src/Form/components/FormItem.d.ts
5
- declare const FormItem: react28.NamedExoticComponent<FormItemProps>;
5
+ declare const FormItem: react37.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 react29 from "react";
2
+ import * as react38 from "react";
3
3
 
4
4
  //#region src/Form/components/FormSubmitFooter.d.ts
5
- declare const FormSubmitFooter: react29.NamedExoticComponent<FormSubmitFooterProps>;
5
+ declare const FormSubmitFooter: react38.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 react30 from "react";
2
+ import * as react35 from "react";
3
3
 
4
4
  //#region src/FormModal/FormModal.d.ts
5
- declare const FormModal: react30.NamedExoticComponent<FormModalProps>;
5
+ declare const FormModal: react35.NamedExoticComponent<FormModalProps>;
6
6
  //#endregion
7
7
  export { FormModal };
8
8
  //# sourceMappingURL=FormModal.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { GuideCardProps } from "./type.mjs";
2
- import * as react129 from "react";
2
+ import * as react149 from "react";
3
3
 
4
4
  //#region src/GuideCard/GuideCard.d.ts
5
- declare const GuideCard: react129.NamedExoticComponent<GuideCardProps>;
5
+ declare const GuideCard: react149.NamedExoticComponent<GuideCardProps>;
6
6
  //#endregion
7
7
  export { GuideCard };
8
8
  //# sourceMappingURL=GuideCard.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { HeaderProps } from "./type.mjs";
2
- import * as react25 from "react";
2
+ import * as react34 from "react";
3
3
 
4
4
  //#region src/Header/Header.d.ts
5
- declare const Header: react25.NamedExoticComponent<HeaderProps>;
5
+ declare const Header: react34.NamedExoticComponent<HeaderProps>;
6
6
  //#endregion
7
7
  export { Header };
8
8
  //# sourceMappingURL=Header.d.mts.map
@@ -4,9 +4,9 @@ import FlexBasic_default from "../Flex/FlexBasic.mjs";
4
4
  import Text_default from "../Text/Text.mjs";
5
5
  import { stopPropagation } from "../utils/dom.mjs";
6
6
  import ActionIcon_default from "../ActionIcon/ActionIcon.mjs";
7
+ import MaterialFileTypeIcon_default from "../MaterialFileTypeIcon/MaterialFileTypeIcon.mjs";
7
8
  import { getCodeLanguageDisplayName, getCodeLanguageFilename } from "./const.mjs";
8
9
  import CopyButton_default from "../CopyButton/CopyButton.mjs";
9
- import MaterialFileTypeIcon_default from "../MaterialFileTypeIcon/MaterialFileTypeIcon.mjs";
10
10
  import LangSelect_default from "./LangSelect.mjs";
11
11
  import { bodyVariants, headerVariants, variants } from "./style.mjs";
12
12
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -1,8 +1,8 @@
1
1
  import { HighlighterProps } from "./type.mjs";
2
- import * as react22 from "react";
2
+ import * as react40 from "react";
3
3
 
4
4
  //#region src/Highlighter/Highlighter.d.ts
5
- declare const Highlighter: react22.NamedExoticComponent<HighlighterProps>;
5
+ declare const Highlighter: react40.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 react23 from "react";
2
+ import * as react41 from "react";
3
3
 
4
4
  //#region src/Highlighter/SyntaxHighlighter/index.d.ts
5
- declare const SyntaxHighlighter: react23.NamedExoticComponent<SyntaxHighlighterProps>;
5
+ declare const SyntaxHighlighter: react41.NamedExoticComponent<SyntaxHighlighterProps>;
6
6
  //#endregion
7
7
  export { SyntaxHighlighter };
8
8
  //# sourceMappingURL=index.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { HotkeyProps } from "./type.mjs";
2
- import * as react24 from "react";
2
+ import * as react32 from "react";
3
3
 
4
4
  //#region src/Hotkey/Hotkey.d.ts
5
- declare const Hotkey: react24.NamedExoticComponent<HotkeyProps>;
5
+ declare const Hotkey: react32.NamedExoticComponent<HotkeyProps>;
6
6
  //#endregion
7
7
  export { Hotkey };
8
8
  //# sourceMappingURL=Hotkey.d.mts.map
@@ -22,7 +22,12 @@ const mappingKey = (isAppleDevice) => ({
22
22
  size: { size: "0.95em" }
23
23
  }) : "Alt",
24
24
  [KeyMapEnum.Backspace]: isAppleDevice ? /* @__PURE__ */ jsx(Icon_default, { icon: Delete }) : "Backspace",
25
+ [KeyMapEnum.CommandOrControl]: isAppleDevice ? /* @__PURE__ */ jsx(Icon_default, {
26
+ icon: Command,
27
+ size: { size: "0.95em" }
28
+ }) : "Ctrl",
25
29
  [KeyMapEnum.Ctrl]: isAppleDevice ? /* @__PURE__ */ jsx(Icon_default, { icon: ChevronUpIcon }) : "Ctrl",
30
+ [KeyMapEnum.Control]: isAppleDevice ? /* @__PURE__ */ jsx(Icon_default, { icon: ChevronUpIcon }) : "Ctrl",
26
31
  [KeyMapEnum.Down]: /* @__PURE__ */ jsx(Icon_default, { icon: ArrowDownIcon }),
27
32
  [KeyMapEnum.Enter]: isAppleDevice ? /* @__PURE__ */ jsx(Icon_default, { icon: CornerDownLeftIcon }) : "Enter",
28
33
  [KeyMapEnum.LeftClick]: /* @__PURE__ */ jsx(Icon_default, {
@@ -95,7 +100,7 @@ const mappingKey = (isAppleDevice) => ({
95
100
  const Hotkey = memo(({ variant = "filled", classNames, styles: customStyles, keys, inverseTheme, isApple, compact, className, style, ...rest }) => {
96
101
  const { isDarkMode } = useThemeMode();
97
102
  const isBorderless = variant === "borderless";
98
- const [keysGroup, setKeysGroup] = useState(splitKeysByPlus(keys));
103
+ const [keysGroup, setKeysGroup] = useState(() => splitKeysByPlus(keys));
99
104
  const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);
100
105
  useEffect(() => {
101
106
  setKeysGroup(splitKeysByPlus(keys));
@@ -1 +1 @@
1
- {"version":3,"file":"Hotkey.mjs","names":["Icon","LeftClickIcon","RightClickIcon","RightDoubleClickIcon","LeftDoubleClickIcon","mapping: Record<string, any>","Flexbox","Center"],"sources":["../../src/Hotkey/Hotkey.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useThemeMode } from 'antd-style';\nimport {\n ArrowBigUpIcon,\n ArrowDownIcon,\n ArrowLeftIcon,\n ArrowRightIcon,\n ArrowRightToLineIcon,\n ArrowUpIcon,\n ChevronUpIcon,\n Command,\n CornerDownLeftIcon,\n Delete,\n Grid2X2Icon,\n MouseIcon,\n Option,\n SpaceIcon,\n} from 'lucide-react';\nimport { memo, useEffect, useMemo, useState } from 'react';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport LeftClickIcon from '@/icons/lucideExtra/LeftClickIcon';\nimport LeftDoubleClickIcon from '@/icons/lucideExtra/LeftDoubleClickIcon';\nimport RightClickIcon from '@/icons/lucideExtra/RightClickIcon';\nimport RightDoubleClickIcon from '@/icons/lucideExtra/RightDoubleClickIcon';\n\nimport { KeyMapEnum } from './const';\nimport { variants } from './style';\nimport type { HotkeyProps } from './type';\nimport { checkIsAppleDevice, splitKeysByPlus, startCase } from './utils';\n\nconst mappingKey = (isAppleDevice: boolean) => ({\n [KeyMapEnum.Alt]: isAppleDevice ? <Icon icon={Option} size={{ size: '0.95em' }} /> : 'Alt',\n [KeyMapEnum.Backspace]: isAppleDevice ? <Icon icon={Delete} /> : 'Backspace',\n [KeyMapEnum.Ctrl]: isAppleDevice ? <Icon icon={ChevronUpIcon} /> : 'Ctrl',\n [KeyMapEnum.Down]: <Icon icon={ArrowDownIcon} />,\n [KeyMapEnum.Enter]: isAppleDevice ? <Icon icon={CornerDownLeftIcon} /> : 'Enter',\n [KeyMapEnum.LeftClick]: <Icon icon={LeftClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />,\n [KeyMapEnum.Left]: <Icon icon={ArrowLeftIcon} />,\n [KeyMapEnum.Meta]: isAppleDevice ? (\n <Icon icon={Command} size={{ size: '0.95em' }} />\n ) : (\n <Icon icon={Grid2X2Icon} />\n ),\n [KeyMapEnum.MiddleClick]: <Icon icon={MouseIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />,\n [KeyMapEnum.Mod]: isAppleDevice ? <Icon icon={Command} size={{ size: '0.95em' }} /> : 'Ctrl',\n [KeyMapEnum.RightClick]: (\n <Icon icon={RightClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />\n ),\n [KeyMapEnum.RightDoubleClick]: (\n <Icon icon={RightDoubleClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />\n ),\n [KeyMapEnum.LeftDoubleClick]: (\n <Icon icon={LeftDoubleClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />\n ),\n [KeyMapEnum.Right]: <Icon icon={ArrowRightIcon} />,\n [KeyMapEnum.Shift]: isAppleDevice ? (\n <Icon icon={ArrowBigUpIcon} size={{ size: '1.15em', strokeWidth: 1.75 }} />\n ) : (\n 'Shift'\n ),\n [KeyMapEnum.Space]: <Icon icon={SpaceIcon} />,\n [KeyMapEnum.Tab]: isAppleDevice ? <Icon icon={ArrowRightToLineIcon} /> : 'Tab',\n [KeyMapEnum.Up]: <Icon icon={ArrowUpIcon} />,\n [KeyMapEnum.Comma]: ',',\n [KeyMapEnum.Period]: '.',\n [KeyMapEnum.Slash]: '?',\n [KeyMapEnum.Semicolon]: ';',\n [KeyMapEnum.Quote]: \"'\",\n [KeyMapEnum.Backquote]: '`',\n [KeyMapEnum.Backslash]: '\\\\',\n [KeyMapEnum.BracketLeft]: '[',\n [KeyMapEnum.BracketRight]: ']',\n [KeyMapEnum.Minus]: '-',\n [KeyMapEnum.Equal]: '+',\n});\n\nconst Hotkey = memo<HotkeyProps>(\n ({\n variant = 'filled',\n classNames,\n styles: customStyles,\n keys,\n inverseTheme,\n isApple,\n compact,\n className,\n style,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n const isBorderless = variant === 'borderless';\n const [keysGroup, setKeysGroup] = useState(splitKeysByPlus(keys));\n const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);\n\n useEffect(() => {\n const newValue = splitKeysByPlus(keys);\n setKeysGroup(newValue);\n }, [keys]);\n\n const mapping: Record<string, any> = useMemo(() => mappingKey(isAppleDevice), [isAppleDevice]);\n\n return (\n <Flexbox\n align={'center'}\n className={className}\n gap={isBorderless ? 6 : 2}\n horizontal\n style={style}\n {...rest}\n >\n {compact || isBorderless ? (\n <Center\n as={'kbd'}\n className={cx(\n variants({ inverseTheme, isDarkMode, variant }),\n classNames?.kbdClassName,\n )}\n gap={6}\n horizontal\n style={customStyles?.kbdStyle}\n >\n {keysGroup.map((key, index) => (\n <div key={index}>{mapping[key] ?? startCase(key)}</div>\n ))}\n </Center>\n ) : (\n keysGroup.map((key, index) => (\n <Center\n as={'kbd'}\n className={cx(\n variants({ inverseTheme, isDarkMode, variant }),\n classNames?.kbdClassName,\n )}\n key={index}\n style={customStyles?.kbdStyle}\n >\n {mapping[key] ?? startCase(key)}\n </Center>\n ))\n )}\n </Flexbox>\n );\n },\n);\n\nHotkey.displayName = 'Hotkey';\n\nexport default Hotkey;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Hotkey.mjs","names":["Icon","LeftClickIcon","RightClickIcon","RightDoubleClickIcon","LeftDoubleClickIcon","mapping: Record<string, any>","Flexbox","Center"],"sources":["../../src/Hotkey/Hotkey.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useThemeMode } from 'antd-style';\nimport {\n ArrowBigUpIcon,\n ArrowDownIcon,\n ArrowLeftIcon,\n ArrowRightIcon,\n ArrowRightToLineIcon,\n ArrowUpIcon,\n ChevronUpIcon,\n Command,\n CornerDownLeftIcon,\n Delete,\n Grid2X2Icon,\n MouseIcon,\n Option,\n SpaceIcon,\n} from 'lucide-react';\nimport { memo, useEffect, useMemo, useState } from 'react';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport LeftClickIcon from '@/icons/lucideExtra/LeftClickIcon';\nimport LeftDoubleClickIcon from '@/icons/lucideExtra/LeftDoubleClickIcon';\nimport RightClickIcon from '@/icons/lucideExtra/RightClickIcon';\nimport RightDoubleClickIcon from '@/icons/lucideExtra/RightDoubleClickIcon';\n\nimport { KeyMapEnum } from './const';\nimport { variants } from './style';\nimport type { HotkeyProps } from './type';\nimport { checkIsAppleDevice, splitKeysByPlus, startCase } from './utils';\n\nconst mappingKey = (isAppleDevice: boolean) => ({\n [KeyMapEnum.Alt]: isAppleDevice ? <Icon icon={Option} size={{ size: '0.95em' }} /> : 'Alt',\n [KeyMapEnum.Backspace]: isAppleDevice ? <Icon icon={Delete} /> : 'Backspace',\n [KeyMapEnum.CommandOrControl]: isAppleDevice ? (\n <Icon icon={Command} size={{ size: '0.95em' }} />\n ) : (\n 'Ctrl'\n ),\n [KeyMapEnum.Ctrl]: isAppleDevice ? <Icon icon={ChevronUpIcon} /> : 'Ctrl',\n [KeyMapEnum.Control]: isAppleDevice ? <Icon icon={ChevronUpIcon} /> : 'Ctrl',\n [KeyMapEnum.Down]: <Icon icon={ArrowDownIcon} />,\n [KeyMapEnum.Enter]: isAppleDevice ? <Icon icon={CornerDownLeftIcon} /> : 'Enter',\n [KeyMapEnum.LeftClick]: <Icon icon={LeftClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />,\n [KeyMapEnum.Left]: <Icon icon={ArrowLeftIcon} />,\n [KeyMapEnum.Meta]: isAppleDevice ? (\n <Icon icon={Command} size={{ size: '0.95em' }} />\n ) : (\n <Icon icon={Grid2X2Icon} />\n ),\n [KeyMapEnum.MiddleClick]: <Icon icon={MouseIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />,\n [KeyMapEnum.Mod]: isAppleDevice ? <Icon icon={Command} size={{ size: '0.95em' }} /> : 'Ctrl',\n [KeyMapEnum.RightClick]: (\n <Icon icon={RightClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />\n ),\n [KeyMapEnum.RightDoubleClick]: (\n <Icon icon={RightDoubleClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />\n ),\n [KeyMapEnum.LeftDoubleClick]: (\n <Icon icon={LeftDoubleClickIcon} size={{ size: '1.2em', strokeWidth: 1.75 }} />\n ),\n [KeyMapEnum.Right]: <Icon icon={ArrowRightIcon} />,\n [KeyMapEnum.Shift]: isAppleDevice ? (\n <Icon icon={ArrowBigUpIcon} size={{ size: '1.15em', strokeWidth: 1.75 }} />\n ) : (\n 'Shift'\n ),\n [KeyMapEnum.Space]: <Icon icon={SpaceIcon} />,\n [KeyMapEnum.Tab]: isAppleDevice ? <Icon icon={ArrowRightToLineIcon} /> : 'Tab',\n [KeyMapEnum.Up]: <Icon icon={ArrowUpIcon} />,\n [KeyMapEnum.Comma]: ',',\n [KeyMapEnum.Period]: '.',\n [KeyMapEnum.Slash]: '?',\n [KeyMapEnum.Semicolon]: ';',\n [KeyMapEnum.Quote]: \"'\",\n [KeyMapEnum.Backquote]: '`',\n [KeyMapEnum.Backslash]: '\\\\',\n [KeyMapEnum.BracketLeft]: '[',\n [KeyMapEnum.BracketRight]: ']',\n [KeyMapEnum.Minus]: '-',\n [KeyMapEnum.Equal]: '+',\n});\n\nconst Hotkey = memo<HotkeyProps>(\n ({\n variant = 'filled',\n classNames,\n styles: customStyles,\n keys,\n inverseTheme,\n isApple,\n compact,\n className,\n style,\n ...rest\n }) => {\n const { isDarkMode } = useThemeMode();\n const isBorderless = variant === 'borderless';\n const [keysGroup, setKeysGroup] = useState(() => splitKeysByPlus(keys));\n const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);\n\n useEffect(() => {\n const newValue = splitKeysByPlus(keys);\n setKeysGroup(newValue);\n }, [keys]);\n\n const mapping: Record<string, any> = useMemo(() => mappingKey(isAppleDevice), [isAppleDevice]);\n\n return (\n <Flexbox\n align={'center'}\n className={className}\n gap={isBorderless ? 6 : 2}\n horizontal\n style={style}\n {...rest}\n >\n {compact || isBorderless ? (\n <Center\n as={'kbd'}\n className={cx(\n variants({ inverseTheme, isDarkMode, variant }),\n classNames?.kbdClassName,\n )}\n gap={6}\n horizontal\n style={customStyles?.kbdStyle}\n >\n {keysGroup.map((key, index) => (\n <div key={index}>{mapping[key] ?? startCase(key)}</div>\n ))}\n </Center>\n ) : (\n keysGroup.map((key, index) => (\n <Center\n as={'kbd'}\n className={cx(\n variants({ inverseTheme, isDarkMode, variant }),\n classNames?.kbdClassName,\n )}\n key={index}\n style={customStyles?.kbdStyle}\n >\n {mapping[key] ?? startCase(key)}\n </Center>\n ))\n )}\n </Flexbox>\n );\n },\n);\n\nHotkey.displayName = 'Hotkey';\n\nexport default Hotkey;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiCA,MAAM,cAAc,mBAA4B;EAC7C,WAAW,MAAM,gBAAgB,oBAACA;EAAK,MAAM;EAAQ,MAAM,EAAE,MAAM,UAAU;GAAI,GAAG;EACpF,WAAW,YAAY,gBAAgB,oBAACA,gBAAK,MAAM,SAAU,GAAG;EAChE,WAAW,mBAAmB,gBAC7B,oBAACA;EAAK,MAAM;EAAS,MAAM,EAAE,MAAM,UAAU;GAAI,GAEjD;EAED,WAAW,OAAO,gBAAgB,oBAACA,gBAAK,MAAM,gBAAiB,GAAG;EAClE,WAAW,UAAU,gBAAgB,oBAACA,gBAAK,MAAM,gBAAiB,GAAG;EACrE,WAAW,OAAO,oBAACA,gBAAK,MAAM,gBAAiB;EAC/C,WAAW,QAAQ,gBAAgB,oBAACA,gBAAK,MAAM,qBAAsB,GAAG;EACxE,WAAW,YAAY,oBAACA;EAAK,MAAMC;EAAe,MAAM;GAAE,MAAM;GAAS,aAAa;GAAM;GAAI;EAChG,WAAW,OAAO,oBAACD,gBAAK,MAAM,gBAAiB;EAC/C,WAAW,OAAO,gBACjB,oBAACA;EAAK,MAAM;EAAS,MAAM,EAAE,MAAM,UAAU;GAAI,GAEjD,oBAACA,gBAAK,MAAM,cAAe;EAE5B,WAAW,cAAc,oBAACA;EAAK,MAAM;EAAW,MAAM;GAAE,MAAM;GAAS,aAAa;GAAM;GAAI;EAC9F,WAAW,MAAM,gBAAgB,oBAACA;EAAK,MAAM;EAAS,MAAM,EAAE,MAAM,UAAU;GAAI,GAAG;EACrF,WAAW,aACV,oBAACA;EAAK,MAAME;EAAgB,MAAM;GAAE,MAAM;GAAS,aAAa;GAAM;GAAI;EAE3E,WAAW,mBACV,oBAACF;EAAK,MAAMG;EAAsB,MAAM;GAAE,MAAM;GAAS,aAAa;GAAM;GAAI;EAEjF,WAAW,kBACV,oBAACH;EAAK,MAAMI;EAAqB,MAAM;GAAE,MAAM;GAAS,aAAa;GAAM;GAAI;EAEhF,WAAW,QAAQ,oBAACJ,gBAAK,MAAM,iBAAkB;EACjD,WAAW,QAAQ,gBAClB,oBAACA;EAAK,MAAM;EAAgB,MAAM;GAAE,MAAM;GAAU,aAAa;GAAM;GAAI,GAE3E;EAED,WAAW,QAAQ,oBAACA,gBAAK,MAAM,YAAa;EAC5C,WAAW,MAAM,gBAAgB,oBAACA,gBAAK,MAAM,uBAAwB,GAAG;EACxE,WAAW,KAAK,oBAACA,gBAAK,MAAM,cAAe;EAC3C,WAAW,QAAQ;EACnB,WAAW,SAAS;EACpB,WAAW,QAAQ;EACnB,WAAW,YAAY;EACvB,WAAW,QAAQ;EACnB,WAAW,YAAY;EACvB,WAAW,YAAY;EACvB,WAAW,cAAc;EACzB,WAAW,eAAe;EAC1B,WAAW,QAAQ;EACnB,WAAW,QAAQ;CACrB;AAED,MAAM,SAAS,MACZ,EACC,UAAU,UACV,YACA,QAAQ,cACR,MACA,cACA,SACA,SACA,WACA,OACA,GAAG,WACC;CACJ,MAAM,EAAE,eAAe,cAAc;CACrC,MAAM,eAAe,YAAY;CACjC,MAAM,CAAC,WAAW,gBAAgB,eAAe,gBAAgB,KAAK,CAAC;CACvE,MAAM,gBAAgB,cAAc,mBAAmB,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAE3E,iBAAgB;AAEd,eADiB,gBAAgB,KAAK,CAChB;IACrB,CAAC,KAAK,CAAC;CAEV,MAAMK,UAA+B,cAAc,WAAW,cAAc,EAAE,CAAC,cAAc,CAAC;AAE9F,QACE,oBAACC;EACC,OAAO;EACI;EACX,KAAK,eAAe,IAAI;EACxB;EACO;EACP,GAAI;YAEH,WAAW,eACV,oBAACC;GACC,IAAI;GACJ,WAAW,GACT,SAAS;IAAE;IAAc;IAAY;IAAS,CAAC,EAC/C,YAAY,aACb;GACD,KAAK;GACL;GACA,OAAO,cAAc;aAEpB,UAAU,KAAK,KAAK,UACnB,oBAAC,mBAAiB,QAAQ,QAAQ,UAAU,IAAI,IAAtC,MAA6C,CACvD;IACK,GAET,UAAU,KAAK,KAAK,UAClB,oBAACA;GACC,IAAI;GACJ,WAAW,GACT,SAAS;IAAE;IAAc;IAAY;IAAS,CAAC,EAC/C,YAAY,aACb;GAED,OAAO,cAAc;aAEpB,QAAQ,QAAQ,UAAU,IAAI;KAH1B,MAIE,CACT;GAEI;EAGf;AAED,OAAO,cAAc;AAErB,qBAAe"}
@@ -7,6 +7,7 @@ declare const KeyMapEnum: {
7
7
  readonly BracketLeft: "bracketleft";
8
8
  readonly BracketRight: "bracketright";
9
9
  readonly Comma: "comma";
10
+ readonly CommandOrControl: "commandorcontrol";
10
11
  readonly Control: "control";
11
12
  readonly Ctrl: "ctrl";
12
13
  readonly Down: "down";
@@ -7,6 +7,7 @@ const KeyMapEnum = {
7
7
  BracketLeft: "bracketleft",
8
8
  BracketRight: "bracketright",
9
9
  Comma: "comma",
10
+ CommandOrControl: "commandorcontrol",
10
11
  Control: "control",
11
12
  Ctrl: "ctrl",
12
13
  Down: "down",
@@ -1 +1 @@
1
- {"version":3,"file":"const.mjs","names":[],"sources":["../../src/Hotkey/const.ts"],"sourcesContent":["export const KeyMapEnum = {\n Alt: 'alt',\n Backquote: 'backquote', // `\n Backslash: 'backslash', // \\\n Backspace: 'backspace',\n BracketLeft: 'bracketleft', // [\n BracketRight: 'bracketright', // ]\n Comma: 'comma',\n Control: 'control',\n Ctrl: 'ctrl',\n Down: 'down',\n Enter: 'enter',\n Equal: 'equal', // =\n Esc: 'esc',\n Left: 'left',\n LeftClick: 'left-click',\n LeftDoubleClick: 'left-double-click',\n Meta: 'meta', // Command on Mac, Win on Win\n MiddleClick: 'middle-click',\n Minus: 'minus', // -\n Mod: 'mod', // Command on Mac, Ctrl on Win\n Period: 'period', // .\n Plus: 'equal', // +\n QuestionMark: 'slash', // ?\n Quote: 'quote', // '\n Right: 'right',\n RightClick: 'right-click',\n RightDoubleClick: 'right-double-click',\n Semicolon: 'semicolon', // ;\n Shift: 'shift',\n Slash: 'slash', // /\n Space: 'space',\n Tab: 'tab',\n Up: 'up',\n} as const;\n"],"mappings":";AAAA,MAAa,aAAa;CACxB,KAAK;CACL,WAAW;CACX,WAAW;CACX,WAAW;CACX,aAAa;CACb,cAAc;CACd,OAAO;CACP,SAAS;CACT,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,KAAK;CACL,MAAM;CACN,WAAW;CACX,iBAAiB;CACjB,MAAM;CACN,aAAa;CACb,OAAO;CACP,KAAK;CACL,QAAQ;CACR,MAAM;CACN,cAAc;CACd,OAAO;CACP,OAAO;CACP,YAAY;CACZ,kBAAkB;CAClB,WAAW;CACX,OAAO;CACP,OAAO;CACP,OAAO;CACP,KAAK;CACL,IAAI;CACL"}
1
+ {"version":3,"file":"const.mjs","names":[],"sources":["../../src/Hotkey/const.ts"],"sourcesContent":["export const KeyMapEnum = {\n Alt: 'alt',\n Backquote: 'backquote', // `\n Backslash: 'backslash', // \\\n Backspace: 'backspace',\n BracketLeft: 'bracketleft', // [\n BracketRight: 'bracketright', // ]\n Comma: 'comma',\n CommandOrControl: 'commandorcontrol',\n Control: 'control',\n Ctrl: 'ctrl',\n Down: 'down',\n Enter: 'enter',\n Equal: 'equal', // =\n Esc: 'esc',\n Left: 'left',\n LeftClick: 'left-click',\n LeftDoubleClick: 'left-double-click',\n Meta: 'meta', // Command on Mac, Win on Win\n MiddleClick: 'middle-click',\n Minus: 'minus', // -\n Mod: 'mod', // Command on Mac, Ctrl on Win\n Period: 'period', // .\n Plus: 'equal', // +\n QuestionMark: 'slash', // ?\n Quote: 'quote', // '\n Right: 'right',\n RightClick: 'right-click',\n RightDoubleClick: 'right-double-click',\n Semicolon: 'semicolon', // ;\n Shift: 'shift',\n Slash: 'slash', // /\n Space: 'space',\n Tab: 'tab',\n Up: 'up',\n} as const;\n"],"mappings":";AAAA,MAAa,aAAa;CACxB,KAAK;CACL,WAAW;CACX,WAAW;CACX,WAAW;CACX,aAAa;CACb,cAAc;CACd,OAAO;CACP,kBAAkB;CAClB,SAAS;CACT,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,KAAK;CACL,MAAM;CACN,WAAW;CACX,iBAAiB;CACjB,MAAM;CACN,aAAa;CACb,OAAO;CACP,KAAK;CACL,QAAQ;CACR,MAAM;CACN,cAAc;CACd,OAAO;CACP,OAAO;CACP,YAAY;CACZ,kBAAkB;CAClB,WAAW;CACX,OAAO;CACP,OAAO;CACP,OAAO;CACP,KAAK;CACL,IAAI;CACL"}
@@ -4,6 +4,7 @@ import { KeyMapEnum } from "./const.mjs";
4
4
  const NORMATIVE_MODIFIER = [
5
5
  KeyMapEnum.Ctrl,
6
6
  KeyMapEnum.Control,
7
+ KeyMapEnum.CommandOrControl,
7
8
  KeyMapEnum.Meta,
8
9
  KeyMapEnum.Mod,
9
10
  KeyMapEnum.Alt,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/Hotkey/utils.ts"],"sourcesContent":["import { KeyMapEnum } from './const';\n\n// https://superuser.com/questions/1238058/key-combination-order\nexport const NORMATIVE_MODIFIER = [\n // win: Ctrl ,mac: Control\n KeyMapEnum.Ctrl,\n KeyMapEnum.Control,\n\n // win: Win ,mac: Command\n KeyMapEnum.Meta,\n\n // Mod should have same priority as Ctrl since it represents Ctrl on Windows\n KeyMapEnum.Mod,\n\n // win: Alt ,mac: Option\n KeyMapEnum.Alt,\n\n // win: Shift ,mac: Shift\n KeyMapEnum.Shift,\n];\n\nconst orderMap = Object.fromEntries(NORMATIVE_MODIFIER.map((key, index) => [key, index]));\n\nexport const splitKeysByPlus = (keys: string): string[] => {\n return keys\n .replaceAll('++', `+${KeyMapEnum.Equal}`)\n .split('+')\n .sort((x, y) => {\n const idxX = orderMap[x.toLowerCase()] ?? orderMap.length;\n const idxY = orderMap[y.toLowerCase()] ?? orderMap.length;\n\n return idxX - idxY;\n });\n};\n\nexport const startCase = (str: string): string => {\n return str\n .replaceAll(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n};\n\nexport const checkIsAppleDevice = (isApple?: boolean) => {\n if (isApple !== undefined) {\n return isApple;\n }\n\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return false; // 处理 SSR 环境\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n return /mac|iphone|ipod|ipad|ios/i.test(userAgent);\n};\n\nexport const combineKeys = (keys: string[]): string => keys.join('+');\n"],"mappings":";;;AAGA,MAAa,qBAAqB;CAEhC,WAAW;CACX,WAAW;CAGX,WAAW;CAGX,WAAW;CAGX,WAAW;CAGX,WAAW;CACZ;AAED,MAAM,WAAW,OAAO,YAAY,mBAAmB,KAAK,KAAK,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC;AAEzF,MAAa,mBAAmB,SAA2B;AACzD,QAAO,KACJ,WAAW,MAAM,IAAI,WAAW,QAAQ,CACxC,MAAM,IAAI,CACV,MAAM,GAAG,MAAM;AAId,UAHa,SAAS,EAAE,aAAa,KAAK,SAAS,WACtC,SAAS,EAAE,aAAa,KAAK,SAAS;GAGnD;;AAGN,MAAa,aAAa,QAAwB;AAChD,QAAO,IACJ,WAAW,YAAY,MAAM,CAC7B,QAAQ,OAAO,MAAM,EAAE,aAAa,CAAC,CACrC,MAAM;;AAGX,MAAa,sBAAsB,YAAsB;AACvD,KAAI,YAAY,OACd,QAAO;AAGT,KAAI,OAAO,WAAW,eAAe,OAAO,cAAc,YACxD,QAAO;CAGT,MAAM,YAAY,UAAU,UAAU,aAAa;AACnD,QAAO,4BAA4B,KAAK,UAAU;;AAGpD,MAAa,eAAe,SAA2B,KAAK,KAAK,IAAI"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/Hotkey/utils.ts"],"sourcesContent":["import { KeyMapEnum } from './const';\n\n// https://superuser.com/questions/1238058/key-combination-order\nexport const NORMATIVE_MODIFIER = [\n // win: Ctrl ,mac: Control\n KeyMapEnum.Ctrl,\n KeyMapEnum.Control,\n KeyMapEnum.CommandOrControl,\n\n // win: Win ,mac: Command\n KeyMapEnum.Meta,\n\n // Mod should have same priority as Ctrl since it represents Ctrl on Windows\n KeyMapEnum.Mod,\n\n // win: Alt ,mac: Option\n KeyMapEnum.Alt,\n\n // win: Shift ,mac: Shift\n KeyMapEnum.Shift,\n];\n\nconst orderMap = Object.fromEntries(NORMATIVE_MODIFIER.map((key, index) => [key, index]));\n\nexport const splitKeysByPlus = (keys: string): string[] => {\n return keys\n .replaceAll('++', `+${KeyMapEnum.Equal}`)\n .split('+')\n .sort((x, y) => {\n const idxX = orderMap[x.toLowerCase()] ?? orderMap.length;\n const idxY = orderMap[y.toLowerCase()] ?? orderMap.length;\n\n return idxX - idxY;\n });\n};\n\nexport const startCase = (str: string): string => {\n return str\n .replaceAll(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n};\n\nexport const checkIsAppleDevice = (isApple?: boolean) => {\n if (isApple !== undefined) {\n return isApple;\n }\n\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return false; // 处理 SSR 环境\n }\n\n const userAgent = navigator.userAgent.toLowerCase();\n return /mac|iphone|ipod|ipad|ios/i.test(userAgent);\n};\n\nexport const combineKeys = (keys: string[]): string => keys.join('+');\n"],"mappings":";;;AAGA,MAAa,qBAAqB;CAEhC,WAAW;CACX,WAAW;CACX,WAAW;CAGX,WAAW;CAGX,WAAW;CAGX,WAAW;CAGX,WAAW;CACZ;AAED,MAAM,WAAW,OAAO,YAAY,mBAAmB,KAAK,KAAK,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC;AAEzF,MAAa,mBAAmB,SAA2B;AACzD,QAAO,KACJ,WAAW,MAAM,IAAI,WAAW,QAAQ,CACxC,MAAM,IAAI,CACV,MAAM,GAAG,MAAM;AAId,UAHa,SAAS,EAAE,aAAa,KAAK,SAAS,WACtC,SAAS,EAAE,aAAa,KAAK,SAAS;GAGnD;;AAGN,MAAa,aAAa,QAAwB;AAChD,QAAO,IACJ,WAAW,YAAY,MAAM,CAC7B,QAAQ,OAAO,MAAM,EAAE,aAAa,CAAC,CACrC,MAAM;;AAGX,MAAa,sBAAsB,YAAsB;AACvD,KAAI,YAAY,OACd,QAAO;AAGT,KAAI,OAAO,WAAW,eAAe,OAAO,cAAc,YACxD,QAAO;CAGT,MAAM,YAAY,UAAU,UAAU,aAAa;AACnD,QAAO,4BAA4B,KAAK,UAAU;;AAGpD,MAAa,eAAe,SAA2B,KAAK,KAAK,IAAI"}
@@ -1,8 +1,8 @@
1
1
  import { HotkeyInputProps } from "./type.mjs";
2
- import * as react21 from "react";
2
+ import * as react31 from "react";
3
3
 
4
4
  //#region src/HotkeyInput/HotkeyInput.d.ts
5
- declare const HotkeyInput: react21.NamedExoticComponent<HotkeyInputProps>;
5
+ declare const HotkeyInput: react31.NamedExoticComponent<HotkeyInputProps>;
6
6
  //#endregion
7
7
  export { HotkeyInput };
8
8
  //# sourceMappingURL=HotkeyInput.d.mts.map
@@ -10,7 +10,7 @@ import { styles, variants } from "./style.mjs";
10
10
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
12
  import { cx, useThemeMode } from "antd-style";
13
- import useMergeState from "use-merge-value";
13
+ import useControlledState from "use-merge-value";
14
14
  import { isEqual } from "es-toolkit/compat";
15
15
  import { Undo2Icon } from "lucide-react";
16
16
  import { useHotkeys, useRecordHotkeys } from "react-hotkeys-hook";
@@ -24,7 +24,7 @@ const HotkeyInput = memo(({ value = "", defaultValue = "", resetValue = "", onCh
24
24
  const { isDarkMode } = useThemeMode();
25
25
  const { t } = useTranslation(hotkey_default);
26
26
  const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);
27
- const [hotkeyValue, setHotkeyValue] = useMergeState(defaultValue, {
27
+ const [hotkeyValue, setHotkeyValue] = useControlledState(defaultValue, {
28
28
  defaultValue,
29
29
  onChange,
30
30
  value
@@ -1 +1 @@
1
- {"version":3,"file":"HotkeyInput.mjs","names":["hotkeyMessages","useControlledState","modifiers: string[]","normalKeys: string[]","normalizedKey: any","Flexbox","Hotkey","ActionIcon"],"sources":["../../src/HotkeyInput/HotkeyInput.tsx"],"sourcesContent":["'use client';\n\nimport type { InputRef } from 'antd';\nimport { cx, useThemeMode } from 'antd-style';\nimport { isEqual } from 'es-toolkit/compat';\nimport { Undo2Icon } from 'lucide-react';\nimport {\n type FocusEvent,\n type MouseEvent,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useHotkeys, useRecordHotkeys } from 'react-hotkeys-hook';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport Hotkey from '@/Hotkey';\nimport { NORMATIVE_MODIFIER, checkIsAppleDevice, splitKeysByPlus } from '@/Hotkey/utils';\nimport hotkeyMessages from '@/i18n/resources/en/hotkey';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport { styles, variants } from './style';\nimport type { HotkeyInputProps } from './type';\n\nconst HotkeyInput = memo<HotkeyInputProps>(\n ({\n value = '',\n defaultValue = '',\n resetValue = '',\n onChange,\n onConflict,\n placeholder,\n disabled,\n shadow,\n allowReset = true,\n style,\n className,\n hotkeyConflicts = [],\n variant,\n texts,\n isApple,\n onBlur,\n onReset,\n onFocus,\n }) => {\n const [isFocused, setIsFocused] = useState(false);\n const [hasConflict, setHasConflict] = useState(false);\n const [hasInvalidCombination, setHasInvalidCombination] = useState(false);\n const inputRef = useRef<InputRef>(null);\n const { isDarkMode } = useThemeMode();\n const { t } = useTranslation(hotkeyMessages);\n const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);\n const [hotkeyValue, setHotkeyValue] = useControlledState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // 使用 useRecordHotkeys 处理快捷键录入\n const [recordedKeys, { start, stop, isRecording, resetKeys }] = useRecordHotkeys();\n\n useHotkeys(\n '*',\n () => {\n inputRef.current?.blur();\n },\n {\n enableOnContentEditable: true,\n enableOnFormTags: true,\n enabled: isRecording && !disabled,\n keydown: false,\n keyup: true,\n preventDefault: true,\n },\n );\n\n // 处理按键,保证格式正确:修饰键在前,最多一个非修饰键在后\n const formatKeys = useCallback((keysSet: Set<string>) => {\n const modifiers: string[] = [];\n const normalKeys: string[] = [];\n\n for (const key of keysSet) {\n // 处理不同表示的修饰键\n const normalizedKey: any = key.toLowerCase();\n if (NORMATIVE_MODIFIER.includes(normalizedKey)) {\n // 统一修饰键表示\n if (\n (!isAppleDevice && normalizedKey === 'ctrl') ||\n (isAppleDevice && normalizedKey === 'meta')\n ) {\n if (!modifiers.includes('mod')) modifiers.push('mod');\n } else if (!modifiers.includes(normalizedKey)) {\n modifiers.push(normalizedKey);\n }\n } else {\n normalKeys.push(key);\n }\n }\n\n // 至少需要一个修饰键\n if (modifiers.length === 0 && normalKeys.length > 0) {\n return { isValid: false, keys: [] };\n }\n\n // 只允许一个非修饰键,如果有多个,只保留最后一个\n const finalKey = normalKeys.length > 0 ? [normalKeys.at(-1)] : [];\n const shortcuts = [modifiers, finalKey];\n\n return {\n // 组合必须包含至少一个按键\n isValid: shortcuts.every((k) => k.length > 0),\n keys: shortcuts.flat(),\n };\n }, []);\n\n // 获取格式化后的按键字符串\n const { isValid, keys } = formatKeys(recordedKeys);\n const keysString = keys.join('+');\n\n // 检查快捷键冲突\n const checkHotkeyConflict = useCallback(\n (newHotkey: string): boolean => {\n return hotkeyConflicts\n .filter((conflictKey) => conflictKey !== resetValue)\n .some((conflictKey) => {\n const newKeys = splitKeysByPlus(newHotkey);\n const conflictKeys = splitKeysByPlus(conflictKey);\n return isEqual(newKeys, conflictKeys);\n });\n },\n [hotkeyConflicts],\n );\n\n // 当按键组合完成时处理结果\n useEffect(() => {\n if (recordedKeys.size > 0 && !isRecording) {\n if (!isValid) {\n setHasInvalidCombination(true);\n setHasConflict(false);\n return;\n }\n\n setHasInvalidCombination(false);\n const newKeysString = keysString;\n\n // 检查冲突\n const conflict = checkHotkeyConflict(newKeysString);\n if (conflict) {\n setHasConflict(true);\n onConflict?.(newKeysString);\n } else {\n setHasConflict(false);\n setHotkeyValue?.(newKeysString);\n }\n }\n }, [\n recordedKeys,\n isRecording,\n isValid,\n keysString,\n checkHotkeyConflict,\n setHotkeyValue,\n onConflict,\n ]);\n\n // 处理输入框焦点\n const handleFocus = (e: FocusEvent<HTMLInputElement>) => {\n if (disabled) return;\n setIsFocused(true);\n setHasConflict(false);\n setHasInvalidCombination(false);\n start(); // 开始记录\n onFocus?.(e);\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n stop(); // 停止记录\n onBlur?.(e);\n };\n\n // 重置功能\n const handleReset = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setHotkeyValue?.(resetValue);\n resetKeys();\n setHasConflict(false);\n setHasInvalidCombination(false);\n setIsFocused(false);\n stop(); // 停止记录\n onReset?.(hotkeyValue, resetValue);\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (disabled || isFocused) return;\n inputRef.current?.focus();\n };\n\n const placeholderText = placeholder ?? t('hotkey.placeholder');\n const resetTitle = texts?.reset ?? t('hotkey.reset');\n const conflictText = texts?.conflicts ?? t('hotkey.conflict');\n const invalidText = texts?.invalidCombination ?? t('hotkey.invalidCombination');\n\n return (\n <Flexbox\n className={className}\n gap={8}\n style={{\n position: 'relative',\n ...style,\n }}\n >\n <Flexbox\n align={'center'}\n className={cx(\n variants({\n disabled,\n error: hasConflict || hasInvalidCombination,\n focused: isFocused,\n shadow,\n variant: variant || (isDarkMode ? 'filled' : 'outlined'),\n }),\n )}\n horizontal\n justify={'space-between'}\n onClick={handleClick}\n >\n <div style={{ pointerEvents: 'none' }}>\n {isRecording ? (\n <span className={styles.placeholder}>\n {keys.length > 0 ? <Hotkey keys={keysString} /> : placeholderText}\n </span>\n ) : hotkeyValue ? (\n <Hotkey keys={hotkeyValue} />\n ) : (\n <span className={styles.placeholder}>{placeholderText}</span>\n )}\n </div>\n\n {/* 隐藏的输入框,用于接收焦点 */}\n <input\n className={styles.hiddenInput}\n disabled={disabled}\n onBlur={handleBlur}\n onFocus={handleFocus}\n readOnly\n ref={inputRef as any}\n style={{ pointerEvents: 'none' }}\n />\n\n {!isFocused && allowReset && hotkeyValue && hotkeyValue !== resetValue && !disabled && (\n <ActionIcon\n icon={Undo2Icon}\n onClick={handleReset}\n size={'small'}\n title={resetTitle}\n variant={'filled'}\n />\n )}\n </Flexbox>\n {hasConflict && <div className={styles.errorText}>{conflictText}</div>}\n {hasInvalidCombination && <div className={styles.errorText}>{invalidText}</div>}\n </Flexbox>\n );\n },\n);\n\nHotkeyInput.displayName = 'HotkeyInput';\n\nexport default HotkeyInput;\n"],"mappings":"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"}
1
+ {"version":3,"file":"HotkeyInput.mjs","names":["hotkeyMessages","modifiers: string[]","normalKeys: string[]","normalizedKey: any","Flexbox","Hotkey","ActionIcon"],"sources":["../../src/HotkeyInput/HotkeyInput.tsx"],"sourcesContent":["'use client';\n\nimport type { InputRef } from 'antd';\nimport { cx, useThemeMode } from 'antd-style';\nimport { isEqual } from 'es-toolkit/compat';\nimport { Undo2Icon } from 'lucide-react';\nimport {\n type FocusEvent,\n type MouseEvent,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useHotkeys, useRecordHotkeys } from 'react-hotkeys-hook';\nimport useControlledState from 'use-merge-value';\n\nimport ActionIcon from '@/ActionIcon';\nimport { Flexbox } from '@/Flex';\nimport Hotkey from '@/Hotkey';\nimport { NORMATIVE_MODIFIER, checkIsAppleDevice, splitKeysByPlus } from '@/Hotkey/utils';\nimport hotkeyMessages from '@/i18n/resources/en/hotkey';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport { styles, variants } from './style';\nimport type { HotkeyInputProps } from './type';\n\nconst HotkeyInput = memo<HotkeyInputProps>(\n ({\n value = '',\n defaultValue = '',\n resetValue = '',\n onChange,\n onConflict,\n placeholder,\n disabled,\n shadow,\n allowReset = true,\n style,\n className,\n hotkeyConflicts = [],\n variant,\n texts,\n isApple,\n onBlur,\n onReset,\n onFocus,\n }) => {\n const [isFocused, setIsFocused] = useState(false);\n const [hasConflict, setHasConflict] = useState(false);\n const [hasInvalidCombination, setHasInvalidCombination] = useState(false);\n const inputRef = useRef<InputRef>(null);\n const { isDarkMode } = useThemeMode();\n const { t } = useTranslation(hotkeyMessages);\n const isAppleDevice = useMemo(() => checkIsAppleDevice(isApple), [isApple]);\n const [hotkeyValue, setHotkeyValue] = useControlledState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // 使用 useRecordHotkeys 处理快捷键录入\n const [recordedKeys, { start, stop, isRecording, resetKeys }] = useRecordHotkeys();\n\n useHotkeys(\n '*',\n () => {\n inputRef.current?.blur();\n },\n {\n enableOnContentEditable: true,\n enableOnFormTags: true,\n enabled: isRecording && !disabled,\n keydown: false,\n keyup: true,\n preventDefault: true,\n },\n );\n\n // 处理按键,保证格式正确:修饰键在前,最多一个非修饰键在后\n const formatKeys = useCallback((keysSet: Set<string>) => {\n const modifiers: string[] = [];\n const normalKeys: string[] = [];\n\n for (const key of keysSet) {\n // 处理不同表示的修饰键\n const normalizedKey: any = key.toLowerCase();\n if (NORMATIVE_MODIFIER.includes(normalizedKey)) {\n // 统一修饰键表示\n if (\n (!isAppleDevice && normalizedKey === 'ctrl') ||\n (isAppleDevice && normalizedKey === 'meta')\n ) {\n if (!modifiers.includes('mod')) modifiers.push('mod');\n } else if (!modifiers.includes(normalizedKey)) {\n modifiers.push(normalizedKey);\n }\n } else {\n normalKeys.push(key);\n }\n }\n\n // 至少需要一个修饰键\n if (modifiers.length === 0 && normalKeys.length > 0) {\n return { isValid: false, keys: [] };\n }\n\n // 只允许一个非修饰键,如果有多个,只保留最后一个\n const finalKey = normalKeys.length > 0 ? [normalKeys.at(-1)] : [];\n const shortcuts = [modifiers, finalKey];\n\n return {\n // 组合必须包含至少一个按键\n isValid: shortcuts.every((k) => k.length > 0),\n keys: shortcuts.flat(),\n };\n }, []);\n\n // 获取格式化后的按键字符串\n const { isValid, keys } = formatKeys(recordedKeys);\n const keysString = keys.join('+');\n\n // 检查快捷键冲突\n const checkHotkeyConflict = useCallback(\n (newHotkey: string): boolean => {\n return hotkeyConflicts\n .filter((conflictKey) => conflictKey !== resetValue)\n .some((conflictKey) => {\n const newKeys = splitKeysByPlus(newHotkey);\n const conflictKeys = splitKeysByPlus(conflictKey);\n return isEqual(newKeys, conflictKeys);\n });\n },\n [hotkeyConflicts],\n );\n\n // 当按键组合完成时处理结果\n useEffect(() => {\n if (recordedKeys.size > 0 && !isRecording) {\n if (!isValid) {\n setHasInvalidCombination(true);\n setHasConflict(false);\n return;\n }\n\n setHasInvalidCombination(false);\n const newKeysString = keysString;\n\n // 检查冲突\n const conflict = checkHotkeyConflict(newKeysString);\n if (conflict) {\n setHasConflict(true);\n onConflict?.(newKeysString);\n } else {\n setHasConflict(false);\n setHotkeyValue?.(newKeysString);\n }\n }\n }, [\n recordedKeys,\n isRecording,\n isValid,\n keysString,\n checkHotkeyConflict,\n setHotkeyValue,\n onConflict,\n ]);\n\n // 处理输入框焦点\n const handleFocus = (e: FocusEvent<HTMLInputElement>) => {\n if (disabled) return;\n setIsFocused(true);\n setHasConflict(false);\n setHasInvalidCombination(false);\n start(); // 开始记录\n onFocus?.(e);\n };\n\n const handleBlur = (e: FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n stop(); // 停止记录\n onBlur?.(e);\n };\n\n // 重置功能\n const handleReset = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setHotkeyValue?.(resetValue);\n resetKeys();\n setHasConflict(false);\n setHasInvalidCombination(false);\n setIsFocused(false);\n stop(); // 停止记录\n onReset?.(hotkeyValue, resetValue);\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (disabled || isFocused) return;\n inputRef.current?.focus();\n };\n\n const placeholderText = placeholder ?? t('hotkey.placeholder');\n const resetTitle = texts?.reset ?? t('hotkey.reset');\n const conflictText = texts?.conflicts ?? t('hotkey.conflict');\n const invalidText = texts?.invalidCombination ?? t('hotkey.invalidCombination');\n\n return (\n <Flexbox\n className={className}\n gap={8}\n style={{\n position: 'relative',\n ...style,\n }}\n >\n <Flexbox\n align={'center'}\n className={cx(\n variants({\n disabled,\n error: hasConflict || hasInvalidCombination,\n focused: isFocused,\n shadow,\n variant: variant || (isDarkMode ? 'filled' : 'outlined'),\n }),\n )}\n horizontal\n justify={'space-between'}\n onClick={handleClick}\n >\n <div style={{ pointerEvents: 'none' }}>\n {isRecording ? (\n <span className={styles.placeholder}>\n {keys.length > 0 ? <Hotkey keys={keysString} /> : placeholderText}\n </span>\n ) : hotkeyValue ? (\n <Hotkey keys={hotkeyValue} />\n ) : (\n <span className={styles.placeholder}>{placeholderText}</span>\n )}\n </div>\n\n {/* 隐藏的输入框,用于接收焦点 */}\n <input\n className={styles.hiddenInput}\n disabled={disabled}\n onBlur={handleBlur}\n onFocus={handleFocus}\n readOnly\n ref={inputRef as any}\n style={{ pointerEvents: 'none' }}\n />\n\n {!isFocused && allowReset && hotkeyValue && hotkeyValue !== resetValue && !disabled && (\n <ActionIcon\n icon={Undo2Icon}\n onClick={handleReset}\n size={'small'}\n title={resetTitle}\n variant={'filled'}\n />\n )}\n </Flexbox>\n {hasConflict && <div className={styles.errorText}>{conflictText}</div>}\n {hasInvalidCombination && <div className={styles.errorText}>{invalidText}</div>}\n </Flexbox>\n );\n },\n);\n\nHotkeyInput.displayName = 'HotkeyInput';\n\nexport default HotkeyInput;\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { IconProps } from "./type.mjs";
2
- import * as react20 from "react";
2
+ import * as react21 from "react";
3
3
 
4
4
  //#region src/Icon/Icon.d.ts
5
- declare const Icon: react20.NamedExoticComponent<IconProps>;
5
+ declare const Icon: react21.NamedExoticComponent<IconProps>;
6
6
  //#endregion
7
7
  export { Icon };
8
8
  //# sourceMappingURL=Icon.d.mts.map