@react-fabric/core 1.0.0-beta.5 → 1.0.0-beta.52

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 (419) hide show
  1. package/{src/components/actionLabel/ActionLabel.module.css → css/components/_actionLabel.css} +4 -4
  2. package/{src/overlays/alert/Alert.module.css → css/components/_alert.css} +3 -3
  3. package/{src/components/animations/Animations.module.css → css/components/_animations.css} +9 -9
  4. package/{src/components/avatar/Avatar.module.css → css/components/_avatar.css} +11 -11
  5. package/{src/components/badge/Badge.module.css → css/components/_badge.css} +19 -17
  6. package/{src/components/breadcrumbs/Breadcrumbs.module.css → css/components/_breadcrumbs.css} +49 -44
  7. package/{src/components/button/Button.module.css → css/components/_button.css} +69 -79
  8. package/{src/components/card/Card.module.css → css/components/_card.css} +50 -28
  9. package/{src/components/chip/Chip.module.css → css/components/_chip.css} +14 -10
  10. package/{src/components/collapsable/Collapsable.module.css → css/components/_collapsable.css} +3 -3
  11. package/css/components/_divider.css +38 -0
  12. package/{src/components/dropdown/Dropdown.module.css → css/components/_dropdown.css} +2 -2
  13. package/{src/overlays/flyout/Flyout.module.css → css/components/_flyout.css} +6 -6
  14. package/{src/components/icon/Icon.module.css → css/components/_icon.css} +8 -5
  15. package/{src/components/media/Media.module.css → css/components/_media.css} +17 -17
  16. package/{src/components/menu/Menu.module.css → css/components/_menu.css} +19 -20
  17. package/{src/overlays/message/Message.module.css → css/components/_message.css} +2 -2
  18. package/{src/components/meter/Meter.module.css → css/components/_meter.css} +10 -10
  19. package/{src/overlays/modal/Modal.module.css → css/components/_modal.css} +8 -8
  20. package/{src/components/panel/Panel.module.css → css/components/_panel.css} +17 -17
  21. package/{src/components/progress/Progress.module.css → css/components/_progress.css} +7 -10
  22. package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +73 -84
  23. package/{src/overlays/toast/Toast.module.css → css/components/_toast.css} +2 -2
  24. package/css/components/_tooltip.css +29 -0
  25. package/{src/core/content/Content.module.css → css/components/index.css} +25 -18
  26. package/{src/core/aside/Aside.module.css → css/core/_aside.css} +56 -42
  27. package/{src/core/section/Section.module.css → css/core/_content.css} +5 -3
  28. package/{src/core/boundary/ErrorBoundary.module.css → css/core/_errorboundary.css} +9 -9
  29. package/{src/core/headfoot/HeadFoot.module.css → css/core/_headfoot.css} +4 -10
  30. package/{src/core/page/Page.module.css → css/core/_page.css} +10 -14
  31. package/{src/core/responsive/Responsive.module.css → css/core/_responsive.css} +10 -10
  32. package/css/core/_section.css +28 -0
  33. package/{src/core/theme/Theme.module.css → css/core/_theme.css} +3 -3
  34. package/{src/typography/Typography.module.css → css/core/_typography.css} +14 -12
  35. package/{src/core/viewport/Viewport.module.css → css/core/_viewport.css} +7 -3
  36. package/css/core/index.css +33 -0
  37. package/css/reset/_gradients.css +8 -8
  38. package/css/reset/_reset.css +42 -224
  39. package/css/reset/_text.css +14 -29
  40. package/css/reset/_theme.css +331 -52
  41. package/css/reset/index.css +4 -4
  42. package/css/styles.css +7 -6
  43. package/css/theme/_colors.css +320 -0
  44. package/css/theme/_utilities.css +530 -0
  45. package/css/theme/index.css +45 -0
  46. package/dist/cjs/components/actionLabel/ActionLabel.js +26 -8
  47. package/dist/cjs/components/animations/Animations.js +118 -24
  48. package/dist/cjs/components/avatar/Avatar.js +43 -16
  49. package/dist/cjs/components/avatar/AvatarGroup.js +22 -4
  50. package/dist/cjs/components/badge/Badge.js +35 -6
  51. package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +39 -8
  52. package/dist/cjs/components/button/Button.js +42 -15
  53. package/dist/cjs/components/button/ButtonGroup.js +30 -3
  54. package/dist/cjs/components/button/ConfirmButton.js +32 -4
  55. package/dist/cjs/components/button/ToggleButtonGroup.js +41 -15
  56. package/dist/cjs/components/callout/Callout.js +44 -4
  57. package/dist/cjs/components/card/Card.js +48 -10
  58. package/dist/cjs/components/card/CardCover.js +36 -5
  59. package/dist/cjs/components/card/FlipContent.js +56 -0
  60. package/dist/cjs/components/chip/Chip.js +32 -7
  61. package/dist/cjs/components/collapsable/Collapsable.js +32 -6
  62. package/dist/cjs/components/divider/Divider.js +30 -7
  63. package/dist/cjs/components/dropdown/Dropdown.js +48 -9
  64. package/dist/cjs/components/dropdown/DropdownTool.js +4 -3
  65. package/dist/cjs/components/empty/EmptyContent.js +35 -5
  66. package/dist/cjs/components/icon/Icon.js +44 -16
  67. package/dist/cjs/components/media/Media.js +172 -75
  68. package/dist/cjs/components/menu/ContextMenu.js +49 -10
  69. package/dist/cjs/components/menu/Menu.js +74 -21
  70. package/dist/cjs/components/menu/MenuItem.js +51 -16
  71. package/dist/cjs/components/meter/Meter.js +26 -3
  72. package/dist/cjs/components/navigator/Navigator.js +48 -13
  73. package/dist/cjs/components/panel/Panel.js +47 -9
  74. package/dist/cjs/components/panel/PanelGroup.js +25 -2
  75. package/dist/cjs/components/panel/PanelStack.js +31 -0
  76. package/dist/cjs/components/progress/ProgressBar.js +31 -9
  77. package/dist/cjs/components/progress/ProgressCircle.js +29 -7
  78. package/dist/cjs/components/tabpanel/Tab.js +89 -38
  79. package/dist/cjs/components/tabpanel/TabPanel.js +53 -16
  80. package/dist/cjs/context/Global.js +28 -1
  81. package/dist/cjs/context/NotificationCenter.js +3 -3
  82. package/dist/cjs/core/aside/Aside.js +49 -11
  83. package/dist/cjs/core/boundary/ErrorBoundary.js +23 -8
  84. package/dist/cjs/core/boundary/ErrorIcon.js +1 -2
  85. package/dist/cjs/core/content/Content.js +15 -8
  86. package/dist/cjs/core/headfoot/HeadFoot.js +44 -20
  87. package/dist/cjs/core/page/Page.js +40 -29
  88. package/dist/cjs/core/responsive/Responsive.js +59 -6
  89. package/dist/cjs/core/section/Section.js +1 -2
  90. package/dist/cjs/core/theme/ThemeProvider.js +32 -10
  91. package/dist/cjs/core/viewport/Viewport.js +18 -2
  92. package/dist/cjs/hooks/useControlledValue.js +12 -0
  93. package/dist/cjs/hooks/useDebounce.js +14 -1
  94. package/dist/cjs/hooks/useEffectDebugger.js +54 -2
  95. package/dist/cjs/hooks/useIsDark.js +8 -0
  96. package/dist/cjs/hooks/useIsRtl.js +12 -0
  97. package/dist/cjs/hooks/useNavigator.js +6 -4
  98. package/dist/cjs/hooks/useOverlayService.js +24 -0
  99. package/dist/cjs/hooks/usePropToggle.js +16 -5
  100. package/dist/cjs/hooks/useResize.js +18 -0
  101. package/dist/cjs/hooks/useResizeObserver.js +20 -1
  102. package/dist/cjs/hooks/useStorage.js +39 -0
  103. package/dist/cjs/hotkeys/HotKeyLabel.js +1 -1
  104. package/dist/cjs/hotkeys/HotKeyWrapper.js +3 -1
  105. package/dist/cjs/index.js +8 -2
  106. package/dist/cjs/overlays/alert/Alert.js +20 -14
  107. package/dist/cjs/overlays/flyout/Flyout.js +49 -60
  108. package/dist/cjs/overlays/message/Message.js +6 -3
  109. package/dist/cjs/overlays/modal/Modal.js +16 -12
  110. package/dist/cjs/overlays/toast/Toast.js +17 -9
  111. package/dist/cjs/overlays/tooltip/Tooltip.js +24 -11
  112. package/dist/cjs/types/icons.js +10 -1
  113. package/dist/cjs/typography/Abbr.js +32 -6
  114. package/dist/cjs/typography/{Link.js → Anchor.js} +23 -5
  115. package/dist/cjs/typography/Mark.js +22 -4
  116. package/dist/cjs/typography/Text.js +30 -5
  117. package/dist/cjs/typography/Title.js +19 -4
  118. package/dist/cjs/utils/cloneElement.js +47 -0
  119. package/dist/cjs/utils/getColor.js +1 -18
  120. package/dist/esm/components/actionLabel/ActionLabel.js +26 -8
  121. package/dist/esm/components/animations/Animations.js +119 -25
  122. package/dist/esm/components/avatar/Avatar.js +44 -17
  123. package/dist/esm/components/avatar/AvatarGroup.js +22 -4
  124. package/dist/esm/components/badge/Badge.js +36 -7
  125. package/dist/esm/components/breadcrumbs/Breadcrumbs.js +39 -8
  126. package/dist/esm/components/button/Button.js +42 -15
  127. package/dist/esm/components/button/ButtonGroup.js +31 -4
  128. package/dist/esm/components/button/ConfirmButton.js +32 -4
  129. package/dist/esm/components/button/ToggleButtonGroup.js +42 -16
  130. package/dist/esm/components/callout/Callout.js +44 -4
  131. package/dist/esm/components/card/Card.js +49 -11
  132. package/dist/esm/components/card/CardCover.js +36 -5
  133. package/dist/esm/components/card/FlipContent.js +56 -0
  134. package/dist/esm/components/chip/Chip.js +33 -8
  135. package/dist/esm/components/collapsable/Collapsable.js +32 -6
  136. package/dist/esm/components/divider/Divider.js +31 -8
  137. package/dist/esm/components/dropdown/Dropdown.js +48 -9
  138. package/dist/esm/components/dropdown/DropdownTool.js +4 -3
  139. package/dist/esm/components/empty/EmptyContent.js +35 -5
  140. package/dist/esm/components/icon/Icon.js +44 -16
  141. package/dist/esm/components/media/Media.js +173 -76
  142. package/dist/esm/components/menu/ContextMenu.js +51 -12
  143. package/dist/esm/components/menu/Menu.js +76 -23
  144. package/dist/esm/components/menu/MenuItem.js +45 -10
  145. package/dist/esm/components/meter/Meter.js +26 -3
  146. package/dist/esm/components/navigator/Navigator.js +48 -13
  147. package/dist/esm/components/panel/Panel.js +47 -9
  148. package/dist/esm/components/panel/PanelGroup.js +25 -2
  149. package/dist/esm/components/panel/PanelStack.js +31 -0
  150. package/dist/esm/components/progress/ProgressBar.js +31 -9
  151. package/dist/esm/components/progress/ProgressCircle.js +29 -7
  152. package/dist/esm/components/tabpanel/Tab.js +90 -39
  153. package/dist/esm/components/tabpanel/TabPanel.js +53 -16
  154. package/dist/esm/context/Global.js +28 -1
  155. package/dist/esm/context/NotificationCenter.js +3 -3
  156. package/dist/esm/core/aside/Aside.js +49 -11
  157. package/dist/esm/core/boundary/ErrorBoundary.js +23 -8
  158. package/dist/esm/core/boundary/ErrorIcon.js +1 -2
  159. package/dist/esm/core/content/Content.js +15 -8
  160. package/dist/esm/core/headfoot/HeadFoot.js +44 -20
  161. package/dist/esm/core/page/Page.js +40 -29
  162. package/dist/esm/core/responsive/Responsive.js +59 -6
  163. package/dist/esm/core/section/Section.js +1 -2
  164. package/dist/esm/core/theme/ThemeProvider.js +32 -10
  165. package/dist/esm/core/viewport/Viewport.js +18 -2
  166. package/dist/esm/hooks/useControlledValue.js +12 -0
  167. package/dist/esm/hooks/useDebounce.js +14 -1
  168. package/dist/esm/hooks/useEffectDebugger.js +54 -2
  169. package/dist/esm/hooks/useIsDark.js +8 -0
  170. package/dist/esm/hooks/useIsRtl.js +12 -0
  171. package/dist/esm/hooks/useNavigator.js +7 -5
  172. package/dist/esm/hooks/useOverlayService.js +24 -0
  173. package/dist/esm/hooks/usePropToggle.js +16 -5
  174. package/dist/esm/hooks/useResize.js +18 -0
  175. package/dist/esm/hooks/useResizeObserver.js +20 -1
  176. package/dist/esm/hooks/useStorage.js +39 -0
  177. package/dist/esm/hotkeys/HotKeyLabel.js +1 -1
  178. package/dist/esm/hotkeys/HotKeyWrapper.js +3 -1
  179. package/dist/esm/index.js +4 -1
  180. package/dist/esm/overlays/alert/Alert.js +21 -15
  181. package/dist/esm/overlays/flyout/Flyout.js +52 -63
  182. package/dist/esm/overlays/message/Message.js +7 -4
  183. package/dist/esm/overlays/modal/Modal.js +17 -13
  184. package/dist/esm/overlays/toast/Toast.js +18 -10
  185. package/dist/esm/overlays/tooltip/Tooltip.js +24 -11
  186. package/dist/esm/types/icons.js +10 -1
  187. package/dist/esm/typography/Abbr.js +32 -6
  188. package/dist/esm/typography/{Link.js → Anchor.js} +24 -6
  189. package/dist/esm/typography/Mark.js +22 -4
  190. package/dist/esm/typography/Text.js +31 -6
  191. package/dist/esm/typography/Title.js +20 -5
  192. package/dist/esm/utils/cloneElement.js +47 -0
  193. package/dist/esm/utils/getColor.js +2 -16
  194. package/dist/types/components/actionLabel/ActionLabel.d.ts +23 -4
  195. package/dist/types/components/animations/Animations.d.ts +84 -5
  196. package/dist/types/components/avatar/Avatar.d.ts +29 -5
  197. package/dist/types/components/avatar/AvatarGroup.d.ts +19 -1
  198. package/dist/types/components/badge/Badge.d.ts +30 -1
  199. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +31 -2
  200. package/dist/types/components/button/Button.d.ts +29 -6
  201. package/dist/types/components/button/ButtonGroup.d.ts +28 -3
  202. package/dist/types/components/button/ConfirmButton.d.ts +28 -3
  203. package/dist/types/components/button/ToggleButtonGroup.d.ts +39 -11
  204. package/dist/types/components/callout/Callout.d.ts +29 -3
  205. package/dist/types/components/card/Card.d.ts +42 -4
  206. package/dist/types/components/card/CardCover.d.ts +25 -0
  207. package/dist/types/components/card/FlipContent.d.ts +28 -0
  208. package/dist/types/components/chip/Chip.d.ts +24 -4
  209. package/dist/types/components/collapsable/Collapsable.d.ts +33 -3
  210. package/dist/types/components/divider/Divider.d.ts +30 -7
  211. package/dist/types/components/dropdown/Dropdown.d.ts +40 -1
  212. package/dist/types/components/dropdown/DropdownTool.d.ts +27 -1
  213. package/dist/types/components/empty/EmptyContent.d.ts +32 -3
  214. package/dist/types/components/icon/Icon.d.ts +32 -6
  215. package/dist/types/components/index.d.ts +2 -1
  216. package/dist/types/components/media/Media.d.ts +56 -2
  217. package/dist/types/components/menu/ContextMenu.d.ts +21 -2
  218. package/dist/types/components/menu/Menu.d.ts +29 -0
  219. package/dist/types/components/menu/MenuItem.d.ts +22 -2
  220. package/dist/types/components/menu/types.d.ts +3 -2
  221. package/dist/types/components/meter/Meter.d.ts +24 -0
  222. package/dist/types/components/navigator/Navigator.d.ts +29 -4
  223. package/dist/types/components/panel/Panel.d.ts +37 -1
  224. package/dist/types/components/panel/PanelGroup.d.ts +24 -0
  225. package/dist/types/components/panel/PanelStack.d.ts +31 -0
  226. package/dist/types/components/progress/ProgressBar.d.ts +23 -3
  227. package/dist/types/components/progress/ProgressCircle.d.ts +22 -3
  228. package/dist/types/components/tabpanel/Tab.d.ts +36 -5
  229. package/dist/types/components/tabpanel/TabPanel.d.ts +43 -1
  230. package/dist/types/context/Global.d.ts +24 -1
  231. package/dist/types/core/aside/Aside.d.ts +38 -1
  232. package/dist/types/core/boundary/ErrorBoundary.d.ts +18 -2
  233. package/dist/types/core/content/Content.d.ts +9 -3
  234. package/dist/types/core/headfoot/HeadFoot.d.ts +41 -9
  235. package/dist/types/core/page/Page.d.ts +29 -4
  236. package/dist/types/core/responsive/Responsive.d.ts +58 -3
  237. package/dist/types/core/section/Section.d.ts +16 -1
  238. package/dist/types/core/theme/ThemeProvider.d.ts +25 -5
  239. package/dist/types/core/viewport/Viewport.d.ts +15 -1
  240. package/dist/types/hooks/useControlledValue.d.ts +13 -2
  241. package/dist/types/hooks/useDebounce.d.ts +12 -0
  242. package/dist/types/hooks/useEffectDebugger.d.ts +49 -0
  243. package/dist/types/hooks/useIsDark.d.ts +8 -0
  244. package/dist/types/hooks/useIsRtl.d.ts +12 -0
  245. package/dist/types/hooks/useNavigator.d.ts +18 -1
  246. package/dist/types/hooks/useOverlayService.d.ts +28 -9
  247. package/dist/types/hooks/usePropToggle.d.ts +16 -5
  248. package/dist/types/hooks/useResize.d.ts +19 -1
  249. package/dist/types/hooks/useResizeObserver.d.ts +20 -1
  250. package/dist/types/hooks/useStorage.d.ts +38 -0
  251. package/dist/types/index.d.ts +3 -0
  252. package/dist/types/overlays/alert/Alert.d.ts +2 -3
  253. package/dist/types/overlays/flyout/Flyout.d.ts +3 -2
  254. package/dist/types/overlays/message/Message.d.ts +2 -3
  255. package/dist/types/overlays/modal/Modal.d.ts +12 -3
  256. package/dist/types/overlays/toast/Toast.d.ts +2 -3
  257. package/dist/types/overlays/tooltip/Tooltip.d.ts +2 -2
  258. package/dist/types/types/icons.d.ts +10 -1
  259. package/dist/types/types/index.d.ts +26 -6
  260. package/dist/types/typography/Abbr.d.ts +34 -4
  261. package/dist/types/typography/Anchor.d.ts +42 -0
  262. package/dist/types/typography/Copy.d.ts +15 -0
  263. package/dist/types/typography/Mark.d.ts +22 -4
  264. package/dist/types/typography/Text.d.ts +27 -1
  265. package/dist/types/typography/Title.d.ts +16 -1
  266. package/dist/types/typography/index.d.ts +1 -1
  267. package/dist/types/utils/cloneElement.d.ts +2 -0
  268. package/dist/types/utils/getColor.d.ts +1 -4
  269. package/dist/types/utils/index.d.ts +1 -0
  270. package/package.json +11 -13
  271. package/src/components/actionLabel/ActionLabel.tsx +38 -11
  272. package/src/components/animations/Animations.tsx +118 -33
  273. package/src/components/avatar/Avatar.tsx +106 -91
  274. package/src/components/avatar/AvatarGroup.tsx +23 -5
  275. package/src/components/badge/Badge.tsx +41 -9
  276. package/src/components/breadcrumbs/Breadcrumbs.tsx +42 -9
  277. package/src/components/button/Button.tsx +50 -23
  278. package/src/components/button/ButtonGroup.tsx +33 -7
  279. package/src/components/button/ConfirmButton.tsx +41 -7
  280. package/src/components/button/ToggleButtonGroup.tsx +74 -47
  281. package/src/components/callout/Callout.tsx +55 -12
  282. package/src/components/card/Card.tsx +64 -15
  283. package/src/components/card/CardCover.tsx +36 -6
  284. package/src/components/card/FlipContent.tsx +90 -0
  285. package/src/components/chip/Chip.tsx +39 -13
  286. package/src/components/collapsable/Collapsable.tsx +38 -7
  287. package/src/components/divider/Divider.tsx +42 -16
  288. package/src/components/dropdown/Dropdown.tsx +46 -11
  289. package/src/components/dropdown/DropdownTool.tsx +30 -3
  290. package/src/components/empty/EmptyContent.tsx +47 -6
  291. package/src/components/icon/Icon.tsx +85 -68
  292. package/src/components/index.ts +2 -1
  293. package/src/components/media/Media.tsx +195 -106
  294. package/src/components/menu/ContextMenu.tsx +55 -11
  295. package/src/components/menu/Menu.tsx +85 -30
  296. package/src/components/menu/MenuItem.tsx +40 -9
  297. package/src/components/menu/types.ts +3 -2
  298. package/src/components/meter/Meter.tsx +26 -3
  299. package/src/components/navigator/Navigator.tsx +58 -7
  300. package/src/components/panel/Panel.tsx +47 -9
  301. package/src/components/panel/PanelGroup.tsx +25 -2
  302. package/src/components/panel/PanelStack.tsx +31 -0
  303. package/src/components/progress/ProgressBar.tsx +33 -14
  304. package/src/components/progress/ProgressCircle.tsx +29 -13
  305. package/src/components/tabpanel/Tab.tsx +112 -64
  306. package/src/components/tabpanel/TabPanel.tsx +67 -12
  307. package/src/context/Global.tsx +28 -1
  308. package/src/context/NotificationCenter.tsx +3 -3
  309. package/src/core/aside/Aside.tsx +50 -12
  310. package/src/core/boundary/ErrorBoundary.tsx +25 -8
  311. package/src/core/boundary/ErrorIcon.tsx +1 -2
  312. package/src/core/content/Content.tsx +23 -13
  313. package/src/core/headfoot/HeadFoot.tsx +42 -35
  314. package/src/core/page/Page.tsx +44 -6
  315. package/src/core/responsive/Responsive.tsx +66 -8
  316. package/src/core/section/Section.tsx +17 -3
  317. package/src/core/theme/ThemeProvider.tsx +35 -14
  318. package/src/core/viewport/Viewport.tsx +16 -3
  319. package/src/hooks/useControlledValue.tsx +12 -0
  320. package/src/hooks/useDebounce.ts +13 -1
  321. package/src/hooks/useEffectDebugger.ts +50 -2
  322. package/src/hooks/useIsDark.ts +8 -0
  323. package/src/hooks/useIsRtl.ts +12 -0
  324. package/src/hooks/useNavigator.tsx +28 -5
  325. package/src/hooks/useOverlayService.tsx +36 -6
  326. package/src/hooks/usePropToggle.ts +16 -5
  327. package/src/hooks/useResize.ts +19 -1
  328. package/src/hooks/useResizeObserver.ts +32 -9
  329. package/src/hooks/useStorage.ts +38 -0
  330. package/src/hotkeys/HotKeyLabel.tsx +1 -1
  331. package/src/hotkeys/HotKeyWrapper.tsx +3 -1
  332. package/src/index.ts +4 -0
  333. package/src/overlays/alert/Alert.tsx +28 -32
  334. package/src/overlays/flyout/Flyout.tsx +71 -84
  335. package/src/overlays/message/Message.tsx +10 -7
  336. package/src/overlays/modal/Modal.tsx +37 -15
  337. package/src/overlays/toast/Toast.tsx +18 -27
  338. package/src/overlays/tooltip/Tooltip.tsx +43 -18
  339. package/src/types/icons.ts +18 -3
  340. package/src/types/index.ts +268 -27
  341. package/src/typography/Abbr.tsx +44 -11
  342. package/src/typography/{Link.tsx → Anchor.tsx} +26 -14
  343. package/src/typography/Copy.tsx +15 -0
  344. package/src/typography/Mark.tsx +24 -10
  345. package/src/typography/Text.tsx +31 -13
  346. package/src/typography/Title.tsx +18 -7
  347. package/src/typography/index.ts +1 -1
  348. package/src/{overlays/tooltip/Tooltip.module.css → utils/cloneElement.ts} +21 -27
  349. package/src/utils/getColor.ts +1 -17
  350. package/src/utils/index.ts +1 -0
  351. package/css/index.js +0 -250
  352. package/css/tailwind/colors.ts +0 -158
  353. package/dist/cjs/components/actionLabel/ActionLabel.module.css +0 -1
  354. package/dist/cjs/components/animations/Animations.module.css +0 -1
  355. package/dist/cjs/components/avatar/Avatar.module.css +0 -1
  356. package/dist/cjs/components/badge/Badge.module.css +0 -1
  357. package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  358. package/dist/cjs/components/button/Button.module.css +0 -1
  359. package/dist/cjs/components/card/Card.module.css +0 -1
  360. package/dist/cjs/components/chip/Chip.module.css +0 -1
  361. package/dist/cjs/components/collapsable/Collapsable.module.css +0 -1
  362. package/dist/cjs/components/dropdown/Dropdown.module.css +0 -1
  363. package/dist/cjs/components/icon/Icon.module.css +0 -1
  364. package/dist/cjs/components/media/Media.module.css +0 -1
  365. package/dist/cjs/components/menu/Menu.module.css +0 -1
  366. package/dist/cjs/components/meter/Meter.module.css +0 -1
  367. package/dist/cjs/components/panel/Panel.module.css +0 -1
  368. package/dist/cjs/components/progress/Progress.module.css +0 -1
  369. package/dist/cjs/components/tabpanel/TabPanel.module.css +0 -1
  370. package/dist/cjs/core/aside/Aside.module.css +0 -1
  371. package/dist/cjs/core/boundary/ErrorBoundary.module.css +0 -1
  372. package/dist/cjs/core/content/Content.module.css +0 -1
  373. package/dist/cjs/core/headfoot/HeadFoot.module.css +0 -1
  374. package/dist/cjs/core/page/Page.module.css +0 -1
  375. package/dist/cjs/core/responsive/Responsive.module.css +0 -1
  376. package/dist/cjs/core/section/Section.module.css +0 -1
  377. package/dist/cjs/core/theme/Theme.module.css +0 -1
  378. package/dist/cjs/core/viewport/Viewport.module.css +0 -1
  379. package/dist/cjs/overlays/alert/Alert.module.css +0 -1
  380. package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
  381. package/dist/cjs/overlays/message/Message.module.css +0 -1
  382. package/dist/cjs/overlays/modal/Modal.module.css +0 -1
  383. package/dist/cjs/overlays/toast/Toast.module.css +0 -1
  384. package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
  385. package/dist/cjs/typography/Typography.module.css +0 -1
  386. package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
  387. package/dist/esm/components/animations/Animations.module.css +0 -1
  388. package/dist/esm/components/avatar/Avatar.module.css +0 -1
  389. package/dist/esm/components/badge/Badge.module.css +0 -1
  390. package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  391. package/dist/esm/components/button/Button.module.css +0 -1
  392. package/dist/esm/components/card/Card.module.css +0 -1
  393. package/dist/esm/components/chip/Chip.module.css +0 -1
  394. package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
  395. package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
  396. package/dist/esm/components/icon/Icon.module.css +0 -1
  397. package/dist/esm/components/media/Media.module.css +0 -1
  398. package/dist/esm/components/menu/Menu.module.css +0 -1
  399. package/dist/esm/components/meter/Meter.module.css +0 -1
  400. package/dist/esm/components/panel/Panel.module.css +0 -1
  401. package/dist/esm/components/progress/Progress.module.css +0 -1
  402. package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
  403. package/dist/esm/core/aside/Aside.module.css +0 -1
  404. package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
  405. package/dist/esm/core/content/Content.module.css +0 -1
  406. package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
  407. package/dist/esm/core/page/Page.module.css +0 -1
  408. package/dist/esm/core/responsive/Responsive.module.css +0 -1
  409. package/dist/esm/core/section/Section.module.css +0 -1
  410. package/dist/esm/core/theme/Theme.module.css +0 -1
  411. package/dist/esm/core/viewport/Viewport.module.css +0 -1
  412. package/dist/esm/overlays/alert/Alert.module.css +0 -1
  413. package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
  414. package/dist/esm/overlays/message/Message.module.css +0 -1
  415. package/dist/esm/overlays/modal/Modal.module.css +0 -1
  416. package/dist/esm/overlays/toast/Toast.module.css +0 -1
  417. package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
  418. package/dist/esm/typography/Typography.module.css +0 -1
  419. package/dist/types/typography/Link.d.ts +0 -25
@@ -23,13 +23,13 @@
23
23
 
24
24
  import { getImageColorset } from "@react-fabric/utilities";
25
25
  import classNames from "classnames";
26
- import { useMemo, useRef, useState } from "react";
27
- import { type AriaProps, type CssProp } from "../../types";
26
+ import { Fragment, useEffect, useRef, useState } from "react";
27
+ import { type AriaProps, type CssProp, type TestProps } from "../../types";
28
28
  import { CoreIcons } from "../../types/icons";
29
29
  import { Button } from "../button/Button";
30
- import classes from "./Media.module.css";
30
+ import { Icon } from "../icon/Icon";
31
31
 
32
- export interface BaseProps extends CssProp, AriaProps {
32
+ export interface BaseProps extends CssProp, TestProps, AriaProps {
33
33
  /**
34
34
  * media source
35
35
  */
@@ -44,6 +44,12 @@ export interface BaseProps extends CssProp, AriaProps {
44
44
  fit?: "cover" | "contain" | "fill";
45
45
  }
46
46
 
47
+ const cover = {
48
+ fill: "object-fill",
49
+ cover: "object-cover",
50
+ contain: "object-contain",
51
+ };
52
+
47
53
  export interface ImageProps extends BaseProps {
48
54
  /**
49
55
  * image alt text
@@ -65,6 +71,41 @@ export interface VideoProps extends BaseProps {
65
71
  playOnHover?: boolean;
66
72
  }
67
73
 
74
+ const loadIndicator = (
75
+ <div
76
+ className={classNames(
77
+ "fabric-mediaPlaceholder",
78
+ "absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-4xl text-gray animate-pulse",
79
+ )}
80
+ >
81
+ ●●●
82
+ </div>
83
+ );
84
+
85
+ /**
86
+ * Component for displaying images with optional reel decoration.
87
+ * A versatile media component that supports images and videos with various display options.
88
+ * It can display images with a reel decoration, handle loading states, and show error icons if the media fails to load.
89
+ * This component is useful for displaying images in a visually appealing way, with support for lazy loading and error handling.
90
+ * It automatically adjusts the display based on the provided fit property, allowing for different styles such as cover, contain, or fill.
91
+ *
92
+ * @param {ImageProps | VideoProps} props - The properties for the Media component.
93
+ * @returns {JSX.Element} The rendered Media component.
94
+ *
95
+ * @example
96
+ * ```jsx
97
+ * <Image
98
+ * src="image.jpg"
99
+ * alt="Example Image"
100
+ * reel={true}
101
+ * fit="cover"
102
+ * className="custom-class"
103
+ * />
104
+ * // Renders an image with reel decoration, cover fit, and a custom class name.
105
+ * ```
106
+ *
107
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-media--docs} for more details.
108
+ */
68
109
  export const Image = ({
69
110
  src,
70
111
  alt,
@@ -74,51 +115,84 @@ export const Image = ({
74
115
  ...aria
75
116
  }: ImageProps) => {
76
117
  const [colorSet, setColorSet] = useState("light");
77
- const loadIndicator = useMemo(
78
- () => (
79
- <div
80
- className={classNames(
81
- classes.mediaPlaceholder,
82
- "absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-4xl text-gray animate-pulse",
83
- )}
84
- >
85
- ●●●
86
- </div>
87
- ),
88
- [src],
89
- );
118
+ const [loaded, setLoaded] = useState(false);
119
+ const [errored, setErrored] = useState(false);
120
+ useEffect(() => {
121
+ setLoaded(false);
122
+ setErrored(false);
123
+ }, [src]);
90
124
  return (
91
125
  <div
92
126
  data-ref="image"
93
127
  className={classNames(
94
- classes.mediaContainer,
95
- "relative overflow-hidden bg-gray inline-block",
96
- reel && classes.mediaReel,
128
+ "fabric-mediaContainer",
129
+ "relative overflow-hidden inline-block",
130
+ reel && "fabric-mediaReel",
97
131
  className,
98
132
  )}
99
133
  data-colorset={colorSet}
100
134
  {...aria}
101
135
  >
102
- {loadIndicator}
103
- <img
104
- alt={alt ?? src}
105
- src={src}
106
- loading="lazy"
107
- crossOrigin="anonymous"
108
- className={classNames(
109
- classes.media,
110
- "pointer-events-none w-full h-full",
111
- fit && `object-${fit}`,
112
- )}
113
- onLoad={(e) => {
114
- e.currentTarget.previousElementSibling?.remove();
115
- setColorSet(getImageColorset(e.currentTarget));
116
- }}
117
- />
136
+ {!loaded && !errored && loadIndicator}
137
+ {!errored && (
138
+ <img
139
+ alt={alt ?? src}
140
+ src={src}
141
+ loading="lazy"
142
+ crossOrigin="anonymous"
143
+ className={classNames(
144
+ "fabric-media",
145
+ "pointer-events-none w-full h-full",
146
+ cover[fit],
147
+ )}
148
+ onLoad={(e) => {
149
+ setLoaded(true);
150
+ setColorSet(getImageColorset(e.currentTarget));
151
+ }}
152
+ onError={() => setErrored(true)}
153
+ />
154
+ )}
155
+ {errored && (
156
+ <Icon
157
+ size="2rem"
158
+ className="absolute text-tint-300 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
159
+ icon={CoreIcons.mediaImageBroken}
160
+ />
161
+ )}
118
162
  </div>
119
163
  );
120
164
  };
121
165
 
166
+ /**
167
+ * Component for displaying videos with optional controls and reel decoration.
168
+ * A versatile video component that supports autoplay, hover play, and various display options.
169
+ * It can display videos with a reel decoration, handle loading states, and show error icons if the video fails to load.
170
+ * This component is useful for displaying videos in a visually appealing way, with support for controls, autoplay, and error handling.
171
+ * It automatically adjusts the display based on the provided fit property, allowing for different styles such as cover, contain, or fill.
172
+ * It also includes controls for play/pause and volume, enhancing user interaction with the video content.
173
+ * This component is ideal for media-rich applications where video content needs to be displayed with user-friendly controls and visual effects.
174
+ * It supports features like autoplay, play on hover, and custom fit options for the video display.
175
+ * It also includes a reel decoration for a more engaging visual presentation.
176
+ *
177
+ * @param {VideoProps} props - The properties for the Video component.
178
+ * @returns {JSX.Element} The rendered Video component.
179
+ *
180
+ * @example
181
+ * ```jsx
182
+ * <Video
183
+ * src="video.mp4"
184
+ * poster="poster.jpg"
185
+ * reel={true}
186
+ * autoPlay={true}
187
+ * playOnHover={true}
188
+ * fit="cover"
189
+ * className="custom-class"
190
+ * />
191
+ * // Renders a video with reel decoration, autoplay, play on hover, cover fit, and a custom class name.
192
+ * ```
193
+ *
194
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-video--docs} for more details.
195
+ */
122
196
  export const Video = ({
123
197
  src,
124
198
  poster,
@@ -130,17 +204,27 @@ export const Video = ({
130
204
  ...aria
131
205
  }: VideoProps) => {
132
206
  const videoRef = useRef<HTMLVideoElement>(null);
207
+ const [loaded, setLoaded] = useState(false);
208
+ const [errored, setErrored] = useState(false);
209
+ useEffect(() => {
210
+ setLoaded(false);
211
+ setErrored(false);
212
+ }, [src]);
133
213
 
134
214
  const [state, setState] = useState(true);
135
215
  const [volume, setVolume] = useState(false);
136
216
 
217
+ useEffect(() => {
218
+ setErrored(false);
219
+ }, [src]);
220
+
137
221
  return (
138
222
  <div
139
223
  data-ref="video"
140
224
  className={classNames(
141
- classes.mediaContainer,
142
- "relative overflow-hidden bg-gray inline-block",
143
- reel && classes.mediaReel,
225
+ "fabric-mediaContainer",
226
+ "relative overflow-hidden inline-block",
227
+ reel && "fabric-mediaReel",
144
228
  className,
145
229
  )}
146
230
  onMouseEnter={() => {
@@ -151,74 +235,79 @@ export const Video = ({
151
235
  }}
152
236
  {...aria}
153
237
  >
154
- <div
155
- className={classNames(
156
- classes.mediaPlaceholder,
157
- "absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-5xl animate-pulse",
158
- )}
159
- >
160
- ●●●
161
- </div>
162
- <video
163
- loop
164
- ref={videoRef}
165
- controls={false}
166
- poster={poster}
167
- autoPlay={autoPlay}
168
- className={classNames(
169
- classes.media,
170
- "pointer-events-none w-full h-full",
171
- fit && `object-${fit}`,
172
- )}
173
- onPlay={() => setState(true)}
174
- onPause={() => setState(false)}
175
- onVolumeChange={(e) => setVolume(!!e.currentTarget.volume)}
176
- onLoadedData={(e) => {
177
- e.currentTarget.volume = 0;
178
- e.currentTarget.previousElementSibling?.remove();
179
- }}
180
- >
181
- <source src={src} />
182
- <track kind="captions" />
183
- </video>
184
- <div
185
- data-inner-clickable
186
- className={classNames(
187
- classes.mediaControls,
188
- "absolute bottom-6 end-6 rounded-full flex flex-col",
189
- )}
190
- >
191
- <Button
192
- rounded
193
- variant="link"
194
- className={classes.mediaControlPlaceholder}
195
- icon={CoreIcons.ellipsis}
196
- aria-label="controls"
197
- />
198
- <Button
199
- rounded
200
- variant="link"
201
- aria-label="controls"
202
- className={classes.mediaControlAction}
203
- onClick={() => {
204
- videoRef.current &&
205
- (videoRef.current.volume = videoRef.current.volume ? 0 : 1);
206
- }}
207
- icon={volume ? CoreIcons.volumeOn : CoreIcons.volumeOff}
208
- />
209
- <Button
210
- rounded
211
- variant="link"
212
- aria-label="controls"
213
- className={classes.mediaControlAction}
214
- onClick={() => {
215
- videoRef.current?.paused
216
- ? videoRef.current?.play()
217
- : videoRef.current?.pause();
218
- }}
219
- icon={state ? CoreIcons.pause : CoreIcons.play}
238
+ {!loaded && !errored && loadIndicator}
239
+ {!errored && (
240
+ <Fragment>
241
+ <video
242
+ loop
243
+ ref={videoRef}
244
+ controls={false}
245
+ poster={poster}
246
+ autoPlay={autoPlay}
247
+ className={classNames(
248
+ "fabric-media",
249
+ "pointer-events-none w-full h-full",
250
+ fit && `object-${fit}`,
251
+ )}
252
+ onPlay={() => setState(true)}
253
+ onPause={() => setState(false)}
254
+ onVolumeChange={(e) => setVolume(!!e.currentTarget.volume)}
255
+ onLoadedData={(e) => {
256
+ e.currentTarget.volume = 0;
257
+ setLoaded(true);
258
+ }}
259
+ onError={() => setErrored(true)}
260
+ >
261
+ <source src={src} />
262
+ <track kind="captions" />
263
+ </video>
264
+ <div
265
+ data-inner-clickable
266
+ className={classNames(
267
+ "fabric-mediaControls",
268
+ "absolute bottom-6 end-6 rounded-full flex flex-col",
269
+ )}
270
+ >
271
+ <Button
272
+ rounded
273
+ variant="link"
274
+ className={"fabric-mediaControlPlaceholder"}
275
+ icon={CoreIcons.ellipsis}
276
+ aria-label="controls"
277
+ />
278
+ <Button
279
+ rounded
280
+ variant="link"
281
+ aria-label="controls"
282
+ className={"fabric-mediaControlAction"}
283
+ onClick={() => {
284
+ videoRef.current &&
285
+ (videoRef.current.volume = videoRef.current.volume ? 0 : 1);
286
+ }}
287
+ icon={volume ? CoreIcons.volumeOn : CoreIcons.volumeOff}
288
+ />
289
+ <Button
290
+ rounded
291
+ variant="link"
292
+ aria-label="controls"
293
+ className={"fabric-mediaControlAction"}
294
+ onClick={() => {
295
+ videoRef.current?.paused
296
+ ? videoRef.current?.play()
297
+ : videoRef.current?.pause();
298
+ }}
299
+ icon={state ? CoreIcons.pause : CoreIcons.play}
300
+ />
301
+ </div>
302
+ </Fragment>
303
+ )}
304
+ {errored && (
305
+ <Icon
306
+ size="2rem"
307
+ className="absolute text-tint-300 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
308
+ icon={CoreIcons.mediaVideoBroken}
220
309
  />
221
- </div>
310
+ )}
222
311
  </div>
223
312
  );
224
313
  };
@@ -29,30 +29,60 @@ import {
29
29
  useClick,
30
30
  useDismiss,
31
31
  useFloating,
32
+ useFloatingNodeId,
32
33
  useInteractions,
33
34
  } from "@floating-ui/react";
34
- import { cloneElement, useRef, useState } from "react";
35
+ import { cloneElement, useEffect, useRef, useState } from "react";
35
36
  import { type ChildrenProp } from "../../types";
36
37
  import { type Menu } from "./Menu";
37
38
 
38
39
  export interface ContextMenuProps extends ChildrenProp {
39
40
  menu: React.ReactElement<typeof Menu>;
41
+
42
+ disabled?: boolean;
40
43
  }
41
44
 
42
- export const ContextMenu = ({ children, menu }: ContextMenuProps) => {
45
+ /**
46
+ * A component that provides a context menu that appears on right-click.
47
+ * It uses the Floating UI library to manage the positioning and interactions of the menu.
48
+ * This component is useful for creating custom context menus that can be triggered by right-clicking on elements.
49
+ *
50
+ * @param {ContextMenuProps} props - The properties for the ContextMenu component.
51
+ * @returns {JSX.Element} The rendered ContextMenu component.
52
+ *
53
+ * @example
54
+ * ```jsx
55
+ * <ContextMenu
56
+ * menu={<Menu items={[{ label: "Option 1" }, { label: "Option 2" }]} />}
57
+ * >
58
+ * <div className="context-menu-target">Right-click me!</div>
59
+ * </ContextMenu>
60
+ * ```
61
+ *
62
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs}
63
+ */
64
+ export const ContextMenu = ({ children, menu, disabled }: ContextMenuProps) => {
43
65
  const [isOpen, setIsOpen] = useState(false);
66
+ const nodeId = useFloatingNodeId();
44
67
 
45
68
  const { refs, floatingStyles, context } = useFloating({
46
69
  open: isOpen,
47
- onOpenChange: setIsOpen,
70
+ nodeId,
71
+ onOpenChange: (open, evt, reason) => {
72
+ const target = evt?.target as HTMLElement;
73
+ if (!target?.closest(".menu-list")) setIsOpen(open);
74
+ },
48
75
  strategy: "fixed",
49
76
  placement: "bottom-start",
50
77
  whileElementsMounted: autoUpdate,
51
78
  middleware: [offset(8), flip()],
52
79
  });
53
80
 
54
- const click = useClick(context, {});
55
- const dismiss = useDismiss(context, {});
81
+ const click = useClick(context, {
82
+ toggle: true,
83
+ ignoreMouse: true,
84
+ });
85
+ const dismiss = useDismiss(context, { bubbles: true });
56
86
 
57
87
  const { getFloatingProps } = useInteractions([dismiss, click]);
58
88
 
@@ -78,10 +108,19 @@ export const ContextMenu = ({ children, menu }: ContextMenuProps) => {
78
108
  return false;
79
109
  });
80
110
 
81
- const wrapperRef = useRef((el: HTMLElement) => {
82
- el?.parentElement?.removeEventListener("contextmenu", handleClick.current);
83
- el?.parentElement?.addEventListener("contextmenu", handleClick.current);
84
- });
111
+ const wrapperRef = useRef<HTMLDivElement>(null);
112
+ useEffect(() => {
113
+ const el = wrapperRef.current;
114
+ if (el && !disabled) {
115
+ el?.parentElement?.addEventListener("contextmenu", handleClick.current);
116
+ return () => {
117
+ el?.parentElement?.removeEventListener(
118
+ "contextmenu",
119
+ handleClick.current,
120
+ );
121
+ };
122
+ }
123
+ }, [disabled]);
85
124
 
86
125
  const tryClosing = useRef((e: React.MouseEvent) => {
87
126
  if ((e.target as HTMLElement)?.closest("[data-dropdown-dismiss='true']"))
@@ -91,12 +130,17 @@ export const ContextMenu = ({ children, menu }: ContextMenuProps) => {
91
130
  return (
92
131
  <div
93
132
  className="contents"
94
- ref={wrapperRef.current as AnyObject}
133
+ ref={wrapperRef}
95
134
  onMouseUpCapture={tryClosing.current}
96
135
  >
97
136
  {children}
98
137
  {isOpen && (
99
- <FloatingPortal>
138
+ <FloatingPortal
139
+ root={
140
+ refs.domReference.current?.closest<HTMLElement>(".theme-base") ??
141
+ undefined
142
+ }
143
+ >
100
144
  {cloneElement(menu as AnyObject, {
101
145
  ...getFloatingProps(),
102
146
  style: {
@@ -48,7 +48,6 @@ import {
48
48
  import { mergeRefs } from "@react-fabric/utilities";
49
49
  import classNames from "classnames";
50
50
  import {
51
- Children,
52
51
  cloneElement,
53
52
  Fragment,
54
53
  useCallback,
@@ -56,8 +55,9 @@ import {
56
55
  useRef,
57
56
  useState,
58
57
  } from "react";
58
+ import { HotKeyWrapper } from "../../hotkeys/HotKeyWrapper";
59
59
  import { CoreIcons } from "../../types/icons";
60
- import { nodeCheck } from "../../utils";
60
+ import { cloneChildren, nodeCheck } from "../../utils";
61
61
  import { MenuItem } from "./MenuItem";
62
62
  import { type MenuProps } from "./types";
63
63
 
@@ -69,6 +69,8 @@ const MenuComponent = ({
69
69
  menuClassName,
70
70
  onClick,
71
71
  // @ts-expect-error ignore
72
+ trigger = "hover",
73
+ // @ts-expect-error ignore
72
74
  ref,
73
75
  ...rest
74
76
  }: Partial<MenuProps>) => {
@@ -89,6 +91,8 @@ const MenuComponent = ({
89
91
  open: !isNested || isOpen,
90
92
  onOpenChange(open, event, reason) {
91
93
  isNested && setIsOpen(open);
94
+ if (reason === "outside-press" && trigger === "click")
95
+ tree?.events.emit("close");
92
96
  },
93
97
  placement: isNested ? "right-start" : "bottom-start",
94
98
  middleware: [
@@ -100,12 +104,14 @@ const MenuComponent = ({
100
104
  });
101
105
 
102
106
  const hover = useHover(context, {
107
+ enabled: trigger === "hover",
103
108
  delay: { open: 75 },
104
109
  handleClose: safePolygon({ blockPointerEvents: true }),
105
110
  });
106
111
  const click = useClick(context, {
107
- toggle: true,
108
- ignoreMouse: true,
112
+ event: "mousedown",
113
+ toggle: trigger === "click" || !isNested,
114
+ ignoreMouse: trigger === "hover" && !isNested,
109
115
  });
110
116
  const role = useRole(context, { role: "menu" });
111
117
  const dismiss = useDismiss(context, { bubbles: true });
@@ -187,6 +193,16 @@ const MenuComponent = ({
187
193
  );
188
194
  }, [isOpen]);
189
195
 
196
+ useEffect(() => {
197
+ if ((!isNested || isOpen) && activeIndex) {
198
+ setTimeout(() => {
199
+ elementsRef.current[activeIndex]?.scrollIntoView({
200
+ block: "nearest",
201
+ });
202
+ }, 100);
203
+ }
204
+ }, [isOpen, activeIndex]);
205
+
190
206
  return (
191
207
  <FloatingNode id={nodeId}>
192
208
  {isNested && (
@@ -210,29 +226,29 @@ const MenuComponent = ({
210
226
  {(!isNested || isOpen) && (
211
227
  <Wrapper {...wrapperProps}>
212
228
  {isNested && <FloatingOverlay />}
213
- <FloatingFocusManager
214
- context={context}
215
- modal={!isNested}
216
- initialFocus={isNested ? -1 : 0}
217
- returnFocus={!isNested}
218
- >
219
- <div
220
- className={classNames(
221
- menuClassName,
222
- "flex flex-col bg-base p-1 menu-list",
223
- isNested &&
224
- "outline shadow-lg rounded-capped max-h-96 overflow-auto scroll-thin z-[var(--z-popover)]",
225
- )}
226
- autoFocus
227
- ref={mergeRefs(refs.setFloating, isNested ? undefined : ref)}
228
- {...getFloatingProps({
229
- onClick: isNested ? undefined : handleClick,
230
- })}
231
- // @ts-expect-error ignore
232
- {...{ style: !isNested ? rest.style : floatingStyles }}
229
+ <HotKeyWrapper>
230
+ <FloatingFocusManager
231
+ context={context}
232
+ modal={!isNested}
233
+ initialFocus={isNested ? -1 : 0}
234
+ returnFocus={!isNested}
233
235
  >
234
- {Children.map(children, (child: AnyObject, index) => {
235
- if (child) {
236
+ <div
237
+ className={classNames(
238
+ menuClassName,
239
+ "flex flex-col bg-base p-1 menu-list",
240
+ isNested &&
241
+ "outline shadow-lg rounded-capped max-h-96 overflow-auto scroll-thin z-(--z-popover)",
242
+ )}
243
+ autoFocus
244
+ ref={mergeRefs(isNested ? refs.setFloating : ref)}
245
+ {...getFloatingProps({
246
+ onClick: isNested ? undefined : handleClick,
247
+ })}
248
+ // @ts-expect-error ignore
249
+ {...{ style: !isNested ? rest.style : floatingStyles }}
250
+ >
251
+ {cloneChildren(children, (child: AnyObject, index) => {
236
252
  labelsRef.current[index] = child.props.label;
237
253
  return cloneElement(
238
254
  child,
@@ -249,10 +265,10 @@ const MenuComponent = ({
249
265
  }
250
266
  : {},
251
267
  );
252
- }
253
- })}
254
- </div>
255
- </FloatingFocusManager>
268
+ })}
269
+ </div>
270
+ </FloatingFocusManager>
271
+ </HotKeyWrapper>
256
272
  </Wrapper>
257
273
  )}
258
274
  </FloatingList>
@@ -260,8 +276,47 @@ const MenuComponent = ({
260
276
  );
261
277
  };
262
278
 
279
+ /**
280
+ * A component that displays a menu with items, supports nested menus and various interactions.
281
+ * It can be triggered by hover or click events, and allows for custom styling and behavior.
282
+ * This component is designed to be used within a Floating UI context, allowing for dynamic positioning and interaction handling.
283
+ * It can be nested within other menus to create complex menu structures.
284
+ *
285
+ * @param {MenuProps} props - The properties for the Menu component.
286
+ * @returns {JSX.Element} The rendered Menu component.
287
+ *
288
+ * @example
289
+ * ```jsx
290
+ * <Menu
291
+ * className="my-menu"
292
+ * trigger="click"
293
+ * onClick={(id) => console.log(`Clicked item with id: ${id}`)}
294
+ * >
295
+ * <MenuItem id="item1" label="Item 1" />
296
+ * <MenuItem id="item2" label="Item 2" />
297
+ * <MenuItem id="item3" label="Item 3">
298
+ * <Menu>
299
+ * <MenuItem id="subitem1" label="Sub Item 1" />
300
+ * <MenuItem id="subitem2" label="Sub Item 2" />
301
+ * </Menu>
302
+ * </MenuItem>
303
+ * </Menu>
304
+ * ```
305
+ *
306
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs} for more details.
307
+ */
263
308
  export const Menu = (props: MenuProps) => {
264
309
  const parentId = useFloatingParentNodeId();
310
+ const tree = useFloatingTree();
311
+
312
+ if (tree) {
313
+ return (
314
+ <MenuComponent
315
+ {...(props as AnyObject)}
316
+ menuClassName={props.className}
317
+ />
318
+ );
319
+ }
265
320
 
266
321
  if (parentId === null) {
267
322
  return (