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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. package/{src/components/actionLabel/ActionLabel.module.css → css/components/_actionLabel.css} +4 -4
  2. package/{src/overlays/alert/Alert.module.css → css/components/_alert.css} +3 -3
  3. package/css/components/_animations.css +52 -0
  4. package/css/components/_avatar.css +89 -0
  5. package/css/components/_button.css +218 -0
  6. package/css/components/_buttonGroup.css +62 -0
  7. package/css/components/_callout.css +32 -0
  8. package/css/components/_card.css +167 -0
  9. package/css/components/_chip.css +125 -0
  10. package/css/components/_collapsable.css +32 -0
  11. package/{src/overlays/message/Message.module.css → css/components/_divider.css} +11 -10
  12. package/{src/components/dropdown/Dropdown.module.css → css/components/_dropdown.css} +3 -2
  13. package/{src/overlays/flyout/Flyout.module.css → css/components/_flyout.css} +15 -9
  14. package/css/components/_media.css +102 -0
  15. package/{src/components/menu/Menu.module.css → css/components/_menu.css} +21 -20
  16. package/{src/components/meter/Meter.module.css → css/components/_meter.css} +15 -20
  17. package/{src/overlays/modal/Modal.module.css → css/components/_modal.css} +9 -9
  18. package/{src/components/panel/Panel.module.css → css/components/_panel.css} +19 -19
  19. package/{src/components/progress/Progress.module.css → css/components/_progress.css} +7 -10
  20. package/css/components/_sonner.css +431 -0
  21. package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +125 -85
  22. package/css/components/_titlebar.css +48 -0
  23. package/css/components/index.css +47 -0
  24. package/css/core/_aside.css +176 -0
  25. package/css/core/_content.css +31 -0
  26. package/css/core/_errorboundary.css +55 -0
  27. package/css/core/_responsive.css +45 -0
  28. package/css/core/_typography.css +69 -0
  29. package/css/core/_viewport.css +33 -0
  30. package/{src/hooks/useClientService.tsx → css/core/index.css} +7 -7
  31. package/css/reset/_gradients.css +36 -33
  32. package/css/reset/_reset.css +206 -300
  33. package/css/reset/_text.css +31 -61
  34. package/css/reset/_theme.css +467 -81
  35. package/css/reset/index.css +23 -21
  36. package/css/styles.css +30 -23
  37. package/css/theme/_colors.css +445 -0
  38. package/css/theme/_utilities.css +528 -0
  39. package/css/theme/_variants.css +128 -0
  40. package/css/theme/index.css +55 -0
  41. package/dist/cjs/components/actionLabel/ActionLabel.js +25 -12
  42. package/dist/cjs/{overlays → components}/alert/Alert.js +76 -53
  43. package/dist/cjs/components/animations/Indicator.js +66 -0
  44. package/dist/cjs/components/animations/Loader.js +77 -0
  45. package/dist/cjs/components/animations/LoadingBars.js +37 -0
  46. package/dist/cjs/components/animations/LoadingLine.js +59 -0
  47. package/dist/cjs/components/animations/LoadingSpinner.js +37 -0
  48. package/dist/cjs/components/animations/Skeleton.js +88 -0
  49. package/dist/cjs/components/avatar/Avatar.js +41 -20
  50. package/dist/cjs/components/avatar/AvatarGroup.js +37 -16
  51. package/dist/cjs/components/badge/Badge.js +90 -68
  52. package/dist/cjs/components/button/Button.js +198 -136
  53. package/dist/cjs/components/button/ButtonGroup.js +86 -21
  54. package/dist/cjs/components/button/ConfirmButton.js +55 -41
  55. package/dist/cjs/components/button/ToggleButtonGroup.js +84 -32
  56. package/dist/cjs/components/callout/Callout.js +56 -25
  57. package/dist/cjs/components/card/Card.js +90 -42
  58. package/dist/cjs/components/card/CardCover.js +38 -27
  59. package/dist/cjs/components/card/FlipContent.js +47 -0
  60. package/dist/cjs/components/chip/Chip.js +80 -37
  61. package/dist/cjs/components/collapsable/Collapsable.js +62 -31
  62. package/dist/cjs/components/divider/Divider.js +58 -24
  63. package/dist/cjs/components/dropdown/Dropdown.js +92 -45
  64. package/dist/cjs/components/dropdown/DropdownTool.js +6 -7
  65. package/dist/cjs/components/effect/GlassEffect.js +259 -0
  66. package/dist/cjs/components/effect/MatteEffect.js +127 -0
  67. package/dist/cjs/components/effect/StyleEffect.js +43 -0
  68. package/dist/cjs/components/empty/EmptyContent.js +37 -49
  69. package/dist/cjs/components/flyout/Flyout.js +170 -0
  70. package/dist/cjs/components/hotkey/HotKey.js +42 -0
  71. package/dist/cjs/components/icon/Icon.js +81 -80
  72. package/dist/cjs/components/media/Media.js +154 -77
  73. package/dist/cjs/components/menu/ContextMenu.js +45 -20
  74. package/dist/cjs/components/menu/Menu.js +98 -38
  75. package/dist/cjs/components/menu/MenuItem.js +102 -74
  76. package/dist/cjs/components/meter/Meter.js +35 -12
  77. package/dist/cjs/components/modal/Modal.js +152 -0
  78. package/dist/cjs/components/navigator/Navigator.js +81 -36
  79. package/dist/cjs/components/panel/Panel.js +115 -60
  80. package/dist/cjs/components/panel/PanelGroup.js +42 -16
  81. package/dist/cjs/components/panel/PanelStack.js +47 -16
  82. package/dist/cjs/components/pillbox/Pillbox.js +118 -0
  83. package/dist/cjs/components/progress/ProgressBar.js +30 -14
  84. package/dist/cjs/components/progress/ProgressCircle.js +27 -11
  85. package/dist/cjs/components/tabpanel/Tab.js +53 -37
  86. package/dist/cjs/components/tabpanel/TabPanel.js +74 -28
  87. package/dist/cjs/components/titlebar/Titlebar.js +52 -0
  88. package/dist/cjs/components/tooltip/Tooltip.js +180 -0
  89. package/dist/cjs/context/Global.js +159 -80
  90. package/dist/cjs/context/ModalManager.js +60 -0
  91. package/dist/cjs/context/context.js +43 -0
  92. package/dist/cjs/core/areaToggle/AreaToggle.js +41 -0
  93. package/dist/cjs/core/aside/Aside.js +178 -83
  94. package/dist/cjs/core/boundary/ErrorBoundary.js +37 -34
  95. package/dist/cjs/core/boundary/ErrorIcon.js +32 -19
  96. package/dist/cjs/core/content/Content.js +26 -37
  97. package/dist/cjs/core/headfoot/HeadFoot.js +133 -35
  98. package/dist/cjs/core/layout/Layout.js +28 -0
  99. package/dist/cjs/core/responsive/Responsive.js +62 -26
  100. package/dist/cjs/core/theme/ThemeProvider.js +35 -41
  101. package/dist/cjs/core/viewport/Viewport.js +26 -22
  102. package/dist/cjs/hooks/useClientService.js +39 -18
  103. package/dist/cjs/hooks/useContextMenu.js +103 -0
  104. package/dist/cjs/hooks/useControlledValue.js +13 -7
  105. package/dist/cjs/hooks/useDebounce.js +37 -21
  106. package/dist/cjs/hooks/useEffectDebugger.js +79 -60
  107. package/dist/cjs/hooks/useIsDark.js +34 -26
  108. package/dist/cjs/hooks/useIsRtl.js +13 -3
  109. package/dist/cjs/hooks/useNavigator.js +12 -9
  110. package/dist/cjs/hooks/useNotificationService.js +199 -0
  111. package/dist/cjs/hooks/useOverlayService.js +82 -41
  112. package/dist/cjs/hooks/usePropState.js +41 -0
  113. package/dist/cjs/hooks/usePropToggle.js +32 -26
  114. package/dist/cjs/hooks/useResize.js +47 -38
  115. package/dist/cjs/hooks/useResizeObserver.js +26 -7
  116. package/dist/cjs/hooks/useStorage.js +29 -16
  117. package/dist/cjs/i18n/index.js +25 -23
  118. package/dist/cjs/index.js +142 -94
  119. package/dist/cjs/typography/Abbr.js +43 -20
  120. package/dist/cjs/typography/Anchor.js +39 -0
  121. package/dist/cjs/typography/Copy.js +28 -28
  122. package/dist/cjs/typography/Kbd.js +43 -0
  123. package/dist/cjs/typography/Mark.js +34 -17
  124. package/dist/cjs/typography/Text.js +36 -54
  125. package/dist/cjs/typography/Title.js +17 -40
  126. package/dist/cjs/utils/calculateDimensions.js +38 -23
  127. package/dist/cjs/utils/cloneElement.js +64 -0
  128. package/dist/cjs/{core/section/Section.js → utils/getBadgeProps.js} +25 -21
  129. package/dist/cjs/utils/getColor.js +42 -36
  130. package/dist/cjs/utils/getIconProps.js +63 -0
  131. package/dist/cjs/utils/getTooltipProps.js +66 -0
  132. package/dist/cjs/utils/nodeCheck.js +4 -4
  133. package/dist/esm/components/actionLabel/ActionLabel.js +25 -12
  134. package/dist/esm/{overlays → components}/alert/Alert.js +73 -50
  135. package/dist/esm/components/animations/Indicator.js +66 -0
  136. package/dist/esm/components/animations/Loader.js +77 -0
  137. package/dist/esm/components/animations/LoadingBars.js +37 -0
  138. package/dist/esm/components/animations/LoadingLine.js +59 -0
  139. package/dist/esm/components/animations/LoadingSpinner.js +37 -0
  140. package/dist/esm/components/animations/Skeleton.js +88 -0
  141. package/dist/esm/components/avatar/Avatar.js +42 -21
  142. package/dist/esm/components/avatar/AvatarGroup.js +37 -16
  143. package/dist/esm/components/badge/Badge.js +93 -70
  144. package/dist/esm/components/button/Button.js +199 -137
  145. package/dist/esm/components/button/ButtonGroup.js +87 -22
  146. package/dist/esm/components/button/ConfirmButton.js +58 -44
  147. package/dist/esm/components/button/ToggleButtonGroup.js +86 -34
  148. package/dist/esm/components/callout/Callout.js +56 -25
  149. package/dist/esm/components/card/Card.js +92 -44
  150. package/dist/esm/components/card/CardCover.js +38 -27
  151. package/dist/esm/components/card/FlipContent.js +47 -0
  152. package/dist/esm/components/chip/Chip.js +81 -38
  153. package/dist/esm/components/collapsable/Collapsable.js +63 -32
  154. package/dist/esm/components/divider/Divider.js +59 -25
  155. package/dist/esm/components/dropdown/Dropdown.js +95 -48
  156. package/dist/esm/components/dropdown/DropdownTool.js +6 -7
  157. package/dist/esm/components/effect/GlassEffect.js +259 -0
  158. package/dist/esm/components/effect/MatteEffect.js +127 -0
  159. package/dist/esm/components/effect/StyleEffect.js +43 -0
  160. package/dist/esm/components/empty/EmptyContent.js +38 -50
  161. package/dist/esm/components/flyout/Flyout.js +170 -0
  162. package/dist/esm/components/hotkey/HotKey.js +42 -0
  163. package/dist/esm/components/icon/Icon.js +83 -82
  164. package/dist/esm/components/media/Media.js +156 -79
  165. package/dist/esm/components/menu/ContextMenu.js +46 -21
  166. package/dist/esm/components/menu/Menu.js +101 -41
  167. package/dist/esm/components/menu/MenuItem.js +98 -70
  168. package/dist/esm/components/meter/Meter.js +36 -13
  169. package/dist/esm/components/modal/Modal.js +152 -0
  170. package/dist/esm/components/navigator/Navigator.js +81 -36
  171. package/dist/esm/components/panel/Panel.js +117 -62
  172. package/dist/esm/components/panel/PanelGroup.js +43 -17
  173. package/dist/esm/components/panel/PanelStack.js +48 -17
  174. package/dist/esm/components/pillbox/Pillbox.js +118 -0
  175. package/dist/esm/components/progress/ProgressBar.js +31 -15
  176. package/dist/esm/components/progress/ProgressCircle.js +28 -12
  177. package/dist/esm/components/tabpanel/Tab.js +54 -38
  178. package/dist/esm/components/tabpanel/TabPanel.js +75 -29
  179. package/dist/esm/components/titlebar/Titlebar.js +52 -0
  180. package/dist/esm/components/tooltip/Tooltip.js +180 -0
  181. package/dist/esm/context/Global.js +161 -78
  182. package/dist/esm/context/ModalManager.js +60 -0
  183. package/dist/esm/context/context.js +40 -0
  184. package/dist/esm/core/areaToggle/AreaToggle.js +41 -0
  185. package/dist/esm/core/aside/Aside.js +179 -84
  186. package/dist/esm/core/boundary/ErrorBoundary.js +38 -35
  187. package/dist/esm/core/boundary/ErrorIcon.js +32 -19
  188. package/dist/esm/core/content/Content.js +26 -37
  189. package/dist/esm/core/headfoot/HeadFoot.js +134 -36
  190. package/dist/esm/core/layout/Layout.js +28 -0
  191. package/dist/esm/core/responsive/Responsive.js +62 -26
  192. package/dist/esm/core/theme/ThemeProvider.js +36 -42
  193. package/dist/esm/core/viewport/Viewport.js +26 -22
  194. package/dist/esm/hooks/useClientService.js +39 -18
  195. package/dist/esm/hooks/useContextMenu.js +103 -0
  196. package/dist/esm/hooks/useControlledValue.js +14 -8
  197. package/dist/esm/hooks/useDebounce.js +37 -21
  198. package/dist/esm/hooks/useEffectDebugger.js +81 -62
  199. package/dist/esm/hooks/useIsDark.js +34 -26
  200. package/dist/esm/hooks/useIsRtl.js +13 -3
  201. package/dist/esm/hooks/useNavigator.js +13 -10
  202. package/dist/esm/hooks/useNotificationService.js +199 -0
  203. package/dist/esm/hooks/useOverlayService.js +83 -42
  204. package/dist/esm/hooks/usePropState.js +40 -0
  205. package/dist/esm/hooks/usePropToggle.js +33 -27
  206. package/dist/esm/hooks/useResize.js +48 -39
  207. package/dist/esm/hooks/useResizeObserver.js +27 -8
  208. package/dist/esm/hooks/useStorage.js +30 -17
  209. package/dist/esm/i18n/index.js +23 -21
  210. package/dist/esm/index.js +87 -44
  211. package/dist/esm/typography/Abbr.js +45 -22
  212. package/dist/esm/typography/Anchor.js +39 -0
  213. package/dist/esm/typography/Copy.js +28 -28
  214. package/dist/esm/typography/Kbd.js +43 -0
  215. package/dist/esm/typography/Mark.js +35 -18
  216. package/dist/esm/typography/Text.js +39 -57
  217. package/dist/esm/typography/Title.js +17 -40
  218. package/dist/esm/utils/calculateDimensions.js +38 -23
  219. package/dist/esm/utils/cloneElement.js +64 -0
  220. package/dist/esm/{core/section/Section.js → utils/getBadgeProps.js} +25 -21
  221. package/dist/esm/utils/getColor.js +43 -34
  222. package/dist/esm/utils/getIconProps.js +63 -0
  223. package/dist/esm/utils/getTooltipProps.js +66 -0
  224. package/dist/esm/utils/nodeCheck.js +4 -4
  225. package/dist/types/components/actionLabel/ActionLabel.d.ts +20 -7
  226. package/dist/types/components/alert/Alert.d.ts +74 -0
  227. package/dist/types/components/animations/Indicator.d.ts +57 -0
  228. package/dist/types/components/animations/Loader.d.ts +65 -0
  229. package/dist/types/components/animations/LoadingBars.d.ts +61 -0
  230. package/dist/types/components/animations/LoadingLine.d.ts +43 -0
  231. package/dist/types/components/animations/LoadingSpinner.d.ts +61 -0
  232. package/dist/types/components/animations/Skeleton.d.ts +61 -0
  233. package/dist/types/components/avatar/Avatar.d.ts +70 -19
  234. package/dist/types/components/avatar/AvatarGroup.d.ts +51 -14
  235. package/dist/types/components/badge/Badge.d.ts +64 -14
  236. package/dist/types/components/button/Button.d.ts +72 -55
  237. package/dist/types/components/button/ButtonGroup.d.ts +86 -24
  238. package/dist/types/components/button/ConfirmButton.d.ts +21 -7
  239. package/dist/types/components/button/ToggleButtonGroup.d.ts +88 -44
  240. package/dist/types/components/callout/Callout.d.ts +58 -7
  241. package/dist/types/components/card/Card.d.ts +66 -25
  242. package/dist/types/components/card/CardCover.d.ts +52 -7
  243. package/dist/types/components/card/FlipContent.d.ts +50 -0
  244. package/dist/types/components/chip/Chip.d.ts +72 -20
  245. package/dist/types/components/collapsable/Collapsable.d.ts +55 -15
  246. package/dist/types/components/divider/Divider.d.ts +25 -8
  247. package/dist/types/components/dropdown/Dropdown.d.ts +42 -9
  248. package/dist/types/components/dropdown/DropdownTool.d.ts +22 -4
  249. package/dist/types/components/effect/GlassEffect.d.ts +5 -0
  250. package/dist/types/components/effect/MatteEffect.d.ts +40 -0
  251. package/dist/types/components/effect/StyleEffect.d.ts +27 -0
  252. package/dist/types/components/empty/EmptyContent.d.ts +53 -9
  253. package/dist/types/components/flyout/Flyout.d.ts +60 -0
  254. package/dist/types/components/hotkey/HotKey.d.ts +41 -0
  255. package/dist/types/components/icon/Icon.d.ts +74 -24
  256. package/dist/types/components/media/Media.d.ts +72 -4
  257. package/dist/types/components/menu/ContextMenu.d.ts +22 -5
  258. package/dist/types/components/menu/Menu.d.ts +26 -2
  259. package/dist/types/components/menu/MenuItem.d.ts +19 -4
  260. package/dist/types/components/menu/types.d.ts +23 -14
  261. package/dist/types/components/meter/Meter.d.ts +23 -3
  262. package/dist/types/components/modal/Modal.d.ts +52 -0
  263. package/dist/types/components/navigator/Navigator.d.ts +30 -4
  264. package/dist/types/components/panel/Panel.d.ts +43 -23
  265. package/dist/types/components/panel/PanelGroup.d.ts +22 -3
  266. package/dist/types/components/panel/PanelStack.d.ts +28 -2
  267. package/dist/types/components/pillbox/Pillbox.d.ts +95 -0
  268. package/dist/types/components/progress/ProgressBar.d.ts +19 -4
  269. package/dist/types/components/progress/ProgressCircle.d.ts +18 -4
  270. package/dist/types/components/tabpanel/Tab.d.ts +42 -10
  271. package/dist/types/components/tabpanel/TabPanel.d.ts +47 -7
  272. package/dist/types/components/titlebar/Titlebar.d.ts +54 -0
  273. package/dist/types/components/tooltip/Tooltip.d.ts +76 -0
  274. package/dist/types/context/Global.d.ts +39 -69
  275. package/dist/types/context/ModalManager.d.ts +30 -0
  276. package/dist/types/context/context.d.ts +107 -0
  277. package/dist/types/core/areaToggle/AreaToggle.d.ts +33 -0
  278. package/dist/types/core/aside/Aside.d.ts +75 -20
  279. package/dist/types/core/boundary/ErrorBoundary.d.ts +43 -4
  280. package/dist/types/core/boundary/ErrorIcon.d.ts +38 -1
  281. package/dist/types/core/content/Content.d.ts +38 -6
  282. package/dist/types/core/headfoot/HeadFoot.d.ts +48 -14
  283. package/dist/types/core/layout/Layout.d.ts +38 -0
  284. package/dist/types/core/responsive/Responsive.d.ts +45 -15
  285. package/dist/types/core/theme/ThemeProvider.d.ts +35 -11
  286. package/dist/types/core/viewport/Viewport.d.ts +27 -3
  287. package/dist/types/hooks/useClientService.d.ts +43 -1
  288. package/dist/types/hooks/useContextMenu.d.ts +10 -0
  289. package/dist/types/hooks/useControlledValue.d.ts +28 -4
  290. package/dist/types/hooks/useDebounce.d.ts +38 -2
  291. package/dist/types/hooks/useEffectDebugger.d.ts +73 -4
  292. package/dist/types/hooks/useIsDark.d.ts +6 -0
  293. package/dist/types/hooks/useIsRtl.d.ts +35 -1
  294. package/dist/types/hooks/useNavigator.d.ts +37 -2
  295. package/dist/types/hooks/useNotificationService.d.ts +60 -0
  296. package/dist/types/hooks/useOverlayService.d.ts +28 -8
  297. package/dist/types/hooks/usePropState.d.ts +26 -0
  298. package/dist/types/hooks/usePropToggle.d.ts +41 -7
  299. package/dist/types/hooks/useResize.d.ts +46 -4
  300. package/dist/types/hooks/useResizeObserver.d.ts +45 -3
  301. package/dist/types/hooks/useStorage.d.ts +32 -2
  302. package/dist/types/i18n/index.d.ts +27 -3
  303. package/dist/types/index.d.ts +106 -18
  304. package/dist/types/types/colors.d.ts +29 -0
  305. package/dist/types/types/index.d.ts +216 -76
  306. package/dist/types/typography/Abbr.d.ts +51 -6
  307. package/dist/types/typography/Anchor.d.ts +41 -0
  308. package/dist/types/typography/Copy.d.ts +36 -2
  309. package/dist/types/typography/Kbd.d.ts +40 -0
  310. package/dist/types/typography/Mark.d.ts +44 -7
  311. package/dist/types/typography/Text.d.ts +40 -24
  312. package/dist/types/typography/Title.d.ts +37 -26
  313. package/dist/types/typography/types.d.ts +32 -0
  314. package/dist/types/utils/calculateDimensions.d.ts +50 -6
  315. package/dist/types/utils/cloneElement.d.ts +41 -0
  316. package/dist/types/utils/getBadgeProps.d.ts +16 -0
  317. package/dist/types/utils/getColor.d.ts +43 -4
  318. package/dist/types/utils/getIconProps.d.ts +45 -0
  319. package/dist/types/utils/getTooltipProps.d.ts +47 -0
  320. package/dist/types/utils/index.d.ts +28 -0
  321. package/dist/types/utils/nodeCheck.d.ts +1 -2
  322. package/package.json +30 -21
  323. package/src/components/actionLabel/ActionLabel.tsx +28 -39
  324. package/src/components/alert/Alert.tsx +261 -0
  325. package/src/components/animations/Indicator.tsx +75 -0
  326. package/src/components/animations/Loader.tsx +89 -0
  327. package/src/components/animations/LoadingBars.tsx +70 -0
  328. package/src/components/animations/LoadingLine.tsx +51 -0
  329. package/src/components/animations/LoadingSpinner.tsx +70 -0
  330. package/src/components/animations/Skeleton.tsx +100 -0
  331. package/src/components/avatar/Avatar.tsx +89 -70
  332. package/src/components/avatar/AvatarGroup.tsx +65 -74
  333. package/src/components/badge/Badge.tsx +141 -108
  334. package/src/components/button/Button.tsx +223 -238
  335. package/src/components/button/ButtonGroup.tsx +117 -77
  336. package/src/components/button/ConfirmButton.tsx +60 -90
  337. package/src/components/button/ToggleButtonGroup.tsx +134 -120
  338. package/src/components/callout/Callout.tsx +81 -59
  339. package/src/components/card/Card.tsx +131 -113
  340. package/src/components/card/CardCover.tsx +61 -61
  341. package/src/components/card/FlipContent.tsx +78 -0
  342. package/src/components/chip/Chip.tsx +139 -99
  343. package/src/components/collapsable/Collapsable.tsx +79 -77
  344. package/src/components/divider/Divider.tsx +74 -53
  345. package/src/components/dropdown/Dropdown.tsx +109 -106
  346. package/src/components/dropdown/DropdownTool.tsx +29 -12
  347. package/src/components/effect/GlassEffect.tsx +221 -0
  348. package/src/components/effect/MatteEffect.tsx +99 -0
  349. package/src/components/effect/StyleEffect.tsx +36 -0
  350. package/src/components/empty/EmptyContent.tsx +60 -99
  351. package/src/components/flyout/Flyout.tsx +257 -0
  352. package/src/components/hotkey/HotKey.tsx +57 -0
  353. package/src/components/icon/Icon.tsx +131 -130
  354. package/src/components/media/Media.tsx +184 -154
  355. package/src/components/menu/ContextMenu.tsx +56 -39
  356. package/src/components/menu/Menu.tsx +121 -84
  357. package/src/components/menu/MenuItem.tsx +87 -69
  358. package/src/components/menu/types.ts +23 -28
  359. package/src/components/meter/Meter.tsx +34 -17
  360. package/src/components/modal/Modal.tsx +226 -0
  361. package/src/components/navigator/Navigator.tsx +93 -38
  362. package/src/components/panel/Panel.tsx +123 -131
  363. package/src/components/panel/PanelGroup.tsx +49 -43
  364. package/src/components/panel/PanelStack.tsx +63 -62
  365. package/src/components/pillbox/Pillbox.tsx +208 -0
  366. package/src/components/progress/ProgressBar.tsx +33 -33
  367. package/src/components/progress/ProgressCircle.tsx +29 -37
  368. package/src/components/tabpanel/Tab.tsx +84 -73
  369. package/src/components/tabpanel/TabPanel.tsx +102 -51
  370. package/src/components/titlebar/Titlebar.tsx +115 -0
  371. package/src/components/tooltip/Tooltip.tsx +255 -0
  372. package/src/context/Global.tsx +148 -148
  373. package/src/context/ModalManager.tsx +68 -0
  374. package/src/context/context.ts +111 -0
  375. package/src/core/areaToggle/AreaToggle.tsx +45 -0
  376. package/src/core/aside/Aside.tsx +200 -155
  377. package/src/core/boundary/ErrorBoundary.tsx +50 -68
  378. package/src/core/boundary/ErrorIcon.tsx +34 -32
  379. package/src/core/content/Content.tsx +41 -50
  380. package/src/core/headfoot/HeadFoot.tsx +162 -81
  381. package/src/core/layout/Layout.tsx +54 -0
  382. package/src/core/responsive/Responsive.tsx +91 -98
  383. package/src/core/theme/ThemeProvider.tsx +45 -56
  384. package/src/core/viewport/Viewport.tsx +25 -27
  385. package/src/hooks/useClientService.ts +47 -0
  386. package/src/hooks/useContextMenu.tsx +131 -0
  387. package/src/hooks/useControlledValue.ts +47 -0
  388. package/src/hooks/useDebounce.ts +41 -24
  389. package/src/hooks/useEffectDebugger.ts +105 -94
  390. package/src/hooks/useIsDark.ts +10 -24
  391. package/src/hooks/useIsRtl.ts +32 -20
  392. package/src/hooks/useNavigator.tsx +41 -26
  393. package/src/hooks/useNotificationService.tsx +239 -0
  394. package/src/hooks/useOverlayService.tsx +67 -20
  395. package/src/hooks/usePropState.ts +52 -0
  396. package/src/hooks/usePropToggle.ts +54 -47
  397. package/src/hooks/useResize.ts +69 -45
  398. package/src/hooks/useResizeObserver.ts +59 -34
  399. package/src/hooks/useStorage.ts +40 -48
  400. package/src/i18n/index.ts +24 -25
  401. package/src/index.ts +115 -44
  402. package/src/types/colors.ts +49 -0
  403. package/src/types/global.d.ts +40 -17
  404. package/src/types/index.ts +243 -155
  405. package/src/typography/Abbr.tsx +62 -59
  406. package/src/typography/Anchor.tsx +63 -0
  407. package/src/typography/Copy.tsx +39 -29
  408. package/src/typography/Kbd.tsx +50 -0
  409. package/src/typography/Mark.tsx +56 -51
  410. package/src/typography/Text.tsx +57 -128
  411. package/src/typography/Title.tsx +36 -108
  412. package/src/typography/types.ts +27 -17
  413. package/src/utils/calculateDimensions.ts +50 -40
  414. package/src/utils/cloneElement.ts +61 -0
  415. package/src/{core/content/Content.module.css → utils/getBadgeProps.ts} +20 -15
  416. package/src/utils/getColor.ts +42 -36
  417. package/src/utils/getIconProps.ts +58 -0
  418. package/src/utils/getTooltipProps.ts +59 -0
  419. package/src/utils/index.ts +23 -17
  420. package/src/utils/nodeCheck.ts +4 -8
  421. package/css/flags.rect.css +0 -1607
  422. package/css/flags.wavy.css +0 -1606
  423. package/css/index.js +0 -250
  424. package/css/tailwind/colors.ts +0 -158
  425. package/dist/cjs/components/actionLabel/ActionLabel.module.css +0 -1
  426. package/dist/cjs/components/animations/Animations.js +0 -142
  427. package/dist/cjs/components/animations/Animations.module.css +0 -1
  428. package/dist/cjs/components/avatar/Avatar.module.css +0 -1
  429. package/dist/cjs/components/badge/Badge.module.css +0 -1
  430. package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +0 -71
  431. package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  432. package/dist/cjs/components/button/Button.module.css +0 -1
  433. package/dist/cjs/components/card/Card.module.css +0 -1
  434. package/dist/cjs/components/chip/Chip.module.css +0 -1
  435. package/dist/cjs/components/collapsable/Collapsable.module.css +0 -1
  436. package/dist/cjs/components/dropdown/Dropdown.module.css +0 -1
  437. package/dist/cjs/components/icon/Icon.module.css +0 -1
  438. package/dist/cjs/components/media/Media.module.css +0 -1
  439. package/dist/cjs/components/menu/Menu.module.css +0 -1
  440. package/dist/cjs/components/meter/Meter.module.css +0 -1
  441. package/dist/cjs/components/panel/Panel.module.css +0 -1
  442. package/dist/cjs/components/progress/Progress.module.css +0 -1
  443. package/dist/cjs/components/tabpanel/TabPanel.module.css +0 -1
  444. package/dist/cjs/context/NotificationCenter.js +0 -254
  445. package/dist/cjs/core/aside/Aside.module.css +0 -1
  446. package/dist/cjs/core/boundary/ErrorBoundary.module.css +0 -1
  447. package/dist/cjs/core/content/Content.module.css +0 -1
  448. package/dist/cjs/core/headfoot/HeadFoot.module.css +0 -1
  449. package/dist/cjs/core/page/Page.js +0 -66
  450. package/dist/cjs/core/page/Page.module.css +0 -1
  451. package/dist/cjs/core/responsive/Responsive.module.css +0 -1
  452. package/dist/cjs/core/section/Section.module.css +0 -1
  453. package/dist/cjs/core/theme/Theme.module.css +0 -1
  454. package/dist/cjs/core/viewport/Viewport.module.css +0 -1
  455. package/dist/cjs/hotkeys/HotKey.js +0 -47
  456. package/dist/cjs/hotkeys/HotKeyLabel.js +0 -52
  457. package/dist/cjs/hotkeys/HotKeyWrapper.js +0 -98
  458. package/dist/cjs/hotkeys/commons.js +0 -56
  459. package/dist/cjs/overlays/alert/Alert.module.css +0 -1
  460. package/dist/cjs/overlays/flyout/Flyout.js +0 -152
  461. package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
  462. package/dist/cjs/overlays/message/Message.js +0 -84
  463. package/dist/cjs/overlays/message/Message.module.css +0 -1
  464. package/dist/cjs/overlays/modal/Modal.js +0 -132
  465. package/dist/cjs/overlays/modal/Modal.module.css +0 -1
  466. package/dist/cjs/overlays/toast/Toast.js +0 -166
  467. package/dist/cjs/overlays/toast/Toast.module.css +0 -1
  468. package/dist/cjs/overlays/tooltip/Tooltip.js +0 -133
  469. package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
  470. package/dist/cjs/types/icons.js +0 -200
  471. package/dist/cjs/typography/Link.js +0 -55
  472. package/dist/cjs/typography/Typography.module.css +0 -1
  473. package/dist/cjs/typography/types.js +0 -42
  474. package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
  475. package/dist/esm/components/animations/Animations.js +0 -138
  476. package/dist/esm/components/animations/Animations.module.css +0 -1
  477. package/dist/esm/components/avatar/Avatar.module.css +0 -1
  478. package/dist/esm/components/badge/Badge.module.css +0 -1
  479. package/dist/esm/components/breadcrumbs/Breadcrumbs.js +0 -71
  480. package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  481. package/dist/esm/components/button/Button.module.css +0 -1
  482. package/dist/esm/components/card/Card.module.css +0 -1
  483. package/dist/esm/components/chip/Chip.module.css +0 -1
  484. package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
  485. package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
  486. package/dist/esm/components/icon/Icon.module.css +0 -1
  487. package/dist/esm/components/media/Media.module.css +0 -1
  488. package/dist/esm/components/menu/Menu.module.css +0 -1
  489. package/dist/esm/components/meter/Meter.module.css +0 -1
  490. package/dist/esm/components/panel/Panel.module.css +0 -1
  491. package/dist/esm/components/progress/Progress.module.css +0 -1
  492. package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
  493. package/dist/esm/context/NotificationCenter.js +0 -254
  494. package/dist/esm/core/aside/Aside.module.css +0 -1
  495. package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
  496. package/dist/esm/core/content/Content.module.css +0 -1
  497. package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
  498. package/dist/esm/core/page/Page.js +0 -66
  499. package/dist/esm/core/page/Page.module.css +0 -1
  500. package/dist/esm/core/responsive/Responsive.module.css +0 -1
  501. package/dist/esm/core/section/Section.module.css +0 -1
  502. package/dist/esm/core/theme/Theme.module.css +0 -1
  503. package/dist/esm/core/viewport/Viewport.module.css +0 -1
  504. package/dist/esm/hotkeys/HotKey.js +0 -47
  505. package/dist/esm/hotkeys/HotKeyLabel.js +0 -52
  506. package/dist/esm/hotkeys/HotKeyWrapper.js +0 -96
  507. package/dist/esm/hotkeys/commons.js +0 -56
  508. package/dist/esm/overlays/alert/Alert.module.css +0 -1
  509. package/dist/esm/overlays/flyout/Flyout.js +0 -152
  510. package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
  511. package/dist/esm/overlays/message/Message.js +0 -84
  512. package/dist/esm/overlays/message/Message.module.css +0 -1
  513. package/dist/esm/overlays/modal/Modal.js +0 -132
  514. package/dist/esm/overlays/modal/Modal.module.css +0 -1
  515. package/dist/esm/overlays/toast/Toast.js +0 -166
  516. package/dist/esm/overlays/toast/Toast.module.css +0 -1
  517. package/dist/esm/overlays/tooltip/Tooltip.js +0 -132
  518. package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
  519. package/dist/esm/types/icons.js +0 -202
  520. package/dist/esm/typography/Link.js +0 -55
  521. package/dist/esm/typography/Typography.module.css +0 -1
  522. package/dist/esm/typography/types.js +0 -41
  523. package/dist/types/components/animations/Animations.d.ts +0 -23
  524. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +0 -17
  525. package/dist/types/components/index.d.ts +0 -33
  526. package/dist/types/context/NotificationCenter.d.ts +0 -11
  527. package/dist/types/core/index.d.ts +0 -9
  528. package/dist/types/core/page/Page.d.ts +0 -23
  529. package/dist/types/core/section/Section.d.ts +0 -7
  530. package/dist/types/hotkeys/HotKey.d.ts +0 -2
  531. package/dist/types/hotkeys/HotKeyLabel.d.ts +0 -2
  532. package/dist/types/hotkeys/HotKeyWrapper.d.ts +0 -11
  533. package/dist/types/hotkeys/commons.d.ts +0 -28
  534. package/dist/types/overlays/alert/Alert.d.ts +0 -41
  535. package/dist/types/overlays/flyout/Flyout.d.ts +0 -57
  536. package/dist/types/overlays/index.d.ts +0 -6
  537. package/dist/types/overlays/message/Message.d.ts +0 -21
  538. package/dist/types/overlays/modal/Modal.d.ts +0 -53
  539. package/dist/types/overlays/toast/Toast.d.ts +0 -33
  540. package/dist/types/overlays/tooltip/Tooltip.d.ts +0 -18
  541. package/dist/types/types/icons.d.ts +0 -197
  542. package/dist/types/typography/Link.d.ts +0 -25
  543. package/dist/types/typography/index.d.ts +0 -6
  544. package/src/components/animations/Animations.module.css +0 -253
  545. package/src/components/animations/Animations.tsx +0 -196
  546. package/src/components/avatar/Avatar.module.css +0 -90
  547. package/src/components/badge/Badge.module.css +0 -165
  548. package/src/components/breadcrumbs/Breadcrumbs.module.css +0 -189
  549. package/src/components/breadcrumbs/Breadcrumbs.tsx +0 -109
  550. package/src/components/button/Button.module.css +0 -375
  551. package/src/components/card/Card.module.css +0 -152
  552. package/src/components/chip/Chip.module.css +0 -118
  553. package/src/components/collapsable/Collapsable.module.css +0 -30
  554. package/src/components/icon/Icon.module.css +0 -71
  555. package/src/components/index.ts +0 -62
  556. package/src/components/media/Media.module.css +0 -112
  557. package/src/context/NotificationCenter.tsx +0 -223
  558. package/src/core/aside/Aside.module.css +0 -231
  559. package/src/core/boundary/ErrorBoundary.module.css +0 -65
  560. package/src/core/headfoot/HeadFoot.module.css +0 -38
  561. package/src/core/index.ts +0 -32
  562. package/src/core/page/Page.module.css +0 -46
  563. package/src/core/page/Page.tsx +0 -101
  564. package/src/core/responsive/Responsive.module.css +0 -85
  565. package/src/core/section/Section.module.css +0 -28
  566. package/src/core/section/Section.tsx +0 -54
  567. package/src/core/theme/Theme.module.css +0 -30
  568. package/src/core/viewport/Viewport.module.css +0 -32
  569. package/src/hooks/useControlledValue.tsx +0 -43
  570. package/src/hotkeys/HotKey.tsx +0 -39
  571. package/src/hotkeys/HotKeyLabel.tsx +0 -61
  572. package/src/hotkeys/HotKeyWrapper.tsx +0 -137
  573. package/src/hotkeys/commons.ts +0 -74
  574. package/src/overlays/alert/Alert.tsx +0 -252
  575. package/src/overlays/flyout/Flyout.tsx +0 -283
  576. package/src/overlays/index.ts +0 -29
  577. package/src/overlays/message/Message.tsx +0 -107
  578. package/src/overlays/modal/Modal.tsx +0 -244
  579. package/src/overlays/toast/Toast.module.css +0 -37
  580. package/src/overlays/toast/Toast.tsx +0 -216
  581. package/src/overlays/tooltip/Tooltip.module.css +0 -53
  582. package/src/overlays/tooltip/Tooltip.tsx +0 -200
  583. package/src/types/icons.ts +0 -426
  584. package/src/typography/Link.tsx +0 -113
  585. package/src/typography/Typography.module.css +0 -68
  586. package/src/typography/index.ts +0 -29
  587. /package/dist/cjs/i18n/{ar.json.js → ar/core.json.js} +0 -0
  588. /package/dist/cjs/i18n/{en.json.js → en/core.json.js} +0 -0
  589. /package/dist/esm/i18n/{ar.json.js → ar/core.json.js} +0 -0
  590. /package/dist/esm/i18n/{en.json.js → en/core.json.js} +0 -0
  591. /package/src/i18n/{ar.json → ar/core.json} +0 -0
  592. /package/src/i18n/{en.json → en/core.json} +0 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * React Fabric
3
+ * @version 1.0.0
4
+ * @license MIT
5
+ * @copyright 2024 Adarsh Pastakia
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+
26
+ import { cn } from "@react-fabric/utilities";
27
+ import { useLayoutEffect, useMemo, useRef, useState } from "react";
28
+ import { useControlledValue } from "../../hooks/useControlledValue";
29
+ import type { CssProp, CustomColors } from "../../types";
30
+ import { getColor, getIconProps } from "../../utils";
31
+ import { StyleEffect } from "../effect/StyleEffect";
32
+ import type { IconProps } from "../icon/Icon";
33
+ import { Icon } from "../icon/Icon";
34
+
35
+ /**
36
+ * Represents a single selectable value type within a Pillbox.
37
+ */
38
+ type ValueType = string | number | boolean;
39
+
40
+ /**
41
+ * Configuration for a single pill option.
42
+ */
43
+ interface PillOption {
44
+ /**
45
+ * Unique value identifying this option.
46
+ */
47
+ value: ValueType;
48
+ /**
49
+ * Display text shown inside the pill.
50
+ */
51
+ label?: React.ReactNode;
52
+ /**
53
+ * Icon configuration rendered before the label.
54
+ */
55
+ icon?: IconProps;
56
+ /**
57
+ * Background color override for the active pill highlight.
58
+ */
59
+ bg?: CustomColors;
60
+ /**
61
+ * Text color override for the active pill.
62
+ */
63
+ color?: CustomColors;
64
+ /**
65
+ * Whether this option is disabled and cannot be selected.
66
+ */
67
+ disabled?: boolean;
68
+ }
69
+
70
+ /**
71
+ * Props for the Pillbox component.
72
+ */
73
+ interface PillboxProps extends CssProp {
74
+ /**
75
+ * Render pills in a full-width flex layout instead of inline.
76
+ */
77
+ block?: boolean;
78
+ /**
79
+ * Enable toggle behavior when exactly two options exist, allowing
80
+ * deselect on click.
81
+ */
82
+ toggle?: boolean;
83
+ /**
84
+ * Hide pills visually when the group is not hovered.
85
+ */
86
+ autoHide?: boolean;
87
+
88
+ /**
89
+ * Array of pill options to render.
90
+ */
91
+ options: PillOption[];
92
+ /**
93
+ * Currently selected value. Controlled component pattern.
94
+ */
95
+ value?: ValueType | null;
96
+ /**
97
+ * Callback invoked when a pill is selected with its value.
98
+ */
99
+ onChange?: (value: ValueType) => void;
100
+ }
101
+
102
+ /**
103
+ * A pill-based selector that renders a horizontal group of clickable options
104
+ * with an animated highlight tracking the selected pill.
105
+ */
106
+ export function Pillbox({ options, className, block, toggle, value, autoHide, onChange }: PillboxProps) {
107
+ const pillboxRef = useRef<HTMLDivElement>(null);
108
+ const [hilightStyle, setHilightStyle] = useState(() => ({ left: 0, top: 0, width: 0, height: 0 }));
109
+ const { currentValue, updateValue } = useControlledValue(value, null);
110
+
111
+ // Allow toggle behavior only when exactly two options exist and toggle is enabled
112
+ const canToggle = useMemo(() => options.length === 2 && toggle, [options, toggle]);
113
+ const currentIndex = useMemo(() => {
114
+ // Use Math.max to default to 0 when no option matches (prevents -1 index)
115
+ return Math.max(
116
+ 0,
117
+ options.findIndex((o) => o.value === currentValue),
118
+ );
119
+ }, [options, currentValue]);
120
+
121
+ const currentOption = options[currentIndex];
122
+
123
+ // Update highlight position whenever the selected index or ref changes
124
+ useLayoutEffect(() => {
125
+ const el = pillboxRef.current?.querySelectorAll("button")[currentIndex];
126
+
127
+ // eslint-disable-next-line @eslint-react/set-state-in-effect
128
+ setHilightStyle({
129
+ left: el?.offsetLeft ?? 0,
130
+ top: el?.offsetTop ?? 0,
131
+ width: el?.offsetWidth ?? 0,
132
+ height: el?.offsetHeight ?? 0,
133
+ });
134
+ }, [pillboxRef, currentIndex]);
135
+
136
+ const handleValueChange = (value: ValueType) => {
137
+ // Handle pill selection with optional toggle behavior
138
+ // In toggle mode, clicking the selected pill switches to the other option
139
+ updateValue((oldValue) => {
140
+ if (canToggle) {
141
+ // Toggle between the two options: click selected pill to switch to the other
142
+ const newValue = oldValue === options[1].value ? options[0].value : options[1].value;
143
+ onChange?.(newValue);
144
+ return newValue;
145
+ } else {
146
+ onChange?.(value);
147
+ return value;
148
+ }
149
+ });
150
+ };
151
+
152
+ return (
153
+ <div ref={pillboxRef} className={cn("fabric-pillbox", className, "relative p-1 outline rounded overflow-hidden")}>
154
+ <div
155
+ className={cn(
156
+ "fabric-pillboxContainer",
157
+ "relative group rounded select-none overflow-hidden flex-nowrap",
158
+ block ? "flex" : "inline-flex",
159
+ autoHide && "not-hover:bg-(--currentBg)",
160
+ )}
161
+ style={
162
+ {
163
+ "--currentBg": getColor(currentOption.bg ?? "primary-500"),
164
+ "--currentColor": getColor(currentOption.color ?? "white"),
165
+ } as React.CSSProperties
166
+ }
167
+ >
168
+ <div
169
+ className={cn(
170
+ "fabric-pillHilight",
171
+ "absolute rounded -z-1! top-0 h-full bg-(--currentBg) transition-[background-color,width,left] ease-in-out duration-500",
172
+ autoHide && "not-group-hover:hidden",
173
+ )}
174
+ style={hilightStyle}
175
+ />
176
+ {options.map((opt, idx) => (
177
+ <button
178
+ key={`${opt.value}`}
179
+ disabled={opt.disabled}
180
+ onClick={() => handleValueChange(opt.value)}
181
+ data-color={opt.color}
182
+ type="button"
183
+ className={cn(
184
+ "fabric-pill",
185
+ "flex justify-center flex-initial has-[.fabric-pillLabel]:px-4 has-[.fabric-pillLabel]:py-1 z-1 rounded not-disabled:cursor-pointer disabled:cursor-not-allowed items-center transition-colors ease-in-out duration-500",
186
+ idx === currentIndex ? "text-(--currentColor)" : "not-disabled:hover:bg-primary-500/20",
187
+ autoHide && idx !== currentIndex && "not-group-hover:hidden",
188
+ opt.disabled && "opacity-50",
189
+ block && "flex-1",
190
+ )}
191
+ >
192
+ {opt.icon && (
193
+ <Icon
194
+ className={cn(
195
+ "fabric-pillIcon",
196
+ "not-has-[~_.fabric-pillLabel]:m-[0.375em] text-[1.125em] has-[~_.fabric-pillLabel]:me-1 inline-block size-[1em] flex-content pointer-events-none",
197
+ )}
198
+ {...getIconProps(opt.icon)}
199
+ />
200
+ )}
201
+ {opt.label && <span className="fabric-pillLabel flex-initial truncate">{opt.label}</span>}
202
+ </button>
203
+ ))}
204
+ </div>
205
+ <StyleEffect />
206
+ </div>
207
+ );
208
+ }
@@ -21,16 +21,14 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { Format } from "@react-fabric/utilities";
25
- import classNames from "classnames";
24
+ import { Format, cn } from "@react-fabric/utilities";
26
25
  import { useMemoDebugger } from "../../hooks/useEffectDebugger";
27
- import { type ColorType } from "../../types";
28
- import { getColorClass } from "../../utils";
29
- import classes from "./Progress.module.css";
26
+ import type { CustomColors } from "../../types";
27
+ import { getColor } from "../../utils";
30
28
 
31
29
  export interface ProgressProps {
32
30
  /**
33
- * progress value (0-100)
31
+ * progress value (0-1)
34
32
  */
35
33
  value: number;
36
34
  /**
@@ -40,7 +38,7 @@ export interface ProgressProps {
40
38
  /**
41
39
  * color
42
40
  */
43
- color?: ColorType;
41
+ color?: CustomColors;
44
42
  /**
45
43
  * animate
46
44
  */
@@ -51,7 +49,7 @@ export interface ProgressProps {
51
49
  label?: string;
52
50
  }
53
51
 
54
- const SizeMap: KeyValue = {
52
+ const SizeMap: KeyValue<string> = {
55
53
  "": "0.875rem",
56
54
  xxs: "3px",
57
55
  xs: "0.375rem",
@@ -61,23 +59,28 @@ const SizeMap: KeyValue = {
61
59
  xl: "2rem",
62
60
  };
63
61
 
64
- export const ProgressBar = ({
65
- value = 0,
66
- size,
67
- color = "primary",
68
- label = "",
69
- animate,
70
- }: ProgressProps) => {
62
+ /**
63
+ * A component that displays a progress bar indicating the completion percentage of a task or operation.
64
+ * The progress bar is styled with a background color and a track that fills based on the value provided.
65
+ * It can also display a label showing the percentage value.
66
+ * The label can be customized or hidden based on the props provided.
67
+ *
68
+ * @example
69
+ * ```jsx
70
+ * <ProgressBar value={0.75} size="md" color="primary-500" label="Loading" animate />
71
+ * // Renders a progress bar with 75% completion, medium size, primary color, and a label "Loading"
72
+ *
73
+ * <ProgressBar value={0.5} size="lg" color="success-500" />
74
+ * // Renders a progress bar with 50% completion, large size, and success color without a label
75
+ * ```
76
+ */
77
+ export function ProgressBar({ value = 0, size, color = "primary-500", label = "", animate }: ProgressProps) {
71
78
  /** ***************** make sure value is between 0 and 100 *******************/
72
- const actualValue = useMemoDebugger(
73
- () => Math.min(Math.max(value, 0), 100),
74
- [value],
75
- "ProgressBar value",
76
- );
79
+ const actualValue = useMemoDebugger(() => Math.min(Math.max(value, 0), 1), [value], "ProgressBar value");
77
80
 
78
81
  const progressVar = useMemoDebugger<KeyValue>(
79
82
  () => ({
80
- "--progress": actualValue,
83
+ "--progress": actualValue * 100,
81
84
  }),
82
85
  [actualValue],
83
86
  "ProgressBar cssVar",
@@ -86,13 +89,10 @@ export const ProgressBar = ({
86
89
  /** ***************** component *******************/
87
90
  return (
88
91
  <div
89
- className={classNames(
90
- classes.progressbar,
91
- getColorClass(color),
92
- "block bg-dimmed relative rounded font-bold overflow-hidden whitespace-nowrap",
93
- )}
92
+ className={cn("fabric-progressbar", "block bg-tint-50 relative rounded font-bold overflow-hidden whitespace-nowrap")}
94
93
  style={{
95
94
  ...progressVar,
95
+ color: getColor(color),
96
96
  minHeight: SizeMap[size ?? ""],
97
97
  fontSize: SizeMap[size ?? ""],
98
98
  }}
@@ -101,22 +101,22 @@ export const ProgressBar = ({
101
101
  >
102
102
  {!["xxs", "xs", "sm"].includes(size ?? "") && (
103
103
  <div className="absolute inset-0 text-center z-0 align-top">
104
- {label} {Format.percent(actualValue / 100)}
104
+ {label} {Format.percent(actualValue)}
105
105
  </div>
106
106
  )}
107
107
  <div
108
- className={classNames(
109
- classes.progressTrack,
110
- animate && classes.progressAnimate,
108
+ className={cn(
109
+ "fabric-progressTrack",
110
+ animate && "fabric-progressAnimate",
111
111
  "h-full overflow-clip bg-current relative z-0",
112
112
  )}
113
113
  />
114
114
  {!["xxs", "xs", "sm"].includes(size ?? "") && (
115
115
  <div
116
- className={classNames("h-full absolute inset-0 overflow-hidden z-1")}
117
- data-label={`${label} ${Format.percent(actualValue / 100)}`}
116
+ className={cn("h-full absolute inset-0 overflow-hidden z-1")}
117
+ data-label={`${label} ${Format.percent(actualValue)}`}
118
118
  />
119
119
  )}
120
120
  </div>
121
121
  );
122
- };
122
+ }
@@ -21,15 +21,14 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { Format } from "@react-fabric/utilities";
25
- import classNames from "classnames";
24
+ import { Format, cn } from "@react-fabric/utilities";
26
25
  import { useMemoDebugger } from "../../hooks/useEffectDebugger";
27
- import { type ColorType } from "../../types";
28
- import { getColorClass } from "../../utils";
26
+ import type { CustomColors } from "../../types";
27
+ import { getColor } from "../../utils";
29
28
 
30
29
  export interface ProgressProps {
31
30
  /**
32
- * progress value (0-100)
31
+ * progress value (0-1)
33
32
  */
34
33
  value: number;
35
34
  /**
@@ -39,10 +38,10 @@ export interface ProgressProps {
39
38
  /**
40
39
  * color
41
40
  */
42
- color?: ColorType;
41
+ color?: CustomColors;
43
42
  }
44
43
 
45
- const SizeMap: KeyValue = {
44
+ const SizeMap: KeyValue<string> = {
46
45
  "": "1rem",
47
46
  sm: "0.875rem",
48
47
  md: "1.125rem",
@@ -50,23 +49,29 @@ const SizeMap: KeyValue = {
50
49
  xl: "2rem",
51
50
  };
52
51
 
53
- export const ProgressCircle = ({
54
- value = 0,
55
- size = "sm",
56
- color = "primary",
57
- }: ProgressProps) => {
52
+ /**
53
+ * A circular progress indicator that visually represents a percentage of completion.
54
+ * It displays a circular track with a stroke that fills based on the `value` prop.
55
+ * The component is customizable with size and color props.
56
+ *
57
+ * @example
58
+ * ```jsx
59
+ * <ProgressCircle value={0.75} size="md" color="primary-500" />
60
+ * // Renders a circular progress indicator with 75% completion, medium size, and primary color.
61
+ *
62
+ * <ProgressCircle value={0.5} size="lg" color="secondary-500" />
63
+ * // Renders a circular progress indicator with 50% completion, large size, and secondary color.
64
+ * ```
65
+ */
66
+ export function ProgressCircle({ value = 0, size = "sm", color = "primary-500" }: ProgressProps) {
58
67
  /** ***************** make sure value is between 0 and 100 *******************/
59
- const actualValue = useMemoDebugger(
60
- () => Math.min(Math.max(value, 0), 100),
61
- [value],
62
- "ProgressCirle value",
63
- );
68
+ const actualValue = useMemoDebugger(() => Math.min(Math.max(value, 0), 1), [value], "ProgressCirle value");
64
69
 
65
70
  /** ***************** calculate stroke offset by actual value *******************/
66
71
  const strokeDashoffset = useMemoDebugger(
67
72
  () => {
68
73
  const circumfrence = Math.PI * 2 * 44;
69
- return circumfrence * (1 - actualValue / 100);
74
+ return circumfrence * (1 - actualValue);
70
75
  },
71
76
  [actualValue],
72
77
  "ProgressCirle dashOffset",
@@ -75,25 +80,12 @@ export const ProgressCircle = ({
75
80
  /** ***************** component *******************/
76
81
  return (
77
82
  <div
78
- className={classNames(
79
- "inline-block w-[4em] h-[4em] text-lg relative",
80
- getColorClass(color),
81
- )}
83
+ className={cn("inline-block w-[4em] h-[4em] text-lg relative")}
82
84
  aria-hidden="true"
83
- style={{ fontSize: SizeMap[size] }}
85
+ style={{ fontSize: SizeMap[size], color: getColor(color) }}
84
86
  >
85
- <svg
86
- viewBox="0 0 100 100"
87
- className={classNames("absolute inset-0 w-full h-full stroke-dimmed")}
88
- >
89
- <circle
90
- cx="50"
91
- cy="50"
92
- r="44"
93
- strokeWidth="12"
94
- strokeOpacity="0.25"
95
- fillOpacity="0"
96
- />
87
+ <svg viewBox="0 0 100 100" className={cn("absolute inset-0 w-full h-full stroke-tint-500")}>
88
+ <circle cx="50" cy="50" r="44" strokeWidth="12" strokeOpacity="0.25" fillOpacity="0" />
97
89
  <circle
98
90
  cx="50"
99
91
  cy="50"
@@ -111,8 +103,8 @@ export const ProgressCircle = ({
111
103
  />
112
104
  </svg>
113
105
  <span className="flex w-full h-full items-center justify-center select-none font-bold text-[0.625em]">
114
- {Format.percent(actualValue / 100)}
106
+ {Format.percent(actualValue)}
115
107
  </span>
116
108
  </div>
117
109
  );
118
- };
110
+ }
@@ -21,36 +21,32 @@
21
21
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import { isString } from "@react-fabric/utilities";
25
- import classNames from "classnames";
26
- import { Fragment, type ReactElement, useMemo } from "react";
27
- import { Tooltip } from "../../overlays";
28
- import {
29
- type AriaProps,
30
- type BadgeType,
31
- type CallbackReturn,
32
- type ChildrenProp,
33
- type ColorType,
34
- type CssProp,
35
- type IconProps,
36
- type PolymorphicProps,
37
- type RefProp,
38
- type TestProps,
39
- type TooltipProp,
24
+ import { cn, isString } from "@react-fabric/utilities";
25
+ import { Fragment, useMemo } from "react";
26
+ import type {
27
+ CallbackReturn,
28
+ ChildrenProp,
29
+ ColorBase,
30
+ CssPropWithMap,
31
+ PolymorphicProps,
32
+ RefProp,
33
+ TestProps,
40
34
  } from "../../types";
41
- import { Badge, getBadgeProps } from "../badge/Badge";
35
+ import { getBadgeProps, getIconProps } from "../../utils";
36
+ import type { BadgeType } from "../badge/Badge";
37
+ import { Badge } from "../badge/Badge";
42
38
  import { DropdownTool } from "../dropdown/DropdownTool";
39
+ import type { IconProps } from "../icon/Icon";
43
40
  import { Icon } from "../icon/Icon";
44
- import classes from "./TabPanel.module.css";
41
+ import type { TooltipType } from "../tooltip/Tooltip";
42
+ import { Tooltip } from "../tooltip/Tooltip";
45
43
 
46
44
  export interface TabProps
47
- extends Partial<ChildrenProp>,
48
- CssProp,
49
- RefProp,
50
- AriaProps,
51
- TestProps,
52
- IconProps,
53
- TooltipProp {
45
+ extends
46
+ Partial<ChildrenProp>,
47
+ CssPropWithMap<{ root: string; label: string; active: string; badge: string }>,
48
+ RefProp<HTMLButtonElement>,
49
+ TestProps {
54
50
  /**
55
51
  * tab id
56
52
  */
@@ -62,11 +58,17 @@ export interface TabProps
62
58
  /**
63
59
  * tab color
64
60
  */
65
- color?: ColorType;
61
+ color?: ColorBase;
62
+ /**
63
+ * icon path or props
64
+ */
65
+ icon?: IconProps;
66
66
  /**
67
67
  * tab badge
68
68
  */
69
69
  badge?: string | number | BadgeType;
70
+
71
+ tooltip?: string | TooltipType;
70
72
  /**
71
73
  * disabled
72
74
  */
@@ -75,14 +77,10 @@ export interface TabProps
75
77
  * tab flex to fill button
76
78
  */
77
79
  tabFlex?: boolean;
78
- /**
79
- * className for active state
80
- */
81
- activeClassName?: string;
82
80
  /**
83
81
  * action dropdown body
84
82
  */
85
- actions?: ReactElement;
83
+ actions?: React.ReactElement;
86
84
  /**
87
85
  * close handler
88
86
  */
@@ -93,35 +91,56 @@ export interface TabProps
93
91
  onClick?: (id: string) => CallbackReturn;
94
92
  }
95
93
 
96
- export const Tab = <Tag extends React.ElementType = "button">({
94
+ /**
95
+ * A component that represents a tab in a tabbed interface. It can display an icon, label, badge, and actions.
96
+ * It supports polymorphic rendering, allowing it to be rendered as different HTML elements.
97
+ * It also supports tooltips, active states, and click handling.
98
+ *
99
+ * @example
100
+ * ```jsx
101
+ * <Tab
102
+ * id="tab1"
103
+ * label="Tab 1"
104
+ * icon="home"
105
+ * badge="New"
106
+ * onClick={(id) => console.log(`Tab clicked: ${id}`)}
107
+ * onClose={() => console.log("Tab closed")}
108
+ * active={true}
109
+ * actions={<button>Action</button>}
110
+ * color="primary"
111
+ * tooltip="This is a tab"
112
+ * activeClassName="bg-blue-100"
113
+ * />
114
+ * // Renders a tab with label "Tab 1", home icon, blue background, white text, badge "New",
115
+ * // and an action button. The tab is active and has a tooltip.
116
+ * ```
117
+ */
118
+ export function Tab<Tag extends React.ElementType = "button">({
97
119
  ref,
98
120
  as,
99
121
  id,
100
122
  className,
123
+ classNames,
101
124
  label,
102
125
  icon,
103
- iconBg,
104
- iconColor,
105
- rtlFlip,
106
126
  badge,
107
127
  disabled,
108
128
  onClose,
109
- // @ts-expect-error ignore
110
- active,
111
- // @ts-expect-error ignore
112
- minimal,
113
129
  onClick,
114
130
  tabFlex,
115
131
  color,
116
132
  actions,
117
133
  tooltip,
118
- activeClassName,
119
- ...aria
120
- }: TabProps & PolymorphicProps<Tag>) => {
134
+ // @ts-expect-error ignore
135
+ active,
136
+ ...props
137
+ }: TabProps & PolymorphicProps<Tag>): React.ReactElement<TabProps> {
121
138
  const badgeProps = useMemo(() => {
122
139
  return getBadgeProps(badge);
123
140
  }, [badge]);
124
141
 
142
+ const minimal = useMemo(() => !label, [label]);
143
+
125
144
  const tooltipProps = useMemo(() => {
126
145
  if (isString(tooltip)) return { content: tooltip };
127
146
 
@@ -136,49 +155,41 @@ export const Tab = <Tag extends React.ElementType = "button">({
136
155
  data-id={id}
137
156
  disabled={disabled}
138
157
  data-color={color}
139
- className={classNames(
140
- classes.tabButton,
158
+ data-inner-clickable
159
+ className={cn(
160
+ "fabric-tabButton",
141
161
  className,
142
- active && "active pointer-events-none",
143
- active && activeClassName,
162
+ classNames?.root,
163
+ !!active && "active pointer-events-none",
164
+ !!active && classNames?.active,
144
165
  disabled && "text-tint-500 pointer-events-none",
145
- tabFlex ? "flex-1" : "flex-initial max-w-36 min-w-24",
146
- "flex items-center justify-center px-1 rounded overflow-hidden",
166
+ tabFlex ? "flex-1" : "flex-initial max-w-36",
167
+ minimal && "min-w-6",
168
+ "flex items-center min-w-18 justify-center overflow-hidden cursor-pointer group/tool",
147
169
  )}
148
170
  onClick={() => !active && onClick?.(id)}
149
- ref={ref as AnyObject}
150
- {...aria}
171
+ ref={ref}
172
+ {...props}
151
173
  >
152
- {icon && (
153
- <Icon
154
- icon={icon}
155
- bg={iconBg}
156
- color={iconColor}
157
- rtlFlip={rtlFlip}
158
- className="flex-content"
159
- />
160
- )}
161
- {!minimal && (
162
- <label className="flex-initial truncate text-center px-1 py-1">
163
- {label}
164
- </label>
165
- )}
174
+ {icon && <Icon className="flex-content p-2" {...getIconProps(icon)} />}
175
+ {!minimal && <label className={cn(classNames?.label, "flex-initial truncate text-center px-1 py-1")}>{label}</label>}
166
176
  {badge && (
167
177
  <Badge
168
- {...badgeProps}
169
- placement={minimal ? "end" : ""}
170
- className={classNames("me-1", badgeProps.className)}
178
+ {...(badgeProps as AnyObject)}
179
+ inline={!minimal}
180
+ placement={minimal ? "end" : undefined}
181
+ className={cn("me-1", classNames?.badge)}
171
182
  />
172
183
  )}
173
- {actions && active && (
174
- <DropdownTool className="bg-base/20 me-1 z-5">{actions}</DropdownTool>
184
+ {actions && (
185
+ <DropdownTool groupHover={!active} className="bg-tint-50/20 me-1 z-5">
186
+ {actions}
187
+ </DropdownTool>
175
188
  )}
176
189
  {onClose && (
177
190
  <span
178
191
  role="none"
179
- className={classNames(
180
- "cursor-pointer me-1 opacity-65 hover:opacity-90 pointer-events-auto",
181
- )}
192
+ className={cn("cursor-pointer mx-1 opacity-65 hover:opacity-90 pointer-events-auto")}
182
193
  onClick={(e) => {
183
194
  onClose?.();
184
195
  e.stopPropagation();
@@ -190,4 +201,4 @@ export const Tab = <Tag extends React.ElementType = "button">({
190
201
  </E>
191
202
  </W>
192
203
  );
193
- };
204
+ }