@react-fabric/core 1.0.0-beta.9 → 1.0.2

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 (592) 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/css/components/_animations.css +52 -0
  4. package/css/components/_avatar.css +89 -0
  5. package/css/components/_button.css +218 -0
  6. package/css/components/_buttonGroup.css +62 -0
  7. package/css/components/_callout.css +32 -0
  8. package/css/components/_card.css +167 -0
  9. package/css/components/_chip.css +125 -0
  10. package/css/components/_collapsable.css +32 -0
  11. package/{src/overlays/message/Message.module.css → css/components/_divider.css} +11 -10
  12. package/{src/components/dropdown/Dropdown.module.css → css/components/_dropdown.css} +3 -2
  13. package/{src/overlays/flyout/Flyout.module.css → css/components/_flyout.css} +15 -9
  14. package/css/components/_media.css +102 -0
  15. package/{src/components/menu/Menu.module.css → css/components/_menu.css} +21 -20
  16. package/{src/components/meter/Meter.module.css → css/components/_meter.css} +15 -20
  17. package/{src/overlays/modal/Modal.module.css → css/components/_modal.css} +9 -9
  18. package/{src/components/panel/Panel.module.css → css/components/_panel.css} +19 -19
  19. package/{src/components/progress/Progress.module.css → css/components/_progress.css} +7 -10
  20. package/css/components/_sonner.css +431 -0
  21. package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +125 -85
  22. package/css/components/_titlebar.css +48 -0
  23. package/css/components/index.css +47 -0
  24. package/css/core/_aside.css +176 -0
  25. package/css/core/_content.css +31 -0
  26. package/css/core/_errorboundary.css +55 -0
  27. package/css/core/_responsive.css +45 -0
  28. package/css/core/_typography.css +69 -0
  29. package/css/core/_viewport.css +33 -0
  30. package/{src/hooks/useClientService.tsx → css/core/index.css} +7 -7
  31. package/css/reset/_gradients.css +36 -33
  32. package/css/reset/_reset.css +206 -300
  33. package/css/reset/_text.css +31 -61
  34. package/css/reset/_theme.css +467 -81
  35. package/css/reset/index.css +23 -21
  36. package/css/styles.css +30 -23
  37. package/css/theme/_colors.css +445 -0
  38. package/css/theme/_utilities.css +528 -0
  39. package/css/theme/_variants.css +128 -0
  40. package/css/theme/index.css +55 -0
  41. package/dist/cjs/components/actionLabel/ActionLabel.js +25 -12
  42. package/dist/cjs/{overlays → components}/alert/Alert.js +76 -53
  43. package/dist/cjs/components/animations/Indicator.js +66 -0
  44. package/dist/cjs/components/animations/Loader.js +77 -0
  45. package/dist/cjs/components/animations/LoadingBars.js +37 -0
  46. package/dist/cjs/components/animations/LoadingLine.js +59 -0
  47. package/dist/cjs/components/animations/LoadingSpinner.js +37 -0
  48. package/dist/cjs/components/animations/Skeleton.js +88 -0
  49. package/dist/cjs/components/avatar/Avatar.js +41 -20
  50. package/dist/cjs/components/avatar/AvatarGroup.js +37 -16
  51. package/dist/cjs/components/badge/Badge.js +90 -68
  52. package/dist/cjs/components/button/Button.js +198 -136
  53. package/dist/cjs/components/button/ButtonGroup.js +86 -21
  54. package/dist/cjs/components/button/ConfirmButton.js +55 -41
  55. package/dist/cjs/components/button/ToggleButtonGroup.js +84 -32
  56. package/dist/cjs/components/callout/Callout.js +56 -25
  57. package/dist/cjs/components/card/Card.js +90 -42
  58. package/dist/cjs/components/card/CardCover.js +38 -27
  59. package/dist/cjs/components/card/FlipContent.js +47 -0
  60. package/dist/cjs/components/chip/Chip.js +80 -37
  61. package/dist/cjs/components/collapsable/Collapsable.js +62 -31
  62. package/dist/cjs/components/divider/Divider.js +58 -24
  63. package/dist/cjs/components/dropdown/Dropdown.js +92 -45
  64. package/dist/cjs/components/dropdown/DropdownTool.js +6 -7
  65. package/dist/cjs/components/effect/GlassEffect.js +259 -0
  66. package/dist/cjs/components/effect/MatteEffect.js +127 -0
  67. package/dist/cjs/components/effect/StyleEffect.js +43 -0
  68. package/dist/cjs/components/empty/EmptyContent.js +37 -49
  69. package/dist/cjs/components/flyout/Flyout.js +170 -0
  70. package/dist/cjs/components/hotkey/HotKey.js +42 -0
  71. package/dist/cjs/components/icon/Icon.js +81 -80
  72. package/dist/cjs/components/media/Media.js +154 -77
  73. package/dist/cjs/components/menu/ContextMenu.js +45 -20
  74. package/dist/cjs/components/menu/Menu.js +98 -38
  75. package/dist/cjs/components/menu/MenuItem.js +102 -74
  76. package/dist/cjs/components/meter/Meter.js +35 -12
  77. package/dist/cjs/components/modal/Modal.js +152 -0
  78. package/dist/cjs/components/navigator/Navigator.js +81 -36
  79. package/dist/cjs/components/panel/Panel.js +115 -60
  80. package/dist/cjs/components/panel/PanelGroup.js +42 -16
  81. package/dist/cjs/components/panel/PanelStack.js +47 -16
  82. package/dist/cjs/components/pillbox/Pillbox.js +118 -0
  83. package/dist/cjs/components/progress/ProgressBar.js +30 -14
  84. package/dist/cjs/components/progress/ProgressCircle.js +27 -11
  85. package/dist/cjs/components/tabpanel/Tab.js +53 -37
  86. package/dist/cjs/components/tabpanel/TabPanel.js +74 -28
  87. package/dist/cjs/components/titlebar/Titlebar.js +52 -0
  88. package/dist/cjs/components/tooltip/Tooltip.js +180 -0
  89. package/dist/cjs/context/Global.js +159 -80
  90. package/dist/cjs/context/ModalManager.js +60 -0
  91. package/dist/cjs/context/context.js +43 -0
  92. package/dist/cjs/core/areaToggle/AreaToggle.js +41 -0
  93. package/dist/cjs/core/aside/Aside.js +178 -83
  94. package/dist/cjs/core/boundary/ErrorBoundary.js +37 -34
  95. package/dist/cjs/core/boundary/ErrorIcon.js +32 -19
  96. package/dist/cjs/core/content/Content.js +26 -37
  97. package/dist/cjs/core/headfoot/HeadFoot.js +133 -35
  98. package/dist/cjs/core/layout/Layout.js +28 -0
  99. package/dist/cjs/core/responsive/Responsive.js +62 -26
  100. package/dist/cjs/core/theme/ThemeProvider.js +35 -41
  101. package/dist/cjs/core/viewport/Viewport.js +26 -22
  102. package/dist/cjs/hooks/useClientService.js +39 -18
  103. package/dist/cjs/hooks/useContextMenu.js +103 -0
  104. package/dist/cjs/hooks/useControlledValue.js +13 -7
  105. package/dist/cjs/hooks/useDebounce.js +37 -21
  106. package/dist/cjs/hooks/useEffectDebugger.js +79 -60
  107. package/dist/cjs/hooks/useIsDark.js +34 -26
  108. package/dist/cjs/hooks/useIsRtl.js +13 -3
  109. package/dist/cjs/hooks/useNavigator.js +12 -9
  110. package/dist/cjs/hooks/useNotificationService.js +199 -0
  111. package/dist/cjs/hooks/useOverlayService.js +82 -41
  112. package/dist/cjs/hooks/usePropState.js +41 -0
  113. package/dist/cjs/hooks/usePropToggle.js +32 -26
  114. package/dist/cjs/hooks/useResize.js +47 -38
  115. package/dist/cjs/hooks/useResizeObserver.js +26 -7
  116. package/dist/cjs/hooks/useStorage.js +29 -16
  117. package/dist/cjs/i18n/index.js +25 -23
  118. package/dist/cjs/index.js +142 -94
  119. package/dist/cjs/typography/Abbr.js +43 -20
  120. package/dist/cjs/typography/Anchor.js +39 -0
  121. package/dist/cjs/typography/Copy.js +28 -28
  122. package/dist/cjs/typography/Kbd.js +43 -0
  123. package/dist/cjs/typography/Mark.js +34 -17
  124. package/dist/cjs/typography/Text.js +36 -54
  125. package/dist/cjs/typography/Title.js +17 -40
  126. package/dist/cjs/utils/calculateDimensions.js +38 -23
  127. package/dist/cjs/utils/cloneElement.js +64 -0
  128. package/dist/cjs/{core/section/Section.js → utils/getBadgeProps.js} +25 -21
  129. package/dist/cjs/utils/getColor.js +42 -36
  130. package/dist/cjs/utils/getIconProps.js +63 -0
  131. package/dist/cjs/utils/getTooltipProps.js +66 -0
  132. package/dist/cjs/utils/nodeCheck.js +4 -4
  133. package/dist/esm/components/actionLabel/ActionLabel.js +25 -12
  134. package/dist/esm/{overlays → components}/alert/Alert.js +73 -50
  135. package/dist/esm/components/animations/Indicator.js +66 -0
  136. package/dist/esm/components/animations/Loader.js +77 -0
  137. package/dist/esm/components/animations/LoadingBars.js +37 -0
  138. package/dist/esm/components/animations/LoadingLine.js +59 -0
  139. package/dist/esm/components/animations/LoadingSpinner.js +37 -0
  140. package/dist/esm/components/animations/Skeleton.js +88 -0
  141. package/dist/esm/components/avatar/Avatar.js +42 -21
  142. package/dist/esm/components/avatar/AvatarGroup.js +37 -16
  143. package/dist/esm/components/badge/Badge.js +93 -70
  144. package/dist/esm/components/button/Button.js +199 -137
  145. package/dist/esm/components/button/ButtonGroup.js +87 -22
  146. package/dist/esm/components/button/ConfirmButton.js +58 -44
  147. package/dist/esm/components/button/ToggleButtonGroup.js +86 -34
  148. package/dist/esm/components/callout/Callout.js +56 -25
  149. package/dist/esm/components/card/Card.js +92 -44
  150. package/dist/esm/components/card/CardCover.js +38 -27
  151. package/dist/esm/components/card/FlipContent.js +47 -0
  152. package/dist/esm/components/chip/Chip.js +81 -38
  153. package/dist/esm/components/collapsable/Collapsable.js +63 -32
  154. package/dist/esm/components/divider/Divider.js +59 -25
  155. package/dist/esm/components/dropdown/Dropdown.js +95 -48
  156. package/dist/esm/components/dropdown/DropdownTool.js +6 -7
  157. package/dist/esm/components/effect/GlassEffect.js +259 -0
  158. package/dist/esm/components/effect/MatteEffect.js +127 -0
  159. package/dist/esm/components/effect/StyleEffect.js +43 -0
  160. package/dist/esm/components/empty/EmptyContent.js +38 -50
  161. package/dist/esm/components/flyout/Flyout.js +170 -0
  162. package/dist/esm/components/hotkey/HotKey.js +42 -0
  163. package/dist/esm/components/icon/Icon.js +83 -82
  164. package/dist/esm/components/media/Media.js +156 -79
  165. package/dist/esm/components/menu/ContextMenu.js +46 -21
  166. package/dist/esm/components/menu/Menu.js +101 -41
  167. package/dist/esm/components/menu/MenuItem.js +98 -70
  168. package/dist/esm/components/meter/Meter.js +36 -13
  169. package/dist/esm/components/modal/Modal.js +152 -0
  170. package/dist/esm/components/navigator/Navigator.js +81 -36
  171. package/dist/esm/components/panel/Panel.js +117 -62
  172. package/dist/esm/components/panel/PanelGroup.js +43 -17
  173. package/dist/esm/components/panel/PanelStack.js +48 -17
  174. package/dist/esm/components/pillbox/Pillbox.js +118 -0
  175. package/dist/esm/components/progress/ProgressBar.js +31 -15
  176. package/dist/esm/components/progress/ProgressCircle.js +28 -12
  177. package/dist/esm/components/tabpanel/Tab.js +54 -38
  178. package/dist/esm/components/tabpanel/TabPanel.js +75 -29
  179. package/dist/esm/components/titlebar/Titlebar.js +52 -0
  180. package/dist/esm/components/tooltip/Tooltip.js +180 -0
  181. package/dist/esm/context/Global.js +161 -78
  182. package/dist/esm/context/ModalManager.js +60 -0
  183. package/dist/esm/context/context.js +40 -0
  184. package/dist/esm/core/areaToggle/AreaToggle.js +41 -0
  185. package/dist/esm/core/aside/Aside.js +179 -84
  186. package/dist/esm/core/boundary/ErrorBoundary.js +38 -35
  187. package/dist/esm/core/boundary/ErrorIcon.js +32 -19
  188. package/dist/esm/core/content/Content.js +26 -37
  189. package/dist/esm/core/headfoot/HeadFoot.js +134 -36
  190. package/dist/esm/core/layout/Layout.js +28 -0
  191. package/dist/esm/core/responsive/Responsive.js +62 -26
  192. package/dist/esm/core/theme/ThemeProvider.js +36 -42
  193. package/dist/esm/core/viewport/Viewport.js +26 -22
  194. package/dist/esm/hooks/useClientService.js +39 -18
  195. package/dist/esm/hooks/useContextMenu.js +103 -0
  196. package/dist/esm/hooks/useControlledValue.js +14 -8
  197. package/dist/esm/hooks/useDebounce.js +37 -21
  198. package/dist/esm/hooks/useEffectDebugger.js +81 -62
  199. package/dist/esm/hooks/useIsDark.js +34 -26
  200. package/dist/esm/hooks/useIsRtl.js +13 -3
  201. package/dist/esm/hooks/useNavigator.js +13 -10
  202. package/dist/esm/hooks/useNotificationService.js +199 -0
  203. package/dist/esm/hooks/useOverlayService.js +83 -42
  204. package/dist/esm/hooks/usePropState.js +40 -0
  205. package/dist/esm/hooks/usePropToggle.js +33 -27
  206. package/dist/esm/hooks/useResize.js +48 -39
  207. package/dist/esm/hooks/useResizeObserver.js +27 -8
  208. package/dist/esm/hooks/useStorage.js +30 -17
  209. package/dist/esm/i18n/index.js +23 -21
  210. package/dist/esm/index.js +87 -44
  211. package/dist/esm/typography/Abbr.js +45 -22
  212. package/dist/esm/typography/Anchor.js +39 -0
  213. package/dist/esm/typography/Copy.js +28 -28
  214. package/dist/esm/typography/Kbd.js +43 -0
  215. package/dist/esm/typography/Mark.js +35 -18
  216. package/dist/esm/typography/Text.js +39 -57
  217. package/dist/esm/typography/Title.js +17 -40
  218. package/dist/esm/utils/calculateDimensions.js +38 -23
  219. package/dist/esm/utils/cloneElement.js +64 -0
  220. package/dist/esm/{core/section/Section.js → utils/getBadgeProps.js} +25 -21
  221. package/dist/esm/utils/getColor.js +43 -34
  222. package/dist/esm/utils/getIconProps.js +63 -0
  223. package/dist/esm/utils/getTooltipProps.js +66 -0
  224. package/dist/esm/utils/nodeCheck.js +4 -4
  225. package/dist/types/components/actionLabel/ActionLabel.d.ts +20 -7
  226. package/dist/types/components/alert/Alert.d.ts +74 -0
  227. package/dist/types/components/animations/Indicator.d.ts +57 -0
  228. package/dist/types/components/animations/Loader.d.ts +65 -0
  229. package/dist/types/components/animations/LoadingBars.d.ts +61 -0
  230. package/dist/types/components/animations/LoadingLine.d.ts +43 -0
  231. package/dist/types/components/animations/LoadingSpinner.d.ts +61 -0
  232. package/dist/types/components/animations/Skeleton.d.ts +61 -0
  233. package/dist/types/components/avatar/Avatar.d.ts +70 -19
  234. package/dist/types/components/avatar/AvatarGroup.d.ts +51 -14
  235. package/dist/types/components/badge/Badge.d.ts +64 -14
  236. package/dist/types/components/button/Button.d.ts +72 -55
  237. package/dist/types/components/button/ButtonGroup.d.ts +86 -24
  238. package/dist/types/components/button/ConfirmButton.d.ts +21 -7
  239. package/dist/types/components/button/ToggleButtonGroup.d.ts +88 -44
  240. package/dist/types/components/callout/Callout.d.ts +58 -7
  241. package/dist/types/components/card/Card.d.ts +66 -25
  242. package/dist/types/components/card/CardCover.d.ts +52 -7
  243. package/dist/types/components/card/FlipContent.d.ts +50 -0
  244. package/dist/types/components/chip/Chip.d.ts +72 -20
  245. package/dist/types/components/collapsable/Collapsable.d.ts +55 -15
  246. package/dist/types/components/divider/Divider.d.ts +25 -8
  247. package/dist/types/components/dropdown/Dropdown.d.ts +42 -9
  248. package/dist/types/components/dropdown/DropdownTool.d.ts +22 -4
  249. package/dist/types/components/effect/GlassEffect.d.ts +5 -0
  250. package/dist/types/components/effect/MatteEffect.d.ts +40 -0
  251. package/dist/types/components/effect/StyleEffect.d.ts +27 -0
  252. package/dist/types/components/empty/EmptyContent.d.ts +53 -9
  253. package/dist/types/components/flyout/Flyout.d.ts +60 -0
  254. package/dist/types/components/hotkey/HotKey.d.ts +41 -0
  255. package/dist/types/components/icon/Icon.d.ts +74 -24
  256. package/dist/types/components/media/Media.d.ts +72 -4
  257. package/dist/types/components/menu/ContextMenu.d.ts +22 -5
  258. package/dist/types/components/menu/Menu.d.ts +26 -2
  259. package/dist/types/components/menu/MenuItem.d.ts +19 -4
  260. package/dist/types/components/menu/types.d.ts +23 -14
  261. package/dist/types/components/meter/Meter.d.ts +23 -3
  262. package/dist/types/components/modal/Modal.d.ts +52 -0
  263. package/dist/types/components/navigator/Navigator.d.ts +30 -4
  264. package/dist/types/components/panel/Panel.d.ts +43 -23
  265. package/dist/types/components/panel/PanelGroup.d.ts +22 -3
  266. package/dist/types/components/panel/PanelStack.d.ts +28 -2
  267. package/dist/types/components/pillbox/Pillbox.d.ts +95 -0
  268. package/dist/types/components/progress/ProgressBar.d.ts +19 -4
  269. package/dist/types/components/progress/ProgressCircle.d.ts +18 -4
  270. package/dist/types/components/tabpanel/Tab.d.ts +42 -10
  271. package/dist/types/components/tabpanel/TabPanel.d.ts +47 -7
  272. package/dist/types/components/titlebar/Titlebar.d.ts +54 -0
  273. package/dist/types/components/tooltip/Tooltip.d.ts +76 -0
  274. package/dist/types/context/Global.d.ts +39 -69
  275. package/dist/types/context/ModalManager.d.ts +30 -0
  276. package/dist/types/context/context.d.ts +107 -0
  277. package/dist/types/core/areaToggle/AreaToggle.d.ts +33 -0
  278. package/dist/types/core/aside/Aside.d.ts +75 -20
  279. package/dist/types/core/boundary/ErrorBoundary.d.ts +43 -4
  280. package/dist/types/core/boundary/ErrorIcon.d.ts +38 -1
  281. package/dist/types/core/content/Content.d.ts +38 -6
  282. package/dist/types/core/headfoot/HeadFoot.d.ts +48 -14
  283. package/dist/types/core/layout/Layout.d.ts +38 -0
  284. package/dist/types/core/responsive/Responsive.d.ts +45 -15
  285. package/dist/types/core/theme/ThemeProvider.d.ts +35 -11
  286. package/dist/types/core/viewport/Viewport.d.ts +27 -3
  287. package/dist/types/hooks/useClientService.d.ts +43 -1
  288. package/dist/types/hooks/useContextMenu.d.ts +10 -0
  289. package/dist/types/hooks/useControlledValue.d.ts +28 -4
  290. package/dist/types/hooks/useDebounce.d.ts +38 -2
  291. package/dist/types/hooks/useEffectDebugger.d.ts +73 -4
  292. package/dist/types/hooks/useIsDark.d.ts +6 -0
  293. package/dist/types/hooks/useIsRtl.d.ts +35 -1
  294. package/dist/types/hooks/useNavigator.d.ts +37 -2
  295. package/dist/types/hooks/useNotificationService.d.ts +60 -0
  296. package/dist/types/hooks/useOverlayService.d.ts +28 -8
  297. package/dist/types/hooks/usePropState.d.ts +26 -0
  298. package/dist/types/hooks/usePropToggle.d.ts +41 -7
  299. package/dist/types/hooks/useResize.d.ts +46 -4
  300. package/dist/types/hooks/useResizeObserver.d.ts +45 -3
  301. package/dist/types/hooks/useStorage.d.ts +32 -2
  302. package/dist/types/i18n/index.d.ts +27 -3
  303. package/dist/types/index.d.ts +106 -18
  304. package/dist/types/types/colors.d.ts +29 -0
  305. package/dist/types/types/index.d.ts +216 -76
  306. package/dist/types/typography/Abbr.d.ts +51 -6
  307. package/dist/types/typography/Anchor.d.ts +41 -0
  308. package/dist/types/typography/Copy.d.ts +36 -2
  309. package/dist/types/typography/Kbd.d.ts +40 -0
  310. package/dist/types/typography/Mark.d.ts +44 -7
  311. package/dist/types/typography/Text.d.ts +40 -24
  312. package/dist/types/typography/Title.d.ts +37 -26
  313. package/dist/types/typography/types.d.ts +32 -0
  314. package/dist/types/utils/calculateDimensions.d.ts +50 -6
  315. package/dist/types/utils/cloneElement.d.ts +41 -0
  316. package/dist/types/utils/getBadgeProps.d.ts +16 -0
  317. package/dist/types/utils/getColor.d.ts +43 -4
  318. package/dist/types/utils/getIconProps.d.ts +45 -0
  319. package/dist/types/utils/getTooltipProps.d.ts +47 -0
  320. package/dist/types/utils/index.d.ts +28 -0
  321. package/dist/types/utils/nodeCheck.d.ts +1 -2
  322. package/package.json +30 -21
  323. package/src/components/actionLabel/ActionLabel.tsx +28 -39
  324. package/src/components/alert/Alert.tsx +261 -0
  325. package/src/components/animations/Indicator.tsx +75 -0
  326. package/src/components/animations/Loader.tsx +89 -0
  327. package/src/components/animations/LoadingBars.tsx +70 -0
  328. package/src/components/animations/LoadingLine.tsx +51 -0
  329. package/src/components/animations/LoadingSpinner.tsx +70 -0
  330. package/src/components/animations/Skeleton.tsx +100 -0
  331. package/src/components/avatar/Avatar.tsx +89 -70
  332. package/src/components/avatar/AvatarGroup.tsx +65 -74
  333. package/src/components/badge/Badge.tsx +141 -108
  334. package/src/components/button/Button.tsx +223 -238
  335. package/src/components/button/ButtonGroup.tsx +117 -77
  336. package/src/components/button/ConfirmButton.tsx +60 -90
  337. package/src/components/button/ToggleButtonGroup.tsx +134 -120
  338. package/src/components/callout/Callout.tsx +81 -59
  339. package/src/components/card/Card.tsx +131 -113
  340. package/src/components/card/CardCover.tsx +61 -61
  341. package/src/components/card/FlipContent.tsx +78 -0
  342. package/src/components/chip/Chip.tsx +139 -99
  343. package/src/components/collapsable/Collapsable.tsx +79 -77
  344. package/src/components/divider/Divider.tsx +74 -53
  345. package/src/components/dropdown/Dropdown.tsx +109 -106
  346. package/src/components/dropdown/DropdownTool.tsx +29 -12
  347. package/src/components/effect/GlassEffect.tsx +221 -0
  348. package/src/components/effect/MatteEffect.tsx +99 -0
  349. package/src/components/effect/StyleEffect.tsx +36 -0
  350. package/src/components/empty/EmptyContent.tsx +60 -99
  351. package/src/components/flyout/Flyout.tsx +257 -0
  352. package/src/components/hotkey/HotKey.tsx +57 -0
  353. package/src/components/icon/Icon.tsx +131 -130
  354. package/src/components/media/Media.tsx +184 -154
  355. package/src/components/menu/ContextMenu.tsx +56 -39
  356. package/src/components/menu/Menu.tsx +121 -84
  357. package/src/components/menu/MenuItem.tsx +87 -69
  358. package/src/components/menu/types.ts +23 -28
  359. package/src/components/meter/Meter.tsx +34 -17
  360. package/src/components/modal/Modal.tsx +226 -0
  361. package/src/components/navigator/Navigator.tsx +93 -38
  362. package/src/components/panel/Panel.tsx +123 -131
  363. package/src/components/panel/PanelGroup.tsx +49 -43
  364. package/src/components/panel/PanelStack.tsx +63 -62
  365. package/src/components/pillbox/Pillbox.tsx +208 -0
  366. package/src/components/progress/ProgressBar.tsx +33 -33
  367. package/src/components/progress/ProgressCircle.tsx +29 -37
  368. package/src/components/tabpanel/Tab.tsx +84 -73
  369. package/src/components/tabpanel/TabPanel.tsx +102 -51
  370. package/src/components/titlebar/Titlebar.tsx +115 -0
  371. package/src/components/tooltip/Tooltip.tsx +255 -0
  372. package/src/context/Global.tsx +148 -148
  373. package/src/context/ModalManager.tsx +68 -0
  374. package/src/context/context.ts +111 -0
  375. package/src/core/areaToggle/AreaToggle.tsx +45 -0
  376. package/src/core/aside/Aside.tsx +200 -155
  377. package/src/core/boundary/ErrorBoundary.tsx +50 -68
  378. package/src/core/boundary/ErrorIcon.tsx +34 -32
  379. package/src/core/content/Content.tsx +41 -50
  380. package/src/core/headfoot/HeadFoot.tsx +162 -81
  381. package/src/core/layout/Layout.tsx +54 -0
  382. package/src/core/responsive/Responsive.tsx +91 -98
  383. package/src/core/theme/ThemeProvider.tsx +45 -56
  384. package/src/core/viewport/Viewport.tsx +25 -27
  385. package/src/hooks/useClientService.ts +47 -0
  386. package/src/hooks/useContextMenu.tsx +131 -0
  387. package/src/hooks/useControlledValue.ts +47 -0
  388. package/src/hooks/useDebounce.ts +41 -24
  389. package/src/hooks/useEffectDebugger.ts +105 -94
  390. package/src/hooks/useIsDark.ts +10 -24
  391. package/src/hooks/useIsRtl.ts +32 -20
  392. package/src/hooks/useNavigator.tsx +41 -26
  393. package/src/hooks/useNotificationService.tsx +239 -0
  394. package/src/hooks/useOverlayService.tsx +67 -20
  395. package/src/hooks/usePropState.ts +52 -0
  396. package/src/hooks/usePropToggle.ts +54 -47
  397. package/src/hooks/useResize.ts +69 -45
  398. package/src/hooks/useResizeObserver.ts +59 -34
  399. package/src/hooks/useStorage.ts +40 -48
  400. package/src/i18n/index.ts +24 -25
  401. package/src/index.ts +115 -44
  402. package/src/types/colors.ts +49 -0
  403. package/src/types/global.d.ts +40 -17
  404. package/src/types/index.ts +243 -155
  405. package/src/typography/Abbr.tsx +62 -59
  406. package/src/typography/Anchor.tsx +63 -0
  407. package/src/typography/Copy.tsx +39 -29
  408. package/src/typography/Kbd.tsx +50 -0
  409. package/src/typography/Mark.tsx +56 -51
  410. package/src/typography/Text.tsx +57 -128
  411. package/src/typography/Title.tsx +36 -108
  412. package/src/typography/types.ts +27 -17
  413. package/src/utils/calculateDimensions.ts +50 -40
  414. package/src/utils/cloneElement.ts +61 -0
  415. package/src/{core/content/Content.module.css → utils/getBadgeProps.ts} +20 -15
  416. package/src/utils/getColor.ts +42 -36
  417. package/src/utils/getIconProps.ts +58 -0
  418. package/src/utils/getTooltipProps.ts +59 -0
  419. package/src/utils/index.ts +23 -17
  420. package/src/utils/nodeCheck.ts +4 -8
  421. package/css/flags.rect.css +0 -1607
  422. package/css/flags.wavy.css +0 -1606
  423. package/css/index.js +0 -250
  424. package/css/tailwind/colors.ts +0 -158
  425. package/dist/cjs/components/actionLabel/ActionLabel.module.css +0 -1
  426. package/dist/cjs/components/animations/Animations.js +0 -142
  427. package/dist/cjs/components/animations/Animations.module.css +0 -1
  428. package/dist/cjs/components/avatar/Avatar.module.css +0 -1
  429. package/dist/cjs/components/badge/Badge.module.css +0 -1
  430. package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +0 -71
  431. package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  432. package/dist/cjs/components/button/Button.module.css +0 -1
  433. package/dist/cjs/components/card/Card.module.css +0 -1
  434. package/dist/cjs/components/chip/Chip.module.css +0 -1
  435. package/dist/cjs/components/collapsable/Collapsable.module.css +0 -1
  436. package/dist/cjs/components/dropdown/Dropdown.module.css +0 -1
  437. package/dist/cjs/components/icon/Icon.module.css +0 -1
  438. package/dist/cjs/components/media/Media.module.css +0 -1
  439. package/dist/cjs/components/menu/Menu.module.css +0 -1
  440. package/dist/cjs/components/meter/Meter.module.css +0 -1
  441. package/dist/cjs/components/panel/Panel.module.css +0 -1
  442. package/dist/cjs/components/progress/Progress.module.css +0 -1
  443. package/dist/cjs/components/tabpanel/TabPanel.module.css +0 -1
  444. package/dist/cjs/context/NotificationCenter.js +0 -254
  445. package/dist/cjs/core/aside/Aside.module.css +0 -1
  446. package/dist/cjs/core/boundary/ErrorBoundary.module.css +0 -1
  447. package/dist/cjs/core/content/Content.module.css +0 -1
  448. package/dist/cjs/core/headfoot/HeadFoot.module.css +0 -1
  449. package/dist/cjs/core/page/Page.js +0 -66
  450. package/dist/cjs/core/page/Page.module.css +0 -1
  451. package/dist/cjs/core/responsive/Responsive.module.css +0 -1
  452. package/dist/cjs/core/section/Section.module.css +0 -1
  453. package/dist/cjs/core/theme/Theme.module.css +0 -1
  454. package/dist/cjs/core/viewport/Viewport.module.css +0 -1
  455. package/dist/cjs/hotkeys/HotKey.js +0 -47
  456. package/dist/cjs/hotkeys/HotKeyLabel.js +0 -52
  457. package/dist/cjs/hotkeys/HotKeyWrapper.js +0 -98
  458. package/dist/cjs/hotkeys/commons.js +0 -56
  459. package/dist/cjs/overlays/alert/Alert.module.css +0 -1
  460. package/dist/cjs/overlays/flyout/Flyout.js +0 -152
  461. package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
  462. package/dist/cjs/overlays/message/Message.js +0 -84
  463. package/dist/cjs/overlays/message/Message.module.css +0 -1
  464. package/dist/cjs/overlays/modal/Modal.js +0 -132
  465. package/dist/cjs/overlays/modal/Modal.module.css +0 -1
  466. package/dist/cjs/overlays/toast/Toast.js +0 -166
  467. package/dist/cjs/overlays/toast/Toast.module.css +0 -1
  468. package/dist/cjs/overlays/tooltip/Tooltip.js +0 -133
  469. package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
  470. package/dist/cjs/types/icons.js +0 -200
  471. package/dist/cjs/typography/Link.js +0 -55
  472. package/dist/cjs/typography/Typography.module.css +0 -1
  473. package/dist/cjs/typography/types.js +0 -42
  474. package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
  475. package/dist/esm/components/animations/Animations.js +0 -138
  476. package/dist/esm/components/animations/Animations.module.css +0 -1
  477. package/dist/esm/components/avatar/Avatar.module.css +0 -1
  478. package/dist/esm/components/badge/Badge.module.css +0 -1
  479. package/dist/esm/components/breadcrumbs/Breadcrumbs.js +0 -71
  480. package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  481. package/dist/esm/components/button/Button.module.css +0 -1
  482. package/dist/esm/components/card/Card.module.css +0 -1
  483. package/dist/esm/components/chip/Chip.module.css +0 -1
  484. package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
  485. package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
  486. package/dist/esm/components/icon/Icon.module.css +0 -1
  487. package/dist/esm/components/media/Media.module.css +0 -1
  488. package/dist/esm/components/menu/Menu.module.css +0 -1
  489. package/dist/esm/components/meter/Meter.module.css +0 -1
  490. package/dist/esm/components/panel/Panel.module.css +0 -1
  491. package/dist/esm/components/progress/Progress.module.css +0 -1
  492. package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
  493. package/dist/esm/context/NotificationCenter.js +0 -254
  494. package/dist/esm/core/aside/Aside.module.css +0 -1
  495. package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
  496. package/dist/esm/core/content/Content.module.css +0 -1
  497. package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
  498. package/dist/esm/core/page/Page.js +0 -66
  499. package/dist/esm/core/page/Page.module.css +0 -1
  500. package/dist/esm/core/responsive/Responsive.module.css +0 -1
  501. package/dist/esm/core/section/Section.module.css +0 -1
  502. package/dist/esm/core/theme/Theme.module.css +0 -1
  503. package/dist/esm/core/viewport/Viewport.module.css +0 -1
  504. package/dist/esm/hotkeys/HotKey.js +0 -47
  505. package/dist/esm/hotkeys/HotKeyLabel.js +0 -52
  506. package/dist/esm/hotkeys/HotKeyWrapper.js +0 -96
  507. package/dist/esm/hotkeys/commons.js +0 -56
  508. package/dist/esm/overlays/alert/Alert.module.css +0 -1
  509. package/dist/esm/overlays/flyout/Flyout.js +0 -152
  510. package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
  511. package/dist/esm/overlays/message/Message.js +0 -84
  512. package/dist/esm/overlays/message/Message.module.css +0 -1
  513. package/dist/esm/overlays/modal/Modal.js +0 -132
  514. package/dist/esm/overlays/modal/Modal.module.css +0 -1
  515. package/dist/esm/overlays/toast/Toast.js +0 -166
  516. package/dist/esm/overlays/toast/Toast.module.css +0 -1
  517. package/dist/esm/overlays/tooltip/Tooltip.js +0 -132
  518. package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
  519. package/dist/esm/types/icons.js +0 -202
  520. package/dist/esm/typography/Link.js +0 -55
  521. package/dist/esm/typography/Typography.module.css +0 -1
  522. package/dist/esm/typography/types.js +0 -41
  523. package/dist/types/components/animations/Animations.d.ts +0 -23
  524. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +0 -17
  525. package/dist/types/components/index.d.ts +0 -33
  526. package/dist/types/context/NotificationCenter.d.ts +0 -11
  527. package/dist/types/core/index.d.ts +0 -9
  528. package/dist/types/core/page/Page.d.ts +0 -23
  529. package/dist/types/core/section/Section.d.ts +0 -7
  530. package/dist/types/hotkeys/HotKey.d.ts +0 -2
  531. package/dist/types/hotkeys/HotKeyLabel.d.ts +0 -2
  532. package/dist/types/hotkeys/HotKeyWrapper.d.ts +0 -11
  533. package/dist/types/hotkeys/commons.d.ts +0 -28
  534. package/dist/types/overlays/alert/Alert.d.ts +0 -41
  535. package/dist/types/overlays/flyout/Flyout.d.ts +0 -57
  536. package/dist/types/overlays/index.d.ts +0 -6
  537. package/dist/types/overlays/message/Message.d.ts +0 -21
  538. package/dist/types/overlays/modal/Modal.d.ts +0 -53
  539. package/dist/types/overlays/toast/Toast.d.ts +0 -33
  540. package/dist/types/overlays/tooltip/Tooltip.d.ts +0 -18
  541. package/dist/types/types/icons.d.ts +0 -197
  542. package/dist/types/typography/Link.d.ts +0 -25
  543. package/dist/types/typography/index.d.ts +0 -6
  544. package/src/components/animations/Animations.module.css +0 -253
  545. package/src/components/animations/Animations.tsx +0 -196
  546. package/src/components/avatar/Avatar.module.css +0 -90
  547. package/src/components/badge/Badge.module.css +0 -165
  548. package/src/components/breadcrumbs/Breadcrumbs.module.css +0 -189
  549. package/src/components/breadcrumbs/Breadcrumbs.tsx +0 -109
  550. package/src/components/button/Button.module.css +0 -375
  551. package/src/components/card/Card.module.css +0 -152
  552. package/src/components/chip/Chip.module.css +0 -118
  553. package/src/components/collapsable/Collapsable.module.css +0 -30
  554. package/src/components/icon/Icon.module.css +0 -71
  555. package/src/components/index.ts +0 -62
  556. package/src/components/media/Media.module.css +0 -112
  557. package/src/context/NotificationCenter.tsx +0 -223
  558. package/src/core/aside/Aside.module.css +0 -231
  559. package/src/core/boundary/ErrorBoundary.module.css +0 -65
  560. package/src/core/headfoot/HeadFoot.module.css +0 -38
  561. package/src/core/index.ts +0 -32
  562. package/src/core/page/Page.module.css +0 -46
  563. package/src/core/page/Page.tsx +0 -101
  564. package/src/core/responsive/Responsive.module.css +0 -85
  565. package/src/core/section/Section.module.css +0 -28
  566. package/src/core/section/Section.tsx +0 -54
  567. package/src/core/theme/Theme.module.css +0 -30
  568. package/src/core/viewport/Viewport.module.css +0 -32
  569. package/src/hooks/useControlledValue.tsx +0 -43
  570. package/src/hotkeys/HotKey.tsx +0 -39
  571. package/src/hotkeys/HotKeyLabel.tsx +0 -61
  572. package/src/hotkeys/HotKeyWrapper.tsx +0 -137
  573. package/src/hotkeys/commons.ts +0 -74
  574. package/src/overlays/alert/Alert.tsx +0 -252
  575. package/src/overlays/flyout/Flyout.tsx +0 -283
  576. package/src/overlays/index.ts +0 -29
  577. package/src/overlays/message/Message.tsx +0 -107
  578. package/src/overlays/modal/Modal.tsx +0 -244
  579. package/src/overlays/toast/Toast.module.css +0 -37
  580. package/src/overlays/toast/Toast.tsx +0 -216
  581. package/src/overlays/tooltip/Tooltip.module.css +0 -53
  582. package/src/overlays/tooltip/Tooltip.tsx +0 -200
  583. package/src/types/icons.ts +0 -426
  584. package/src/typography/Link.tsx +0 -113
  585. package/src/typography/Typography.module.css +0 -68
  586. package/src/typography/index.ts +0 -29
  587. /package/dist/cjs/i18n/{ar.json.js → ar/core.json.js} +0 -0
  588. /package/dist/cjs/i18n/{en.json.js → en/core.json.js} +0 -0
  589. /package/dist/esm/i18n/{ar.json.js → ar/core.json.js} +0 -0
  590. /package/dist/esm/i18n/{en.json.js → en/core.json.js} +0 -0
  591. /package/src/i18n/{ar.json → ar/core.json} +0 -0
  592. /package/src/i18n/{en.json → en/core.json} +0 -0
@@ -45,33 +45,32 @@ import {
45
45
  useRole,
46
46
  useTypeahead,
47
47
  } from "@floating-ui/react";
48
- import { mergeRefs } from "@react-fabric/utilities";
49
- import classNames from "classnames";
50
- import {
51
- Children,
52
- cloneElement,
53
- Fragment,
54
- useCallback,
55
- useEffect,
56
- useRef,
57
- useState,
58
- } from "react";
59
- import { CoreIcons } from "../../types/icons";
60
- import { nodeCheck } from "../../utils";
48
+ import { cn, mergeRefs } from "@react-fabric/utilities";
49
+ import { cloneElement, Fragment, isValidElement, useEffect, useRef, useState } from "react";
50
+ import { cloneChildren, nodeCheck } from "../../utils";
61
51
  import { MenuItem } from "./MenuItem";
62
- import { type MenuProps } from "./types";
52
+ import type { MenuItemProps, MenuProps } from "./types";
63
53
 
64
54
  // FIXME: refactor menu implementation to differentiate between static and floating menus, implement context wrapper for each menu level
65
55
 
66
- const MenuComponent = ({
56
+ function MenuComponent({
67
57
  children,
68
58
  minimal,
69
- menuClassName,
59
+ className,
60
+ forDropdown,
70
61
  onClick,
71
62
  // @ts-expect-error ignore
63
+ trigger = "hover",
64
+ // @ts-expect-error ignore
72
65
  ref,
66
+ // @ts-expect-error ignore
67
+ onMouseUp,
68
+ // @ts-expect-error ignore
69
+ onMouseDown,
70
+ // @ts-expect-error ignore
71
+ style,
73
72
  ...rest
74
- }: Partial<MenuProps>) => {
73
+ }: Partial<MenuProps>) {
75
74
  const [isOpen, setIsOpen] = useState(false);
76
75
  const [activeIndex, setActiveIndex] = useState<number | null>(null);
77
76
 
@@ -82,30 +81,29 @@ const MenuComponent = ({
82
81
  const nodeId = useFloatingNodeId();
83
82
  const parentId = useFloatingParentNodeId();
84
83
 
85
- const isNested = parentId !== null;
84
+ const isNested = parentId !== null && !forDropdown;
86
85
 
87
86
  const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({
88
- nodeId,
87
+ nodeId: `menu-${nodeId}`,
89
88
  open: !isNested || isOpen,
90
89
  onOpenChange(open, event, reason) {
91
- isNested && setIsOpen(open);
90
+ if (isNested) setIsOpen(open);
91
+ if (reason === "outside-press" && trigger === "click") tree?.events.emit("close");
92
92
  },
93
93
  placement: isNested ? "right-start" : "bottom-start",
94
- middleware: [
95
- offset({ mainAxis: isNested ? 0 : 4, alignmentAxis: isNested ? -4 : 0 }),
96
- flip(),
97
- shift(),
98
- ],
94
+ middleware: [offset({ mainAxis: isNested ? 0 : 4, alignmentAxis: isNested ? -4 : 0 }), flip(), shift()],
99
95
  whileElementsMounted: autoUpdate,
100
96
  });
101
97
 
102
98
  const hover = useHover(context, {
99
+ enabled: trigger === "hover",
103
100
  delay: { open: 75 },
104
101
  handleClose: safePolygon({ blockPointerEvents: true }),
105
102
  });
106
103
  const click = useClick(context, {
107
- toggle: true,
108
- ignoreMouse: true,
104
+ event: "mousedown",
105
+ toggle: trigger === "click" || !isNested,
106
+ ignoreMouse: trigger === "hover" && !isNested,
109
107
  });
110
108
  const role = useRole(context, { role: "menu" });
111
109
  const dismiss = useDismiss(context, { bubbles: true });
@@ -121,9 +119,14 @@ const MenuComponent = ({
121
119
  activeIndex,
122
120
  });
123
121
 
124
- const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(
125
- [click, hover, role, dismiss, listNavigation, typeahead],
126
- );
122
+ const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([
123
+ click,
124
+ hover,
125
+ role,
126
+ dismiss,
127
+ listNavigation,
128
+ typeahead,
129
+ ]);
127
130
 
128
131
  // Event emitter allows you to communicate across tree components.
129
132
  // This effect closes all menus when an item gets clicked anywhere
@@ -158,92 +161,100 @@ const MenuComponent = ({
158
161
  }
159
162
  }, [tree, isOpen, nodeId, parentId]);
160
163
 
161
- const handleClick = useCallback(
162
- (e: React.MouseEvent) => {
163
- const el = e.target as HTMLElement;
164
- if (el.dataset.id) {
165
- onClick?.(el.dataset.id as AnyObject);
166
- }
167
- },
168
- [onClick],
169
- );
164
+ const handleClick = (e: React.MouseEvent) => {
165
+ const el = e.target as HTMLElement;
166
+ if (el.dataset.id) {
167
+ onClick?.(el.dataset.id);
168
+ }
169
+ };
170
170
 
171
171
  const Wrapper = isNested ? FloatingPortal : Fragment;
172
172
  const wrapperProps = isNested
173
173
  ? {
174
- root:
175
- refs.domReference.current?.closest<HTMLElement>(".theme-base") ??
176
- undefined,
174
+ root: refs.domReference.current?.closest<HTMLElement>(".theme-base") ?? undefined,
177
175
  }
178
176
  : {};
179
177
 
180
178
  useEffect(() => {
181
- setTimeout(
182
- () =>
183
- refs.floating.current
184
- ?.querySelector(`[data-active="true"]`)
185
- ?.scrollIntoView({ block: "nearest" }),
186
- 100,
187
- );
188
- }, [isOpen]);
179
+ const tmr = setTimeout(() => {
180
+ elementsRef.current[0]?.focus();
181
+ refs.floating.current?.querySelector(`[data-active="true"]`)?.scrollIntoView({ block: "nearest" });
182
+ }, 100);
183
+ return () => {
184
+ clearTimeout(tmr);
185
+ };
186
+ }, [isOpen, refs.floating]);
187
+
188
+ useEffect(() => {
189
+ if ((!isNested || isOpen) && activeIndex) {
190
+ const tmr = setTimeout(() => {
191
+ elementsRef.current[activeIndex]?.scrollIntoView({
192
+ block: "nearest",
193
+ });
194
+ }, 100);
195
+ return () => {
196
+ clearTimeout(tmr);
197
+ };
198
+ }
199
+ }, [isOpen, activeIndex, isNested]);
189
200
 
190
201
  return (
191
202
  <FloatingNode id={nodeId}>
192
203
  {isNested && (
193
204
  <MenuItem
194
- {...(getReferenceProps({
205
+ {...getReferenceProps({
195
206
  ...rest,
196
207
  id: undefined,
208
+ // @ts-expect-error ignore
197
209
  "data-dropdown-dismiss": false,
198
- onClick: (e: AnyObject) => {
210
+ onClick: (e: React.MouseEvent) => {
199
211
  e.stopPropagation();
200
212
  return false;
201
213
  },
202
- } as AnyObject) as AnyObject)}
214
+ })}
203
215
  data-open={isOpen}
216
+ // @ts-expect-error ignore
204
217
  minimal={minimal}
205
- altIcon={CoreIcons.chevronRight}
206
- ref={mergeRefs(refs.setReference, ref)}
218
+ altIcon="icon-[mdi--menu-right]"
219
+ ref={mergeRefs(refs.reference, ref)}
207
220
  />
208
221
  )}
209
222
  <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>
210
223
  {(!isNested || isOpen) && (
211
224
  <Wrapper {...wrapperProps}>
212
225
  {isNested && <FloatingOverlay />}
213
- <FloatingFocusManager
214
- context={context}
215
- modal={!isNested}
216
- initialFocus={isNested ? -1 : 0}
217
- returnFocus={!isNested}
218
- >
226
+ <FloatingFocusManager context={context} closeOnFocusOut initialFocus={isNested ? -1 : 0} returnFocus={!isNested}>
219
227
  <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)]",
228
+ className={cn(
229
+ className,
230
+ "flex flex-col p-1 menu-list",
231
+ isNested && "outline shadow-lg rounded-capped max-h-[60vh] overflow-auto scroll-thin z-(--z-popover)",
225
232
  )}
226
- autoFocus
227
- ref={mergeRefs(isNested ? refs.setFloating : ref)}
233
+ ref={mergeRefs(isNested ? refs.floating : ref)}
228
234
  {...getFloatingProps({
229
235
  onClick: isNested ? undefined : handleClick,
236
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
237
+ onMouseDown,
238
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
239
+ onMouseUp,
230
240
  })}
231
- // @ts-expect-error ignore
232
- {...{ style: !isNested ? rest.style : floatingStyles }}
241
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
242
+ {...{ style: !isNested ? style : floatingStyles }}
233
243
  >
234
- {Children.map(children, (child: AnyObject, index) => {
235
- if (child) {
236
- labelsRef.current[index] = child.props.label;
244
+ {cloneChildren(children)?.map((child, index) => {
245
+ if (isValidElement(child)) {
246
+ const childEl = child as React.ReactElement<MenuItemProps>;
247
+ labelsRef.current[index] = childEl.props.label;
237
248
  return cloneElement(
238
- child,
249
+ childEl,
239
250
  nodeCheck(child, MenuItem, Menu, MenuComponent)
240
251
  ? {
252
+ // @ts-expect-error ignore
241
253
  minimal: !isNested && minimal,
242
254
  "data-focus": activeIndex === index,
243
- ref: (el: HTMLElement) =>
244
- (elementsRef.current[index] = el),
255
+ ref: (el: HTMLElement) => (elementsRef.current[index] = el),
245
256
  ...getItemProps({
246
- onClick: child.props.onClick,
257
+ onClick: childEl.props.onClick,
247
258
  tabIndex: activeIndex === index ? 0 : -1,
248
259
  }),
249
260
  }
@@ -258,21 +269,47 @@ const MenuComponent = ({
258
269
  </FloatingList>
259
270
  </FloatingNode>
260
271
  );
261
- };
272
+ }
262
273
 
263
- export const Menu = (props: MenuProps) => {
274
+ /**
275
+ * A component that displays a menu with items, supports nested menus and various interactions.
276
+ * It can be triggered by hover or click events, and allows for custom styling and behavior.
277
+ * This component is designed to be used within a Floating UI context, allowing for dynamic positioning and interaction handling.
278
+ * It can be nested within other menus to create complex menu structures.
279
+ *
280
+ * @example
281
+ * ```jsx
282
+ * <Menu
283
+ * className="my-menu"
284
+ * trigger="click"
285
+ * onClick={(id) => console.log(`Clicked item with id: ${id}`)}
286
+ * >
287
+ * <MenuItem id="item1" label="Item 1" />
288
+ * <MenuItem id="item2" label="Item 2" />
289
+ * <MenuItem id="item3" label="Item 3">
290
+ * <Menu>
291
+ * <MenuItem id="subitem1" label="Sub Item 1" />
292
+ * <MenuItem id="subitem2" label="Sub Item 2" />
293
+ * </Menu>
294
+ * </MenuItem>
295
+ * </Menu>
296
+ * ```
297
+ */
298
+ export function Menu(props: MenuProps) {
264
299
  const parentId = useFloatingParentNodeId();
300
+ const tree = useFloatingTree();
301
+
302
+ if (tree) {
303
+ return <MenuComponent {...props} />;
304
+ }
265
305
 
266
306
  if (parentId === null) {
267
307
  return (
268
308
  <FloatingTree>
269
- <MenuComponent
270
- {...(props as AnyObject)}
271
- menuClassName={props.className}
272
- />
309
+ <MenuComponent {...props} />
273
310
  </FloatingTree>
274
311
  );
275
312
  }
276
313
 
277
314
  return <MenuComponent {...props} />;
278
- };
315
+ }
@@ -22,27 +22,62 @@
22
22
  */
23
23
 
24
24
  import { useFloatingTree } from "@floating-ui/react";
25
- import { iconToken } from "@react-fabric/utilities";
26
- import classNames from "classnames";
27
- import { Fragment, useCallback, useMemo } from "react";
28
- import { HotKeyLabel } from "../../hotkeys/HotKeyLabel";
29
- import { Tooltip } from "../../overlays";
30
- import { type PolymorphicProps } from "../../types";
31
- import { Badge, getBadgeProps } from "../badge/Badge";
25
+ import { cn, EMPTY_ARRAY, iconToken, mergeRefs } from "@react-fabric/utilities";
26
+ import { useHotkeySequence } from "@tanstack/react-hotkeys";
27
+ import { Fragment, useEffect, useMemo, useRef } from "react";
28
+ import type { PolymorphicProps } from "../../types";
29
+ import { Kbd } from "../../typography/Kbd";
30
+ import { getBadgeProps, getIconProps } from "../../utils";
31
+ import { Badge } from "../badge/Badge";
32
32
  import { Icon } from "../icon/Icon";
33
- import classes from "./Menu.module.css";
34
- import { type MenuItemProps } from "./types";
33
+ import { Tooltip } from "../tooltip/Tooltip";
34
+ import type { MenuItemProps } from "./types";
35
35
 
36
- export const MenuItem = <Tag extends React.ElementType = "button">({
36
+ function Wrapper({
37
+ children,
38
+ minimal,
39
+ label,
40
+ childOpen,
41
+ ...rest
42
+ }: {
43
+ label?: string;
44
+ minimal?: boolean;
45
+ childOpen?: boolean;
46
+ children: React.ReactElement<KeyValue>;
47
+ }) {
48
+ return minimal ? (
49
+ <Tooltip content={label} placement="right" disabled={childOpen} {...rest}>
50
+ {children}
51
+ </Tooltip>
52
+ ) : (
53
+ <Fragment>{children}</Fragment>
54
+ );
55
+ }
56
+
57
+ /**
58
+ * A menu item component that can be used in a dropdown or menu.
59
+ * It supports various features such as icons, badges, hotkeys, and more.
60
+ * It can be customized with different colors, icons, and behaviors.
61
+ *
62
+ * @example
63
+ * ```jsx
64
+ * <MenuItem
65
+ * label="Settings"
66
+ * icon="settings"
67
+ * onClick={() => console.log("Settings clicked")}
68
+ * hotKey="Ctrl+S"
69
+ * badge={{ count: 3, color: "red" }}
70
+ * />
71
+ * ```
72
+ */
73
+ export function MenuItem<Tag extends React.ElementType = "button">({
37
74
  as,
38
75
  label,
39
76
  color = "primary",
40
77
  className,
41
78
  icon,
42
- iconBg,
43
- iconColor,
79
+ labelRender,
44
80
  appendLabel,
45
- rtlFlip,
46
81
  altIcon,
47
82
  id,
48
83
  active,
@@ -50,65 +85,43 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
50
85
  onClick,
51
86
  badge,
52
87
  hotKey,
88
+ tabIndex = -1,
53
89
  // @ts-expect-error ignore
54
- minimal,
90
+ minimal = false,
55
91
  // @ts-expect-error ignore
56
92
  "data-open": childOpen,
57
93
  // @ts-expect-error ignore
58
94
  ref,
59
95
  ...aria
60
- }: MenuItemProps & PolymorphicProps<Tag>) => {
96
+ }: MenuItemProps & PolymorphicProps<Tag>) {
97
+ const elRef = useRef<HTMLElement>(null);
61
98
  const tree = useFloatingTree();
62
99
  const badgeProps = useMemo(() => {
63
100
  return getBadgeProps(badge);
64
101
  }, [badge]);
65
102
 
103
+ useEffect(() => {
104
+ if (tabIndex === 0) elRef.current?.focus();
105
+ }, [tabIndex]);
106
+
66
107
  const iconEl = useMemo(() => {
67
108
  let path = icon;
68
109
  if (minimal && !path) {
69
110
  path = iconToken(label);
70
111
  }
71
- return (
72
- <Icon
73
- className={classNames(classes.menuIcon, minimal && classes.minimal)}
74
- icon={path ?? ""}
75
- bg={iconBg}
76
- color={iconColor}
77
- rtlFlip={rtlFlip}
78
- />
79
- );
80
- }, [icon, iconBg, iconColor, rtlFlip, minimal, label]);
81
-
82
- const Wrapper = useCallback(
83
- ({ children, ...rest }: AnyObject) => {
84
- return minimal ? (
85
- <Tooltip
86
- content={label}
87
- placement="right"
88
- disabled={childOpen}
89
- {...rest}
90
- >
91
- {children}
92
- </Tooltip>
93
- ) : (
94
- <Fragment>{children}</Fragment>
95
- );
96
- },
97
- [minimal, label, childOpen],
98
- );
112
+ return <Icon className={cn("fabric-menuIcon", !!minimal && "minimal")} {...getIconProps(path ?? "")} />;
113
+ }, [icon, minimal, label]);
99
114
 
100
115
  const menuLabel = useMemo(() => {
101
116
  return (
102
117
  <div className="flex flex-nowrap text-start items-center">
103
118
  {iconEl}
104
- {!minimal && (
105
- <label className="flex-1 pe-4 py-[0.375em] truncate">{label}</label>
106
- )}
119
+ {!minimal && <label className="flex-1 pe-4 py-[0.375em] truncate">{labelRender ?? label}</label>}
107
120
  {appendLabel && (
108
121
  <span
109
- className={classNames(
122
+ className={cn(
110
123
  "font-bold whitespace-nowrap text-center leading-none mx-1",
111
- minimal && "absolute inset-x-0 bottom-0 overflow-clip",
124
+ !!minimal && "absolute inset-x-0 bottom-0 overflow-clip",
112
125
  minimal ? "text-[0.5rem]" : "text-[0.625rem]",
113
126
  active ? "text-white/50" : "text-tint-600/50",
114
127
  )}
@@ -117,41 +130,46 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
117
130
  </span>
118
131
  )}
119
132
  {badge && (
120
- <Badge
121
- {...badgeProps}
122
- placement={minimal ? "end" : ""}
123
- className={classNames("me-1", badgeProps.className)}
124
- />
125
- )}
126
- {hotKey && <HotKeyLabel keyCombo={hotKey} />}
127
- {!minimal && altIcon && (
128
- <Icon className="text-muted px-1" icon={altIcon} rtlFlip />
133
+ <Badge {...(badgeProps as AnyObject)} inline={!minimal} placement={minimal ? "end" : undefined} className="mx-1" />
129
134
  )}
135
+ {hotKey && <Kbd keys={hotKey} />}
136
+ {!minimal && altIcon && <Icon className="text-muted px-1" icon={altIcon} rtlFlip />}
130
137
  </div>
131
138
  );
132
- }, [iconEl, minimal, appendLabel, label, badge, badgeProps, hotKey, active]);
139
+ }, [iconEl, minimal, labelRender, label, appendLabel, active, badge, badgeProps, hotKey, altIcon]);
140
+
141
+ useHotkeySequence(
142
+ hotKey ? [hotKey].flat() : EMPTY_ARRAY,
143
+ () => {
144
+ void elRef.current?.click?.();
145
+ },
146
+ {
147
+ enabled: !disabled,
148
+ },
149
+ );
133
150
 
134
151
  const E = as ?? "button";
135
152
  return (
136
- <Wrapper {...aria}>
153
+ <Wrapper {...aria} childOpen={!!childOpen} label={label} minimal={!!minimal}>
137
154
  <E
138
- ref={ref}
155
+ ref={mergeRefs(ref, elRef)}
139
156
  data-dropdown-dismiss
140
157
  data-color={color}
141
- className={classNames(
142
- classes.menuItem,
158
+ className={cn(
159
+ "fabric-menuItem cursor-pointer outline-none",
143
160
  className,
144
- active && classes.active,
145
- minimal && classes.minimal,
146
- disabled && classes.disabled,
147
- "rounded-capped relative max-w-[50vw] my-0.5",
161
+ active && "active",
162
+ !!minimal && "minimal",
163
+ disabled && "disabled",
164
+ "rounded relative max-w-[50vw]",
148
165
  )}
149
166
  data-active={active}
150
- data-open={childOpen}
167
+ data-open={!!childOpen}
151
168
  disabled={disabled}
152
169
  data-id={id}
170
+ tabIndex={tabIndex}
153
171
  onClick={(e) => {
154
- onClick?.(e) !== false && tree?.events.emit("click");
172
+ if (onClick?.(e) !== false) tree?.events.emit("click");
155
173
  }}
156
174
  {...(minimal ? {} : aria)}
157
175
  >
@@ -159,4 +177,4 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
159
177
  </E>
160
178
  </Wrapper>
161
179
  );
162
- };
180
+ }
@@ -21,23 +21,12 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { type ElementType, type MouseEvent } from "react";
25
- import {
26
- type AriaProps,
27
- type BadgeType,
28
- type CallbackReturn,
29
- type ChildrenProp,
30
- type ColorType,
31
- type CssProp,
32
- type IconProps,
33
- type TestProps,
34
- } from "../../types";
24
+ import type { Hotkey } from "@tanstack/react-hotkeys";
25
+ import type { CallbackReturn, ChildrenProp, ColorBase, CssProp, TestProps } from "../../types";
26
+ import type { BadgeType } from "../badge/Badge";
27
+ import type { IconProps } from "../icon/Icon";
35
28
 
36
- export interface MenuItemProps
37
- extends CssProp,
38
- AriaProps,
39
- TestProps,
40
- IconProps {
29
+ export interface MenuItemProps extends CssProp, TestProps {
41
30
  /**
42
31
  * menu id passed via menu.onClick
43
32
  */
@@ -46,14 +35,19 @@ export interface MenuItemProps
46
35
  * item label
47
36
  */
48
37
  label: string;
38
+ labelRender?: React.ReactElement;
49
39
  /**
50
40
  * append label badge text
51
41
  */
52
- appendLabel?: string | false;
42
+ appendLabel?: React.ReactElement | string | number | false;
53
43
  /**
54
44
  * menu color
55
45
  */
56
- color?: ColorType;
46
+ color?: ColorBase;
47
+ /**
48
+ * icon path or props
49
+ */
50
+ icon?: IconProps;
57
51
  /**
58
52
  * item active
59
53
  */
@@ -69,7 +63,7 @@ export interface MenuItemProps
69
63
  /**
70
64
  * keyboard shortcut label
71
65
  */
72
- hotKey?: string;
66
+ hotKey?: Hotkey | Hotkey[];
73
67
  /**
74
68
  * alternate icon align end (caret, arrow)
75
69
  */
@@ -77,24 +71,25 @@ export interface MenuItemProps
77
71
  /**
78
72
  * click handler
79
73
  */
80
- onClick?: (e: MouseEvent) => CallbackReturn;
74
+ onClick?: (e: React.MouseEvent) => CallbackReturn;
81
75
  }
82
76
 
83
77
  export interface MenuRootProps extends CssProp {
84
78
  label?: never;
85
79
  minimal?: boolean;
86
- menuClassName?: never;
80
+ /**
81
+ * use this create a dropdown button within menu-item
82
+ */
83
+ forDropdown?: boolean;
87
84
  onClick?: (id: string) => CallbackReturn;
88
85
  }
89
86
 
90
- export interface MenuInnerProps extends MenuItemProps {
87
+ export interface MenuInnerProps extends Omit<MenuItemProps, "onClick"> {
91
88
  label: string;
92
89
  minimal?: never;
93
- /**
94
- * floating menu className
95
- */
96
- menuClassName?: string;
90
+ trigger?: "hover" | "click";
91
+ forDropdown?: boolean;
92
+ onClick?: (id: string) => CallbackReturn;
97
93
  }
98
94
 
99
- export type MenuProps = ChildrenProp<ElementType<MenuItemProps>> &
100
- (MenuRootProps | MenuInnerProps);
95
+ export type MenuProps = ChildrenProp<MenuItemProps> & (MenuRootProps | MenuInnerProps);