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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/{src/components/actionLabel/ActionLabel.module.css → css/components/_actionLabel.css} +4 -4
  2. package/{src/overlays/alert/Alert.module.css → css/components/_alert.css} +3 -3
  3. package/{src/components/animations/Animations.module.css → css/components/_animations.css} +9 -9
  4. package/{src/components/avatar/Avatar.module.css → css/components/_avatar.css} +11 -11
  5. package/{src/components/badge/Badge.module.css → css/components/_badge.css} +19 -17
  6. package/{src/components/breadcrumbs/Breadcrumbs.module.css → css/components/_breadcrumbs.css} +52 -47
  7. package/{src/components/button/Button.module.css → css/components/_button.css} +77 -83
  8. package/{src/components/card/Card.module.css → css/components/_card.css} +54 -28
  9. package/{src/components/chip/Chip.module.css → css/components/_chip.css} +14 -10
  10. package/{src/components/collapsable/Collapsable.module.css → css/components/_collapsable.css} +3 -3
  11. package/css/components/_divider.css +38 -0
  12. package/{src/components/dropdown/Dropdown.module.css → css/components/_dropdown.css} +2 -2
  13. package/{src/overlays/flyout/Flyout.module.css → css/components/_flyout.css} +6 -6
  14. package/{src/components/icon/Icon.module.css → css/components/_icon.css} +11 -8
  15. package/{src/components/media/Media.module.css → css/components/_media.css} +17 -17
  16. package/{src/components/menu/Menu.module.css → css/components/_menu.css} +21 -20
  17. package/{src/overlays/message/Message.module.css → css/components/_message.css} +2 -2
  18. package/{src/components/meter/Meter.module.css → css/components/_meter.css} +10 -10
  19. package/{src/overlays/modal/Modal.module.css → css/components/_modal.css} +8 -8
  20. package/{src/components/panel/Panel.module.css → css/components/_panel.css} +17 -17
  21. package/{src/components/progress/Progress.module.css → css/components/_progress.css} +7 -10
  22. package/css/components/_stepper.css +86 -0
  23. package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +130 -85
  24. package/{src/overlays/toast/Toast.module.css → css/components/_toast.css} +2 -2
  25. package/css/components/_tooltip.css +29 -0
  26. package/{src/core/content/Content.module.css → css/components/index.css} +26 -18
  27. package/{src/core/aside/Aside.module.css → css/core/_aside.css} +60 -48
  28. package/{src/core/section/Section.module.css → css/core/_content.css} +5 -3
  29. package/{src/core/boundary/ErrorBoundary.module.css → css/core/_errorboundary.css} +9 -9
  30. package/{src/core/headfoot/HeadFoot.module.css → css/core/_headfoot.css} +4 -10
  31. package/{src/core/page/Page.module.css → css/core/_page.css} +10 -14
  32. package/{src/core/responsive/Responsive.module.css → css/core/_responsive.css} +10 -10
  33. package/css/core/_section.css +28 -0
  34. package/{src/core/theme/Theme.module.css → css/core/_theme.css} +3 -3
  35. package/{src/typography/Typography.module.css → css/core/_typography.css} +14 -12
  36. package/{src/core/viewport/Viewport.module.css → css/core/_viewport.css} +7 -3
  37. package/css/core/index.css +33 -0
  38. package/css/reset/_gradients.css +8 -8
  39. package/css/reset/_reset.css +56 -224
  40. package/css/reset/_text.css +14 -29
  41. package/css/reset/_theme.css +331 -52
  42. package/css/reset/index.css +4 -4
  43. package/css/styles.css +7 -6
  44. package/css/theme/_colors.css +320 -0
  45. package/css/theme/_utilities.css +541 -0
  46. package/css/theme/index.css +45 -0
  47. package/dist/cjs/components/actionLabel/ActionLabel.js +26 -8
  48. package/dist/cjs/components/animations/Animations.js +110 -23
  49. package/dist/cjs/components/avatar/Avatar.js +46 -13
  50. package/dist/cjs/components/avatar/AvatarGroup.js +22 -4
  51. package/dist/cjs/components/badge/Badge.js +36 -15
  52. package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +40 -9
  53. package/dist/cjs/components/button/Button.js +50 -28
  54. package/dist/cjs/components/button/ButtonGroup.js +30 -3
  55. package/dist/cjs/components/button/ConfirmButton.js +28 -2
  56. package/dist/cjs/components/button/ToggleButtonGroup.js +41 -15
  57. package/dist/cjs/components/callout/Callout.js +44 -4
  58. package/dist/cjs/components/card/Card.js +60 -18
  59. package/dist/cjs/components/card/CardCover.js +36 -5
  60. package/dist/cjs/components/card/FlipContent.js +56 -0
  61. package/dist/cjs/components/chip/Chip.js +40 -20
  62. package/dist/cjs/components/collapsable/Collapsable.js +30 -5
  63. package/dist/cjs/components/divider/Divider.js +30 -7
  64. package/dist/cjs/components/dropdown/Dropdown.js +48 -9
  65. package/dist/cjs/components/dropdown/DropdownTool.js +1 -1
  66. package/dist/cjs/components/empty/EmptyContent.js +37 -7
  67. package/dist/cjs/components/icon/Icon.js +76 -13
  68. package/dist/cjs/components/media/Media.js +172 -75
  69. package/dist/cjs/components/menu/ContextMenu.js +19 -0
  70. package/dist/cjs/components/menu/Menu.js +76 -21
  71. package/dist/cjs/components/menu/MenuItem.js +54 -26
  72. package/dist/cjs/components/meter/Meter.js +26 -3
  73. package/dist/cjs/components/navigator/Navigator.js +48 -15
  74. package/dist/cjs/components/panel/Panel.js +53 -22
  75. package/dist/cjs/components/panel/PanelGroup.js +25 -2
  76. package/dist/cjs/components/panel/PanelStack.js +31 -2
  77. package/dist/cjs/components/progress/ProgressBar.js +31 -9
  78. package/dist/cjs/components/progress/ProgressCircle.js +29 -7
  79. package/dist/cjs/components/tabpanel/Tab.js +39 -15
  80. package/dist/cjs/components/tabpanel/TabPanel.js +56 -16
  81. package/dist/cjs/context/Global.js +28 -1
  82. package/dist/cjs/context/NotificationCenter.js +3 -3
  83. package/dist/cjs/core/aside/Aside.js +48 -22
  84. package/dist/cjs/core/boundary/ErrorBoundary.js +25 -8
  85. package/dist/cjs/core/boundary/ErrorIcon.js +1 -2
  86. package/dist/cjs/core/content/Content.js +7 -3
  87. package/dist/cjs/core/headfoot/HeadFoot.js +48 -22
  88. package/dist/cjs/core/page/Page.js +40 -39
  89. package/dist/cjs/core/responsive/Responsive.js +59 -6
  90. package/dist/cjs/core/section/Section.js +12 -29
  91. package/dist/cjs/core/theme/ThemeProvider.js +32 -10
  92. package/dist/cjs/core/viewport/Viewport.js +18 -2
  93. package/dist/cjs/hooks/useControlledValue.js +12 -0
  94. package/dist/cjs/hooks/useDebounce.js +14 -1
  95. package/dist/cjs/hooks/useEffectDebugger.js +54 -2
  96. package/dist/cjs/hooks/useIsDark.js +8 -0
  97. package/dist/cjs/hooks/useIsRtl.js +12 -0
  98. package/dist/cjs/hooks/useNavigator.js +6 -4
  99. package/dist/cjs/hooks/useOverlayService.js +24 -0
  100. package/dist/cjs/hooks/usePropToggle.js +16 -5
  101. package/dist/cjs/hooks/useResize.js +18 -0
  102. package/dist/cjs/hooks/useResizeObserver.js +20 -1
  103. package/dist/cjs/hooks/useStepper.js +75 -0
  104. package/dist/cjs/hooks/useStorage.js +39 -0
  105. package/dist/cjs/hotkeys/HotKeyLabel.js +1 -1
  106. package/dist/cjs/hotkeys/HotKeyWrapper.js +3 -1
  107. package/dist/cjs/index.js +11 -2
  108. package/dist/cjs/overlays/alert/Alert.js +23 -15
  109. package/dist/cjs/overlays/flyout/Flyout.js +48 -64
  110. package/dist/cjs/overlays/message/Message.js +8 -3
  111. package/dist/cjs/overlays/modal/Modal.js +17 -20
  112. package/dist/cjs/overlays/toast/Toast.js +20 -10
  113. package/dist/cjs/overlays/tooltip/Tooltip.js +24 -11
  114. package/dist/cjs/types/icons.js +17 -4
  115. package/dist/cjs/typography/Abbr.js +35 -7
  116. package/dist/cjs/typography/{Link.js → Anchor.js} +23 -5
  117. package/dist/cjs/typography/Mark.js +25 -5
  118. package/dist/cjs/typography/Text.js +30 -5
  119. package/dist/cjs/typography/Title.js +19 -4
  120. package/dist/cjs/utils/cloneElement.js +47 -0
  121. package/dist/cjs/utils/getColor.js +1 -18
  122. package/dist/esm/components/actionLabel/ActionLabel.js +26 -8
  123. package/dist/esm/components/animations/Animations.js +111 -24
  124. package/dist/esm/components/avatar/Avatar.js +46 -13
  125. package/dist/esm/components/avatar/AvatarGroup.js +22 -4
  126. package/dist/esm/components/badge/Badge.js +38 -17
  127. package/dist/esm/components/breadcrumbs/Breadcrumbs.js +40 -9
  128. package/dist/esm/components/button/Button.js +52 -30
  129. package/dist/esm/components/button/ButtonGroup.js +31 -4
  130. package/dist/esm/components/button/ConfirmButton.js +28 -2
  131. package/dist/esm/components/button/ToggleButtonGroup.js +42 -16
  132. package/dist/esm/components/callout/Callout.js +44 -4
  133. package/dist/esm/components/card/Card.js +61 -19
  134. package/dist/esm/components/card/CardCover.js +36 -5
  135. package/dist/esm/components/card/FlipContent.js +56 -0
  136. package/dist/esm/components/chip/Chip.js +42 -22
  137. package/dist/esm/components/collapsable/Collapsable.js +30 -5
  138. package/dist/esm/components/divider/Divider.js +31 -8
  139. package/dist/esm/components/dropdown/Dropdown.js +48 -9
  140. package/dist/esm/components/dropdown/DropdownTool.js +1 -1
  141. package/dist/esm/components/empty/EmptyContent.js +37 -7
  142. package/dist/esm/components/icon/Icon.js +78 -16
  143. package/dist/esm/components/media/Media.js +173 -76
  144. package/dist/esm/components/menu/ContextMenu.js +19 -0
  145. package/dist/esm/components/menu/Menu.js +78 -23
  146. package/dist/esm/components/menu/MenuItem.js +49 -21
  147. package/dist/esm/components/meter/Meter.js +26 -3
  148. package/dist/esm/components/navigator/Navigator.js +48 -15
  149. package/dist/esm/components/panel/Panel.js +54 -23
  150. package/dist/esm/components/panel/PanelGroup.js +25 -2
  151. package/dist/esm/components/panel/PanelStack.js +31 -2
  152. package/dist/esm/components/progress/ProgressBar.js +31 -9
  153. package/dist/esm/components/progress/ProgressCircle.js +29 -7
  154. package/dist/esm/components/tabpanel/Tab.js +40 -16
  155. package/dist/esm/components/tabpanel/TabPanel.js +56 -16
  156. package/dist/esm/context/Global.js +28 -1
  157. package/dist/esm/context/NotificationCenter.js +3 -3
  158. package/dist/esm/core/aside/Aside.js +49 -23
  159. package/dist/esm/core/boundary/ErrorBoundary.js +25 -8
  160. package/dist/esm/core/boundary/ErrorIcon.js +1 -2
  161. package/dist/esm/core/content/Content.js +7 -3
  162. package/dist/esm/core/headfoot/HeadFoot.js +48 -22
  163. package/dist/esm/core/page/Page.js +41 -40
  164. package/dist/esm/core/responsive/Responsive.js +59 -6
  165. package/dist/esm/core/section/Section.js +12 -29
  166. package/dist/esm/core/theme/ThemeProvider.js +32 -10
  167. package/dist/esm/core/viewport/Viewport.js +18 -2
  168. package/dist/esm/hooks/useControlledValue.js +12 -0
  169. package/dist/esm/hooks/useDebounce.js +14 -1
  170. package/dist/esm/hooks/useEffectDebugger.js +54 -2
  171. package/dist/esm/hooks/useIsDark.js +8 -0
  172. package/dist/esm/hooks/useIsRtl.js +12 -0
  173. package/dist/esm/hooks/useNavigator.js +7 -5
  174. package/dist/esm/hooks/useOverlayService.js +24 -0
  175. package/dist/esm/hooks/usePropToggle.js +16 -5
  176. package/dist/esm/hooks/useResize.js +18 -0
  177. package/dist/esm/hooks/useResizeObserver.js +20 -1
  178. package/dist/esm/hooks/useStepper.js +75 -0
  179. package/dist/esm/hooks/useStorage.js +39 -0
  180. package/dist/esm/hotkeys/HotKeyLabel.js +1 -1
  181. package/dist/esm/hotkeys/HotKeyWrapper.js +3 -1
  182. package/dist/esm/index.js +6 -2
  183. package/dist/esm/overlays/alert/Alert.js +24 -16
  184. package/dist/esm/overlays/flyout/Flyout.js +52 -68
  185. package/dist/esm/overlays/message/Message.js +9 -4
  186. package/dist/esm/overlays/modal/Modal.js +19 -22
  187. package/dist/esm/overlays/toast/Toast.js +21 -11
  188. package/dist/esm/overlays/tooltip/Tooltip.js +24 -11
  189. package/dist/esm/types/icons.js +17 -4
  190. package/dist/esm/typography/Abbr.js +35 -7
  191. package/dist/esm/typography/{Link.js → Anchor.js} +24 -6
  192. package/dist/esm/typography/Mark.js +25 -5
  193. package/dist/esm/typography/Text.js +31 -6
  194. package/dist/esm/typography/Title.js +20 -5
  195. package/dist/esm/utils/cloneElement.js +47 -0
  196. package/dist/esm/utils/getColor.js +2 -16
  197. package/dist/types/components/actionLabel/ActionLabel.d.ts +21 -2
  198. package/dist/types/components/animations/Animations.d.ts +84 -5
  199. package/dist/types/components/avatar/Avatar.d.ts +34 -6
  200. package/dist/types/components/avatar/AvatarGroup.d.ts +19 -1
  201. package/dist/types/components/badge/Badge.d.ts +37 -3
  202. package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +31 -2
  203. package/dist/types/components/button/Button.d.ts +39 -7
  204. package/dist/types/components/button/ButtonGroup.d.ts +28 -3
  205. package/dist/types/components/button/ConfirmButton.d.ts +23 -3
  206. package/dist/types/components/button/ToggleButtonGroup.d.ts +39 -11
  207. package/dist/types/components/callout/Callout.d.ts +29 -3
  208. package/dist/types/components/card/Card.d.ts +44 -4
  209. package/dist/types/components/card/CardCover.d.ts +25 -0
  210. package/dist/types/components/card/FlipContent.d.ts +28 -0
  211. package/dist/types/components/chip/Chip.d.ts +34 -5
  212. package/dist/types/components/collapsable/Collapsable.d.ts +28 -2
  213. package/dist/types/components/divider/Divider.d.ts +30 -7
  214. package/dist/types/components/dropdown/Dropdown.d.ts +40 -1
  215. package/dist/types/components/dropdown/DropdownTool.d.ts +25 -0
  216. package/dist/types/components/empty/EmptyContent.d.ts +32 -3
  217. package/dist/types/components/icon/Icon.d.ts +40 -8
  218. package/dist/types/components/index.d.ts +3 -2
  219. package/dist/types/components/media/Media.d.ts +54 -0
  220. package/dist/types/components/menu/ContextMenu.d.ts +19 -1
  221. package/dist/types/components/menu/Menu.d.ts +29 -0
  222. package/dist/types/components/menu/MenuItem.d.ts +22 -2
  223. package/dist/types/components/menu/types.d.ts +9 -3
  224. package/dist/types/components/meter/Meter.d.ts +24 -0
  225. package/dist/types/components/navigator/Navigator.d.ts +29 -4
  226. package/dist/types/components/panel/Panel.d.ts +43 -4
  227. package/dist/types/components/panel/PanelGroup.d.ts +24 -0
  228. package/dist/types/components/panel/PanelStack.d.ts +31 -0
  229. package/dist/types/components/progress/ProgressBar.d.ts +23 -3
  230. package/dist/types/components/progress/ProgressCircle.d.ts +22 -3
  231. package/dist/types/components/tabpanel/Tab.d.ts +38 -4
  232. package/dist/types/components/tabpanel/TabPanel.d.ts +51 -2
  233. package/dist/types/context/Global.d.ts +24 -1
  234. package/dist/types/core/aside/Aside.d.ts +45 -6
  235. package/dist/types/core/boundary/ErrorBoundary.d.ts +18 -2
  236. package/dist/types/core/content/Content.d.ts +6 -1
  237. package/dist/types/core/headfoot/HeadFoot.d.ts +41 -9
  238. package/dist/types/core/page/Page.d.ts +32 -4
  239. package/dist/types/core/responsive/Responsive.d.ts +58 -3
  240. package/dist/types/core/section/Section.d.ts +18 -3
  241. package/dist/types/core/theme/ThemeProvider.d.ts +25 -5
  242. package/dist/types/core/viewport/Viewport.d.ts +15 -1
  243. package/dist/types/hooks/useControlledValue.d.ts +13 -2
  244. package/dist/types/hooks/useDebounce.d.ts +12 -0
  245. package/dist/types/hooks/useEffectDebugger.d.ts +49 -0
  246. package/dist/types/hooks/useIsDark.d.ts +8 -0
  247. package/dist/types/hooks/useIsRtl.d.ts +12 -0
  248. package/dist/types/hooks/useNavigator.d.ts +18 -1
  249. package/dist/types/hooks/useOverlayService.d.ts +28 -9
  250. package/dist/types/hooks/usePropToggle.d.ts +16 -5
  251. package/dist/types/hooks/useResize.d.ts +19 -1
  252. package/dist/types/hooks/useResizeObserver.d.ts +20 -1
  253. package/dist/types/hooks/useStepper.d.ts +14 -0
  254. package/dist/types/hooks/useStorage.d.ts +38 -0
  255. package/dist/types/index.d.ts +4 -0
  256. package/dist/types/overlays/alert/Alert.d.ts +16 -5
  257. package/dist/types/overlays/flyout/Flyout.d.ts +9 -4
  258. package/dist/types/overlays/message/Message.d.ts +16 -5
  259. package/dist/types/overlays/modal/Modal.d.ts +13 -4
  260. package/dist/types/overlays/toast/Toast.d.ts +16 -5
  261. package/dist/types/overlays/tooltip/Tooltip.d.ts +2 -2
  262. package/dist/types/types/icons.d.ts +17 -3
  263. package/dist/types/types/index.d.ts +20 -22
  264. package/dist/types/typography/Abbr.d.ts +34 -4
  265. package/dist/types/typography/Anchor.d.ts +42 -0
  266. package/dist/types/typography/Copy.d.ts +15 -0
  267. package/dist/types/typography/Mark.d.ts +22 -4
  268. package/dist/types/typography/Text.d.ts +27 -1
  269. package/dist/types/typography/Title.d.ts +16 -1
  270. package/dist/types/typography/index.d.ts +1 -1
  271. package/dist/types/utils/cloneElement.d.ts +1 -0
  272. package/dist/types/utils/getColor.d.ts +1 -4
  273. package/dist/types/utils/index.d.ts +1 -0
  274. package/package.json +14 -16
  275. package/src/components/actionLabel/ActionLabel.tsx +26 -8
  276. package/src/components/animations/Animations.tsx +115 -36
  277. package/src/components/avatar/Avatar.tsx +51 -15
  278. package/src/components/avatar/AvatarGroup.tsx +23 -5
  279. package/src/components/badge/Badge.tsx +50 -22
  280. package/src/components/breadcrumbs/Breadcrumbs.tsx +43 -10
  281. package/src/components/button/Button.tsx +74 -42
  282. package/src/components/button/ButtonGroup.tsx +33 -7
  283. package/src/components/button/ConfirmButton.tsx +31 -3
  284. package/src/components/button/ToggleButtonGroup.tsx +74 -47
  285. package/src/components/callout/Callout.tsx +55 -12
  286. package/src/components/card/Card.tsx +84 -25
  287. package/src/components/card/CardCover.tsx +36 -6
  288. package/src/components/card/FlipContent.tsx +90 -0
  289. package/src/components/chip/Chip.tsx +53 -25
  290. package/src/components/collapsable/Collapsable.tsx +33 -8
  291. package/src/components/divider/Divider.tsx +42 -16
  292. package/src/components/dropdown/Dropdown.tsx +47 -12
  293. package/src/components/dropdown/DropdownTool.tsx +27 -2
  294. package/src/components/empty/EmptyContent.tsx +49 -8
  295. package/src/components/icon/Icon.tsx +96 -18
  296. package/src/components/index.ts +3 -2
  297. package/src/components/media/Media.tsx +193 -104
  298. package/src/components/menu/ContextMenu.tsx +19 -0
  299. package/src/components/menu/Menu.tsx +87 -30
  300. package/src/components/menu/MenuItem.tsx +44 -19
  301. package/src/components/menu/types.ts +9 -8
  302. package/src/components/meter/Meter.tsx +27 -4
  303. package/src/components/navigator/Navigator.tsx +58 -9
  304. package/src/components/panel/Panel.tsx +53 -21
  305. package/src/components/panel/PanelGroup.tsx +25 -2
  306. package/src/components/panel/PanelStack.tsx +33 -2
  307. package/src/components/progress/ProgressBar.tsx +33 -14
  308. package/src/components/progress/ProgressCircle.tsx +29 -13
  309. package/src/components/tabpanel/Tab.tsx +47 -24
  310. package/src/components/tabpanel/TabPanel.tsx +79 -13
  311. package/src/context/Global.tsx +28 -1
  312. package/src/context/NotificationCenter.tsx +3 -3
  313. package/src/core/aside/Aside.tsx +56 -34
  314. package/src/core/boundary/ErrorBoundary.tsx +26 -8
  315. package/src/core/boundary/ErrorIcon.tsx +1 -2
  316. package/src/core/content/Content.tsx +7 -3
  317. package/src/core/headfoot/HeadFoot.tsx +44 -37
  318. package/src/core/page/Page.tsx +42 -20
  319. package/src/core/responsive/Responsive.tsx +66 -8
  320. package/src/core/section/Section.tsx +26 -4
  321. package/src/core/theme/ThemeProvider.tsx +35 -14
  322. package/src/core/viewport/Viewport.tsx +16 -3
  323. package/src/hooks/useControlledValue.tsx +12 -0
  324. package/src/hooks/useDebounce.ts +13 -1
  325. package/src/hooks/useEffectDebugger.ts +50 -2
  326. package/src/hooks/useIsDark.ts +8 -0
  327. package/src/hooks/useIsRtl.ts +12 -0
  328. package/src/hooks/useNavigator.tsx +28 -5
  329. package/src/hooks/useOverlayService.tsx +33 -8
  330. package/src/hooks/usePropToggle.ts +16 -5
  331. package/src/hooks/useResize.ts +19 -1
  332. package/src/hooks/useResizeObserver.ts +32 -9
  333. package/src/hooks/useStepper.tsx +68 -0
  334. package/src/hooks/useStorage.ts +38 -0
  335. package/src/hotkeys/HotKeyLabel.tsx +1 -1
  336. package/src/hotkeys/HotKeyWrapper.tsx +3 -1
  337. package/src/index.ts +5 -0
  338. package/src/overlays/alert/Alert.tsx +50 -34
  339. package/src/overlays/flyout/Flyout.tsx +73 -97
  340. package/src/overlays/message/Message.tsx +28 -9
  341. package/src/overlays/modal/Modal.tsx +36 -30
  342. package/src/overlays/toast/Toast.tsx +42 -30
  343. package/src/overlays/tooltip/Tooltip.tsx +43 -18
  344. package/src/types/global.d.ts +8 -0
  345. package/src/types/icons.ts +32 -6
  346. package/src/types/index.ts +261 -45
  347. package/src/typography/Abbr.tsx +45 -11
  348. package/src/typography/{Link.tsx → Anchor.tsx} +26 -14
  349. package/src/typography/Copy.tsx +15 -0
  350. package/src/typography/Mark.tsx +25 -10
  351. package/src/typography/Text.tsx +31 -13
  352. package/src/typography/Title.tsx +18 -7
  353. package/src/typography/index.ts +1 -1
  354. package/src/{overlays/tooltip/Tooltip.module.css → utils/cloneElement.ts} +21 -27
  355. package/src/utils/getColor.ts +1 -17
  356. package/src/utils/index.ts +1 -0
  357. package/css/index.js +0 -250
  358. package/css/tailwind/colors.ts +0 -158
  359. package/dist/cjs/components/actionLabel/ActionLabel.module.css +0 -1
  360. package/dist/cjs/components/animations/Animations.module.css +0 -1
  361. package/dist/cjs/components/avatar/Avatar.module.css +0 -1
  362. package/dist/cjs/components/badge/Badge.module.css +0 -1
  363. package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  364. package/dist/cjs/components/button/Button.module.css +0 -1
  365. package/dist/cjs/components/card/Card.module.css +0 -1
  366. package/dist/cjs/components/chip/Chip.module.css +0 -1
  367. package/dist/cjs/components/collapsable/Collapsable.module.css +0 -1
  368. package/dist/cjs/components/dropdown/Dropdown.module.css +0 -1
  369. package/dist/cjs/components/icon/Icon.module.css +0 -1
  370. package/dist/cjs/components/media/Media.module.css +0 -1
  371. package/dist/cjs/components/menu/Menu.module.css +0 -1
  372. package/dist/cjs/components/meter/Meter.module.css +0 -1
  373. package/dist/cjs/components/panel/Panel.module.css +0 -1
  374. package/dist/cjs/components/progress/Progress.module.css +0 -1
  375. package/dist/cjs/components/tabpanel/TabPanel.module.css +0 -1
  376. package/dist/cjs/core/aside/Aside.module.css +0 -1
  377. package/dist/cjs/core/boundary/ErrorBoundary.module.css +0 -1
  378. package/dist/cjs/core/content/Content.module.css +0 -1
  379. package/dist/cjs/core/headfoot/HeadFoot.module.css +0 -1
  380. package/dist/cjs/core/page/Page.module.css +0 -1
  381. package/dist/cjs/core/responsive/Responsive.module.css +0 -1
  382. package/dist/cjs/core/section/Section.module.css +0 -1
  383. package/dist/cjs/core/theme/Theme.module.css +0 -1
  384. package/dist/cjs/core/viewport/Viewport.module.css +0 -1
  385. package/dist/cjs/overlays/alert/Alert.module.css +0 -1
  386. package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
  387. package/dist/cjs/overlays/message/Message.module.css +0 -1
  388. package/dist/cjs/overlays/modal/Modal.module.css +0 -1
  389. package/dist/cjs/overlays/toast/Toast.module.css +0 -1
  390. package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
  391. package/dist/cjs/typography/Typography.module.css +0 -1
  392. package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
  393. package/dist/esm/components/animations/Animations.module.css +0 -1
  394. package/dist/esm/components/avatar/Avatar.module.css +0 -1
  395. package/dist/esm/components/badge/Badge.module.css +0 -1
  396. package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
  397. package/dist/esm/components/button/Button.module.css +0 -1
  398. package/dist/esm/components/card/Card.module.css +0 -1
  399. package/dist/esm/components/chip/Chip.module.css +0 -1
  400. package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
  401. package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
  402. package/dist/esm/components/icon/Icon.module.css +0 -1
  403. package/dist/esm/components/media/Media.module.css +0 -1
  404. package/dist/esm/components/menu/Menu.module.css +0 -1
  405. package/dist/esm/components/meter/Meter.module.css +0 -1
  406. package/dist/esm/components/panel/Panel.module.css +0 -1
  407. package/dist/esm/components/progress/Progress.module.css +0 -1
  408. package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
  409. package/dist/esm/core/aside/Aside.module.css +0 -1
  410. package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
  411. package/dist/esm/core/content/Content.module.css +0 -1
  412. package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
  413. package/dist/esm/core/page/Page.module.css +0 -1
  414. package/dist/esm/core/responsive/Responsive.module.css +0 -1
  415. package/dist/esm/core/section/Section.module.css +0 -1
  416. package/dist/esm/core/theme/Theme.module.css +0 -1
  417. package/dist/esm/core/viewport/Viewport.module.css +0 -1
  418. package/dist/esm/overlays/alert/Alert.module.css +0 -1
  419. package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
  420. package/dist/esm/overlays/message/Message.module.css +0 -1
  421. package/dist/esm/overlays/modal/Modal.module.css +0 -1
  422. package/dist/esm/overlays/toast/Toast.module.css +0 -1
  423. package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
  424. package/dist/esm/typography/Typography.module.css +0 -1
  425. package/dist/types/typography/Link.d.ts +0 -25
@@ -23,31 +23,35 @@
23
23
 
24
24
  import { isString, isSvgPath } from "@react-fabric/utilities";
25
25
  import classNames from "classnames";
26
- import { useMemo } from "react";
26
+ import { isValidElement, useEffect, useMemo, useState } from "react";
27
27
  import {
28
28
  type AriaProps,
29
29
  type ColorType,
30
30
  type CssProp,
31
+ type PaletteType,
31
32
  type RefProp,
32
33
  type SizeType,
33
34
  type TestProps,
34
35
  } from "../../types";
35
- import { getBgClass, getColor, getColorClass } from "../../utils";
36
- import classes from "./Icon.module.css";
36
+ import { getColor } from "../../utils";
37
37
 
38
- export interface IconProps extends CssProp, AriaProps, RefProp, TestProps {
38
+ export interface Props extends CssProp, AriaProps, RefProp, TestProps {
39
39
  /**
40
40
  * svg path / webfont className / 1-4 letter text
41
41
  */
42
- icon: string;
42
+ icon: string | JSX.Element;
43
+ /**
44
+ * icon image source URL, if failed to load then shows icon
45
+ */
46
+ iconSrc?: string;
43
47
  /**
44
48
  * background color (CSS color / tailwind color)
45
49
  */
46
- bg?: ColorType | string;
50
+ bg?: ColorType | PaletteType | string;
47
51
  /**
48
52
  * icon color (CSS color / tailwind color)
49
53
  */
50
- color?: ColorType | string;
54
+ color?: ColorType | PaletteType | string;
51
55
  /**
52
56
  * flip icon in rtl
53
57
  */
@@ -68,12 +72,39 @@ export interface IconProps extends CssProp, AriaProps, RefProp, TestProps {
68
72
  * apply animation
69
73
  */
70
74
  animate?: "spin" | "pulse" | "bounce";
75
+ disabled?: boolean;
71
76
  /**
72
77
  * click handler
73
78
  */
74
79
  onClick?: React.MouseEventHandler;
75
80
  }
76
81
 
82
+ export type IconProps =
83
+ | string
84
+ | JSX.Element
85
+ | Pick<
86
+ Props,
87
+ | "icon"
88
+ | "iconSrc"
89
+ | "bg"
90
+ | "color"
91
+ | "size"
92
+ | "rtlFlip"
93
+ | "viewBox"
94
+ | "rounded"
95
+ | "animate"
96
+ >;
97
+
98
+ export const getIconProps = (props: IconProps): Props => {
99
+ if (typeof props === "string") {
100
+ return { icon: props };
101
+ }
102
+ if (isValidElement(props)) {
103
+ return { icon: props };
104
+ }
105
+ return props as unknown as Props;
106
+ };
107
+
77
108
  const SvgTextSize = ["", ".875em", ".525em", ".35em", ".25em"];
78
109
  const SizeMap: KeyValue<string> = {
79
110
  xs: "0.625rem",
@@ -84,22 +115,56 @@ const SizeMap: KeyValue<string> = {
84
115
  };
85
116
 
86
117
  /**
87
- * An icon is a display component for svg icon path / image
118
+ * A versatile icon component that supports SVG paths, webfont icons, and text icons.
119
+ * It can be styled with background color, icon color, size, and animations.
120
+ * It also supports RTL flipping and rounded corners.
121
+ * The component can be used as a standalone icon or as part of other components.
122
+ * It accepts various properties to customize its appearance and behavior.
123
+ * These include `bg`, `color`, `size`, `rtlFlip`, `animate`, and `rounded`.
124
+ *
125
+ * @param {IconProps} props - The properties for the Icon component.
126
+ * @returns {JSX.Element} The rendered Icon component.
127
+ *
128
+ * @example
129
+ * ```jsx
130
+ * <Icon
131
+ * icon="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"
132
+ * bg="bg-blue-500"
133
+ * color="text-white"
134
+ * size="lg"
135
+ * rtlFlip={true}
136
+ * animate="spin"
137
+ * rounded={true}
138
+ * onClick={() => console.log("Icon clicked")}
139
+ * />
140
+ * // Renders an icon with a SVG path, blue background, white text color,
141
+ * // large size, RTL flip, spin animation, rounded corners, and a click handler.
142
+ * ```
143
+ *
144
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-icon--docs} for more details.
88
145
  */
89
146
  export const Icon = ({
90
147
  ref,
91
148
  icon,
149
+ iconSrc,
92
150
  bg,
93
151
  color,
94
152
  size = "",
95
153
  rtlFlip,
96
154
  animate,
97
155
  rounded,
156
+ disabled,
98
157
  viewBox = "0 0 24 24",
99
158
  className,
100
159
  onClick,
101
160
  ...rest
102
- }: IconProps) => {
161
+ }: Props) => {
162
+ const [imageFailed, setImageFailed] = useState(false);
163
+
164
+ useEffect(() => {
165
+ setImageFailed(false);
166
+ }, [iconSrc]);
167
+
103
168
  /** ***************** style map *******************/
104
169
  const styles = useMemo(() => {
105
170
  const s: KeyValue = {};
@@ -125,6 +190,7 @@ export const Icon = ({
125
190
 
126
191
  /** ***************** render icon *******************/
127
192
  const iconEl = useMemo(() => {
193
+ if (isValidElement(icon)) return icon;
128
194
  if (!isString(icon)) {
129
195
  throw Error("Invalid icon expected string");
130
196
  }
@@ -140,7 +206,7 @@ export const Icon = ({
140
206
  dy=".1em"
141
207
  dominantBaseline="middle"
142
208
  textAnchor="middle"
143
- style={{ fontSize: SvgTextSize[icon.length] ?? "1em" }}
209
+ style={{ fontSize: SvgTextSize[icon.length] }}
144
210
  >
145
211
  {icon}
146
212
  </text>
@@ -152,25 +218,37 @@ export const Icon = ({
152
218
 
153
219
  return (
154
220
  <dfn
155
- {...rest}
221
+ data-ref="icon"
156
222
  ref={ref}
223
+ {...rest}
157
224
  role="presentation"
158
225
  className={classNames(
159
- classes.icon,
160
- className,
161
- "select-none overflow-hidden inline-block box-content leading-none not-italic text-center",
162
- bg && getBgClass(bg),
163
- color && getColorClass(color),
226
+ "fabric-icon",
227
+ "select-none overflow-hidden box-content leading-none not-italic text-center",
164
228
  !rounded && "rounded",
165
229
  rounded && "rounded-full",
166
230
  animate && `animate-${animate}`,
231
+ !!onClick && disabled && "opacity-30 pointer-events-none",
232
+ className,
167
233
  )}
168
- onClick={onClick}
234
+ onClick={(e) => {
235
+ onClick && e.stopPropagation();
236
+ onClick && e.preventDefault();
237
+ onClick?.(e);
238
+ }}
169
239
  data-flip={rtlFlip}
170
240
  style={styles}
171
241
  data-clickable={!!onClick}
242
+ data-inner-clickable={!!onClick}
172
243
  >
173
- {iconEl}
244
+ {iconSrc && !imageFailed && (
245
+ <img
246
+ src={iconSrc}
247
+ alt="fallback icon"
248
+ onError={() => setImageFailed(true)}
249
+ />
250
+ )}
251
+ {(!iconSrc || imageFailed) && iconEl}
174
252
  </dfn>
175
253
  );
176
254
  };
@@ -26,8 +26,8 @@ export {
26
26
  AnimationBars,
27
27
  AnimationIndicator,
28
28
  AnimationSpinner,
29
- Skeleton,
30
29
  Loading,
30
+ Skeleton,
31
31
  } from "./animations/Animations";
32
32
  export { Avatar } from "./avatar/Avatar";
33
33
  export { AvatarGroup } from "./avatar/AvatarGroup";
@@ -40,13 +40,14 @@ export { ToggleButtonGroup } from "./button/ToggleButtonGroup";
40
40
  export { Callout } from "./callout/Callout";
41
41
  export { Card } from "./card/Card";
42
42
  export { CardCover } from "./card/CardCover";
43
+ export { FlipContent, type FlipContentRef } from "./card/FlipContent";
43
44
  export { Chip } from "./chip/Chip";
44
45
  export { Collapsable } from "./collapsable/Collapsable";
45
46
  export { Divider } from "./divider/Divider";
46
47
  export { Dropdown, DropdownDismiss } from "./dropdown/Dropdown";
47
48
  export { DropdownTool } from "./dropdown/DropdownTool";
48
49
  export { EmptyContent } from "./empty/EmptyContent";
49
- export { Icon } from "./icon/Icon";
50
+ export { Icon, getIconProps } from "./icon/Icon";
50
51
  export { Image, Video } from "./media/Media";
51
52
  export { ContextMenu } from "./menu/ContextMenu";
52
53
  export { Menu } from "./menu/Menu";
@@ -23,11 +23,11 @@
23
23
 
24
24
  import { getImageColorset } from "@react-fabric/utilities";
25
25
  import classNames from "classnames";
26
- import { useMemo, useRef, useState } from "react";
26
+ import { Fragment, useEffect, useRef, useState } from "react";
27
27
  import { type AriaProps, type CssProp, type TestProps } from "../../types";
28
28
  import { CoreIcons } from "../../types/icons";
29
29
  import { Button } from "../button/Button";
30
- import classes from "./Media.module.css";
30
+ import { Icon } from "../icon/Icon";
31
31
 
32
32
  export interface BaseProps extends CssProp, TestProps, AriaProps {
33
33
  /**
@@ -44,6 +44,12 @@ export interface BaseProps extends CssProp, TestProps, AriaProps {
44
44
  fit?: "cover" | "contain" | "fill";
45
45
  }
46
46
 
47
+ const cover = {
48
+ fill: "object-fill",
49
+ cover: "object-cover",
50
+ contain: "object-contain",
51
+ };
52
+
47
53
  export interface ImageProps extends BaseProps {
48
54
  /**
49
55
  * image alt text
@@ -65,6 +71,41 @@ export interface VideoProps extends BaseProps {
65
71
  playOnHover?: boolean;
66
72
  }
67
73
 
74
+ const loadIndicator = (
75
+ <div
76
+ className={classNames(
77
+ "fabric-mediaPlaceholder",
78
+ "absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-4xl text-gray animate-pulse",
79
+ )}
80
+ >
81
+ ●●●
82
+ </div>
83
+ );
84
+
85
+ /**
86
+ * Component for displaying images with optional reel decoration.
87
+ * A versatile media component that supports images and videos with various display options.
88
+ * It can display images with a reel decoration, handle loading states, and show error icons if the media fails to load.
89
+ * This component is useful for displaying images in a visually appealing way, with support for lazy loading and error handling.
90
+ * It automatically adjusts the display based on the provided fit property, allowing for different styles such as cover, contain, or fill.
91
+ *
92
+ * @param {ImageProps | VideoProps} props - The properties for the Media component.
93
+ * @returns {JSX.Element} The rendered Media component.
94
+ *
95
+ * @example
96
+ * ```jsx
97
+ * <Image
98
+ * src="image.jpg"
99
+ * alt="Example Image"
100
+ * reel={true}
101
+ * fit="cover"
102
+ * className="custom-class"
103
+ * />
104
+ * // Renders an image with reel decoration, cover fit, and a custom class name.
105
+ * ```
106
+ *
107
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-media--docs} for more details.
108
+ */
68
109
  export const Image = ({
69
110
  src,
70
111
  alt,
@@ -74,51 +115,84 @@ export const Image = ({
74
115
  ...aria
75
116
  }: ImageProps) => {
76
117
  const [colorSet, setColorSet] = useState("light");
77
- const loadIndicator = useMemo(
78
- () => (
79
- <div
80
- className={classNames(
81
- classes.mediaPlaceholder,
82
- "absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-4xl text-gray animate-pulse",
83
- )}
84
- >
85
- ●●●
86
- </div>
87
- ),
88
- [src],
89
- );
118
+ const [loaded, setLoaded] = useState(false);
119
+ const [errored, setErrored] = useState(false);
120
+ useEffect(() => {
121
+ setLoaded(false);
122
+ setErrored(false);
123
+ }, [src]);
90
124
  return (
91
125
  <div
92
126
  data-ref="image"
93
127
  className={classNames(
94
- classes.mediaContainer,
95
- "relative overflow-hidden bg-gray inline-block",
96
- reel && classes.mediaReel,
128
+ "fabric-mediaContainer",
129
+ "relative overflow-hidden inline-block",
130
+ reel && "fabric-mediaReel",
97
131
  className,
98
132
  )}
99
133
  data-colorset={colorSet}
100
134
  {...aria}
101
135
  >
102
- {loadIndicator}
103
- <img
104
- alt={alt ?? src}
105
- src={src}
106
- loading="lazy"
107
- crossOrigin="anonymous"
108
- className={classNames(
109
- classes.media,
110
- "pointer-events-none w-full h-full",
111
- fit && `object-${fit}`,
112
- )}
113
- onLoad={(e) => {
114
- e.currentTarget.previousElementSibling?.remove();
115
- setColorSet(getImageColorset(e.currentTarget));
116
- }}
117
- />
136
+ {!loaded && !errored && loadIndicator}
137
+ {!errored && (
138
+ <img
139
+ alt={alt ?? src}
140
+ src={src}
141
+ loading="lazy"
142
+ crossOrigin="anonymous"
143
+ className={classNames(
144
+ "fabric-media",
145
+ "pointer-events-none w-full h-full",
146
+ cover[fit],
147
+ )}
148
+ onLoad={(e) => {
149
+ setLoaded(true);
150
+ setColorSet(getImageColorset(e.currentTarget));
151
+ }}
152
+ onError={() => setErrored(true)}
153
+ />
154
+ )}
155
+ {errored && (
156
+ <Icon
157
+ size="2rem"
158
+ className="absolute text-tint-300 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
159
+ icon={CoreIcons.mediaImageBroken}
160
+ />
161
+ )}
118
162
  </div>
119
163
  );
120
164
  };
121
165
 
166
+ /**
167
+ * Component for displaying videos with optional controls and reel decoration.
168
+ * A versatile video component that supports autoplay, hover play, and various display options.
169
+ * It can display videos with a reel decoration, handle loading states, and show error icons if the video fails to load.
170
+ * This component is useful for displaying videos in a visually appealing way, with support for controls, autoplay, and error handling.
171
+ * It automatically adjusts the display based on the provided fit property, allowing for different styles such as cover, contain, or fill.
172
+ * It also includes controls for play/pause and volume, enhancing user interaction with the video content.
173
+ * This component is ideal for media-rich applications where video content needs to be displayed with user-friendly controls and visual effects.
174
+ * It supports features like autoplay, play on hover, and custom fit options for the video display.
175
+ * It also includes a reel decoration for a more engaging visual presentation.
176
+ *
177
+ * @param {VideoProps} props - The properties for the Video component.
178
+ * @returns {JSX.Element} The rendered Video component.
179
+ *
180
+ * @example
181
+ * ```jsx
182
+ * <Video
183
+ * src="video.mp4"
184
+ * poster="poster.jpg"
185
+ * reel={true}
186
+ * autoPlay={true}
187
+ * playOnHover={true}
188
+ * fit="cover"
189
+ * className="custom-class"
190
+ * />
191
+ * // Renders a video with reel decoration, autoplay, play on hover, cover fit, and a custom class name.
192
+ * ```
193
+ *
194
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-video--docs} for more details.
195
+ */
122
196
  export const Video = ({
123
197
  src,
124
198
  poster,
@@ -130,17 +204,27 @@ export const Video = ({
130
204
  ...aria
131
205
  }: VideoProps) => {
132
206
  const videoRef = useRef<HTMLVideoElement>(null);
207
+ const [loaded, setLoaded] = useState(false);
208
+ const [errored, setErrored] = useState(false);
209
+ useEffect(() => {
210
+ setLoaded(false);
211
+ setErrored(false);
212
+ }, [src]);
133
213
 
134
214
  const [state, setState] = useState(true);
135
215
  const [volume, setVolume] = useState(false);
136
216
 
217
+ useEffect(() => {
218
+ setErrored(false);
219
+ }, [src]);
220
+
137
221
  return (
138
222
  <div
139
223
  data-ref="video"
140
224
  className={classNames(
141
- classes.mediaContainer,
142
- "relative overflow-hidden bg-gray inline-block",
143
- reel && classes.mediaReel,
225
+ "fabric-mediaContainer",
226
+ "relative overflow-hidden inline-block",
227
+ reel && "fabric-mediaReel",
144
228
  className,
145
229
  )}
146
230
  onMouseEnter={() => {
@@ -151,74 +235,79 @@ export const Video = ({
151
235
  }}
152
236
  {...aria}
153
237
  >
154
- <div
155
- className={classNames(
156
- classes.mediaPlaceholder,
157
- "absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-5xl animate-pulse",
158
- )}
159
- >
160
- ●●●
161
- </div>
162
- <video
163
- loop
164
- ref={videoRef}
165
- controls={false}
166
- poster={poster}
167
- autoPlay={autoPlay}
168
- className={classNames(
169
- classes.media,
170
- "pointer-events-none w-full h-full",
171
- fit && `object-${fit}`,
172
- )}
173
- onPlay={() => setState(true)}
174
- onPause={() => setState(false)}
175
- onVolumeChange={(e) => setVolume(!!e.currentTarget.volume)}
176
- onLoadedData={(e) => {
177
- e.currentTarget.volume = 0;
178
- e.currentTarget.previousElementSibling?.remove();
179
- }}
180
- >
181
- <source src={src} />
182
- <track kind="captions" />
183
- </video>
184
- <div
185
- data-inner-clickable
186
- className={classNames(
187
- classes.mediaControls,
188
- "absolute bottom-6 end-6 rounded-full flex flex-col",
189
- )}
190
- >
191
- <Button
192
- rounded
193
- variant="link"
194
- className={classes.mediaControlPlaceholder}
195
- icon={CoreIcons.ellipsis}
196
- aria-label="controls"
197
- />
198
- <Button
199
- rounded
200
- variant="link"
201
- aria-label="controls"
202
- className={classes.mediaControlAction}
203
- onClick={() => {
204
- videoRef.current &&
205
- (videoRef.current.volume = videoRef.current.volume ? 0 : 1);
206
- }}
207
- icon={volume ? CoreIcons.volumeOn : CoreIcons.volumeOff}
208
- />
209
- <Button
210
- rounded
211
- variant="link"
212
- aria-label="controls"
213
- className={classes.mediaControlAction}
214
- onClick={() => {
215
- videoRef.current?.paused
216
- ? videoRef.current?.play()
217
- : videoRef.current?.pause();
218
- }}
219
- icon={state ? CoreIcons.pause : CoreIcons.play}
238
+ {!loaded && !errored && loadIndicator}
239
+ {!errored && (
240
+ <Fragment>
241
+ <video
242
+ loop
243
+ ref={videoRef}
244
+ controls={false}
245
+ poster={poster}
246
+ autoPlay={autoPlay}
247
+ className={classNames(
248
+ "fabric-media",
249
+ "pointer-events-none w-full h-full",
250
+ fit && `object-${fit}`,
251
+ )}
252
+ onPlay={() => setState(true)}
253
+ onPause={() => setState(false)}
254
+ onVolumeChange={(e) => setVolume(!!e.currentTarget.volume)}
255
+ onLoadedData={(e) => {
256
+ e.currentTarget.volume = 0;
257
+ setLoaded(true);
258
+ }}
259
+ onError={() => setErrored(true)}
260
+ >
261
+ <source src={src} />
262
+ <track kind="captions" />
263
+ </video>
264
+ <div
265
+ data-inner-clickable
266
+ className={classNames(
267
+ "fabric-mediaControls",
268
+ "absolute bottom-6 end-6 rounded-full flex flex-col",
269
+ )}
270
+ >
271
+ <Button
272
+ rounded
273
+ variant="link"
274
+ className={"fabric-mediaControlPlaceholder"}
275
+ icon={CoreIcons.ellipsis}
276
+ aria-label="controls"
277
+ />
278
+ <Button
279
+ rounded
280
+ variant="link"
281
+ aria-label="controls"
282
+ className={"fabric-mediaControlAction"}
283
+ onClick={() => {
284
+ videoRef.current &&
285
+ (videoRef.current.volume = videoRef.current.volume ? 0 : 1);
286
+ }}
287
+ icon={volume ? CoreIcons.volumeOn : CoreIcons.volumeOff}
288
+ />
289
+ <Button
290
+ rounded
291
+ variant="link"
292
+ aria-label="controls"
293
+ className={"fabric-mediaControlAction"}
294
+ onClick={() => {
295
+ videoRef.current?.paused
296
+ ? videoRef.current?.play()
297
+ : videoRef.current?.pause();
298
+ }}
299
+ icon={state ? CoreIcons.pause : CoreIcons.play}
300
+ />
301
+ </div>
302
+ </Fragment>
303
+ )}
304
+ {errored && (
305
+ <Icon
306
+ size="2rem"
307
+ className="absolute text-tint-300 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
308
+ icon={CoreIcons.mediaVideoBroken}
220
309
  />
221
- </div>
310
+ )}
222
311
  </div>
223
312
  );
224
313
  };
@@ -42,6 +42,25 @@ export interface ContextMenuProps extends ChildrenProp {
42
42
  disabled?: boolean;
43
43
  }
44
44
 
45
+ /**
46
+ * A component that provides a context menu that appears on right-click.
47
+ * It uses the Floating UI library to manage the positioning and interactions of the menu.
48
+ * This component is useful for creating custom context menus that can be triggered by right-clicking on elements.
49
+ *
50
+ * @param {ContextMenuProps} props - The properties for the ContextMenu component.
51
+ * @returns {JSX.Element} The rendered ContextMenu component.
52
+ *
53
+ * @example
54
+ * ```jsx
55
+ * <ContextMenu
56
+ * menu={<Menu items={[{ label: "Option 1" }, { label: "Option 2" }]} />}
57
+ * >
58
+ * <div className="context-menu-target">Right-click me!</div>
59
+ * </ContextMenu>
60
+ * ```
61
+ *
62
+ * @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs}
63
+ */
45
64
  export const ContextMenu = ({ children, menu, disabled }: ContextMenuProps) => {
46
65
  const [isOpen, setIsOpen] = useState(false);
47
66
  const nodeId = useFloatingNodeId();