@bettercms-ai/kit 0.1.0

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 (630) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/_chunks-cjs/_visual-editing.js +5898 -0
  4. package/dist/_chunks-cjs/refractor.js +22 -0
  5. package/dist/_chunks-es/_visual-editing.mjs +5904 -0
  6. package/dist/_chunks-es/refractor.mjs +25 -0
  7. package/dist/_color.d.mts +119 -0
  8. package/dist/_color.d.ts +119 -0
  9. package/dist/_color.js +1412 -0
  10. package/dist/_color.mjs +1411 -0
  11. package/dist/_visual-editing.d.mts +1126 -0
  12. package/dist/_visual-editing.d.ts +1126 -0
  13. package/dist/_visual-editing.js +30 -0
  14. package/dist/_visual-editing.mjs +30 -0
  15. package/dist/index.d.mts +3140 -0
  16. package/dist/index.d.ts +3140 -0
  17. package/dist/index.js +2036 -0
  18. package/dist/index.mjs +2044 -0
  19. package/dist/theme.d.mts +1506 -0
  20. package/dist/theme.d.ts +1506 -0
  21. package/dist/theme.js +4126 -0
  22. package/dist/theme.mjs +4126 -0
  23. package/exports/_visual-editing.ts +31 -0
  24. package/exports/index.ts +1 -0
  25. package/exports/theme.ts +1 -0
  26. package/package.json +78 -0
  27. package/src/color/index.d.mts +119 -0
  28. package/src/color/index.mjs +1411 -0
  29. package/src/core/__workshop__/constants.ts +293 -0
  30. package/src/core/_compat.ts +264 -0
  31. package/src/core/components/autocomplete/__mocks__/apiStore.ts +49 -0
  32. package/src/core/components/autocomplete/__mocks__/countries.ts +245 -0
  33. package/src/core/components/autocomplete/__workshop__/async.tsx +156 -0
  34. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +137 -0
  35. package/src/core/components/autocomplete/__workshop__/custom.tsx +89 -0
  36. package/src/core/components/autocomplete/__workshop__/example.tsx +79 -0
  37. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +36 -0
  38. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +294 -0
  39. package/src/core/components/autocomplete/__workshop__/index.ts +39 -0
  40. package/src/core/components/autocomplete/__workshop__/types.ts +4 -0
  41. package/src/core/components/autocomplete/autocomplete.styles.tsx +39 -0
  42. package/src/core/components/autocomplete/autocomplete.tsx +767 -0
  43. package/src/core/components/autocomplete/autocompleteOption.tsx +45 -0
  44. package/src/core/components/autocomplete/autocompleteReducer.ts +47 -0
  45. package/src/core/components/autocomplete/constants.ts +28 -0
  46. package/src/core/components/autocomplete/index.ts +2 -0
  47. package/src/core/components/autocomplete/types.ts +108 -0
  48. package/src/core/components/breadcrumbs/__workshop__/example.tsx +62 -0
  49. package/src/core/components/breadcrumbs/__workshop__/index.ts +14 -0
  50. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +18 -0
  51. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +51 -0
  52. package/src/core/components/breadcrumbs/breadcrumbs.tsx +133 -0
  53. package/src/core/components/breadcrumbs/index.ts +1 -0
  54. package/src/core/components/dialog/__workshop__/activate.tsx +134 -0
  55. package/src/core/components/dialog/__workshop__/autoFocus.tsx +29 -0
  56. package/src/core/components/dialog/__workshop__/index.ts +19 -0
  57. package/src/core/components/dialog/__workshop__/layering.tsx +41 -0
  58. package/src/core/components/dialog/__workshop__/nested.tsx +72 -0
  59. package/src/core/components/dialog/__workshop__/onScroll.tsx +39 -0
  60. package/src/core/components/dialog/__workshop__/panes.tsx +82 -0
  61. package/src/core/components/dialog/__workshop__/position.tsx +30 -0
  62. package/src/core/components/dialog/__workshop__/props.tsx +75 -0
  63. package/src/core/components/dialog/__workshop__/provider.tsx +11 -0
  64. package/src/core/components/dialog/__workshop__/wrapped.tsx +76 -0
  65. package/src/core/components/dialog/dialog.tsx +430 -0
  66. package/src/core/components/dialog/dialogContext.ts +20 -0
  67. package/src/core/components/dialog/dialogProvider.tsx +35 -0
  68. package/src/core/components/dialog/index.ts +4 -0
  69. package/src/core/components/dialog/styles.ts +77 -0
  70. package/src/core/components/dialog/useDialog.ts +11 -0
  71. package/src/core/components/hotkeys/__workshop__/index.ts +14 -0
  72. package/src/core/components/hotkeys/__workshop__/plain.tsx +9 -0
  73. package/src/core/components/hotkeys/hotkeys.test.tsx +42 -0
  74. package/src/core/components/hotkeys/hotkeys.tsx +66 -0
  75. package/src/core/components/hotkeys/index.ts +1 -0
  76. package/src/core/components/index.ts +9 -0
  77. package/src/core/components/menu/__workshop__/asComponent.tsx +45 -0
  78. package/src/core/components/menu/__workshop__/avatarMenu.tsx +51 -0
  79. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +46 -0
  80. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +134 -0
  81. package/src/core/components/menu/__workshop__/customMenuItem.tsx +45 -0
  82. package/src/core/components/menu/__workshop__/customSelectedState.tsx +39 -0
  83. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +40 -0
  84. package/src/core/components/menu/__workshop__/groups.tsx +156 -0
  85. package/src/core/components/menu/__workshop__/index.ts +89 -0
  86. package/src/core/components/menu/__workshop__/menuButton.tsx +80 -0
  87. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +58 -0
  88. package/src/core/components/menu/__workshop__/nestedMenu.tsx +22 -0
  89. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +41 -0
  90. package/src/core/components/menu/__workshop__/selectedItem.tsx +69 -0
  91. package/src/core/components/menu/__workshop__/shouldFocus.tsx +47 -0
  92. package/src/core/components/menu/__workshop__/tones.tsx +25 -0
  93. package/src/core/components/menu/__workshop__/withoutArrow.tsx +32 -0
  94. package/src/core/components/menu/helpers.ts +82 -0
  95. package/src/core/components/menu/index.ts +5 -0
  96. package/src/core/components/menu/menu.spacing.test.tsx +63 -0
  97. package/src/core/components/menu/menu.test.tsx +125 -0
  98. package/src/core/components/menu/menu.tsx +178 -0
  99. package/src/core/components/menu/menuButton.tsx +268 -0
  100. package/src/core/components/menu/menuContext.ts +18 -0
  101. package/src/core/components/menu/menuDivider.ts +23 -0
  102. package/src/core/components/menu/menuGroup.spacing.test.tsx +63 -0
  103. package/src/core/components/menu/menuGroup.tsx +233 -0
  104. package/src/core/components/menu/menuItem.spacing.test.tsx +59 -0
  105. package/src/core/components/menu/menuItem.tsx +197 -0
  106. package/src/core/components/menu/useMenu.ts +21 -0
  107. package/src/core/components/menu/useMenuController.ts +231 -0
  108. package/src/core/components/skeleton/__workshop__/delay.tsx +70 -0
  109. package/src/core/components/skeleton/__workshop__/index.ts +11 -0
  110. package/src/core/components/skeleton/__workshop__/skeleton.tsx +64 -0
  111. package/src/core/components/skeleton/index.ts +2 -0
  112. package/src/core/components/skeleton/skeleton.tsx +57 -0
  113. package/src/core/components/skeleton/styles.ts +50 -0
  114. package/src/core/components/skeleton/textSkeleton.tsx +122 -0
  115. package/src/core/components/tab/__workshop__/example.tsx +79 -0
  116. package/src/core/components/tab/__workshop__/index.ts +14 -0
  117. package/src/core/components/tab/index.ts +3 -0
  118. package/src/core/components/tab/tab.tsx +101 -0
  119. package/src/core/components/tab/tabList.test.tsx +48 -0
  120. package/src/core/components/tab/tabList.tsx +70 -0
  121. package/src/core/components/tab/tabPanel.tsx +39 -0
  122. package/src/core/components/toast/__workshop__/hook.tsx +71 -0
  123. package/src/core/components/toast/__workshop__/index.ts +19 -0
  124. package/src/core/components/toast/__workshop__/toast.tsx +26 -0
  125. package/src/core/components/toast/index.ts +4 -0
  126. package/src/core/components/toast/styles.ts +77 -0
  127. package/src/core/components/toast/toast.test.tsx +101 -0
  128. package/src/core/components/toast/toast.tsx +198 -0
  129. package/src/core/components/toast/toastContext.ts +7 -0
  130. package/src/core/components/toast/toastLayer.tsx +51 -0
  131. package/src/core/components/toast/toastProvider.tsx +113 -0
  132. package/src/core/components/toast/toastState.ts +6 -0
  133. package/src/core/components/toast/types.ts +26 -0
  134. package/src/core/components/toast/useToast.ts +25 -0
  135. package/src/core/components/tree/__workshop__/basic.perf.ts +19 -0
  136. package/src/core/components/tree/__workshop__/basic.tsx +105 -0
  137. package/src/core/components/tree/__workshop__/index.ts +21 -0
  138. package/src/core/components/tree/__workshop__/tabFromElement.tsx +84 -0
  139. package/src/core/components/tree/helpers.ts +105 -0
  140. package/src/core/components/tree/index.ts +4 -0
  141. package/src/core/components/tree/style.ts +105 -0
  142. package/src/core/components/tree/tree.test.tsx +55 -0
  143. package/src/core/components/tree/tree.tsx +240 -0
  144. package/src/core/components/tree/treeContext.ts +10 -0
  145. package/src/core/components/tree/treeGroup.tsx +28 -0
  146. package/src/core/components/tree/treeItem.test.tsx +65 -0
  147. package/src/core/components/tree/treeItem.tsx +224 -0
  148. package/src/core/components/tree/types.ts +25 -0
  149. package/src/core/components/tree/useTree.ts +17 -0
  150. package/src/core/constants.ts +79 -0
  151. package/src/core/helpers/animation.ts +27 -0
  152. package/src/core/helpers/element.ts +55 -0
  153. package/src/core/helpers/focus.ts +100 -0
  154. package/src/core/helpers/index.ts +4 -0
  155. package/src/core/helpers/scroll.ts +15 -0
  156. package/src/core/hooks/index.ts +12 -0
  157. package/src/core/hooks/useArrayProp.ts +17 -0
  158. package/src/core/hooks/useClickOutside.test.tsx +482 -0
  159. package/src/core/hooks/useClickOutside.ts +118 -0
  160. package/src/core/hooks/useClickOutsideEvent.test.tsx +115 -0
  161. package/src/core/hooks/useClickOutsideEvent.ts +73 -0
  162. package/src/core/hooks/useCustomValidity.ts +13 -0
  163. package/src/core/hooks/useDelayed.test.ts +88 -0
  164. package/src/core/hooks/useDelayedState.ts +36 -0
  165. package/src/core/hooks/useElementRect/__workshop__/example.tsx +32 -0
  166. package/src/core/hooks/useElementRect/__workshop__/index.ts +14 -0
  167. package/src/core/hooks/useElementRect/index.ts +1 -0
  168. package/src/core/hooks/useElementRect/useElementRect.ts +13 -0
  169. package/src/core/hooks/useElementSize.ts +19 -0
  170. package/src/core/hooks/useForwardedRef.ts +19 -0
  171. package/src/core/hooks/useGlobalKeyDown.ts +24 -0
  172. package/src/core/hooks/useIsomorphicEffect.ts +7 -0
  173. package/src/core/hooks/useMatchMedia.ts +28 -0
  174. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +14 -0
  175. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +14 -0
  176. package/src/core/hooks/useMediaIndex/index.ts +1 -0
  177. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +36 -0
  178. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +102 -0
  179. package/src/core/hooks/useMounted.ts +15 -0
  180. package/src/core/hooks/usePrefersDark.hydration.test.tsx +56 -0
  181. package/src/core/hooks/usePrefersDark.test.tsx +19 -0
  182. package/src/core/hooks/usePrefersDark.ts +16 -0
  183. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +56 -0
  184. package/src/core/hooks/usePrefersReducedMotion.test.tsx +19 -0
  185. package/src/core/hooks/usePrefersReducedMotion.ts +16 -0
  186. package/src/core/index.ts +10 -0
  187. package/src/core/lib/createGlobalScopedContext.ts +36 -0
  188. package/src/core/lib/globalScope.ts +19 -0
  189. package/src/core/lib/isRecord.ts +3 -0
  190. package/src/core/middleware/origin.ts +47 -0
  191. package/src/core/observers/elementSizeObserver.ts +116 -0
  192. package/src/core/observers/index.ts +2 -0
  193. package/src/core/observers/resizeObserver.ts +9 -0
  194. package/src/core/primitives/_selectable/index.ts +1 -0
  195. package/src/core/primitives/_selectable/selectable.tsx +15 -0
  196. package/src/core/primitives/_selectable/style.ts +115 -0
  197. package/src/core/primitives/avatar/__workshop__/asButton.tsx +14 -0
  198. package/src/core/primitives/avatar/__workshop__/index.ts +29 -0
  199. package/src/core/primitives/avatar/__workshop__/stack.tsx +25 -0
  200. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +63 -0
  201. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +70 -0
  202. package/src/core/primitives/avatar/avatar.tsx +200 -0
  203. package/src/core/primitives/avatar/avatarCounter.tsx +91 -0
  204. package/src/core/primitives/avatar/avatarStack.tsx +100 -0
  205. package/src/core/primitives/avatar/index.ts +4 -0
  206. package/src/core/primitives/avatar/styles.ts +167 -0
  207. package/src/core/primitives/avatar/types.ts +17 -0
  208. package/src/core/primitives/badge/__workshop__/index.ts +19 -0
  209. package/src/core/primitives/badge/__workshop__/props.tsx +30 -0
  210. package/src/core/primitives/badge/__workshop__/tones.tsx +21 -0
  211. package/src/core/primitives/badge/badge.test.tsx +16 -0
  212. package/src/core/primitives/badge/badge.tsx +70 -0
  213. package/src/core/primitives/badge/index.ts +1 -0
  214. package/src/core/primitives/badge/styles.ts +20 -0
  215. package/src/core/primitives/badge/types.ts +8 -0
  216. package/src/core/primitives/box/__workshop__/asComponent.tsx +31 -0
  217. package/src/core/primitives/box/__workshop__/index.ts +24 -0
  218. package/src/core/primitives/box/__workshop__/props.tsx +20 -0
  219. package/src/core/primitives/box/__workshop__/responsive.tsx +20 -0
  220. package/src/core/primitives/box/box.test.tsx +142 -0
  221. package/src/core/primitives/box/box.tsx +154 -0
  222. package/src/core/primitives/box/index.ts +1 -0
  223. package/src/core/primitives/button/__workshop__/custom.tsx +51 -0
  224. package/src/core/primitives/button/__workshop__/customIcons.tsx +30 -0
  225. package/src/core/primitives/button/__workshop__/disabled.tsx +74 -0
  226. package/src/core/primitives/button/__workshop__/index.ts +59 -0
  227. package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +36 -0
  228. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +12 -0
  229. package/src/core/primitives/button/__workshop__/props.tsx +55 -0
  230. package/src/core/primitives/button/__workshop__/stacked.tsx +58 -0
  231. package/src/core/primitives/button/__workshop__/styled1.tsx +17 -0
  232. package/src/core/primitives/button/__workshop__/styled2.tsx +19 -0
  233. package/src/core/primitives/button/__workshop__/uploadButton.tsx +28 -0
  234. package/src/core/primitives/button/button.test.tsx +82 -0
  235. package/src/core/primitives/button/button.tsx +210 -0
  236. package/src/core/primitives/button/index.ts +1 -0
  237. package/src/core/primitives/button/styles.ts +117 -0
  238. package/src/core/primitives/card/__workshop__/allTones.tsx +25 -0
  239. package/src/core/primitives/card/__workshop__/asButton.tsx +107 -0
  240. package/src/core/primitives/card/__workshop__/asComponent.tsx +27 -0
  241. package/src/core/primitives/card/__workshop__/checkered.tsx +26 -0
  242. package/src/core/primitives/card/__workshop__/index.ts +18 -0
  243. package/src/core/primitives/card/__workshop__/interactive.tsx +30 -0
  244. package/src/core/primitives/card/__workshop__/listNavigation.tsx +80 -0
  245. package/src/core/primitives/card/__workshop__/props.tsx +53 -0
  246. package/src/core/primitives/card/__workshop__/selected.tsx +94 -0
  247. package/src/core/primitives/card/__workshop__/styled.tsx +14 -0
  248. package/src/core/primitives/card/card.tsx +128 -0
  249. package/src/core/primitives/card/index.ts +2 -0
  250. package/src/core/primitives/card/styles.ts +147 -0
  251. package/src/core/primitives/card/types.ts +11 -0
  252. package/src/core/primitives/checkbox/__workshop__/example.tsx +25 -0
  253. package/src/core/primitives/checkbox/__workshop__/index.ts +13 -0
  254. package/src/core/primitives/checkbox/__workshop__/props.tsx +33 -0
  255. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +16 -0
  256. package/src/core/primitives/checkbox/__workshop__/tones.tsx +28 -0
  257. package/src/core/primitives/checkbox/checkbox.tsx +73 -0
  258. package/src/core/primitives/checkbox/index.ts +1 -0
  259. package/src/core/primitives/checkbox/styles.ts +128 -0
  260. package/src/core/primitives/code/__workshop__/index.ts +19 -0
  261. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +48 -0
  262. package/src/core/primitives/code/__workshop__/props.tsx +21 -0
  263. package/src/core/primitives/code/code.tsx +55 -0
  264. package/src/core/primitives/code/index.ts +1 -0
  265. package/src/core/primitives/code/refractor.tsx +20 -0
  266. package/src/core/primitives/code/styles.ts +77 -0
  267. package/src/core/primitives/container/__workshop__/example.tsx +20 -0
  268. package/src/core/primitives/container/__workshop__/index.ts +8 -0
  269. package/src/core/primitives/container/container.tsx +54 -0
  270. package/src/core/primitives/container/index.ts +2 -0
  271. package/src/core/primitives/container/styles.ts +23 -0
  272. package/src/core/primitives/container/types.ts +6 -0
  273. package/src/core/primitives/flex/__workshop__/example.tsx +34 -0
  274. package/src/core/primitives/flex/__workshop__/gap.tsx +25 -0
  275. package/src/core/primitives/flex/__workshop__/index.ts +11 -0
  276. package/src/core/primitives/flex/flex.tsx +64 -0
  277. package/src/core/primitives/flex/index.ts +1 -0
  278. package/src/core/primitives/grid/__workshop__/index.ts +10 -0
  279. package/src/core/primitives/grid/__workshop__/responsive.tsx +54 -0
  280. package/src/core/primitives/grid/grid.test.tsx +80 -0
  281. package/src/core/primitives/grid/grid.tsx +74 -0
  282. package/src/core/primitives/grid/index.ts +1 -0
  283. package/src/core/primitives/heading/__workshop__/index.ts +19 -0
  284. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +54 -0
  285. package/src/core/primitives/heading/__workshop__/plain.tsx +32 -0
  286. package/src/core/primitives/heading/heading.tsx +88 -0
  287. package/src/core/primitives/heading/index.ts +1 -0
  288. package/src/core/primitives/heading/styles.ts +64 -0
  289. package/src/core/primitives/heading/types.ts +7 -0
  290. package/src/core/primitives/index.ts +27 -0
  291. package/src/core/primitives/inline/__workshop__/index.ts +8 -0
  292. package/src/core/primitives/inline/__workshop__/plain.tsx +27 -0
  293. package/src/core/primitives/inline/index.ts +1 -0
  294. package/src/core/primitives/inline/inline.test.tsx +51 -0
  295. package/src/core/primitives/inline/inline.tsx +63 -0
  296. package/src/core/primitives/inline/styles.ts +32 -0
  297. package/src/core/primitives/inline/types.ts +6 -0
  298. package/src/core/primitives/kbd/__workshop__/index.ts +8 -0
  299. package/src/core/primitives/kbd/__workshop__/plain.tsx +9 -0
  300. package/src/core/primitives/kbd/index.ts +1 -0
  301. package/src/core/primitives/kbd/kbd.tsx +69 -0
  302. package/src/core/primitives/label/__workshop__/index.ts +19 -0
  303. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +48 -0
  304. package/src/core/primitives/label/__workshop__/plain.tsx +24 -0
  305. package/src/core/primitives/label/index.ts +1 -0
  306. package/src/core/primitives/label/label.tsx +87 -0
  307. package/src/core/primitives/label/styles.ts +45 -0
  308. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +77 -0
  309. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +31 -0
  310. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +32 -0
  311. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +11 -0
  312. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +71 -0
  313. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +71 -0
  314. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +89 -0
  315. package/src/core/primitives/popover/__workshop__/TestStory.tsx +97 -0
  316. package/src/core/primitives/popover/__workshop__/index.ts +49 -0
  317. package/src/core/primitives/popover/constants.ts +22 -0
  318. package/src/core/primitives/popover/floating-ui/size.ts +99 -0
  319. package/src/core/primitives/popover/helpers.ts +31 -0
  320. package/src/core/primitives/popover/index.ts +2 -0
  321. package/src/core/primitives/popover/popover.tsx +511 -0
  322. package/src/core/primitives/popover/popoverCard.tsx +166 -0
  323. package/src/core/primitives/popover/types.ts +7 -0
  324. package/src/core/primitives/radio/__workshop__/example.tsx +63 -0
  325. package/src/core/primitives/radio/__workshop__/index.ts +11 -0
  326. package/src/core/primitives/radio/__workshop__/plain.tsx +28 -0
  327. package/src/core/primitives/radio/index.ts +1 -0
  328. package/src/core/primitives/radio/radio.tsx +51 -0
  329. package/src/core/primitives/radio/styles.ts +117 -0
  330. package/src/core/primitives/select/__workshop__/index.ts +11 -0
  331. package/src/core/primitives/select/__workshop__/plain.tsx +27 -0
  332. package/src/core/primitives/select/__workshop__/readOnly.tsx +23 -0
  333. package/src/core/primitives/select/index.ts +1 -0
  334. package/src/core/primitives/select/select.test.tsx +52 -0
  335. package/src/core/primitives/select/select.tsx +94 -0
  336. package/src/core/primitives/select/styles.ts +166 -0
  337. package/src/core/primitives/spinner/__workshop__/Props.tsx +15 -0
  338. package/src/core/primitives/spinner/__workshop__/index.ts +14 -0
  339. package/src/core/primitives/spinner/index.ts +1 -0
  340. package/src/core/primitives/spinner/spinner.tsx +46 -0
  341. package/src/core/primitives/stack/__workshop__/index.ts +14 -0
  342. package/src/core/primitives/stack/__workshop__/plain.tsx +32 -0
  343. package/src/core/primitives/stack/index.ts +1 -0
  344. package/src/core/primitives/stack/stack.test.tsx +57 -0
  345. package/src/core/primitives/stack/stack.tsx +57 -0
  346. package/src/core/primitives/stack/styles.ts +32 -0
  347. package/src/core/primitives/switch/__workshop__/example.tsx +23 -0
  348. package/src/core/primitives/switch/__workshop__/index.ts +11 -0
  349. package/src/core/primitives/switch/__workshop__/props.tsx +21 -0
  350. package/src/core/primitives/switch/index.ts +1 -0
  351. package/src/core/primitives/switch/styles.ts +173 -0
  352. package/src/core/primitives/switch/switch.tsx +68 -0
  353. package/src/core/primitives/text/__workshop__/colored.tsx +30 -0
  354. package/src/core/primitives/text/__workshop__/example.tsx +39 -0
  355. package/src/core/primitives/text/__workshop__/index.ts +24 -0
  356. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +48 -0
  357. package/src/core/primitives/text/index.ts +1 -0
  358. package/src/core/primitives/text/styles.ts +74 -0
  359. package/src/core/primitives/text/text.tsx +89 -0
  360. package/src/core/primitives/textArea/__workshop__/index.ts +14 -0
  361. package/src/core/primitives/textArea/__workshop__/plain.tsx +50 -0
  362. package/src/core/primitives/textArea/index.ts +1 -0
  363. package/src/core/primitives/textArea/textArea.tsx +120 -0
  364. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +30 -0
  365. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +17 -0
  366. package/src/core/primitives/textInput/__workshop__/index.ts +44 -0
  367. package/src/core/primitives/textInput/__workshop__/plain.tsx +98 -0
  368. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +9 -0
  369. package/src/core/primitives/textInput/__workshop__/states.tsx +53 -0
  370. package/src/core/primitives/textInput/__workshop__/tones.tsx +277 -0
  371. package/src/core/primitives/textInput/__workshop__/typed.tsx +23 -0
  372. package/src/core/primitives/textInput/index.ts +1 -0
  373. package/src/core/primitives/textInput/textInput.test.tsx +48 -0
  374. package/src/core/primitives/textInput/textInput.tsx +395 -0
  375. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +102 -0
  376. package/src/core/primitives/tooltip/__workshop__/index.ts +29 -0
  377. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +74 -0
  378. package/src/core/primitives/tooltip/__workshop__/props.tsx +107 -0
  379. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +86 -0
  380. package/src/core/primitives/tooltip/constants.ts +23 -0
  381. package/src/core/primitives/tooltip/index.ts +2 -0
  382. package/src/core/primitives/tooltip/tooltip.test.tsx +452 -0
  383. package/src/core/primitives/tooltip/tooltip.tsx +495 -0
  384. package/src/core/primitives/tooltip/tooltipCard.tsx +109 -0
  385. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +4 -0
  386. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +11 -0
  387. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +57 -0
  388. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +10 -0
  389. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +13 -0
  390. package/src/core/primitives/types.ts +179 -0
  391. package/src/core/styles/border/borderStyle.ts +56 -0
  392. package/src/core/styles/border/index.ts +2 -0
  393. package/src/core/styles/border/types.ts +10 -0
  394. package/src/core/styles/box/boxStyle.ts +69 -0
  395. package/src/core/styles/box/index.ts +2 -0
  396. package/src/core/styles/box/types.ts +11 -0
  397. package/src/core/styles/card/_cardColorStyle.ts +108 -0
  398. package/src/core/styles/card/index.ts +1 -0
  399. package/src/core/styles/flex/flexItemStyle.ts +27 -0
  400. package/src/core/styles/flex/flexStyle.ts +70 -0
  401. package/src/core/styles/flex/index.ts +3 -0
  402. package/src/core/styles/flex/types.ts +25 -0
  403. package/src/core/styles/focusRing/index.ts +25 -0
  404. package/src/core/styles/font/codeFontStyle.ts +13 -0
  405. package/src/core/styles/font/headingFontStyle.ts +13 -0
  406. package/src/core/styles/font/index.ts +6 -0
  407. package/src/core/styles/font/labelFontStyle.ts +13 -0
  408. package/src/core/styles/font/responsiveFont.ts +103 -0
  409. package/src/core/styles/font/textAlignStyle.ts +19 -0
  410. package/src/core/styles/font/textFontStyle.ts +13 -0
  411. package/src/core/styles/font/types.ts +35 -0
  412. package/src/core/styles/grid/gridItemStyle.ts +82 -0
  413. package/src/core/styles/grid/gridStyle.ts +108 -0
  414. package/src/core/styles/grid/index.ts +3 -0
  415. package/src/core/styles/grid/types.ts +37 -0
  416. package/src/core/styles/helpers.ts +72 -0
  417. package/src/core/styles/index.ts +5 -0
  418. package/src/core/styles/input/index.ts +2 -0
  419. package/src/core/styles/input/responsiveInputPaddingStyle.ts +78 -0
  420. package/src/core/styles/input/textInputStyle.ts +263 -0
  421. package/src/core/styles/internal.ts +12 -0
  422. package/src/core/styles/margin/index.ts +2 -0
  423. package/src/core/styles/margin/marginStyle.ts +21 -0
  424. package/src/core/styles/margin/marginsStyle.test.ts +33 -0
  425. package/src/core/styles/margin/types.ts +9 -0
  426. package/src/core/styles/padding/index.ts +2 -0
  427. package/src/core/styles/padding/paddingStyle.test.ts +33 -0
  428. package/src/core/styles/padding/paddingStyle.ts +21 -0
  429. package/src/core/styles/padding/types.ts +12 -0
  430. package/src/core/styles/radius/index.ts +2 -0
  431. package/src/core/styles/radius/radiusStyle.ts +23 -0
  432. package/src/core/styles/radius/types.ts +8 -0
  433. package/src/core/styles/shadow/index.ts +2 -0
  434. package/src/core/styles/shadow/shadowStyle.ts +29 -0
  435. package/src/core/styles/shadow/types.ts +6 -0
  436. package/src/core/styles/types.ts +8 -0
  437. package/src/core/theme/__workshop__/build/Root.tsx +367 -0
  438. package/src/core/theme/__workshop__/build/helpers.ts +46 -0
  439. package/src/core/theme/__workshop__/build/story.tsx +465 -0
  440. package/src/core/theme/__workshop__/canvas.tsx +352 -0
  441. package/src/core/theme/__workshop__/color.tsx +62 -0
  442. package/src/core/theme/__workshop__/debug/story.tsx +408 -0
  443. package/src/core/theme/__workshop__/index.ts +39 -0
  444. package/src/core/theme/__workshop__/layer.tsx +78 -0
  445. package/src/core/theme/__workshop__/nestedProvider.tsx +15 -0
  446. package/src/core/theme/index.ts +5 -0
  447. package/src/core/theme/theme.test.tsx +73 -0
  448. package/src/core/theme/themeColorProvider.tsx +29 -0
  449. package/src/core/theme/themeContext.ts +10 -0
  450. package/src/core/theme/themeProvider.tsx +62 -0
  451. package/src/core/theme/types.ts +12 -0
  452. package/src/core/theme/useRootTheme.ts +17 -0
  453. package/src/core/theme/useTheme.ts +16 -0
  454. package/src/core/types/avatar.ts +14 -0
  455. package/src/core/types/badge.ts +12 -0
  456. package/src/core/types/box.ts +19 -0
  457. package/src/core/types/button.ts +21 -0
  458. package/src/core/types/card.ts +6 -0
  459. package/src/core/types/component.ts +32 -0
  460. package/src/core/types/dialog.ts +4 -0
  461. package/src/core/types/flex.ts +30 -0
  462. package/src/core/types/grid.ts +14 -0
  463. package/src/core/types/gridItem.ts +29 -0
  464. package/src/core/types/index.ts +15 -0
  465. package/src/core/types/placement.ts +18 -0
  466. package/src/core/types/popover.ts +4 -0
  467. package/src/core/types/radius.ts +4 -0
  468. package/src/core/types/selectable.ts +6 -0
  469. package/src/core/types/text.ts +4 -0
  470. package/src/core/utils/arrow/arrow.tsx +123 -0
  471. package/src/core/utils/arrow/cmds.ts +91 -0
  472. package/src/core/utils/arrow/index.ts +1 -0
  473. package/src/core/utils/boundaryElement/__workshop__/index.ts +14 -0
  474. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +19 -0
  475. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +100 -0
  476. package/src/core/utils/boundaryElement/boundaryElementContext.ts +7 -0
  477. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +24 -0
  478. package/src/core/utils/boundaryElement/index.ts +3 -0
  479. package/src/core/utils/boundaryElement/types.ts +7 -0
  480. package/src/core/utils/boundaryElement/useBoundaryElement.ts +26 -0
  481. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +21 -0
  482. package/src/core/utils/conditionalWrapper/index.ts +1 -0
  483. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +30 -0
  484. package/src/core/utils/elementQuery/__workshop__/index.ts +14 -0
  485. package/src/core/utils/elementQuery/elementQuery.tsx +53 -0
  486. package/src/core/utils/elementQuery/helpers.ts +27 -0
  487. package/src/core/utils/elementQuery/index.ts +1 -0
  488. package/src/core/utils/errorBoundary.tsx +48 -0
  489. package/src/core/utils/getElementRef.ts +26 -0
  490. package/src/core/utils/index.ts +9 -0
  491. package/src/core/utils/layer/__workshop__/_debug.tsx +17 -0
  492. package/src/core/utils/layer/__workshop__/index.ts +24 -0
  493. package/src/core/utils/layer/__workshop__/multipleRoots.tsx +49 -0
  494. package/src/core/utils/layer/__workshop__/nested.tsx +98 -0
  495. package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +13 -0
  496. package/src/core/utils/layer/getLayerContext.test.ts +30 -0
  497. package/src/core/utils/layer/getLayerContext.ts +21 -0
  498. package/src/core/utils/layer/index.ts +4 -0
  499. package/src/core/utils/layer/layer.test.tsx +108 -0
  500. package/src/core/utils/layer/layer.tsx +98 -0
  501. package/src/core/utils/layer/layerContext.ts +7 -0
  502. package/src/core/utils/layer/layerProvider.tsx +111 -0
  503. package/src/core/utils/layer/types.ts +9 -0
  504. package/src/core/utils/layer/useLayer.ts +26 -0
  505. package/src/core/utils/portal/__workshop__/index.ts +14 -0
  506. package/src/core/utils/portal/__workshop__/named.tsx +63 -0
  507. package/src/core/utils/portal/index.ts +4 -0
  508. package/src/core/utils/portal/portal.test.tsx +103 -0
  509. package/src/core/utils/portal/portal.ts +32 -0
  510. package/src/core/utils/portal/portalContext.ts +31 -0
  511. package/src/core/utils/portal/portalProvider.tsx +47 -0
  512. package/src/core/utils/portal/types.ts +9 -0
  513. package/src/core/utils/portal/usePortal.ts +25 -0
  514. package/src/core/utils/spanWithTextOverflow.tsx +10 -0
  515. package/src/core/utils/srOnly/index.ts +1 -0
  516. package/src/core/utils/srOnly/srOnly.tsx +36 -0
  517. package/src/core/utils/virtualList/__workshop__/changingProps.tsx +36 -0
  518. package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +24 -0
  519. package/src/core/utils/virtualList/__workshop__/index.ts +29 -0
  520. package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +48 -0
  521. package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +22 -0
  522. package/src/core/utils/virtualList/index.ts +1 -0
  523. package/src/core/utils/virtualList/virtualList.tsx +200 -0
  524. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +76 -0
  525. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +54 -0
  526. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +22 -0
  527. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +55 -0
  528. package/src/theme/build/_deprecated/color/card/createCardStates.ts +60 -0
  529. package/src/theme/build/_deprecated/color/color.test.ts +63 -0
  530. package/src/theme/build/_deprecated/color/defaults.ts +390 -0
  531. package/src/theme/build/_deprecated/color/factory.ts +142 -0
  532. package/src/theme/build/_deprecated/color/index.ts +1 -0
  533. package/src/theme/build/_deprecated/color/input/createInputModes.ts +81 -0
  534. package/src/theme/build/_deprecated/color/muted/createMuted.ts +54 -0
  535. package/src/theme/build/_deprecated/color/spot/createSpot.ts +20 -0
  536. package/src/theme/build/buildColorTheme.test.ts +183 -0
  537. package/src/theme/build/buildColorTheme.ts +499 -0
  538. package/src/theme/build/buildTheme.test.ts +87 -0
  539. package/src/theme/build/buildTheme.ts +36 -0
  540. package/src/theme/build/colorToken/colorToken.ts +19 -0
  541. package/src/theme/build/colorToken/compileColorToken.ts +21 -0
  542. package/src/theme/build/colorToken/index.ts +2 -0
  543. package/src/theme/build/colorToken/types.ts +6 -0
  544. package/src/theme/build/index.ts +3 -0
  545. package/src/theme/build/lib/color-fns/blend/index.ts +3 -0
  546. package/src/theme/build/lib/color-fns/blend/mix.ts +21 -0
  547. package/src/theme/build/lib/color-fns/blend/multiply.ts +18 -0
  548. package/src/theme/build/lib/color-fns/blend/screen.ts +18 -0
  549. package/src/theme/build/lib/color-fns/color-fns.test.ts +68 -0
  550. package/src/theme/build/lib/color-fns/contrastRatio.ts +31 -0
  551. package/src/theme/build/lib/color-fns/convert.ts +150 -0
  552. package/src/theme/build/lib/color-fns/index.ts +6 -0
  553. package/src/theme/build/lib/color-fns/parse.ts +60 -0
  554. package/src/theme/build/lib/color-fns/rgba.ts +10 -0
  555. package/src/theme/build/lib/color-fns/types.ts +28 -0
  556. package/src/theme/build/lib/isRecord.ts +3 -0
  557. package/src/theme/build/lib/lazy.ts +30 -0
  558. package/src/theme/build/lib/utils.ts +19 -0
  559. package/src/theme/build/merge.ts +26 -0
  560. package/src/theme/build/mixThemeColor.test.ts +21 -0
  561. package/src/theme/build/mixThemeColor.ts +53 -0
  562. package/src/theme/build/renderColorTheme.ts +532 -0
  563. package/src/theme/build/renderColorValue.ts +85 -0
  564. package/src/theme/build/resolveColorTokens.ts +268 -0
  565. package/src/theme/build/theme.test.ts +27 -0
  566. package/src/theme/config/helpers.ts +55 -0
  567. package/src/theme/config/index.ts +4 -0
  568. package/src/theme/config/system.ts +115 -0
  569. package/src/theme/config/tokens/color/index.ts +1 -0
  570. package/src/theme/config/tokens/color/types.ts +133 -0
  571. package/src/theme/config/tokens/index.ts +4 -0
  572. package/src/theme/config/tokens/parseTokenKey.test.ts +64 -0
  573. package/src/theme/config/tokens/parseTokenKey.ts +67 -0
  574. package/src/theme/config/tokens/parseTokenValue.test.ts +42 -0
  575. package/src/theme/config/tokens/parseTokenValue.ts +133 -0
  576. package/src/theme/config/tokens/types.ts +53 -0
  577. package/src/theme/config/types.ts +46 -0
  578. package/src/theme/defaults/colorPalette.ts +5 -0
  579. package/src/theme/defaults/colorTokens.ts +648 -0
  580. package/src/theme/defaults/config.ts +84 -0
  581. package/src/theme/defaults/fonts.ts +227 -0
  582. package/src/theme/getScopedTheme.ts +98 -0
  583. package/src/theme/index.ts +5 -0
  584. package/src/theme/system/avatar.ts +14 -0
  585. package/src/theme/system/color/_constants.ts +45 -0
  586. package/src/theme/system/color/_helpers.ts +24 -0
  587. package/src/theme/system/color/_system.ts +40 -0
  588. package/src/theme/system/color/avatar.ts +15 -0
  589. package/src/theme/system/color/badge.ts +16 -0
  590. package/src/theme/system/color/button.ts +17 -0
  591. package/src/theme/system/color/color.ts +34 -0
  592. package/src/theme/system/color/index.ts +13 -0
  593. package/src/theme/system/color/input.ts +25 -0
  594. package/src/theme/system/color/kbd.ts +8 -0
  595. package/src/theme/system/color/selectable.ts +12 -0
  596. package/src/theme/system/color/shadow.ts +7 -0
  597. package/src/theme/system/color/state.ts +43 -0
  598. package/src/theme/system/color/syntax.ts +41 -0
  599. package/src/theme/system/css.ts +14 -0
  600. package/src/theme/system/focusRing.ts +7 -0
  601. package/src/theme/system/font.ts +52 -0
  602. package/src/theme/system/index.ts +11 -0
  603. package/src/theme/system/input.ts +33 -0
  604. package/src/theme/system/layer.ts +8 -0
  605. package/src/theme/system/shadow.ts +19 -0
  606. package/src/theme/system/styles.ts +13 -0
  607. package/src/theme/system/theme.ts +138 -0
  608. package/src/theme/system/v0/avatar.ts +10 -0
  609. package/src/theme/system/v0/color/_generic.ts +35 -0
  610. package/src/theme/system/v0/color/_system.ts +17 -0
  611. package/src/theme/system/v0/color/base.ts +21 -0
  612. package/src/theme/system/v0/color/button.ts +42 -0
  613. package/src/theme/system/v0/color/card.ts +19 -0
  614. package/src/theme/system/v0/color/color.ts +40 -0
  615. package/src/theme/system/v0/color/index.ts +11 -0
  616. package/src/theme/system/v0/color/input.ts +34 -0
  617. package/src/theme/system/v0/color/muted.ts +26 -0
  618. package/src/theme/system/v0/color/selectable.ts +31 -0
  619. package/src/theme/system/v0/color/solid.ts +26 -0
  620. package/src/theme/system/v0/color/spot.ts +13 -0
  621. package/src/theme/system/v0/index.ts +3 -0
  622. package/src/theme/system/v0/input.ts +23 -0
  623. package/src/theme/versioning/getTheme_v2.ts +57 -0
  624. package/src/theme/versioning/index.ts +5 -0
  625. package/src/theme/versioning/is_v0.ts +6 -0
  626. package/src/theme/versioning/is_v2.ts +6 -0
  627. package/src/theme/versioning/themeColor_v0_v2.ts +243 -0
  628. package/src/theme/versioning/themeColor_v2_v2_9.ts +49 -0
  629. package/src/theme/versioning/v0_v2.ts +94 -0
  630. package/src/theme/versioning/v2_v0.ts +135 -0
@@ -0,0 +1,86 @@
1
+ import {BoundaryElementProvider, Button, Card, Code, Flex, Text, Tooltip} from '@bettercms-ai/kit'
2
+ import {useBoolean, useSelect, useText} from '@bettercms-ai/kit-workshop'
3
+ import {useState} from 'react'
4
+
5
+ import {WORKSHOP_PLACEMENT_OPTIONS} from '../../../__workshop__/constants'
6
+
7
+ export default function ResizableBoundaryStory() {
8
+ const content = useText(
9
+ 'Content',
10
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mollis consectetur malesuada. Sed lobortis est dolor, eget imperdiet velit placerat et. Aenean posuere mi non aliquet iaculis. Donec fermentum pulvinar purus at sagittis. Ut tincidunt massa odio, sed finibus justo ullamcorper id. Nam venenatis justo non ligula elementum cursus. Pellentesque laoreet justo in mollis sagittis. In lacinia ornare ultrices. Suspendisse potenti.',
11
+ )
12
+ const placement = useSelect('Placement', WORKSHOP_PLACEMENT_OPTIONS, 'right')
13
+ const portal = useBoolean('Portal', true)
14
+ const useBoundaryElement = useBoolean('Use boundary element', true)
15
+
16
+ const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(null)
17
+
18
+ return (
19
+ <Flex align="center" height="fill" justify="center">
20
+ <BoundaryElementProvider element={useBoundaryElement ? boundaryElement : null}>
21
+ <Card
22
+ border
23
+ ref={setBoundaryElement}
24
+ style={{
25
+ height: 'calc(100vh - 100px)',
26
+ overflow: 'hidden',
27
+ position: 'relative',
28
+ resize: 'both',
29
+ width: '500px',
30
+ }}
31
+ >
32
+ <Flex align="center" height="fill" justify="center">
33
+ <Flex justify="center">
34
+ <Code size={1}>Placement: {placement}</Code>
35
+ </Flex>
36
+ </Flex>
37
+
38
+ <Tooltip
39
+ content={<Text size={1}>{content}</Text>}
40
+ padding={2}
41
+ placement={placement}
42
+ portal={portal}
43
+ >
44
+ <Button mode="bleed" style={{position: 'absolute', top: 10, left: 10}} text="Tooltip" />
45
+ </Tooltip>
46
+ <Tooltip
47
+ content={<Text size={1}>{content}</Text>}
48
+ padding={2}
49
+ placement={placement}
50
+ portal={portal}
51
+ >
52
+ <Button
53
+ mode="bleed"
54
+ style={{position: 'absolute', top: 10, right: 10}}
55
+ text="Tooltip"
56
+ />
57
+ </Tooltip>
58
+ <Tooltip
59
+ content={<Text size={1}>{content}</Text>}
60
+ padding={2}
61
+ placement={placement}
62
+ portal={portal}
63
+ >
64
+ <Button
65
+ mode="bleed"
66
+ style={{position: 'absolute', bottom: 10, left: 10}}
67
+ text="Tooltip"
68
+ />
69
+ </Tooltip>
70
+ <Tooltip
71
+ content={<Text size={1}>{content}</Text>}
72
+ padding={2}
73
+ placement={placement}
74
+ portal={portal}
75
+ >
76
+ <Button
77
+ mode="bleed"
78
+ style={{position: 'absolute', bottom: 10, right: 10}}
79
+ text="Tooltip"
80
+ />
81
+ </Tooltip>
82
+ </Card>
83
+ </BoundaryElementProvider>
84
+ </Flex>
85
+ )
86
+ }
@@ -0,0 +1,23 @@
1
+ import {Placement} from '@floating-ui/react-dom'
2
+
3
+ export const DEFAULT_TOOLTIP_ARROW_WIDTH = 15
4
+ export const DEFAULT_TOOLTIP_ARROW_HEIGHT = 6
5
+ export const DEFAULT_TOOLTIP_ARROW_RADIUS = 2
6
+
7
+ export const DEFAULT_TOOLTIP_DISTANCE = 4
8
+ export const DEFAULT_TOOLTIP_PADDING = 4
9
+
10
+ export const DEFAULT_FALLBACK_PLACEMENTS: Record<Placement, Placement[]> = {
11
+ 'top': ['top-end', 'top-start', 'bottom', 'left', 'right'],
12
+ 'top-start': ['top', 'top-end', 'bottom-start', 'left-start', 'right-start'],
13
+ 'top-end': ['top', 'top-start', 'bottom-end', 'left-end', 'right-end'],
14
+ 'bottom': ['bottom-end', 'bottom-start', 'top', 'left', 'right'],
15
+ 'bottom-start': ['bottom', 'bottom-end', 'top-start', 'left-start', 'right-start'],
16
+ 'bottom-end': ['bottom', 'bottom-start', 'top-end', 'left-end', 'right-end'],
17
+ 'left': ['left-end', 'left-start', 'right', 'top', 'bottom'],
18
+ 'left-start': ['left', 'left-end', 'right-start', 'top-start', 'bottom-start'],
19
+ 'left-end': ['left', 'left-start', 'right-end', 'top-end', 'bottom-end'],
20
+ 'right': ['right-end', 'right-start', 'left', 'top', 'bottom'],
21
+ 'right-start': ['right', 'right-end', 'left-start', 'top-start', 'bottom-start'],
22
+ 'right-end': ['right', 'right-start', 'left-end', 'top-end', 'bottom-end'],
23
+ }
@@ -0,0 +1,2 @@
1
+ export * from './tooltip'
2
+ export * from './tooltipDelayGroup'
@@ -0,0 +1,452 @@
1
+ /** @jest-environment jsdom */
2
+ import '../../../../test/mocks/resizeObserver.mock'
3
+ import '../../../../test/mocks/matchMedia.mock'
4
+
5
+ import {act, fireEvent, screen} from '@testing-library/react'
6
+
7
+ import {render} from '../../../../test'
8
+ import {Button, Text} from '../../primitives'
9
+ import {Tooltip, TooltipDelayGroupProvider} from '../tooltip'
10
+
11
+ // Fake timers using Jest
12
+ beforeEach(() => {
13
+ jest.useFakeTimers()
14
+ })
15
+
16
+ // Running all pending timers and switching to real timers using Jest
17
+ afterEach(() => {
18
+ jest.runOnlyPendingTimers()
19
+ jest.useRealTimers()
20
+ })
21
+
22
+ describe('Tooltip', () => {
23
+ describe('Using same delay for open and close', () => {
24
+ it('should hide and show the tooltip content when hovered, with no delay', () => {
25
+ render(
26
+ <Tooltip content={<Text size={1}>{'Tooltip content'}</Text>} placement={'top'}>
27
+ <Button mode="bleed" text="Hover me" />
28
+ </Tooltip>,
29
+ )
30
+
31
+ const button = screen.getByText('Hover me')
32
+
33
+ // Validate tooltip content is not rendered
34
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
35
+
36
+ fireEvent.mouseEnter(button)
37
+
38
+ // Validate tooltip content is rendered
39
+ screen.getByText('Tooltip content')
40
+
41
+ fireEvent.mouseOut(button)
42
+ // Validate tooltip content is not rendered anymore
43
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
44
+ })
45
+ it('should support delays to show and hide the tooltip.', () => {
46
+ jest.useFakeTimers()
47
+ const delay = 200
48
+
49
+ render(
50
+ <Tooltip
51
+ content={<Text size={1}>{'Tooltip content'}</Text>}
52
+ placement={'top'}
53
+ delay={delay}
54
+ >
55
+ <Button mode="bleed" text="Hover me" />
56
+ </Tooltip>,
57
+ )
58
+
59
+ const button = screen.getByText('Hover me')
60
+
61
+ // Validate tooltip content is not rendered
62
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
63
+
64
+ fireEvent.mouseEnter(button)
65
+
66
+ act(() => jest.advanceTimersByTime(delay / 2))
67
+ // Content should not be rendered yet
68
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
69
+ act(() => jest.advanceTimersByTime(delay / 2))
70
+
71
+ // Validate tooltip content is rendered
72
+ screen.getByText('Tooltip content')
73
+
74
+ fireEvent.mouseOut(button)
75
+ // Validate tooltip content is still showing.
76
+ screen.getByText('Tooltip content')
77
+ act(() => jest.advanceTimersByTime(delay))
78
+ // Validate tooltip content is not rendered anymore
79
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
80
+ })
81
+ it('should support different open and close delays to show and hide the tooltip.', () => {
82
+ jest.useFakeTimers()
83
+ const openDelay = 200
84
+ const closeDelay = 150
85
+
86
+ render(
87
+ <Tooltip
88
+ content={<Text size={1}>{'Tooltip content'}</Text>}
89
+ placement={'top'}
90
+ delay={{
91
+ open: openDelay,
92
+ close: closeDelay,
93
+ }}
94
+ >
95
+ <Button mode="bleed" text="Hover me" />
96
+ </Tooltip>,
97
+ )
98
+
99
+ const button = screen.getByText('Hover me')
100
+
101
+ // Validate tooltip content is not rendered
102
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
103
+
104
+ fireEvent.mouseEnter(button)
105
+
106
+ act(() => jest.advanceTimersByTime(openDelay / 2))
107
+ // Content should not be rendered yet
108
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
109
+ act(() => jest.advanceTimersByTime(openDelay / 2))
110
+
111
+ // Validate tooltip content is rendered
112
+ screen.getByText('Tooltip content')
113
+
114
+ fireEvent.mouseOut(button)
115
+ // Validate tooltip content is still showing.
116
+ screen.getByText('Tooltip content')
117
+ act(() => jest.advanceTimersByTime(closeDelay))
118
+ // Validate tooltip content is not rendered anymore
119
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
120
+ })
121
+ })
122
+
123
+ describe('Using the <TooltipDelayGroupProvider />', () => {
124
+ it('should support groups with the same delay to open and close.', () => {
125
+ const delay = 150
126
+
127
+ jest.useFakeTimers()
128
+ render(
129
+ <TooltipDelayGroupProvider delay={delay}>
130
+ <Tooltip content={<Text size={1}>{'Tooltip 1'}</Text>} placement={'top'} delay={400}>
131
+ <Button mode="bleed" text="Button 1" />
132
+ </Tooltip>
133
+ <Tooltip
134
+ content={<Text size={1}>{'Tooltip 2'}</Text>}
135
+ placement={'top'}
136
+ delay={400} // This should be overridden by the group delay
137
+ >
138
+ <Button mode="bleed" text="Button 2" />
139
+ </Tooltip>
140
+ </TooltipDelayGroupProvider>,
141
+ )
142
+
143
+ const button1 = screen.getByText('Button 1')
144
+ const button2 = screen.getByText('Button 2')
145
+
146
+ // Validate tooltip content is not rendered
147
+ expect(screen.queryByText('Tooltip 1')).not.toBeInTheDocument()
148
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
149
+
150
+ // Hovers on first button, it should show first tooltip only
151
+ fireEvent.mouseEnter(button1)
152
+ act(() => jest.advanceTimersByTime(delay / 2))
153
+ // Content should not be rendered yet, we have a delay of 150ms
154
+ expect(screen.queryByText('Tooltip 1')).not.toBeInTheDocument()
155
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
156
+ act(() => jest.advanceTimersByTime(delay / 2))
157
+
158
+ // Validate Tooltip 1 is rendered
159
+ screen.getByText('Tooltip 1')
160
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
161
+
162
+ // Hovers on second button.
163
+ fireEvent.mouseOut(button1)
164
+ fireEvent.mouseEnter(button2)
165
+
166
+ // Validate Tooltip 1 is not rendered, now tooltip 2 is open.
167
+ act(() => jest.advanceTimersByTime(1))
168
+ expect(screen.queryByText('Tooltip 1')).not.toBeInTheDocument()
169
+ screen.getByText('Tooltip 2')
170
+
171
+ // Validate tooltip content is not rendered anymore
172
+ fireEvent.mouseOut(button2)
173
+ act(() => jest.advanceTimersByTime(delay + 1))
174
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
175
+
176
+ // Hovering again, should trigger the tooltip to show immediately, as the group is not deactivated yet
177
+ fireEvent.mouseEnter(button2)
178
+ act(() => jest.advanceTimersByTime(1))
179
+ screen.getByText('Tooltip 2')
180
+
181
+ // Validate tooltip content is not rendered anymore
182
+ fireEvent.mouseOut(button2)
183
+ act(() => jest.advanceTimersByTime(delay + 1))
184
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
185
+
186
+ // Wait 200ms, the group is deactivated, hovering again should trigger the delay
187
+ act(() => jest.advanceTimersByTime(200))
188
+ fireEvent.mouseEnter(button2)
189
+ act(() => jest.advanceTimersByTime(delay / 2))
190
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
191
+ act(() => jest.advanceTimersByTime(delay / 2))
192
+ screen.getByText('Tooltip 2')
193
+ })
194
+ it('should support groups with different open and close delay.', () => {
195
+ const openDelay = 250
196
+ const closeDelay = 150
197
+
198
+ jest.useFakeTimers()
199
+ render(
200
+ <TooltipDelayGroupProvider
201
+ delay={{
202
+ open: openDelay,
203
+ close: closeDelay,
204
+ }}
205
+ >
206
+ <Tooltip content={<Text size={1}>{'Tooltip 1'}</Text>} placement={'top'} delay={400}>
207
+ <Button mode="bleed" text="Button 1" />
208
+ </Tooltip>
209
+ <Tooltip
210
+ content={<Text size={1}>{'Tooltip 2'}</Text>}
211
+ placement={'top'}
212
+ delay={400} // This should be overridden by the group delay
213
+ >
214
+ <Button mode="bleed" text="Button 2" />
215
+ </Tooltip>
216
+ </TooltipDelayGroupProvider>,
217
+ )
218
+
219
+ const button1 = screen.getByText('Button 1')
220
+ const button2 = screen.getByText('Button 2')
221
+
222
+ // Validate tooltip content is not rendered
223
+ expect(screen.queryByText('Tooltip 1')).not.toBeInTheDocument()
224
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
225
+
226
+ // Hovers on first button, it should show first tooltip only
227
+ fireEvent.mouseEnter(button1)
228
+ act(() => jest.advanceTimersByTime(openDelay / 2))
229
+ // Content should not be rendered yet, we have a delay of2150ms
230
+ expect(screen.queryByText('Tooltip 1')).not.toBeInTheDocument()
231
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
232
+ act(() => jest.advanceTimersByTime(openDelay / 2))
233
+
234
+ // Validate Tooltip 1 is rendered
235
+ screen.getByText('Tooltip 1')
236
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
237
+
238
+ // Hovers on second button.
239
+ fireEvent.mouseOut(button1)
240
+ fireEvent.mouseEnter(button2)
241
+
242
+ // Validate Tooltip 1 is not rendered, now tooltip 2 is open.
243
+ act(() => jest.advanceTimersByTime(1))
244
+ expect(screen.queryByText('Tooltip 1')).not.toBeInTheDocument()
245
+ screen.getByText('Tooltip 2')
246
+
247
+ // Validate tooltip content is not rendered anymore
248
+ fireEvent.mouseOut(button2)
249
+ act(() => jest.advanceTimersByTime(closeDelay + 1))
250
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
251
+
252
+ // Hovering again, should trigger the tooltip to show immediately, as the group is not deactivated yet
253
+ fireEvent.mouseEnter(button2)
254
+ act(() => jest.advanceTimersByTime(1))
255
+ screen.getByText('Tooltip 2')
256
+
257
+ // Validate tooltip content is not rendered anymore
258
+ fireEvent.mouseOut(button2)
259
+ act(() => jest.advanceTimersByTime(closeDelay + 1))
260
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
261
+
262
+ // Wait 200ms, the group is deactivated, hovering again should trigger the delay
263
+ act(() => jest.advanceTimersByTime(200))
264
+ fireEvent.mouseEnter(button2)
265
+ act(() => jest.advanceTimersByTime(openDelay / 2))
266
+ expect(screen.queryByText('Tooltip 2')).not.toBeInTheDocument()
267
+ act(() => jest.advanceTimersByTime(openDelay / 2))
268
+ screen.getByText('Tooltip 2')
269
+ })
270
+ })
271
+
272
+ describe('Closing the <Tooltip /> with the Escape key', () => {
273
+ it('Standalone tooltip closes immediately with Escape key', () => {
274
+ const delay = 150
275
+
276
+ jest.useFakeTimers()
277
+
278
+ render(
279
+ <Tooltip
280
+ content={<Text size={1}>{'Tooltip content'}</Text>}
281
+ placement={'top'}
282
+ delay={delay}
283
+ >
284
+ <Button mode="bleed" text="Hover me" />
285
+ </Tooltip>,
286
+ )
287
+
288
+ const button = screen.getByText('Hover me')
289
+
290
+ // Validate tooltip content is not rendered
291
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
292
+ fireEvent.focus(button)
293
+ act(() => jest.advanceTimersByTime(delay))
294
+
295
+ // Validate tooltip content is rendered
296
+ screen.getByText('Tooltip content')
297
+
298
+ act(() => {
299
+ fireEvent.keyDown(button, {key: 'Escape', code: 'Escape'})
300
+ })
301
+ // Validate tooltip content is not rendered anymore
302
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
303
+ })
304
+ it('With <TooltipDelayGroupProvider /> closes immediately with Escape key', () => {
305
+ const delay = 150
306
+
307
+ jest.useFakeTimers()
308
+
309
+ render(
310
+ <TooltipDelayGroupProvider delay={{close: delay}}>
311
+ <Tooltip
312
+ content={<Text size={1}>{'Tooltip content'}</Text>}
313
+ placement={'top'}
314
+ delay={{close: delay}}
315
+ >
316
+ <Button mode="bleed" text="Hover me" />
317
+ </Tooltip>
318
+ </TooltipDelayGroupProvider>,
319
+ )
320
+
321
+ const button = screen.getByText('Hover me')
322
+
323
+ // Validate tooltip content is not rendered
324
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
325
+ fireEvent.focus(button)
326
+
327
+ act(() => jest.advanceTimersByTime(delay))
328
+
329
+ // Validate tooltip content is rendered
330
+ screen.getByText('Tooltip content')
331
+
332
+ act(() => {
333
+ fireEvent.keyDown(button, {key: 'Escape', code: 'Escape'})
334
+ })
335
+ // Validate tooltip content is not rendered anymore
336
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
337
+ })
338
+ })
339
+
340
+ describe('Clicking the <Tooltip /> child should close the tooltip', () => {
341
+ it('Should close the tooltip when clicked', () => {
342
+ const delay = 150
343
+
344
+ render(
345
+ <Tooltip content={<Text size={1}>{'Tooltip content'}</Text>} delay={delay}>
346
+ <Button mode="bleed" text="Hover me" />
347
+ </Tooltip>,
348
+ )
349
+
350
+ const button = screen.getByText('Hover me')
351
+
352
+ // Assertion: tooltip does not exist in the document
353
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
354
+ fireEvent.focus(button)
355
+
356
+ act(() => jest.advanceTimersByTime(delay))
357
+
358
+ // Assertion: the tooltip is not visible
359
+ expect(screen.queryByText('Tooltip content')).toBeVisible()
360
+
361
+ act(() => fireEvent.click(button))
362
+
363
+ // Assertion: tooltip does not exist in the document
364
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
365
+ })
366
+
367
+ it('Should close the tooltip when the context menu is opened (right click)', () => {
368
+ const delay = 150
369
+
370
+ render(
371
+ <Tooltip content={<Text size={1}>{'Tooltip content'}</Text>} delay={delay}>
372
+ <Button mode="bleed" text="Hover me" />
373
+ </Tooltip>,
374
+ )
375
+
376
+ const button = screen.getByText('Hover me')
377
+
378
+ // Assertion: tooltip does not exist in the document
379
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
380
+ fireEvent.focus(button)
381
+
382
+ act(() => jest.advanceTimersByTime(delay))
383
+
384
+ // Assertion: the tooltip is not visible
385
+ expect(screen.queryByText('Tooltip content')).toBeVisible()
386
+
387
+ act(() => fireEvent.contextMenu(button))
388
+
389
+ // Assertion: tooltip does not exist in the document
390
+ expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
391
+ })
392
+ })
393
+
394
+ describe('Used defined events on <Tooltip /> child should fire correctly', () => {
395
+ const handleBlur = jest.fn()
396
+ const handleClick = jest.fn()
397
+ const handleContextMenu = jest.fn()
398
+ const handleFocus = jest.fn()
399
+ const handleMouseEnter = jest.fn()
400
+ const handleMouseLeave = jest.fn()
401
+
402
+ beforeEach(() => {
403
+ render(
404
+ <Tooltip content={<Text size={1}>{'Tooltip content'}</Text>}>
405
+ <Button
406
+ data-testid="btn"
407
+ mode="bleed"
408
+ onBlur={handleBlur}
409
+ onClick={handleClick}
410
+ onContextMenu={handleContextMenu}
411
+ onFocus={handleFocus}
412
+ onMouseEnter={handleMouseEnter}
413
+ onMouseLeave={handleMouseLeave}
414
+ text="Hover me"
415
+ />
416
+ </Tooltip>,
417
+ )
418
+ })
419
+
420
+ afterEach(() => jest.clearAllMocks())
421
+
422
+ it('should fire the onBlur event', () => {
423
+ fireEvent.blur(screen.getByTestId('btn'))
424
+ expect(handleBlur).toHaveBeenCalledTimes(1)
425
+ })
426
+
427
+ it('should fire the onClick event', () => {
428
+ fireEvent.click(screen.getByTestId('btn'))
429
+ expect(handleClick).toHaveBeenCalledTimes(1)
430
+ })
431
+
432
+ it('should fire the onContextMenu event', () => {
433
+ fireEvent.contextMenu(screen.getByTestId('btn'))
434
+ expect(handleContextMenu).toHaveBeenCalledTimes(1)
435
+ })
436
+
437
+ it('should fire the onFocus event', () => {
438
+ fireEvent.focus(screen.getByTestId('btn'))
439
+ expect(handleFocus).toHaveBeenCalledTimes(1)
440
+ })
441
+
442
+ it('should fire the onMouseEnter event', () => {
443
+ fireEvent.mouseEnter(screen.getByTestId('btn'))
444
+ expect(handleMouseEnter).toHaveBeenCalledTimes(1)
445
+ })
446
+
447
+ it('should fire the onMouseLeave event', () => {
448
+ fireEvent.mouseLeave(screen.getByTestId('btn'))
449
+ expect(handleMouseLeave).toHaveBeenCalledTimes(1)
450
+ })
451
+ })
452
+ })