@react-fabric/core 1.0.0-beta.6 → 1.0.0-beta.60

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 (425) 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} +52 -47
  7. package/{src/components/button/Button.module.css → css/components/_button.css} +77 -83
  8. package/{src/components/card/Card.module.css → css/components/_card.css} +54 -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} +11 -8
  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} +21 -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/css/components/_stepper.css +86 -0
  23. package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +130 -85
  24. package/{src/overlays/toast/Toast.module.css → css/components/_toast.css} +2 -2
  25. package/css/components/_tooltip.css +29 -0
  26. package/{src/core/content/Content.module.css → css/components/index.css} +26 -18
  27. package/{src/core/aside/Aside.module.css → css/core/_aside.css} +60 -48
  28. package/{src/core/section/Section.module.css → css/core/_content.css} +5 -3
  29. package/{src/core/boundary/ErrorBoundary.module.css → css/core/_errorboundary.css} +9 -9
  30. package/{src/core/headfoot/HeadFoot.module.css → css/core/_headfoot.css} +4 -10
  31. package/{src/core/page/Page.module.css → css/core/_page.css} +10 -14
  32. package/{src/core/responsive/Responsive.module.css → css/core/_responsive.css} +10 -10
  33. package/css/core/_section.css +28 -0
  34. package/{src/core/theme/Theme.module.css → css/core/_theme.css} +3 -3
  35. package/{src/typography/Typography.module.css → css/core/_typography.css} +14 -12
  36. package/{src/core/viewport/Viewport.module.css → css/core/_viewport.css} +7 -3
  37. package/css/core/index.css +33 -0
  38. package/css/reset/_gradients.css +8 -8
  39. package/css/reset/_reset.css +56 -224
  40. package/css/reset/_text.css +14 -29
  41. package/css/reset/_theme.css +331 -52
  42. package/css/reset/index.css +4 -4
  43. package/css/styles.css +7 -6
  44. package/css/theme/_colors.css +320 -0
  45. package/css/theme/_utilities.css +541 -0
  46. package/css/theme/index.css +45 -0
  47. package/dist/cjs/components/actionLabel/ActionLabel.js +26 -8
  48. package/dist/cjs/components/animations/Animations.js +110 -23
  49. package/dist/cjs/components/avatar/Avatar.js +46 -13
  50. package/dist/cjs/components/avatar/AvatarGroup.js +22 -4
  51. package/dist/cjs/components/badge/Badge.js +36 -15
  52. package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +40 -9
  53. package/dist/cjs/components/button/Button.js +50 -28
  54. package/dist/cjs/components/button/ButtonGroup.js +30 -3
  55. package/dist/cjs/components/button/ConfirmButton.js +28 -2
  56. package/dist/cjs/components/button/ToggleButtonGroup.js +41 -15
  57. package/dist/cjs/components/callout/Callout.js +44 -4
  58. package/dist/cjs/components/card/Card.js +60 -18
  59. package/dist/cjs/components/card/CardCover.js +36 -5
  60. package/dist/cjs/components/card/FlipContent.js +56 -0
  61. package/dist/cjs/components/chip/Chip.js +40 -20
  62. package/dist/cjs/components/collapsable/Collapsable.js +30 -5
  63. package/dist/cjs/components/divider/Divider.js +30 -7
  64. package/dist/cjs/components/dropdown/Dropdown.js +48 -9
  65. package/dist/cjs/components/dropdown/DropdownTool.js +1 -1
  66. package/dist/cjs/components/empty/EmptyContent.js +37 -7
  67. package/dist/cjs/components/icon/Icon.js +76 -13
  68. package/dist/cjs/components/media/Media.js +172 -75
  69. package/dist/cjs/components/menu/ContextMenu.js +19 -0
  70. package/dist/cjs/components/menu/Menu.js +76 -21
  71. package/dist/cjs/components/menu/MenuItem.js +54 -26
  72. package/dist/cjs/components/meter/Meter.js +26 -3
  73. package/dist/cjs/components/navigator/Navigator.js +48 -15
  74. package/dist/cjs/components/panel/Panel.js +53 -22
  75. package/dist/cjs/components/panel/PanelGroup.js +25 -2
  76. package/dist/cjs/components/panel/PanelStack.js +31 -2
  77. package/dist/cjs/components/progress/ProgressBar.js +31 -9
  78. package/dist/cjs/components/progress/ProgressCircle.js +29 -7
  79. package/dist/cjs/components/tabpanel/Tab.js +39 -15
  80. package/dist/cjs/components/tabpanel/TabPanel.js +56 -16
  81. package/dist/cjs/context/Global.js +28 -1
  82. package/dist/cjs/context/NotificationCenter.js +3 -3
  83. package/dist/cjs/core/aside/Aside.js +48 -22
  84. package/dist/cjs/core/boundary/ErrorBoundary.js +25 -8
  85. package/dist/cjs/core/boundary/ErrorIcon.js +1 -2
  86. package/dist/cjs/core/content/Content.js +7 -3
  87. package/dist/cjs/core/headfoot/HeadFoot.js +48 -22
  88. package/dist/cjs/core/page/Page.js +40 -39
  89. package/dist/cjs/core/responsive/Responsive.js +59 -6
  90. package/dist/cjs/core/section/Section.js +12 -29
  91. package/dist/cjs/core/theme/ThemeProvider.js +32 -10
  92. package/dist/cjs/core/viewport/Viewport.js +18 -2
  93. package/dist/cjs/hooks/useControlledValue.js +12 -0
  94. package/dist/cjs/hooks/useDebounce.js +14 -1
  95. package/dist/cjs/hooks/useEffectDebugger.js +54 -2
  96. package/dist/cjs/hooks/useIsDark.js +8 -0
  97. package/dist/cjs/hooks/useIsRtl.js +12 -0
  98. package/dist/cjs/hooks/useNavigator.js +6 -4
  99. package/dist/cjs/hooks/useOverlayService.js +24 -0
  100. package/dist/cjs/hooks/usePropToggle.js +16 -5
  101. package/dist/cjs/hooks/useResize.js +18 -0
  102. package/dist/cjs/hooks/useResizeObserver.js +20 -1
  103. package/dist/cjs/hooks/useStepper.js +75 -0
  104. package/dist/cjs/hooks/useStorage.js +39 -0
  105. package/dist/cjs/hotkeys/HotKeyLabel.js +1 -1
  106. package/dist/cjs/hotkeys/HotKeyWrapper.js +3 -1
  107. package/dist/cjs/index.js +11 -2
  108. package/dist/cjs/overlays/alert/Alert.js +23 -15
  109. package/dist/cjs/overlays/flyout/Flyout.js +48 -64
  110. package/dist/cjs/overlays/message/Message.js +8 -3
  111. package/dist/cjs/overlays/modal/Modal.js +17 -20
  112. package/dist/cjs/overlays/toast/Toast.js +20 -10
  113. package/dist/cjs/overlays/tooltip/Tooltip.js +24 -11
  114. package/dist/cjs/types/icons.js +17 -4
  115. package/dist/cjs/typography/Abbr.js +35 -7
  116. package/dist/cjs/typography/{Link.js → Anchor.js} +23 -5
  117. package/dist/cjs/typography/Mark.js +25 -5
  118. package/dist/cjs/typography/Text.js +30 -5
  119. package/dist/cjs/typography/Title.js +19 -4
  120. package/dist/cjs/utils/cloneElement.js +47 -0
  121. package/dist/cjs/utils/getColor.js +1 -18
  122. package/dist/esm/components/actionLabel/ActionLabel.js +26 -8
  123. package/dist/esm/components/animations/Animations.js +111 -24
  124. package/dist/esm/components/avatar/Avatar.js +46 -13
  125. package/dist/esm/components/avatar/AvatarGroup.js +22 -4
  126. package/dist/esm/components/badge/Badge.js +38 -17
  127. package/dist/esm/components/breadcrumbs/Breadcrumbs.js +40 -9
  128. package/dist/esm/components/button/Button.js +52 -30
  129. package/dist/esm/components/button/ButtonGroup.js +31 -4
  130. package/dist/esm/components/button/ConfirmButton.js +28 -2
  131. package/dist/esm/components/button/ToggleButtonGroup.js +42 -16
  132. package/dist/esm/components/callout/Callout.js +44 -4
  133. package/dist/esm/components/card/Card.js +61 -19
  134. package/dist/esm/components/card/CardCover.js +36 -5
  135. package/dist/esm/components/card/FlipContent.js +56 -0
  136. package/dist/esm/components/chip/Chip.js +42 -22
  137. package/dist/esm/components/collapsable/Collapsable.js +30 -5
  138. package/dist/esm/components/divider/Divider.js +31 -8
  139. package/dist/esm/components/dropdown/Dropdown.js +48 -9
  140. package/dist/esm/components/dropdown/DropdownTool.js +1 -1
  141. package/dist/esm/components/empty/EmptyContent.js +37 -7
  142. package/dist/esm/components/icon/Icon.js +78 -16
  143. package/dist/esm/components/media/Media.js +173 -76
  144. package/dist/esm/components/menu/ContextMenu.js +19 -0
  145. package/dist/esm/components/menu/Menu.js +78 -23
  146. package/dist/esm/components/menu/MenuItem.js +49 -21
  147. package/dist/esm/components/meter/Meter.js +26 -3
  148. package/dist/esm/components/navigator/Navigator.js +48 -15
  149. package/dist/esm/components/panel/Panel.js +54 -23
  150. package/dist/esm/components/panel/PanelGroup.js +25 -2
  151. package/dist/esm/components/panel/PanelStack.js +31 -2
  152. package/dist/esm/components/progress/ProgressBar.js +31 -9
  153. package/dist/esm/components/progress/ProgressCircle.js +29 -7
  154. package/dist/esm/components/tabpanel/Tab.js +40 -16
  155. package/dist/esm/components/tabpanel/TabPanel.js +56 -16
  156. package/dist/esm/context/Global.js +28 -1
  157. package/dist/esm/context/NotificationCenter.js +3 -3
  158. package/dist/esm/core/aside/Aside.js +49 -23
  159. package/dist/esm/core/boundary/ErrorBoundary.js +25 -8
  160. package/dist/esm/core/boundary/ErrorIcon.js +1 -2
  161. package/dist/esm/core/content/Content.js +7 -3
  162. package/dist/esm/core/headfoot/HeadFoot.js +48 -22
  163. package/dist/esm/core/page/Page.js +41 -40
  164. package/dist/esm/core/responsive/Responsive.js +59 -6
  165. package/dist/esm/core/section/Section.js +12 -29
  166. package/dist/esm/core/theme/ThemeProvider.js +32 -10
  167. package/dist/esm/core/viewport/Viewport.js +18 -2
  168. package/dist/esm/hooks/useControlledValue.js +12 -0
  169. package/dist/esm/hooks/useDebounce.js +14 -1
  170. package/dist/esm/hooks/useEffectDebugger.js +54 -2
  171. package/dist/esm/hooks/useIsDark.js +8 -0
  172. package/dist/esm/hooks/useIsRtl.js +12 -0
  173. package/dist/esm/hooks/useNavigator.js +7 -5
  174. package/dist/esm/hooks/useOverlayService.js +24 -0
  175. package/dist/esm/hooks/usePropToggle.js +16 -5
  176. package/dist/esm/hooks/useResize.js +18 -0
  177. package/dist/esm/hooks/useResizeObserver.js +20 -1
  178. package/dist/esm/hooks/useStepper.js +75 -0
  179. package/dist/esm/hooks/useStorage.js +39 -0
  180. package/dist/esm/hotkeys/HotKeyLabel.js +1 -1
  181. package/dist/esm/hotkeys/HotKeyWrapper.js +3 -1
  182. package/dist/esm/index.js +6 -2
  183. package/dist/esm/overlays/alert/Alert.js +24 -16
  184. package/dist/esm/overlays/flyout/Flyout.js +52 -68
  185. package/dist/esm/overlays/message/Message.js +9 -4
  186. package/dist/esm/overlays/modal/Modal.js +19 -22
  187. package/dist/esm/overlays/toast/Toast.js +21 -11
  188. package/dist/esm/overlays/tooltip/Tooltip.js +24 -11
  189. package/dist/esm/types/icons.js +17 -4
  190. package/dist/esm/typography/Abbr.js +35 -7
  191. package/dist/esm/typography/{Link.js → Anchor.js} +24 -6
  192. package/dist/esm/typography/Mark.js +25 -5
  193. package/dist/esm/typography/Text.js +31 -6
  194. package/dist/esm/typography/Title.js +20 -5
  195. package/dist/esm/utils/cloneElement.js +47 -0
  196. package/dist/esm/utils/getColor.js +2 -16
  197. package/dist/types/components/actionLabel/ActionLabel.d.ts +21 -2
  198. package/dist/types/components/animations/Animations.d.ts +84 -5
  199. package/dist/types/components/avatar/Avatar.d.ts +34 -6
  200. package/dist/types/components/avatar/AvatarGroup.d.ts +19 -1
  201. package/dist/types/components/badge/Badge.d.ts +37 -3
  202. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +31 -2
  203. package/dist/types/components/button/Button.d.ts +39 -7
  204. package/dist/types/components/button/ButtonGroup.d.ts +28 -3
  205. package/dist/types/components/button/ConfirmButton.d.ts +23 -3
  206. package/dist/types/components/button/ToggleButtonGroup.d.ts +39 -11
  207. package/dist/types/components/callout/Callout.d.ts +29 -3
  208. package/dist/types/components/card/Card.d.ts +44 -4
  209. package/dist/types/components/card/CardCover.d.ts +25 -0
  210. package/dist/types/components/card/FlipContent.d.ts +28 -0
  211. package/dist/types/components/chip/Chip.d.ts +34 -5
  212. package/dist/types/components/collapsable/Collapsable.d.ts +28 -2
  213. package/dist/types/components/divider/Divider.d.ts +30 -7
  214. package/dist/types/components/dropdown/Dropdown.d.ts +40 -1
  215. package/dist/types/components/dropdown/DropdownTool.d.ts +25 -0
  216. package/dist/types/components/empty/EmptyContent.d.ts +32 -3
  217. package/dist/types/components/icon/Icon.d.ts +40 -8
  218. package/dist/types/components/index.d.ts +3 -2
  219. package/dist/types/components/media/Media.d.ts +54 -0
  220. package/dist/types/components/menu/ContextMenu.d.ts +19 -1
  221. package/dist/types/components/menu/Menu.d.ts +29 -0
  222. package/dist/types/components/menu/MenuItem.d.ts +22 -2
  223. package/dist/types/components/menu/types.d.ts +9 -3
  224. package/dist/types/components/meter/Meter.d.ts +24 -0
  225. package/dist/types/components/navigator/Navigator.d.ts +29 -4
  226. package/dist/types/components/panel/Panel.d.ts +43 -4
  227. package/dist/types/components/panel/PanelGroup.d.ts +24 -0
  228. package/dist/types/components/panel/PanelStack.d.ts +31 -0
  229. package/dist/types/components/progress/ProgressBar.d.ts +23 -3
  230. package/dist/types/components/progress/ProgressCircle.d.ts +22 -3
  231. package/dist/types/components/tabpanel/Tab.d.ts +38 -4
  232. package/dist/types/components/tabpanel/TabPanel.d.ts +51 -2
  233. package/dist/types/context/Global.d.ts +24 -1
  234. package/dist/types/core/aside/Aside.d.ts +45 -6
  235. package/dist/types/core/boundary/ErrorBoundary.d.ts +18 -2
  236. package/dist/types/core/content/Content.d.ts +6 -1
  237. package/dist/types/core/headfoot/HeadFoot.d.ts +41 -9
  238. package/dist/types/core/page/Page.d.ts +32 -4
  239. package/dist/types/core/responsive/Responsive.d.ts +58 -3
  240. package/dist/types/core/section/Section.d.ts +18 -3
  241. package/dist/types/core/theme/ThemeProvider.d.ts +25 -5
  242. package/dist/types/core/viewport/Viewport.d.ts +15 -1
  243. package/dist/types/hooks/useControlledValue.d.ts +13 -2
  244. package/dist/types/hooks/useDebounce.d.ts +12 -0
  245. package/dist/types/hooks/useEffectDebugger.d.ts +49 -0
  246. package/dist/types/hooks/useIsDark.d.ts +8 -0
  247. package/dist/types/hooks/useIsRtl.d.ts +12 -0
  248. package/dist/types/hooks/useNavigator.d.ts +18 -1
  249. package/dist/types/hooks/useOverlayService.d.ts +28 -9
  250. package/dist/types/hooks/usePropToggle.d.ts +16 -5
  251. package/dist/types/hooks/useResize.d.ts +19 -1
  252. package/dist/types/hooks/useResizeObserver.d.ts +20 -1
  253. package/dist/types/hooks/useStepper.d.ts +14 -0
  254. package/dist/types/hooks/useStorage.d.ts +38 -0
  255. package/dist/types/index.d.ts +4 -0
  256. package/dist/types/overlays/alert/Alert.d.ts +16 -5
  257. package/dist/types/overlays/flyout/Flyout.d.ts +9 -4
  258. package/dist/types/overlays/message/Message.d.ts +16 -5
  259. package/dist/types/overlays/modal/Modal.d.ts +13 -4
  260. package/dist/types/overlays/toast/Toast.d.ts +16 -5
  261. package/dist/types/overlays/tooltip/Tooltip.d.ts +2 -2
  262. package/dist/types/types/icons.d.ts +17 -3
  263. package/dist/types/types/index.d.ts +20 -22
  264. package/dist/types/typography/Abbr.d.ts +34 -4
  265. package/dist/types/typography/Anchor.d.ts +42 -0
  266. package/dist/types/typography/Copy.d.ts +15 -0
  267. package/dist/types/typography/Mark.d.ts +22 -4
  268. package/dist/types/typography/Text.d.ts +27 -1
  269. package/dist/types/typography/Title.d.ts +16 -1
  270. package/dist/types/typography/index.d.ts +1 -1
  271. package/dist/types/utils/cloneElement.d.ts +1 -0
  272. package/dist/types/utils/getColor.d.ts +1 -4
  273. package/dist/types/utils/index.d.ts +1 -0
  274. package/package.json +14 -16
  275. package/src/components/actionLabel/ActionLabel.tsx +26 -8
  276. package/src/components/animations/Animations.tsx +115 -36
  277. package/src/components/avatar/Avatar.tsx +51 -15
  278. package/src/components/avatar/AvatarGroup.tsx +23 -5
  279. package/src/components/badge/Badge.tsx +50 -22
  280. package/src/components/breadcrumbs/Breadcrumbs.tsx +43 -10
  281. package/src/components/button/Button.tsx +74 -42
  282. package/src/components/button/ButtonGroup.tsx +33 -7
  283. package/src/components/button/ConfirmButton.tsx +31 -3
  284. package/src/components/button/ToggleButtonGroup.tsx +74 -47
  285. package/src/components/callout/Callout.tsx +55 -12
  286. package/src/components/card/Card.tsx +84 -25
  287. package/src/components/card/CardCover.tsx +36 -6
  288. package/src/components/card/FlipContent.tsx +90 -0
  289. package/src/components/chip/Chip.tsx +53 -25
  290. package/src/components/collapsable/Collapsable.tsx +33 -8
  291. package/src/components/divider/Divider.tsx +42 -16
  292. package/src/components/dropdown/Dropdown.tsx +47 -12
  293. package/src/components/dropdown/DropdownTool.tsx +27 -2
  294. package/src/components/empty/EmptyContent.tsx +49 -8
  295. package/src/components/icon/Icon.tsx +96 -18
  296. package/src/components/index.ts +3 -2
  297. package/src/components/media/Media.tsx +193 -104
  298. package/src/components/menu/ContextMenu.tsx +19 -0
  299. package/src/components/menu/Menu.tsx +87 -30
  300. package/src/components/menu/MenuItem.tsx +44 -19
  301. package/src/components/menu/types.ts +9 -8
  302. package/src/components/meter/Meter.tsx +27 -4
  303. package/src/components/navigator/Navigator.tsx +58 -9
  304. package/src/components/panel/Panel.tsx +53 -21
  305. package/src/components/panel/PanelGroup.tsx +25 -2
  306. package/src/components/panel/PanelStack.tsx +33 -2
  307. package/src/components/progress/ProgressBar.tsx +33 -14
  308. package/src/components/progress/ProgressCircle.tsx +29 -13
  309. package/src/components/tabpanel/Tab.tsx +47 -24
  310. package/src/components/tabpanel/TabPanel.tsx +79 -13
  311. package/src/context/Global.tsx +28 -1
  312. package/src/context/NotificationCenter.tsx +3 -3
  313. package/src/core/aside/Aside.tsx +56 -34
  314. package/src/core/boundary/ErrorBoundary.tsx +26 -8
  315. package/src/core/boundary/ErrorIcon.tsx +1 -2
  316. package/src/core/content/Content.tsx +7 -3
  317. package/src/core/headfoot/HeadFoot.tsx +44 -37
  318. package/src/core/page/Page.tsx +42 -20
  319. package/src/core/responsive/Responsive.tsx +66 -8
  320. package/src/core/section/Section.tsx +26 -4
  321. package/src/core/theme/ThemeProvider.tsx +35 -14
  322. package/src/core/viewport/Viewport.tsx +16 -3
  323. package/src/hooks/useControlledValue.tsx +12 -0
  324. package/src/hooks/useDebounce.ts +13 -1
  325. package/src/hooks/useEffectDebugger.ts +50 -2
  326. package/src/hooks/useIsDark.ts +8 -0
  327. package/src/hooks/useIsRtl.ts +12 -0
  328. package/src/hooks/useNavigator.tsx +28 -5
  329. package/src/hooks/useOverlayService.tsx +33 -8
  330. package/src/hooks/usePropToggle.ts +16 -5
  331. package/src/hooks/useResize.ts +19 -1
  332. package/src/hooks/useResizeObserver.ts +32 -9
  333. package/src/hooks/useStepper.tsx +68 -0
  334. package/src/hooks/useStorage.ts +38 -0
  335. package/src/hotkeys/HotKeyLabel.tsx +1 -1
  336. package/src/hotkeys/HotKeyWrapper.tsx +3 -1
  337. package/src/index.ts +5 -0
  338. package/src/overlays/alert/Alert.tsx +50 -34
  339. package/src/overlays/flyout/Flyout.tsx +73 -97
  340. package/src/overlays/message/Message.tsx +28 -9
  341. package/src/overlays/modal/Modal.tsx +36 -30
  342. package/src/overlays/toast/Toast.tsx +42 -30
  343. package/src/overlays/tooltip/Tooltip.tsx +43 -18
  344. package/src/types/global.d.ts +8 -0
  345. package/src/types/icons.ts +32 -6
  346. package/src/types/index.ts +261 -45
  347. package/src/typography/Abbr.tsx +45 -11
  348. package/src/typography/{Link.tsx → Anchor.tsx} +26 -14
  349. package/src/typography/Copy.tsx +15 -0
  350. package/src/typography/Mark.tsx +25 -10
  351. package/src/typography/Text.tsx +31 -13
  352. package/src/typography/Title.tsx +18 -7
  353. package/src/typography/index.ts +1 -1
  354. package/src/{overlays/tooltip/Tooltip.module.css → utils/cloneElement.ts} +21 -27
  355. package/src/utils/getColor.ts +1 -17
  356. package/src/utils/index.ts +1 -0
  357. package/css/index.js +0 -250
  358. package/css/tailwind/colors.ts +0 -158
  359. package/dist/cjs/components/actionLabel/ActionLabel.module.css +0 -1
  360. package/dist/cjs/components/animations/Animations.module.css +0 -1
  361. package/dist/cjs/components/avatar/Avatar.module.css +0 -1
  362. package/dist/cjs/components/badge/Badge.module.css +0 -1
  363. package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  364. package/dist/cjs/components/button/Button.module.css +0 -1
  365. package/dist/cjs/components/card/Card.module.css +0 -1
  366. package/dist/cjs/components/chip/Chip.module.css +0 -1
  367. package/dist/cjs/components/collapsable/Collapsable.module.css +0 -1
  368. package/dist/cjs/components/dropdown/Dropdown.module.css +0 -1
  369. package/dist/cjs/components/icon/Icon.module.css +0 -1
  370. package/dist/cjs/components/media/Media.module.css +0 -1
  371. package/dist/cjs/components/menu/Menu.module.css +0 -1
  372. package/dist/cjs/components/meter/Meter.module.css +0 -1
  373. package/dist/cjs/components/panel/Panel.module.css +0 -1
  374. package/dist/cjs/components/progress/Progress.module.css +0 -1
  375. package/dist/cjs/components/tabpanel/TabPanel.module.css +0 -1
  376. package/dist/cjs/core/aside/Aside.module.css +0 -1
  377. package/dist/cjs/core/boundary/ErrorBoundary.module.css +0 -1
  378. package/dist/cjs/core/content/Content.module.css +0 -1
  379. package/dist/cjs/core/headfoot/HeadFoot.module.css +0 -1
  380. package/dist/cjs/core/page/Page.module.css +0 -1
  381. package/dist/cjs/core/responsive/Responsive.module.css +0 -1
  382. package/dist/cjs/core/section/Section.module.css +0 -1
  383. package/dist/cjs/core/theme/Theme.module.css +0 -1
  384. package/dist/cjs/core/viewport/Viewport.module.css +0 -1
  385. package/dist/cjs/overlays/alert/Alert.module.css +0 -1
  386. package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
  387. package/dist/cjs/overlays/message/Message.module.css +0 -1
  388. package/dist/cjs/overlays/modal/Modal.module.css +0 -1
  389. package/dist/cjs/overlays/toast/Toast.module.css +0 -1
  390. package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
  391. package/dist/cjs/typography/Typography.module.css +0 -1
  392. package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
  393. package/dist/esm/components/animations/Animations.module.css +0 -1
  394. package/dist/esm/components/avatar/Avatar.module.css +0 -1
  395. package/dist/esm/components/badge/Badge.module.css +0 -1
  396. package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  397. package/dist/esm/components/button/Button.module.css +0 -1
  398. package/dist/esm/components/card/Card.module.css +0 -1
  399. package/dist/esm/components/chip/Chip.module.css +0 -1
  400. package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
  401. package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
  402. package/dist/esm/components/icon/Icon.module.css +0 -1
  403. package/dist/esm/components/media/Media.module.css +0 -1
  404. package/dist/esm/components/menu/Menu.module.css +0 -1
  405. package/dist/esm/components/meter/Meter.module.css +0 -1
  406. package/dist/esm/components/panel/Panel.module.css +0 -1
  407. package/dist/esm/components/progress/Progress.module.css +0 -1
  408. package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
  409. package/dist/esm/core/aside/Aside.module.css +0 -1
  410. package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
  411. package/dist/esm/core/content/Content.module.css +0 -1
  412. package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
  413. package/dist/esm/core/page/Page.module.css +0 -1
  414. package/dist/esm/core/responsive/Responsive.module.css +0 -1
  415. package/dist/esm/core/section/Section.module.css +0 -1
  416. package/dist/esm/core/theme/Theme.module.css +0 -1
  417. package/dist/esm/core/viewport/Viewport.module.css +0 -1
  418. package/dist/esm/overlays/alert/Alert.module.css +0 -1
  419. package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
  420. package/dist/esm/overlays/message/Message.module.css +0 -1
  421. package/dist/esm/overlays/modal/Modal.module.css +0 -1
  422. package/dist/esm/overlays/toast/Toast.module.css +0 -1
  423. package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
  424. package/dist/esm/typography/Typography.module.css +0 -1
  425. package/dist/types/typography/Link.d.ts +0 -25
@@ -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(isNested ? refs.setFloating : 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,14 +276,55 @@ 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
+ className=""
317
+ menuClassName={props.className}
318
+ />
319
+ );
320
+ }
265
321
 
266
322
  if (parentId === null) {
267
323
  return (
268
324
  <FloatingTree>
269
325
  <MenuComponent
270
326
  {...(props as AnyObject)}
327
+ className=""
271
328
  menuClassName={props.className}
272
329
  />
273
330
  </FloatingTree>
@@ -22,27 +22,45 @@
22
22
  */
23
23
 
24
24
  import { useFloatingTree } from "@floating-ui/react";
25
- import { iconToken } from "@react-fabric/utilities";
25
+ import { iconToken, mergeRefs } from "@react-fabric/utilities";
26
26
  import classNames from "classnames";
27
- import { Fragment, useCallback, useMemo } from "react";
27
+ import { Fragment, useCallback, useEffect, useMemo, useRef } from "react";
28
+ import { HotKey } from "../../hotkeys/HotKey";
28
29
  import { HotKeyLabel } from "../../hotkeys/HotKeyLabel";
29
30
  import { Tooltip } from "../../overlays";
30
31
  import { type PolymorphicProps } from "../../types";
31
32
  import { Badge, getBadgeProps } from "../badge/Badge";
32
- import { Icon } from "../icon/Icon";
33
- import classes from "./Menu.module.css";
33
+ import { getIconProps, Icon } from "../icon/Icon";
34
34
  import { type MenuItemProps } from "./types";
35
35
 
36
+ /**
37
+ * A menu item component that can be used in a dropdown or menu.
38
+ * It supports various features such as icons, badges, hotkeys, and more.
39
+ * It can be customized with different colors, icons, and behaviors.
40
+ *
41
+ * @param {MenuItemProps} props
42
+ * @returns A JSX element representing the menu item.
43
+ *
44
+ * @example
45
+ * ```jsx
46
+ * <MenuItem
47
+ * label="Settings"
48
+ * icon="settings"
49
+ * onClick={() => console.log("Settings clicked")}
50
+ * hotKey="Ctrl+S"
51
+ * badge={{ count: 3, color: "red" }}
52
+ * />
53
+ * ```
54
+ *
55
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs} for documentation.
56
+ */
36
57
  export const MenuItem = <Tag extends React.ElementType = "button">({
37
58
  as,
38
59
  label,
39
60
  color = "primary",
40
61
  className,
41
62
  icon,
42
- iconBg,
43
- iconColor,
44
63
  appendLabel,
45
- rtlFlip,
46
64
  altIcon,
47
65
  id,
48
66
  active,
@@ -50,6 +68,7 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
50
68
  onClick,
51
69
  badge,
52
70
  hotKey,
71
+ tabIndex = -1,
53
72
  // @ts-expect-error ignore
54
73
  minimal,
55
74
  // @ts-expect-error ignore
@@ -58,11 +77,16 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
58
77
  ref,
59
78
  ...aria
60
79
  }: MenuItemProps & PolymorphicProps<Tag>) => {
80
+ const elRef = useRef<HTMLElement>(null);
61
81
  const tree = useFloatingTree();
62
82
  const badgeProps = useMemo(() => {
63
83
  return getBadgeProps(badge);
64
84
  }, [badge]);
65
85
 
86
+ useEffect(() => {
87
+ tabIndex === 0 && elRef.current?.focus();
88
+ }, [tabIndex]);
89
+
66
90
  const iconEl = useMemo(() => {
67
91
  let path = icon;
68
92
  if (minimal && !path) {
@@ -70,14 +94,11 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
70
94
  }
71
95
  return (
72
96
  <Icon
73
- className={classNames(classes.menuIcon, minimal && classes.minimal)}
74
- icon={path ?? ""}
75
- bg={iconBg}
76
- color={iconColor}
77
- rtlFlip={rtlFlip}
97
+ className={classNames("fabric-menuIcon", minimal && "minimal")}
98
+ {...getIconProps(path ?? "")}
78
99
  />
79
100
  );
80
- }, [icon, iconBg, iconColor, rtlFlip, minimal, label]);
101
+ }, [icon, minimal, label]);
81
102
 
82
103
  const Wrapper = useCallback(
83
104
  ({ children, ...rest }: AnyObject) => {
@@ -135,26 +156,30 @@ export const MenuItem = <Tag extends React.ElementType = "button">({
135
156
  return (
136
157
  <Wrapper {...aria}>
137
158
  <E
138
- ref={ref}
159
+ ref={mergeRefs(ref, elRef)}
139
160
  data-dropdown-dismiss
140
161
  data-color={color}
141
162
  className={classNames(
142
- classes.menuItem,
163
+ "fabric-menuItem cursor-pointer",
143
164
  className,
144
- active && classes.active,
145
- minimal && classes.minimal,
146
- disabled && classes.disabled,
147
- "rounded-capped relative max-w-[50vw] my-0.5",
165
+ active && "active",
166
+ minimal && "minimal",
167
+ disabled && "disabled",
168
+ "rounded relative max-w-[50vw] my-0.5",
148
169
  )}
149
170
  data-active={active}
150
171
  data-open={childOpen}
151
172
  disabled={disabled}
152
173
  data-id={id}
174
+ tabIndex={tabIndex}
153
175
  onClick={(e) => {
154
176
  onClick?.(e) !== false && tree?.events.emit("click");
155
177
  }}
156
178
  {...(minimal ? {} : aria)}
157
179
  >
180
+ {hotKey && (
181
+ <HotKey keyCombo={hotKey} handler={() => elRef.current?.click?.()} />
182
+ )}
158
183
  {menuLabel}
159
184
  </E>
160
185
  </Wrapper>
@@ -27,17 +27,13 @@ import {
27
27
  type BadgeType,
28
28
  type CallbackReturn,
29
29
  type ChildrenProp,
30
- type ColorType,
30
+ type ColorState,
31
31
  type CssProp,
32
- type IconProps,
33
32
  type TestProps,
34
33
  } from "../../types";
34
+ import { type IconProps } from "../icon/Icon";
35
35
 
36
- export interface MenuItemProps
37
- extends CssProp,
38
- AriaProps,
39
- TestProps,
40
- IconProps {
36
+ export interface MenuItemProps extends CssProp, AriaProps, TestProps {
41
37
  /**
42
38
  * menu id passed via menu.onClick
43
39
  */
@@ -53,7 +49,11 @@ export interface MenuItemProps
53
49
  /**
54
50
  * menu color
55
51
  */
56
- color?: ColorType;
52
+ color?: ColorState;
53
+ /**
54
+ * icon path or props
55
+ */
56
+ icon?: IconProps;
57
57
  /**
58
58
  * item active
59
59
  */
@@ -90,6 +90,7 @@ export interface MenuRootProps extends CssProp {
90
90
  export interface MenuInnerProps extends MenuItemProps {
91
91
  label: string;
92
92
  minimal?: never;
93
+ trigger?: "hover" | "click";
93
94
  /**
94
95
  * floating menu className
95
96
  */
@@ -25,7 +25,6 @@ import { Format } from "@react-fabric/utilities";
25
25
  import classNames from "classnames";
26
26
  import { useMemoDebugger } from "../../hooks/useEffectDebugger";
27
27
  import { type AriaProps, type CssProp, type TestProps } from "../../types";
28
- import classes from "./Meter.module.css";
29
28
 
30
29
  export interface MeterProps extends CssProp, AriaProps, TestProps {
31
30
  /**
@@ -38,6 +37,30 @@ export interface MeterProps extends CssProp, AriaProps, TestProps {
38
37
  hideLabel?: boolean;
39
38
  }
40
39
 
40
+ /**
41
+ * A component that displays a visual representation of a value as a series of dots.
42
+ * It is useful for showing progress or completion status in a compact form.
43
+ * The meter consists of 6 dots, each representing approximately 16.67% of the total value.
44
+ * The active dots are filled based on the value provided, and the remaining dots are empty.
45
+ * The component can also display a label showing the percentage value.
46
+ *
47
+ * @param {MeterProps} props - The properties for the Meter component.
48
+ * @returns {JSX.Element} The rendered Meter component.
49
+ *
50
+ * @example
51
+ * ```jsx
52
+ * <Meter value={75} />
53
+ * // Renders a meter with 4 active dots and a label showing "75%"
54
+ *
55
+ * <Meter value={50} hideLabel />
56
+ * // Renders a meter with 3 active dots and no label
57
+ *
58
+ * <Meter value={100} className="custom-meter" />
59
+ * // Renders a meter with all 6 active dots and a custom class name
60
+ * ```
61
+ *
62
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-meter--docs} for more details.
63
+ */
41
64
  export const Meter = ({ value, hideLabel, className, ...aria }: MeterProps) => {
42
65
  /** ***************** calculate active meter dots *******************/
43
66
  const activeCount = useMemoDebugger(
@@ -51,9 +74,9 @@ export const Meter = ({ value, hideLabel, className, ...aria }: MeterProps) => {
51
74
  return (
52
75
  <div
53
76
  className={classNames(
54
- classes.meter,
77
+ "fabric-meter",
55
78
  className,
56
- "flex flex-nowrap items-center gap-[2px]",
79
+ "flex flex-nowrap items-center gap-0.5",
57
80
  )}
58
81
  {...aria}
59
82
  >
@@ -61,7 +84,7 @@ export const Meter = ({ value, hideLabel, className, ...aria }: MeterProps) => {
61
84
  <div
62
85
  key={step}
63
86
  className={classNames(
64
- classes.meterBar,
87
+ "fabric-meterBar",
65
88
  "first-of-type:rounded-s last-of-type:rounded-e bg-tint-100 relative outline -outline-offset-1 outline-muted overflow-hidden after:absolute after:inset-0",
66
89
  )}
67
90
  data-active={activeCount >= step}
@@ -22,57 +22,106 @@
22
22
  */
23
23
 
24
24
  import classNames from "classnames";
25
+ import { useCallback } from "react";
25
26
  import { HotKey } from "../../hotkeys/HotKey";
26
27
  import {
27
28
  type AriaProps,
29
+ type ChildProp,
28
30
  type ColorType,
29
31
  type CssProp,
32
+ type PaletteType,
30
33
  type TestProps,
31
34
  } from "../../types";
32
35
  import { CoreIcons } from "../../types/icons";
33
36
  import { Icon } from "../icon/Icon";
37
+ import { isEmpty } from "@react-fabric/utilities";
34
38
 
35
- export interface NavigatorProps extends CssProp, AriaProps, TestProps {
39
+ export interface NavigatorProps
40
+ extends CssProp,
41
+ AriaProps,
42
+ TestProps,
43
+ Partial<ChildProp> {
44
+ length?: number;
45
+ current?: number;
46
+ disableKeyHandlers?: boolean;
36
47
  /**
37
48
  * navigator button color
38
49
  */
39
- color?: ColorType | string;
50
+ color?: ColorType | PaletteType | string;
40
51
  /**
41
52
  * navigation handler
42
53
  */
43
54
  onNavigate: (dir: -1 | 1) => void;
44
55
  }
45
56
 
57
+ /**
58
+ * A component that provides navigation controls for traversing through items.
59
+ * It includes previous and next buttons, and supports keyboard navigation.
60
+ *
61
+ * @param {NavigatorProps} props - The properties for the Navigator component.
62
+ * @returns {JSX.Element} The rendered Navigator component.
63
+ *
64
+ * @example
65
+ * ```jsx
66
+ * <Navigator
67
+ * className="my-navigator"
68
+ * onNavigate={(dir) => console.log(`Navigate ${dir === -1 ? 'previous' : 'next'}`)}
69
+ * color="blue"
70
+ * length={10}
71
+ * current={0}
72
+ * >
73
+ * <span>Current Item: 1</span>
74
+ * </Navigator>
75
+ * ```
76
+ *
77
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-navigator--docs} for more details.
78
+ */
46
79
  export const Navigator = ({
47
80
  className,
48
81
  onNavigate,
49
82
  color,
83
+ children,
84
+ length,
85
+ current,
86
+ disableKeyHandlers,
50
87
  ...aria
51
88
  }: NavigatorProps) => {
89
+ const navPrev = useCallback(
90
+ () => (isEmpty(current) || current !== 0) && onNavigate(-1),
91
+ [onNavigate, current],
92
+ );
93
+ const navNext = useCallback(
94
+ () => (isEmpty(current) || current + 1 < (length ?? 0)) && onNavigate(+1),
95
+ [onNavigate, current, length],
96
+ );
52
97
  return (
53
98
  <div
54
- className={classNames(className, "inline-block leading-none")}
99
+ data-ref="navigator"
100
+ className={classNames(className, "inline-flex items-center leading-none")}
55
101
  {...aria}
56
102
  >
57
- <HotKey keyCombo="left" handler={() => onNavigate(-1)} />
58
- <HotKey keyCombo="right" handler={() => onNavigate(1)} />
103
+ {!disableKeyHandlers && <HotKey keyCombo="left" handler={navPrev} />}
104
+ {!disableKeyHandlers && <HotKey keyCombo="right" handler={navNext} />}
59
105
  <Icon
60
106
  rtlFlip
61
107
  color={color}
62
108
  className="text-[1em] p-1"
63
109
  aria-label="previous"
64
- data-testid="previous"
110
+ data-ref="previous"
65
111
  icon={CoreIcons.chevronLeft}
66
- onClick={(e) => [e.stopPropagation(), onNavigate(-1)]}
112
+ disabled={!isEmpty(current) && current === 0}
113
+ onClick={(e) => [e.stopPropagation(), navPrev()]}
67
114
  />
115
+ {children}
68
116
  <Icon
69
117
  rtlFlip
70
118
  className="text-[1em] p-1"
71
119
  color={color}
72
120
  aria-label="next"
73
- data-testid="next"
121
+ data-ref="next"
74
122
  icon={CoreIcons.chevronRight}
75
- onClick={(e) => [e.stopPropagation(), onNavigate(1)]}
123
+ disabled={!isEmpty(current) && current + 1 === length}
124
+ onClick={(e) => [e.stopPropagation(), navNext()]}
76
125
  />
77
126
  </div>
78
127
  );