@react-fabric/core 1.0.0-beta.8 → 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
@@ -21,21 +21,15 @@
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 classNames from "classnames";
25
- import {
26
- Children,
27
- cloneElement,
28
- useCallback,
29
- useEffect,
30
- useMemo,
31
- useState,
32
- } from "react";
33
- import { type CallbackReturn, type ChildrenProp } from "../../types";
24
+ import { cn, getValue } from "@react-fabric/utilities";
25
+ import { Children, cloneElement, useEffect, useMemo, useState } from "react";
26
+ import type { CallbackReturn, ChildrenProp, CssPropWithMap } from "../../types";
34
27
  import { nodeCheck } from "../../utils";
28
+ import type { TabProps } from "./Tab";
35
29
  import { Tab } from "./Tab";
36
- import classes from "./TabPanel.module.css";
37
30
 
38
- export interface TabPanelProps extends ChildrenProp<typeof Tab> {
31
+ export interface TabPanelProps
32
+ extends ChildrenProp<TabProps>, CssPropWithMap<{ root: string; header: string; active: string }> {
39
33
  /**
40
34
  * tab list orientation
41
35
  */
@@ -47,11 +41,15 @@ export interface TabPanelProps extends ChildrenProp<typeof Tab> {
47
41
  /**
48
42
  * tab variations
49
43
  */
50
- variant?: "soft" | "solid" | "outline";
44
+ variant?: "soft" | "solid" | "outline" | "pills";
51
45
  /**
52
46
  * tab button flex to fill tabs
53
47
  */
54
48
  tabFlex?: boolean;
49
+ /**
50
+ * rotate tab sideways for start/end orientation
51
+ */
52
+ tabRotate?: boolean;
55
53
  /**
56
54
  * tab button gap
57
55
  */
@@ -61,9 +59,13 @@ export interface TabPanelProps extends ChildrenProp<typeof Tab> {
61
59
  */
62
60
  activeTab?: string;
63
61
  /**
64
- * tab list className
62
+ * append element
63
+ */
64
+ append?: React.ReactNode;
65
+ /**
66
+ * prepend element
65
67
  */
66
- headerClassName?: string;
68
+ prepend?: React.ReactNode;
67
69
  /**
68
70
  * change handler
69
71
  */
@@ -76,24 +78,64 @@ export interface TabPanelProps extends ChildrenProp<typeof Tab> {
76
78
 
77
79
  // TODO: implement append/prepend tab-bar items
78
80
 
79
- export const TabPanel = ({
81
+ function getFirstTab(tabs: React.ReactElement<TabProps>[]) {
82
+ return tabs.find((tab) => !tab.props.disabled)?.props.id || null;
83
+ }
84
+
85
+ /**
86
+ * A component that provides a tabbed interface for displaying content.
87
+ * It allows users to switch between different tabs, each containing its own content.
88
+ * It supports various orientations, justify options, and variants for the tab header.
89
+ * It also provides hooks for handling tab changes before and after they occur.
90
+ * This component is useful for organizing content into separate sections that can be easily navigated by the user.
91
+ * It can be customized with different styles and behaviors to fit the needs of the application.
92
+ *
93
+ * @example
94
+ * ```jsx
95
+ * <TabPanel
96
+ * orientation="top"
97
+ * activeTab="tab1"
98
+ * justify="start"
99
+ * variant="solid"
100
+ * tabFlex={true}
101
+ * onBeforeChange={(nextTab, currentTab) => {
102
+ * console.log(`Switching from ${currentTab} to ${nextTab}`);
103
+ * return true; // or false to prevent change
104
+ * }}
105
+ * onChange={(id) => console.log(`Active tab changed to: ${id}`)}
106
+ * >
107
+ * <Tab id="tab1" label="Tab 1">Content for Tab 1</Tab>
108
+ * <Tab id="tab2" label="Tab 2">Content for Tab 2</Tab>
109
+ * <Tab id="tab3" label="Tab 3">Content for Tab 3</Tab>
110
+ * </TabPanel>
111
+ * ```
112
+ */
113
+ export function TabPanel({
80
114
  children,
81
- headerClassName,
115
+ className,
116
+ classNames,
82
117
  orientation = "top",
83
118
  activeTab,
84
119
  justify,
85
120
  variant,
86
121
  tabFlex,
122
+ append,
123
+ prepend,
124
+ tabRotate,
87
125
  gap,
88
126
  onBeforeChange,
89
127
  onChange,
90
- }: TabPanelProps) => {
128
+ }: TabPanelProps) {
91
129
  const [active, setActive] = useState<string>();
92
130
 
93
131
  const [tabs, rest] = useMemo(() => {
94
- return Children.toArray(children as AnyObject).reduce<AnyObject[]>(
132
+ // eslint-disable-next-line @eslint-react/no-children-to-array
133
+ return Children.toArray(children as Array<React.ReactNode>).reduce<
134
+ [p: React.ReactElement<TabProps & { active: boolean }>[], o: React.ReactNode[]]
135
+ >(
95
136
  (ret, node) => {
96
- nodeCheck(node, Tab) ? ret[0].push(node) : ret[1].push(node);
137
+ if (nodeCheck(node, Tab)) ret[0].push(node as React.ReactElement<TabProps & { active: boolean }>);
138
+ else ret[1].push(node);
97
139
  return ret;
98
140
  },
99
141
  [[], []],
@@ -101,55 +143,64 @@ export const TabPanel = ({
101
143
  }, [children]);
102
144
 
103
145
  useEffect(() => {
104
- setActive(activeTab);
146
+ // eslint-disable-next-line @eslint-react/set-state-in-effect
147
+ setActive(getValue<string>(`${activeTab ?? getFirstTab(tabs)}`));
148
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
105
149
  }, [activeTab]);
106
150
 
107
151
  const activeTabPanel = useMemo(() => {
108
- return tabs.find((tab: AnyObject) => tab.props.id === active)?.props
109
- .children;
152
+ return tabs.find((tab) => tab.props.id === active)?.props.children;
110
153
  }, [tabs, active]);
111
154
 
112
- const handleClick = useCallback(
113
- (id: string) => {
114
- void Promise.resolve(onBeforeChange?.(id, active)).then((ret) => {
115
- if (ret !== false) {
116
- setActive(id);
117
- onChange?.(id);
118
- }
119
- });
120
- },
121
- [onBeforeChange, onChange, active],
122
- );
155
+ const handleClick = (id: string) => {
156
+ void Promise.resolve(onBeforeChange?.(id, active)).then((ret) => {
157
+ if (ret !== false) {
158
+ setActive(id);
159
+ onChange?.(id);
160
+ }
161
+ });
162
+ };
123
163
 
124
164
  return (
125
165
  <div
126
- className={classNames(
127
- classes.tabPanel,
128
- "area-content grid bg-base overflow-hidden",
129
- )}
166
+ className={cn("fabric-tabPanel", className, classNames?.root, "area-content grid bg-default overflow-hidden")}
130
167
  data-orientation={orientation}
131
168
  data-variant={variant ?? "default"}
132
169
  >
133
170
  <div
134
- className={classNames(
135
- classes.tabList,
136
- headerClassName,
171
+ className={cn(
172
+ "fabric-tabHeader",
173
+ classNames?.header,
174
+ tabRotate && "tab-rotate",
137
175
  justify && `justify-${justify}`,
138
176
  ["start", "end"].includes(orientation) && "flex-col",
139
- "flex flex-nowrap overflow-auto scroll-thin",
177
+ "flex flex-nowrap overflow-hidden items-center",
140
178
  )}
141
- style={{ gap }}
142
179
  >
143
- {tabs.map((node: AnyObject) =>
144
- cloneElement(node, {
145
- tabFlex: node.props.tabFlex ?? tabFlex,
146
- onClick: handleClick,
147
- active: node.props.id === active,
148
- }),
149
- )}
180
+ {prepend}
181
+ <div
182
+ className={cn(
183
+ "fabric-tabList",
184
+ justify && `justify-${justify}`,
185
+ ["start", "end"].includes(orientation) && "flex-col",
186
+ ["bottom", "end"].includes(orientation) ? "self-start" : "self-end",
187
+ "flex flex-1 flex-nowrap overflow-auto scroll-thin",
188
+ )}
189
+ style={{ gap }}
190
+ >
191
+ {tabs.map((node) =>
192
+ cloneElement(node, {
193
+ tabFlex: node.props.tabFlex ?? tabFlex,
194
+ classNames: Object.assign({ active: classNames?.active }, node.props.classNames),
195
+ onClick: handleClick,
196
+ active: node.props.id === active,
197
+ }),
198
+ )}
199
+ </div>
200
+ {append}
150
201
  </div>
151
202
  {rest}
152
203
  {activeTabPanel}
153
204
  </div>
154
205
  );
155
- };
206
+ }
@@ -0,0 +1,115 @@
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 { Fragment, isValidElement } from "react";
28
+ import type { CssPropWithMap } from "../../types";
29
+ import { getIconProps } from "../../utils";
30
+ import { StyleEffect } from "../effect/StyleEffect";
31
+ import type { IconProps } from "../icon/Icon";
32
+ import { Icon } from "../icon/Icon";
33
+
34
+ export interface TitlebarProps {
35
+ title?: string | React.ReactNode;
36
+ /**
37
+ * icon path or props
38
+ */
39
+ icon?: IconProps;
40
+ /**
41
+ * header append actions
42
+ */
43
+ actions?: React.ReactElement | false | null;
44
+ /**
45
+ * header prepend actions
46
+ */
47
+ prepend?: React.ReactElement | false | null;
48
+ }
49
+
50
+ /**
51
+ * Header bar with optional icon, title, and action elements.
52
+ * Renders as a semantic <header> element.
53
+ */
54
+ export function Titlebar({
55
+ title,
56
+ className,
57
+ classNames,
58
+ icon,
59
+ actions,
60
+ prepend,
61
+ onClick,
62
+ }: TitlebarProps & { onClick?: () => void } & CssPropWithMap<{
63
+ root?: string;
64
+ title?: string;
65
+ icon?: string;
66
+ actions?: string;
67
+ prepend?: string;
68
+ }>) {
69
+ return (
70
+ <div
71
+ className={cn(
72
+ "fabric-titlebar",
73
+ "empty:hidden not-empty:border-b border-soft",
74
+ className,
75
+ classNames?.root,
76
+ "grid items-center rounded-t-[inherit] px-2 py-1 relative",
77
+ )}
78
+ data-ref="titlebar"
79
+ >
80
+ <StyleEffect showBorder={false} />
81
+ {isValidElement(title) ? (
82
+ title
83
+ ) : (
84
+ <Fragment>
85
+ {prepend && (
86
+ <div data-ref="titlebar-actions" className={cn("fabric-titlebarActions", classNames?.prepend)}>
87
+ {prepend}
88
+ </div>
89
+ )}
90
+ {icon && (
91
+ <Icon
92
+ className={cn("fabric-titlebarIcon", classNames?.icon, "p-1 text-lg select-none pointer-events-none")}
93
+ {...getIconProps(icon)}
94
+ />
95
+ )}
96
+ {title && (
97
+ <div
98
+ role="none"
99
+ data-ref="titlebar-title"
100
+ onClick={onClick}
101
+ className={cn("fabric-titlebarTitle", classNames?.title, "truncate py-0.5 px-1 select-none")}
102
+ >
103
+ {title}
104
+ </div>
105
+ )}
106
+ {actions && (
107
+ <div data-ref="titlebar-actions" className={cn("fabric-titlebarActions flex gap-px", classNames?.actions)}>
108
+ {actions}
109
+ </div>
110
+ )}
111
+ </Fragment>
112
+ )}
113
+ </div>
114
+ );
115
+ }
@@ -0,0 +1,255 @@
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 {
27
+ FloatingArrow,
28
+ FloatingPortal,
29
+ arrow,
30
+ autoUpdate,
31
+ flip,
32
+ offset,
33
+ safePolygon,
34
+ shift,
35
+ useFloating,
36
+ useHover,
37
+ useInteractions,
38
+ type Placement,
39
+ } from "@floating-ui/react";
40
+ import { cn, isString, mergeRefs } from "@react-fabric/utilities";
41
+ import { Fragment, cloneElement, isValidElement, useEffect, useMemo, useRef } from "react";
42
+ import { Icon } from "../../components/icon/Icon";
43
+ import { useIsRtl } from "../../hooks/useIsRtl";
44
+ import { usePropState } from "../../hooks/usePropState";
45
+ import type { ColorBase, CustomColors } from "../../types/colors";
46
+
47
+ export interface TooltipType {
48
+ /**
49
+ * tooltip content
50
+ */
51
+ content?: string | React.ReactElement;
52
+ /**
53
+ * tooltip color
54
+ */
55
+ color?: CustomColors<ColorBase>;
56
+ /**
57
+ * tooltip placement
58
+ */
59
+ placement?: Placement;
60
+ }
61
+
62
+ export interface TooltipProps extends TooltipType {
63
+ /**
64
+ * force open
65
+ */
66
+ open?: boolean;
67
+ /**
68
+ * show copy action, pass string as copy content
69
+ */
70
+ copyContent?: boolean | string;
71
+ /**
72
+ * disable tooltip
73
+ */
74
+ disabled?: boolean;
75
+
76
+ children: React.ReactElement<KeyValue>;
77
+ }
78
+
79
+ const COLOR_MAP: Record<string, string> = {
80
+ default: "bg-dimmed text-dimmed outline-default",
81
+ primary: "bg-primary-50 text-primary-700 outline-primary-100",
82
+ secondary: "bg-secondary-50 text-secondary-700 outline-secondary-100",
83
+ info: "bg-info-50 text-info-700 outline-info-100",
84
+ danger: "bg-danger-50 text-danger-700 outline-danger-100",
85
+ success: "bg-success-50 text-success-700 outline-success-100",
86
+ warning: "bg-warning-50 text-warning-700 outline-warning-100",
87
+ scarlet: "bg-scarlet-50 text-scarlet-700 outline-scarlet-100",
88
+ pumpkin: "bg-pumpkin-50 text-pumpkin-700 outline-pumpkin-100",
89
+ marigold: "bg-marigold-50 text-marigold-700 outline-marigold-100",
90
+ avacado: "bg-avacado-50 text-avacado-700 outline-avacado-100",
91
+ jade: "bg-jade-50 text-jade-700 outline-jade-100",
92
+ denim: "bg-denim-50 text-denim-700 outline-denim-100",
93
+ iris: "bg-iris-50 text-iris-700 outline-iris-100",
94
+ lilac: "bg-lilac-50 text-lilac-700 outline-lilac-100",
95
+ coral: "bg-coral-50 text-coral-700 outline-coral-100",
96
+ wood: "bg-wood-50 text-wood-700 outline-wood-100",
97
+ };
98
+
99
+ const ARROW_COLOR_MAP: Record<string, string> = {
100
+ default: "fill-dimmed stroke-default",
101
+ primary: "fill-primary-50 stroke-primary-100",
102
+ secondary: "fill-secondary-50 stroke-secondary-100",
103
+ info: "fill-info-50 stroke-info-100",
104
+ danger: "fill-danger-50 stroke-danger-100",
105
+ success: "fill-success-50 stroke-success-100",
106
+ warning: "fill-warning-50 stroke-warning-100",
107
+ scarlet: "fill-scarlet-50 stroke-scarlet-100",
108
+ pumpkin: "fill-pumpkin-50 stroke-pumpkin-100",
109
+ marigold: "fill-marigold-50 stroke-marigold-100",
110
+ avacado: "fill-avacado-50 stroke-avacado-100",
111
+ jade: "fill-jade-50 stroke-jade-100",
112
+ denim: "fill-denim-50 stroke-denim-100",
113
+ iris: "fill-iris-50 stroke-iris-100",
114
+ lilac: "fill-lilac-50 stroke-lilac-100",
115
+ coral: "fill-coral-50 stroke-coral-100",
116
+ wood: "fill-wood-50 stroke-wood-100",
117
+ };
118
+
119
+ /**
120
+ * Floating tooltip that displays content on hover.
121
+ *
122
+ * Renders a tooltip using Floating UI with an arrow, positioned relative
123
+ * to its child element. Supports color theming, copy-to-clipboard action,
124
+ * and RTL-aware placement flipping.
125
+ *
126
+ * @example
127
+ * ```tsx
128
+ * import { Tooltip } from "@react-fabric/core";
129
+ *
130
+ * <Tooltip content="Hello world">
131
+ * <button>Hover me</button>
132
+ * </Tooltip>
133
+ *
134
+ * <Tooltip content="Copy me" copyContent="Copy me">
135
+ * <span>Copy this</span>
136
+ * </Tooltip>
137
+ * ```
138
+ */
139
+ export function Tooltip({
140
+ children,
141
+ color,
142
+ content,
143
+ open,
144
+ copyContent,
145
+ disabled,
146
+ placement: _placement,
147
+ ...rest
148
+ }: TooltipProps) {
149
+ const arrowRef = useRef(null);
150
+ const isRtl = useIsRtl();
151
+ const [isOpen, setIsOpen] = usePropState(open);
152
+
153
+ const placement = useMemo<Placement>(() => {
154
+ if (isRtl)
155
+ return (
156
+ _placement?.includes("left") ? _placement.replace("left", "right") : (_placement?.replace("right", "left") ?? "top")
157
+ ) as Placement;
158
+
159
+ return _placement ?? "top";
160
+ }, [_placement, isRtl]);
161
+
162
+ const { refs, floatingStyles, context } = useFloating({
163
+ open: isOpen,
164
+ strategy: "fixed",
165
+ onOpenChange: !!open || disabled ? undefined : setIsOpen,
166
+ whileElementsMounted: autoUpdate,
167
+ placement,
168
+ middleware: [
169
+ shift({ padding: 8 }),
170
+ flip(),
171
+ offset(9),
172
+ arrow({
173
+ element: arrowRef,
174
+ }),
175
+ ],
176
+ });
177
+
178
+ const hover = useHover(context, {
179
+ restMs: 500,
180
+ delay: { open: 1000 },
181
+ handleClose: copyContent ? safePolygon({ buffer: 1 }) : undefined,
182
+ });
183
+
184
+ const { getReferenceProps, getFloatingProps } = useInteractions([open ? undefined : hover]);
185
+
186
+ useEffect(() => {
187
+ context.update();
188
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
189
+ }, [content]);
190
+
191
+ const innerRef = useMemo(
192
+ () => mergeRefs(children.props.ref, (el: HTMLElement) => refs.setReference(el)),
193
+ [children.props.ref, refs],
194
+ );
195
+
196
+ const copyEl = useMemo(() => {
197
+ if (copyContent) {
198
+ const copyText: string = isString(copyContent) ? copyContent : isString(content) ? content : "";
199
+ const handler = (e: React.MouseEvent) => {
200
+ setIsOpen(false);
201
+ e.stopPropagation();
202
+ void navigator.clipboard.writeText(copyText);
203
+ };
204
+ return (
205
+ <span
206
+ role="none"
207
+ className="ms-2 cursor-pointer text-dimmed flex-content opacity-75 hover:opacity-90 active:opacity-60"
208
+ onClick={handler}
209
+ >
210
+ <Icon icon="icon-[mdi--content-copy]" />
211
+ </span>
212
+ );
213
+ }
214
+ return null;
215
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
216
+ }, [copyContent, content]);
217
+
218
+ return (
219
+ <Fragment>
220
+ {cloneElement(children, {
221
+ ref: innerRef,
222
+ ...(open ? {} : getReferenceProps(rest)),
223
+ })}
224
+ {isOpen && content && (
225
+ <FloatingPortal root={refs.domReference.current?.closest<HTMLElement>(".theme-base") ?? undefined}>
226
+ <dfn
227
+ data-ref="tooltip"
228
+ className={cn(
229
+ "fabric-tooltip z-(--z-tooltip)",
230
+ "select-none text-sm not-italic flex py-1 px-2 max-w-lg! rounded shadow-sm outline",
231
+ COLOR_MAP[color as string] ?? COLOR_MAP.default,
232
+ )}
233
+ ref={(el) => refs.setFloating(el)}
234
+ style={{
235
+ ...floatingStyles,
236
+ }}
237
+ {...getFloatingProps()}
238
+ >
239
+ {isValidElement(content) && content}
240
+ {isString(content) && (
241
+ <span className={cn("font-medium flex-1 break-all whitespace-pre-wrap mixed-lang")}>{content}</span>
242
+ )}
243
+ {copyEl}
244
+ <FloatingArrow
245
+ ref={arrowRef}
246
+ context={context}
247
+ strokeWidth={0.5}
248
+ className={cn(ARROW_COLOR_MAP[color as string] ?? ARROW_COLOR_MAP.default)}
249
+ />
250
+ </dfn>
251
+ </FloatingPortal>
252
+ )}
253
+ </Fragment>
254
+ );
255
+ }