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

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 +72 -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 +72 -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 +29 -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 +76 -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
@@ -1,10 +1,8 @@
1
1
  /*
2
2
  * React Fabric
3
3
  * @version: 1.0.0
4
- *
5
- *
6
4
  * The MIT License (MIT)
7
- * Copyright (c) 2024 Adarsh Pastakia
5
+ * Copyright (c) 2026 Adarsh Pastakia
8
6
  *
9
7
  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
10
8
  * and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -21,306 +19,293 @@
21
19
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
20
  */
23
21
 
24
- import { isNil, isString, mergeRefs } from "@react-fabric/utilities";
25
- import classNames from "classnames";
26
- import {
27
- Fragment,
28
- isValidElement,
29
- type MouseEventHandler,
30
- useCallback,
31
- useEffect,
32
- useMemo,
33
- useRef,
34
- useState,
35
- type WheelEventHandler,
36
- } from "react";
37
- import { useEffectDebugger } from "../../hooks/useEffectDebugger";
38
- import { HotKey } from "../../hotkeys/HotKey";
39
- import { HotKeyLabel } from "../../hotkeys/HotKeyLabel";
40
- import { Tooltip } from "../../overlays/tooltip/Tooltip";
41
- import {
42
- type AriaProps,
43
- type BadgeType,
44
- type CallbackReturn,
45
- type ColorType,
46
- type CssProp,
47
- type IconProps,
48
- type PolymorphicProps,
49
- type RefProp,
50
- type SizeType,
51
- type TestProps,
52
- type TooltipType,
53
- } from "../../types";
54
- import { AnimationIndicator } from "../animations/Animations";
55
- import { Badge, getBadgeProps } from "../badge/Badge";
22
+ import { cn, EMPTY_ARRAY } from "@react-fabric/utilities";
23
+ import type { Hotkey } from "@tanstack/react-hotkeys";
24
+ import { useHotkeySequence } from "@tanstack/react-hotkeys";
25
+ import { useEffect, useReducer } from "react";
26
+ import type { ChildProp, CssPropWithMap, CSSSizeType, HtmlEvents, PolymorphicProps, RefProp, SizeType, TestProps } from "../../types";
27
+ import { Kbd } from "../../typography/Kbd";
28
+ import { getIconProps } from "../../utils";
29
+ import { AnimationIndicator } from "../animations/Indicator";
30
+ import { StyleEffect } from "../effect/StyleEffect";
31
+ import type { IconProps } from "../icon/Icon";
56
32
  import { Icon } from "../icon/Icon";
57
- import classes from "./Button.module.css";
58
33
 
59
- export interface BaseProps
60
- extends CssProp,
61
- AriaProps,
62
- IconProps,
63
- RefProp,
64
- TestProps {
34
+ export interface SharedButtonProps extends HtmlEvents {
65
35
  /**
66
- * primary icon alignment
36
+ * Visual style variant of the button. Defaults to `"default"`.
67
37
  */
68
- iconAlign?: "start" | "end";
38
+ variant?: "default" | "soft" | "outlined" | "dashed" | "solid" | "link";
39
+
69
40
  /**
70
- * alternate icon align end (caret, arrow)
41
+ * Color scheme for the button. Defaults to `"default"`.
71
42
  */
72
- altIcon?: string;
43
+ color?: "default" | "muted" | "primary" | "secondary" | "info" | "danger" | "success" | "warning";
44
+
73
45
  /**
74
- * button size
46
+ * When true, applies fully rounded (pill) corners to the button.
75
47
  */
76
- size?: SizeType;
48
+ rounded?: boolean;
49
+
77
50
  /**
78
- * button color
51
+ * Button size. Accepts `"xs"`, `"sm"`, `"md"`, `"lg"`, or `"xl"`.
79
52
  */
80
- color?: ColorType;
53
+ size?: SizeType;
54
+ }
55
+
56
+ interface BaseButtonProps
57
+ extends CssPropWithMap<{ root: string; button: string; label: string; icon: string }>, RefProp<HTMLButtonElement>, TestProps, SharedButtonProps {
58
+ "aria-label"?: string;
59
+
81
60
  /**
82
- * button type
61
+ * Keyboard shortcut combo that triggers the button's `onClick` handler.
83
62
  */
84
- type?: "button" | "reset" | "submit";
63
+ hotKey?: Hotkey | Hotkey[];
85
64
  /**
86
- * button styling
65
+ * When true, hides the visual hotkey label displayed inside the button.
87
66
  */
88
- variant?: "outline" | "solid" | "link";
67
+ hideHotKeyLabel?: boolean;
68
+
89
69
  /**
90
- * active state with click disabled
70
+ * Icon path or props rendered inside the button.
91
71
  */
92
- active?: boolean;
72
+ icon?: IconProps;
93
73
  /**
94
- * loading state with animation and click disabled
74
+ * Alternative icon rendered for dropdown carets or state indicators.
95
75
  */
96
- loading?: boolean;
76
+ altIcon?: IconProps;
77
+
97
78
  /**
98
- * full rounded edges
79
+ * When true, marks the button as in an active/selected state.
99
80
  */
100
- rounded?: boolean;
81
+ active?: boolean;
101
82
  /**
102
- * spin icon on hover
83
+ * When true, shows a loading spinner and disables clicks to prevent duplicate submissions.
103
84
  */
104
- spinOnHover?: boolean;
85
+ loading?: boolean;
105
86
  /**
106
- * disabled state
87
+ * When true, disables the button and prevents user interaction.
107
88
  */
108
89
  disabled?: boolean;
90
+
109
91
  /**
110
- * stretch to full width
92
+ * When true, allows the button to be clicked even when `active` is true.
111
93
  */
112
- fullWidth?: boolean;
94
+ activeClickable?: boolean;
95
+
96
+ type?: "button" | "submit" | "reset";
97
+
113
98
  /**
114
- * action completed message works best with `onClick` Promise return.
115
- * To hide completed message onClick/Promise return should be false
99
+ * Explicit width of the button (CSS size value).
116
100
  */
117
- actionMessage?: string;
101
+ width?: CSSSizeType;
118
102
  /**
119
- * manually force show action message
103
+ * When true, manually shows the action-completed checkmark overlay.
120
104
  */
121
105
  showActionDone?: boolean;
122
106
  /**
123
- * show action message `onClick` or manually by setting `showActionDone` true
107
+ * Controls when the action-completed checkmark appears: `"click"` shows it after onClick,
108
+ * `"manual"` requires setting `showActionDone` to true.
124
109
  */
125
110
  showActionDoneEvent?: "click" | "manual";
126
- /**
127
- * click handler, return Promise to autoset loading state
128
- */
129
- onClick?: (e?: React.MouseEvent) => CallbackReturn;
130
- /**
131
- * badges
132
- */
133
- badge?: string | number | BadgeType;
134
- /**
135
- * keyboard shortcut
136
- */
137
- hotKey?: string;
138
-
139
- stopPropagation?: boolean;
140
-
141
- onMouseOut?: MouseEventHandler;
142
- onMouseOver?: MouseEventHandler;
143
- onMouseMove?: MouseEventHandler;
144
- onMouseEnter?: MouseEventHandler;
145
- onMouseLeave?: MouseEventHandler;
146
-
147
- onWheel?: WheelEventHandler;
148
111
  }
149
112
 
150
- export type ButtonProps =
151
- | { children: string | React.ReactElement; "aria-label"?: string }
152
- | { children?: never; "aria-label": string };
113
+ type ButtonTypeProps = { children: ChildProp["children"] } | { children?: never; "aria-label": string };
114
+
115
+ export type ButtonProps<Tag extends React.ElementType = "button"> = BaseButtonProps & ButtonTypeProps & PolymorphicProps<Tag>;
153
116
 
154
117
  /**
155
- * Clickable action button
118
+ * A versatile button component that supports multiple variants, colors, sizes, and states.
119
+ * It can display icons, handle loading/action states, show keyboard shortcuts, and be
120
+ * polymorphic to render as different HTML elements or custom components.
121
+ *
122
+ * @example
123
+ * ```tsx
124
+ * // Basic button
125
+ * <Button variant="solid" color="primary" onClick={handleClick}>
126
+ * Click me
127
+ * </Button>
128
+ *
129
+ * // Icon button with loading state
130
+ * <Button icon="icon-[mdi--floppy]" loading={saving}>
131
+ * Save
132
+ * </Button>
133
+ *
134
+ * // Polymorphic: renders as a link
135
+ * <Button as="a" href="/dashboard" variant="soft">
136
+ * Dashboard
137
+ * </Button>
138
+ *
139
+ * // Button with keyboard shortcut
140
+ * <Button hotKey="Ctrl+S" variant="dashed">
141
+ * Save (Ctrl+S)
142
+ * </Button>
143
+ * ```
156
144
  */
157
- export const Button = <Tag extends React.ElementType = "button">({
145
+ export function Button<Tag extends React.ElementType = "button">({
146
+ active,
147
+ altIcon,
158
148
  as,
159
- ref,
160
149
  children,
161
150
  className,
162
- active,
163
- color = "primary",
164
- icon,
165
- iconBg,
166
- iconColor,
167
- iconAlign = "start",
168
- altIcon,
169
- rtlFlip,
170
- rounded,
171
- size,
151
+ classNames,
152
+ color = "default",
172
153
  disabled,
154
+ icon,
173
155
  loading,
174
- variant,
175
- badge,
176
- fullWidth,
177
- spinOnHover,
156
+ onBlur,
178
157
  onClick,
179
- actionMessage,
180
- stopPropagation,
158
+ onFocus,
159
+ onMouseDown,
160
+ onMouseEnter,
161
+ onMouseLeave,
162
+ onMouseMove,
163
+ onMouseOver,
164
+ onMouseUp,
165
+ activeClickable,
166
+ showActionDone,
167
+ showActionDoneEvent,
181
168
  type = "button",
169
+ ref,
170
+ rounded,
171
+ size,
172
+ variant = "default",
173
+ width,
182
174
  hotKey,
183
- showActionDone,
184
- showActionDoneEvent = "click",
185
- tabIndex = 0,
186
- // @ts-expect-error ignore
187
- "data-ref": dataRef,
188
- ...aria
189
- }: BaseProps & ButtonProps & PolymorphicProps<Tag>) => {
190
- const refEl = useRef<AnyObject>(null);
191
- const [busy, setBusy] = useState(false);
192
- const [actionDone, setActionDone] = useState(false);
193
-
194
- const clickHandler = useCallback(
195
- (e: React.MouseEvent) => {
196
- setBusy(true);
197
- stopPropagation && e.stopPropagation();
198
- const ret = onClick?.(e);
199
- void Promise.resolve(ret).then((b) => {
200
- setBusy(false);
201
- if (b !== false && actionMessage && showActionDoneEvent === "click") {
202
- setActionDone(true);
203
- }
204
- });
175
+ hideHotKeyLabel,
176
+ ...props
177
+ }: ButtonProps<Tag>) {
178
+ // Action state: tracks whether an action is running and whether to show the done overlay
179
+ const [state, dispatch] = useReducer(
180
+ (state, action: { type: string }) => {
181
+ // Start action: show spinner, hide done overlay
182
+ if (action.type === "actionStart") {
183
+ return { isActionRunning: true, showActionDone: false };
184
+ }
185
+ // Action finished: hide spinner
186
+ if (action.type === "actionFinished") {
187
+ return { ...state, isActionRunning: false };
188
+ }
189
+ // Action done: show checkmark overlay
190
+ if (action.type === "actionDone") {
191
+ return { isActionRunning: false, showActionDone: true };
192
+ }
193
+ // Reset: hide everything
194
+ return { isActionRunning: false, showActionDone: false };
195
+ },
196
+ {
197
+ isActionRunning: false,
198
+ showActionDone: false,
205
199
  },
206
- [onClick, disabled, actionMessage, showActionDoneEvent, stopPropagation],
207
200
  );
201
+ // Handle button click: dispatch action start, run onClick, then dispatch finished
202
+ const handleAction = async (e?: React.MouseEvent) => {
203
+ dispatch({ type: "actionStart" });
204
+ try {
205
+ await Promise.resolve(onClick?.(e));
206
+ if (showActionDoneEvent === "click") {
207
+ dispatch({ type: "actionDone" });
208
+ setTimeout(() => dispatch({ type: "actionReset" }), 2000);
209
+ }
210
+ } finally {
211
+ dispatch({ type: "actionFinished" });
212
+ }
213
+ };
208
214
 
209
- /** ***************** reset done state on timeout *******************/
210
- useEffect(() => {
211
- actionMessage && showActionDone && setActionDone(true);
212
- }, [showActionDone, actionMessage]);
213
- useEffectDebugger(
215
+ useHotkeySequence(
216
+ hotKey ? [hotKey].flat() : EMPTY_ARRAY,
214
217
  () => {
215
- if (actionDone) {
216
- const timer = setTimeout(() => setActionDone(false), 2000);
217
- return () => clearTimeout(timer);
218
- }
218
+ void handleAction();
219
+ },
220
+ {
221
+ enabled: !disabled,
219
222
  },
220
- [actionDone],
221
- "ActionButton done handler",
222
223
  );
223
224
 
224
- const TooltipWrapper = useMemo(
225
- () => (actionMessage ? Tooltip : Fragment),
226
- [actionMessage, actionDone],
227
- );
228
- const tooltipProps = useMemo(() => {
229
- if (actionDone && actionMessage) {
230
- return {
231
- content: actionMessage,
232
- placement: "top",
233
- color,
234
- open: true,
235
- } as TooltipType;
225
+ // Manual mode: show/hide the done overlay based on showActionDone prop
226
+ useEffect(() => {
227
+ if (showActionDoneEvent === "manual") {
228
+ if (showActionDone) dispatch({ type: "actionDone" });
229
+ return () => {
230
+ dispatch({ type: "actionFinished" });
231
+ };
236
232
  }
237
- }, [actionDone, actionMessage, color]);
238
-
239
- const badgeProps = useMemo(() => {
240
- return getBadgeProps(badge);
241
- }, [badge]);
233
+ }, [showActionDone, showActionDoneEvent]);
242
234
 
243
235
  const E = as ?? "button";
244
236
  return (
245
237
  <div
246
- className={classNames(
247
- classes.buttonWrapper,
248
- className,
249
- "relative align-text-top select-none focus-within:z-1",
250
- fullWidth ? "block w-full" : "inline-block",
251
- )}
252
- data-ref={dataRef ?? "button"}
253
- data-size={size}
254
- data-loading={busy || loading}
238
+ className={cn("fabric-buttonWrapper", "inline-flex relative is-disabled:cursor-not-allowed is-loading:cursor-wait", className, classNames?.root)}
239
+ data-loading={loading || state.isActionRunning}
255
240
  data-disabled={disabled}
241
+ data-rounded={rounded}
242
+ data-variant={variant}
243
+ data-active={active}
244
+ data-color={color}
245
+ data-size={size}
246
+ style={{
247
+ width: width,
248
+ }}
256
249
  >
257
- {hotKey && (
258
- <HotKey
259
- keyCombo={hotKey}
260
- handler={() => !disabled && refEl.current?.click()}
261
- />
262
- )}
263
- <TooltipWrapper {...tooltipProps}>
264
- <E
265
- ref={mergeRefs(ref, refEl)}
266
- role="button"
267
- className={classNames(
268
- classes.button,
269
- "pointer-events-auto cursor-pointer select-none flex flex-nowrap w-full h-full items-center border-0 -outline-offset-1 justify-center max-w-72 p-0 font-sans font-medium appearance-none",
270
- `focus-visible:ring-2 focus-visible:ring-offset-2 buttonInner`,
271
- fullWidth && "max-w-full w-full",
272
- rounded && "rounded-full",
273
- spinOnHover && classes.spinOnHover,
274
- )}
275
- type={type}
276
- disabled={disabled}
277
- tabIndex={tabIndex}
278
- data-inner-clickable
279
- onClick={clickHandler}
280
- data-color={color}
281
- data-active={active}
282
- data-variant={variant}
283
- {...aria}
284
- >
285
- {icon && (
286
- <Icon
287
- className={classes.buttonIcon}
288
- icon={icon}
289
- bg={iconBg}
290
- color={iconColor}
291
- rtlFlip={rtlFlip}
292
- data-align={iconAlign}
293
- />
294
- )}
295
- {isValidElement(children) && (
296
- <div className={classes.buttonChild}>{children}</div>
297
- )}
298
- {isString(children) && (
299
- <label
300
- className={classNames(classes.buttonLabel, "truncate")}
301
- data-colored-icon={!!iconBg}
302
- >
303
- {children}
304
- </label>
305
- )}
306
- {!isNil(badge) && <Badge {...badgeProps} />}
307
- {hotKey && <HotKeyLabel keyCombo={hotKey} />}
308
- {altIcon && (
309
- <Icon className={classes.altIcon} icon={altIcon} rtlFlip />
310
- )}
311
- </E>
312
- </TooltipWrapper>
313
- {actionDone && (
250
+ <E
251
+ ref={ref}
252
+ {...props}
253
+ type={type}
254
+ className={cn(
255
+ "fabric-button",
256
+ classNames?.button,
257
+ "relative w-full appearance-none outline cursor-pointer overflow-hidden flex items-center justify-center has-[.fabric-buttonLabel]:px-[0.5em]",
258
+ "rounded is-rounded:rounded-full",
259
+ "is-loading:pointer-events-none is-loading:after:animate-progress is-disabled:pointer-events-none",
260
+ "not-is-active:is-disabled:opacity-50 not-is-active:is-disabled:after:bg-tint-500/10",
261
+ !activeClickable && "is-active:pointer-events-none",
262
+ )}
263
+ data-clickable={true}
264
+ data-ref="button"
265
+ data-testid={props["data-testid"]}
266
+ data-test-value={props["data-test-value"]}
267
+ role="button"
268
+ disabled={disabled}
269
+ aria-label={props["aria-label"]}
270
+ aria-disabled={disabled}
271
+ onFocus={onFocus}
272
+ onBlur={onBlur}
273
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
274
+ onClick={handleAction}
275
+ onMouseDown={onMouseDown}
276
+ onMouseUp={onMouseUp}
277
+ onMouseOver={onMouseOver}
278
+ onMouseMove={onMouseMove}
279
+ onMouseEnter={onMouseEnter}
280
+ onMouseLeave={onMouseLeave}
281
+ >
282
+ {variant !== "link" && <StyleEffect />}
283
+ {icon && (
284
+ <Icon
285
+ className={cn(
286
+ "fabric-buttonIcon",
287
+ classNames?.icon,
288
+ "m-[0.375em] has-[~_.fabric-buttonLabel]:mx-0 inline-block size-fit flex-content pointer-events-none",
289
+ )}
290
+ {...getIconProps(icon)}
291
+ />
292
+ )}
293
+ {children && (
294
+ <div className={cn("fabric-buttonLabel", classNames?.label, "m-[0.25em] truncate flex-[0_1_auto] leading-tight pointer-events-none")}>{children}</div>
295
+ )}
296
+ {!hideHotKeyLabel && hotKey && <Kbd keys={hotKey} />}
297
+ {altIcon && (
298
+ <Icon className={cn("fabric-buttonAltIcon", "my-[0.25em] size-fit inline-block flex-content pointer-events-none")} {...getIconProps(altIcon)} />
299
+ )}
300
+ </E>
301
+ {state.showActionDone && (
314
302
  <div
315
- className={classNames(
316
- "absolute inset-0 overflow-hidden flex justify-center items-center",
317
- `bg-${color}-300`,
318
- rounded ? "rounded-full" : "rounded",
319
- )}
303
+ data-testid="doneOverlay"
304
+ className="fabric-buttonDoneOverlay absolute inset-0 flex items-center justify-center z-1 border rounded is-rounded:rounded-full"
320
305
  >
321
- <AnimationIndicator type="check" color={color} />
306
+ <AnimationIndicator type="check" />
322
307
  </div>
323
308
  )}
324
309
  </div>
325
310
  );
326
- };
311
+ }