@refraktor/core 0.0.4 → 0.0.5

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 (334) hide show
  1. package/build/components/progress-circle/progress-circle.d.ts.map +1 -1
  2. package/build/components/progress-circle/progress-circle.js +6 -6
  3. package/build/components/progress-circle/progress-circle.styles.d.ts +2 -7
  4. package/build/components/progress-circle/progress-circle.styles.d.ts.map +1 -1
  5. package/build/components/progress-circle/progress-circle.styles.js +2 -23
  6. package/build/components/progress-circle/progress-circle.types.d.ts +4 -3
  7. package/build/components/progress-circle/progress-circle.types.d.ts.map +1 -1
  8. package/build/components/slider/slider.d.ts.map +1 -1
  9. package/build/components/slider/slider.js +69 -20
  10. package/build/components/tooltip/tooltip.js +1 -1
  11. package/build/style.css +2 -2
  12. package/package.json +30 -3
  13. package/.turbo/turbo-build.log +0 -4
  14. package/refraktor-core-0.0.1-alpha.0.tgz +0 -0
  15. package/src/components/accordion/accordion-control/accordion-control.tsx +0 -156
  16. package/src/components/accordion/accordion-control/index.ts +0 -1
  17. package/src/components/accordion/accordion-item/accordion-item.tsx +0 -40
  18. package/src/components/accordion/accordion-item/index.ts +0 -1
  19. package/src/components/accordion/accordion-panel/accordion-panel.tsx +0 -58
  20. package/src/components/accordion/accordion-panel/index.ts +0 -1
  21. package/src/components/accordion/accordion.context.ts +0 -93
  22. package/src/components/accordion/accordion.styles.ts +0 -60
  23. package/src/components/accordion/accordion.test.tsx +0 -174
  24. package/src/components/accordion/accordion.tsx +0 -203
  25. package/src/components/accordion/accordion.types.ts +0 -126
  26. package/src/components/accordion/index.ts +0 -17
  27. package/src/components/avatar/avatar-group/avatar-group.tsx +0 -73
  28. package/src/components/avatar/avatar-group/index.ts +0 -1
  29. package/src/components/avatar/avatar.styles.ts +0 -11
  30. package/src/components/avatar/avatar.tsx +0 -142
  31. package/src/components/avatar/avatar.types.ts +0 -86
  32. package/src/components/avatar/index.ts +0 -8
  33. package/src/components/badge/badge.styles.ts +0 -21
  34. package/src/components/badge/badge.tsx +0 -62
  35. package/src/components/badge/badge.types.ts +0 -40
  36. package/src/components/badge/index.ts +0 -2
  37. package/src/components/breadcrumbs/breadcrumbs.styles.ts +0 -55
  38. package/src/components/breadcrumbs/breadcrumbs.test.tsx +0 -136
  39. package/src/components/breadcrumbs/breadcrumbs.tsx +0 -199
  40. package/src/components/breadcrumbs/breadcrumbs.types.ts +0 -78
  41. package/src/components/breadcrumbs/breadcrumbs.utils.ts +0 -70
  42. package/src/components/breadcrumbs/index.ts +0 -6
  43. package/src/components/button/button.styles.ts +0 -28
  44. package/src/components/button/button.test.tsx +0 -57
  45. package/src/components/button/button.tsx +0 -110
  46. package/src/components/button/button.types.ts +0 -69
  47. package/src/components/button/index.ts +0 -2
  48. package/src/components/checkbox/checkbox-group/checkbox-group.tsx +0 -93
  49. package/src/components/checkbox/checkbox-group/index.ts +0 -1
  50. package/src/components/checkbox/checkbox.context.ts +0 -14
  51. package/src/components/checkbox/checkbox.styles.ts +0 -49
  52. package/src/components/checkbox/checkbox.test.tsx +0 -80
  53. package/src/components/checkbox/checkbox.tsx +0 -192
  54. package/src/components/checkbox/checkbox.types.ts +0 -125
  55. package/src/components/checkbox/index.ts +0 -10
  56. package/src/components/chip/chip-group/chip-group.tsx +0 -107
  57. package/src/components/chip/chip-group/index.ts +0 -1
  58. package/src/components/chip/chip.context.ts +0 -15
  59. package/src/components/chip/chip.styles.ts +0 -36
  60. package/src/components/chip/chip.test.tsx +0 -197
  61. package/src/components/chip/chip.tsx +0 -208
  62. package/src/components/chip/chip.types.ts +0 -134
  63. package/src/components/chip/index.ts +0 -10
  64. package/src/components/color-swatch/color-swatch.styles.ts +0 -11
  65. package/src/components/color-swatch/color-swatch.test.tsx +0 -80
  66. package/src/components/color-swatch/color-swatch.tsx +0 -84
  67. package/src/components/color-swatch/color-swatch.types.ts +0 -46
  68. package/src/components/color-swatch/index.ts +0 -2
  69. package/src/components/drawer/drawer-body/drawer-body.tsx +0 -29
  70. package/src/components/drawer/drawer-body/index.ts +0 -1
  71. package/src/components/drawer/drawer-close/drawer-close.tsx +0 -43
  72. package/src/components/drawer/drawer-close/index.ts +0 -1
  73. package/src/components/drawer/drawer-content/drawer-content.tsx +0 -135
  74. package/src/components/drawer/drawer-content/index.ts +0 -1
  75. package/src/components/drawer/drawer-header/drawer-header.tsx +0 -40
  76. package/src/components/drawer/drawer-header/index.ts +0 -1
  77. package/src/components/drawer/drawer-overlay/drawer-overlay.tsx +0 -87
  78. package/src/components/drawer/drawer-overlay/index.ts +0 -1
  79. package/src/components/drawer/drawer-root/drawer-root.tsx +0 -93
  80. package/src/components/drawer/drawer-root/index.ts +0 -1
  81. package/src/components/drawer/drawer.context.ts +0 -26
  82. package/src/components/drawer/drawer.styles.ts +0 -32
  83. package/src/components/drawer/drawer.test.tsx +0 -274
  84. package/src/components/drawer/drawer.tsx +0 -58
  85. package/src/components/drawer/drawer.types.ts +0 -192
  86. package/src/components/drawer/index.ts +0 -18
  87. package/src/components/drawer/use-drawer.ts +0 -94
  88. package/src/components/file-input/file-input.test.tsx +0 -134
  89. package/src/components/file-input/file-input.tsx +0 -224
  90. package/src/components/file-input/file-input.types.ts +0 -78
  91. package/src/components/file-input/file-input.utils.test.ts +0 -36
  92. package/src/components/file-input/file-input.utils.ts +0 -130
  93. package/src/components/file-input/index.ts +0 -2
  94. package/src/components/for/for.test.tsx +0 -66
  95. package/src/components/for/for.tsx +0 -53
  96. package/src/components/for/for.types.ts +0 -40
  97. package/src/components/for/index.ts +0 -2
  98. package/src/components/index.ts +0 -35
  99. package/src/components/input/index.ts +0 -2
  100. package/src/components/input/input-description/index.ts +0 -2
  101. package/src/components/input/input-description/input-description.tsx +0 -36
  102. package/src/components/input/input-error/index.ts +0 -2
  103. package/src/components/input/input-error/input-error.tsx +0 -36
  104. package/src/components/input/input-field/index.ts +0 -1
  105. package/src/components/input/input-field/input-field.styles.ts +0 -23
  106. package/src/components/input/input-field/input-field.tsx +0 -94
  107. package/src/components/input/input-label/index.ts +0 -2
  108. package/src/components/input/input-label/input-label.tsx +0 -47
  109. package/src/components/input/input-wrapper/index.ts +0 -2
  110. package/src/components/input/input-wrapper/input-wrapper.tsx +0 -43
  111. package/src/components/input/input.tsx +0 -71
  112. package/src/components/input/input.types.ts +0 -111
  113. package/src/components/loader/index.ts +0 -2
  114. package/src/components/loader/loader.tsx +0 -89
  115. package/src/components/loader/loader.types.ts +0 -33
  116. package/src/components/menu/index.ts +0 -24
  117. package/src/components/menu/menu-dropdown/index.ts +0 -1
  118. package/src/components/menu/menu-dropdown/menu-dropdown.tsx +0 -220
  119. package/src/components/menu/menu-item/index.ts +0 -1
  120. package/src/components/menu/menu-item/menu-item.tsx +0 -126
  121. package/src/components/menu/menu-label/index.ts +0 -1
  122. package/src/components/menu/menu-label/menu-label.tsx +0 -30
  123. package/src/components/menu/menu-separator/index.ts +0 -1
  124. package/src/components/menu/menu-separator/menu-separator.tsx +0 -28
  125. package/src/components/menu/menu-sub/index.ts +0 -1
  126. package/src/components/menu/menu-sub/menu-sub.tsx +0 -117
  127. package/src/components/menu/menu-sub-dropdown/index.ts +0 -1
  128. package/src/components/menu/menu-sub-dropdown/menu-sub-dropdown.tsx +0 -221
  129. package/src/components/menu/menu-sub-trigger/index.ts +0 -1
  130. package/src/components/menu/menu-sub-trigger/menu-sub-trigger.tsx +0 -164
  131. package/src/components/menu/menu-trigger/index.ts +0 -1
  132. package/src/components/menu/menu-trigger/menu-trigger.tsx +0 -98
  133. package/src/components/menu/menu.context.ts +0 -162
  134. package/src/components/menu/menu.test.tsx +0 -136
  135. package/src/components/menu/menu.tsx +0 -133
  136. package/src/components/menu/menu.types.ts +0 -291
  137. package/src/components/menu/use-menu.ts +0 -204
  138. package/src/components/modal/index.ts +0 -18
  139. package/src/components/modal/modal-body/index.ts +0 -1
  140. package/src/components/modal/modal-body/modal-body.tsx +0 -29
  141. package/src/components/modal/modal-close/index.ts +0 -1
  142. package/src/components/modal/modal-close/modal-close.tsx +0 -43
  143. package/src/components/modal/modal-content/index.ts +0 -1
  144. package/src/components/modal/modal-content/modal-content.tsx +0 -119
  145. package/src/components/modal/modal-header/index.ts +0 -1
  146. package/src/components/modal/modal-header/modal-header.tsx +0 -40
  147. package/src/components/modal/modal-overlay/index.ts +0 -1
  148. package/src/components/modal/modal-overlay/modal-overlay.tsx +0 -87
  149. package/src/components/modal/modal-root/index.ts +0 -1
  150. package/src/components/modal/modal-root/modal-root.tsx +0 -93
  151. package/src/components/modal/modal.context.ts +0 -26
  152. package/src/components/modal/modal.test.tsx +0 -316
  153. package/src/components/modal/modal.tsx +0 -58
  154. package/src/components/modal/modal.types.ts +0 -189
  155. package/src/components/modal/use-modal.ts +0 -94
  156. package/src/components/number-input/index.ts +0 -2
  157. package/src/components/number-input/number-input.styles.ts +0 -37
  158. package/src/components/number-input/number-input.test.tsx +0 -22
  159. package/src/components/number-input/number-input.tsx +0 -381
  160. package/src/components/number-input/number-input.types.ts +0 -58
  161. package/src/components/pagination/index.ts +0 -7
  162. package/src/components/pagination/pagination.styles.ts +0 -84
  163. package/src/components/pagination/pagination.test.tsx +0 -117
  164. package/src/components/pagination/pagination.tsx +0 -371
  165. package/src/components/pagination/pagination.types.ts +0 -95
  166. package/src/components/pagination/pagination.utils.ts +0 -88
  167. package/src/components/password-input/index.ts +0 -2
  168. package/src/components/password-input/password-input.test.tsx +0 -72
  169. package/src/components/password-input/password-input.tsx +0 -85
  170. package/src/components/password-input/password-input.types.ts +0 -30
  171. package/src/components/pin-input/index.ts +0 -2
  172. package/src/components/pin-input/pin-input.test.tsx +0 -149
  173. package/src/components/pin-input/pin-input.tsx +0 -473
  174. package/src/components/pin-input/pin-input.types.ts +0 -78
  175. package/src/components/popover/index.ts +0 -12
  176. package/src/components/popover/popover-dropdown/index.ts +0 -1
  177. package/src/components/popover/popover-dropdown/popover-dropdown.tsx +0 -94
  178. package/src/components/popover/popover-trigger/index.ts +0 -1
  179. package/src/components/popover/popover-trigger/popover-trigger.tsx +0 -49
  180. package/src/components/popover/popover.context.ts +0 -20
  181. package/src/components/popover/popover.tsx +0 -113
  182. package/src/components/popover/popover.types.ts +0 -137
  183. package/src/components/popover/use-popover.ts +0 -219
  184. package/src/components/portal/index.ts +0 -2
  185. package/src/components/portal/portal.test.tsx +0 -39
  186. package/src/components/portal/portal.tsx +0 -104
  187. package/src/components/portal/portal.types.ts +0 -31
  188. package/src/components/progress/index.ts +0 -2
  189. package/src/components/progress/progress.styles.ts +0 -25
  190. package/src/components/progress/progress.test.tsx +0 -107
  191. package/src/components/progress/progress.tsx +0 -93
  192. package/src/components/progress/progress.types.ts +0 -52
  193. package/src/components/progress-circle/index.ts +0 -5
  194. package/src/components/progress-circle/progress-circle.styles.ts +0 -31
  195. package/src/components/progress-circle/progress-circle.test.tsx +0 -140
  196. package/src/components/progress-circle/progress-circle.tsx +0 -124
  197. package/src/components/progress-circle/progress-circle.types.ts +0 -52
  198. package/src/components/radio/index.ts +0 -10
  199. package/src/components/radio/radio-group/index.ts +0 -1
  200. package/src/components/radio/radio-group/radio-group.tsx +0 -89
  201. package/src/components/radio/radio.context.ts +0 -14
  202. package/src/components/radio/radio.styles.ts +0 -49
  203. package/src/components/radio/radio.test.tsx +0 -75
  204. package/src/components/radio/radio.tsx +0 -173
  205. package/src/components/radio/radio.types.ts +0 -126
  206. package/src/components/scroll-area/index.ts +0 -6
  207. package/src/components/scroll-area/scroll-area.test.tsx +0 -72
  208. package/src/components/scroll-area/scroll-area.tsx +0 -70
  209. package/src/components/scroll-area/scroll-area.types.ts +0 -37
  210. package/src/components/segmented-control/index.ts +0 -6
  211. package/src/components/segmented-control/segmented-control.styles.ts +0 -37
  212. package/src/components/segmented-control/segmented-control.test.tsx +0 -170
  213. package/src/components/segmented-control/segmented-control.tsx +0 -255
  214. package/src/components/segmented-control/segmented-control.types.ts +0 -78
  215. package/src/components/select/index.ts +0 -20
  216. package/src/components/select/select-dropdown/index.ts +0 -1
  217. package/src/components/select/select-dropdown/select-dropdown.tsx +0 -299
  218. package/src/components/select/select-group/index.ts +0 -1
  219. package/src/components/select/select-group/select-group.tsx +0 -47
  220. package/src/components/select/select-item/index.ts +0 -1
  221. package/src/components/select/select-item/select-item.tsx +0 -157
  222. package/src/components/select/select-root/index.ts +0 -1
  223. package/src/components/select/select-root/select-root.tsx +0 -333
  224. package/src/components/select/select-trigger/index.ts +0 -1
  225. package/src/components/select/select-trigger/select-trigger.tsx +0 -123
  226. package/src/components/select/select.context.ts +0 -140
  227. package/src/components/select/select.test.tsx +0 -190
  228. package/src/components/select/select.tsx +0 -82
  229. package/src/components/select/select.types.ts +0 -272
  230. package/src/components/select/use-select.ts +0 -170
  231. package/src/components/slider/index.ts +0 -7
  232. package/src/components/slider/slider.styles.ts +0 -37
  233. package/src/components/slider/slider.tsx +0 -275
  234. package/src/components/slider/slider.types.ts +0 -82
  235. package/src/components/switch/index.ts +0 -2
  236. package/src/components/switch/switch.styles.ts +0 -31
  237. package/src/components/switch/switch.tsx +0 -132
  238. package/src/components/switch/switch.types.ts +0 -62
  239. package/src/components/table/index.ts +0 -24
  240. package/src/components/table/table-body/index.ts +0 -1
  241. package/src/components/table/table-body/table-body.tsx +0 -37
  242. package/src/components/table/table-caption/index.ts +0 -1
  243. package/src/components/table/table-caption/table-caption.tsx +0 -32
  244. package/src/components/table/table-cell/index.ts +0 -1
  245. package/src/components/table/table-cell/table-cell.tsx +0 -33
  246. package/src/components/table/table-head/index.ts +0 -1
  247. package/src/components/table/table-head/table-head.tsx +0 -29
  248. package/src/components/table/table-header-cell/index.ts +0 -1
  249. package/src/components/table/table-header-cell/table-header-cell.tsx +0 -33
  250. package/src/components/table/table-row/index.ts +0 -1
  251. package/src/components/table/table-row/table-row.tsx +0 -30
  252. package/src/components/table/table.context.ts +0 -18
  253. package/src/components/table/table.styles.ts +0 -62
  254. package/src/components/table/table.test.tsx +0 -145
  255. package/src/components/table/table.tsx +0 -91
  256. package/src/components/table/table.types.ts +0 -145
  257. package/src/components/tabs/index.ts +0 -18
  258. package/src/components/tabs/tabs-list/index.ts +0 -1
  259. package/src/components/tabs/tabs-list/tabs-list.tsx +0 -42
  260. package/src/components/tabs/tabs-panel/index.ts +0 -1
  261. package/src/components/tabs/tabs-panel/tabs-panel.tsx +0 -58
  262. package/src/components/tabs/tabs-tab/index.ts +0 -1
  263. package/src/components/tabs/tabs-tab/tabs-tab.tsx +0 -210
  264. package/src/components/tabs/tabs.context.ts +0 -88
  265. package/src/components/tabs/tabs.styles.ts +0 -92
  266. package/src/components/tabs/tabs.test.tsx +0 -167
  267. package/src/components/tabs/tabs.tsx +0 -137
  268. package/src/components/tabs/tabs.types.ts +0 -128
  269. package/src/components/textarea/index.ts +0 -2
  270. package/src/components/textarea/textarea-field/index.ts +0 -1
  271. package/src/components/textarea/textarea-field/textarea-field.styles.ts +0 -34
  272. package/src/components/textarea/textarea-field/textarea-field.tsx +0 -96
  273. package/src/components/textarea/textarea.tsx +0 -64
  274. package/src/components/textarea/textarea.types.ts +0 -80
  275. package/src/components/timeline/index.ts +0 -11
  276. package/src/components/timeline/timeline-item/index.ts +0 -1
  277. package/src/components/timeline/timeline-item/timeline-item.tsx +0 -158
  278. package/src/components/timeline/timeline.context.ts +0 -21
  279. package/src/components/timeline/timeline.styles.ts +0 -135
  280. package/src/components/timeline/timeline.test.tsx +0 -150
  281. package/src/components/timeline/timeline.tsx +0 -124
  282. package/src/components/timeline/timeline.types.ts +0 -91
  283. package/src/components/tooltip/index.ts +0 -8
  284. package/src/components/tooltip/tooltip.tsx +0 -164
  285. package/src/components/tooltip/tooltip.types.ts +0 -104
  286. package/src/components/tooltip/use-tooltip.ts +0 -200
  287. package/src/components/transition/index.ts +0 -11
  288. package/src/components/transition/transition.test.tsx +0 -126
  289. package/src/components/transition/transition.tsx +0 -441
  290. package/src/components/transition/transition.types.ts +0 -97
  291. package/src/components/transition/transitions.ts +0 -140
  292. package/src/icons/check.tsx +0 -25
  293. package/src/icons/chevron.tsx +0 -46
  294. package/src/icons/eye-off.tsx +0 -30
  295. package/src/icons/eye.tsx +0 -24
  296. package/src/icons/index.ts +0 -7
  297. package/src/icons/minus.tsx +0 -24
  298. package/src/icons/types.ts +0 -9
  299. package/src/icons/user.tsx +0 -18
  300. package/src/icons/x.tsx +0 -35
  301. package/src/index.ts +0 -5
  302. package/src/style.css +0 -334
  303. package/src/theme/ThemeProvider/ThemeProvider.tsx +0 -111
  304. package/src/theme/ThemeProvider/context.ts +0 -7
  305. package/src/theme/ThemeProvider/generateVariables.test.ts +0 -49
  306. package/src/theme/ThemeProvider/generateVariables.ts +0 -124
  307. package/src/theme/ThemeProvider/index.ts +0 -3
  308. package/src/theme/ThemeProvider/types.ts +0 -37
  309. package/src/theme/createTheme/createTheme.ts +0 -41
  310. package/src/theme/createTheme/index.ts +0 -7
  311. package/src/theme/createTheme/types.ts +0 -62
  312. package/src/theme/defaults/colors.ts +0 -203
  313. package/src/theme/defaults/settings.ts +0 -8
  314. package/src/theme/index.ts +0 -4
  315. package/src/theme/types.ts +0 -31
  316. package/src/theme/utils/get-radius.ts +0 -23
  317. package/src/theme/utils/get-shade.ts +0 -16
  318. package/src/theme/utils/index.ts +0 -3
  319. package/src/theme/utils/use-theme.ts +0 -27
  320. package/src/utils/configs/create-config.ts +0 -15
  321. package/src/utils/configs/index.ts +0 -3
  322. package/src/utils/configs/use-class-names.ts +0 -41
  323. package/src/utils/configs/use-props.ts +0 -55
  324. package/src/utils/cx/index.ts +0 -6
  325. package/src/utils/factory/factory.ts +0 -23
  326. package/src/utils/factory/index.ts +0 -14
  327. package/src/utils/factory/types.ts +0 -92
  328. package/src/utils/index.ts +0 -3
  329. package/src/vitest/index.ts +0 -1
  330. package/src/vitest/setup.tsx +0 -20
  331. package/src/vitest/utils.tsx +0 -59
  332. package/tsconfig.json +0 -13
  333. package/tsconfig.tsbuildinfo +0 -1
  334. package/vitest.config.js +0 -19
@@ -1,136 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { render, screen, userEvent, waitFor } from "../../vitest";
3
- import Menu from "./menu";
4
-
5
- describe("@refraktor/core/Menu", () => {
6
- const transitionProps = {
7
- duration: 0,
8
- immediate: true
9
- } as const;
10
-
11
- it("opens on trigger click and closes on item selection", async () => {
12
- const user = userEvent.setup();
13
- const onSelect = vi.fn();
14
-
15
- await render(
16
- <Menu transitionProps={transitionProps}>
17
- <Menu.Trigger>
18
- <button type="button">Open menu</button>
19
- </Menu.Trigger>
20
-
21
- <Menu.Dropdown>
22
- <Menu.Item onSelect={onSelect}>Profile</Menu.Item>
23
- </Menu.Dropdown>
24
- </Menu>
25
- );
26
-
27
- await user.click(screen.getByRole("button", { name: "Open menu" }));
28
- expect(screen.getByRole("menu")).toBeInTheDocument();
29
-
30
- await user.click(screen.getByRole("menuitem", { name: "Profile" }));
31
-
32
- expect(onSelect).toHaveBeenCalledTimes(1);
33
-
34
- await waitFor(() => {
35
- expect(screen.queryByRole("menu")).not.toBeInTheDocument();
36
- });
37
- });
38
-
39
- it("does not activate disabled item", async () => {
40
- const user = userEvent.setup();
41
- const onSelect = vi.fn();
42
-
43
- await render(
44
- <Menu transitionProps={transitionProps}>
45
- <Menu.Trigger>
46
- <button type="button">Open menu</button>
47
- </Menu.Trigger>
48
-
49
- <Menu.Dropdown>
50
- <Menu.Item disabled onSelect={onSelect}>
51
- Disabled item
52
- </Menu.Item>
53
- </Menu.Dropdown>
54
- </Menu>
55
- );
56
-
57
- await user.click(screen.getByRole("button", { name: "Open menu" }));
58
-
59
- const item = screen.getByRole("menuitem", { name: "Disabled item" });
60
- expect(item).toBeDisabled();
61
-
62
- await user.click(item);
63
- expect(onSelect).not.toHaveBeenCalled();
64
- expect(screen.getByRole("menu")).toBeInTheDocument();
65
- });
66
-
67
- it("supports keyboard navigation", async () => {
68
- const user = userEvent.setup();
69
- const onFirstSelect = vi.fn();
70
- const onSecondSelect = vi.fn();
71
-
72
- await render(
73
- <Menu transitionProps={transitionProps}>
74
- <Menu.Trigger>
75
- <button type="button">Open menu</button>
76
- </Menu.Trigger>
77
-
78
- <Menu.Dropdown>
79
- <Menu.Item onSelect={onFirstSelect}>First</Menu.Item>
80
- <Menu.Item onSelect={onSecondSelect}>Second</Menu.Item>
81
- </Menu.Dropdown>
82
- </Menu>
83
- );
84
-
85
- const trigger = screen.getByRole("button", { name: "Open menu" });
86
- trigger.focus();
87
-
88
- await user.keyboard("{ArrowDown}");
89
- await user.keyboard("{ArrowDown}");
90
- await user.keyboard("{Enter}");
91
-
92
- expect(onFirstSelect).not.toHaveBeenCalled();
93
- expect(onSecondSelect).toHaveBeenCalledTimes(1);
94
- });
95
-
96
- it("opens submenu with keyboard and selects submenu item", async () => {
97
- const user = userEvent.setup();
98
- const onSubSelect = vi.fn();
99
-
100
- await render(
101
- <Menu transitionProps={transitionProps}>
102
- <Menu.Trigger>
103
- <button type="button">Open menu</button>
104
- </Menu.Trigger>
105
-
106
- <Menu.Dropdown>
107
- <Menu.Sub>
108
- <Menu.SubTrigger>More</Menu.SubTrigger>
109
-
110
- <Menu.SubDropdown>
111
- <Menu.Item onSelect={onSubSelect}>Sub item</Menu.Item>
112
- </Menu.SubDropdown>
113
- </Menu.Sub>
114
- </Menu.Dropdown>
115
- </Menu>
116
- );
117
-
118
- await user.click(screen.getByRole("button", { name: "Open menu" }));
119
-
120
- const subTrigger = screen.getByRole("menuitem", { name: "More" });
121
- subTrigger.focus();
122
-
123
- await user.keyboard("{ArrowRight}");
124
-
125
- const subItem = await screen.findByRole("menuitem", {
126
- name: "Sub item"
127
- });
128
-
129
- await user.click(subItem);
130
- expect(onSubSelect).toHaveBeenCalledTimes(1);
131
-
132
- await waitFor(() => {
133
- expect(screen.queryAllByRole("menu")).toHaveLength(0);
134
- });
135
- });
136
- });
@@ -1,133 +0,0 @@
1
- import { useId } from "@refraktor/utils";
2
- import { useTheme } from "../../theme";
3
- import {
4
- createClassNamesConfig,
5
- createComponentConfig,
6
- factory,
7
- useClassNames,
8
- useProps
9
- } from "../../utils";
10
- import { MenuFactoryPayload, MenuClassNames, MenuProps } from "./menu.types";
11
- import { useMenu } from "./use-menu";
12
- import {
13
- MenuLevelProvider,
14
- MenuRootProvider,
15
- useMenuItemsRegistry
16
- } from "./menu.context";
17
- import { MenuTrigger } from "./menu-trigger";
18
- import { MenuDropdown } from "./menu-dropdown";
19
- import { MenuItem } from "./menu-item";
20
- import { MenuLabel } from "./menu-label";
21
- import { MenuSeparator } from "./menu-separator";
22
- import { MenuSub } from "./menu-sub";
23
- import { MenuSubTrigger } from "./menu-sub-trigger";
24
- import { MenuSubDropdown } from "./menu-sub-dropdown";
25
-
26
- const defaultProps = {
27
- positioning: {
28
- placement: "bottom-start",
29
- offset: 4
30
- },
31
- middlewares: { flip: true, shift: true },
32
- trigger: "click",
33
- openDelay: 0,
34
- closeDelay: 100,
35
- radius: "default",
36
- withinPortal: true,
37
- closeOnClickOutside: true,
38
- closeOnEscape: true,
39
- closeOnItemClick: true
40
- } satisfies Partial<MenuProps>;
41
-
42
- const Menu = factory<MenuFactoryPayload>((_props, ref) => {
43
- const { cx } = useTheme();
44
- const {
45
- id,
46
- children,
47
- opened,
48
- defaultOpened,
49
- onOpenedChange,
50
- positioning,
51
- middlewares,
52
- disabled,
53
- trigger,
54
- openDelay,
55
- closeDelay,
56
- transitionProps,
57
- radius,
58
- withinPortal,
59
- closeOnClickOutside,
60
- closeOnEscape,
61
- closeOnItemClick,
62
- className,
63
- classNames,
64
- ...props
65
- } = useProps("Menu", defaultProps, _props);
66
- const classes = useClassNames("Menu", classNames);
67
- const _id = useId(id);
68
-
69
- const menu = useMenu({
70
- opened,
71
- defaultOpened,
72
- onOpenedChange,
73
- positioning,
74
- middlewares,
75
- disabled,
76
- trigger,
77
- closeOnClickOutside,
78
- closeOnEscape,
79
- openDelay,
80
- closeDelay
81
- });
82
-
83
- const registry = useMenuItemsRegistry();
84
-
85
- const getStyles = (part: keyof MenuClassNames) => classes[part];
86
-
87
- return (
88
- <MenuRootProvider
89
- value={{
90
- radius: radius ?? "default",
91
- withinPortal: withinPortal ?? true,
92
- closeOnItemClick: closeOnItemClick ?? true,
93
- transitionProps,
94
- classNames,
95
- getStyles
96
- }}
97
- >
98
- <MenuLevelProvider
99
- value={{
100
- menu,
101
- isSubmenu: false,
102
- registerItem: registry.registerItem,
103
- getItems: registry.getItems,
104
- closeMenu: menu.close,
105
- closeAllMenus: menu.close
106
- }}
107
- >
108
- <div
109
- ref={ref}
110
- id={_id}
111
- className={cx("inline-block", classes.root, className)}
112
- {...props}
113
- >
114
- {children}
115
- </div>
116
- </MenuLevelProvider>
117
- </MenuRootProvider>
118
- );
119
- });
120
-
121
- Menu.displayName = "@refraktor/core/Menu";
122
- Menu.configure = createComponentConfig<MenuProps>();
123
- Menu.classNames = createClassNamesConfig<MenuClassNames>();
124
- Menu.Trigger = MenuTrigger;
125
- Menu.Dropdown = MenuDropdown;
126
- Menu.Item = MenuItem;
127
- Menu.Label = MenuLabel;
128
- Menu.Separator = MenuSeparator;
129
- Menu.Sub = MenuSub;
130
- Menu.SubTrigger = MenuSubTrigger;
131
- Menu.SubDropdown = MenuSubDropdown;
132
-
133
- export default Menu;
@@ -1,291 +0,0 @@
1
- import { ComponentPropsWithoutRef, ReactNode } from "react";
2
- import type {
3
- FlipOptions,
4
- InlineOptions,
5
- Placement,
6
- ShiftOptions
7
- } from "@floating-ui/react";
8
- import { TransitionProps } from "../transition";
9
- import { RefraktorRadius } from "../../theme";
10
- import {
11
- createClassNamesConfig,
12
- createComponentConfig,
13
- FactoryPayload
14
- } from "../../utils";
15
- import { MenuTrigger } from "./menu-trigger";
16
- import { MenuDropdown } from "./menu-dropdown";
17
- import { MenuItem } from "./menu-item";
18
- import { MenuLabel } from "./menu-label";
19
- import { MenuSeparator } from "./menu-separator";
20
- import { MenuSub } from "./menu-sub";
21
- import { MenuSubTrigger } from "./menu-sub-trigger";
22
- import { MenuSubDropdown } from "./menu-sub-dropdown";
23
-
24
- export type MenuClassNames = {
25
- root?: string;
26
- trigger?: string;
27
- dropdown?: string;
28
- item?: string;
29
- label?: string;
30
- separator?: string;
31
- subTrigger?: string;
32
- subDropdown?: string;
33
- itemLeftSection?: string;
34
- itemRightSection?: string;
35
- subIndicator?: string;
36
- };
37
-
38
- export type MenuPositioning = {
39
- /** The placement of the menu relative to the trigger element @default `bottom-start` */
40
- placement?: Placement;
41
-
42
- /** Offset distance from the trigger element in pixels @default `4` */
43
- offset?: number;
44
- };
45
-
46
- export type MenuMiddlewares = {
47
- shift?: boolean | ShiftOptions;
48
- flip?: boolean | FlipOptions;
49
- inline?: boolean | InlineOptions;
50
- };
51
-
52
- export type MenuTriggerType = "click" | "hover" | "focus";
53
-
54
- export interface MenuProps extends ComponentPropsWithoutRef<"div"> {
55
- /** Children containing subcomponents */
56
- children: ReactNode;
57
-
58
- /** State of the menu (controlled) */
59
- opened?: boolean;
60
-
61
- /** Initial state of the menu (uncontrolled) */
62
- defaultOpened?: boolean;
63
-
64
- /** Callback called when the menu state changes */
65
- onOpenedChange?: (opened: boolean) => void;
66
-
67
- /** Positioning settings for the menu */
68
- positioning?: MenuPositioning;
69
-
70
- /** Middlewares settings for the menu */
71
- middlewares?: MenuMiddlewares;
72
-
73
- /** Whether the menu is disabled @default `false` */
74
- disabled?: boolean;
75
-
76
- /** Trigger type for the menu @default `click` */
77
- trigger?: MenuTriggerType;
78
-
79
- /** Delay in milliseconds before the menu opens @default `0` */
80
- openDelay?: number;
81
-
82
- /** Delay in milliseconds before the menu closes @default `100` */
83
- closeDelay?: number;
84
-
85
- /** Transition props for the menu dropdown, uses Transition component internally */
86
- transitionProps?: Omit<TransitionProps, "children" | "mounted">;
87
-
88
- /** Radius for menu dropdowns @default `default` */
89
- radius?: RefraktorRadius;
90
-
91
- /** Whether to render dropdowns within a portal @default `true` */
92
- withinPortal?: boolean;
93
-
94
- /** Whether to close on click outside @default `true` */
95
- closeOnClickOutside?: boolean;
96
-
97
- /** Whether to close on escape key @default `true` */
98
- closeOnEscape?: boolean;
99
-
100
- /** Whether to close the whole menu tree after selecting an item @default `true` */
101
- closeOnItemClick?: boolean;
102
-
103
- /** Used for editing root class name */
104
- className?: string;
105
-
106
- /** Used for styling different parts of the component */
107
- classNames?: MenuClassNames;
108
- }
109
-
110
- export interface MenuTriggerProps extends ComponentPropsWithoutRef<"div"> {
111
- /** The trigger element */
112
- children: ReactNode;
113
-
114
- /** Used for editing root class name */
115
- className?: string;
116
- }
117
-
118
- export interface MenuDropdownProps extends ComponentPropsWithoutRef<"div"> {
119
- /** Content to display inside the dropdown */
120
- children: ReactNode;
121
-
122
- /** Used for editing root class name */
123
- className?: string;
124
- }
125
-
126
- export interface MenuItemProps
127
- extends Omit<ComponentPropsWithoutRef<"button">, "onSelect"> {
128
- /** Content of the item */
129
- children: ReactNode;
130
-
131
- /** Callback called when an item is selected */
132
- onSelect?: () => void;
133
-
134
- /** Whether the item is disabled @default `false` */
135
- disabled?: boolean;
136
-
137
- /** Whether this item should close menus when selected, defaults to Menu closeOnItemClick */
138
- closeOnSelect?: boolean;
139
-
140
- /** Optional typeahead value if children is non-text */
141
- textValue?: string;
142
-
143
- /** Optional left section for icons or markers */
144
- leftSection?: ReactNode;
145
-
146
- /** Optional right section for hints or shortcuts */
147
- rightSection?: ReactNode;
148
-
149
- /** Used for editing root class name */
150
- className?: string;
151
- }
152
-
153
- export interface MenuLabelProps extends ComponentPropsWithoutRef<"div"> {
154
- /** Label content */
155
- children: ReactNode;
156
-
157
- /** Used for editing root class name */
158
- className?: string;
159
- }
160
-
161
- export interface MenuSeparatorProps extends ComponentPropsWithoutRef<"div"> {
162
- /** Used for editing root class name */
163
- className?: string;
164
- }
165
-
166
- export interface MenuSubProps extends ComponentPropsWithoutRef<"div"> {
167
- /** Children containing submenu trigger and submenu dropdown */
168
- children: ReactNode;
169
-
170
- /** State of the submenu (controlled) */
171
- opened?: boolean;
172
-
173
- /** Initial state of the submenu (uncontrolled) */
174
- defaultOpened?: boolean;
175
-
176
- /** Callback called when the submenu state changes */
177
- onOpenedChange?: (opened: boolean) => void;
178
-
179
- /** Positioning settings for the submenu */
180
- positioning?: MenuPositioning;
181
-
182
- /** Middlewares settings for the submenu */
183
- middlewares?: MenuMiddlewares;
184
-
185
- /** Whether the submenu is disabled @default `false` */
186
- disabled?: boolean;
187
-
188
- /** Trigger type for the submenu @default `hover` */
189
- trigger?: MenuTriggerType;
190
-
191
- /** Delay in milliseconds before the submenu opens @default `75` */
192
- openDelay?: number;
193
-
194
- /** Delay in milliseconds before the submenu closes @default `125` */
195
- closeDelay?: number;
196
-
197
- /** Whether to close submenu on click outside @default `false` */
198
- closeOnClickOutside?: boolean;
199
-
200
- /** Whether to close submenu on escape @default `true` */
201
- closeOnEscape?: boolean;
202
-
203
- /** Used for editing root class name */
204
- className?: string;
205
- }
206
-
207
- export interface MenuSubTriggerProps
208
- extends Omit<ComponentPropsWithoutRef<"button">, "onSelect"> {
209
- /** Content of the submenu trigger */
210
- children: ReactNode;
211
-
212
- /** Optional typeahead value if children is non-text */
213
- textValue?: string;
214
-
215
- /** Whether the submenu trigger is disabled @default `false` */
216
- disabled?: boolean;
217
-
218
- /** Optional left section for icons or markers */
219
- leftSection?: ReactNode;
220
-
221
- /** Optional right section for hints or shortcuts */
222
- rightSection?: ReactNode;
223
-
224
- /** Used for editing root class name */
225
- className?: string;
226
- }
227
-
228
- export interface MenuSubDropdownProps extends ComponentPropsWithoutRef<"div"> {
229
- /** Content to display inside the submenu dropdown */
230
- children: ReactNode;
231
-
232
- /** Used for editing root class name */
233
- className?: string;
234
- }
235
-
236
- export interface MenuFactoryPayload extends FactoryPayload {
237
- props: MenuProps;
238
- ref: HTMLDivElement;
239
- compound: {
240
- configure: ReturnType<typeof createComponentConfig<MenuProps>>;
241
- classNames: ReturnType<typeof createClassNamesConfig<MenuClassNames>>;
242
- Trigger: typeof MenuTrigger;
243
- Dropdown: typeof MenuDropdown;
244
- Item: typeof MenuItem;
245
- Label: typeof MenuLabel;
246
- Separator: typeof MenuSeparator;
247
- Sub: typeof MenuSub;
248
- SubTrigger: typeof MenuSubTrigger;
249
- SubDropdown: typeof MenuSubDropdown;
250
- };
251
- }
252
-
253
- export interface MenuTriggerFactoryPayload extends FactoryPayload {
254
- props: MenuTriggerProps;
255
- ref: HTMLDivElement;
256
- }
257
-
258
- export interface MenuDropdownFactoryPayload extends FactoryPayload {
259
- props: MenuDropdownProps;
260
- ref: HTMLDivElement;
261
- }
262
-
263
- export interface MenuItemFactoryPayload extends FactoryPayload {
264
- props: MenuItemProps;
265
- ref: HTMLButtonElement;
266
- }
267
-
268
- export interface MenuLabelFactoryPayload extends FactoryPayload {
269
- props: MenuLabelProps;
270
- ref: HTMLDivElement;
271
- }
272
-
273
- export interface MenuSeparatorFactoryPayload extends FactoryPayload {
274
- props: MenuSeparatorProps;
275
- ref: HTMLDivElement;
276
- }
277
-
278
- export interface MenuSubFactoryPayload extends FactoryPayload {
279
- props: MenuSubProps;
280
- ref: HTMLDivElement;
281
- }
282
-
283
- export interface MenuSubTriggerFactoryPayload extends FactoryPayload {
284
- props: MenuSubTriggerProps;
285
- ref: HTMLButtonElement;
286
- }
287
-
288
- export interface MenuSubDropdownFactoryPayload extends FactoryPayload {
289
- props: MenuSubDropdownProps;
290
- ref: HTMLDivElement;
291
- }