@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,156 +0,0 @@
1
- import { ChevronIcon } from "../../../icons";
2
- import { useMergedRefs } from "@refraktor/utils";
3
- import { MutableRefObject, useEffect, useRef } from "react";
4
- import { useTheme } from "../../../theme";
5
- import { factory } from "../../../utils";
6
- import {
7
- getNavigableAccordionItems,
8
- useAccordionContext,
9
- useAccordionItemContext
10
- } from "../accordion.context";
11
- import { getSize, getVariant } from "../accordion.styles";
12
- import { AccordionControlFactoryPayload } from "../accordion.types";
13
-
14
- const AccordionControl = factory<AccordionControlFactoryPayload>(
15
- ({ children, chevron, className, onClick, onKeyDown, ...props }, ref) => {
16
- const { cx } = useTheme();
17
- const {
18
- size,
19
- variant,
20
- isItemOpen,
21
- toggleItem,
22
- registerItem,
23
- getItems,
24
- getControlId,
25
- getPanelId,
26
- getStyles
27
- } = useAccordionContext();
28
- const item = useAccordionItemContext();
29
-
30
- const localRef = useRef<HTMLButtonElement>(null);
31
- const mergedRef = useMergedRefs(ref, localRef);
32
-
33
- useEffect(() => {
34
- return registerItem({
35
- value: item.value,
36
- ref: localRef as MutableRefObject<HTMLElement | null>,
37
- disabled: item.disabled
38
- });
39
- }, [item.value, item.disabled, registerItem]);
40
-
41
- const isOpen = isItemOpen(item.value);
42
- const sizeStyles = getSize(size);
43
- const variantStyles = getVariant(variant);
44
-
45
- const moveFocus = (direction: -1 | 1) => {
46
- const items = getNavigableAccordionItems(getItems());
47
-
48
- if (!items.length) {
49
- return;
50
- }
51
-
52
- const currentIndex = items.findIndex((x) => x.value === item.value);
53
-
54
- if (currentIndex === -1) {
55
- return;
56
- }
57
-
58
- const nextIndex =
59
- (currentIndex + direction + items.length) % items.length;
60
-
61
- items[nextIndex].ref.current?.focus();
62
- };
63
-
64
- const focusBoundary = (type: "first" | "last") => {
65
- const items = getNavigableAccordionItems(getItems());
66
-
67
- if (!items.length) {
68
- return;
69
- }
70
-
71
- const target = type === "first" ? items[0] : items[items.length - 1];
72
-
73
- target.ref.current?.focus();
74
- };
75
-
76
- return (
77
- <button
78
- ref={mergedRef}
79
- id={getControlId(item.value)}
80
- type="button"
81
- aria-expanded={isOpen}
82
- aria-controls={getPanelId(item.value)}
83
- disabled={item.disabled}
84
- data-opened={isOpen}
85
- data-disabled={item.disabled}
86
- className={cx(
87
- "w-full inline-flex items-center justify-between gap-2 text-left select-none outline-none transition-colors cursor-pointer",
88
- "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--refraktor-primary)]",
89
- "data-[disabled=true]:opacity-50 data-[disabled=true]:pointer-events-none data-[disabled=true]:cursor-not-allowed",
90
- "text-[var(--refraktor-text)]",
91
- sizeStyles.control,
92
- variantStyles.control,
93
- getStyles("control"),
94
- className
95
- )}
96
- onClick={(event) => {
97
- onClick?.(event);
98
-
99
- if (event.defaultPrevented || item.disabled) {
100
- return;
101
- }
102
-
103
- toggleItem(item.value);
104
- }}
105
- onKeyDown={(event) => {
106
- onKeyDown?.(event);
107
-
108
- if (event.defaultPrevented || item.disabled) {
109
- return;
110
- }
111
-
112
- if (event.key === "ArrowDown") {
113
- event.preventDefault();
114
- moveFocus(1);
115
- return;
116
- }
117
-
118
- if (event.key === "ArrowUp") {
119
- event.preventDefault();
120
- moveFocus(-1);
121
- return;
122
- }
123
-
124
- if (event.key === "Home") {
125
- event.preventDefault();
126
- focusBoundary("first");
127
- return;
128
- }
129
-
130
- if (event.key === "End") {
131
- event.preventDefault();
132
- focusBoundary("last");
133
- }
134
- }}
135
- {...props}
136
- >
137
- <span>{children}</span>
138
-
139
- <span
140
- className={cx(
141
- "shrink-0 transition-transform",
142
- sizeStyles.chevron,
143
- isOpen && "rotate-180",
144
- getStyles("chevron")
145
- )}
146
- >
147
- {chevron ?? <ChevronIcon direction="down" size="100%" />}
148
- </span>
149
- </button>
150
- );
151
- }
152
- );
153
-
154
- AccordionControl.displayName = "@refraktor/core/Accordion.Control";
155
-
156
- export default AccordionControl;
@@ -1 +0,0 @@
1
- export { default as AccordionControl } from "./accordion-control";
@@ -1,40 +0,0 @@
1
- import { useTheme } from "../../../theme";
2
- import { factory } from "../../../utils";
3
- import {
4
- AccordionItemProvider,
5
- useAccordionContext
6
- } from "../accordion.context";
7
- import { getVariant } from "../accordion.styles";
8
- import { AccordionItemFactoryPayload } from "../accordion.types";
9
-
10
- const AccordionItem = factory<AccordionItemFactoryPayload>(
11
- ({ value, disabled, children, className, ...props }, ref) => {
12
- const { cx, getRadius } = useTheme();
13
- const { variant, radius, isItemOpen, getStyles } = useAccordionContext();
14
- const variantStyles = getVariant(variant);
15
-
16
- return (
17
- <AccordionItemProvider value={{ value, disabled: !!disabled }}>
18
- <div
19
- ref={ref}
20
- data-opened={isItemOpen(value)}
21
- data-disabled={disabled}
22
- className={cx(
23
- "overflow-hidden",
24
- variantStyles.item,
25
- variant === "separated" && getRadius(radius),
26
- getStyles("item"),
27
- className
28
- )}
29
- {...props}
30
- >
31
- {children}
32
- </div>
33
- </AccordionItemProvider>
34
- );
35
- }
36
- );
37
-
38
- AccordionItem.displayName = "@refraktor/core/Accordion.Item";
39
-
40
- export default AccordionItem;
@@ -1 +0,0 @@
1
- export { default as AccordionItem } from "./accordion-item";
@@ -1,58 +0,0 @@
1
- import { useTheme } from "../../../theme";
2
- import { factory } from "../../../utils";
3
- import {
4
- useAccordionContext,
5
- useAccordionItemContext
6
- } from "../accordion.context";
7
- import { getSize, getVariant } from "../accordion.styles";
8
- import { AccordionPanelFactoryPayload } from "../accordion.types";
9
-
10
- const AccordionPanel = factory<AccordionPanelFactoryPayload>(
11
- ({ children, className, ...props }, ref) => {
12
- const { cx } = useTheme();
13
- const {
14
- keepMounted,
15
- size,
16
- variant,
17
- isItemOpen,
18
- getControlId,
19
- getPanelId,
20
- getStyles
21
- } = useAccordionContext();
22
- const item = useAccordionItemContext();
23
-
24
- const isOpen = isItemOpen(item.value);
25
-
26
- if (!keepMounted && !isOpen) {
27
- return null;
28
- }
29
-
30
- const sizeStyles = getSize(size);
31
- const variantStyles = getVariant(variant);
32
-
33
- return (
34
- <div
35
- ref={ref}
36
- id={getPanelId(item.value)}
37
- role="region"
38
- aria-labelledby={getControlId(item.value)}
39
- data-opened={isOpen}
40
- hidden={!isOpen}
41
- className={cx(
42
- "outline-none",
43
- sizeStyles.panel,
44
- variantStyles.panel,
45
- getStyles("panel"),
46
- className
47
- )}
48
- {...props}
49
- >
50
- {children}
51
- </div>
52
- );
53
- }
54
- );
55
-
56
- AccordionPanel.displayName = "@refraktor/core/Accordion.Panel";
57
-
58
- export default AccordionPanel;
@@ -1 +0,0 @@
1
- export { default as AccordionPanel } from "./accordion-panel";
@@ -1,93 +0,0 @@
1
- import { createSafeContext } from "@refraktor/utils";
2
- import { MutableRefObject, useCallback, useRef } from "react";
3
- import { RefraktorRadius, RefraktorSize } from "../../theme";
4
- import { AccordionClassNames, AccordionVariant } from "./accordion.types";
5
-
6
- export interface AccordionItemRegistration {
7
- value: string;
8
- ref: MutableRefObject<HTMLElement | null>;
9
- disabled: boolean;
10
- }
11
-
12
- export interface AccordionContextValue {
13
- openValues: string[];
14
- multiple: boolean;
15
- collapsible: boolean;
16
- keepMounted: boolean;
17
- size: RefraktorSize;
18
- radius: RefraktorRadius;
19
- variant: AccordionVariant;
20
- toggleItem: (value: string) => void;
21
- isItemOpen: (value: string) => boolean;
22
- registerItem: (item: AccordionItemRegistration) => () => void;
23
- getItems: () => AccordionItemRegistration[];
24
- getControlId: (value: string) => string;
25
- getPanelId: (value: string) => string;
26
- getStyles: (part: keyof AccordionClassNames) => string | undefined;
27
- }
28
-
29
- export interface AccordionItemContextValue {
30
- value: string;
31
- disabled: boolean;
32
- }
33
-
34
- export const [AccordionProvider, useAccordionContext] =
35
- createSafeContext<AccordionContextValue>(
36
- "Accordion component was not found in tree. Make sure Accordion.Item, Accordion.Control and Accordion.Panel are wrapped with Accordion."
37
- );
38
-
39
- export const [AccordionItemProvider, useAccordionItemContext] =
40
- createSafeContext<AccordionItemContextValue>(
41
- "Accordion.Item component was not found in tree. Make sure Accordion.Control and Accordion.Panel are wrapped with Accordion.Item."
42
- );
43
-
44
- export function useAccordionItemsRegistry() {
45
- const itemsRef = useRef<AccordionItemRegistration[]>([]);
46
-
47
- const registerItem = useCallback((item: AccordionItemRegistration) => {
48
- itemsRef.current = [
49
- ...itemsRef.current.filter((x) => x.value !== item.value),
50
- item
51
- ];
52
-
53
- return () => {
54
- itemsRef.current = itemsRef.current.filter(
55
- (x) => x.value !== item.value
56
- );
57
- };
58
- }, []);
59
-
60
- const getItems = useCallback(() => sortAccordionItems(itemsRef.current), []);
61
-
62
- return {
63
- registerItem,
64
- getItems
65
- };
66
- }
67
-
68
- export function sortAccordionItems(items: AccordionItemRegistration[]) {
69
- return [...items].sort((a, b) => {
70
- const aNode = a.ref.current;
71
- const bNode = b.ref.current;
72
-
73
- if (!aNode || !bNode || aNode === bNode) {
74
- return 0;
75
- }
76
-
77
- const position = aNode.compareDocumentPosition(bNode);
78
-
79
- if (position & Node.DOCUMENT_POSITION_FOLLOWING) {
80
- return -1;
81
- }
82
-
83
- if (position & Node.DOCUMENT_POSITION_PRECEDING) {
84
- return 1;
85
- }
86
-
87
- return 0;
88
- });
89
- }
90
-
91
- export function getNavigableAccordionItems(items: AccordionItemRegistration[]) {
92
- return items.filter((item) => !item.disabled);
93
- }
@@ -1,60 +0,0 @@
1
- import { RefraktorSize } from "../../theme";
2
- import { AccordionVariant } from "./accordion.types";
3
-
4
- type AccordionSizeStyles = {
5
- control: string;
6
- panel: string;
7
- chevron: string;
8
- };
9
-
10
- type AccordionVariantStyles = {
11
- item: string;
12
- control: string;
13
- panel: string;
14
- };
15
-
16
- const sizes: Record<RefraktorSize, AccordionSizeStyles> = {
17
- xs: {
18
- control: "min-h-7 px-2 py-1 text-xs",
19
- panel: "px-2 pb-2 text-xs",
20
- chevron: "size-3"
21
- },
22
- sm: {
23
- control: "min-h-8 px-2.5 py-1.5 text-sm",
24
- panel: "px-2.5 pb-2.5 text-sm",
25
- chevron: "size-3.5"
26
- },
27
- md: {
28
- control: "min-h-9 px-3 py-2 text-sm",
29
- panel: "px-3 pb-3 text-sm",
30
- chevron: "size-4"
31
- },
32
- lg: {
33
- control: "min-h-10 px-3.5 py-2.5 text-base",
34
- panel: "px-3.5 pb-3.5 text-base",
35
- chevron: "size-4.5"
36
- },
37
- xl: {
38
- control: "min-h-11 px-4 py-3 text-lg",
39
- panel: "px-4 pb-4 text-lg",
40
- chevron: "size-5"
41
- }
42
- };
43
-
44
- const variants: Record<AccordionVariant, AccordionVariantStyles> = {
45
- default: {
46
- item: "border-b border-[var(--refraktor-border)] last:border-b-0",
47
- control: "bg-transparent hover:bg-[var(--refraktor-bg-hover)]",
48
- panel: "text-[var(--refraktor-text-secondary)]"
49
- },
50
- separated: {
51
- item: "border border-[var(--refraktor-border)] bg-[var(--refraktor-bg-subtle)]",
52
- control: "bg-transparent hover:bg-[var(--refraktor-bg-hover)]",
53
- panel: "border-t border-[var(--refraktor-border)] text-[var(--refraktor-text-secondary)]"
54
- }
55
- };
56
-
57
- export const getSize = (size: RefraktorSize = "md") => sizes[size];
58
-
59
- export const getVariant = (variant: AccordionVariant = "default") =>
60
- variants[variant];
@@ -1,174 +0,0 @@
1
- import { useState } from "react";
2
- import { describe, expect, it, vi } from "vitest";
3
- import { render, screen, userEvent } from "../../vitest";
4
- import Accordion from "./accordion";
5
-
6
- describe("@refraktor/core/Accordion", () => {
7
- it("renders default opened item", async () => {
8
- await render(
9
- <Accordion defaultValue="account">
10
- <Accordion.Item value="account">
11
- <Accordion.Control>Account</Accordion.Control>
12
- <Accordion.Panel>Account panel</Accordion.Panel>
13
- </Accordion.Item>
14
-
15
- <Accordion.Item value="security">
16
- <Accordion.Control>Security</Accordion.Control>
17
- <Accordion.Panel>Security panel</Accordion.Panel>
18
- </Accordion.Item>
19
- </Accordion>
20
- );
21
-
22
- expect(
23
- screen.getByRole("button", { name: "Account" })
24
- ).toHaveAttribute("aria-expanded", "true");
25
- expect(screen.getByText("Account panel")).toBeInTheDocument();
26
- expect(screen.queryByText("Security panel")).not.toBeInTheDocument();
27
- });
28
-
29
- it("toggles items in single mode", async () => {
30
- const user = userEvent.setup();
31
-
32
- await render(
33
- <Accordion defaultValue="account">
34
- <Accordion.Item value="account">
35
- <Accordion.Control>Account</Accordion.Control>
36
- <Accordion.Panel>Account panel</Accordion.Panel>
37
- </Accordion.Item>
38
-
39
- <Accordion.Item value="security">
40
- <Accordion.Control>Security</Accordion.Control>
41
- <Accordion.Panel>Security panel</Accordion.Panel>
42
- </Accordion.Item>
43
- </Accordion>
44
- );
45
-
46
- await user.click(screen.getByRole("button", { name: "Security" }));
47
-
48
- expect(screen.getByText("Security panel")).toBeInTheDocument();
49
- expect(screen.queryByText("Account panel")).not.toBeInTheDocument();
50
-
51
- await user.click(screen.getByRole("button", { name: "Security" }));
52
-
53
- expect(screen.queryByText("Security panel")).not.toBeInTheDocument();
54
- });
55
-
56
- it("supports multiple mode", async () => {
57
- const user = userEvent.setup();
58
-
59
- await render(
60
- <Accordion multiple defaultValue={["account"]}>
61
- <Accordion.Item value="account">
62
- <Accordion.Control>Account</Accordion.Control>
63
- <Accordion.Panel>Account panel</Accordion.Panel>
64
- </Accordion.Item>
65
-
66
- <Accordion.Item value="security">
67
- <Accordion.Control>Security</Accordion.Control>
68
- <Accordion.Panel>Security panel</Accordion.Panel>
69
- </Accordion.Item>
70
- </Accordion>
71
- );
72
-
73
- await user.click(screen.getByRole("button", { name: "Security" }));
74
-
75
- expect(screen.getByText("Account panel")).toBeInTheDocument();
76
- expect(screen.getByText("Security panel")).toBeInTheDocument();
77
- });
78
-
79
- it("supports controlled mode", async () => {
80
- const user = userEvent.setup();
81
- const onChange = vi.fn();
82
-
83
- function Demo() {
84
- const [value, setValue] = useState<string | null>("account");
85
-
86
- return (
87
- <Accordion
88
- value={value}
89
- onChange={(nextValue) => {
90
- onChange(nextValue);
91
-
92
- if (typeof nextValue === "string" || nextValue === null) {
93
- setValue(nextValue);
94
- }
95
- }}
96
- >
97
- <Accordion.Item value="account">
98
- <Accordion.Control>Account</Accordion.Control>
99
- <Accordion.Panel>Account panel</Accordion.Panel>
100
- </Accordion.Item>
101
-
102
- <Accordion.Item value="security">
103
- <Accordion.Control>Security</Accordion.Control>
104
- <Accordion.Panel>Security panel</Accordion.Panel>
105
- </Accordion.Item>
106
- </Accordion>
107
- );
108
- }
109
-
110
- await render(<Demo />);
111
-
112
- await user.click(screen.getByRole("button", { name: "Security" }));
113
-
114
- expect(onChange).toHaveBeenCalledWith("security");
115
- expect(screen.getByText("Security panel")).toBeInTheDocument();
116
- });
117
-
118
- it("supports keyboard navigation and skips disabled items", async () => {
119
- const user = userEvent.setup();
120
-
121
- await render(
122
- <Accordion defaultValue="account">
123
- <Accordion.Item value="account">
124
- <Accordion.Control>Account</Accordion.Control>
125
- <Accordion.Panel>Account panel</Accordion.Panel>
126
- </Accordion.Item>
127
-
128
- <Accordion.Item value="security" disabled>
129
- <Accordion.Control>Security</Accordion.Control>
130
- <Accordion.Panel>Security panel</Accordion.Panel>
131
- </Accordion.Item>
132
-
133
- <Accordion.Item value="billing">
134
- <Accordion.Control>Billing</Accordion.Control>
135
- <Accordion.Panel>Billing panel</Accordion.Panel>
136
- </Accordion.Item>
137
- </Accordion>
138
- );
139
-
140
- const account = screen.getByRole("button", { name: "Account" });
141
-
142
- account.focus();
143
- await user.keyboard("{ArrowDown}");
144
-
145
- expect(screen.getByRole("button", { name: "Billing" })).toHaveFocus();
146
-
147
- await user.keyboard("{Home}");
148
- expect(account).toHaveFocus();
149
-
150
- await user.keyboard("{End}");
151
- expect(screen.getByRole("button", { name: "Billing" })).toHaveFocus();
152
- });
153
-
154
- it("keeps closed panels mounted when keepMounted is true", async () => {
155
- await render(
156
- <Accordion defaultValue="account" keepMounted>
157
- <Accordion.Item value="account">
158
- <Accordion.Control>Account</Accordion.Control>
159
- <Accordion.Panel>Account panel</Accordion.Panel>
160
- </Accordion.Item>
161
-
162
- <Accordion.Item value="security">
163
- <Accordion.Control>Security</Accordion.Control>
164
- <Accordion.Panel>Security panel</Accordion.Panel>
165
- </Accordion.Item>
166
- </Accordion>
167
- );
168
-
169
- const hiddenPanel = screen.getByText("Security panel");
170
-
171
- expect(hiddenPanel).toBeInTheDocument();
172
- expect(hiddenPanel).toHaveAttribute("hidden");
173
- });
174
- });