@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,190 +0,0 @@
1
- import { useState } from "react";
2
- import { describe, expect, it, vi } from "vitest";
3
- import { render, screen, userEvent, waitFor } from "../../vitest";
4
- import Select from "./select";
5
-
6
- describe("@refraktor/core/Select", () => {
7
- const transitionProps = {
8
- duration: 0,
9
- immediate: true
10
- } as const;
11
-
12
- it("supports built-in data mode", async () => {
13
- const user = userEvent.setup();
14
-
15
- await render(
16
- <Select
17
- placeholder="Pick framework"
18
- transitionProps={transitionProps}
19
- data={[
20
- { value: "react", label: "React" },
21
- { value: "vue", label: "Vue" }
22
- ]}
23
- />
24
- );
25
-
26
- const trigger = screen.getByRole("combobox");
27
- expect(trigger).toHaveAttribute("placeholder", "Pick framework");
28
-
29
- await user.click(trigger);
30
- await user.click(screen.getByRole("option", { name: "React" }));
31
-
32
- expect(trigger).toHaveValue("React");
33
-
34
- await waitFor(() => {
35
- expect(screen.queryByRole("listbox")).not.toBeInTheDocument();
36
- });
37
- });
38
-
39
- it("renders defaultValue label in trigger before opening", async () => {
40
- await render(
41
- <Select
42
- defaultValue="apple"
43
- data={[
44
- { value: "apple", label: "Apple" },
45
- { value: "orange", label: "Orange" }
46
- ]}
47
- />
48
- );
49
-
50
- expect(screen.getByRole("combobox")).toHaveValue("Apple");
51
- });
52
-
53
- it("renders searchable input inside dropdown", async () => {
54
- const user = userEvent.setup();
55
-
56
- await render(
57
- <Select
58
- searchable
59
- transitionProps={transitionProps}
60
- data={[
61
- { value: "react", label: "React" },
62
- { value: "vue", label: "Vue" },
63
- { value: "solid", label: "Solid" }
64
- ]}
65
- />
66
- );
67
-
68
- await user.click(screen.getByRole("combobox"));
69
-
70
- const searchInput = screen.getByPlaceholderText("Search...");
71
- expect(searchInput).toBeInTheDocument();
72
-
73
- await user.type(searchInput, "vu");
74
-
75
- expect(screen.getByRole("option", { name: "Vue" })).toBeInTheDocument();
76
- expect(
77
- screen.queryByRole("option", { name: "React" })
78
- ).not.toBeInTheDocument();
79
-
80
- await user.clear(searchInput);
81
- await user.type(searchInput, "unknown");
82
-
83
- expect(screen.getByText("No options")).toBeInTheDocument();
84
- });
85
-
86
- it("supports compound mode with groups", async () => {
87
- const user = userEvent.setup();
88
-
89
- await render(
90
- <Select.Root transitionProps={transitionProps}>
91
- <Select.Trigger />
92
-
93
- <Select.Dropdown>
94
- <Select.Group label="Frontend">
95
- <Select.Item value="react">React</Select.Item>
96
- </Select.Group>
97
-
98
- <Select.Group label="Backend">
99
- <Select.Item value="node">Node.js</Select.Item>
100
- </Select.Group>
101
- </Select.Dropdown>
102
- </Select.Root>
103
- );
104
-
105
- const trigger = screen.getByRole("combobox");
106
-
107
- await user.click(trigger);
108
- expect(screen.getByText("Frontend")).toBeInTheDocument();
109
- expect(screen.getByText("Backend")).toBeInTheDocument();
110
-
111
- await user.click(screen.getByRole("option", { name: "Node.js" }));
112
- expect(trigger).toHaveValue("Node.js");
113
- });
114
-
115
- it("supports keyboard selection", async () => {
116
- const user = userEvent.setup();
117
-
118
- await render(
119
- <Select
120
- transitionProps={transitionProps}
121
- data={[
122
- { value: "react", label: "React" },
123
- { value: "vue", label: "Vue" }
124
- ]}
125
- />
126
- );
127
-
128
- const trigger = screen.getByRole("combobox");
129
- trigger.focus();
130
-
131
- await user.keyboard("{ArrowDown}");
132
- await user.keyboard("{ArrowDown}");
133
- await user.keyboard("{Enter}");
134
-
135
- expect(trigger).toHaveValue("Vue");
136
- });
137
-
138
- it("supports controlled mode", async () => {
139
- const user = userEvent.setup();
140
- const onChange = vi.fn();
141
-
142
- function Demo() {
143
- const [value, setValue] = useState<string | null>("react");
144
-
145
- return (
146
- <Select
147
- value={value}
148
- onChange={(nextValue) => {
149
- onChange(nextValue);
150
- setValue(nextValue);
151
- }}
152
- transitionProps={transitionProps}
153
- data={[
154
- { value: "react", label: "React" },
155
- { value: "vue", label: "Vue" }
156
- ]}
157
- />
158
- );
159
- }
160
-
161
- await render(<Demo />);
162
-
163
- await user.click(screen.getByRole("combobox"));
164
- await user.click(screen.getByRole("option", { name: "Vue" }));
165
-
166
- expect(onChange).toHaveBeenCalledWith("vue");
167
- expect(screen.getByRole("combobox")).toHaveValue("Vue");
168
- });
169
-
170
- it("supports input wrapper props", async () => {
171
- await render(
172
- <Select
173
- label="Framework"
174
- description="Pick one option"
175
- error="Selection is required"
176
- transitionProps={transitionProps}
177
- data={[
178
- { value: "react", label: "React" },
179
- { value: "vue", label: "Vue" }
180
- ]}
181
- />
182
- );
183
-
184
- const trigger = screen.getByLabelText("Framework");
185
-
186
- expect(trigger).toHaveAttribute("aria-invalid", "true");
187
- expect(screen.getByText("Pick one option")).toBeInTheDocument();
188
- expect(screen.getByText("Selection is required")).toBeInTheDocument();
189
- });
190
- });
@@ -1,82 +0,0 @@
1
- import {
2
- createClassNamesConfig,
3
- createComponentConfig,
4
- factory
5
- } from "../../utils";
6
- import { SelectDropdown } from "./select-dropdown";
7
- import { SelectGroup } from "./select-group";
8
- import { SelectItem } from "./select-item";
9
- import { SelectRoot } from "./select-root";
10
- import { SelectTrigger } from "./select-trigger";
11
- import type {
12
- SelectClassNames,
13
- SelectData,
14
- SelectFactoryPayload,
15
- SelectGroupData,
16
- SelectProps
17
- } from "./select.types";
18
-
19
- function isGroupData(item: SelectData): item is SelectGroupData {
20
- return "items" in item;
21
- }
22
-
23
- const Select = factory<SelectFactoryPayload>((_props, ref) => {
24
- const { data, children, ...props } = _props;
25
-
26
- if (children !== undefined && children !== null) {
27
- return (
28
- <SelectRoot ref={ref} {...props}>
29
- {children}
30
- </SelectRoot>
31
- );
32
- }
33
-
34
- return (
35
- <SelectRoot ref={ref} {...props}>
36
- <SelectTrigger />
37
-
38
- <SelectDropdown>
39
- {(data ?? []).map((entry, index) => {
40
- if (isGroupData(entry)) {
41
- return (
42
- <SelectGroup key={`group-${index}`} label={entry.label}>
43
- {entry.items.map((item) => (
44
- <SelectItem
45
- key={item.value}
46
- value={item.value}
47
- disabled={item.disabled}
48
- textValue={item.textValue}
49
- >
50
- {item.label}
51
- </SelectItem>
52
- ))}
53
- </SelectGroup>
54
- );
55
- }
56
-
57
- return (
58
- <SelectItem
59
- key={entry.value}
60
- value={entry.value}
61
- disabled={entry.disabled}
62
- textValue={entry.textValue}
63
- >
64
- {entry.label}
65
- </SelectItem>
66
- );
67
- })}
68
- </SelectDropdown>
69
- </SelectRoot>
70
- );
71
- });
72
-
73
- Select.displayName = "@refraktor/core/Select";
74
- Select.configure = createComponentConfig<SelectProps>();
75
- Select.classNames = createClassNamesConfig<SelectClassNames>();
76
- Select.Root = SelectRoot;
77
- Select.Trigger = SelectTrigger;
78
- Select.Dropdown = SelectDropdown;
79
- Select.Group = SelectGroup;
80
- Select.Item = SelectItem;
81
-
82
- export default Select;
@@ -1,272 +0,0 @@
1
- import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
- import type {
3
- FlipOptions,
4
- InlineOptions,
5
- Placement,
6
- ShiftOptions
7
- } from "@floating-ui/react";
8
- import type { RefraktorRadius, RefraktorSize } from "../../theme";
9
- import {
10
- createClassNamesConfig,
11
- createComponentConfig,
12
- FactoryPayload
13
- } from "../../utils";
14
- import type { TransitionProps } from "../transition";
15
- import type { InputVariant } from "../input";
16
- import type { SelectRoot } from "./select-root";
17
- import type { SelectTrigger } from "./select-trigger";
18
- import type { SelectDropdown } from "./select-dropdown";
19
- import type { SelectGroup } from "./select-group";
20
- import type { SelectItem } from "./select-item";
21
-
22
- export type SelectClassNames = {
23
- root?: string;
24
- trigger?: string;
25
- triggerInput?: string;
26
- triggerIcon?: string;
27
- dropdown?: string;
28
- search?: string;
29
- searchInput?: string;
30
- options?: string;
31
- group?: string;
32
- groupLabel?: string;
33
- item?: string;
34
- itemLabel?: string;
35
- itemCheck?: string;
36
- empty?: string;
37
- };
38
-
39
- export type SelectPositioning = {
40
- /** The placement of the dropdown relative to the trigger @default `bottom-start` */
41
- placement?: Placement;
42
-
43
- /** Offset distance from the trigger in pixels @default `4` */
44
- offset?: number;
45
- };
46
-
47
- export type SelectMiddlewares = {
48
- shift?: boolean | ShiftOptions;
49
- flip?: boolean | FlipOptions;
50
- inline?: boolean | InlineOptions;
51
- };
52
-
53
- export interface SelectItemData {
54
- /** Option value */
55
- value: string;
56
-
57
- /** Option label */
58
- label: ReactNode;
59
-
60
- /** Optional searchable text for non-string labels */
61
- textValue?: string;
62
-
63
- /** Whether the option is disabled */
64
- disabled?: boolean;
65
- }
66
-
67
- export interface SelectGroupData {
68
- /** Group label */
69
- label?: ReactNode;
70
-
71
- /** Group items */
72
- items: SelectItemData[];
73
- }
74
-
75
- export type SelectData = SelectItemData | SelectGroupData;
76
-
77
- export interface SelectRootProps
78
- extends Omit<
79
- ComponentPropsWithoutRef<"div">,
80
- "value" | "defaultValue" | "onChange"
81
- > {
82
- /** Children containing select subcomponents */
83
- children: ReactNode;
84
-
85
- /** Label text */
86
- label?: ReactNode;
87
-
88
- /** Description text */
89
- description?: ReactNode;
90
-
91
- /** Error message */
92
- error?: ReactNode;
93
-
94
- /** Whether the field is required */
95
- required?: boolean;
96
-
97
- /** Display an asterisk next to the label */
98
- withAsterisk?: boolean;
99
-
100
- /** Selected value (controlled) */
101
- value?: string | null;
102
-
103
- /** Initial selected value (uncontrolled) */
104
- defaultValue?: string | null;
105
-
106
- /** Callback called when selected value changes */
107
- onChange?: (value: string | null) => void;
108
-
109
- /** Dropdown open state (controlled) */
110
- opened?: boolean;
111
-
112
- /** Initial dropdown open state (uncontrolled) */
113
- defaultOpened?: boolean;
114
-
115
- /** Callback called when dropdown open state changes */
116
- onOpenedChange?: (opened: boolean) => void;
117
-
118
- /** Positioning settings */
119
- positioning?: SelectPositioning;
120
-
121
- /** Floating middleware settings */
122
- middlewares?: SelectMiddlewares;
123
-
124
- /** Whether select is disabled @default `false` */
125
- disabled?: boolean;
126
-
127
- /** Whether to render searchable input inside dropdown @default `false` */
128
- searchable?: boolean;
129
-
130
- /** Search query (controlled) */
131
- searchValue?: string;
132
-
133
- /** Initial search query (uncontrolled) */
134
- defaultSearchValue?: string;
135
-
136
- /** Callback called when search query changes */
137
- onSearchChange?: (value: string) => void;
138
-
139
- /** Trigger placeholder text @default `Select option` */
140
- placeholder?: string;
141
-
142
- /** Search input placeholder @default `Search...` */
143
- searchPlaceholder?: string;
144
-
145
- /** Content rendered when no options match @default `No options` */
146
- nothingFound?: ReactNode;
147
-
148
- /** Trigger and search input size @default `md` */
149
- size?: RefraktorSize;
150
-
151
- /** Trigger and search input radius @default `default` */
152
- radius?: RefraktorRadius;
153
-
154
- /** Trigger and search input variant @default `default` */
155
- variant?: InputVariant;
156
-
157
- /** Whether to render dropdown in portal @default `true` */
158
- withinPortal?: boolean;
159
-
160
- /** Whether to close on click outside @default `true` */
161
- closeOnClickOutside?: boolean;
162
-
163
- /** Whether to close on Escape key @default `true` */
164
- closeOnEscape?: boolean;
165
-
166
- /** Transition props for dropdown, uses Transition internally */
167
- transitionProps?: Omit<TransitionProps, "children" | "mounted">;
168
-
169
- /** Used for editing root class name */
170
- className?: string;
171
-
172
- /** Used for styling different parts of the component */
173
- classNames?: SelectClassNames;
174
- }
175
-
176
- export interface SelectTriggerProps extends ComponentPropsWithoutRef<"div"> {
177
- /** Trigger placeholder override */
178
- placeholder?: string;
179
-
180
- /** Optional custom right section */
181
- rightSection?: ReactNode;
182
-
183
- /** Used for editing root class name */
184
- className?: string;
185
- }
186
-
187
- export interface SelectDropdownProps extends ComponentPropsWithoutRef<"div"> {
188
- /** Content displayed inside dropdown */
189
- children: ReactNode;
190
-
191
- /** Used for editing root class name */
192
- className?: string;
193
- }
194
-
195
- export interface SelectGroupProps extends ComponentPropsWithoutRef<"div"> {
196
- /** Group label */
197
- label?: ReactNode;
198
-
199
- /** Group content */
200
- children: ReactNode;
201
-
202
- /** Used for editing root class name */
203
- className?: string;
204
- }
205
-
206
- export interface SelectItemProps
207
- extends Omit<ComponentPropsWithoutRef<"button">, "value" | "onSelect"> {
208
- /** Option value */
209
- value: string;
210
-
211
- /** Option content */
212
- children: ReactNode;
213
-
214
- /** Callback called when option is selected */
215
- onSelect?: (value: string) => void;
216
-
217
- /** Optional searchable text for non-string children */
218
- textValue?: string;
219
-
220
- /** Whether option is disabled */
221
- disabled?: boolean;
222
-
223
- /** Used for editing root class name */
224
- className?: string;
225
- }
226
-
227
- export interface SelectProps extends Omit<SelectRootProps, "children"> {
228
- /** Compound children. If provided, data-based rendering is skipped */
229
- children?: ReactNode;
230
-
231
- /** Data used for built-in rendering mode */
232
- data?: SelectData[];
233
- }
234
-
235
- export interface SelectFactoryPayload extends FactoryPayload {
236
- props: SelectProps;
237
- ref: HTMLDivElement;
238
- compound: {
239
- configure: ReturnType<typeof createComponentConfig<SelectProps>>;
240
- classNames: ReturnType<typeof createClassNamesConfig<SelectClassNames>>;
241
- Root: typeof SelectRoot;
242
- Trigger: typeof SelectTrigger;
243
- Dropdown: typeof SelectDropdown;
244
- Group: typeof SelectGroup;
245
- Item: typeof SelectItem;
246
- };
247
- }
248
-
249
- export interface SelectRootFactoryPayload extends FactoryPayload {
250
- props: SelectRootProps;
251
- ref: HTMLDivElement;
252
- }
253
-
254
- export interface SelectTriggerFactoryPayload extends FactoryPayload {
255
- props: SelectTriggerProps;
256
- ref: HTMLDivElement;
257
- }
258
-
259
- export interface SelectDropdownFactoryPayload extends FactoryPayload {
260
- props: SelectDropdownProps;
261
- ref: HTMLDivElement;
262
- }
263
-
264
- export interface SelectGroupFactoryPayload extends FactoryPayload {
265
- props: SelectGroupProps;
266
- ref: HTMLDivElement;
267
- }
268
-
269
- export interface SelectItemFactoryPayload extends FactoryPayload {
270
- props: SelectItemProps;
271
- ref: HTMLButtonElement;
272
- }
@@ -1,170 +0,0 @@
1
- import { useUncontrolled } from "@refraktor/utils";
2
- import {
3
- autoUpdate,
4
- flip,
5
- FloatingContext,
6
- inline,
7
- Middleware,
8
- offset,
9
- Placement,
10
- shift,
11
- useClick,
12
- useDismiss,
13
- useFloating,
14
- useInteractions
15
- } from "@floating-ui/react";
16
- import { useCallback, useMemo } from "react";
17
- import type { SelectMiddlewares, SelectPositioning } from "./select.types";
18
-
19
- interface UseSelectProps {
20
- opened?: boolean;
21
- defaultOpened?: boolean;
22
- onOpenedChange?: (opened: boolean) => void;
23
- positioning?: SelectPositioning;
24
- middlewares?: SelectMiddlewares;
25
- disabled?: boolean;
26
- closeOnClickOutside?: boolean;
27
- closeOnEscape?: boolean;
28
- }
29
-
30
- export interface UseSelectReturn {
31
- opened: boolean;
32
- open: () => void;
33
- close: () => void;
34
- toggle: () => void;
35
- context: FloatingContext;
36
- refs: {
37
- setReference: (node: HTMLElement | null) => void;
38
- setFloating: (node: HTMLElement | null) => void;
39
- reference: React.MutableRefObject<HTMLElement | null>;
40
- floating: React.MutableRefObject<HTMLElement | null>;
41
- };
42
- floatingStyles: React.CSSProperties;
43
- getReferenceProps: (
44
- userProps?: React.HTMLAttributes<HTMLElement>
45
- ) => Record<string, unknown>;
46
- getFloatingProps: (
47
- userProps?: React.HTMLAttributes<HTMLElement>
48
- ) => Record<string, unknown>;
49
- placement: Placement;
50
- }
51
-
52
- export function useSelect(options: UseSelectProps = {}): UseSelectReturn {
53
- const {
54
- opened,
55
- defaultOpened,
56
- onOpenedChange,
57
- positioning = {
58
- placement: "bottom-start",
59
- offset: 4
60
- },
61
- middlewares = { flip: true, shift: true },
62
- disabled = false,
63
- closeOnClickOutside = true,
64
- closeOnEscape = true
65
- } = options;
66
-
67
- const [isOpen, setIsOpen] = useUncontrolled({
68
- value: opened,
69
- defaultValue: defaultOpened,
70
- finalValue: false,
71
- onChange: onOpenedChange
72
- });
73
-
74
- const middleware = useMemo(() => {
75
- const middlewareList: Middleware[] = [];
76
-
77
- middlewareList.push(offset(positioning.offset ?? 4));
78
-
79
- if (middlewares.flip) {
80
- middlewareList.push(
81
- flip(
82
- typeof middlewares.flip === "boolean"
83
- ? undefined
84
- : middlewares.flip
85
- )
86
- );
87
- }
88
-
89
- if (middlewares.shift) {
90
- middlewareList.push(
91
- shift(
92
- typeof middlewares.shift === "boolean"
93
- ? undefined
94
- : middlewares.shift
95
- )
96
- );
97
- }
98
-
99
- if (middlewares.inline) {
100
- middlewareList.push(
101
- inline(
102
- typeof middlewares.inline === "boolean"
103
- ? undefined
104
- : middlewares.inline
105
- )
106
- );
107
- }
108
-
109
- return middlewareList;
110
- }, [positioning.offset, middlewares]);
111
-
112
- const floating = useFloating({
113
- placement: positioning.placement,
114
- open: isOpen,
115
- onOpenChange: setIsOpen,
116
- middleware,
117
- whileElementsMounted: autoUpdate,
118
- strategy: "fixed"
119
- });
120
-
121
- const click = useClick(floating.context, {
122
- enabled: !disabled
123
- });
124
-
125
- const dismiss = useDismiss(floating.context, {
126
- outsidePress: closeOnClickOutside,
127
- escapeKey: closeOnEscape
128
- });
129
-
130
- const { getReferenceProps, getFloatingProps } = useInteractions([
131
- click,
132
- dismiss
133
- ]);
134
-
135
- const open = useCallback(() => {
136
- if (!disabled) {
137
- setIsOpen(true);
138
- }
139
- }, [disabled, setIsOpen]);
140
-
141
- const close = useCallback(() => {
142
- setIsOpen(false);
143
- }, [setIsOpen]);
144
-
145
- const toggle = useCallback(() => {
146
- if (!disabled) {
147
- setIsOpen(!isOpen);
148
- }
149
- }, [disabled, isOpen, setIsOpen]);
150
-
151
- return {
152
- opened: isOpen,
153
- open,
154
- close,
155
- toggle,
156
- context: floating.context,
157
- refs: {
158
- setReference: floating.refs.setReference,
159
- setFloating: floating.refs.setFloating,
160
- reference: floating.refs
161
- .reference as React.MutableRefObject<HTMLElement | null>,
162
- floating: floating.refs
163
- .floating as React.MutableRefObject<HTMLElement | null>
164
- },
165
- floatingStyles: floating.floatingStyles,
166
- getReferenceProps,
167
- getFloatingProps,
168
- placement: floating.placement
169
- };
170
- }