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

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 (429) 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} +86 -84
  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} +12 -9
  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 +9 -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 +137 -45
  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 +51 -29
  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 +47 -7
  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 +32 -8
  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 +2 -3
  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 +174 -76
  69. package/dist/cjs/components/menu/ContextMenu.js +19 -0
  70. package/dist/cjs/components/menu/Menu.js +77 -23
  71. package/dist/cjs/components/menu/MenuItem.js +54 -27
  72. package/dist/cjs/components/meter/Meter.js +26 -3
  73. package/dist/cjs/components/navigator/Navigator.js +50 -18
  74. package/dist/cjs/components/panel/Panel.js +59 -28
  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 -16
  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 +50 -25
  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 +41 -40
  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 +74 -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 +14 -10
  108. package/dist/cjs/overlays/alert/Alert.js +24 -17
  109. package/dist/cjs/overlays/flyout/Flyout.js +48 -65
  110. package/dist/cjs/overlays/message/Message.js +8 -3
  111. package/dist/cjs/overlays/modal/Modal.js +19 -23
  112. package/dist/cjs/overlays/toast/Toast.js +22 -13
  113. package/dist/cjs/overlays/tooltip/Tooltip.js +25 -13
  114. package/dist/cjs/typography/Abbr.js +35 -7
  115. package/dist/cjs/typography/{Link.js → Anchor.js} +23 -5
  116. package/dist/cjs/typography/Copy.js +1 -2
  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 +135 -44
  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 +53 -31
  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 +47 -7
  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 +32 -8
  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 +2 -3
  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 +175 -77
  144. package/dist/esm/components/menu/ContextMenu.js +19 -0
  145. package/dist/esm/components/menu/Menu.js +79 -25
  146. package/dist/esm/components/menu/MenuItem.js +49 -22
  147. package/dist/esm/components/meter/Meter.js +26 -3
  148. package/dist/esm/components/navigator/Navigator.js +50 -18
  149. package/dist/esm/components/panel/Panel.js +61 -30
  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 -17
  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 +52 -27
  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 +43 -42
  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 +74 -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 +7 -4
  183. package/dist/esm/overlays/alert/Alert.js +25 -18
  184. package/dist/esm/overlays/flyout/Flyout.js +53 -70
  185. package/dist/esm/overlays/message/Message.js +9 -4
  186. package/dist/esm/overlays/modal/Modal.js +22 -26
  187. package/dist/esm/overlays/toast/Toast.js +23 -14
  188. package/dist/esm/overlays/tooltip/Tooltip.js +25 -13
  189. package/dist/esm/typography/Abbr.js +35 -7
  190. package/dist/esm/typography/{Link.js → Anchor.js} +24 -6
  191. package/dist/esm/typography/Copy.js +1 -2
  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 +105 -7
  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 -1
  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/index.d.ts +28 -24
  263. package/dist/types/typography/Abbr.d.ts +34 -4
  264. package/dist/types/typography/Anchor.d.ts +42 -0
  265. package/dist/types/typography/Copy.d.ts +15 -0
  266. package/dist/types/typography/Mark.d.ts +22 -4
  267. package/dist/types/typography/Text.d.ts +27 -1
  268. package/dist/types/typography/Title.d.ts +16 -1
  269. package/dist/types/typography/index.d.ts +1 -1
  270. package/dist/types/utils/cloneElement.d.ts +1 -0
  271. package/dist/types/utils/getColor.d.ts +1 -4
  272. package/dist/types/utils/index.d.ts +1 -0
  273. package/package.json +17 -16
  274. package/src/components/actionLabel/ActionLabel.tsx +26 -8
  275. package/src/components/animations/Animations.tsx +139 -52
  276. package/src/components/avatar/Avatar.tsx +51 -15
  277. package/src/components/avatar/AvatarGroup.tsx +23 -5
  278. package/src/components/badge/Badge.tsx +50 -22
  279. package/src/components/breadcrumbs/Breadcrumbs.tsx +43 -10
  280. package/src/components/button/Button.tsx +75 -43
  281. package/src/components/button/ButtonGroup.tsx +33 -7
  282. package/src/components/button/ConfirmButton.tsx +31 -3
  283. package/src/components/button/ToggleButtonGroup.tsx +74 -47
  284. package/src/components/callout/Callout.tsx +58 -16
  285. package/src/components/card/Card.tsx +84 -25
  286. package/src/components/card/CardCover.tsx +36 -6
  287. package/src/components/card/FlipContent.tsx +90 -0
  288. package/src/components/chip/Chip.tsx +53 -25
  289. package/src/components/collapsable/Collapsable.tsx +35 -11
  290. package/src/components/divider/Divider.tsx +42 -16
  291. package/src/components/dropdown/Dropdown.tsx +47 -12
  292. package/src/components/dropdown/DropdownTool.tsx +28 -4
  293. package/src/components/empty/EmptyContent.tsx +49 -8
  294. package/src/components/icon/Icon.tsx +96 -18
  295. package/src/components/index.ts +5 -4
  296. package/src/components/media/Media.tsx +193 -105
  297. package/src/components/menu/ContextMenu.tsx +19 -0
  298. package/src/components/menu/Menu.tsx +88 -32
  299. package/src/components/menu/MenuItem.tsx +44 -19
  300. package/src/components/menu/types.ts +9 -8
  301. package/src/components/meter/Meter.tsx +27 -4
  302. package/src/components/navigator/Navigator.tsx +60 -12
  303. package/src/components/panel/Panel.tsx +66 -28
  304. package/src/components/panel/PanelGroup.tsx +25 -2
  305. package/src/components/panel/PanelStack.tsx +33 -2
  306. package/src/components/progress/ProgressBar.tsx +33 -14
  307. package/src/components/progress/ProgressCircle.tsx +29 -13
  308. package/src/components/tabpanel/Tab.tsx +47 -24
  309. package/src/components/tabpanel/TabPanel.tsx +79 -13
  310. package/src/context/Global.tsx +28 -1
  311. package/src/context/NotificationCenter.tsx +3 -3
  312. package/src/core/aside/Aside.tsx +59 -38
  313. package/src/core/boundary/ErrorBoundary.tsx +26 -8
  314. package/src/core/boundary/ErrorIcon.tsx +1 -2
  315. package/src/core/content/Content.tsx +7 -3
  316. package/src/core/headfoot/HeadFoot.tsx +44 -37
  317. package/src/core/page/Page.tsx +44 -22
  318. package/src/core/responsive/Responsive.tsx +66 -8
  319. package/src/core/section/Section.tsx +26 -4
  320. package/src/core/theme/ThemeProvider.tsx +35 -14
  321. package/src/core/viewport/Viewport.tsx +16 -3
  322. package/src/hooks/useControlledValue.tsx +12 -0
  323. package/src/hooks/useDebounce.ts +13 -1
  324. package/src/hooks/useEffectDebugger.ts +50 -2
  325. package/src/hooks/useIsDark.ts +8 -0
  326. package/src/hooks/useIsRtl.ts +12 -0
  327. package/src/hooks/useNavigator.tsx +28 -5
  328. package/src/hooks/useOverlayService.tsx +33 -8
  329. package/src/hooks/usePropToggle.ts +16 -5
  330. package/src/hooks/useResize.ts +19 -1
  331. package/src/hooks/useResizeObserver.ts +32 -9
  332. package/src/hooks/useStepper.tsx +68 -0
  333. package/src/hooks/useStorage.ts +38 -0
  334. package/src/hotkeys/HotKeyLabel.tsx +1 -1
  335. package/src/hotkeys/HotKeyWrapper.tsx +3 -1
  336. package/src/index.ts +5 -1
  337. package/src/overlays/alert/Alert.tsx +51 -36
  338. package/src/overlays/flyout/Flyout.tsx +74 -99
  339. package/src/overlays/message/Message.tsx +28 -9
  340. package/src/overlays/modal/Modal.tsx +39 -34
  341. package/src/overlays/toast/Toast.tsx +44 -33
  342. package/src/overlays/tooltip/Tooltip.tsx +44 -20
  343. package/src/types/global.d.ts +8 -0
  344. package/src/types/index.ts +293 -47
  345. package/src/typography/Abbr.tsx +45 -11
  346. package/src/typography/{Link.tsx → Anchor.tsx} +26 -14
  347. package/src/typography/Copy.tsx +16 -2
  348. package/src/typography/Mark.tsx +25 -10
  349. package/src/typography/Text.tsx +31 -13
  350. package/src/typography/Title.tsx +18 -7
  351. package/src/typography/index.ts +1 -1
  352. package/src/{overlays/tooltip/Tooltip.module.css → utils/cloneElement.ts} +21 -27
  353. package/src/utils/getColor.ts +1 -17
  354. package/src/utils/index.ts +1 -0
  355. package/css/flags.rect.css +0 -1607
  356. package/css/flags.wavy.css +0 -1606
  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/types/icons.js +0 -199
  392. package/dist/cjs/typography/Typography.module.css +0 -1
  393. package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
  394. package/dist/esm/components/animations/Animations.module.css +0 -1
  395. package/dist/esm/components/avatar/Avatar.module.css +0 -1
  396. package/dist/esm/components/badge/Badge.module.css +0 -1
  397. package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  398. package/dist/esm/components/button/Button.module.css +0 -1
  399. package/dist/esm/components/card/Card.module.css +0 -1
  400. package/dist/esm/components/chip/Chip.module.css +0 -1
  401. package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
  402. package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
  403. package/dist/esm/components/icon/Icon.module.css +0 -1
  404. package/dist/esm/components/media/Media.module.css +0 -1
  405. package/dist/esm/components/menu/Menu.module.css +0 -1
  406. package/dist/esm/components/meter/Meter.module.css +0 -1
  407. package/dist/esm/components/panel/Panel.module.css +0 -1
  408. package/dist/esm/components/progress/Progress.module.css +0 -1
  409. package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
  410. package/dist/esm/core/aside/Aside.module.css +0 -1
  411. package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
  412. package/dist/esm/core/content/Content.module.css +0 -1
  413. package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
  414. package/dist/esm/core/page/Page.module.css +0 -1
  415. package/dist/esm/core/responsive/Responsive.module.css +0 -1
  416. package/dist/esm/core/section/Section.module.css +0 -1
  417. package/dist/esm/core/theme/Theme.module.css +0 -1
  418. package/dist/esm/core/viewport/Viewport.module.css +0 -1
  419. package/dist/esm/overlays/alert/Alert.module.css +0 -1
  420. package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
  421. package/dist/esm/overlays/message/Message.module.css +0 -1
  422. package/dist/esm/overlays/modal/Modal.module.css +0 -1
  423. package/dist/esm/overlays/toast/Toast.module.css +0 -1
  424. package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
  425. package/dist/esm/types/icons.js +0 -201
  426. package/dist/esm/typography/Typography.module.css +0 -1
  427. package/dist/types/types/icons.d.ts +0 -196
  428. package/dist/types/typography/Link.d.ts +0 -25
  429. package/src/types/icons.ts +0 -425
@@ -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,8 @@ import {
56
55
  useRef,
57
56
  useState,
58
57
  } from "react";
59
- import { CoreIcons } from "../../types/icons";
60
- import { nodeCheck } from "../../utils";
58
+ import { HotKeyWrapper } from "../../hotkeys/HotKeyWrapper";
59
+ import { cloneChildren, nodeCheck } from "../../utils";
61
60
  import { MenuItem } from "./MenuItem";
62
61
  import { type MenuProps } from "./types";
63
62
 
@@ -69,6 +68,8 @@ const MenuComponent = ({
69
68
  menuClassName,
70
69
  onClick,
71
70
  // @ts-expect-error ignore
71
+ trigger = "hover",
72
+ // @ts-expect-error ignore
72
73
  ref,
73
74
  ...rest
74
75
  }: Partial<MenuProps>) => {
@@ -89,6 +90,8 @@ const MenuComponent = ({
89
90
  open: !isNested || isOpen,
90
91
  onOpenChange(open, event, reason) {
91
92
  isNested && setIsOpen(open);
93
+ if (reason === "outside-press" && trigger === "click")
94
+ tree?.events.emit("close");
92
95
  },
93
96
  placement: isNested ? "right-start" : "bottom-start",
94
97
  middleware: [
@@ -100,12 +103,14 @@ const MenuComponent = ({
100
103
  });
101
104
 
102
105
  const hover = useHover(context, {
106
+ enabled: trigger === "hover",
103
107
  delay: { open: 75 },
104
108
  handleClose: safePolygon({ blockPointerEvents: true }),
105
109
  });
106
110
  const click = useClick(context, {
107
- toggle: true,
108
- ignoreMouse: true,
111
+ event: "mousedown",
112
+ toggle: trigger === "click" || !isNested,
113
+ ignoreMouse: trigger === "hover" && !isNested,
109
114
  });
110
115
  const role = useRole(context, { role: "menu" });
111
116
  const dismiss = useDismiss(context, { bubbles: true });
@@ -187,6 +192,16 @@ const MenuComponent = ({
187
192
  );
188
193
  }, [isOpen]);
189
194
 
195
+ useEffect(() => {
196
+ if ((!isNested || isOpen) && activeIndex) {
197
+ setTimeout(() => {
198
+ elementsRef.current[activeIndex]?.scrollIntoView({
199
+ block: "nearest",
200
+ });
201
+ }, 100);
202
+ }
203
+ }, [isOpen, activeIndex]);
204
+
190
205
  return (
191
206
  <FloatingNode id={nodeId}>
192
207
  {isNested && (
@@ -202,7 +217,7 @@ const MenuComponent = ({
202
217
  } as AnyObject) as AnyObject)}
203
218
  data-open={isOpen}
204
219
  minimal={minimal}
205
- altIcon={CoreIcons.chevronRight}
220
+ altIcon="icon-[mdi--menu-right]"
206
221
  ref={mergeRefs(refs.setReference, ref)}
207
222
  />
208
223
  )}
@@ -210,29 +225,29 @@ const MenuComponent = ({
210
225
  {(!isNested || isOpen) && (
211
226
  <Wrapper {...wrapperProps}>
212
227
  {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 }}
228
+ <HotKeyWrapper>
229
+ <FloatingFocusManager
230
+ context={context}
231
+ modal={!isNested}
232
+ initialFocus={isNested ? -1 : 0}
233
+ returnFocus={!isNested}
233
234
  >
234
- {Children.map(children, (child: AnyObject, index) => {
235
- if (child) {
235
+ <div
236
+ className={classNames(
237
+ menuClassName,
238
+ "flex flex-col bg-base p-1 menu-list",
239
+ isNested &&
240
+ "outline shadow-lg rounded-capped max-h-96 overflow-auto scroll-thin z-(--z-popover)",
241
+ )}
242
+ autoFocus
243
+ ref={mergeRefs(isNested ? refs.setFloating : ref)}
244
+ {...getFloatingProps({
245
+ onClick: isNested ? undefined : handleClick,
246
+ })}
247
+ // @ts-expect-error ignore
248
+ {...{ style: !isNested ? rest.style : floatingStyles }}
249
+ >
250
+ {cloneChildren(children, (child: AnyObject, index) => {
236
251
  labelsRef.current[index] = child.props.label;
237
252
  return cloneElement(
238
253
  child,
@@ -249,10 +264,10 @@ const MenuComponent = ({
249
264
  }
250
265
  : {},
251
266
  );
252
- }
253
- })}
254
- </div>
255
- </FloatingFocusManager>
267
+ })}
268
+ </div>
269
+ </FloatingFocusManager>
270
+ </HotKeyWrapper>
256
271
  </Wrapper>
257
272
  )}
258
273
  </FloatingList>
@@ -260,14 +275,55 @@ const MenuComponent = ({
260
275
  );
261
276
  };
262
277
 
278
+ /**
279
+ * A component that displays a menu with items, supports nested menus and various interactions.
280
+ * It can be triggered by hover or click events, and allows for custom styling and behavior.
281
+ * This component is designed to be used within a Floating UI context, allowing for dynamic positioning and interaction handling.
282
+ * It can be nested within other menus to create complex menu structures.
283
+ *
284
+ * @param {MenuProps} props - The properties for the Menu component.
285
+ * @returns {JSX.Element} The rendered Menu component.
286
+ *
287
+ * @example
288
+ * ```jsx
289
+ * <Menu
290
+ * className="my-menu"
291
+ * trigger="click"
292
+ * onClick={(id) => console.log(`Clicked item with id: ${id}`)}
293
+ * >
294
+ * <MenuItem id="item1" label="Item 1" />
295
+ * <MenuItem id="item2" label="Item 2" />
296
+ * <MenuItem id="item3" label="Item 3">
297
+ * <Menu>
298
+ * <MenuItem id="subitem1" label="Sub Item 1" />
299
+ * <MenuItem id="subitem2" label="Sub Item 2" />
300
+ * </Menu>
301
+ * </MenuItem>
302
+ * </Menu>
303
+ * ```
304
+ *
305
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs} for more details.
306
+ */
263
307
  export const Menu = (props: MenuProps) => {
264
308
  const parentId = useFloatingParentNodeId();
309
+ const tree = useFloatingTree();
310
+
311
+ if (tree) {
312
+ return (
313
+ <MenuComponent
314
+ {...(props as AnyObject)}
315
+ className=""
316
+ menuClassName={props.className}
317
+ />
318
+ );
319
+ }
265
320
 
266
321
  if (parentId === null) {
267
322
  return (
268
323
  <FloatingTree>
269
324
  <MenuComponent
270
325
  {...(props as AnyObject)}
326
+ className=""
271
327
  menuClassName={props.className}
272
328
  />
273
329
  </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,105 @@
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
- import { CoreIcons } from "../../types/icons";
33
35
  import { Icon } from "../icon/Icon";
36
+ import { isEmpty } from "@react-fabric/utilities";
34
37
 
35
- export interface NavigatorProps extends CssProp, AriaProps, TestProps {
38
+ export interface NavigatorProps
39
+ extends CssProp,
40
+ AriaProps,
41
+ TestProps,
42
+ Partial<ChildProp> {
43
+ length?: number;
44
+ current?: number;
45
+ disableKeyHandlers?: boolean;
36
46
  /**
37
47
  * navigator button color
38
48
  */
39
- color?: ColorType | string;
49
+ color?: ColorType | PaletteType | string;
40
50
  /**
41
51
  * navigation handler
42
52
  */
43
53
  onNavigate: (dir: -1 | 1) => void;
44
54
  }
45
55
 
56
+ /**
57
+ * A component that provides navigation controls for traversing through items.
58
+ * It includes previous and next buttons, and supports keyboard navigation.
59
+ *
60
+ * @param {NavigatorProps} props - The properties for the Navigator component.
61
+ * @returns {JSX.Element} The rendered Navigator component.
62
+ *
63
+ * @example
64
+ * ```jsx
65
+ * <Navigator
66
+ * className="my-navigator"
67
+ * onNavigate={(dir) => console.log(`Navigate ${dir === -1 ? 'previous' : 'next'}`)}
68
+ * color="blue"
69
+ * length={10}
70
+ * current={0}
71
+ * >
72
+ * <span>Current Item: 1</span>
73
+ * </Navigator>
74
+ * ```
75
+ *
76
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-navigator--docs} for more details.
77
+ */
46
78
  export const Navigator = ({
47
79
  className,
48
80
  onNavigate,
49
81
  color,
82
+ children,
83
+ length,
84
+ current,
85
+ disableKeyHandlers,
50
86
  ...aria
51
87
  }: NavigatorProps) => {
88
+ const navPrev = useCallback(
89
+ () => (isEmpty(current) || current !== 0) && onNavigate(-1),
90
+ [onNavigate, current],
91
+ );
92
+ const navNext = useCallback(
93
+ () => (isEmpty(current) || current + 1 < (length ?? 0)) && onNavigate(+1),
94
+ [onNavigate, current, length],
95
+ );
52
96
  return (
53
97
  <div
54
- className={classNames(className, "inline-block leading-none")}
98
+ data-ref="navigator"
99
+ className={classNames(className, "inline-flex items-center leading-none")}
55
100
  {...aria}
56
101
  >
57
- <HotKey keyCombo="left" handler={() => onNavigate(-1)} />
58
- <HotKey keyCombo="right" handler={() => onNavigate(1)} />
102
+ {!disableKeyHandlers && <HotKey keyCombo="left" handler={navPrev} />}
103
+ {!disableKeyHandlers && <HotKey keyCombo="right" handler={navNext} />}
59
104
  <Icon
60
105
  rtlFlip
61
106
  color={color}
62
107
  className="text-[1em] p-1"
63
108
  aria-label="previous"
64
- data-testid="previous"
65
- icon={CoreIcons.chevronLeft}
66
- onClick={(e) => [e.stopPropagation(), onNavigate(-1)]}
109
+ data-ref="previous"
110
+ icon="icon-[mdi--chevron-left]"
111
+ disabled={!isEmpty(current) && current === 0}
112
+ onClick={(e) => [e.stopPropagation(), navPrev()]}
67
113
  />
114
+ {children}
68
115
  <Icon
69
116
  rtlFlip
70
117
  className="text-[1em] p-1"
71
118
  color={color}
72
119
  aria-label="next"
73
- data-testid="next"
74
- icon={CoreIcons.chevronRight}
75
- onClick={(e) => [e.stopPropagation(), onNavigate(1)]}
120
+ data-ref="next"
121
+ icon="icon-[mdi--chevron-right]"
122
+ disabled={!isEmpty(current) && current + 1 === length}
123
+ onClick={(e) => [e.stopPropagation(), navNext()]}
76
124
  />
77
125
  </div>
78
126
  );