@antscorp/antsomi-ui 2.0.110 → 2.0.111

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 (344) hide show
  1. package/es/assets/css/main.scss +2 -0
  2. package/es/components/atoms/Eyedropper/Eyedropper.d.ts +2 -0
  3. package/es/components/atoms/Eyedropper/Eyedropper.js +53 -0
  4. package/es/components/atoms/Eyedropper/index.d.ts +0 -0
  5. package/es/components/atoms/Eyedropper/index.js +1 -0
  6. package/es/components/atoms/Eyedropper/styled.d.ts +9 -0
  7. package/es/components/atoms/Eyedropper/styled.js +45 -0
  8. package/es/components/atoms/Eyedropper/types.d.ts +5 -0
  9. package/es/components/atoms/Eyedropper/types.js +1 -0
  10. package/es/components/icons/ALignRightIcon.d.ts +3 -0
  11. package/es/components/icons/ALignRightIcon.js +7 -0
  12. package/es/components/icons/AlignCenterIcon.d.ts +3 -0
  13. package/es/components/icons/AlignCenterIcon.js +7 -0
  14. package/es/components/icons/AlignJustifyIcon.d.ts +3 -0
  15. package/es/components/icons/AlignJustifyIcon.js +7 -0
  16. package/es/components/icons/AlignLeftIcon.d.ts +3 -0
  17. package/es/components/icons/AlignLeftIcon.js +7 -0
  18. package/es/components/icons/ArrowDropDownIcon.d.ts +3 -0
  19. package/es/components/icons/ArrowDropDownIcon.js +7 -0
  20. package/es/components/icons/ChevronRightIcon.d.ts +3 -0
  21. package/es/components/icons/ChevronRightIcon.js +7 -0
  22. package/es/components/icons/ColorizeIcon.d.ts +3 -0
  23. package/es/components/icons/ColorizeIcon.js +7 -0
  24. package/es/components/icons/LazyIcon/LazyIcon.d.ts +9 -0
  25. package/es/components/icons/LazyIcon/LazyIcon.js +9 -0
  26. package/es/components/icons/LinkOffIcon.d.ts +3 -0
  27. package/es/components/icons/LinkOffIcon.js +7 -0
  28. package/es/components/icons/MinusIcon.d.ts +3 -0
  29. package/es/components/icons/MinusIcon.js +7 -0
  30. package/es/components/icons/index.d.ts +9 -0
  31. package/es/components/icons/index.js +9 -0
  32. package/es/components/index.scss +1 -0
  33. package/es/components/molecules/EmojiCollections/CommonCollection/index.js +2 -2
  34. package/es/components/molecules/EmojiCollections/types.d.ts +1 -0
  35. package/es/components/molecules/EmojiPopover/EmojiPopover.d.ts +2 -0
  36. package/es/components/molecules/EmojiPopover/EmojiPopover.js +10 -6
  37. package/es/components/molecules/EmojiPopover/styled.js +1 -1
  38. package/es/components/molecules/EyedropperButton/EyedropperButton.d.ts +11 -0
  39. package/es/components/molecules/EyedropperButton/EyedropperButton.js +34 -0
  40. package/es/components/molecules/EyedropperButton/index.d.ts +0 -0
  41. package/es/components/molecules/EyedropperButton/index.js +1 -0
  42. package/es/components/molecules/EyedropperButton/styled.d.ts +7 -0
  43. package/es/components/molecules/EyedropperButton/styled.js +23 -0
  44. package/es/components/molecules/FontSizeInput/FontSizeInput.d.ts +3 -0
  45. package/es/components/molecules/FontSizeInput/FontSizeInput.js +134 -0
  46. package/es/components/molecules/FontSizeInput/components/FontSizeControl.d.ts +8 -0
  47. package/es/components/molecules/FontSizeInput/components/FontSizeControl.js +14 -0
  48. package/es/components/molecules/FontSizeInput/components/FontSizeDropdown.d.ts +21 -0
  49. package/es/components/molecules/FontSizeInput/components/FontSizeDropdown.js +19 -0
  50. package/es/components/molecules/FontSizeInput/constants.d.ts +2 -0
  51. package/es/components/molecules/FontSizeInput/constants.js +5 -0
  52. package/es/components/molecules/FontSizeInput/index.d.ts +2 -0
  53. package/es/components/molecules/FontSizeInput/index.js +1 -0
  54. package/es/components/molecules/FontSizeInput/styled.d.ts +7 -0
  55. package/es/components/molecules/FontSizeInput/styled.js +39 -0
  56. package/es/components/molecules/FontSizeInput/types.d.ts +23 -0
  57. package/es/components/molecules/FontSizeInput/types.js +1 -0
  58. package/es/components/molecules/FontSizeInput/utils.d.ts +7 -0
  59. package/es/components/molecules/FontSizeInput/utils.js +9 -0
  60. package/es/components/molecules/SearchPopover/SearchPopover.d.ts +2 -1
  61. package/es/components/molecules/SearchPopover/SearchPopover.js +3 -3
  62. package/es/components/molecules/SearchPopover/styled.d.ts +12 -1
  63. package/es/components/molecules/SearchPopover/styled.js +1 -2
  64. package/es/components/molecules/SearchPopover/types.d.ts +4 -3
  65. package/es/components/molecules/VirtualizedMenu/VirtualizedMenu.d.ts +1 -0
  66. package/es/components/molecules/VirtualizedMenu/components/Item/Item.js +6 -8
  67. package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.d.ts +10 -10
  68. package/es/components/molecules/VirtualizedMenu/components/MenuInline/MenuInline.js +49 -289
  69. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/index.d.ts +9 -0
  70. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/index.js +5 -0
  71. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useFocusManagement.d.ts +23 -0
  72. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useFocusManagement.js +81 -0
  73. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useItemInteraction.d.ts +24 -0
  74. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useItemInteraction.js +32 -0
  75. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useKeyboardNavigation.d.ts +26 -0
  76. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useKeyboardNavigation.js +93 -0
  77. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useTreeState.d.ts +24 -0
  78. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useTreeState.js +94 -0
  79. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useVisibleItems.d.ts +7 -0
  80. package/es/components/molecules/VirtualizedMenu/components/MenuInline/hooks/useVisibleItems.js +132 -0
  81. package/es/components/molecules/VirtualizedMenu/styled.js +24 -3
  82. package/es/components/molecules/VirtualizedMenu/types.d.ts +2 -0
  83. package/es/components/molecules/VirtualizedMenu/utils.d.ts +2 -0
  84. package/es/components/molecules/VirtualizedMenu/utils.js +2 -0
  85. package/es/components/molecules/index.d.ts +1 -0
  86. package/es/components/molecules/index.js +1 -0
  87. package/es/components/molecules/index.scss +1 -0
  88. package/es/components/organism/TextEditor/TextEditor.d.ts +10 -0
  89. package/es/components/organism/TextEditor/TextEditor.js +388 -0
  90. package/es/components/organism/TextEditor/__mocks__/text-block.settings.json +320 -0
  91. package/es/components/organism/TextEditor/__mocks__/text-contennt.d.ts +1 -0
  92. package/es/components/organism/TextEditor/__mocks__/text-contennt.js +47 -0
  93. package/es/components/organism/TextEditor/constants.d.ts +196 -0
  94. package/es/components/organism/TextEditor/constants.js +398 -0
  95. package/es/components/organism/TextEditor/extensions/BackgroundColor.d.ts +25 -0
  96. package/es/components/organism/TextEditor/extensions/BackgroundColor.js +43 -0
  97. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.d.ts +18 -0
  98. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu-plugin.js +81 -0
  99. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.d.ts +15 -0
  100. package/es/components/organism/TextEditor/extensions/BubbleMenu/bubble-menu.js +35 -0
  101. package/es/components/organism/TextEditor/extensions/BubbleMenu/index.d.ts +2 -0
  102. package/es/components/organism/TextEditor/extensions/BubbleMenu/index.js +2 -0
  103. package/es/components/organism/TextEditor/extensions/ClearFormatting.d.ts +16 -0
  104. package/es/components/organism/TextEditor/extensions/ClearFormatting.js +30 -0
  105. package/es/components/organism/TextEditor/extensions/Color.d.ts +6 -0
  106. package/es/components/organism/TextEditor/extensions/Color.js +34 -0
  107. package/es/components/organism/TextEditor/extensions/Emoji.d.ts +57 -0
  108. package/es/components/organism/TextEditor/extensions/Emoji.js +184 -0
  109. package/es/components/organism/TextEditor/extensions/FontFamily.d.ts +6 -0
  110. package/es/components/organism/TextEditor/extensions/FontFamily.js +36 -0
  111. package/es/components/organism/TextEditor/extensions/FontSize.d.ts +31 -0
  112. package/es/components/organism/TextEditor/extensions/FontSize.js +46 -0
  113. package/es/components/organism/TextEditor/extensions/FontWeight.d.ts +23 -0
  114. package/es/components/organism/TextEditor/extensions/FontWeight.js +41 -0
  115. package/es/components/organism/TextEditor/extensions/Indent.d.ts +21 -0
  116. package/es/components/organism/TextEditor/extensions/Indent.js +63 -0
  117. package/es/components/organism/TextEditor/extensions/LetterSpacing.d.ts +32 -0
  118. package/es/components/organism/TextEditor/extensions/LetterSpacing.js +48 -0
  119. package/es/components/organism/TextEditor/extensions/LineHeight.d.ts +20 -0
  120. package/es/components/organism/TextEditor/extensions/LineHeight.js +101 -0
  121. package/es/components/organism/TextEditor/extensions/Link.d.ts +22 -0
  122. package/es/components/organism/TextEditor/extensions/Link.js +178 -0
  123. package/es/components/organism/TextEditor/extensions/ListItem.d.ts +10 -0
  124. package/es/components/organism/TextEditor/extensions/ListItem.js +93 -0
  125. package/es/components/organism/TextEditor/extensions/ListItemMarker.d.ts +13 -0
  126. package/es/components/organism/TextEditor/extensions/ListItemMarker.js +174 -0
  127. package/es/components/organism/TextEditor/extensions/OrderedList.d.ts +56 -0
  128. package/es/components/organism/TextEditor/extensions/OrderedList.js +187 -0
  129. package/es/components/organism/TextEditor/extensions/SmartTag.d.ts +28 -0
  130. package/es/components/organism/TextEditor/extensions/SmartTag.js +103 -0
  131. package/es/components/organism/TextEditor/extensions/StyleMemory.d.ts +36 -0
  132. package/es/components/organism/TextEditor/extensions/StyleMemory.js +163 -0
  133. package/es/components/organism/TextEditor/extensions/TextTransform.d.ts +30 -0
  134. package/es/components/organism/TextEditor/extensions/TextTransform.js +36 -0
  135. package/es/components/organism/TextEditor/extensions/UnorderedList.d.ts +55 -0
  136. package/es/components/organism/TextEditor/extensions/UnorderedList.js +176 -0
  137. package/es/components/organism/TextEditor/hooks/index.d.ts +6 -0
  138. package/es/components/organism/TextEditor/hooks/index.js +6 -0
  139. package/es/components/organism/TextEditor/hooks/useColorSet.d.ts +4 -0
  140. package/es/components/organism/TextEditor/hooks/useColorSet.js +29 -0
  141. package/es/components/organism/TextEditor/hooks/useDocumentState.d.ts +18 -0
  142. package/es/components/organism/TextEditor/hooks/useDocumentState.js +42 -0
  143. package/es/components/organism/TextEditor/hooks/useMarkTracking.d.ts +26 -0
  144. package/es/components/organism/TextEditor/hooks/useMarkTracking.js +69 -0
  145. package/es/components/organism/TextEditor/hooks/usePersistence.d.ts +31 -0
  146. package/es/components/organism/TextEditor/hooks/usePersistence.js +169 -0
  147. package/es/components/organism/TextEditor/hooks/useStyleMemory.d.ts +6 -0
  148. package/es/components/organism/TextEditor/hooks/useStyleMemory.js +42 -0
  149. package/es/components/organism/TextEditor/hooks/useStylePresets.d.ts +34 -0
  150. package/es/components/organism/TextEditor/hooks/useStylePresets.js +83 -0
  151. package/es/components/organism/TextEditor/index.d.ts +18 -0
  152. package/es/components/organism/TextEditor/index.js +8 -0
  153. package/es/components/organism/TextEditor/index.scss +65 -0
  154. package/es/components/organism/TextEditor/provider.d.ts +15 -0
  155. package/es/components/organism/TextEditor/provider.js +36 -0
  156. package/es/components/organism/TextEditor/store.d.ts +20 -0
  157. package/es/components/organism/TextEditor/store.js +40 -0
  158. package/es/components/organism/TextEditor/stories/WithOldDynAndLink/froala-legacy-format.settings.json +95 -0
  159. package/es/components/organism/TextEditor/stories/WithOldDynAndLink/shared.d.ts +111 -0
  160. package/es/components/organism/TextEditor/stories/WithOldDynAndLink/shared.js +82 -0
  161. package/es/components/organism/TextEditor/stories/shared.d.ts +64 -0
  162. package/es/components/organism/TextEditor/stories/shared.js +57 -0
  163. package/es/components/organism/TextEditor/styled.d.ts +9 -0
  164. package/es/components/organism/TextEditor/styled.js +61 -0
  165. package/es/components/organism/TextEditor/types.d.ts +311 -0
  166. package/es/components/organism/TextEditor/types.js +6 -0
  167. package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.d.ts +3 -0
  168. package/es/components/organism/TextEditor/ui/BubbleMenu/BubbleMenu.js +114 -0
  169. package/es/components/organism/TextEditor/ui/BubbleMenu/index.d.ts +1 -0
  170. package/es/components/organism/TextEditor/ui/BubbleMenu/index.js +1 -0
  171. package/es/components/organism/TextEditor/ui/Button/Button.d.ts +9 -0
  172. package/es/components/organism/TextEditor/ui/Button/Button.js +35 -0
  173. package/es/components/organism/TextEditor/ui/Button/index.d.ts +2 -0
  174. package/es/components/organism/TextEditor/ui/Button/index.js +1 -0
  175. package/es/components/organism/TextEditor/ui/Button/types.d.ts +10 -0
  176. package/es/components/organism/TextEditor/ui/Button/types.js +1 -0
  177. package/es/components/organism/TextEditor/ui/ColorPicker/ColorPicker.d.ts +39 -0
  178. package/es/components/organism/TextEditor/ui/ColorPicker/ColorPicker.js +131 -0
  179. package/es/components/organism/TextEditor/ui/ColorPicker/index.d.ts +1 -0
  180. package/es/components/organism/TextEditor/ui/ColorPicker/index.js +1 -0
  181. package/es/components/organism/TextEditor/ui/DropdownButton/DropdownButton.d.ts +17 -0
  182. package/es/components/organism/TextEditor/ui/DropdownButton/DropdownButton.js +51 -0
  183. package/es/components/organism/TextEditor/ui/DropdownButton/index.d.ts +1 -0
  184. package/es/components/organism/TextEditor/ui/DropdownButton/index.js +1 -0
  185. package/es/components/organism/TextEditor/ui/Emoji/EmojiList.d.ts +11 -0
  186. package/es/components/organism/TextEditor/ui/Emoji/EmojiList.js +66 -0
  187. package/es/components/organism/TextEditor/ui/Emoji/index.d.ts +2 -0
  188. package/es/components/organism/TextEditor/ui/Emoji/index.js +2 -0
  189. package/es/components/organism/TextEditor/ui/Emoji/suggestion.d.ts +4 -0
  190. package/es/components/organism/TextEditor/ui/Emoji/suggestion.js +71 -0
  191. package/es/components/organism/TextEditor/ui/FontPopover/FontItem.d.ts +2 -0
  192. package/es/components/organism/TextEditor/ui/FontPopover/FontItem.js +27 -0
  193. package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.d.ts +16 -0
  194. package/es/components/organism/TextEditor/ui/FontPopover/FontPopover.js +102 -0
  195. package/es/components/organism/TextEditor/ui/FontPopover/styled.d.ts +2 -0
  196. package/es/components/organism/TextEditor/ui/FontPopover/styled.js +36 -0
  197. package/es/components/organism/TextEditor/ui/FontPopover/types.d.ts +35 -0
  198. package/es/components/organism/TextEditor/ui/FontPopover/types.js +1 -0
  199. package/es/components/organism/TextEditor/ui/LinkInsertForm/LinkInsertForm.d.ts +16 -0
  200. package/es/components/organism/TextEditor/ui/LinkInsertForm/LinkInsertForm.js +61 -0
  201. package/es/components/organism/TextEditor/ui/LinkInsertForm/index.d.ts +2 -0
  202. package/es/components/organism/TextEditor/ui/LinkInsertForm/index.js +1 -0
  203. package/es/components/organism/TextEditor/ui/LinkPopover/LinkPopover.d.ts +9 -0
  204. package/es/components/organism/TextEditor/ui/LinkPopover/LinkPopover.js +126 -0
  205. package/es/components/organism/TextEditor/ui/LinkPopover/index.d.ts +2 -0
  206. package/es/components/organism/TextEditor/ui/LinkPopover/index.js +1 -0
  207. package/es/components/organism/TextEditor/ui/Popover/Popover.d.ts +6 -0
  208. package/es/components/organism/TextEditor/ui/Popover/Popover.js +9 -0
  209. package/es/components/organism/TextEditor/ui/Popover/index.d.ts +1 -0
  210. package/es/components/organism/TextEditor/ui/Popover/index.js +1 -0
  211. package/es/components/organism/TextEditor/ui/Select/Select.d.ts +4 -0
  212. package/es/components/organism/TextEditor/ui/Select/Select.js +7 -0
  213. package/es/components/organism/TextEditor/ui/Select/index.d.ts +1 -0
  214. package/es/components/organism/TextEditor/ui/Select/index.js +1 -0
  215. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/SplitButtonDropdown.d.ts +2 -0
  216. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/SplitButtonDropdown.js +44 -0
  217. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/index.d.ts +1 -0
  218. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/index.js +1 -0
  219. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/styled.d.ts +2 -0
  220. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/styled.js +58 -0
  221. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/types.d.ts +19 -0
  222. package/es/components/organism/TextEditor/ui/SplitButtonDropdown/types.js +1 -0
  223. package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.d.ts +30 -0
  224. package/es/components/organism/TextEditor/ui/TextAlignSelect/TextAlignSelect.js +75 -0
  225. package/es/components/organism/TextEditor/ui/TextAlignSelect/index.d.ts +1 -0
  226. package/es/components/organism/TextEditor/ui/TextAlignSelect/index.js +1 -0
  227. package/es/components/organism/TextEditor/ui/Toolbar/FormattingToolbar.d.ts +19 -0
  228. package/es/components/organism/TextEditor/ui/Toolbar/FormattingToolbar.js +85 -0
  229. package/es/components/organism/TextEditor/ui/Toolbar/LinkPreviewToolbar.d.ts +10 -0
  230. package/es/components/organism/TextEditor/ui/Toolbar/LinkPreviewToolbar.js +39 -0
  231. package/es/components/organism/TextEditor/ui/Toolbar/actions/BoldAction.d.ts +6 -0
  232. package/es/components/organism/TextEditor/ui/Toolbar/actions/BoldAction.js +19 -0
  233. package/es/components/organism/TextEditor/ui/Toolbar/actions/BulletListAction.d.ts +6 -0
  234. package/es/components/organism/TextEditor/ui/Toolbar/actions/BulletListAction.js +93 -0
  235. package/es/components/organism/TextEditor/ui/Toolbar/actions/ClearFormattingAction.d.ts +5 -0
  236. package/es/components/organism/TextEditor/ui/Toolbar/actions/ClearFormattingAction.js +20 -0
  237. package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.d.ts +4 -0
  238. package/es/components/organism/TextEditor/ui/Toolbar/actions/EmojiAction.js +32 -0
  239. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.d.ts +18 -0
  240. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontFamilyAction.js +41 -0
  241. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.d.ts +8 -0
  242. package/es/components/organism/TextEditor/ui/Toolbar/actions/FontSizeAction.js +51 -0
  243. package/es/components/organism/TextEditor/ui/Toolbar/actions/HistoryAction.d.ts +5 -0
  244. package/es/components/organism/TextEditor/ui/Toolbar/actions/HistoryAction.js +21 -0
  245. package/es/components/organism/TextEditor/ui/Toolbar/actions/IndentAction.d.ts +5 -0
  246. package/es/components/organism/TextEditor/ui/Toolbar/actions/IndentAction.js +17 -0
  247. package/es/components/organism/TextEditor/ui/Toolbar/actions/ItalicAction.d.ts +5 -0
  248. package/es/components/organism/TextEditor/ui/Toolbar/actions/ItalicAction.js +18 -0
  249. package/es/components/organism/TextEditor/ui/Toolbar/actions/LetterSpacing.d.ts +5 -0
  250. package/es/components/organism/TextEditor/ui/Toolbar/actions/LetterSpacing.js +28 -0
  251. package/es/components/organism/TextEditor/ui/Toolbar/actions/LineSpacingAction.d.ts +10 -0
  252. package/es/components/organism/TextEditor/ui/Toolbar/actions/LineSpacingAction.js +45 -0
  253. package/es/components/organism/TextEditor/ui/Toolbar/actions/LinkAction.d.ts +6 -0
  254. package/es/components/organism/TextEditor/ui/Toolbar/actions/LinkAction.js +17 -0
  255. package/es/components/organism/TextEditor/ui/Toolbar/actions/OrderedListAction.d.ts +5 -0
  256. package/es/components/organism/TextEditor/ui/Toolbar/actions/OrderedListAction.js +67 -0
  257. package/es/components/organism/TextEditor/ui/Toolbar/actions/OutdentAction.d.ts +5 -0
  258. package/es/components/organism/TextEditor/ui/Toolbar/actions/OutdentAction.js +17 -0
  259. package/es/components/organism/TextEditor/ui/Toolbar/actions/SmartTagAction.d.ts +7 -0
  260. package/es/components/organism/TextEditor/ui/Toolbar/actions/SmartTagAction.js +18 -0
  261. package/es/components/organism/TextEditor/ui/Toolbar/actions/StrikeAction.d.ts +5 -0
  262. package/es/components/organism/TextEditor/ui/Toolbar/actions/StrikeAction.js +18 -0
  263. package/es/components/organism/TextEditor/ui/Toolbar/actions/SubscriptAction.d.ts +5 -0
  264. package/es/components/organism/TextEditor/ui/Toolbar/actions/SubscriptAction.js +26 -0
  265. package/es/components/organism/TextEditor/ui/Toolbar/actions/SuperscriptAction.d.ts +5 -0
  266. package/es/components/organism/TextEditor/ui/Toolbar/actions/SuperscriptAction.js +26 -0
  267. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextAlignAction.d.ts +5 -0
  268. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextAlignAction.js +3 -0
  269. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextBackgroundColorAction.d.ts +5 -0
  270. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextBackgroundColorAction.js +29 -0
  271. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextColorAction.d.ts +14 -0
  272. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextColorAction.js +22 -0
  273. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextTransformAction.d.ts +5 -0
  274. package/es/components/organism/TextEditor/ui/Toolbar/actions/TextTransformAction.js +36 -0
  275. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnderlineAction.d.ts +5 -0
  276. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnderlineAction.js +18 -0
  277. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnsetLink.d.ts +7 -0
  278. package/es/components/organism/TextEditor/ui/Toolbar/actions/UnsetLink.js +18 -0
  279. package/es/components/organism/TextEditor/ui/Toolbar/actions/index.d.ts +24 -0
  280. package/es/components/organism/TextEditor/ui/Toolbar/actions/index.js +24 -0
  281. package/es/components/organism/TextEditor/ui/Toolbar/index.d.ts +2 -0
  282. package/es/components/organism/TextEditor/ui/Toolbar/index.js +2 -0
  283. package/es/components/organism/TextEditor/utils/documentState.d.ts +73 -0
  284. package/es/components/organism/TextEditor/utils/documentState.js +149 -0
  285. package/es/components/organism/TextEditor/utils/font.d.ts +74 -0
  286. package/es/components/organism/TextEditor/utils/font.js +147 -0
  287. package/es/components/organism/TextEditor/utils/htmlProcessing.d.ts +87 -0
  288. package/es/components/organism/TextEditor/utils/htmlProcessing.js +460 -0
  289. package/es/components/organism/TextEditor/utils/indent.d.ts +11 -0
  290. package/es/components/organism/TextEditor/utils/indent.js +56 -0
  291. package/es/components/organism/TextEditor/utils/index.d.ts +8 -0
  292. package/es/components/organism/TextEditor/utils/index.js +16 -0
  293. package/es/components/organism/TextEditor/utils/link.d.ts +116 -0
  294. package/es/components/organism/TextEditor/utils/link.js +304 -0
  295. package/es/components/organism/TextEditor/utils/menu.d.ts +134 -0
  296. package/es/components/organism/TextEditor/utils/menu.js +321 -0
  297. package/es/components/organism/TextEditor/utils/selection.d.ts +25 -0
  298. package/es/components/organism/TextEditor/utils/selection.js +58 -0
  299. package/es/components/organism/TextEditor/utils/shared.d.ts +13 -0
  300. package/es/components/organism/TextEditor/utils/shared.js +52 -0
  301. package/es/components/organism/TextEditor/utils/smartTag.d.ts +49 -0
  302. package/es/components/organism/TextEditor/utils/smartTag.js +90 -0
  303. package/es/components/organism/TextEditor/utils/style.d.ts +78 -0
  304. package/es/components/organism/TextEditor/utils/style.js +193 -0
  305. package/es/components/organism/index.d.ts +1 -0
  306. package/es/components/organism/index.js +1 -0
  307. package/es/components/organism/index.scss +1 -0
  308. package/es/constants/index.d.ts +1 -0
  309. package/es/constants/index.js +1 -0
  310. package/es/constants/web.d.ts +8 -0
  311. package/es/constants/web.js +57 -0
  312. package/es/hooks/index.d.ts +4 -0
  313. package/es/hooks/index.js +4 -0
  314. package/es/hooks/useBroadcastedLocalStorage.d.ts +5 -0
  315. package/es/hooks/useBroadcastedLocalStorage.js +71 -0
  316. package/es/hooks/useElementSize.d.ts +7 -0
  317. package/es/hooks/useElementSize.js +56 -0
  318. package/es/hooks/useEyedropper/attach.d.ts +4 -0
  319. package/es/hooks/useEyedropper/attach.js +9 -0
  320. package/es/hooks/useEyedropper/eyedropper.d.ts +69 -0
  321. package/es/hooks/useEyedropper/eyedropper.js +205 -0
  322. package/es/hooks/useEyedropper/index.d.ts +2 -0
  323. package/es/hooks/useEyedropper/index.js +7 -0
  324. package/es/hooks/useEyedropper/support.d.ts +1 -0
  325. package/es/hooks/useEyedropper/support.js +3 -0
  326. package/es/hooks/useEyedropper/types.d.ts +9 -0
  327. package/es/hooks/useEyedropper/types.js +1 -0
  328. package/es/hooks/useEyedropper/useEyedropper.d.ts +8 -0
  329. package/es/hooks/useEyedropper/useEyedropper.js +50 -0
  330. package/es/hooks/useEyedropper/utils.d.ts +11 -0
  331. package/es/hooks/useEyedropper/utils.js +17 -0
  332. package/es/hooks/useIsMounted.d.ts +1 -0
  333. package/es/hooks/useIsMounted.js +11 -0
  334. package/es/index.d.ts +1 -1
  335. package/es/index.js +1 -1
  336. package/es/locales/i18n.d.ts +1 -1
  337. package/es/types/index.d.ts +9 -0
  338. package/es/utils/common.d.ts +15 -9
  339. package/es/utils/common.js +62 -24
  340. package/es/utils/index.d.ts +1 -0
  341. package/es/utils/index.js +1 -0
  342. package/es/utils/web.d.ts +80 -0
  343. package/es/utils/web.js +226 -0
  344. package/package.json +26 -17
@@ -1,308 +1,68 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef, useEffect, useImperativeHandle, useMemo, useState, useCallback, useRef, memo, } from 'react';
2
+ import { forwardRef, useImperativeHandle, useRef, memo } from 'react';
3
3
  import { StyledAutoSizer, VirtualizedMenuContainer } from '../../styled';
4
4
  import { INLINE_INDENT, INLINE_PADDING, ITEM_SIZE, ITEM_SPACING } from '../../config';
5
- import { CLS, serializeItems, getItemSize } from '../../utils';
5
+ import { CLS, getItemSize } from '../../utils';
6
6
  import { Item } from '../Item';
7
- import { useDeepCompareEffect } from '@antscorp/antsomi-ui/es/hooks';
8
7
  import clsx from 'clsx';
9
- import { findNodes, getChildrenRecursively, getPathToNode, } from '@antscorp/antsomi-ui/es/utils/tree';
8
+ import { useTreeState } from './hooks/useTreeState';
9
+ import { useVisibleItems } from './hooks/useVisibleItems';
10
+ import { useFocusManagement } from './hooks/useFocusManagement';
11
+ import { useKeyboardNavigation } from './hooks/useKeyboardNavigation';
12
+ import { useItemInteraction } from './hooks/useItemInteraction';
10
13
  const innerElementType = forwardRef(({ style, ...rest }, ref) => (_jsx("ul", { role: "tree", "aria-label": "Virtualized Menu", ref: ref, style: style, ...rest })));
11
- /**
12
- * Optimized function to compute visible items using breadth-first traversal
13
- * instead of filtering all items
14
- */
15
- const computeVisibleItemsOptimized = (normalizeTreeItems, rootItemIds, expandedKeys) => {
16
- const visibleItems = [];
17
- const queue = Array.from(rootItemIds);
18
- // Process queue in breadth-first manner
19
- let index = 0;
20
- while (index < queue.length) {
21
- const itemId = queue[index++];
22
- const item = normalizeTreeItems.get(itemId);
23
- if (!item)
24
- continue;
25
- visibleItems.push(item);
26
- // Add children to queue only if this item is expanded
27
- if (expandedKeys.has(item.id) && item.childIds.length > 0) {
28
- queue.push(...item.childIds);
29
- }
30
- }
31
- return visibleItems;
32
- };
33
- /**
34
- * Alternative: Path-based optimization with memoization
35
- * Caches path calculations to avoid redundant work
36
- */
37
- const computeVisibleItemsWithPathCache = (normalizeTreeItems, expandedKeys, pathCache) => {
38
- const visibleItems = [];
39
- for (const item of normalizeTreeItems.values()) {
40
- const isRootItem = item.level === 0;
41
- if (isRootItem) {
42
- visibleItems.push(item);
43
- continue;
44
- }
45
- if (!item.parentId)
46
- continue;
47
- // Use cached path or compute and cache
48
- let pathToParent = pathCache.get(item.parentId);
49
- if (!pathToParent) {
50
- pathToParent = getPathToNode(item.parentId, normalizeTreeItems);
51
- pathCache.set(item.parentId, pathToParent);
52
- }
53
- // Check if all parents are expanded
54
- const allParentExpanded = pathToParent.every(parent => expandedKeys.has(parent.id));
55
- if (allParentExpanded) {
56
- visibleItems.push(item);
57
- }
58
- }
59
- return visibleItems;
60
- };
61
- /**
62
- * Level-based optimization: Process items level by level
63
- * More efficient for deep trees with many collapsed branches
64
- */
65
- const computeVisibleItemsByLevel = (normalizeTreeItems, rootItemIds, expandedKeys) => {
66
- const visibleItems = [];
67
- const expandedParents = new Set();
68
- // Add root items and track expanded ones
69
- for (const rootId of rootItemIds) {
70
- const rootItem = normalizeTreeItems.get(rootId);
71
- if (rootItem) {
72
- visibleItems.push(rootItem);
73
- if (expandedKeys.has(rootId)) {
74
- expandedParents.add(rootId);
75
- }
76
- }
77
- }
78
- // Process each level
79
- let currentLevelParents = expandedParents;
80
- let currentLevel = 1;
81
- while (currentLevelParents.size > 0) {
82
- const nextLevelParents = new Set();
83
- // Process all items at current level
84
- for (const parentId of currentLevelParents) {
85
- const parent = normalizeTreeItems.get(parentId);
86
- if (!parent)
87
- continue;
88
- // Add all children of this expanded parent
89
- for (const childId of parent.childIds) {
90
- const child = normalizeTreeItems.get(childId);
91
- if (child && child.level === currentLevel) {
92
- visibleItems.push(child);
93
- // Track if this child is expanded for next level
94
- if (expandedKeys.has(childId)) {
95
- nextLevelParents.add(childId);
96
- }
97
- }
98
- }
99
- }
100
- currentLevelParents = nextLevelParents;
101
- currentLevel++;
102
- }
103
- return visibleItems;
104
- };
105
14
  const MenuInlineInner = forwardRef((props, ref) => {
106
- const { items: itemsProp = [], expanded: expandedProp = [], selected: selectedProp = [], inlineIndent = INLINE_INDENT, inlinePadding = INLINE_PADDING, itemSize = ITEM_SIZE, itemSpacing = ITEM_SPACING, selectable = false, action, className, onClick, } = props;
107
- const [focusId, setFocusId] = useState(null);
108
- const [expandedKeys, setExpandedKeys] = useState(new Set());
109
- const [selectedKeys, setSelectedKeys] = useState(new Set());
15
+ const { items: itemsProp = [], expanded: expandedProp = [], selected: selectedProp = [], focusedKey, inlineIndent = INLINE_INDENT, inlinePadding = INLINE_PADDING, itemSize = ITEM_SIZE, itemSpacing = ITEM_SPACING, selectable = false, action, className, onClick, } = props;
16
+ // Refs for list and items
110
17
  const listRef = useRef(null);
111
18
  const itemRefs = useRef(new Map());
112
- const [{ items: normalizeTreeItems, rootItemIds }, setTreeState] = useState({
113
- items: new Map(),
114
- rootItemIds: new Set(),
19
+ const isMouseDownRef = useRef(false);
20
+ // Tree state management
21
+ const { normalizeTreeItems, rootItemIds, expandedKeys, selectedKeys, handleExpandItems, handleCollapseItems, handleToggleExpandItem, handleSelectItem, expandAll, } = useTreeState({
22
+ items: itemsProp,
23
+ expanded: expandedProp,
24
+ selected: selectedProp,
25
+ selectable,
115
26
  });
116
- // Cache for path calculations to avoid redundant work
117
- const pathCache = useMemo(() => new Map(), []);
118
- const rootNodes = useMemo(() => findNodes(node => rootItemIds.has(node.id), normalizeTreeItems), [normalizeTreeItems, rootItemIds]);
119
- useDeepCompareEffect(() => {
120
- setSelectedKeys(new Set(selectedProp));
121
- }, [selectedProp]);
122
- useDeepCompareEffect(() => {
123
- setExpandedKeys(new Set(expandedProp));
124
- }, [expandedProp]);
125
- useEffect(() => {
126
- setTreeState(serializeItems({
127
- items: itemsProp,
128
- }));
129
- }, [itemsProp]);
130
- // Clear path cache when tree structure changes
131
- useEffect(() => {
132
- pathCache.clear();
133
- }, [normalizeTreeItems, pathCache]);
134
- // Optimized visible items calculation
135
- const visibleItems = useMemo(() => {
136
- if (normalizeTreeItems.size === 0)
137
- return [];
138
- // Choose optimization strategy based on tree characteristics
139
- const treeDepth = Math.max(...Array.from(normalizeTreeItems.values()).map(item => item.level));
140
- const totalItems = normalizeTreeItems.size;
141
- const expandedCount = expandedKeys.size;
142
- // Strategy selection heuristics:
143
- // - For shallow trees with many expanded items: use breadth-first
144
- // - For deep trees with few expanded items: use level-based
145
- // - For medium trees: use path-cache optimization
146
- if (treeDepth <= 3 && expandedCount > totalItems * 0.3) {
147
- // Shallow tree with many expanded items
148
- return computeVisibleItemsOptimized(normalizeTreeItems, rootItemIds, expandedKeys);
149
- }
150
- if (treeDepth > 5 && expandedCount < totalItems * 0.2) {
151
- // Deep tree with few expanded items
152
- return computeVisibleItemsByLevel(normalizeTreeItems, rootItemIds, expandedKeys);
153
- }
154
- // Medium complexity - use cached path approach
155
- return computeVisibleItemsWithPathCache(normalizeTreeItems, expandedKeys, pathCache);
156
- }, [expandedKeys, normalizeTreeItems, rootItemIds, pathCache]);
157
- const handleCollapseItems = useCallback((items) => {
158
- setExpandedKeys(prev => {
159
- const newOpenKeys = new Set(prev);
160
- items.forEach(({ data }) => {
161
- if (prev.has(data.key)) {
162
- newOpenKeys.delete(data.key);
163
- }
164
- });
165
- return newOpenKeys;
166
- });
167
- }, []);
168
- useEffect(() => {
169
- if (focusId && listRef.current) {
170
- const index = visibleItems.findIndex(item => item.id === focusId);
171
- if (index !== -1) {
172
- listRef.current.scrollToItem(index, 'auto');
173
- }
174
- }
175
- }, [focusId, visibleItems]);
176
- const handleExpandItems = useCallback((items, deep = 0) => {
177
- setExpandedKeys(prev => {
178
- const updatedExpandedKeys = new Set(prev);
179
- items.forEach(item => {
180
- const normalizeItem = normalizeTreeItems.get(item.data.key);
181
- if (normalizeItem) {
182
- updatedExpandedKeys.add(normalizeItem.id);
183
- if (deep > 0) {
184
- getChildrenRecursively(normalizeItem.id, normalizeTreeItems, normalizeItem.level + deep).forEach(v => updatedExpandedKeys.add(v.id));
185
- }
186
- }
187
- });
188
- return updatedExpandedKeys;
189
- });
190
- }, [normalizeTreeItems]);
191
- useImperativeHandle(ref, () => ({
192
- expandAll: () => {
193
- handleExpandItems(rootNodes, Infinity);
194
- },
195
- }));
196
- const handleSelectItem = useCallback((item) => {
197
- const { key } = item.data;
198
- if (!selectable || selectedKeys.has(key))
199
- return;
200
- setSelectedKeys(new Set([key]));
201
- }, [selectable, selectedKeys]);
202
- const handleToggleExpandItem = useCallback((item) => {
203
- const { key } = item.data;
204
- const isExpanded = expandedKeys.has(key);
205
- if (isExpanded) {
206
- handleCollapseItems([item]);
207
- }
208
- else {
209
- handleExpandItems([item]);
210
- }
211
- }, [expandedKeys, handleCollapseItems, handleExpandItems]);
212
- const handleClickItem = useCallback((args) => {
213
- const { item, elKey, domEvent } = args;
214
- const node = normalizeTreeItems.get(item.id);
215
- if (!node)
216
- return;
217
- const hasChilren = node.childIds.length > 0;
218
- handleSelectItem(node);
219
- if (hasChilren) {
220
- handleToggleExpandItem(node);
221
- }
222
- setFocusId(node.id);
223
- onClick?.({ item: node.data, elKey, domEvent });
224
- }, [normalizeTreeItems, handleSelectItem, handleToggleExpandItem, onClick]);
225
- const handleKeyDown = useCallback((e) => {
226
- if (visibleItems.length === 0)
227
- return;
228
- e.preventDefault();
229
- const currentFocusIndex = visibleItems.findIndex(item => item.id === focusId);
230
- if (currentFocusIndex === -1) {
231
- setFocusId(visibleItems[0]?.id ?? null);
232
- return;
233
- }
234
- const currentFocusItem = visibleItems[currentFocusIndex];
235
- switch (e.key) {
236
- case 'ArrowDown': {
237
- const nextFocusIndex = Math.min(visibleItems.length - 1, currentFocusIndex + 1);
238
- setFocusId(visibleItems[nextFocusIndex].id);
239
- break;
240
- }
241
- case 'ArrowUp': {
242
- const nextFocusIndex = Math.max(0, currentFocusIndex - 1);
243
- setFocusId(visibleItems[nextFocusIndex].id);
244
- break;
245
- }
246
- case 'ArrowRight': {
247
- if (currentFocusItem.childIds.length > 0 && !expandedKeys.has(currentFocusItem.id)) {
248
- handleExpandItems([currentFocusItem]);
249
- }
250
- break;
251
- }
252
- case 'ArrowLeft': {
253
- if (currentFocusItem.childIds.length > 0 && expandedKeys.has(currentFocusItem.id)) {
254
- handleCollapseItems([currentFocusItem]);
255
- }
256
- else if (currentFocusItem?.parentId) {
257
- setFocusId(currentFocusItem.parentId);
258
- }
259
- break;
260
- }
261
- case 'Home': {
262
- setFocusId(visibleItems[0].id);
263
- break;
264
- }
265
- case 'End': {
266
- setFocusId(visibleItems[visibleItems.length - 1].id);
267
- break;
268
- }
269
- case 'Enter': {
270
- if (currentFocusItem) {
271
- handleSelectItem(currentFocusItem);
272
- if (currentFocusItem.childIds.length > 0) {
273
- handleToggleExpandItem(currentFocusItem);
274
- }
275
- onClick?.({
276
- item: currentFocusItem.data,
277
- elKey: 'item',
278
- });
279
- }
280
- break;
281
- }
282
- default:
283
- break;
284
- }
285
- }, [
27
+ // Visible items computation
28
+ const visibleItems = useVisibleItems(normalizeTreeItems, rootItemIds, expandedKeys);
29
+ // Focus management
30
+ const { focusId, setFocusId, findNextFocusableItem, findFirstFocusableItem, findLastFocusableItem, handleFocus, } = useFocusManagement({
31
+ visibleItems,
32
+ focusedKey,
33
+ listRef,
34
+ itemRefs,
35
+ isMouseDownRef,
36
+ });
37
+ // Item interaction
38
+ const { handleClickItem, handleMouseDown } = useItemInteraction({
39
+ normalizeTreeItems,
40
+ handleSelectItem,
41
+ handleToggleExpandItem,
42
+ setFocusId,
43
+ onClick,
44
+ isMouseDownRef,
45
+ });
46
+ // Keyboard navigation
47
+ const { handleKeyDown } = useKeyboardNavigation({
286
48
  visibleItems,
287
49
  focusId,
288
50
  expandedKeys,
289
- onClick,
51
+ normalizeTreeItems,
52
+ setFocusId,
290
53
  handleExpandItems,
291
54
  handleCollapseItems,
292
55
  handleSelectItem,
293
56
  handleToggleExpandItem,
294
- ]);
295
- const handleFocus = (e) => {
296
- let isClickFont = false;
297
- for (const itemEl of itemRefs.current.values()) {
298
- if (isClickFont)
299
- break;
300
- isClickFont = itemEl.isSameNode(e.target) || itemEl.contains(e.target);
301
- }
302
- if (!isClickFont && !focusId && visibleItems.length > 0) {
303
- setFocusId(visibleItems.at(0)?.id || null);
304
- }
305
- };
57
+ findNextFocusableItem,
58
+ findFirstFocusableItem,
59
+ findLastFocusableItem,
60
+ onClick,
61
+ });
62
+ // Expose expandAll method via ref
63
+ useImperativeHandle(ref, () => ({
64
+ expandAll,
65
+ }));
306
66
  const itemData = {
307
67
  itemSpacing,
308
68
  inlineIndent,
@@ -321,6 +81,6 @@ const MenuInlineInner = forwardRef((props, ref) => {
321
81
  })),
322
82
  onClick: handleClickItem,
323
83
  };
324
- return (_jsx(StyledAutoSizer, { className: clsx(CLS.Root.default, className), tabIndex: 0, onFocus: handleFocus, onKeyDown: handleKeyDown, children: autoSize => (_jsx(VirtualizedMenuContainer, { ref: listRef, className: clsx(CLS.MenuInline.default), itemSize: getItemSize(itemSize, itemSpacing), itemCount: visibleItems.length, height: autoSize.height, width: autoSize.width, innerElementType: innerElementType, itemData: itemData, useIsScrolling: true, children: Item })) }));
84
+ return (_jsx(StyledAutoSizer, { className: clsx(CLS.Root.default, className), tabIndex: 0, onFocus: handleFocus, onKeyDown: handleKeyDown, onMouseDown: handleMouseDown, children: autoSize => (_jsx(VirtualizedMenuContainer, { ref: listRef, className: clsx(CLS.MenuInline.default), itemSize: getItemSize(itemSize, itemSpacing), itemCount: visibleItems.length, height: autoSize.height, width: autoSize.width, innerElementType: innerElementType, itemData: itemData, useIsScrolling: true, children: Item })) }));
325
85
  });
326
86
  export const MenuInline = memo(MenuInlineInner);
@@ -0,0 +1,9 @@
1
+ export { useTreeState } from './useTreeState';
2
+ export type { UseTreeStateReturn, UseTreeStateProps } from './useTreeState';
3
+ export { useVisibleItems } from './useVisibleItems';
4
+ export { useFocusManagement } from './useFocusManagement';
5
+ export type { UseFocusManagementReturn, UseFocusManagementProps } from './useFocusManagement';
6
+ export { useKeyboardNavigation } from './useKeyboardNavigation';
7
+ export type { UseKeyboardNavigationReturn, UseKeyboardNavigationProps, } from './useKeyboardNavigation';
8
+ export { useItemInteraction } from './useItemInteraction';
9
+ export type { UseItemInteractionReturn, UseItemInteractionProps } from './useItemInteraction';
@@ -0,0 +1,5 @@
1
+ export { useTreeState } from './useTreeState';
2
+ export { useVisibleItems } from './useVisibleItems';
3
+ export { useFocusManagement } from './useFocusManagement';
4
+ export { useKeyboardNavigation } from './useKeyboardNavigation';
5
+ export { useItemInteraction } from './useItemInteraction';
@@ -0,0 +1,23 @@
1
+ /// <reference types="react" />
2
+ import { VariableSizeList } from 'react-window';
3
+ import { NormalizedNode } from '@antscorp/antsomi-ui/es/utils/tree';
4
+ import { ItemType } from '../../../types';
5
+ export interface UseFocusManagementReturn {
6
+ focusId: string | null;
7
+ setFocusId: (id: string | null) => void;
8
+ findNextFocusableItem: (startIndex: number, direction: 'next' | 'prev') => number;
9
+ findFirstFocusableItem: () => number;
10
+ findLastFocusableItem: () => number;
11
+ handleFocus: (e: React.FocusEvent) => void;
12
+ }
13
+ export interface UseFocusManagementProps {
14
+ visibleItems: NormalizedNode<ItemType>[];
15
+ focusedKey?: string;
16
+ listRef: React.RefObject<VariableSizeList | null>;
17
+ itemRefs: React.RefObject<Map<string, HTMLLIElement>>;
18
+ isMouseDownRef: React.MutableRefObject<boolean>;
19
+ }
20
+ /**
21
+ * Custom hook to manage focus state and navigation for tree items
22
+ */
23
+ export declare const useFocusManagement: (props: UseFocusManagementProps) => UseFocusManagementReturn;
@@ -0,0 +1,81 @@
1
+ import { useState, useCallback, useEffect } from 'react';
2
+ /**
3
+ * Custom hook to manage focus state and navigation for tree items
4
+ */
5
+ export const useFocusManagement = (props) => {
6
+ const { visibleItems, focusedKey, listRef, itemRefs, isMouseDownRef } = props;
7
+ const [focusId, setFocusId] = useState(null);
8
+ // Sync external focusedKey prop with internal focusId state for auto-scrolling
9
+ useEffect(() => {
10
+ if (focusedKey !== undefined) {
11
+ setFocusId(focusedKey);
12
+ }
13
+ }, [focusedKey]);
14
+ // Auto-scroll to focused item
15
+ useEffect(() => {
16
+ if (focusId && listRef.current) {
17
+ const index = visibleItems.findIndex(item => item.id === focusId);
18
+ if (index !== -1) {
19
+ listRef.current.scrollToItem(index, 'auto');
20
+ }
21
+ }
22
+ }, [focusId, visibleItems, listRef]);
23
+ // Helper function to find next focusable item (skip displayOnly items)
24
+ const findNextFocusableItem = useCallback((startIndex, direction) => {
25
+ const increment = direction === 'next' ? 1 : -1;
26
+ let index = startIndex + increment;
27
+ while (index >= 0 && index < visibleItems.length) {
28
+ const item = visibleItems[index];
29
+ if (!item.data.displayOnly) {
30
+ return index;
31
+ }
32
+ index += increment;
33
+ }
34
+ return startIndex;
35
+ }, [visibleItems]);
36
+ // Find first focusable item
37
+ const findFirstFocusableItem = useCallback(() => {
38
+ for (let i = 0; i < visibleItems.length; i++) {
39
+ if (!visibleItems[i].data.displayOnly) {
40
+ return i;
41
+ }
42
+ }
43
+ return 0;
44
+ }, [visibleItems]);
45
+ // Find last focusable item
46
+ const findLastFocusableItem = useCallback(() => {
47
+ for (let i = visibleItems.length - 1; i >= 0; i--) {
48
+ if (!visibleItems[i].data.displayOnly) {
49
+ return i;
50
+ }
51
+ }
52
+ return visibleItems.length - 1;
53
+ }, [visibleItems]);
54
+ // Handle focus event with auto-focusing logic
55
+ const handleFocus = useCallback((e) => {
56
+ // Skip auto-focusing if user is clicking on menu items
57
+ if (isMouseDownRef.current) {
58
+ return;
59
+ }
60
+ let isClickFont = false;
61
+ if (itemRefs.current) {
62
+ for (const itemEl of itemRefs.current.values()) {
63
+ if (isClickFont)
64
+ break;
65
+ isClickFont = itemEl.isSameNode(e.target) || itemEl.contains(e.target);
66
+ }
67
+ }
68
+ if (!isClickFont && !focusId && visibleItems.length > 0) {
69
+ const firstFocusableIndex = findFirstFocusableItem();
70
+ setFocusId(visibleItems[firstFocusableIndex]?.id || null);
71
+ }
72
+ }, [isMouseDownRef, itemRefs, focusId, visibleItems, findFirstFocusableItem]);
73
+ return {
74
+ focusId,
75
+ setFocusId,
76
+ findNextFocusableItem,
77
+ findFirstFocusableItem,
78
+ findLastFocusableItem,
79
+ handleFocus,
80
+ };
81
+ };
@@ -0,0 +1,24 @@
1
+ /// <reference types="react" />
2
+ import { NormalizedNode } from '@antscorp/antsomi-ui/es/utils/tree';
3
+ import { ItemType, MenuInlineProps } from '../../../types';
4
+ export interface UseItemInteractionReturn {
5
+ handleClickItem: (args: {
6
+ item: NormalizedNode<ItemType>;
7
+ elKey: 'item' | 'item-expand-el';
8
+ domEvent: React.MouseEvent;
9
+ }) => void;
10
+ handleMouseDown: () => void;
11
+ }
12
+ export interface UseItemInteractionProps {
13
+ normalizeTreeItems: Map<string, NormalizedNode<ItemType>>;
14
+ handleSelectItem: (item: NormalizedNode<ItemType>) => void;
15
+ handleToggleExpandItem: (item: NormalizedNode<ItemType>) => void;
16
+ setFocusId: (id: string) => void;
17
+ onClick?: MenuInlineProps['onClick'];
18
+ isMouseDownRef: React.MutableRefObject<boolean>;
19
+ }
20
+ /**
21
+ * Custom hook to handle user interactions with menu items
22
+ * Manages click events and mouse down state
23
+ */
24
+ export declare const useItemInteraction: (props: UseItemInteractionProps) => UseItemInteractionReturn;
@@ -0,0 +1,32 @@
1
+ import { useCallback } from 'react';
2
+ /**
3
+ * Custom hook to handle user interactions with menu items
4
+ * Manages click events and mouse down state
5
+ */
6
+ export const useItemInteraction = (props) => {
7
+ const { normalizeTreeItems, handleSelectItem, handleToggleExpandItem, setFocusId, onClick, isMouseDownRef, } = props;
8
+ const handleClickItem = useCallback((args) => {
9
+ const { item, elKey, domEvent } = args;
10
+ const node = normalizeTreeItems.get(item.id);
11
+ if (!node || node.data.displayOnly)
12
+ return;
13
+ const hasChilren = node.childIds.length > 0;
14
+ handleSelectItem(node);
15
+ if (hasChilren) {
16
+ handleToggleExpandItem(node);
17
+ }
18
+ setFocusId(node.id);
19
+ onClick?.({ item: node.data, elKey, domEvent });
20
+ }, [normalizeTreeItems, handleSelectItem, handleToggleExpandItem, setFocusId, onClick]);
21
+ const handleMouseDown = useCallback(() => {
22
+ isMouseDownRef.current = true;
23
+ // Reset flag after a short delay to handle the focus event
24
+ setTimeout(() => {
25
+ isMouseDownRef.current = false;
26
+ }, 0);
27
+ }, [isMouseDownRef]);
28
+ return {
29
+ handleClickItem,
30
+ handleMouseDown,
31
+ };
32
+ };
@@ -0,0 +1,26 @@
1
+ /// <reference types="react" />
2
+ import { NormalizedNode } from '@antscorp/antsomi-ui/es/utils/tree';
3
+ import { ItemType, MenuInlineProps } from '../../../types';
4
+ export interface UseKeyboardNavigationReturn {
5
+ handleKeyDown: (e: React.KeyboardEvent) => void;
6
+ }
7
+ export interface UseKeyboardNavigationProps {
8
+ visibleItems: NormalizedNode<ItemType>[];
9
+ focusId: string | null;
10
+ expandedKeys: Set<string>;
11
+ normalizeTreeItems: Map<string, NormalizedNode<ItemType>>;
12
+ setFocusId: (id: string | null) => void;
13
+ handleExpandItems: (items: NormalizedNode<ItemType>[]) => void;
14
+ handleCollapseItems: (items: NormalizedNode<ItemType>[]) => void;
15
+ handleSelectItem: (item: NormalizedNode<ItemType>) => void;
16
+ handleToggleExpandItem: (item: NormalizedNode<ItemType>) => void;
17
+ findNextFocusableItem: (startIndex: number, direction: 'next' | 'prev') => number;
18
+ findFirstFocusableItem: () => number;
19
+ findLastFocusableItem: () => number;
20
+ onClick?: MenuInlineProps['onClick'];
21
+ }
22
+ /**
23
+ * Custom hook to handle keyboard navigation for tree menu
24
+ * Implements ARIA-compliant keyboard interaction patterns
25
+ */
26
+ export declare const useKeyboardNavigation: (props: UseKeyboardNavigationProps) => UseKeyboardNavigationReturn;
@@ -0,0 +1,93 @@
1
+ import { useCallback } from 'react';
2
+ /**
3
+ * Custom hook to handle keyboard navigation for tree menu
4
+ * Implements ARIA-compliant keyboard interaction patterns
5
+ */
6
+ export const useKeyboardNavigation = (props) => {
7
+ const { visibleItems, focusId, expandedKeys, normalizeTreeItems, setFocusId, handleExpandItems, handleCollapseItems, handleSelectItem, handleToggleExpandItem, findNextFocusableItem, findFirstFocusableItem, findLastFocusableItem, onClick, } = props;
8
+ const handleKeyDown = useCallback((e) => {
9
+ if (visibleItems.length === 0)
10
+ return;
11
+ e.preventDefault();
12
+ const currentFocusIndex = visibleItems.findIndex(item => item.id === focusId);
13
+ if (currentFocusIndex === -1) {
14
+ const firstFocusableIndex = findFirstFocusableItem();
15
+ setFocusId(visibleItems[firstFocusableIndex]?.id ?? null);
16
+ return;
17
+ }
18
+ const currentFocusItem = visibleItems[currentFocusIndex];
19
+ switch (e.key) {
20
+ case 'ArrowDown': {
21
+ const nextFocusIndex = findNextFocusableItem(currentFocusIndex, 'next');
22
+ setFocusId(visibleItems[nextFocusIndex].id);
23
+ break;
24
+ }
25
+ case 'ArrowUp': {
26
+ const nextFocusIndex = findNextFocusableItem(currentFocusIndex, 'prev');
27
+ setFocusId(visibleItems[nextFocusIndex].id);
28
+ break;
29
+ }
30
+ case 'ArrowRight': {
31
+ if (currentFocusItem.childIds.length > 0 && !expandedKeys.has(currentFocusItem.id)) {
32
+ handleExpandItems([currentFocusItem]);
33
+ }
34
+ break;
35
+ }
36
+ case 'ArrowLeft': {
37
+ if (currentFocusItem.childIds.length > 0 && expandedKeys.has(currentFocusItem.id)) {
38
+ handleCollapseItems([currentFocusItem]);
39
+ }
40
+ else if (currentFocusItem?.parentId) {
41
+ // Find parent and ensure it's focusable
42
+ const parentItem = normalizeTreeItems.get(currentFocusItem.parentId);
43
+ if (parentItem && !parentItem.data.displayOnly) {
44
+ setFocusId(currentFocusItem.parentId);
45
+ }
46
+ }
47
+ break;
48
+ }
49
+ case 'Home': {
50
+ const firstFocusableIndex = findFirstFocusableItem();
51
+ setFocusId(visibleItems[firstFocusableIndex].id);
52
+ break;
53
+ }
54
+ case 'End': {
55
+ const lastFocusableIndex = findLastFocusableItem();
56
+ setFocusId(visibleItems[lastFocusableIndex].id);
57
+ break;
58
+ }
59
+ case 'Enter': {
60
+ if (currentFocusItem && !currentFocusItem.data.displayOnly) {
61
+ handleSelectItem(currentFocusItem);
62
+ if (currentFocusItem.childIds.length > 0) {
63
+ handleToggleExpandItem(currentFocusItem);
64
+ }
65
+ onClick?.({
66
+ item: currentFocusItem.data,
67
+ elKey: 'item',
68
+ });
69
+ }
70
+ break;
71
+ }
72
+ default:
73
+ break;
74
+ }
75
+ }, [
76
+ visibleItems,
77
+ focusId,
78
+ expandedKeys,
79
+ normalizeTreeItems,
80
+ setFocusId,
81
+ handleExpandItems,
82
+ handleCollapseItems,
83
+ handleSelectItem,
84
+ handleToggleExpandItem,
85
+ findNextFocusableItem,
86
+ findFirstFocusableItem,
87
+ findLastFocusableItem,
88
+ onClick,
89
+ ]);
90
+ return {
91
+ handleKeyDown,
92
+ };
93
+ };