@refraktor/core 0.0.2 → 0.0.4

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 (447) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build/components/breadcrumbs/breadcrumbs.d.ts +4 -0
  3. package/build/components/breadcrumbs/breadcrumbs.d.ts.map +1 -0
  4. package/build/components/breadcrumbs/breadcrumbs.js +64 -0
  5. package/build/components/breadcrumbs/breadcrumbs.styles.d.ts +12 -0
  6. package/build/components/breadcrumbs/breadcrumbs.styles.d.ts.map +1 -0
  7. package/build/components/breadcrumbs/breadcrumbs.styles.js +43 -0
  8. package/build/components/breadcrumbs/breadcrumbs.test.d.ts +2 -0
  9. package/build/components/breadcrumbs/breadcrumbs.test.d.ts.map +1 -0
  10. package/build/components/breadcrumbs/breadcrumbs.test.js +72 -0
  11. package/build/components/breadcrumbs/breadcrumbs.types.d.ts +56 -0
  12. package/build/components/breadcrumbs/breadcrumbs.types.d.ts.map +1 -0
  13. package/build/components/breadcrumbs/breadcrumbs.types.js +1 -0
  14. package/build/components/breadcrumbs/breadcrumbs.utils.d.ts +10 -0
  15. package/build/components/breadcrumbs/breadcrumbs.utils.d.ts.map +1 -0
  16. package/build/components/breadcrumbs/breadcrumbs.utils.js +36 -0
  17. package/build/components/breadcrumbs/index.d.ts +3 -0
  18. package/build/components/breadcrumbs/index.d.ts.map +1 -0
  19. package/build/components/breadcrumbs/index.js +1 -0
  20. package/build/components/button/button.styles.js +5 -5
  21. package/build/components/chip/chip-group/chip-group.d.ts +4 -0
  22. package/build/components/chip/chip-group/chip-group.d.ts.map +1 -0
  23. package/build/components/chip/chip-group/chip-group.js +43 -0
  24. package/build/components/chip/chip-group/index.d.ts +2 -0
  25. package/build/components/chip/chip-group/index.d.ts.map +1 -0
  26. package/build/components/chip/chip-group/index.js +1 -0
  27. package/build/components/chip/chip.context.d.ts +15 -0
  28. package/build/components/chip/chip.context.d.ts.map +1 -0
  29. package/build/components/chip/chip.context.js +2 -0
  30. package/build/components/chip/chip.d.ts +4 -0
  31. package/build/components/chip/chip.d.ts.map +1 -0
  32. package/build/components/chip/chip.js +85 -0
  33. package/build/components/chip/chip.styles.d.ts +5 -0
  34. package/build/components/chip/chip.styles.d.ts.map +1 -0
  35. package/build/components/chip/chip.styles.js +19 -0
  36. package/build/components/chip/chip.test.d.ts +2 -0
  37. package/build/components/chip/chip.test.d.ts.map +1 -0
  38. package/build/components/chip/chip.test.js +107 -0
  39. package/build/components/chip/chip.types.d.ts +95 -0
  40. package/build/components/chip/chip.types.d.ts.map +1 -0
  41. package/build/components/chip/chip.types.js +1 -0
  42. package/build/components/chip/index.d.ts +4 -0
  43. package/build/components/chip/index.d.ts.map +1 -0
  44. package/build/components/chip/index.js +2 -0
  45. package/build/components/combobox/combobox-dropdown/combobox-dropdown.d.ts +4 -0
  46. package/build/components/combobox/combobox-dropdown/combobox-dropdown.d.ts.map +1 -0
  47. package/build/components/combobox/combobox-dropdown/combobox-dropdown.js +21 -0
  48. package/build/components/combobox/combobox-dropdown/index.d.ts +2 -0
  49. package/build/components/combobox/combobox-dropdown/index.d.ts.map +1 -0
  50. package/build/components/combobox/combobox-dropdown/index.js +1 -0
  51. package/build/components/combobox/combobox-group/combobox-group.d.ts +4 -0
  52. package/build/components/combobox/combobox-group/combobox-group.d.ts.map +1 -0
  53. package/build/components/combobox/combobox-group/combobox-group.js +15 -0
  54. package/build/components/combobox/combobox-group/index.d.ts +2 -0
  55. package/build/components/combobox/combobox-group/index.d.ts.map +1 -0
  56. package/build/components/combobox/combobox-group/index.js +1 -0
  57. package/build/components/combobox/combobox-input/combobox-input.d.ts +4 -0
  58. package/build/components/combobox/combobox-input/combobox-input.d.ts.map +1 -0
  59. package/build/components/combobox/combobox-input/combobox-input.js +101 -0
  60. package/build/components/combobox/combobox-input/index.d.ts +2 -0
  61. package/build/components/combobox/combobox-input/index.d.ts.map +1 -0
  62. package/build/components/combobox/combobox-input/index.js +1 -0
  63. package/build/components/combobox/combobox-option/combobox-option.d.ts +4 -0
  64. package/build/components/combobox/combobox-option/combobox-option.d.ts.map +1 -0
  65. package/build/components/combobox/combobox-option/combobox-option.js +86 -0
  66. package/build/components/combobox/combobox-option/index.d.ts +2 -0
  67. package/build/components/combobox/combobox-option/index.d.ts.map +1 -0
  68. package/build/components/combobox/combobox-option/index.js +1 -0
  69. package/build/components/combobox/combobox-root/combobox-root.d.ts +4 -0
  70. package/build/components/combobox/combobox-root/combobox-root.d.ts.map +1 -0
  71. package/build/components/combobox/combobox-root/combobox-root.js +282 -0
  72. package/build/components/combobox/combobox-root/index.d.ts +2 -0
  73. package/build/components/combobox/combobox-root/index.d.ts.map +1 -0
  74. package/build/components/combobox/combobox-root/index.js +1 -0
  75. package/build/components/combobox/combobox.context.d.ts +73 -0
  76. package/build/components/combobox/combobox.context.d.ts.map +1 -0
  77. package/build/components/combobox/combobox.context.js +50 -0
  78. package/build/components/combobox/combobox.d.ts +4 -0
  79. package/build/components/combobox/combobox.d.ts.map +1 -0
  80. package/build/components/combobox/combobox.js +31 -0
  81. package/build/components/combobox/combobox.test.d.ts +2 -0
  82. package/build/components/combobox/combobox.test.d.ts.map +1 -0
  83. package/build/components/combobox/combobox.test.js +104 -0
  84. package/build/components/combobox/combobox.types.d.ts +205 -0
  85. package/build/components/combobox/combobox.types.d.ts.map +1 -0
  86. package/build/components/combobox/combobox.types.js +1 -0
  87. package/build/components/combobox/index.d.ts +8 -0
  88. package/build/components/combobox/index.d.ts.map +1 -0
  89. package/build/components/combobox/index.js +6 -0
  90. package/build/components/combobox/use-combobox.d.ts +32 -0
  91. package/build/components/combobox/use-combobox.d.ts.map +1 -0
  92. package/build/components/combobox/use-combobox.js +80 -0
  93. package/build/components/drawer/drawer-body/drawer-body.d.ts +4 -0
  94. package/build/components/drawer/drawer-body/drawer-body.d.ts.map +1 -0
  95. package/build/components/drawer/drawer-body/drawer-body.js +11 -0
  96. package/build/components/drawer/drawer-body/index.d.ts +2 -0
  97. package/build/components/drawer/drawer-body/index.d.ts.map +1 -0
  98. package/build/components/drawer/drawer-body/index.js +1 -0
  99. package/build/components/drawer/drawer-close/drawer-close.d.ts +4 -0
  100. package/build/components/drawer/drawer-close/drawer-close.d.ts.map +1 -0
  101. package/build/components/drawer/drawer-close/drawer-close.js +19 -0
  102. package/build/components/drawer/drawer-close/index.d.ts +2 -0
  103. package/build/components/drawer/drawer-close/index.d.ts.map +1 -0
  104. package/build/components/drawer/drawer-close/index.js +1 -0
  105. package/build/components/drawer/drawer-content/drawer-content.d.ts +4 -0
  106. package/build/components/drawer/drawer-content/drawer-content.d.ts.map +1 -0
  107. package/build/components/drawer/drawer-content/drawer-content.js +44 -0
  108. package/build/components/drawer/drawer-content/index.d.ts +2 -0
  109. package/build/components/drawer/drawer-content/index.d.ts.map +1 -0
  110. package/build/components/drawer/drawer-content/index.js +1 -0
  111. package/build/components/drawer/drawer-header/drawer-header.d.ts +4 -0
  112. package/build/components/drawer/drawer-header/drawer-header.d.ts.map +1 -0
  113. package/build/components/drawer/drawer-header/drawer-header.js +13 -0
  114. package/build/components/drawer/drawer-header/index.d.ts +2 -0
  115. package/build/components/drawer/drawer-header/index.d.ts.map +1 -0
  116. package/build/components/drawer/drawer-header/index.js +1 -0
  117. package/build/components/drawer/drawer-overlay/drawer-overlay.d.ts +4 -0
  118. package/build/components/drawer/drawer-overlay/drawer-overlay.d.ts.map +1 -0
  119. package/build/components/drawer/drawer-overlay/drawer-overlay.js +31 -0
  120. package/build/components/drawer/drawer-overlay/index.d.ts +2 -0
  121. package/build/components/drawer/drawer-overlay/index.d.ts.map +1 -0
  122. package/build/components/drawer/drawer-overlay/index.js +1 -0
  123. package/build/components/drawer/drawer-root/drawer-root.d.ts +4 -0
  124. package/build/components/drawer/drawer-root/drawer-root.d.ts.map +1 -0
  125. package/build/components/drawer/drawer-root/drawer-root.js +49 -0
  126. package/build/components/drawer/drawer-root/index.d.ts +2 -0
  127. package/build/components/drawer/drawer-root/index.d.ts.map +1 -0
  128. package/build/components/drawer/drawer-root/index.js +1 -0
  129. package/build/components/drawer/drawer.context.d.ts +24 -0
  130. package/build/components/drawer/drawer.context.d.ts.map +1 -0
  131. package/build/components/drawer/drawer.context.js +2 -0
  132. package/build/components/drawer/drawer.d.ts +4 -0
  133. package/build/components/drawer/drawer.d.ts.map +1 -0
  134. package/build/components/drawer/drawer.js +21 -0
  135. package/build/components/drawer/drawer.styles.d.ts +6 -0
  136. package/build/components/drawer/drawer.styles.d.ts.map +1 -0
  137. package/build/components/drawer/drawer.styles.js +21 -0
  138. package/build/components/drawer/drawer.test.d.ts +2 -0
  139. package/build/components/drawer/drawer.test.d.ts.map +1 -0
  140. package/build/components/drawer/drawer.test.js +109 -0
  141. package/build/components/drawer/drawer.types.d.ts +142 -0
  142. package/build/components/drawer/drawer.types.d.ts.map +1 -0
  143. package/build/components/drawer/drawer.types.js +1 -0
  144. package/build/components/drawer/index.d.ts +9 -0
  145. package/build/components/drawer/index.d.ts.map +1 -0
  146. package/build/components/drawer/index.js +7 -0
  147. package/build/components/drawer/use-drawer.d.ts +24 -0
  148. package/build/components/drawer/use-drawer.d.ts.map +1 -0
  149. package/build/components/drawer/use-drawer.js +48 -0
  150. package/build/components/file-input/file-input.d.ts +4 -0
  151. package/build/components/file-input/file-input.d.ts.map +1 -0
  152. package/build/components/file-input/file-input.js +88 -0
  153. package/build/components/file-input/file-input.test.d.ts +2 -0
  154. package/build/components/file-input/file-input.test.d.ts.map +1 -0
  155. package/build/components/file-input/file-input.test.js +74 -0
  156. package/build/components/file-input/file-input.types.d.ts +46 -0
  157. package/build/components/file-input/file-input.types.d.ts.map +1 -0
  158. package/build/components/file-input/file-input.types.js +1 -0
  159. package/build/components/file-input/file-input.utils.d.ts +11 -0
  160. package/build/components/file-input/file-input.utils.d.ts.map +1 -0
  161. package/build/components/file-input/file-input.utils.js +67 -0
  162. package/build/components/file-input/file-input.utils.test.d.ts +2 -0
  163. package/build/components/file-input/file-input.utils.test.d.ts.map +1 -0
  164. package/build/components/file-input/file-input.utils.test.js +27 -0
  165. package/build/components/file-input/index.d.ts +3 -0
  166. package/build/components/file-input/index.d.ts.map +1 -0
  167. package/build/components/file-input/index.js +2 -0
  168. package/build/components/for/for.d.ts +8 -0
  169. package/build/components/for/for.d.ts.map +1 -0
  170. package/build/components/for/for.js +32 -0
  171. package/build/components/for/for.test.d.ts +2 -0
  172. package/build/components/for/for.test.d.ts.map +1 -0
  173. package/build/components/for/for.test.js +31 -0
  174. package/build/components/for/for.types.d.ts +33 -0
  175. package/build/components/for/for.types.d.ts.map +1 -0
  176. package/build/components/for/for.types.js +1 -0
  177. package/build/components/for/index.d.ts +3 -0
  178. package/build/components/for/index.d.ts.map +1 -0
  179. package/build/components/for/index.js +1 -0
  180. package/build/components/index.d.ts +10 -0
  181. package/build/components/index.d.ts.map +1 -1
  182. package/build/components/index.js +10 -0
  183. package/build/components/modal/index.d.ts +2 -1
  184. package/build/components/modal/index.d.ts.map +1 -1
  185. package/build/components/modal/index.js +1 -0
  186. package/build/components/modal/modal-body/index.d.ts +2 -0
  187. package/build/components/modal/modal-body/index.d.ts.map +1 -0
  188. package/build/components/modal/modal-body/index.js +1 -0
  189. package/build/components/modal/modal-body/modal-body.d.ts +4 -0
  190. package/build/components/modal/modal-body/modal-body.d.ts.map +1 -0
  191. package/build/components/modal/modal-body/modal-body.js +11 -0
  192. package/build/components/modal/modal-content/modal-content.d.ts.map +1 -1
  193. package/build/components/modal/modal-content/modal-content.js +13 -5
  194. package/build/components/modal/modal-header/modal-header.js +2 -2
  195. package/build/components/modal/modal-overlay/modal-overlay.d.ts.map +1 -1
  196. package/build/components/modal/modal-overlay/modal-overlay.js +13 -5
  197. package/build/components/modal/modal-root/modal-root.d.ts.map +1 -1
  198. package/build/components/modal/modal-root/modal-root.js +12 -9
  199. package/build/components/modal/modal.context.d.ts +5 -2
  200. package/build/components/modal/modal.context.d.ts.map +1 -1
  201. package/build/components/modal/modal.d.ts.map +1 -1
  202. package/build/components/modal/modal.js +5 -3
  203. package/build/components/modal/modal.test.js +92 -11
  204. package/build/components/modal/modal.types.d.ts +38 -5
  205. package/build/components/modal/modal.types.d.ts.map +1 -1
  206. package/build/components/modal/use-modal.d.ts +8 -1
  207. package/build/components/modal/use-modal.d.ts.map +1 -1
  208. package/build/components/modal/use-modal.js +25 -38
  209. package/build/components/password-input/index.d.ts +3 -0
  210. package/build/components/password-input/index.d.ts.map +1 -0
  211. package/build/components/password-input/index.js +2 -0
  212. package/build/components/password-input/password-input.d.ts +4 -0
  213. package/build/components/password-input/password-input.d.ts.map +1 -0
  214. package/build/components/password-input/password-input.js +32 -0
  215. package/build/components/password-input/password-input.test.d.ts +2 -0
  216. package/build/components/password-input/password-input.test.d.ts.map +1 -0
  217. package/build/components/password-input/password-input.test.js +47 -0
  218. package/build/components/password-input/password-input.types.d.ts +24 -0
  219. package/build/components/password-input/password-input.types.d.ts.map +1 -0
  220. package/build/components/password-input/password-input.types.js +1 -0
  221. package/build/components/pin-input/index.d.ts +3 -0
  222. package/build/components/pin-input/index.d.ts.map +1 -0
  223. package/build/components/pin-input/index.js +2 -0
  224. package/build/components/pin-input/pin-input.d.ts +4 -0
  225. package/build/components/pin-input/pin-input.d.ts.map +1 -0
  226. package/build/components/pin-input/pin-input.js +245 -0
  227. package/build/components/pin-input/pin-input.test.d.ts +2 -0
  228. package/build/components/pin-input/pin-input.test.d.ts.map +1 -0
  229. package/build/components/pin-input/pin-input.test.js +87 -0
  230. package/build/components/pin-input/pin-input.types.d.ts +44 -0
  231. package/build/components/pin-input/pin-input.types.d.ts.map +1 -0
  232. package/build/components/pin-input/pin-input.types.js +1 -0
  233. package/build/components/scroll-area/index.d.ts +3 -0
  234. package/build/components/scroll-area/index.d.ts.map +1 -0
  235. package/build/components/scroll-area/index.js +1 -0
  236. package/build/components/scroll-area/scroll-area.d.ts +4 -0
  237. package/build/components/scroll-area/scroll-area.d.ts.map +1 -0
  238. package/build/components/scroll-area/scroll-area.js +30 -0
  239. package/build/components/scroll-area/scroll-area.test.d.ts +2 -0
  240. package/build/components/scroll-area/scroll-area.test.d.ts.map +1 -0
  241. package/build/components/scroll-area/scroll-area.test.js +39 -0
  242. package/build/components/scroll-area/scroll-area.types.d.ts +25 -0
  243. package/build/components/scroll-area/scroll-area.types.d.ts.map +1 -0
  244. package/build/components/scroll-area/scroll-area.types.js +1 -0
  245. package/build/components/segmented-control/index.d.ts +3 -0
  246. package/build/components/segmented-control/index.d.ts.map +1 -0
  247. package/build/components/segmented-control/index.js +1 -0
  248. package/build/components/segmented-control/segmented-control.d.ts +4 -0
  249. package/build/components/segmented-control/segmented-control.d.ts.map +1 -0
  250. package/build/components/segmented-control/segmented-control.js +113 -0
  251. package/build/components/segmented-control/segmented-control.styles.d.ts +9 -0
  252. package/build/components/segmented-control/segmented-control.styles.d.ts.map +1 -0
  253. package/build/components/segmented-control/segmented-control.styles.js +28 -0
  254. package/build/components/segmented-control/segmented-control.test.d.ts +2 -0
  255. package/build/components/segmented-control/segmented-control.test.d.ts.map +1 -0
  256. package/build/components/segmented-control/segmented-control.test.js +92 -0
  257. package/build/components/segmented-control/segmented-control.types.d.ts +51 -0
  258. package/build/components/segmented-control/segmented-control.types.d.ts.map +1 -0
  259. package/build/components/segmented-control/segmented-control.types.js +1 -0
  260. package/build/components/select/select-item/select-item.js +1 -1
  261. package/build/components/split-pane/index.d.ts +3 -0
  262. package/build/components/split-pane/index.d.ts.map +1 -0
  263. package/build/components/split-pane/index.js +1 -0
  264. package/build/components/split-pane/split-pane.d.ts +4 -0
  265. package/build/components/split-pane/split-pane.d.ts.map +1 -0
  266. package/build/components/split-pane/split-pane.js +201 -0
  267. package/build/components/split-pane/split-pane.styles.d.ts +3 -0
  268. package/build/components/split-pane/split-pane.styles.d.ts.map +1 -0
  269. package/build/components/split-pane/split-pane.styles.js +8 -0
  270. package/build/components/split-pane/split-pane.test.d.ts +2 -0
  271. package/build/components/split-pane/split-pane.test.d.ts.map +1 -0
  272. package/build/components/split-pane/split-pane.test.js +105 -0
  273. package/build/components/split-pane/split-pane.types.d.ts +51 -0
  274. package/build/components/split-pane/split-pane.types.d.ts.map +1 -0
  275. package/build/components/split-pane/split-pane.types.js +1 -0
  276. package/build/components/table/index.d.ts +9 -0
  277. package/build/components/table/index.d.ts.map +1 -0
  278. package/build/components/table/index.js +7 -0
  279. package/build/components/table/table-body/index.d.ts +2 -0
  280. package/build/components/table/table-body/index.d.ts.map +1 -0
  281. package/build/components/table/table-body/index.js +1 -0
  282. package/build/components/table/table-body/table-body.d.ts +4 -0
  283. package/build/components/table/table-body/table-body.d.ts.map +1 -0
  284. package/build/components/table/table-body/table-body.js +17 -0
  285. package/build/components/table/table-caption/index.d.ts +2 -0
  286. package/build/components/table/table-caption/index.d.ts.map +1 -0
  287. package/build/components/table/table-caption/index.js +1 -0
  288. package/build/components/table/table-caption/table-caption.d.ts +4 -0
  289. package/build/components/table/table-caption/table-caption.d.ts.map +1 -0
  290. package/build/components/table/table-caption/table-caption.js +13 -0
  291. package/build/components/table/table-cell/index.d.ts +2 -0
  292. package/build/components/table/table-cell/index.d.ts.map +1 -0
  293. package/build/components/table/table-cell/index.js +1 -0
  294. package/build/components/table/table-cell/table-cell.d.ts +4 -0
  295. package/build/components/table/table-cell/table-cell.d.ts.map +1 -0
  296. package/build/components/table/table-cell/table-cell.js +13 -0
  297. package/build/components/table/table-head/index.d.ts +2 -0
  298. package/build/components/table/table-head/index.d.ts.map +1 -0
  299. package/build/components/table/table-head/index.js +1 -0
  300. package/build/components/table/table-head/table-head.d.ts +4 -0
  301. package/build/components/table/table-head/table-head.d.ts.map +1 -0
  302. package/build/components/table/table-head/table-head.js +11 -0
  303. package/build/components/table/table-header-cell/index.d.ts +2 -0
  304. package/build/components/table/table-header-cell/index.d.ts.map +1 -0
  305. package/build/components/table/table-header-cell/index.js +1 -0
  306. package/build/components/table/table-header-cell/table-header-cell.d.ts +4 -0
  307. package/build/components/table/table-header-cell/table-header-cell.d.ts.map +1 -0
  308. package/build/components/table/table-header-cell/table-header-cell.js +13 -0
  309. package/build/components/table/table-row/index.d.ts +2 -0
  310. package/build/components/table/table-row/index.d.ts.map +1 -0
  311. package/build/components/table/table-row/index.js +1 -0
  312. package/build/components/table/table-row/table-row.d.ts +4 -0
  313. package/build/components/table/table-row/table-row.d.ts.map +1 -0
  314. package/build/components/table/table-row/table-row.js +11 -0
  315. package/build/components/table/table.context.d.ts +16 -0
  316. package/build/components/table/table.context.d.ts.map +1 -0
  317. package/build/components/table/table.context.js +2 -0
  318. package/build/components/table/table.d.ts +4 -0
  319. package/build/components/table/table.d.ts.map +1 -0
  320. package/build/components/table/table.js +46 -0
  321. package/build/components/table/table.styles.d.ts +16 -0
  322. package/build/components/table/table.styles.d.ts.map +1 -0
  323. package/build/components/table/table.styles.js +39 -0
  324. package/build/components/table/table.test.d.ts +2 -0
  325. package/build/components/table/table.test.d.ts.map +1 -0
  326. package/build/components/table/table.test.js +59 -0
  327. package/build/components/table/table.types.d.ts +113 -0
  328. package/build/components/table/table.types.d.ts.map +1 -0
  329. package/build/components/table/table.types.js +1 -0
  330. package/build/icons/eye-off.d.ts +4 -0
  331. package/build/icons/eye-off.d.ts.map +1 -0
  332. package/build/icons/eye-off.js +5 -0
  333. package/build/icons/eye.d.ts +4 -0
  334. package/build/icons/eye.d.ts.map +1 -0
  335. package/build/icons/eye.js +5 -0
  336. package/build/icons/index.d.ts +2 -0
  337. package/build/icons/index.d.ts.map +1 -1
  338. package/build/icons/index.js +2 -0
  339. package/build/style.css +1 -1
  340. package/package.json +2 -2
  341. package/src/components/breadcrumbs/breadcrumbs.styles.ts +55 -0
  342. package/src/components/breadcrumbs/breadcrumbs.test.tsx +136 -0
  343. package/src/components/breadcrumbs/breadcrumbs.tsx +199 -0
  344. package/src/components/breadcrumbs/breadcrumbs.types.ts +78 -0
  345. package/src/components/breadcrumbs/breadcrumbs.utils.ts +70 -0
  346. package/src/components/breadcrumbs/index.ts +6 -0
  347. package/src/components/button/button.styles.ts +5 -5
  348. package/src/components/chip/chip-group/chip-group.tsx +107 -0
  349. package/src/components/chip/chip-group/index.ts +1 -0
  350. package/src/components/chip/chip.context.ts +15 -0
  351. package/src/components/chip/chip.styles.ts +36 -0
  352. package/src/components/chip/chip.test.tsx +197 -0
  353. package/src/components/chip/chip.tsx +208 -0
  354. package/src/components/chip/chip.types.ts +134 -0
  355. package/src/components/chip/index.ts +10 -0
  356. package/src/components/drawer/drawer-body/drawer-body.tsx +29 -0
  357. package/src/components/drawer/drawer-body/index.ts +1 -0
  358. package/src/components/drawer/drawer-close/drawer-close.tsx +43 -0
  359. package/src/components/drawer/drawer-close/index.ts +1 -0
  360. package/src/components/drawer/drawer-content/drawer-content.tsx +135 -0
  361. package/src/components/drawer/drawer-content/index.ts +1 -0
  362. package/src/components/drawer/drawer-header/drawer-header.tsx +40 -0
  363. package/src/components/drawer/drawer-header/index.ts +1 -0
  364. package/src/components/drawer/drawer-overlay/drawer-overlay.tsx +87 -0
  365. package/src/components/drawer/drawer-overlay/index.ts +1 -0
  366. package/src/components/drawer/drawer-root/drawer-root.tsx +93 -0
  367. package/src/components/drawer/drawer-root/index.ts +1 -0
  368. package/src/components/drawer/drawer.context.ts +26 -0
  369. package/src/components/drawer/drawer.styles.ts +32 -0
  370. package/src/components/drawer/drawer.test.tsx +274 -0
  371. package/src/components/drawer/drawer.tsx +58 -0
  372. package/src/components/drawer/drawer.types.ts +192 -0
  373. package/src/components/drawer/index.ts +18 -0
  374. package/src/components/drawer/use-drawer.ts +94 -0
  375. package/src/components/file-input/file-input.test.tsx +134 -0
  376. package/src/components/file-input/file-input.tsx +224 -0
  377. package/src/components/file-input/file-input.types.ts +78 -0
  378. package/src/components/file-input/file-input.utils.test.ts +36 -0
  379. package/src/components/file-input/file-input.utils.ts +130 -0
  380. package/src/components/file-input/index.ts +2 -0
  381. package/src/components/for/for.test.tsx +66 -0
  382. package/src/components/for/for.tsx +53 -0
  383. package/src/components/for/for.types.ts +40 -0
  384. package/src/components/for/index.ts +2 -0
  385. package/src/components/index.ts +16 -6
  386. package/src/components/menu/menu-dropdown/menu-dropdown.tsx +220 -220
  387. package/src/components/menu/menu-sub-dropdown/menu-sub-dropdown.tsx +221 -221
  388. package/src/components/modal/index.ts +4 -1
  389. package/src/components/modal/modal-body/index.ts +1 -0
  390. package/src/components/modal/modal-body/modal-body.tsx +29 -0
  391. package/src/components/modal/modal-content/modal-content.tsx +71 -24
  392. package/src/components/modal/modal-header/modal-header.tsx +2 -2
  393. package/src/components/modal/modal-overlay/modal-overlay.tsx +29 -6
  394. package/src/components/modal/modal-root/modal-root.tsx +22 -17
  395. package/src/components/modal/modal.context.ts +5 -2
  396. package/src/components/modal/modal.test.tsx +225 -19
  397. package/src/components/modal/modal.tsx +36 -4
  398. package/src/components/modal/modal.types.ts +55 -8
  399. package/src/components/modal/use-modal.ts +44 -51
  400. package/src/components/password-input/index.ts +2 -0
  401. package/src/components/password-input/password-input.test.tsx +72 -0
  402. package/src/components/password-input/password-input.tsx +85 -0
  403. package/src/components/password-input/password-input.types.ts +30 -0
  404. package/src/components/pin-input/index.ts +2 -0
  405. package/src/components/pin-input/pin-input.test.tsx +149 -0
  406. package/src/components/pin-input/pin-input.tsx +473 -0
  407. package/src/components/pin-input/pin-input.types.ts +78 -0
  408. package/src/components/scroll-area/index.ts +6 -0
  409. package/src/components/scroll-area/scroll-area.test.tsx +72 -0
  410. package/src/components/scroll-area/scroll-area.tsx +70 -0
  411. package/src/components/scroll-area/scroll-area.types.ts +37 -0
  412. package/src/components/segmented-control/index.ts +6 -0
  413. package/src/components/segmented-control/segmented-control.styles.ts +37 -0
  414. package/src/components/segmented-control/segmented-control.test.tsx +170 -0
  415. package/src/components/segmented-control/segmented-control.tsx +255 -0
  416. package/src/components/segmented-control/segmented-control.types.ts +78 -0
  417. package/src/components/select/select-dropdown/select-dropdown.tsx +299 -299
  418. package/src/components/select/select-item/select-item.tsx +1 -1
  419. package/src/components/select/select-root/select-root.tsx +333 -333
  420. package/src/components/select/select-trigger/select-trigger.tsx +123 -123
  421. package/src/components/select/select.context.ts +140 -140
  422. package/src/components/select/select.test.tsx +190 -190
  423. package/src/components/select/select.types.ts +272 -272
  424. package/src/components/select/use-select.ts +170 -170
  425. package/src/components/table/index.ts +24 -0
  426. package/src/components/table/table-body/index.ts +1 -0
  427. package/src/components/table/table-body/table-body.tsx +37 -0
  428. package/src/components/table/table-caption/index.ts +1 -0
  429. package/src/components/table/table-caption/table-caption.tsx +32 -0
  430. package/src/components/table/table-cell/index.ts +1 -0
  431. package/src/components/table/table-cell/table-cell.tsx +33 -0
  432. package/src/components/table/table-head/index.ts +1 -0
  433. package/src/components/table/table-head/table-head.tsx +29 -0
  434. package/src/components/table/table-header-cell/index.ts +1 -0
  435. package/src/components/table/table-header-cell/table-header-cell.tsx +33 -0
  436. package/src/components/table/table-row/index.ts +1 -0
  437. package/src/components/table/table-row/table-row.tsx +30 -0
  438. package/src/components/table/table.context.ts +18 -0
  439. package/src/components/table/table.styles.ts +62 -0
  440. package/src/components/table/table.test.tsx +145 -0
  441. package/src/components/table/table.tsx +91 -0
  442. package/src/components/table/table.types.ts +145 -0
  443. package/src/icons/eye-off.tsx +30 -0
  444. package/src/icons/eye.tsx +24 -0
  445. package/src/icons/index.ts +2 -0
  446. package/src/style.css +14 -8
  447. package/tsconfig.tsbuildinfo +1 -1
@@ -1,21 +1,39 @@
1
+ import { FloatingOverlay, FloatingPortal } from "@floating-ui/react";
1
2
  import { useTheme } from "../../../theme";
2
3
  import { factory } from "../../../utils";
3
- import { Portal } from "../../portal";
4
4
  import { Transition } from "../../transition";
5
5
  import { useModalContext } from "../modal.context";
6
6
  import { ModalOverlayFactoryPayload } from "../modal.types";
7
7
 
8
8
  const ModalOverlay = factory<ModalOverlayFactoryPayload>(
9
- ({ closeOnClick = true, className, onMouseDown, ...props }, ref) => {
9
+ (
10
+ {
11
+ closeOnClick = true,
12
+ backgroundOpacity = 0.5,
13
+ blur = 0,
14
+ className,
15
+ onMouseDown,
16
+ style,
17
+ ...props
18
+ },
19
+ ref
20
+ ) => {
10
21
  const { cx } = useTheme();
11
22
  const {
12
23
  modal,
13
24
  closeOnClickOutside,
25
+ lockScroll,
14
26
  withinPortal,
15
27
  transitionProps,
16
28
  getStyles
17
29
  } = useModalContext();
18
30
 
31
+ const blurValue = typeof blur === "number" ? `${blur}px` : blur;
32
+ const backdropFilterValue =
33
+ blurValue !== "0" && blurValue !== "0px"
34
+ ? `blur(${blurValue})`
35
+ : undefined;
36
+
19
37
  const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {
20
38
  onMouseDown?.(event);
21
39
 
@@ -37,14 +55,19 @@ const ModalOverlay = factory<ModalOverlayFactoryPayload>(
37
55
  mounted={modal.opened}
38
56
  {...transitionProps}
39
57
  >
40
- <div
58
+ <FloatingOverlay
59
+ lockScroll={lockScroll}
41
60
  ref={ref}
42
- aria-hidden="true"
43
61
  className={cx(
44
- "fixed inset-0 z-40 bg-gradient-to-b from-black/60 via-black/45 to-black/65 backdrop-blur-[2px]",
62
+ "z-40",
45
63
  getStyles("overlay"),
46
64
  className
47
65
  )}
66
+ style={{
67
+ backgroundColor: `rgba(0, 0, 0, ${backgroundOpacity})`,
68
+ backdropFilter: backdropFilterValue,
69
+ ...style
70
+ }}
48
71
  onMouseDown={handleMouseDown}
49
72
  {...props}
50
73
  />
@@ -52,7 +75,7 @@ const ModalOverlay = factory<ModalOverlayFactoryPayload>(
52
75
  );
53
76
 
54
77
  return withinPortal ? (
55
- <Portal>{overlayContent}</Portal>
78
+ <FloatingPortal>{overlayContent}</FloatingPortal>
56
79
  ) : (
57
80
  overlayContent
58
81
  );
@@ -1,5 +1,4 @@
1
1
  import { useId } from "@refraktor/utils";
2
- import { useRef } from "react";
3
2
  import { useTheme } from "../../../theme";
4
3
  import { factory, useClassNames, useProps } from "../../../utils";
5
4
  import { ModalProvider } from "../modal.context";
@@ -9,14 +8,17 @@ import {
9
8
  ModalRootFactoryPayload,
10
9
  ModalRootProps
11
10
  } from "../modal.types";
12
- import { RemoveScroll } from "react-remove-scroll";
13
11
 
14
12
  const defaultProps = {
15
13
  closeOnClickOutside: true,
16
14
  closeOnEscape: true,
17
15
  lockScroll: true,
18
16
  withinPortal: true,
19
- radius: "md"
17
+ radius: "md",
18
+ size: "md",
19
+ centered: true,
20
+ trapFocus: true,
21
+ returnFocus: true
20
22
  } satisfies Partial<ModalRootProps>;
21
23
 
22
24
  const ModalRoot = factory<ModalRootFactoryPayload>((_props, ref) => {
@@ -32,6 +34,10 @@ const ModalRoot = factory<ModalRootFactoryPayload>((_props, ref) => {
32
34
  lockScroll,
33
35
  withinPortal,
34
36
  radius,
37
+ size,
38
+ centered,
39
+ trapFocus,
40
+ returnFocus,
35
41
  transitionProps,
36
42
  className,
37
43
  classNames,
@@ -41,15 +47,13 @@ const ModalRoot = factory<ModalRootFactoryPayload>((_props, ref) => {
41
47
 
42
48
  const _id = useId(id);
43
49
  const headerId = `${_id}-header`;
44
- const contentRef = useRef<HTMLDivElement | null>(null);
45
50
 
46
51
  const modal = useModal({
47
52
  opened,
48
53
  defaultOpened,
49
54
  onOpenedChange,
50
55
  closeOnClickOutside,
51
- closeOnEscape,
52
- contentRef
56
+ closeOnEscape
53
57
  });
54
58
 
55
59
  const getStyles = (part: keyof ModalClassNames) => classes[part];
@@ -62,23 +66,24 @@ const ModalRoot = factory<ModalRootFactoryPayload>((_props, ref) => {
62
66
  lockScroll,
63
67
  withinPortal,
64
68
  radius,
69
+ size,
70
+ centered,
71
+ trapFocus,
72
+ returnFocus,
65
73
  transitionProps,
66
74
  headerId,
67
- contentRef,
68
75
  classNames,
69
76
  getStyles
70
77
  }}
71
78
  >
72
- <RemoveScroll enabled={modal.opened && lockScroll}>
73
- <div
74
- ref={ref}
75
- id={_id}
76
- className={cx(classes.root, className)}
77
- {...props}
78
- >
79
- {children}
80
- </div>
81
- </RemoveScroll>
79
+ <div
80
+ ref={ref}
81
+ id={_id}
82
+ className={cx(classes.root, className)}
83
+ {...props}
84
+ >
85
+ {children}
86
+ </div>
82
87
  </ModalProvider>
83
88
  );
84
89
  });
@@ -1,7 +1,7 @@
1
1
  import { createSafeContext } from "@refraktor/utils";
2
2
  import { RefraktorRadius } from "../../theme";
3
3
  import { TransitionProps } from "../transition";
4
- import { ModalClassNames } from "./modal.types";
4
+ import { ModalClassNames, ModalSize } from "./modal.types";
5
5
  import { UseModalReturn } from "./use-modal";
6
6
 
7
7
  export interface ModalContextValue {
@@ -10,9 +10,12 @@ export interface ModalContextValue {
10
10
  lockScroll: boolean;
11
11
  withinPortal: boolean;
12
12
  radius: RefraktorRadius;
13
+ size: ModalSize;
14
+ centered: boolean;
15
+ trapFocus: boolean;
16
+ returnFocus: boolean;
13
17
  transitionProps?: Omit<TransitionProps, "children" | "mounted">;
14
18
  headerId: string;
15
- contentRef: React.MutableRefObject<HTMLDivElement | null>;
16
19
  classNames?: ModalClassNames;
17
20
  getStyles: (part: keyof ModalClassNames) => string | undefined;
18
21
  }
@@ -1,6 +1,7 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
2
  import { render, screen, userEvent, waitFor } from "../../vitest";
3
3
  import Modal from "./modal";
4
+ import { ModalBody } from "./modal-body";
4
5
  import { ModalContent } from "./modal-content";
5
6
  import { ModalOverlay } from "./modal-overlay";
6
7
  import { ModalRoot } from "./modal-root";
@@ -15,14 +16,16 @@ describe("@refraktor/core/Modal", () => {
15
16
  const user = userEvent.setup();
16
17
 
17
18
  await render(
18
- <Modal defaultOpened transitionProps={transitionProps}>
19
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
19
20
  <Modal.Overlay />
20
21
 
21
22
  <Modal.Content>
22
- <Modal.Header text="Delete item" />
23
- <p>Are you sure?</p>
23
+ <Modal.Header>Delete item</Modal.Header>
24
+ <Modal.Body>
25
+ <p>Are you sure?</p>
26
+ </Modal.Body>
24
27
  </Modal.Content>
25
- </Modal>
28
+ </Modal.Root>
26
29
  );
27
30
 
28
31
  expect(
@@ -41,14 +44,14 @@ describe("@refraktor/core/Modal", () => {
41
44
  const onOpenedChange = vi.fn();
42
45
 
43
46
  await render(
44
- <Modal
47
+ <Modal.Root
45
48
  opened
46
49
  onOpenedChange={onOpenedChange}
47
50
  transitionProps={transitionProps}
48
51
  >
49
52
  <Modal.Overlay data-testid="overlay" />
50
53
  <Modal.Content>Controlled modal</Modal.Content>
51
- </Modal>
54
+ </Modal.Root>
52
55
  );
53
56
 
54
57
  await user.click(await screen.findByTestId("overlay"));
@@ -60,9 +63,9 @@ describe("@refraktor/core/Modal", () => {
60
63
  const user = userEvent.setup();
61
64
 
62
65
  await render(
63
- <Modal defaultOpened transitionProps={transitionProps}>
66
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
64
67
  <Modal.Content>Keyboard close</Modal.Content>
65
- </Modal>
68
+ </Modal.Root>
66
69
  );
67
70
 
68
71
  await screen.findByRole("dialog");
@@ -85,26 +88,229 @@ describe("@refraktor/core/Modal", () => {
85
88
  expect(await screen.findByRole("dialog")).toBeInTheDocument();
86
89
  });
87
90
 
88
- it("locks and unlocks body scroll when enabled", async () => {
89
- const user = userEvent.setup();
91
+ it("applies custom overlay background opacity and blur", async () => {
92
+ await render(
93
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
94
+ <Modal.Overlay
95
+ data-testid="overlay"
96
+ backgroundOpacity={0.4}
97
+ blur={6}
98
+ />
99
+ <Modal.Content>Styled overlay</Modal.Content>
100
+ </Modal.Root>
101
+ );
102
+
103
+ const overlay = await screen.findByTestId("overlay");
104
+
105
+ expect(overlay).toHaveStyle({
106
+ backgroundColor: "rgba(0, 0, 0, 0.4)",
107
+ backdropFilter: "blur(6px)"
108
+ });
109
+ });
110
+
111
+ it("does not set backdrop blur for zero blur", async () => {
112
+ await render(
113
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
114
+ <Modal.Overlay data-testid="overlay" blur={0} />
115
+ <Modal.Content>No blur</Modal.Content>
116
+ </Modal.Root>
117
+ );
118
+
119
+ const overlay = await screen.findByTestId("overlay");
120
+
121
+ expect(overlay).toHaveStyle({
122
+ backgroundColor: "rgba(0, 0, 0, 0.5)"
123
+ });
124
+ expect(overlay.style.backdropFilter).toBe("");
125
+ });
90
126
 
127
+ it("renders Modal.Body subcomponent", async () => {
91
128
  await render(
92
- <Modal defaultOpened lockScroll transitionProps={transitionProps}>
129
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
93
130
  <Modal.Content>
94
- Scroll locked
95
- <Modal.Close />
131
+ <Modal.Body data-testid="body">Body content</Modal.Body>
96
132
  </Modal.Content>
97
- </Modal>
133
+ </Modal.Root>
98
134
  );
99
135
 
100
- await waitFor(() => {
101
- expect(document.body).toHaveAttribute("data-scroll-locked");
136
+ const body = await screen.findByTestId("body");
137
+ expect(body).toBeInTheDocument();
138
+ expect(body).toHaveTextContent("Body content");
139
+ });
140
+
141
+ it("renders standalone ModalBody component", async () => {
142
+ await render(
143
+ <ModalRoot defaultOpened transitionProps={transitionProps}>
144
+ <ModalContent>
145
+ <ModalBody data-testid="body">Standalone body</ModalBody>
146
+ </ModalContent>
147
+ </ModalRoot>
148
+ );
149
+
150
+ expect(await screen.findByTestId("body")).toHaveTextContent(
151
+ "Standalone body"
152
+ );
153
+ });
154
+
155
+ describe("single-component shorthand API", () => {
156
+ it("renders with title, overlay, close button, and body", async () => {
157
+ await render(
158
+ <Modal
159
+ defaultOpened
160
+ title="Confirm action"
161
+ transitionProps={transitionProps}
162
+ >
163
+ <p>Are you sure?</p>
164
+ </Modal>
165
+ );
166
+
167
+ expect(
168
+ await screen.findByRole("dialog", { name: "Confirm action" })
169
+ ).toBeInTheDocument();
170
+ expect(screen.getByText("Are you sure?")).toBeInTheDocument();
171
+ expect(
172
+ screen.getByRole("button", { name: "Close" })
173
+ ).toBeInTheDocument();
102
174
  });
103
175
 
104
- await user.click(screen.getByRole("button", { name: "Close" }));
176
+ it("hides overlay when withOverlay is false", async () => {
177
+ const { container } = await render(
178
+ <Modal
179
+ defaultOpened
180
+ title="No overlay"
181
+ withOverlay={false}
182
+ transitionProps={transitionProps}
183
+ />
184
+ );
105
185
 
106
- await waitFor(() => {
107
- expect(document.body).not.toHaveAttribute("data-scroll-locked");
186
+ expect(await screen.findByRole("dialog")).toBeInTheDocument();
187
+ expect(
188
+ container.ownerDocument.querySelector("[aria-hidden='true']")
189
+ ).toBeNull();
190
+ });
191
+
192
+ it("hides close button when withCloseButton is false", async () => {
193
+ await render(
194
+ <Modal
195
+ defaultOpened
196
+ title="No close"
197
+ withCloseButton={false}
198
+ transitionProps={transitionProps}
199
+ />
200
+ );
201
+
202
+ await screen.findByRole("dialog");
203
+ expect(
204
+ screen.queryByRole("button", { name: "Close" })
205
+ ).not.toBeInTheDocument();
206
+ });
207
+
208
+ it("closes via shorthand close button", async () => {
209
+ const user = userEvent.setup();
210
+
211
+ await render(
212
+ <Modal
213
+ defaultOpened
214
+ title="Closeable"
215
+ transitionProps={transitionProps}
216
+ >
217
+ Content
218
+ </Modal>
219
+ );
220
+
221
+ await screen.findByRole("dialog");
222
+
223
+ await user.click(screen.getByRole("button", { name: "Close" }));
224
+
225
+ await waitFor(() => {
226
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
227
+ });
228
+ });
229
+
230
+ it("passes overlayProps to the overlay", async () => {
231
+ await render(
232
+ <Modal
233
+ defaultOpened
234
+ title="Custom overlay"
235
+ overlayProps={{
236
+ backgroundOpacity: 0.8,
237
+ blur: 10,
238
+ "data-testid": "shorthand-overlay"
239
+ } as any}
240
+ transitionProps={transitionProps}
241
+ >
242
+ Content
243
+ </Modal>
244
+ );
245
+
246
+ const overlay = await screen.findByTestId("shorthand-overlay");
247
+
248
+ expect(overlay).toHaveStyle({
249
+ backgroundColor: "rgba(0, 0, 0, 0.8)",
250
+ backdropFilter: "blur(10px)"
251
+ });
252
+ });
253
+ });
254
+
255
+ describe("size prop", () => {
256
+ it("applies md size by default", async () => {
257
+ await render(
258
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
259
+ <Modal.Content data-testid="content">
260
+ Default size
261
+ </Modal.Content>
262
+ </Modal.Root>
263
+ );
264
+
265
+ const dialog = await screen.findByRole("dialog");
266
+ expect(dialog.className).toContain("max-w-md");
267
+ });
268
+
269
+ it("applies custom size", async () => {
270
+ await render(
271
+ <Modal.Root
272
+ defaultOpened
273
+ size="lg"
274
+ transitionProps={transitionProps}
275
+ >
276
+ <Modal.Content>Large modal</Modal.Content>
277
+ </Modal.Root>
278
+ );
279
+
280
+ const dialog = await screen.findByRole("dialog");
281
+ expect(dialog.className).toContain("max-w-lg");
282
+ });
283
+ });
284
+
285
+ describe("centered prop", () => {
286
+ it("centers vertically by default", async () => {
287
+ await render(
288
+ <Modal.Root defaultOpened transitionProps={transitionProps}>
289
+ <Modal.Content>Centered</Modal.Content>
290
+ </Modal.Root>
291
+ );
292
+
293
+ await screen.findByRole("dialog");
294
+ const wrapper =
295
+ screen.getByRole("dialog").parentElement?.parentElement;
296
+ expect(wrapper?.className).toContain("place-items-center");
297
+ });
298
+
299
+ it("positions at top when centered is false", async () => {
300
+ await render(
301
+ <Modal.Root
302
+ defaultOpened
303
+ centered={false}
304
+ transitionProps={transitionProps}
305
+ >
306
+ <Modal.Content>Top aligned</Modal.Content>
307
+ </Modal.Root>
308
+ );
309
+
310
+ await screen.findByRole("dialog");
311
+ const wrapper =
312
+ screen.getByRole("dialog").parentElement?.parentElement;
313
+ expect(wrapper?.className).toContain("items-start");
108
314
  });
109
315
  });
110
316
  });
@@ -3,16 +3,47 @@ import {
3
3
  createComponentConfig,
4
4
  factory
5
5
  } from "../../utils";
6
+ import { ModalBody } from "./modal-body";
6
7
  import { ModalClose } from "./modal-close";
7
8
  import { ModalContent } from "./modal-content";
8
9
  import { ModalHeader } from "./modal-header";
9
10
  import { ModalOverlay } from "./modal-overlay";
10
11
  import { ModalRoot } from "./modal-root";
11
- import { ModalClassNames, ModalFactoryPayload, ModalProps } from "./modal.types";
12
+ import {
13
+ ModalClassNames,
14
+ ModalFactoryPayload,
15
+ ModalProps
16
+ } from "./modal.types";
17
+
18
+ const Modal = factory<ModalFactoryPayload>(
19
+ (
20
+ {
21
+ title,
22
+ withOverlay = true,
23
+ withCloseButton = true,
24
+ overlayProps,
25
+ children,
26
+ ...rootProps
27
+ },
28
+ ref
29
+ ) => {
30
+ return (
31
+ <ModalRoot {...rootProps} ref={ref}>
32
+ {withOverlay && <ModalOverlay {...overlayProps} />}
33
+
34
+ <ModalContent>
35
+ {(title || withCloseButton) && (
36
+ <ModalHeader withClose={withCloseButton}>
37
+ {title}
38
+ </ModalHeader>
39
+ )}
12
40
 
13
- const Modal = factory<ModalFactoryPayload>((props, ref) => {
14
- return <ModalRoot {...props} ref={ref} />;
15
- });
41
+ <ModalBody>{children}</ModalBody>
42
+ </ModalContent>
43
+ </ModalRoot>
44
+ );
45
+ }
46
+ );
16
47
 
17
48
  Modal.displayName = "@refraktor/core/Modal";
18
49
  Modal.configure = createComponentConfig<ModalProps>();
@@ -21,6 +52,7 @@ Modal.Root = ModalRoot;
21
52
  Modal.Overlay = ModalOverlay;
22
53
  Modal.Content = ModalContent;
23
54
  Modal.Header = ModalHeader;
55
+ Modal.Body = ModalBody;
24
56
  Modal.Close = ModalClose;
25
57
 
26
58
  export default Modal;
@@ -10,19 +10,23 @@ import { ModalRoot } from "./modal-root";
10
10
  import { ModalOverlay } from "./modal-overlay";
11
11
  import { ModalContent } from "./modal-content";
12
12
  import { ModalHeader } from "./modal-header";
13
+ import { ModalBody } from "./modal-body";
13
14
  import { ModalClose } from "./modal-close";
14
15
 
16
+ export type ModalSize = "xs" | "sm" | "md" | "lg" | "xl" | "full";
17
+
15
18
  export type ModalClassNames = {
16
19
  root?: string;
17
20
  overlay?: string;
18
21
  content?: string;
19
22
  header?: string;
23
+ body?: string;
20
24
  close?: string;
21
25
  };
22
26
 
23
- export interface ModalProps extends ComponentPropsWithoutRef<"div"> {
27
+ export interface ModalRootProps extends ComponentPropsWithoutRef<"div"> {
24
28
  /** Children containing modal subcomponents */
25
- children: ReactNode;
29
+ children?: ReactNode;
26
30
 
27
31
  /** State of the modal (controlled) */
28
32
  opened?: boolean;
@@ -48,6 +52,18 @@ export interface ModalProps extends ComponentPropsWithoutRef<"div"> {
48
52
  /** Radius for modal content @default `md` */
49
53
  radius?: RefraktorRadius;
50
54
 
55
+ /** Modal content width @default `md` */
56
+ size?: ModalSize;
57
+
58
+ /** Whether to center modal vertically @default `true` */
59
+ centered?: boolean;
60
+
61
+ /** Whether to trap focus within the modal @default `true` */
62
+ trapFocus?: boolean;
63
+
64
+ /** Whether to return focus to trigger after close @default `true` */
65
+ returnFocus?: boolean;
66
+
51
67
  /** Transition props for overlay/content, uses Transition internally */
52
68
  transitionProps?: Omit<TransitionProps, "children" | "mounted">;
53
69
 
@@ -58,12 +74,30 @@ export interface ModalProps extends ComponentPropsWithoutRef<"div"> {
58
74
  classNames?: ModalClassNames;
59
75
  }
60
76
 
61
- export type ModalRootProps = ModalProps;
77
+ export interface ModalProps extends Omit<ModalRootProps, "title"> {
78
+ /** Title text rendered in the header */
79
+ title?: ReactNode;
80
+
81
+ /** Whether to render the overlay @default `true` */
82
+ withOverlay?: boolean;
83
+
84
+ /** Whether to show the close button in the header @default `true` */
85
+ withCloseButton?: boolean;
86
+
87
+ /** Props passed to the Overlay subcomponent */
88
+ overlayProps?: ModalOverlayProps;
89
+ }
62
90
 
63
91
  export interface ModalOverlayProps extends ComponentPropsWithoutRef<"div"> {
64
92
  /** Whether clicking the overlay closes modal @default `true` */
65
93
  closeOnClick?: boolean;
66
94
 
95
+ /** Overlay background opacity @default `0.5` */
96
+ backgroundOpacity?: number;
97
+
98
+ /** Backdrop blur amount in px (or any CSS length) @default `0` */
99
+ blur?: number | string;
100
+
67
101
  /** Used for editing root class name */
68
102
  className?: string;
69
103
  }
@@ -80,9 +114,6 @@ export interface ModalHeaderProps extends ComponentPropsWithoutRef<"div"> {
80
114
  /** Header content */
81
115
  children?: ReactNode;
82
116
 
83
- /** Shorthand header text */
84
- text?: ReactNode;
85
-
86
117
  /** Whether to show close button inside header @default `true` */
87
118
  withClose?: boolean;
88
119
 
@@ -90,8 +121,18 @@ export interface ModalHeaderProps extends ComponentPropsWithoutRef<"div"> {
90
121
  className?: string;
91
122
  }
92
123
 
93
- export interface ModalCloseProps
94
- extends Omit<ComponentPropsWithoutRef<"button">, "onClick"> {
124
+ export interface ModalBodyProps extends ComponentPropsWithoutRef<"div"> {
125
+ /** Body content */
126
+ children?: ReactNode;
127
+
128
+ /** Used for editing root class name */
129
+ className?: string;
130
+ }
131
+
132
+ export interface ModalCloseProps extends Omit<
133
+ ComponentPropsWithoutRef<"button">,
134
+ "onClick"
135
+ > {
95
136
  /** Optional close content (defaults to `x`) */
96
137
  children?: ReactNode;
97
138
 
@@ -112,6 +153,7 @@ export interface ModalFactoryPayload extends FactoryPayload {
112
153
  Overlay: typeof ModalOverlay;
113
154
  Content: typeof ModalContent;
114
155
  Header: typeof ModalHeader;
156
+ Body: typeof ModalBody;
115
157
  Close: typeof ModalClose;
116
158
  };
117
159
  }
@@ -136,6 +178,11 @@ export interface ModalHeaderFactoryPayload extends FactoryPayload {
136
178
  ref: HTMLDivElement;
137
179
  }
138
180
 
181
+ export interface ModalBodyFactoryPayload extends FactoryPayload {
182
+ props: ModalBodyProps;
183
+ ref: HTMLDivElement;
184
+ }
185
+
139
186
  export interface ModalCloseFactoryPayload extends FactoryPayload {
140
187
  props: ModalCloseProps;
141
188
  ref: HTMLButtonElement;