@cdx-ui/primitives 0.0.1-beta.140 → 0.0.1-beta.142

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 (433) hide show
  1. package/lib/commonjs/calendar/CalendarGrid.js +33 -0
  2. package/lib/commonjs/calendar/CalendarGrid.js.map +1 -0
  3. package/lib/commonjs/calendar/CalendarRoot.js +95 -0
  4. package/lib/commonjs/calendar/CalendarRoot.js.map +1 -0
  5. package/lib/commonjs/calendar/context.js +17 -0
  6. package/lib/commonjs/calendar/context.js.map +1 -0
  7. package/lib/commonjs/calendar/index.js +27 -0
  8. package/lib/commonjs/calendar/index.js.map +1 -0
  9. package/lib/commonjs/calendar/types.js +6 -0
  10. package/lib/commonjs/calendar/types.js.map +1 -0
  11. package/lib/commonjs/checkbox/CheckboxRoot.web.js +91 -28
  12. package/lib/commonjs/checkbox/CheckboxRoot.web.js.map +1 -1
  13. package/lib/commonjs/checkbox/useCheckboxRoot.js +33 -19
  14. package/lib/commonjs/checkbox/useCheckboxRoot.js.map +1 -1
  15. package/lib/commonjs/date-field/DateFieldHiddenInput.js +148 -0
  16. package/lib/commonjs/date-field/DateFieldHiddenInput.js.map +1 -0
  17. package/lib/commonjs/date-field/DateFieldInput.js +122 -0
  18. package/lib/commonjs/date-field/DateFieldInput.js.map +1 -0
  19. package/lib/commonjs/date-field/DateFieldRoot.js +85 -0
  20. package/lib/commonjs/date-field/DateFieldRoot.js.map +1 -0
  21. package/lib/commonjs/date-field/DateFieldSegment.js +92 -0
  22. package/lib/commonjs/date-field/DateFieldSegment.js.map +1 -0
  23. package/lib/commonjs/date-field/context.js +19 -0
  24. package/lib/commonjs/date-field/context.js.map +1 -0
  25. package/lib/commonjs/date-field/index.js +34 -0
  26. package/lib/commonjs/date-field/index.js.map +1 -0
  27. package/lib/commonjs/date-field/segmentIndex.js +23 -0
  28. package/lib/commonjs/date-field/segmentIndex.js.map +1 -0
  29. package/lib/commonjs/date-field/segmentKeyboard.js +169 -0
  30. package/lib/commonjs/date-field/segmentKeyboard.js.map +1 -0
  31. package/lib/commonjs/date-field/types.js +6 -0
  32. package/lib/commonjs/date-field/types.js.map +1 -0
  33. package/lib/commonjs/date-field/useDateFieldSegmentState.js +381 -0
  34. package/lib/commonjs/date-field/useDateFieldSegmentState.js.map +1 -0
  35. package/lib/commonjs/date-field/useRangeDateFieldBridge.js +67 -0
  36. package/lib/commonjs/date-field/useRangeDateFieldBridge.js.map +1 -0
  37. package/lib/commonjs/date-picker/DatePickerRoot.js +123 -0
  38. package/lib/commonjs/date-picker/DatePickerRoot.js.map +1 -0
  39. package/lib/commonjs/date-picker/context.js +17 -0
  40. package/lib/commonjs/date-picker/context.js.map +1 -0
  41. package/lib/commonjs/date-picker/index.js +26 -0
  42. package/lib/commonjs/date-picker/index.js.map +1 -0
  43. package/lib/commonjs/date-range-picker/DateRangePickerRoot.js +144 -0
  44. package/lib/commonjs/date-range-picker/DateRangePickerRoot.js.map +1 -0
  45. package/lib/commonjs/date-range-picker/context.js +23 -0
  46. package/lib/commonjs/date-range-picker/context.js.map +1 -0
  47. package/lib/commonjs/date-range-picker/index.js +26 -0
  48. package/lib/commonjs/date-range-picker/index.js.map +1 -0
  49. package/lib/commonjs/date-time-field/DateTimeFieldHiddenInput.js +150 -0
  50. package/lib/commonjs/date-time-field/DateTimeFieldHiddenInput.js.map +1 -0
  51. package/lib/commonjs/date-time-field/DateTimeFieldInput.js +104 -0
  52. package/lib/commonjs/date-time-field/DateTimeFieldInput.js.map +1 -0
  53. package/lib/commonjs/date-time-field/DateTimeFieldRoot.js +159 -0
  54. package/lib/commonjs/date-time-field/DateTimeFieldRoot.js.map +1 -0
  55. package/lib/commonjs/date-time-field/DateTimeFieldSegment.js +87 -0
  56. package/lib/commonjs/date-time-field/DateTimeFieldSegment.js.map +1 -0
  57. package/lib/commonjs/date-time-field/context.js +17 -0
  58. package/lib/commonjs/date-time-field/context.js.map +1 -0
  59. package/lib/commonjs/date-time-field/index.js +40 -0
  60. package/lib/commonjs/date-time-field/index.js.map +1 -0
  61. package/lib/commonjs/date-time-field/useDateTimeFieldSegmentState.js +564 -0
  62. package/lib/commonjs/date-time-field/useDateTimeFieldSegmentState.js.map +1 -0
  63. package/lib/commonjs/date-time-list/DateTimeListRoot.js +418 -0
  64. package/lib/commonjs/date-time-list/DateTimeListRoot.js.map +1 -0
  65. package/lib/commonjs/date-time-list/context.js +26 -0
  66. package/lib/commonjs/date-time-list/context.js.map +1 -0
  67. package/lib/commonjs/date-time-list/index.js +62 -0
  68. package/lib/commonjs/date-time-list/index.js.map +1 -0
  69. package/lib/commonjs/date-time-picker/DateTimePickerRoot.js +134 -0
  70. package/lib/commonjs/date-time-picker/DateTimePickerRoot.js.map +1 -0
  71. package/lib/commonjs/date-time-picker/context.js +17 -0
  72. package/lib/commonjs/date-time-picker/context.js.map +1 -0
  73. package/lib/commonjs/date-time-picker/index.js +26 -0
  74. package/lib/commonjs/date-time-picker/index.js.map +1 -0
  75. package/lib/commonjs/dialog/DialogRoot.js +1 -1
  76. package/lib/commonjs/dialog/DialogRoot.js.map +1 -1
  77. package/lib/commonjs/index.js +148 -0
  78. package/lib/commonjs/index.js.map +1 -1
  79. package/lib/commonjs/month-calendar/MonthCalendarCell.js +64 -0
  80. package/lib/commonjs/month-calendar/MonthCalendarCell.js.map +1 -0
  81. package/lib/commonjs/month-calendar/MonthCalendarRoot.js +103 -0
  82. package/lib/commonjs/month-calendar/MonthCalendarRoot.js.map +1 -0
  83. package/lib/commonjs/month-calendar/MonthCalendarYearCell.js +63 -0
  84. package/lib/commonjs/month-calendar/MonthCalendarYearCell.js.map +1 -0
  85. package/lib/commonjs/month-calendar/context.js +17 -0
  86. package/lib/commonjs/month-calendar/context.js.map +1 -0
  87. package/lib/commonjs/month-calendar/index.js +34 -0
  88. package/lib/commonjs/month-calendar/index.js.map +1 -0
  89. package/lib/commonjs/month-picker/MonthPickerRoot.js +118 -0
  90. package/lib/commonjs/month-picker/MonthPickerRoot.js.map +1 -0
  91. package/lib/commonjs/month-picker/context.js +17 -0
  92. package/lib/commonjs/month-picker/context.js.map +1 -0
  93. package/lib/commonjs/month-picker/index.js +26 -0
  94. package/lib/commonjs/month-picker/index.js.map +1 -0
  95. package/lib/commonjs/overlay/useAnchorPosition.js +27 -16
  96. package/lib/commonjs/overlay/useAnchorPosition.js.map +1 -1
  97. package/lib/commonjs/overlay/useDismissOverlay.web.js +10 -2
  98. package/lib/commonjs/overlay/useDismissOverlay.web.js.map +1 -1
  99. package/lib/commonjs/overlay/useOverlayPosition.js +5 -2
  100. package/lib/commonjs/overlay/useOverlayPosition.js.map +1 -1
  101. package/lib/commonjs/portal/portal.js +59 -2
  102. package/lib/commonjs/portal/portal.js.map +1 -1
  103. package/lib/commonjs/radio/RadioGroup.js +65 -16
  104. package/lib/commonjs/radio/RadioGroup.js.map +1 -1
  105. package/lib/commonjs/radio/RadioRoot.web.js +114 -26
  106. package/lib/commonjs/radio/RadioRoot.web.js.map +1 -1
  107. package/lib/commonjs/radio/context.js.map +1 -1
  108. package/lib/commonjs/radio/useRadioGroupNavigation.js +79 -0
  109. package/lib/commonjs/radio/useRadioGroupNavigation.js.map +1 -0
  110. package/lib/commonjs/radio/useRadioRoot.js +14 -13
  111. package/lib/commonjs/radio/useRadioRoot.js.map +1 -1
  112. package/lib/commonjs/range-calendar/RangeCalendarRoot.js +148 -0
  113. package/lib/commonjs/range-calendar/RangeCalendarRoot.js.map +1 -0
  114. package/lib/commonjs/range-calendar/context.js +17 -0
  115. package/lib/commonjs/range-calendar/context.js.map +1 -0
  116. package/lib/commonjs/range-calendar/index.js +20 -0
  117. package/lib/commonjs/range-calendar/index.js.map +1 -0
  118. package/lib/commonjs/select/SelectRoot.js +1 -1
  119. package/lib/commonjs/select/SelectRoot.js.map +1 -1
  120. package/lib/commonjs/utils/accessibleLabel.js +23 -0
  121. package/lib/commonjs/utils/accessibleLabel.js.map +1 -0
  122. package/lib/commonjs/utils/createPortal.web.js +21 -0
  123. package/lib/commonjs/utils/createPortal.web.js.map +1 -0
  124. package/lib/module/calendar/CalendarGrid.js +29 -0
  125. package/lib/module/calendar/CalendarGrid.js.map +1 -0
  126. package/lib/module/calendar/CalendarRoot.js +91 -0
  127. package/lib/module/calendar/CalendarRoot.js.map +1 -0
  128. package/lib/module/calendar/context.js +12 -0
  129. package/lib/module/calendar/context.js.map +1 -0
  130. package/lib/module/calendar/index.js +6 -0
  131. package/lib/module/calendar/index.js.map +1 -0
  132. package/lib/module/calendar/types.js +4 -0
  133. package/lib/module/calendar/types.js.map +1 -0
  134. package/lib/module/checkbox/CheckboxRoot.web.js +92 -29
  135. package/lib/module/checkbox/CheckboxRoot.web.js.map +1 -1
  136. package/lib/module/checkbox/useCheckboxRoot.js +34 -20
  137. package/lib/module/checkbox/useCheckboxRoot.js.map +1 -1
  138. package/lib/module/date-field/DateFieldHiddenInput.js +146 -0
  139. package/lib/module/date-field/DateFieldHiddenInput.js.map +1 -0
  140. package/lib/module/date-field/DateFieldInput.js +118 -0
  141. package/lib/module/date-field/DateFieldInput.js.map +1 -0
  142. package/lib/module/date-field/DateFieldRoot.js +81 -0
  143. package/lib/module/date-field/DateFieldRoot.js.map +1 -0
  144. package/lib/module/date-field/DateFieldSegment.js +88 -0
  145. package/lib/module/date-field/DateFieldSegment.js.map +1 -0
  146. package/lib/module/date-field/context.js +15 -0
  147. package/lib/module/date-field/context.js.map +1 -0
  148. package/lib/module/date-field/index.js +7 -0
  149. package/lib/module/date-field/index.js.map +1 -0
  150. package/lib/module/date-field/segmentIndex.js +18 -0
  151. package/lib/module/date-field/segmentIndex.js.map +1 -0
  152. package/lib/module/date-field/segmentKeyboard.js +157 -0
  153. package/lib/module/date-field/segmentKeyboard.js.map +1 -0
  154. package/lib/module/date-field/types.js +4 -0
  155. package/lib/module/date-field/types.js.map +1 -0
  156. package/lib/module/date-field/useDateFieldSegmentState.js +378 -0
  157. package/lib/module/date-field/useDateFieldSegmentState.js.map +1 -0
  158. package/lib/module/date-field/useRangeDateFieldBridge.js +63 -0
  159. package/lib/module/date-field/useRangeDateFieldBridge.js.map +1 -0
  160. package/lib/module/date-picker/DatePickerRoot.js +119 -0
  161. package/lib/module/date-picker/DatePickerRoot.js.map +1 -0
  162. package/lib/module/date-picker/context.js +12 -0
  163. package/lib/module/date-picker/context.js.map +1 -0
  164. package/lib/module/date-picker/index.js +5 -0
  165. package/lib/module/date-picker/index.js.map +1 -0
  166. package/lib/module/date-range-picker/DateRangePickerRoot.js +140 -0
  167. package/lib/module/date-range-picker/DateRangePickerRoot.js.map +1 -0
  168. package/lib/module/date-range-picker/context.js +19 -0
  169. package/lib/module/date-range-picker/context.js.map +1 -0
  170. package/lib/module/date-range-picker/index.js +5 -0
  171. package/lib/module/date-range-picker/index.js.map +1 -0
  172. package/lib/module/date-time-field/DateTimeFieldHiddenInput.js +148 -0
  173. package/lib/module/date-time-field/DateTimeFieldHiddenInput.js.map +1 -0
  174. package/lib/module/date-time-field/DateTimeFieldInput.js +100 -0
  175. package/lib/module/date-time-field/DateTimeFieldInput.js.map +1 -0
  176. package/lib/module/date-time-field/DateTimeFieldRoot.js +154 -0
  177. package/lib/module/date-time-field/DateTimeFieldRoot.js.map +1 -0
  178. package/lib/module/date-time-field/DateTimeFieldSegment.js +83 -0
  179. package/lib/module/date-time-field/DateTimeFieldSegment.js.map +1 -0
  180. package/lib/module/date-time-field/context.js +12 -0
  181. package/lib/module/date-time-field/context.js.map +1 -0
  182. package/lib/module/date-time-field/index.js +7 -0
  183. package/lib/module/date-time-field/index.js.map +1 -0
  184. package/lib/module/date-time-field/useDateTimeFieldSegmentState.js +561 -0
  185. package/lib/module/date-time-field/useDateTimeFieldSegmentState.js.map +1 -0
  186. package/lib/module/date-time-list/DateTimeListRoot.js +416 -0
  187. package/lib/module/date-time-list/DateTimeListRoot.js.map +1 -0
  188. package/lib/module/date-time-list/context.js +20 -0
  189. package/lib/module/date-time-list/context.js.map +1 -0
  190. package/lib/module/date-time-list/index.js +5 -0
  191. package/lib/module/date-time-list/index.js.map +1 -0
  192. package/lib/module/date-time-picker/DateTimePickerRoot.js +130 -0
  193. package/lib/module/date-time-picker/DateTimePickerRoot.js.map +1 -0
  194. package/lib/module/date-time-picker/context.js +12 -0
  195. package/lib/module/date-time-picker/context.js.map +1 -0
  196. package/lib/module/date-time-picker/index.js +5 -0
  197. package/lib/module/date-time-picker/index.js.map +1 -0
  198. package/lib/module/dialog/DialogRoot.js +1 -1
  199. package/lib/module/dialog/DialogRoot.js.map +1 -1
  200. package/lib/module/index.js +11 -2
  201. package/lib/module/index.js.map +1 -1
  202. package/lib/module/month-calendar/MonthCalendarCell.js +60 -0
  203. package/lib/module/month-calendar/MonthCalendarCell.js.map +1 -0
  204. package/lib/module/month-calendar/MonthCalendarRoot.js +99 -0
  205. package/lib/module/month-calendar/MonthCalendarRoot.js.map +1 -0
  206. package/lib/module/month-calendar/MonthCalendarYearCell.js +59 -0
  207. package/lib/module/month-calendar/MonthCalendarYearCell.js.map +1 -0
  208. package/lib/module/month-calendar/context.js +12 -0
  209. package/lib/module/month-calendar/context.js.map +1 -0
  210. package/lib/module/month-calendar/index.js +7 -0
  211. package/lib/module/month-calendar/index.js.map +1 -0
  212. package/lib/module/month-picker/MonthPickerRoot.js +114 -0
  213. package/lib/module/month-picker/MonthPickerRoot.js.map +1 -0
  214. package/lib/module/month-picker/context.js +12 -0
  215. package/lib/module/month-picker/context.js.map +1 -0
  216. package/lib/module/month-picker/index.js +5 -0
  217. package/lib/module/month-picker/index.js.map +1 -0
  218. package/lib/module/overlay/useAnchorPosition.js +27 -16
  219. package/lib/module/overlay/useAnchorPosition.js.map +1 -1
  220. package/lib/module/overlay/useDismissOverlay.web.js +9 -2
  221. package/lib/module/overlay/useDismissOverlay.web.js.map +1 -1
  222. package/lib/module/overlay/useOverlayPosition.js +5 -2
  223. package/lib/module/overlay/useOverlayPosition.js.map +1 -1
  224. package/lib/module/portal/portal.js +59 -2
  225. package/lib/module/portal/portal.js.map +1 -1
  226. package/lib/module/radio/RadioGroup.js +68 -19
  227. package/lib/module/radio/RadioGroup.js.map +1 -1
  228. package/lib/module/radio/RadioRoot.web.js +117 -29
  229. package/lib/module/radio/RadioRoot.web.js.map +1 -1
  230. package/lib/module/radio/context.js.map +1 -1
  231. package/lib/module/radio/useRadioGroupNavigation.js +74 -0
  232. package/lib/module/radio/useRadioGroupNavigation.js.map +1 -0
  233. package/lib/module/radio/useRadioRoot.js +14 -13
  234. package/lib/module/radio/useRadioRoot.js.map +1 -1
  235. package/lib/module/range-calendar/RangeCalendarRoot.js +144 -0
  236. package/lib/module/range-calendar/RangeCalendarRoot.js.map +1 -0
  237. package/lib/module/range-calendar/context.js +12 -0
  238. package/lib/module/range-calendar/context.js.map +1 -0
  239. package/lib/module/range-calendar/index.js +5 -0
  240. package/lib/module/range-calendar/index.js.map +1 -0
  241. package/lib/module/select/SelectRoot.js +1 -1
  242. package/lib/module/select/SelectRoot.js.map +1 -1
  243. package/lib/module/utils/accessibleLabel.js +18 -0
  244. package/lib/module/utils/accessibleLabel.js.map +1 -0
  245. package/lib/module/utils/createPortal.web.js +17 -0
  246. package/lib/module/utils/createPortal.web.js.map +1 -0
  247. package/lib/typescript/calendar/CalendarGrid.d.ts +7 -0
  248. package/lib/typescript/calendar/CalendarGrid.d.ts.map +1 -0
  249. package/lib/typescript/calendar/CalendarRoot.d.ts +10 -0
  250. package/lib/typescript/calendar/CalendarRoot.d.ts.map +1 -0
  251. package/lib/typescript/calendar/context.d.ts +18 -0
  252. package/lib/typescript/calendar/context.d.ts.map +1 -0
  253. package/lib/typescript/calendar/index.d.ts +5 -0
  254. package/lib/typescript/calendar/index.d.ts.map +1 -0
  255. package/lib/typescript/calendar/types.d.ts +29 -0
  256. package/lib/typescript/calendar/types.d.ts.map +1 -0
  257. package/lib/typescript/checkbox/CheckboxRoot.web.d.ts +8 -0
  258. package/lib/typescript/checkbox/CheckboxRoot.web.d.ts.map +1 -1
  259. package/lib/typescript/checkbox/useCheckboxRoot.d.ts +7 -18
  260. package/lib/typescript/checkbox/useCheckboxRoot.d.ts.map +1 -1
  261. package/lib/typescript/date-field/DateFieldHiddenInput.d.ts +4 -0
  262. package/lib/typescript/date-field/DateFieldHiddenInput.d.ts.map +1 -0
  263. package/lib/typescript/date-field/DateFieldInput.d.ts +8 -0
  264. package/lib/typescript/date-field/DateFieldInput.d.ts.map +1 -0
  265. package/lib/typescript/date-field/DateFieldRoot.d.ts +10 -0
  266. package/lib/typescript/date-field/DateFieldRoot.d.ts.map +1 -0
  267. package/lib/typescript/date-field/DateFieldSegment.d.ts +9 -0
  268. package/lib/typescript/date-field/DateFieldSegment.d.ts.map +1 -0
  269. package/lib/typescript/date-field/context.d.ts +33 -0
  270. package/lib/typescript/date-field/context.d.ts.map +1 -0
  271. package/lib/typescript/date-field/index.d.ts +9 -0
  272. package/lib/typescript/date-field/index.d.ts.map +1 -0
  273. package/lib/typescript/date-field/segmentIndex.d.ts +7 -0
  274. package/lib/typescript/date-field/segmentIndex.d.ts.map +1 -0
  275. package/lib/typescript/date-field/segmentKeyboard.d.ts +23 -0
  276. package/lib/typescript/date-field/segmentKeyboard.d.ts.map +1 -0
  277. package/lib/typescript/date-field/types.d.ts +38 -0
  278. package/lib/typescript/date-field/types.d.ts.map +1 -0
  279. package/lib/typescript/date-field/useDateFieldSegmentState.d.ts +26 -0
  280. package/lib/typescript/date-field/useDateFieldSegmentState.d.ts.map +1 -0
  281. package/lib/typescript/date-field/useRangeDateFieldBridge.d.ts +4 -0
  282. package/lib/typescript/date-field/useRangeDateFieldBridge.d.ts.map +1 -0
  283. package/lib/typescript/date-picker/DatePickerRoot.d.ts +28 -0
  284. package/lib/typescript/date-picker/DatePickerRoot.d.ts.map +1 -0
  285. package/lib/typescript/date-picker/context.d.ts +25 -0
  286. package/lib/typescript/date-picker/context.d.ts.map +1 -0
  287. package/lib/typescript/date-picker/index.d.ts +5 -0
  288. package/lib/typescript/date-picker/index.d.ts.map +1 -0
  289. package/lib/typescript/date-range-picker/DateRangePickerRoot.d.ts +43 -0
  290. package/lib/typescript/date-range-picker/DateRangePickerRoot.d.ts.map +1 -0
  291. package/lib/typescript/date-range-picker/context.d.ts +42 -0
  292. package/lib/typescript/date-range-picker/context.d.ts.map +1 -0
  293. package/lib/typescript/date-range-picker/index.d.ts +4 -0
  294. package/lib/typescript/date-range-picker/index.d.ts.map +1 -0
  295. package/lib/typescript/date-time-field/DateTimeFieldHiddenInput.d.ts +4 -0
  296. package/lib/typescript/date-time-field/DateTimeFieldHiddenInput.d.ts.map +1 -0
  297. package/lib/typescript/date-time-field/DateTimeFieldInput.d.ts +10 -0
  298. package/lib/typescript/date-time-field/DateTimeFieldInput.d.ts.map +1 -0
  299. package/lib/typescript/date-time-field/DateTimeFieldRoot.d.ts +24 -0
  300. package/lib/typescript/date-time-field/DateTimeFieldRoot.d.ts.map +1 -0
  301. package/lib/typescript/date-time-field/DateTimeFieldSegment.d.ts +10 -0
  302. package/lib/typescript/date-time-field/DateTimeFieldSegment.d.ts.map +1 -0
  303. package/lib/typescript/date-time-field/context.d.ts +27 -0
  304. package/lib/typescript/date-time-field/context.d.ts.map +1 -0
  305. package/lib/typescript/date-time-field/index.d.ts +8 -0
  306. package/lib/typescript/date-time-field/index.d.ts.map +1 -0
  307. package/lib/typescript/date-time-field/useDateTimeFieldSegmentState.d.ts +26 -0
  308. package/lib/typescript/date-time-field/useDateTimeFieldSegmentState.d.ts.map +1 -0
  309. package/lib/typescript/date-time-list/DateTimeListRoot.d.ts +42 -0
  310. package/lib/typescript/date-time-list/DateTimeListRoot.d.ts.map +1 -0
  311. package/lib/typescript/date-time-list/context.d.ts +29 -0
  312. package/lib/typescript/date-time-list/context.d.ts.map +1 -0
  313. package/lib/typescript/date-time-list/index.d.ts +4 -0
  314. package/lib/typescript/date-time-list/index.d.ts.map +1 -0
  315. package/lib/typescript/date-time-picker/DateTimePickerRoot.d.ts +36 -0
  316. package/lib/typescript/date-time-picker/DateTimePickerRoot.d.ts.map +1 -0
  317. package/lib/typescript/date-time-picker/context.d.ts +25 -0
  318. package/lib/typescript/date-time-picker/context.d.ts.map +1 -0
  319. package/lib/typescript/date-time-picker/index.d.ts +4 -0
  320. package/lib/typescript/date-time-picker/index.d.ts.map +1 -0
  321. package/lib/typescript/dialog/types.d.ts +2 -1
  322. package/lib/typescript/dialog/types.d.ts.map +1 -1
  323. package/lib/typescript/index.d.ts +11 -2
  324. package/lib/typescript/index.d.ts.map +1 -1
  325. package/lib/typescript/month-calendar/MonthCalendarCell.d.ts +9 -0
  326. package/lib/typescript/month-calendar/MonthCalendarCell.d.ts.map +1 -0
  327. package/lib/typescript/month-calendar/MonthCalendarRoot.d.ts +30 -0
  328. package/lib/typescript/month-calendar/MonthCalendarRoot.d.ts.map +1 -0
  329. package/lib/typescript/month-calendar/MonthCalendarYearCell.d.ts +9 -0
  330. package/lib/typescript/month-calendar/MonthCalendarYearCell.d.ts.map +1 -0
  331. package/lib/typescript/month-calendar/context.d.ts +20 -0
  332. package/lib/typescript/month-calendar/context.d.ts.map +1 -0
  333. package/lib/typescript/month-calendar/index.d.ts +7 -0
  334. package/lib/typescript/month-calendar/index.d.ts.map +1 -0
  335. package/lib/typescript/month-picker/MonthPickerRoot.d.ts +29 -0
  336. package/lib/typescript/month-picker/MonthPickerRoot.d.ts.map +1 -0
  337. package/lib/typescript/month-picker/context.d.ts +23 -0
  338. package/lib/typescript/month-picker/context.d.ts.map +1 -0
  339. package/lib/typescript/month-picker/index.d.ts +4 -0
  340. package/lib/typescript/month-picker/index.d.ts.map +1 -0
  341. package/lib/typescript/overlay/useAnchorPosition.d.ts.map +1 -1
  342. package/lib/typescript/overlay/useDismissOverlay.web.d.ts.map +1 -1
  343. package/lib/typescript/overlay/useOverlayPosition.d.ts.map +1 -1
  344. package/lib/typescript/portal/portal.d.ts.map +1 -1
  345. package/lib/typescript/radio/RadioGroup.d.ts.map +1 -1
  346. package/lib/typescript/radio/RadioRoot.web.d.ts +8 -0
  347. package/lib/typescript/radio/RadioRoot.web.d.ts.map +1 -1
  348. package/lib/typescript/radio/context.d.ts +6 -1
  349. package/lib/typescript/radio/context.d.ts.map +1 -1
  350. package/lib/typescript/radio/types.d.ts +7 -0
  351. package/lib/typescript/radio/types.d.ts.map +1 -1
  352. package/lib/typescript/radio/useRadioGroupNavigation.d.ts +17 -0
  353. package/lib/typescript/radio/useRadioGroupNavigation.d.ts.map +1 -0
  354. package/lib/typescript/radio/useRadioRoot.d.ts +4 -18
  355. package/lib/typescript/radio/useRadioRoot.d.ts.map +1 -1
  356. package/lib/typescript/range-calendar/RangeCalendarRoot.d.ts +34 -0
  357. package/lib/typescript/range-calendar/RangeCalendarRoot.d.ts.map +1 -0
  358. package/lib/typescript/range-calendar/context.d.ts +26 -0
  359. package/lib/typescript/range-calendar/context.d.ts.map +1 -0
  360. package/lib/typescript/range-calendar/index.d.ts +5 -0
  361. package/lib/typescript/range-calendar/index.d.ts.map +1 -0
  362. package/lib/typescript/select/types.d.ts +2 -1
  363. package/lib/typescript/select/types.d.ts.map +1 -1
  364. package/lib/typescript/utils/accessibleLabel.d.ts +13 -0
  365. package/lib/typescript/utils/accessibleLabel.d.ts.map +1 -0
  366. package/lib/typescript/utils/createPortal.web.d.ts +17 -0
  367. package/lib/typescript/utils/createPortal.web.d.ts.map +1 -0
  368. package/package.json +3 -2
  369. package/src/calendar/CalendarGrid.tsx +29 -0
  370. package/src/calendar/CalendarRoot.tsx +138 -0
  371. package/src/calendar/context.tsx +28 -0
  372. package/src/calendar/index.ts +4 -0
  373. package/src/calendar/types.ts +30 -0
  374. package/src/checkbox/CheckboxRoot.web.tsx +105 -29
  375. package/src/checkbox/useCheckboxRoot.ts +37 -15
  376. package/src/date-field/DateFieldHiddenInput.tsx +152 -0
  377. package/src/date-field/DateFieldInput.tsx +138 -0
  378. package/src/date-field/DateFieldRoot.tsx +117 -0
  379. package/src/date-field/DateFieldSegment.tsx +97 -0
  380. package/src/date-field/context.tsx +48 -0
  381. package/src/date-field/index.ts +8 -0
  382. package/src/date-field/segmentIndex.tsx +17 -0
  383. package/src/date-field/segmentKeyboard.ts +207 -0
  384. package/src/date-field/types.ts +40 -0
  385. package/src/date-field/useDateFieldSegmentState.ts +455 -0
  386. package/src/date-field/useRangeDateFieldBridge.ts +78 -0
  387. package/src/date-picker/DatePickerRoot.tsx +186 -0
  388. package/src/date-picker/context.tsx +34 -0
  389. package/src/date-picker/index.ts +4 -0
  390. package/src/date-range-picker/DateRangePickerRoot.tsx +236 -0
  391. package/src/date-range-picker/context.tsx +48 -0
  392. package/src/date-range-picker/index.ts +8 -0
  393. package/src/date-time-field/DateTimeFieldHiddenInput.tsx +156 -0
  394. package/src/date-time-field/DateTimeFieldInput.tsx +119 -0
  395. package/src/date-time-field/DateTimeFieldRoot.tsx +209 -0
  396. package/src/date-time-field/DateTimeFieldSegment.tsx +95 -0
  397. package/src/date-time-field/context.tsx +41 -0
  398. package/src/date-time-field/index.ts +7 -0
  399. package/src/date-time-field/useDateTimeFieldSegmentState.ts +672 -0
  400. package/src/date-time-list/DateTimeListRoot.tsx +530 -0
  401. package/src/date-time-list/context.tsx +45 -0
  402. package/src/date-time-list/index.ts +16 -0
  403. package/src/date-time-picker/DateTimePickerRoot.tsx +210 -0
  404. package/src/date-time-picker/context.tsx +33 -0
  405. package/src/date-time-picker/index.ts +7 -0
  406. package/src/dialog/DialogRoot.tsx +1 -1
  407. package/src/dialog/types.ts +2 -1
  408. package/src/index.ts +21 -2
  409. package/src/month-calendar/MonthCalendarCell.tsx +53 -0
  410. package/src/month-calendar/MonthCalendarRoot.tsx +153 -0
  411. package/src/month-calendar/MonthCalendarYearCell.tsx +54 -0
  412. package/src/month-calendar/context.tsx +30 -0
  413. package/src/month-calendar/index.ts +6 -0
  414. package/src/month-picker/MonthPickerRoot.tsx +183 -0
  415. package/src/month-picker/context.tsx +31 -0
  416. package/src/month-picker/index.ts +3 -0
  417. package/src/overlay/useAnchorPosition.ts +25 -11
  418. package/src/overlay/useDismissOverlay.web.ts +10 -2
  419. package/src/overlay/useOverlayPosition.ts +5 -2
  420. package/src/portal/portal.tsx +79 -2
  421. package/src/radio/RadioGroup.tsx +84 -20
  422. package/src/radio/RadioRoot.web.tsx +136 -31
  423. package/src/radio/context.tsx +6 -1
  424. package/src/radio/types.ts +6 -0
  425. package/src/radio/useRadioGroupNavigation.ts +104 -0
  426. package/src/radio/useRadioRoot.ts +18 -11
  427. package/src/range-calendar/RangeCalendarRoot.tsx +213 -0
  428. package/src/range-calendar/context.tsx +33 -0
  429. package/src/range-calendar/index.ts +4 -0
  430. package/src/select/SelectRoot.tsx +1 -1
  431. package/src/select/types.ts +2 -1
  432. package/src/utils/accessibleLabel.ts +22 -0
  433. package/src/utils/createPortal.web.ts +18 -0
@@ -3,6 +3,7 @@
3
3
  import * as React from 'react';
4
4
  import { useEffect, useSyncExternalStore } from 'react';
5
5
  import { Platform } from 'react-native';
6
+ import { createPortalFn } from '../utils/createPortal';
6
7
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
7
8
  const DEFAULT_PORTAL_HOST = 'FORGE_UI_DEFAULT_HOST_NAME';
8
9
  const store = {
@@ -10,11 +11,53 @@ const store = {
10
11
  listeners: new Set()
11
12
  };
12
13
 
14
+ /** Tracks mounted PortalHost instances per host name — only the first mount renders portals. */
15
+ const hostStackStore = {
16
+ stacks: new Map(),
17
+ listeners: new Set()
18
+ };
19
+ let hasWarnedMultiplePortalHosts = false;
20
+
13
21
  // --------------------------------------------------
14
22
 
15
23
  function emit() {
16
24
  for (const cb of store.listeners) cb();
17
25
  }
26
+ function emitHostStack() {
27
+ for (const cb of hostStackStore.listeners) cb();
28
+ }
29
+ function getHostStackSnapshot() {
30
+ return hostStackStore.stacks;
31
+ }
32
+ function subscribeHostStack(cb) {
33
+ hostStackStore.listeners.add(cb);
34
+ return () => {
35
+ hostStackStore.listeners.delete(cb);
36
+ };
37
+ }
38
+ function pushPortalHost(name, id) {
39
+ const stacks = new Map(hostStackStore.stacks);
40
+ const stack = [...(stacks.get(name) ?? [])];
41
+ stack.push(id);
42
+ stacks.set(name, stack);
43
+ hostStackStore.stacks = stacks;
44
+ if (__DEV__ && !hasWarnedMultiplePortalHosts && stack.length > 1) {
45
+ hasWarnedMultiplePortalHosts = true;
46
+ console.warn('[Forge UI] Multiple PortalHost instances detected for the same host name. ' + 'Only the first mounted PortalHost renders portal content. ' + 'Mount a single PortalHost near your app root (ForgeDesignProvider does this automatically).');
47
+ }
48
+ emitHostStack();
49
+ }
50
+ function popPortalHost(name, id) {
51
+ const stacks = new Map(hostStackStore.stacks);
52
+ const stack = (stacks.get(name) ?? []).filter(entry => entry !== id);
53
+ stacks.set(name, stack);
54
+ hostStackStore.stacks = stacks;
55
+ emitHostStack();
56
+ }
57
+ function isActivePortalHost(name, id) {
58
+ const stack = hostStackStore.stacks.get(name) ?? [];
59
+ return stack.length > 0 && stack[0] === id;
60
+ }
18
61
  function getSnapshot() {
19
62
  return store.map;
20
63
  }
@@ -46,12 +89,26 @@ function removePortal(hostName, name) {
46
89
  export function PortalHost({
47
90
  name = DEFAULT_PORTAL_HOST
48
91
  }) {
92
+ const hostId = React.useRef(Symbol()).current;
93
+ useEffect(() => {
94
+ pushPortalHost(name, hostId);
95
+ return () => {
96
+ popPortalHost(name, hostId);
97
+ };
98
+ }, [name, hostId]);
99
+ useSyncExternalStore(subscribeHostStack, getHostStackSnapshot, getHostStackSnapshot);
49
100
  const map = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
50
101
  const portalMap = map.get(name) ?? new Map();
51
- if (portalMap.size === 0) return null;
52
- return /*#__PURE__*/_jsx(_Fragment, {
102
+ if (!isActivePortalHost(name, hostId) || portalMap.size === 0) {
103
+ return null;
104
+ }
105
+ const content = /*#__PURE__*/_jsx(_Fragment, {
53
106
  children: Array.from(portalMap.values())
54
107
  });
108
+ if (Platform.OS === 'web' && createPortalFn && typeof document !== 'undefined') {
109
+ return createPortalFn(content, document.body);
110
+ }
111
+ return content;
55
112
  }
56
113
 
57
114
  // --------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useSyncExternalStore","Platform","Fragment","_Fragment","jsx","_jsx","DEFAULT_PORTAL_HOST","store","map","Map","set","listeners","Set","emit","cb","getSnapshot","subscribe","add","delete","updatePortal","hostName","name","children","next","portal","get","removePortal","PortalHost","portalMap","size","Array","from","values","Portal","ROOT","flex","useModalPortalRoot","ref","useRef","offset","setSideOffSet","useState","onLayout","useCallback","OS","current","measure","_x","_y","_width","_height","_pageX","pageY","style"],"sourceRoot":"../../../src","sources":["portal/portal.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useSyncExternalStore","Platform","createPortalFn","Fragment","_Fragment","jsx","_jsx","DEFAULT_PORTAL_HOST","store","map","Map","set","listeners","Set","hostStackStore","stacks","hasWarnedMultiplePortalHosts","emit","cb","emitHostStack","getHostStackSnapshot","subscribeHostStack","add","delete","pushPortalHost","name","id","stack","get","push","__DEV__","length","console","warn","popPortalHost","filter","entry","isActivePortalHost","getSnapshot","subscribe","updatePortal","hostName","children","next","portal","removePortal","PortalHost","hostId","useRef","Symbol","current","portalMap","size","content","Array","from","values","OS","document","body","Portal","ROOT","flex","useModalPortalRoot","ref","offset","setSideOffSet","useState","onLayout","useCallback","measure","_x","_y","_width","_height","_pageX","pageY","style"],"sourceRoot":"../../../src","sources":["portal/portal.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
 
3
- import { forwardRef } from 'react';
4
- import { View } from 'react-native';
5
- import { useFormControlContext } from '@cdx-ui/utils';
3
+ import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
4
+ import { Platform, View } from 'react-native';
5
+ import { composeEventHandlers, useFormControl } from '@cdx-ui/utils';
6
6
  import { useRadioGroup } from '@react-native-aria/radio';
7
7
  import { useRadioGroupState } from '@react-stately/radio';
8
8
  import { Slot } from '../slot';
9
9
  import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
10
10
  import { RadioGroupContext } from './context';
11
+ import { useRadioGroupNavigation } from './useRadioGroupNavigation';
11
12
  import { jsx as _jsx } from "react/jsx-runtime";
12
13
  export const RadioGroup = /*#__PURE__*/forwardRef(({
13
14
  asChild,
@@ -16,25 +17,66 @@ export const RadioGroup = /*#__PURE__*/forwardRef(({
16
17
  style,
17
18
  ...props
18
19
  }, ref) => {
19
- const formControlContext = useFormControlContext();
20
- const combinedProps = {
21
- ...formControlContext,
22
- ...props
23
- };
20
+ const formControlProps = useFormControl({
21
+ isDisabled: props.isDisabled,
22
+ isRequired: props.isRequired,
23
+ isInvalid: props.isInvalid,
24
+ isReadOnly: props.isReadOnly
25
+ });
26
+ const isDisabled = props.isDisabled ?? Boolean(formControlProps.disabled);
27
+ const isInvalid = props.isInvalid ?? Boolean(formControlProps['aria-invalid']);
28
+ const isRequired = props.isRequired ?? Boolean(formControlProps.required);
29
+ const isReadOnly = props.isReadOnly ?? Boolean(formControlProps.readOnly);
30
+ const name = props.name ?? formControlProps.name;
31
+ const ariaLabel = props['aria-label'];
32
+ const ariaLabelledBy = props['aria-labelledby'] ?? formControlProps['aria-labelledby'];
33
+ const ariaDescribedBy = formControlProps['aria-describedby'];
24
34
  const radioGroupState = useRadioGroupState({
25
- ...combinedProps,
26
- validationState: combinedProps.isInvalid ? 'invalid' : 'valid'
35
+ name,
36
+ value: props.value,
37
+ defaultValue: props.defaultValue,
38
+ onChange: props.onChange,
39
+ isDisabled,
40
+ isInvalid,
41
+ isRequired,
42
+ isReadOnly,
43
+ validationState: isInvalid ? 'invalid' : 'valid'
27
44
  });
28
45
  const {
29
46
  radioGroupProps
30
47
  } = useRadioGroup({
31
- ...combinedProps,
32
- 'aria-label': combinedProps['aria-label']
48
+ 'aria-label': ariaLabel,
49
+ 'aria-labelledby': ariaLabelledBy,
50
+ isDisabled
33
51
  }, radioGroupState);
34
- const isDisabled = combinedProps.isDisabled ?? false;
35
- const isInvalid = combinedProps.isInvalid ?? false;
36
- const isRequired = combinedProps.isRequired ?? false;
37
- const isReadOnly = combinedProps.isReadOnly ?? false;
52
+ const [focusedValue, setFocusedValue] = useState(undefined);
53
+ // Identity of getRadios depends on this so roving tabIndex recomputes after register/unregister.
54
+ const [registrationEpoch, setRegistrationEpoch] = useState(0);
55
+ const radiosRef = useRef(new Map());
56
+ useEffect(() => {
57
+ setFocusedValue(prev => prev !== undefined && prev !== radioGroupState.selectedValue ? undefined : prev);
58
+ }, [radioGroupState.selectedValue]);
59
+ const registerRadio = useCallback((value, entry) => {
60
+ radiosRef.current.set(value, entry);
61
+ setRegistrationEpoch(epoch => epoch + 1);
62
+ }, []);
63
+ const unregisterRadio = useCallback(value => {
64
+ radiosRef.current.delete(value);
65
+ setRegistrationEpoch(epoch => epoch + 1);
66
+ }, []);
67
+ const getRadios = useCallback(() => Array.from(radiosRef.current.entries()), [registrationEpoch]);
68
+ const {
69
+ handleKeyDown
70
+ } = useRadioGroupNavigation({
71
+ getRadios,
72
+ focusedValue,
73
+ setFocusedValue,
74
+ selectedValue: radioGroupState.selectedValue,
75
+ selectValue: value => radioGroupState.setSelectedValue(value)
76
+ });
77
+ const webProps = Platform.OS === 'web' ? {
78
+ onKeyDown: composeEventHandlers(props.onKeyDown, handleKeyDown)
79
+ } : {};
38
80
  const Comp = asChild ? Slot : View;
39
81
  return /*#__PURE__*/_jsx(RadioGroupContext.Provider, {
40
82
  value: {
@@ -47,17 +89,24 @@ export const RadioGroup = /*#__PURE__*/forwardRef(({
47
89
  selectValue: value => radioGroupState.setSelectedValue(value)
48
90
  },
49
91
  radioGroupState,
50
- name: combinedProps.name
92
+ name,
93
+ focusedValue,
94
+ setFocusedValue,
95
+ registerRadio,
96
+ unregisterRadio,
97
+ getRadios
51
98
  },
52
99
  children: /*#__PURE__*/_jsx(Comp, {
53
100
  ...radioGroupProps,
54
- "aria-label": combinedProps['aria-label'],
55
- "aria-labelledby": combinedProps['aria-labelledby'],
101
+ "aria-label": ariaLabel,
102
+ "aria-labelledby": ariaLabelledBy,
103
+ "aria-describedby": ariaDescribedBy,
56
104
  "aria-required": isRequired || undefined,
57
105
  "aria-readonly": isReadOnly || undefined,
58
106
  className: className,
59
107
  style: style,
60
108
  ref: ref,
109
+ ...webProps,
61
110
  ...mergeDataAttributes(props, dataAttributes({
62
111
  disabled: isDisabled,
63
112
  invalid: isInvalid
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","View","useFormControlContext","useRadioGroup","useRadioGroupState","Slot","dataAttributes","mergeDataAttributes","RadioGroupContext","jsx","_jsx","RadioGroup","asChild","children","className","style","props","ref","formControlContext","combinedProps","radioGroupState","validationState","isInvalid","radioGroupProps","isDisabled","isRequired","isReadOnly","Comp","Provider","value","state","isSelected","selectedValue","selectValue","setSelectedValue","name","undefined","disabled","invalid","displayName"],"sourceRoot":"../../../src","sources":["radio/RadioGroup.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,IAAI,QAAwB,cAAc;AACnD,SAASC,qBAAqB,QAAQ,eAAe;AACrD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,kBAAkB,QAAQ,sBAAsB;AACzD,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,cAAc,EAAEC,mBAAmB,QAAQ,yBAAyB;AAC7E,SAASC,iBAAiB,QAAQ,WAAW;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAS9C,OAAO,MAAMC,UAAU,gBAAGX,UAAU,CAClC,CAAC;EAAEY,OAAO;EAAEC,QAAQ;EAAEC,SAAS;EAAEC,KAAK;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EAC1D,MAAMC,kBAAkB,GAAGhB,qBAAqB,CAAC,CAAC;EAElD,MAAMiB,aAAa,GAAG;IACpB,GAAGD,kBAAkB;IACrB,GAAGF;EACL,CAAC;EAED,MAAMI,eAAe,GAAGhB,kBAAkB,CAAC;IACzC,GAAGe,aAAa;IAChBE,eAAe,EAAEF,aAAa,CAACG,SAAS,GAAG,SAAS,GAAG;EACzD,CAAC,CAAC;EAEF,MAAM;IAAEC;EAAgB,CAAC,GAAGpB,aAAa,CACvC;IACE,GAAGgB,aAAa;IAChB,YAAY,EAAEA,aAAa,CAAC,YAAY;EAC1C,CAAC,EACDC,eACF,CAAC;EAED,MAAMI,UAAU,GAAGL,aAAa,CAACK,UAAU,IAAI,KAAK;EACpD,MAAMF,SAAS,GAAGH,aAAa,CAACG,SAAS,IAAI,KAAK;EAClD,MAAMG,UAAU,GAAGN,aAAa,CAACM,UAAU,IAAI,KAAK;EACpD,MAAMC,UAAU,GAAGP,aAAa,CAACO,UAAU,IAAI,KAAK;EAEpD,MAAMC,IAAI,GAAGf,OAAO,GAAGP,IAAI,GAAGJ,IAAI;EAElC,oBACES,IAAA,CAACF,iBAAiB,CAACoB,QAAQ;IACzBC,KAAK,EAAE;MACLC,KAAK,EAAE;QACLN,UAAU;QACVF,SAAS;QACTG,UAAU;QACVC,UAAU;QACVK,UAAU,EAAGF,KAAa,IAAKT,eAAe,CAACY,aAAa,KAAKH,KAAK;QACtEI,WAAW,EAAGJ,KAAa,IAAKT,eAAe,CAACc,gBAAgB,CAACL,KAAK;MACxE,CAAC;MACDT,eAAe;MACfe,IAAI,EAAEhB,aAAa,CAACgB;IACtB,CAAE;IAAAtB,QAAA,eAEFH,IAAA,CAACiB,IAAI;MAAA,GACCJ,eAAe;MACnB,cAAYJ,aAAa,CAAC,YAAY,CAAE;MACxC,mBAAiBA,aAAa,CAAC,iBAAiB,CAAE;MAClD,iBAAeM,UAAU,IAAIW,SAAU;MACvC,iBAAeV,UAAU,IAAIU,SAAU;MACvCtB,SAAS,EAAEA,SAAU;MACrBC,KAAK,EAAEA,KAAM;MACbE,GAAG,EAAEA,GAAI;MAAA,GACLV,mBAAmB,CACrBS,KAAK,EACLV,cAAc,CAAC;QACb+B,QAAQ,EAAEb,UAAU;QACpBc,OAAO,EAAEhB;MACX,CAAC,CACH,CAAC;MAAAT,QAAA,EAEAA;IAAQ,CACL;EAAC,CACmB,CAAC;AAEjC,CACF,CAAC;AAEDF,UAAU,CAAC4B,WAAW,GAAG,YAAY","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useCallback","useEffect","useRef","useState","Platform","View","composeEventHandlers","useFormControl","useRadioGroup","useRadioGroupState","Slot","dataAttributes","mergeDataAttributes","RadioGroupContext","useRadioGroupNavigation","jsx","_jsx","RadioGroup","asChild","children","className","style","props","ref","formControlProps","isDisabled","isRequired","isInvalid","isReadOnly","Boolean","disabled","required","readOnly","name","ariaLabel","ariaLabelledBy","ariaDescribedBy","radioGroupState","value","defaultValue","onChange","validationState","radioGroupProps","focusedValue","setFocusedValue","undefined","registrationEpoch","setRegistrationEpoch","radiosRef","Map","prev","selectedValue","registerRadio","entry","current","set","epoch","unregisterRadio","delete","getRadios","Array","from","entries","handleKeyDown","selectValue","setSelectedValue","webProps","OS","onKeyDown","Comp","Provider","state","isSelected","invalid","displayName"],"sourceRoot":"../../../src","sources":["radio/RadioGroup.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,17 +1,24 @@
1
1
  "use strict";
2
2
 
3
- import { forwardRef } from 'react';
3
+ import { forwardRef, useContext, useEffect, useMemo, useRef } from 'react';
4
4
  import { Pressable } from 'react-native';
5
5
  import { VisuallyHidden } from '@react-aria/visually-hidden';
6
- import { mergeProps } from '@react-aria/utils';
6
+ import { composeEventHandlers, mergeRefs } from '@cdx-ui/utils';
7
7
  import { useFocusRing } from '@react-native-aria/focus';
8
8
  import { Slot } from '../slot';
9
9
  import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
10
- import { RadioProvider } from './context';
10
+ import { RadioGroupContext, RadioProvider } from './context';
11
11
  import { useRadioRoot } from './useRadioRoot';
12
-
13
- // TODO: Keyboard focus is not working as expected
14
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ import { getRovingFocusValue } from './useRadioGroupNavigation';
13
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
14
+ /**
15
+ * Web Radio root.
16
+ *
17
+ * On web, `@react-native-aria/radio` re-exports `@react-aria/radio`'s `useRadio`,
18
+ * whose `inputProps` target a native `<input type="radio">` (selection via
19
+ * `onChange`). Selection must be applied explicitly on the Pressable —
20
+ * `inputProps.onPress` does **not** call `setSelectedValue`.
21
+ */
15
22
  export const RadioRoot = /*#__PURE__*/forwardRef(({
16
23
  asChild,
17
24
  children,
@@ -26,12 +33,12 @@ export const RadioRoot = /*#__PURE__*/forwardRef(({
26
33
  isFocused,
27
34
  isPressed
28
35
  } = props;
36
+ const radioGroupContext = useContext(RadioGroupContext);
29
37
  const {
30
38
  combinedProps,
31
39
  isInvalid,
32
40
  isReadOnly,
33
41
  inputProps,
34
- labelProps,
35
42
  isChecked,
36
43
  isDisabled,
37
44
  isHovered,
@@ -44,42 +51,123 @@ export const RadioRoot = /*#__PURE__*/forwardRef(({
44
51
  focusProps,
45
52
  isFocusVisible
46
53
  } = useFocusRing();
54
+ const nodeRef = useRef(null);
55
+ const setRefs = mergeRefs(mergedRef, nodeRef);
56
+
57
+ // Strip native-input / internal props — they must not land on Pressable.
58
+ const {
59
+ onPress: _onPress,
60
+ onChange: _onChange,
61
+ role: _role,
62
+ tabIndex: _tabIndex,
63
+ disabled: _disabled,
64
+ checked: _checked,
65
+ value: _value,
66
+ type: _type,
67
+ name: _name,
68
+ form: _form,
69
+ required: _required,
70
+ ...inputAriaProps
71
+ } = inputProps;
72
+ const resolvedDisabled = !!(isDisabled || isDisabledProp);
73
+ const resolvedReadOnly = !!(isReadOnly || isReadOnlyProp);
74
+ const selectThis = () => {
75
+ if (resolvedDisabled || resolvedReadOnly) {
76
+ return;
77
+ }
78
+ radioGroupContext?.radioGroupState.setSelectedValue(combinedProps.value);
79
+ };
80
+ const selectedValue = radioGroupContext?.radioGroupState.selectedValue;
81
+ const focusedValue = radioGroupContext?.focusedValue;
82
+ const registerRadio = radioGroupContext?.registerRadio;
83
+ const unregisterRadio = radioGroupContext?.unregisterRadio;
84
+ const getRadios = radioGroupContext?.getRadios;
85
+ const groupName = radioGroupContext?.name;
86
+ useEffect(() => {
87
+ if (!registerRadio || !unregisterRadio) {
88
+ return;
89
+ }
90
+ registerRadio(combinedProps.value, {
91
+ disabled: !!resolvedDisabled,
92
+ node: nodeRef.current
93
+ });
94
+ return () => unregisterRadio(combinedProps.value);
95
+ }, [combinedProps.value, resolvedDisabled, registerRadio, unregisterRadio]);
96
+ const isRovingTabStop = useMemo(() => {
97
+ if (resolvedDisabled) {
98
+ return false;
99
+ }
100
+ const enabledRadios = getRadios?.().filter(([, entry]) => !entry.disabled) ?? [];
101
+ const rovingValue = getRovingFocusValue(focusedValue, selectedValue, enabledRadios);
102
+ return combinedProps.value === rovingValue;
103
+ }, [combinedProps.value, focusedValue, getRadios, resolvedDisabled, selectedValue]);
104
+ const handleKeyDown = event => {
105
+ if (event.key === ' ' || event.key === 'Spacebar') {
106
+ event.preventDefault();
107
+ selectThis();
108
+ }
109
+ };
47
110
  const contextValue = {
48
111
  isChecked,
49
- isDisabled: isDisabled || isDisabledProp,
112
+ isDisabled: resolvedDisabled,
50
113
  isFocusVisible: isFocusVisible || isFocusVisibleProp,
51
114
  isHovered: isHovered || isHoveredProp,
52
115
  isInvalid: isInvalid || isInvalidProp,
53
- isReadOnly: isReadOnly || isReadOnlyProp,
116
+ isReadOnly: resolvedReadOnly,
54
117
  isPressed,
55
118
  isFocused
56
119
  };
57
120
  const Comp = asChild ? Slot : Pressable;
58
121
  return /*#__PURE__*/_jsx(RadioProvider, {
59
122
  value: contextValue,
60
- children: /*#__PURE__*/_jsxs(Comp, {
61
- ...mergeProps(combinedProps, labelProps, focusProps),
62
- ref: mergedRef,
63
- role: "label"
64
- // eslint-disable-next-line react-native-a11y/has-valid-accessibility-role
65
- ,
66
- accessibilityRole: "label",
67
- ...mergeDataAttributes(props, dataAttributes({
68
- checked: isChecked,
69
- disabled: isDisabled || isDisabledProp,
70
- hover: isHovered || isHoveredProp,
71
- invalid: isInvalid || isInvalidProp,
72
- readonly: isReadOnly || isReadOnlyProp,
73
- active: isPressed,
74
- focus: isFocused,
75
- focusVisible: isFocusVisible || isFocusVisibleProp
76
- })),
123
+ children: /*#__PURE__*/_jsxs(_Fragment, {
77
124
  children: [/*#__PURE__*/_jsx(VisuallyHidden, {
78
125
  children: /*#__PURE__*/_jsx("input", {
79
- ...inputProps,
80
- ref: inputRef
126
+ ref: inputRef,
127
+ type: "radio",
128
+ name: groupName,
129
+ value: combinedProps.value,
130
+ checked: !!isChecked,
131
+ disabled: resolvedDisabled,
132
+ tabIndex: -1,
133
+ "aria-hidden": true,
134
+ readOnly: true
135
+ // Decorative form mirror — pointer events must not steal clicks from Pressable.
136
+ ,
137
+ style: {
138
+ pointerEvents: 'none'
139
+ }
81
140
  })
82
- }), children]
141
+ }), /*#__PURE__*/_jsx(Comp, {
142
+ ...combinedProps,
143
+ ...inputAriaProps,
144
+ ref: setRefs,
145
+ role: "radio",
146
+ "aria-checked": isChecked,
147
+ "aria-disabled": resolvedDisabled || undefined,
148
+ accessibilityRole: "radio",
149
+ accessibilityState: {
150
+ checked: isChecked,
151
+ disabled: resolvedDisabled
152
+ },
153
+ tabIndex: resolvedDisabled ? -1 : isRovingTabStop ? 0 : -1,
154
+ disabled: resolvedDisabled,
155
+ ...focusProps,
156
+ onPress: selectThis,
157
+ onClick: selectThis,
158
+ onKeyDown: composeEventHandlers(combinedProps.onKeyDown, handleKeyDown),
159
+ ...mergeDataAttributes(props, dataAttributes({
160
+ checked: isChecked,
161
+ disabled: resolvedDisabled,
162
+ hover: isHovered || isHoveredProp,
163
+ invalid: isInvalid || isInvalidProp,
164
+ readonly: resolvedReadOnly,
165
+ active: isPressed,
166
+ focus: isFocused,
167
+ focusVisible: isFocusVisible || isFocusVisibleProp
168
+ })),
169
+ children: children
170
+ })]
83
171
  })
84
172
  });
85
173
  });
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","Pressable","VisuallyHidden","mergeProps","useFocusRing","Slot","dataAttributes","mergeDataAttributes","RadioProvider","useRadioRoot","jsx","_jsx","jsxs","_jsxs","RadioRoot","asChild","children","props","ref","isHovered","isHoveredProp","isFocusVisible","isFocusVisibleProp","isDisabled","isDisabledProp","isInvalid","isInvalidProp","isReadOnly","isReadOnlyProp","isFocused","isPressed","combinedProps","inputProps","labelProps","isChecked","mergedRef","inputRef","useInputRefForAria","focusProps","contextValue","Comp","value","role","accessibilityRole","checked","disabled","hover","invalid","readonly","active","focus","focusVisible","displayName"],"sourceRoot":"../../../src","sources":["radio/RadioRoot.web.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,SAASC,SAAS,QAAQ,cAAc;AACxC,SAASC,cAAc,QAAQ,6BAA6B;AAC5D,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,cAAc,EAAEC,mBAAmB,QAAQ,yBAAyB;AAC7E,SAASC,aAAa,QAAQ,WAAW;AAEzC,SAASC,YAAY,QAAQ,gBAAgB;;AAE7C;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAMA,OAAO,MAAMC,SAAS,gBAAGd,UAAU,CACjC,CAAC;EAAEe,OAAO;EAAEC,QAAQ;EAAE,GAAGC;AAAM,CAAC,EAAEC,GAAG,KAAK;EACxC,MAAM;IACJC,SAAS,EAAEC,aAAa;IACxBC,cAAc,EAAEC,kBAAkB;IAClCC,UAAU,EAAEC,cAAc;IAC1BC,SAAS,EAAEC,aAAa;IACxBC,UAAU,EAAEC,cAAc;IAC1BC,SAAS;IACTC;EACF,CAAC,GAAGb,KAAK;EAET,MAAM;IACJc,aAAa;IACbN,SAAS;IACTE,UAAU;IACVK,UAAU;IACVC,UAAU;IACVC,SAAS;IACTX,UAAU;IACVJ,SAAS;IACTgB,SAAS;IACTC;EACF,CAAC,GAAG3B,YAAY,CAACQ,KAAK,EAAEC,GAAG,EAAE;IAAEmB,kBAAkB,EAAE;EAAK,CAAC,CAAC;EAE1D,MAAM;IAAEC,UAAU;IAAEjB;EAAe,CAAC,GAAGjB,YAAY,CAAC,CAAC;EAErD,MAAMmC,YAAgC,GAAG;IACvCL,SAAS;IACTX,UAAU,EAAEA,UAAU,IAAIC,cAAc;IACxCH,cAAc,EAAEA,cAAc,IAAIC,kBAAkB;IACpDH,SAAS,EAAEA,SAAS,IAAIC,aAAa;IACrCK,SAAS,EAAEA,SAAS,IAAIC,aAAa;IACrCC,UAAU,EAAEA,UAAU,IAAIC,cAAc;IACxCE,SAAS;IACTD;EACF,CAAC;EAED,MAAMW,IAAI,GAAGzB,OAAO,GAAGV,IAAI,GAAGJ,SAAS;EAEvC,oBACEU,IAAA,CAACH,aAAa;IAACiC,KAAK,EAAEF,YAAa;IAAAvB,QAAA,eACjCH,KAAA,CAAC2B,IAAI;MAAA,GACCrC,UAAU,CAAC4B,aAAa,EAASE,UAAU,EAASK,UAAiB,CAAC;MAC1EpB,GAAG,EAAEiB,SAAU;MACfO,IAAI,EAAC;MACL;MAAA;MACAC,iBAAiB,EAAC,OAAO;MAAA,GACrBpC,mBAAmB,CACrBU,KAAK,EACLX,cAAc,CAAC;QACbsC,OAAO,EAAEV,SAAS;QAClBW,QAAQ,EAAEtB,UAAU,IAAIC,cAAc;QACtCsB,KAAK,EAAE3B,SAAS,IAAIC,aAAa;QACjC2B,OAAO,EAAEtB,SAAS,IAAIC,aAAa;QACnCsB,QAAQ,EAAErB,UAAU,IAAIC,cAAc;QACtCqB,MAAM,EAAEnB,SAAS;QACjBoB,KAAK,EAAErB,SAAS;QAChBsB,YAAY,EAAE9B,cAAc,IAAIC;MAClC,CAAC,CACH,CAAC;MAAAN,QAAA,gBAEDL,IAAA,CAACT,cAAc;QAAAc,QAAA,eACbL,IAAA;UAAA,GAAWqB,UAAU;UAAEd,GAAG,EAAEkB;QAAS,CAAE;MAAC,CAC1B,CAAC,EAChBpB,QAAQ;IAAA,CACL;EAAC,CACM,CAAC;AAEpB,CACF,CAAC;AAEDF,SAAS,CAACsC,WAAW,GAAG,WAAW","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useContext","useEffect","useMemo","useRef","Pressable","VisuallyHidden","composeEventHandlers","mergeRefs","useFocusRing","Slot","dataAttributes","mergeDataAttributes","RadioGroupContext","RadioProvider","useRadioRoot","getRovingFocusValue","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","RadioRoot","asChild","children","props","ref","isHovered","isHoveredProp","isFocusVisible","isFocusVisibleProp","isDisabled","isDisabledProp","isInvalid","isInvalidProp","isReadOnly","isReadOnlyProp","isFocused","isPressed","radioGroupContext","combinedProps","inputProps","isChecked","mergedRef","inputRef","useInputRefForAria","focusProps","nodeRef","setRefs","onPress","_onPress","onChange","_onChange","role","_role","tabIndex","_tabIndex","disabled","_disabled","checked","_checked","value","_value","type","_type","name","_name","form","_form","required","_required","inputAriaProps","resolvedDisabled","resolvedReadOnly","selectThis","radioGroupState","setSelectedValue","selectedValue","focusedValue","registerRadio","unregisterRadio","getRadios","groupName","node","current","isRovingTabStop","enabledRadios","filter","entry","rovingValue","handleKeyDown","event","key","preventDefault","contextValue","Comp","readOnly","style","pointerEvents","undefined","accessibilityRole","accessibilityState","onClick","onKeyDown","hover","invalid","readonly","active","focus","focusVisible","displayName"],"sourceRoot":"../../../src","sources":["radio/RadioRoot.web.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["React","createContext","RadioProvider","useRadioContext","RadioGroupContext"],"sourceRoot":"../../../src","sources":["radio/context.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,aAAa,QAAQ,eAAe;AAI7C,OAAO,MAAM,CAACC,aAAa,EAAEC,eAAe,CAAC,GAAGF,aAAa,CAAqB,cAAc,CAAC;AAWjG,OAAO,MAAMG,iBAAiB,gBAAGJ,KAAK,CAACC,aAAa,CAI1C,IAAI,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","createContext","RadioProvider","useRadioContext","RadioGroupContext"],"sourceRoot":"../../../src","sources":["radio/context.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,aAAa,QAAQ,eAAe;AAI7C,OAAO,MAAM,CAACC,aAAa,EAAEC,eAAe,CAAC,GAAGF,aAAa,CAAqB,cAAc,CAAC;AAWjG,OAAO,MAAMG,iBAAiB,gBAAGJ,KAAK,CAACC,aAAa,CAS1C,IAAI,CAAC","ignoreList":[]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useRef } from 'react';
4
+ // Web-only — native platforms rely on OS-managed sequential focus (VoiceOver/TalkBack).
5
+
6
+ function isEnabledRadioValue(value, enabledRadios) {
7
+ return value != null && enabledRadios.some(([radioValue]) => radioValue === value);
8
+ }
9
+
10
+ /** Resolves which radio value should hold the roving tab stop / keyboard focus anchor. */
11
+ export function getRovingFocusValue(focusedValue, selectedValue, enabledRadios) {
12
+ const defaultFocusValue = isEnabledRadioValue(selectedValue, enabledRadios) ? selectedValue : enabledRadios[0]?.[0];
13
+ const resolvedFocusedValue = isEnabledRadioValue(focusedValue, enabledRadios) ? focusedValue : undefined;
14
+ return resolvedFocusedValue ?? defaultFocusValue;
15
+ }
16
+ export function useRadioGroupNavigation({
17
+ getRadios,
18
+ focusedValue,
19
+ setFocusedValue,
20
+ selectedValue,
21
+ selectValue
22
+ }) {
23
+ const selectValueRef = useRef(selectValue);
24
+ selectValueRef.current = selectValue;
25
+ const getEnabledRadios = useCallback(() => getRadios().filter(([, entry]) => !entry.disabled), [getRadios]);
26
+ const moveFocus = useCallback(([targetValue, targetEntry]) => {
27
+ setFocusedValue(targetValue);
28
+ targetEntry.node?.focus?.();
29
+ selectValueRef.current(targetValue);
30
+ }, [setFocusedValue]);
31
+ const handleKeyDown = useCallback(e => {
32
+ const enabledRadios = getEnabledRadios();
33
+ if (enabledRadios.length === 0) {
34
+ return;
35
+ }
36
+ const currentValue = getRovingFocusValue(focusedValue, selectedValue, enabledRadios);
37
+ const idx = enabledRadios.findIndex(([value]) => value === currentValue);
38
+ switch (e.key) {
39
+ case 'ArrowDown':
40
+ case 'ArrowRight':
41
+ {
42
+ e.preventDefault();
43
+ moveFocus(enabledRadios[idx < enabledRadios.length - 1 ? idx + 1 : 0]);
44
+ break;
45
+ }
46
+ case 'ArrowUp':
47
+ case 'ArrowLeft':
48
+ {
49
+ e.preventDefault();
50
+ moveFocus(enabledRadios[idx > 0 ? idx - 1 : enabledRadios.length - 1]);
51
+ break;
52
+ }
53
+ case 'Home':
54
+ {
55
+ e.preventDefault();
56
+ moveFocus(enabledRadios[0]);
57
+ break;
58
+ }
59
+ case 'End':
60
+ {
61
+ e.preventDefault();
62
+ const last = enabledRadios.at(-1);
63
+ if (last) {
64
+ moveFocus(last);
65
+ }
66
+ break;
67
+ }
68
+ }
69
+ }, [focusedValue, selectedValue, getEnabledRadios, moveFocus]);
70
+ return {
71
+ handleKeyDown
72
+ };
73
+ }
74
+ //# sourceMappingURL=useRadioGroupNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","isEnabledRadioValue","value","enabledRadios","some","radioValue","getRovingFocusValue","focusedValue","selectedValue","defaultFocusValue","resolvedFocusedValue","undefined","useRadioGroupNavigation","getRadios","setFocusedValue","selectValue","selectValueRef","current","getEnabledRadios","filter","entry","disabled","moveFocus","targetValue","targetEntry","node","focus","handleKeyDown","e","length","currentValue","idx","findIndex","key","preventDefault","last","at"],"sourceRoot":"../../../src","sources":["radio/useRadioGroupNavigation.ts"],"mappings":"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","ignoreList":[]}
@@ -9,27 +9,28 @@ export function useRadioRoot(props, ref, {
9
9
  useInputRefForAria = false
10
10
  } = {}) {
11
11
  const formControlContext = useFormControlContext();
12
- const {
13
- isInvalid,
14
- isReadOnly,
15
- ...combinedProps
16
- } = {
17
- ...formControlContext,
18
- ...props
19
- };
20
12
  const radioGroupContext = useContext(RadioGroupContext);
21
13
  if (!radioGroupContext) {
22
14
  throw new Error('Radio must be rendered inside a Radio.Group. Standalone Radio is not supported.');
23
15
  }
16
+ const isInvalid = props.isInvalid ?? formControlContext.isInvalid;
17
+ const isReadOnly = props.isReadOnly ?? formControlContext.isReadOnly ?? radioGroupContext.state.isReadOnly;
18
+ const isDisabled = props.isDisabled ?? formControlContext.isDisabled ?? radioGroupContext.state.isDisabled;
19
+ const combinedProps = {
20
+ ...props,
21
+ isInvalid,
22
+ isReadOnly,
23
+ isDisabled
24
+ };
24
25
  const rootRef = useRef(null);
25
26
  const inputRef = useRef(null);
26
27
  const mergedRootRef = mergeRefs(ref, rootRef);
27
- const ariaLabel = combinedProps['aria-label'] || combinedProps.value || 'Radio';
28
+ const ariaLabel = props['aria-label'] || props.value || 'Radio';
28
29
  const radio = useRadio({
29
30
  ...combinedProps,
30
31
  'aria-label': ariaLabel,
31
- isReadOnly: isReadOnly || radioGroupContext.state.isReadOnly,
32
- isDisabled: combinedProps.isDisabled || radioGroupContext.state.isDisabled
32
+ isReadOnly,
33
+ isDisabled
33
34
  }, radioGroupContext.radioGroupState, useInputRefForAria ? inputRef : rootRef);
34
35
  const {
35
36
  inputProps,
@@ -37,7 +38,7 @@ export function useRadioRoot(props, ref, {
37
38
  } = radio;
38
39
  const {
39
40
  checked: isChecked,
40
- disabled: isDisabled
41
+ disabled: isDisabledFromInput
41
42
  } = inputProps;
42
43
  const {
43
44
  hoverProps,
@@ -50,7 +51,7 @@ export function useRadioRoot(props, ref, {
50
51
  inputProps,
51
52
  labelProps: labelProps ?? {},
52
53
  isChecked,
53
- isDisabled,
54
+ isDisabled: isDisabledFromInput,
54
55
  isHovered,
55
56
  hoverProps,
56
57
  mergedRef: mergedRootRef,