@antscorp/antsomi-ui 2.0.84 → 2.0.86-text-editor-beta.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 (231) hide show
  1. package/es/assets/css/main.scss +4 -2
  2. package/es/components/index.scss +2 -0
  3. package/es/components/molecules/EmojiPopover/EmojiPopover.js +5 -1
  4. package/es/components/molecules/FontSizeInput/FontSizeInput.d.ts +3 -0
  5. package/es/components/molecules/FontSizeInput/FontSizeInput.js +128 -0
  6. package/es/components/molecules/FontSizeInput/components/FontSizeControl.d.ts +8 -0
  7. package/es/components/molecules/FontSizeInput/components/FontSizeControl.js +14 -0
  8. package/es/components/molecules/FontSizeInput/components/FontSizeDropdown.d.ts +20 -0
  9. package/es/components/molecules/FontSizeInput/components/FontSizeDropdown.js +17 -0
  10. package/es/components/molecules/FontSizeInput/constants.d.ts +2 -0
  11. package/es/components/molecules/FontSizeInput/constants.js +5 -0
  12. package/es/components/molecules/FontSizeInput/index.d.ts +2 -0
  13. package/es/components/molecules/FontSizeInput/index.js +1 -0
  14. package/es/components/molecules/FontSizeInput/styled.d.ts +3 -0
  15. package/es/components/molecules/FontSizeInput/styled.js +22 -0
  16. package/es/components/molecules/FontSizeInput/styles.scss +15 -0
  17. package/es/components/molecules/FontSizeInput/types.d.ts +24 -0
  18. package/es/components/molecules/FontSizeInput/types.js +1 -0
  19. package/es/components/molecules/FontSizeInput/utils.d.ts +7 -0
  20. package/es/components/molecules/FontSizeInput/utils.js +9 -0
  21. package/es/components/molecules/TagifyInput/TagifyInput.js +20 -14
  22. package/es/components/molecules/TagifyInput/utils.d.ts +10 -1
  23. package/es/components/molecules/TagifyInput/utils.js +64 -6
  24. package/es/components/molecules/VirtualizedMenu/VirtualizedMenu.d.ts +6 -3
  25. package/es/components/molecules/VirtualizedMenu/__mocks__/index.js +2550 -938
  26. package/es/components/molecules/VirtualizedMenu/components/Item/Item.d.ts +13 -3
  27. package/es/components/molecules/VirtualizedMenu/components/Item/Item.js +53 -25
  28. package/es/components/molecules/VirtualizedMenu/components/Item/index.d.ts +1 -1
  29. package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.d.ts +8 -5
  30. package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.js +289 -46
  31. package/es/components/molecules/VirtualizedMenu/components/MenuInline/index.js +1 -0
  32. package/es/components/molecules/VirtualizedMenu/styled.d.ts +1 -1
  33. package/es/components/molecules/VirtualizedMenu/styled.js +23 -4
  34. package/es/components/molecules/VirtualizedMenu/types.d.ts +6 -9
  35. package/es/components/molecules/VirtualizedMenu/utils.d.ts +8 -5
  36. package/es/components/molecules/VirtualizedMenu/utils.js +13 -18
  37. package/es/components/molecules/index.d.ts +1 -0
  38. package/es/components/molecules/index.js +1 -0
  39. package/es/components/molecules/index.scss +1 -0
  40. package/es/components/organism/ActivityTimeline/__mocks__/event_tracking.json +1290 -0
  41. package/es/components/organism/ActivityTimeline/__mocks__/timeline.json +3059 -0
  42. package/es/components/organism/TextEditor/TextEditor.d.ts +3 -0
  43. package/es/components/organism/TextEditor/TextEditor.js +251 -0
  44. package/es/components/organism/TextEditor/__mocks__/text-block.settings.json +320 -0
  45. package/es/components/organism/TextEditor/__mocks__/text-contennt.d.ts +1 -0
  46. package/es/components/organism/TextEditor/__mocks__/text-contennt.js +38 -0
  47. package/es/components/organism/TextEditor/constants.d.ts +135 -0
  48. package/es/components/organism/TextEditor/constants.js +280 -0
  49. package/es/components/organism/TextEditor/extensions/BackgroundColor.d.ts +25 -0
  50. package/es/components/organism/TextEditor/extensions/BackgroundColor.js +46 -0
  51. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.d.ts +130 -0
  52. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.js +247 -0
  53. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.d.ts +15 -0
  54. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.js +31 -0
  55. package/es/components/organism/TextEditor/extensions/BubbleMenu/index.d.ts +2 -0
  56. package/es/components/organism/TextEditor/extensions/BubbleMenu/index.js +2 -0
  57. package/es/components/organism/TextEditor/extensions/Color.d.ts +6 -0
  58. package/es/components/organism/TextEditor/extensions/Color.js +41 -0
  59. package/es/components/organism/TextEditor/extensions/Emoji.d.ts +57 -0
  60. package/es/components/organism/TextEditor/extensions/Emoji.js +184 -0
  61. package/es/components/organism/TextEditor/extensions/FontFamily.d.ts +6 -0
  62. package/es/components/organism/TextEditor/extensions/FontFamily.js +43 -0
  63. package/es/components/organism/TextEditor/extensions/FontSize.d.ts +32 -0
  64. package/es/components/organism/TextEditor/extensions/FontSize.js +47 -0
  65. package/es/components/organism/TextEditor/extensions/FontWeight.d.ts +23 -0
  66. package/es/components/organism/TextEditor/extensions/FontWeight.js +41 -0
  67. package/es/components/organism/TextEditor/extensions/Highlight.d.ts +1 -0
  68. package/es/components/organism/TextEditor/extensions/Highlight.js +14 -0
  69. package/es/components/organism/TextEditor/extensions/Indent.d.ts +28 -0
  70. package/es/components/organism/TextEditor/extensions/Indent.js +68 -0
  71. package/es/components/organism/TextEditor/extensions/LineHeight.d.ts +20 -0
  72. package/es/components/organism/TextEditor/extensions/LineHeight.js +36 -0
  73. package/es/components/organism/TextEditor/extensions/Link.d.ts +15 -0
  74. package/es/components/organism/TextEditor/extensions/Link.js +50 -0
  75. package/es/components/organism/TextEditor/extensions/ListItemMarker.d.ts +13 -0
  76. package/es/components/organism/TextEditor/extensions/ListItemMarker.js +174 -0
  77. package/es/components/organism/TextEditor/extensions/Selection.d.ts +6 -0
  78. package/es/components/organism/TextEditor/extensions/Selection.js +40 -0
  79. package/es/components/organism/TextEditor/extensions/SmartTag.d.ts +39 -0
  80. package/es/components/organism/TextEditor/extensions/SmartTag.js +167 -0
  81. package/es/components/organism/TextEditor/extensions/StyleMemory.d.ts +36 -0
  82. package/es/components/organism/TextEditor/extensions/StyleMemory.js +163 -0
  83. package/es/components/organism/TextEditor/extensions/TextTransform.d.ts +31 -0
  84. package/es/components/organism/TextEditor/extensions/TextTransform.js +37 -0
  85. package/es/components/organism/TextEditor/hooks/index.d.ts +6 -0
  86. package/es/components/organism/TextEditor/hooks/index.js +6 -0
  87. package/es/components/organism/TextEditor/hooks/useDocumentState.d.ts +18 -0
  88. package/es/components/organism/TextEditor/hooks/useDocumentState.js +42 -0
  89. package/es/components/organism/TextEditor/hooks/useLinkHandler.d.ts +10 -0
  90. package/es/components/organism/TextEditor/hooks/useLinkHandler.js +223 -0
  91. package/es/components/organism/TextEditor/hooks/useMarkTracking.d.ts +26 -0
  92. package/es/components/organism/TextEditor/hooks/useMarkTracking.js +68 -0
  93. package/es/components/organism/TextEditor/hooks/usePersistence.d.ts +31 -0
  94. package/es/components/organism/TextEditor/hooks/usePersistence.js +169 -0
  95. package/es/components/organism/TextEditor/hooks/useStyleMemory.d.ts +6 -0
  96. package/es/components/organism/TextEditor/hooks/useStyleMemory.js +42 -0
  97. package/es/components/organism/TextEditor/hooks/useStylePresets.d.ts +34 -0
  98. package/es/components/organism/TextEditor/hooks/useStylePresets.js +83 -0
  99. package/es/components/organism/TextEditor/index.d.ts +14 -0
  100. package/es/components/organism/TextEditor/index.js +6 -0
  101. package/es/components/organism/TextEditor/index.scss +61 -0
  102. package/es/components/organism/TextEditor/provider.d.ts +10 -0
  103. package/es/components/organism/TextEditor/provider.js +20 -0
  104. package/es/components/organism/TextEditor/store.d.ts +11 -0
  105. package/es/components/organism/TextEditor/store.js +12 -0
  106. package/es/components/organism/TextEditor/styled.d.ts +8 -0
  107. package/es/components/organism/TextEditor/styled.js +90 -0
  108. package/es/components/organism/TextEditor/types.d.ts +92 -0
  109. package/es/components/organism/TextEditor/types.js +1 -0
  110. package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.d.ts +6 -0
  111. package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.js +78 -0
  112. package/es/components/organism/TextEditor/ui/BubbleMenu/index.d.ts +1 -0
  113. package/es/components/organism/TextEditor/ui/BubbleMenu/index.js +1 -0
  114. package/es/components/organism/TextEditor/ui/ColorPicker/ColorPicker.d.ts +43 -0
  115. package/es/components/organism/TextEditor/ui/ColorPicker/ColorPicker.js +120 -0
  116. package/es/components/organism/TextEditor/ui/ColorPicker/index.d.ts +1 -0
  117. package/es/components/organism/TextEditor/ui/ColorPicker/index.js +1 -0
  118. package/es/components/organism/TextEditor/ui/Emoji/EmojiList.d.ts +11 -0
  119. package/es/components/organism/TextEditor/ui/Emoji/EmojiList.js +66 -0
  120. package/es/components/organism/TextEditor/ui/Emoji/index.d.ts +2 -0
  121. package/es/components/organism/TextEditor/ui/Emoji/index.js +2 -0
  122. package/es/components/organism/TextEditor/ui/Emoji/suggestion.d.ts +4 -0
  123. package/es/components/organism/TextEditor/ui/Emoji/suggestion.js +71 -0
  124. package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.d.ts +12 -0
  125. package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.js +69 -0
  126. package/es/components/organism/TextEditor/ui/FontPopover/styled.d.ts +1 -0
  127. package/es/components/organism/TextEditor/ui/FontPopover/styled.js +20 -0
  128. package/es/components/organism/TextEditor/ui/Popover/Popover.d.ts +6 -0
  129. package/es/components/organism/TextEditor/ui/Popover/Popover.js +7 -0
  130. package/es/components/organism/TextEditor/ui/Popover/index.d.ts +1 -0
  131. package/es/components/organism/TextEditor/ui/Popover/index.js +1 -0
  132. package/es/components/organism/TextEditor/ui/Select/Select.d.ts +4 -0
  133. package/es/components/organism/TextEditor/ui/Select/Select.js +7 -0
  134. package/es/components/organism/TextEditor/ui/Select/index.d.ts +1 -0
  135. package/es/components/organism/TextEditor/ui/Select/index.js +1 -0
  136. package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.d.ts +30 -0
  137. package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.js +49 -0
  138. package/es/components/organism/TextEditor/ui/TextAlignSelect/index.d.ts +1 -0
  139. package/es/components/organism/TextEditor/ui/TextAlignSelect/index.js +1 -0
  140. package/es/components/organism/TextEditor/ui/Toolbar/Toolbar.d.ts +14 -0
  141. package/es/components/organism/TextEditor/ui/Toolbar/Toolbar.js +42 -0
  142. package/es/components/organism/TextEditor/ui/Toolbar/actions/BoldAction.d.ts +5 -0
  143. package/es/components/organism/TextEditor/ui/Toolbar/actions/BoldAction.js +7 -0
  144. package/es/components/organism/TextEditor/ui/Toolbar/actions/BulletListAction.d.ts +5 -0
  145. package/es/components/organism/TextEditor/ui/Toolbar/actions/BulletListAction.js +7 -0
  146. package/es/components/organism/TextEditor/ui/Toolbar/actions/ClearFormattingAction.d.ts +5 -0
  147. package/es/components/organism/TextEditor/ui/Toolbar/actions/ClearFormattingAction.js +18 -0
  148. package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.d.ts +4 -0
  149. package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.js +13 -0
  150. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.d.ts +7 -0
  151. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.js +18 -0
  152. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.d.ts +7 -0
  153. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.js +37 -0
  154. package/es/components/organism/TextEditor/ui/Toolbar/actions/HighlightAction.d.ts +5 -0
  155. package/es/components/organism/TextEditor/ui/Toolbar/actions/HighlightAction.js +7 -0
  156. package/es/components/organism/TextEditor/ui/Toolbar/actions/IndentAction.d.ts +5 -0
  157. package/es/components/organism/TextEditor/ui/Toolbar/actions/IndentAction.js +7 -0
  158. package/es/components/organism/TextEditor/ui/Toolbar/actions/ItalicAction.d.ts +5 -0
  159. package/es/components/organism/TextEditor/ui/Toolbar/actions/ItalicAction.js +7 -0
  160. package/es/components/organism/TextEditor/ui/Toolbar/actions/LinkAction.d.ts +6 -0
  161. package/es/components/organism/TextEditor/ui/Toolbar/actions/LinkAction.js +4 -0
  162. package/es/components/organism/TextEditor/ui/Toolbar/actions/OrderedListAction.d.ts +5 -0
  163. package/es/components/organism/TextEditor/ui/Toolbar/actions/OrderedListAction.js +7 -0
  164. package/es/components/organism/TextEditor/ui/Toolbar/actions/OutdentAction.d.ts +5 -0
  165. package/es/components/organism/TextEditor/ui/Toolbar/actions/OutdentAction.js +7 -0
  166. package/es/components/organism/TextEditor/ui/Toolbar/actions/SmartTagAction.d.ts +7 -0
  167. package/es/components/organism/TextEditor/ui/Toolbar/actions/SmartTagAction.js +9 -0
  168. package/es/components/organism/TextEditor/ui/Toolbar/actions/SpacingAction.d.ts +9 -0
  169. package/es/components/organism/TextEditor/ui/Toolbar/actions/SpacingAction.js +22 -0
  170. package/es/components/organism/TextEditor/ui/Toolbar/actions/StrikeAction.d.ts +5 -0
  171. package/es/components/organism/TextEditor/ui/Toolbar/actions/StrikeAction.js +7 -0
  172. package/es/components/organism/TextEditor/ui/Toolbar/actions/SubscriptAction.d.ts +5 -0
  173. package/es/components/organism/TextEditor/ui/Toolbar/actions/SubscriptAction.js +13 -0
  174. package/es/components/organism/TextEditor/ui/Toolbar/actions/SuperscriptAction.d.ts +5 -0
  175. package/es/components/organism/TextEditor/ui/Toolbar/actions/SuperscriptAction.js +13 -0
  176. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextAlignAction.d.ts +5 -0
  177. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextAlignAction.js +3 -0
  178. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextBackgroundColorAction.d.ts +7 -0
  179. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextBackgroundColorAction.js +19 -0
  180. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextColorAction.d.ts +15 -0
  181. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextColorAction.js +14 -0
  182. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextTransformAction.d.ts +5 -0
  183. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextTransformAction.js +30 -0
  184. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnderlineAction.d.ts +5 -0
  185. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnderlineAction.js +5 -0
  186. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnsetLink.d.ts +6 -0
  187. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnsetLink.js +10 -0
  188. package/es/components/organism/TextEditor/ui/Toolbar/actions/index.d.ts +20 -0
  189. package/es/components/organism/TextEditor/ui/Toolbar/actions/index.js +20 -0
  190. package/es/components/organism/TextEditor/ui/Toolbar/index.d.ts +1 -0
  191. package/es/components/organism/TextEditor/ui/Toolbar/index.js +1 -0
  192. package/es/components/organism/TextEditor/utils/documentState.d.ts +57 -0
  193. package/es/components/organism/TextEditor/utils/documentState.js +100 -0
  194. package/es/components/organism/TextEditor/utils/font.d.ts +84 -0
  195. package/es/components/organism/TextEditor/utils/font.js +175 -0
  196. package/es/components/organism/TextEditor/utils/htmlProcessing.d.ts +63 -0
  197. package/es/components/organism/TextEditor/utils/htmlProcessing.js +321 -0
  198. package/es/components/organism/TextEditor/utils/index.d.ts +8 -0
  199. package/es/components/organism/TextEditor/utils/index.js +16 -0
  200. package/es/components/organism/TextEditor/utils/link.d.ts +100 -0
  201. package/es/components/organism/TextEditor/utils/link.js +149 -0
  202. package/es/components/organism/TextEditor/utils/menu.d.ts +134 -0
  203. package/es/components/organism/TextEditor/utils/menu.js +317 -0
  204. package/es/components/organism/TextEditor/utils/selection.d.ts +25 -0
  205. package/es/components/organism/TextEditor/utils/selection.js +57 -0
  206. package/es/components/organism/TextEditor/utils/smartTag.d.ts +49 -0
  207. package/es/components/organism/TextEditor/utils/smartTag.js +89 -0
  208. package/es/components/organism/TextEditor/utils/style.d.ts +78 -0
  209. package/es/components/organism/TextEditor/utils/style.js +193 -0
  210. package/es/components/organism/index.d.ts +1 -0
  211. package/es/components/organism/index.js +1 -0
  212. package/es/components/organism/index.scss +1 -0
  213. package/es/config/index.d.ts +1 -0
  214. package/es/config/index.js +1 -0
  215. package/es/constants/api.d.ts +10 -0
  216. package/es/constants/api.js +10 -0
  217. package/es/hooks/index.d.ts +1 -0
  218. package/es/hooks/index.js +1 -0
  219. package/es/hooks/useBroadcastedLocalStorage.d.ts +5 -0
  220. package/es/hooks/useBroadcastedLocalStorage.js +71 -0
  221. package/es/hooks/useElementSize.d.ts +7 -0
  222. package/es/hooks/useElementSize.js +56 -0
  223. package/es/utils/common.d.ts +6 -9
  224. package/es/utils/common.js +44 -23
  225. package/es/utils/index.d.ts +1 -0
  226. package/es/utils/index.js +1 -0
  227. package/es/utils/tree.d.ts +225 -0
  228. package/es/utils/tree.js +469 -0
  229. package/es/utils/web.d.ts +4 -0
  230. package/es/utils/web.js +25 -0
  231. package/package.json +29 -3
@@ -1,6 +1,8 @@
1
+ @import url('../../components/index.scss');
2
+
1
3
  :root {
2
4
  --primary-color: #005fb8;
3
5
  --text-base-color: #222222;
6
+ --antsomi-box-shadow-secondary: 0 6px 16px 0 rgba(0, 0, 0, 0.08),
7
+ 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
4
8
  }
5
-
6
-
@@ -0,0 +1,2 @@
1
+ @import url('./organism/index.scss');
2
+ @import url('./molecules/index.scss');
@@ -66,7 +66,11 @@ const EmojiPopover = ({ disabled, collections, isForceHide, children, onEmojiCli
66
66
  children: renderCollection(collection.key),
67
67
  }));
68
68
  }, [collections, renderCollection]);
69
- return (_jsx(EmojiPopoverStyled, { content: _jsx(EmojiTabs, { activeKey: state.collectionActive, onTabClick: handleClickCollection, items: emojiCollections }), placement: "topLeft", trigger: "click", fresh: false, style: { padding: 15 }, arrow: false, rootClassName: "antsomi-emoji-popover", open: state.isOpen, onOpenChange: handleOpenChange, children: children || (_jsx(Button, { type: "link", icon: _jsx(EmojiSmileIcon, {}), disabled: disabled, onClick: () => handleOpenChange(true) })) }));
69
+ let content = (_jsx(EmojiTabs, { activeKey: state.collectionActive, onTabClick: handleClickCollection, items: emojiCollections }));
70
+ if (emojiCollections.length <= 1) {
71
+ content = emojiCollections.at(0)?.children;
72
+ }
73
+ return (_jsx(EmojiPopoverStyled, { content: content, placement: "topLeft", trigger: "click", fresh: false, style: { padding: 15 }, arrow: false, rootClassName: "antsomi-emoji-popover", open: state.isOpen, onOpenChange: handleOpenChange, children: children || (_jsx(Button, { type: "link", icon: _jsx(EmojiSmileIcon, {}), disabled: disabled, onClick: () => handleOpenChange(true) })) }));
70
74
  };
71
75
  EmojiPopover.defaultProps = {
72
76
  disabled: false,
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { FontSizeInputProps, HandlerRef } from './types';
3
+ export declare const FontSizeInput: import("react").ForwardRefExoticComponent<FontSizeInputProps & import("react").RefAttributes<HandlerRef>>;
@@ -0,0 +1,128 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef, useCallback, useState, useImperativeHandle, useEffect, useRef, useMemo, } from 'react';
3
+ import clsx from 'clsx';
4
+ import { useElementSize } from '@antscorp/antsomi-ui/es/hooks';
5
+ import { DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE_OPTIONS } from './constants';
6
+ import { CLS } from './utils';
7
+ import { FontSizeDropdown } from './components/FontSizeDropdown';
8
+ import { FontSizeControl } from './components/FontSizeControl';
9
+ const getFontSizeLabel = (value) => `${value} px`;
10
+ export const FontSizeInput = forwardRef((props, ref) => {
11
+ const { min = 1, max = 300, value: valueProp, defaultValue = DEFAULT_FONT_SIZE, options = DEFAULT_FONT_SIZE_OPTIONS, placeholder, style, className, disabled, dropdownProps, onFocus, onBlur, onChange = () => undefined, } = props;
12
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
13
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
14
+ const [popoverValue, setPopoverValue] = useState(null);
15
+ const [inputRef, { width: inputWidth }] = useElementSize();
16
+ const isControlled = valueProp !== undefined;
17
+ const value = isControlled ? +valueProp : +uncontrolledValue;
18
+ const popoverItemRefs = useRef(new Map());
19
+ const fontSizeOptions = useMemo(() => options.map(option => ({
20
+ size: option,
21
+ label: getFontSizeLabel(option),
22
+ className: clsx(CLS.PopoverListItem, {
23
+ [CLS.PopoverListItemSelected]: option === value,
24
+ }),
25
+ })), [options, value]);
26
+ useEffect(() => {
27
+ if (!isPopoverOpen) {
28
+ setPopoverValue(null);
29
+ }
30
+ if (isPopoverOpen && popoverValue) {
31
+ popoverItemRefs.current.get(popoverValue)?.focus({
32
+ preventScroll: true,
33
+ });
34
+ }
35
+ }, [popoverValue, isPopoverOpen]);
36
+ const handleInputFocus = (event) => {
37
+ onFocus?.(value, event);
38
+ setIsPopoverOpen(true);
39
+ };
40
+ const handleInputBlur = (event) => {
41
+ onBlur?.(value, event);
42
+ if (!popoverValue) {
43
+ setIsPopoverOpen(false);
44
+ }
45
+ };
46
+ const handleValueChange = useCallback((newValue, info) => {
47
+ if (!isControlled) {
48
+ setUncontrolledValue(newValue);
49
+ }
50
+ onChange(newValue, info);
51
+ }, [isControlled, onChange]);
52
+ const handleKeyDown = useCallback((e) => {
53
+ const currentSize = popoverValue ?? value;
54
+ const currentFocusIndex = fontSizeOptions.findIndex(item => item.size === currentSize);
55
+ const firstFontSize = fontSizeOptions.at(0);
56
+ const lastFontSize = fontSizeOptions.at(-1);
57
+ switch (e.key) {
58
+ case 'Enter': {
59
+ inputRef.current?.blur();
60
+ break;
61
+ }
62
+ case 'ArrowDown': {
63
+ e.preventDefault();
64
+ if (currentFocusIndex !== -1) {
65
+ const nextFocusIndex = Math.min(fontSizeOptions.length - 1, currentFocusIndex + 1);
66
+ setPopoverValue(fontSizeOptions[nextFocusIndex].size);
67
+ }
68
+ else if (firstFontSize) {
69
+ setPopoverValue(firstFontSize.size);
70
+ }
71
+ break;
72
+ }
73
+ case 'ArrowUp': {
74
+ e.preventDefault();
75
+ if (currentFocusIndex !== -1) {
76
+ const nextFocusIndex = Math.max(0, currentFocusIndex - 1);
77
+ setPopoverValue(fontSizeOptions[nextFocusIndex].size);
78
+ }
79
+ else if (lastFontSize) {
80
+ setPopoverValue(lastFontSize.size);
81
+ }
82
+ break;
83
+ }
84
+ default:
85
+ break;
86
+ }
87
+ }, [fontSizeOptions, inputRef, value, popoverValue]);
88
+ const handleClickPopoverItem = useCallback((size) => {
89
+ handleValueChange(size, { type: 'dropdown' });
90
+ setIsPopoverOpen(false);
91
+ inputRef.current?.blur();
92
+ }, [handleValueChange, inputRef]);
93
+ const handlePopoverItemKeydown = useCallback((e, size) => {
94
+ const currentFocusIndex = fontSizeOptions.findIndex(item => item.size === popoverValue);
95
+ switch (e.key) {
96
+ case 'Enter': {
97
+ handleClickPopoverItem(size);
98
+ break;
99
+ }
100
+ case 'ArrowDown': {
101
+ const nextFocusIndex = Math.min(fontSizeOptions.length - 1, currentFocusIndex + 1);
102
+ setPopoverValue(fontSizeOptions[nextFocusIndex].size);
103
+ e.stopPropagation();
104
+ break;
105
+ }
106
+ case 'ArrowUp': {
107
+ const nextFocusIndex = Math.max(0, currentFocusIndex - 1);
108
+ setPopoverValue(fontSizeOptions[nextFocusIndex].size);
109
+ e.stopPropagation();
110
+ break;
111
+ }
112
+ default:
113
+ break;
114
+ }
115
+ }, [fontSizeOptions, popoverValue, handleClickPopoverItem]);
116
+ useImperativeHandle(ref, () => ({
117
+ closeDropdown: () => setIsPopoverOpen(false),
118
+ }));
119
+ const content = (_jsx(FontSizeControl, { disabled: disabled, ref: inputRef, className: className, value: popoverValue ?? value, max: max, min: min, keyboard: false, defaultValue: defaultValue, style: style, placeholder: placeholder, onFocus: handleInputFocus, onBlur: handleInputBlur, onKeyDown: handleKeyDown, onChange: newValue => {
120
+ if (newValue === null)
121
+ return;
122
+ handleValueChange(Number(newValue), { type: 'input' });
123
+ }, onIncrement: () => handleValueChange(value + 1, { type: 'input' }), onDecrement: () => handleValueChange(value - 1, { type: 'input' }) }));
124
+ if (options.length) {
125
+ return (_jsx(FontSizeDropdown, { isOpen: isPopoverOpen, options: fontSizeOptions, popoverValue: popoverValue, width: inputWidth, itemRefs: popoverItemRefs, onItemClick: handleClickPopoverItem, onItemKeyDown: handlePopoverItemKeydown, onClose: () => setIsPopoverOpen(false), getPopupContainer: () => dropdownProps?.getPopupContainer?.() || document.body, children: content }));
126
+ }
127
+ return content;
128
+ });
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { InputNumberProps } from 'antd';
3
+ interface FontSizeControlProps extends InputNumberProps {
4
+ onIncrement: () => void;
5
+ onDecrement: () => void;
6
+ }
7
+ export declare const FontSizeControl: import("react").ForwardRefExoticComponent<FontSizeControlProps & import("react").RefAttributes<HTMLInputElement>>;
8
+ export {};
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, InputNumber } from 'antd';
3
+ import { MinusIcon, PlusIcon } from 'lucide-react';
4
+ import { forwardRef } from 'react';
5
+ import { InputRoot } from '../styled';
6
+ import { CLS } from '../utils';
7
+ import clsx from 'clsx';
8
+ export const FontSizeControl = forwardRef(({ onIncrement, onDecrement, ...rest }, ref) => (_jsxs(InputRoot, { children: [_jsx(Button, { size: "small", type: "text", onClick: onDecrement, disabled: rest.disabled ||
9
+ typeof rest.value !== 'number' ||
10
+ typeof rest.min !== 'number' ||
11
+ rest.value <= rest.min, children: _jsx(MinusIcon, { size: 14 }) }), _jsx(InputNumber, { ref: ref, className: clsx(CLS.Input, rest.className), formatter: value => `${value} px`, parser: value => value?.replace(/[^\d]/g, ''), controls: false, ...rest }), _jsx(Button, { size: "small", type: "text", onClick: onIncrement, disabled: rest.disabled ||
12
+ typeof rest.value !== 'number' ||
13
+ typeof rest.max !== 'number' ||
14
+ rest.value >= rest.max, children: _jsx(PlusIcon, { size: 14 }) })] })));
@@ -0,0 +1,20 @@
1
+ import { RefObject } from 'react';
2
+ type FontSizeOption = {
3
+ size: number;
4
+ label: string;
5
+ className: string;
6
+ };
7
+ interface FontSizeDropdownProps {
8
+ children: React.ReactNode;
9
+ isOpen: boolean;
10
+ options: FontSizeOption[];
11
+ popoverValue: number | null;
12
+ width: number;
13
+ itemRefs: RefObject<Map<number, HTMLLIElement>>;
14
+ onItemClick: (size: number) => void;
15
+ onItemKeyDown: (e: React.KeyboardEvent, size: number) => void;
16
+ onClose: () => void;
17
+ getPopupContainer?: () => HTMLElement;
18
+ }
19
+ export declare const FontSizeDropdown: ({ children, isOpen, options, popoverValue, width, itemRefs, onItemClick, onItemKeyDown, onClose, getPopupContainer, }: FontSizeDropdownProps) => import("react/jsx-runtime").JSX.Element;
20
+ export {};
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Popover } from 'antd';
3
+ import { StyledListFont, StyledListItemFont } from '../styled';
4
+ import { CLS } from '../utils';
5
+ export const FontSizeDropdown = ({ children, isOpen, options, popoverValue, width, itemRefs, onItemClick, onItemKeyDown, onClose, getPopupContainer, }) => {
6
+ const content = (_jsx(StyledListFont, { role: "list", className: CLS.PopoverList, style: { width: `${width}px` }, onMouseDown: e => e.preventDefault(), children: options.map((i, idx) => {
7
+ const isFocused = i.size === popoverValue;
8
+ return (_jsx(StyledListItemFont, { ref: el => {
9
+ if (!el || !itemRefs.current)
10
+ return;
11
+ itemRefs.current.set(i.size, el);
12
+ }, role: "listitem", className: i.className, "aria-posinset": idx + 1, "aria-setsize": options.length, tabIndex: isFocused ? 0 : -1, onClick: () => onItemClick(i.size), onKeyDown: e => onItemKeyDown(e, i.size), ...(isFocused && {
13
+ onBlur: onClose,
14
+ }), children: i.label }));
15
+ }) }));
16
+ return (_jsx(Popover, { arrow: false, open: isOpen, overlayClassName: CLS.Popover, content: content, getPopupContainer: getPopupContainer, children: children }));
17
+ };
@@ -0,0 +1,2 @@
1
+ export declare const DEFAULT_FONT_SIZE_OPTIONS: number[];
2
+ export declare const DEFAULT_FONT_SIZE: number;
@@ -0,0 +1,5 @@
1
+ import { THEME } from '@antscorp/antsomi-ui/es/constants';
2
+ export const DEFAULT_FONT_SIZE_OPTIONS = [
3
+ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72, 96,
4
+ ];
5
+ export const DEFAULT_FONT_SIZE = THEME.token?.fontSize || 14;
@@ -0,0 +1,2 @@
1
+ export * from './FontSizeInput';
2
+ export type { FontSizeInputProps, HandlerRef as FontSizeInputHandlerRef } from './types';
@@ -0,0 +1 @@
1
+ export * from './FontSizeInput';
@@ -0,0 +1,3 @@
1
+ export declare const StyledListFont: import("styled-components").StyledComponent<"ul", any, {}, never>;
2
+ export declare const StyledListItemFont: import("styled-components").StyledComponent<"li", any, {}, never>;
3
+ export declare const InputRoot: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -0,0 +1,22 @@
1
+ import { THEME } from '@antscorp/antsomi-ui/es/constants';
2
+ import styled from 'styled-components';
3
+ export const StyledListFont = styled.ul `
4
+ margin: 0;
5
+ padding: 0;
6
+ list-style-type: none;
7
+ `;
8
+ export const StyledListItemFont = styled.li `
9
+ padding: 6px 10px;
10
+ cursor: pointer;
11
+ text-align: center;
12
+
13
+ &:hover {
14
+ background-color: ${THEME.components?.Menu?.itemHoverBg};
15
+ }
16
+ `;
17
+ export const InputRoot = styled.div `
18
+ gap: 2px;
19
+ display: flex;
20
+ align-items: center;
21
+ width: fit-content;
22
+ `;
@@ -0,0 +1,15 @@
1
+ .antsomi-font-size-input-popover {
2
+ &.antsomi-popover {
3
+ .antsomi-popover-inner {
4
+ padding: 0;
5
+
6
+ .antsomi-popover-inner-content {
7
+ overflow: auto;
8
+
9
+ > ul {
10
+ max-height: 240px;
11
+ }
12
+ }
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,24 @@
1
+ /// <reference types="react" />
2
+ export interface HandlerRef {
3
+ closeDropdown: () => void;
4
+ }
5
+ export interface FontSizeInputProps {
6
+ value: number;
7
+ min?: number;
8
+ max?: number;
9
+ defaultValue?: number;
10
+ options?: number[];
11
+ placeholder?: string;
12
+ style?: React.CSSProperties;
13
+ className?: string;
14
+ delay?: number;
15
+ disabled?: boolean;
16
+ onChange?: (value: number, info: {
17
+ type: 'input' | 'dropdown';
18
+ }) => void;
19
+ onFocus?: (value: number, event: React.FocusEvent<HTMLInputElement>) => void;
20
+ onBlur?: (value: number, event: React.FocusEvent<HTMLInputElement>) => void;
21
+ dropdownProps?: {
22
+ getPopupContainer?: () => HTMLElement | null;
23
+ };
24
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ export declare const CLS: {
2
+ Popover: string;
3
+ PopoverList: string;
4
+ PopoverListItem: string;
5
+ PopoverListItemSelected: string;
6
+ Input: string;
7
+ };
@@ -0,0 +1,9 @@
1
+ import { antsomiClsx } from '@antscorp/antsomi-ui/es/utils';
2
+ const componentCls = antsomiClsx('font-size-input');
3
+ export const CLS = {
4
+ Popover: componentCls('popover'),
5
+ PopoverList: componentCls('popover-list'),
6
+ PopoverListItem: componentCls('popover-list-item'),
7
+ PopoverListItemSelected: componentCls('popover-list-item-selected'),
8
+ Input: componentCls('input'),
9
+ };
@@ -17,7 +17,7 @@ import '@yaireo/tagify/dist/tagify.css';
17
17
  // Styled
18
18
  import { TagTextArea, TagifyWrapper, WrapperPlaceHolder } from './styled';
19
19
  // Utils
20
- import { parseTagStringToTagify, convertInputStringToOriginal, emojiManufacturer, getEmojiTag, isPersonalizeTagType, generateTagContent, unescapeString, hasLineBreak, selectRange, isTagClickable, findURLInTextNodes, getAttributesString, isAnchorNodeChildOfElement, isShortLinkTagType, isCaretAtEndOfTextNodeWithNextTag, } from './utils';
20
+ import { parseTagStringToTagify, convertInputStringToOriginal, emojiManufacturer, getEmojiTag, isPersonalizeTagType, generateTagContent, unescapeString, hasLineBreak, selectRange, isTagClickable, findURLInTextNodes, getAttributesString, isAnchorNodeChildOfElement, isShortLinkTagType, isCaretAtEndOfTextNodeWithNextTag, getCurrentSelectionAndCloneRange, handleEnterWithNextTag, handleTextNodeBackspace, } from './utils';
21
21
  import { acceptablePatternChecking, detectURLRegex, getCachedRegex, getPersonalizeTagInfo, getShortLinkTagInfo, patternHandlers, } from './patternHandlers';
22
22
  // Constants
23
23
  import { DETECT_LINK, EMOJI, FORCE_SHOW_TOOLTIP, INVALID_TAG, MESSAGE_TAG, NO_VIEW_TAG, PERSONALIZE_PTN, PROMOTION_CODE, READONLY_TAG, REMOVED_TAG, SHORT_LINK, SHORT_LINK_PTN, SHORT_LINK_V2, defaultCssVariables, tagifyDefaultProps, } from './constants';
@@ -482,19 +482,25 @@ const TagifyInput = forwardRef((props, ref) => {
482
482
  }, [onOutputData]);
483
483
  const onTagifyChangedDebounce = useCallback(_.partial(onChangeDebounceCallback, onTagifyChanged), [onTagifyChanged, onChangeDebounceCallback]);
484
484
  const onKeyDown = useCallback((e) => {
485
- if (e.detail.event.key !== 'Enter' ||
486
- e.detail.event.shiftKey ||
487
- !isCaretAtEndOfTextNodeWithNextTag())
488
- return;
489
- const selection = window.getSelection();
490
- if (!selection?.rangeCount)
491
- return;
492
- const range = selection.getRangeAt(0);
493
- const currentNode = range.endContainer;
494
- const cacheEndOffset = range.endOffset;
495
- currentNode.textContent += ' ';
496
- range.setEnd(currentNode, cacheEndOffset);
497
- range.collapse(false);
485
+ switch (e.detail.event.key) {
486
+ case 'Enter': {
487
+ const { range } = getCurrentSelectionAndCloneRange();
488
+ if (!range || e.detail.event.shiftKey || !isCaretAtEndOfTextNodeWithNextTag(range))
489
+ break;
490
+ handleEnterWithNextTag(range);
491
+ break;
492
+ }
493
+ case 'Backspace': {
494
+ const { range } = getCurrentSelectionAndCloneRange();
495
+ if (!range || e.detail.event.shiftKey || !isCaretAtEndOfTextNodeWithNextTag(range))
496
+ break;
497
+ handleTextNodeBackspace(range);
498
+ break;
499
+ }
500
+ default: {
501
+ break;
502
+ }
503
+ }
498
504
  }, []);
499
505
  const customizeTag = useCallback((tagData, tagify) => {
500
506
  const { value, collection, label, type } = tagData;
@@ -184,4 +184,13 @@ export declare const getAttributesString: (map: Map<string, string | boolean | n
184
184
  * @returns {boolean} True if the anchor node is a child of the element, false otherwise
185
185
  */
186
186
  export declare const isAnchorNodeChildOfElement: (element: Node, anchorNodeInstance: Node | null) => boolean;
187
- export declare function isCaretAtEndOfTextNodeWithNextTag(): boolean;
187
+ export declare function isCaretAtEndOfTextNodeWithNextTag(range: Range): boolean;
188
+ export declare const getCurrentSelectionAndCloneRange: () => {
189
+ selection: Selection | null;
190
+ range: null;
191
+ } | {
192
+ selection: Selection;
193
+ range: Range;
194
+ };
195
+ export declare const handleTextNodeBackspace: (range: Range) => void;
196
+ export declare const handleEnterWithNextTag: (range: Range) => void;
@@ -649,11 +649,7 @@ export const isAnchorNodeChildOfElement = (element, anchorNodeInstance) => {
649
649
  // Use Node.contains() to check if the element contains the anchor node
650
650
  return element.contains(anchorNode) && element.contains(anchorNodeInstance);
651
651
  };
652
- export function isCaretAtEndOfTextNodeWithNextTag() {
653
- const selection = window.getSelection();
654
- if (!selection || selection.rangeCount === 0)
655
- return false;
656
- const range = selection.getRangeAt(0);
652
+ export function isCaretAtEndOfTextNodeWithNextTag(range) {
657
653
  const { startContainer, startOffset } = range;
658
654
  // Check if caret is inside a text node
659
655
  if (startContainer.nodeType !== Node.TEXT_NODE)
@@ -663,8 +659,70 @@ export function isCaretAtEndOfTextNodeWithNextTag() {
663
659
  if (startOffset !== textNode.length)
664
660
  return false;
665
661
  // Now check if the next sibling is a tag (element node)
666
- const { nextSibling } = textNode;
662
+ let { nextSibling } = textNode;
667
663
  if (!nextSibling)
668
664
  return false;
665
+ // If the next sibling is a text node, keep moving forward until we find a non-empty text node
666
+ while (nextSibling.nodeType === Node.TEXT_NODE &&
667
+ !nextSibling.textContent &&
668
+ nextSibling.nextSibling) {
669
+ nextSibling = nextSibling.nextSibling;
670
+ }
669
671
  return nextSibling.nodeType === Node.ELEMENT_NODE && nextSibling.nodeName === 'TAG';
670
672
  }
673
+ export const getCurrentSelectionAndCloneRange = () => {
674
+ const selection = window.getSelection();
675
+ if (!selection?.rangeCount)
676
+ return { selection, range: null };
677
+ const range = selection.getRangeAt(0).cloneRange();
678
+ return { selection, range };
679
+ };
680
+ function isCaretAtStartOfLineBeforeBackspace(range) {
681
+ // Clone range to avoid modifying original
682
+ const { startContainer, startOffset } = range;
683
+ if (startContainer.nodeType !== Node.TEXT_NODE)
684
+ return false;
685
+ const { textContent } = startContainer;
686
+ if (typeof textContent !== 'string')
687
+ return false;
688
+ if (textContent.length === 1)
689
+ return true;
690
+ // Look backwards from caret position for newline
691
+ const offset = 2; // Number of characters to look back, because of caret before delete by Backspace
692
+ for (let i = startOffset - offset; i >= 0; i--) {
693
+ const char = textContent.charAt(i);
694
+ if (char === '\n') {
695
+ // Found newline, check if only whitespace between newline and caret
696
+ const textBetween = textContent.substring(i + offset, startOffset);
697
+ return textBetween.trim() === '';
698
+ }
699
+ if (char.trim() !== '') {
700
+ // Found non-whitespace character, not at line start
701
+ return false;
702
+ }
703
+ }
704
+ return false;
705
+ }
706
+ const isValidTextNodeForBackspace = (node, range) => node.textContent &&
707
+ node.nodeType === Node.TEXT_NODE &&
708
+ node.textContent.length &&
709
+ isCaretAtStartOfLineBeforeBackspace(range);
710
+ const insertZeroWidthSpaceBeforeTag = (node) => {
711
+ const { parentNode: tagifyInput, nextSibling: tagifyTag } = node;
712
+ if (tagifyInput?.nodeName !== 'SPAN' || tagifyTag?.nodeName !== 'TAG')
713
+ return;
714
+ const textNode = document.createTextNode('\u200B');
715
+ selectRange(tagifyInput.insertBefore(textNode, tagifyTag), 0, 0);
716
+ };
717
+ export const handleTextNodeBackspace = (range) => {
718
+ const currentNode = range.endContainer;
719
+ if (!isValidTextNodeForBackspace(currentNode, range))
720
+ return;
721
+ insertZeroWidthSpaceBeforeTag(currentNode);
722
+ };
723
+ export const handleEnterWithNextTag = (range) => {
724
+ const currentNode = range.endContainer;
725
+ if (currentNode.nodeType !== Node.TEXT_NODE)
726
+ return;
727
+ insertZeroWidthSpaceBeforeTag(currentNode);
728
+ };
@@ -7,13 +7,16 @@ export declare const VirtualizedMenu: React.ForwardRefExoticComponent<Partial<{
7
7
  selectable: boolean;
8
8
  className: string;
9
9
  itemSize: number;
10
- selected: string[];
10
+ selected: string | string[];
11
11
  expanded: string[];
12
12
  onClick: (args: {
13
13
  item: import("./types").ItemType;
14
- pathKey: import("./types").PathKey;
14
+ domEvent?: React.MouseEvent<Element, MouseEvent> | undefined;
15
+ elKey: "item" | "item-expand-el";
15
16
  }) => void;
16
- action: React.ReactNode | ((item: import("./types").ItemType) => React.ReactNode);
17
+ action: React.ReactNode | ((item: import("./types").ItemType, others: {
18
+ expandEl: React.ReactNode;
19
+ }) => React.ReactNode);
17
20
  }> & {
18
21
  mode?: "inline" | undefined;
19
22
  } & React.RefAttributes<import("./types").VirtualizedMenuBaseHandle>>;