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

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