@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
@@ -0,0 +1,34 @@
1
+ import { createContext, useContext, type RefObject } from 'react';
2
+ import type { View } from 'react-native';
3
+ import type { DateComponentLabels, DateId } from '@cdx-ui/formatters';
4
+
5
+ export type PickerSurfaceType = 'popover' | 'dialog' | 'bottomSheet';
6
+
7
+ export interface DatePickerContextValue {
8
+ value?: DateId;
9
+ onValueChange?: (value: DateId | undefined) => void;
10
+ draftValue?: DateId;
11
+ setDraftValue: (value: DateId | undefined) => void;
12
+ open: boolean;
13
+ setOpen: (open: boolean) => void;
14
+ disabled: boolean;
15
+ minValue?: DateId;
16
+ maxValue?: DateId;
17
+ locale: string;
18
+ labels: DateComponentLabels;
19
+ registerSurface: (type: PickerSurfaceType) => void;
20
+ /** Measured anchor for popover placement (picker root view). */
21
+ anchorRef: RefObject<View | null>;
22
+ /** Trigger element — excluded from outside-dismiss handling. */
23
+ triggerRef: RefObject<View | null>;
24
+ }
25
+
26
+ export const DatePickerContext = createContext<DatePickerContextValue | null>(null);
27
+
28
+ export function useDatePickerContext(): DatePickerContextValue {
29
+ const ctx = useContext(DatePickerContext);
30
+ if (!ctx) {
31
+ throw new Error('DatePicker compound components must be used within DatePickerRoot');
32
+ }
33
+ return ctx;
34
+ }
@@ -0,0 +1,4 @@
1
+ export { DatePickerRoot } from './DatePickerRoot';
2
+ export type { DatePickerRootProps } from './DatePickerRoot';
3
+ export { DatePickerContext, useDatePickerContext, type DatePickerContextValue } from './context';
4
+ export type { PickerSurfaceType } from './context';
@@ -0,0 +1,236 @@
1
+ import {
2
+ forwardRef,
3
+ useCallback,
4
+ useEffect,
5
+ useMemo,
6
+ useRef,
7
+ useState,
8
+ type ComponentRef,
9
+ type ReactNode,
10
+ } from 'react';
11
+ import { View, type ViewProps } from 'react-native';
12
+ import type { DateComponentLabels, DateId } from '@cdx-ui/formatters';
13
+ import { resolveDateComponentLabels } from '@cdx-ui/formatters';
14
+ import { useControllableState, mergeRefs } from '@cdx-ui/utils';
15
+ import { Slot } from '../slot';
16
+ import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
17
+ import type { PickerSurfaceType } from '../date-picker/context';
18
+ import type { RangeCalendarFocus } from '../range-calendar/context';
19
+ import { DateRangePickerContext, type DateRangeValue } from './context';
20
+
21
+ export interface DateRangePickerRootProps extends Omit<ViewProps, 'children'> {
22
+ asChild?: boolean;
23
+ children?: ReactNode;
24
+ className?: string;
25
+ /**
26
+ * Controlled range value as `{ startId, endId? }`. Build the ids with
27
+ * `dateId(...)` from `@cdx-ui/formatters` — a bare string will not type-check.
28
+ *
29
+ * @example
30
+ * value={{ startId: dateId('2026-08-01'), endId: dateId('2026-08-07') }}
31
+ */
32
+ value?: DateRangeValue;
33
+ /** Uncontrolled initial range, in the same shape as `value`. */
34
+ defaultValue?: DateRangeValue;
35
+ /**
36
+ * Called as the range changes. Emits `{ startId, endId? }` during selection —
37
+ * a **partial** range (with `endId` undefined) is emitted after the first
38
+ * endpoint is picked — and `undefined` when the range is fully cleared.
39
+ */
40
+ onValueChange?: (value: DateRangeValue | undefined) => void;
41
+ focusedField?: RangeCalendarFocus;
42
+ defaultFocusedField?: RangeCalendarFocus;
43
+ onFocusedFieldChange?: (field: RangeCalendarFocus) => void;
44
+ /** Controlled open state. Use `defaultOpen` for the uncontrolled variant. */
45
+ isOpen?: boolean;
46
+ defaultOpen?: boolean;
47
+ onOpenChange?: (open: boolean) => void;
48
+ isDisabled?: boolean;
49
+ isReadOnly?: boolean;
50
+ isInvalid?: boolean;
51
+ isRequired?: boolean;
52
+ locale?: string;
53
+ labels?: Partial<DateComponentLabels>;
54
+ /** Form field name used when the selected range is submitted. */
55
+ name?: string;
56
+ }
57
+
58
+ export const DateRangePickerRoot = forwardRef<ComponentRef<typeof View>, DateRangePickerRootProps>(
59
+ (props, ref) => {
60
+ const {
61
+ asChild,
62
+ children,
63
+ value: valueProp,
64
+ defaultValue,
65
+ onValueChange,
66
+ focusedField: focusedProp,
67
+ defaultFocusedField = 'start',
68
+ onFocusedFieldChange,
69
+ isOpen: openProp,
70
+ defaultOpen = false,
71
+ onOpenChange,
72
+ isDisabled: disabled = false,
73
+ isReadOnly = false,
74
+ isInvalid = false,
75
+ isRequired = false,
76
+ locale = 'en-US',
77
+ labels: labelsProp,
78
+ ...rest
79
+ } = props;
80
+
81
+ const labels = useMemo(() => resolveDateComponentLabels(labelsProp), [labelsProp]);
82
+
83
+ const isRangeControlled = 'value' in props;
84
+ const [uncontrolledStart, setUncontrolledStart] = useState<DateId | undefined>(
85
+ defaultValue?.startId,
86
+ );
87
+ const [uncontrolledEnd, setUncontrolledEnd] = useState<DateId | undefined>(defaultValue?.endId);
88
+ const startValue = isRangeControlled ? valueProp?.startId : uncontrolledStart;
89
+ const endValue = isRangeControlled ? valueProp?.endId : uncontrolledEnd;
90
+
91
+ const [open, setOpenState] = useControllableState<boolean>({
92
+ prop: openProp,
93
+ defaultProp: defaultOpen,
94
+ onChange: onOpenChange,
95
+ });
96
+
97
+ const [draftStart, setDraftStart] = useState<DateId | undefined>(startValue);
98
+ const [draftEnd, setDraftEnd] = useState<DateId | undefined>(endValue);
99
+
100
+ const [focusedField, setFocusedField] = useControllableState<RangeCalendarFocus>({
101
+ prop: focusedProp,
102
+ defaultProp: defaultFocusedField,
103
+ onChange: onFocusedFieldChange,
104
+ });
105
+
106
+ const surfacesRef = useRef<Set<PickerSurfaceType>>(new Set());
107
+ const anchorRef = useRef<ComponentRef<typeof View>>(null);
108
+ const triggerRef = useRef<ComponentRef<typeof View>>(null);
109
+
110
+ const commitRange = useCallback(
111
+ (range: DateRangeValue | undefined) => {
112
+ if (!isRangeControlled) {
113
+ setUncontrolledStart(range?.startId);
114
+ setUncontrolledEnd(range?.endId);
115
+ }
116
+ setDraftStart(range?.startId);
117
+ setDraftEnd(range?.endId);
118
+ onValueChange?.(range);
119
+ },
120
+ [isRangeControlled, onValueChange],
121
+ );
122
+
123
+ const setDraftRange = useCallback(
124
+ (range: { startId?: DateId | null; endId?: DateId | null }) => {
125
+ if (range.startId === null) {
126
+ setDraftStart(undefined);
127
+ } else if (range.startId !== undefined) {
128
+ setDraftStart(range.startId);
129
+ }
130
+ if (range.endId === null) {
131
+ setDraftEnd(undefined);
132
+ } else if (range.endId !== undefined) {
133
+ setDraftEnd(range.endId);
134
+ }
135
+ },
136
+ [],
137
+ );
138
+
139
+ // Sync draft from committed values when they change externally (presets, typed fields).
140
+ useEffect(() => {
141
+ setDraftStart(startValue);
142
+ setDraftEnd(endValue);
143
+ }, [endValue, startValue]);
144
+
145
+ const setOpen = useCallback(
146
+ (next: boolean) => {
147
+ if (disabled && next) {
148
+ return;
149
+ }
150
+ if (next) {
151
+ setDraftStart(startValue);
152
+ setDraftEnd(endValue);
153
+ }
154
+ setOpenState(next);
155
+ },
156
+ [disabled, endValue, setOpenState, startValue],
157
+ );
158
+
159
+ const registerSurface = useCallback((type: PickerSurfaceType) => {
160
+ if (surfacesRef.current.has(type)) {
161
+ return;
162
+ }
163
+ surfacesRef.current.add(type);
164
+ if (surfacesRef.current.size > 1) {
165
+ console.warn(
166
+ '[Forge UI] DateRangePicker: multiple presentation surfaces detected. Use only one of Popover, Dialog, or BottomSheet.',
167
+ );
168
+ }
169
+ }, []);
170
+
171
+ useEffect(() => {
172
+ if (!open) {
173
+ surfacesRef.current.clear();
174
+ }
175
+ }, [open]);
176
+
177
+ const contextValue = useMemo(
178
+ () => ({
179
+ startValue,
180
+ endValue,
181
+ onRangeChange: commitRange,
182
+ draftStart,
183
+ draftEnd,
184
+ setDraftRange,
185
+ focusedField: focusedField ?? 'start',
186
+ setFocusedField,
187
+ open: open ?? false,
188
+ setOpen,
189
+ disabled,
190
+ readOnly: isReadOnly,
191
+ invalid: isInvalid,
192
+ required: isRequired,
193
+ locale,
194
+ labels,
195
+ registerSurface,
196
+ anchorRef,
197
+ triggerRef,
198
+ }),
199
+ [
200
+ startValue,
201
+ endValue,
202
+ commitRange,
203
+ draftStart,
204
+ draftEnd,
205
+ setDraftRange,
206
+ focusedField,
207
+ setFocusedField,
208
+ open,
209
+ setOpen,
210
+ disabled,
211
+ isReadOnly,
212
+ isInvalid,
213
+ isRequired,
214
+ locale,
215
+ labels,
216
+ registerSurface,
217
+ ],
218
+ );
219
+
220
+ const Comp = asChild ? Slot : View;
221
+
222
+ return (
223
+ <DateRangePickerContext.Provider value={contextValue}>
224
+ <Comp
225
+ ref={mergeRefs(ref, anchorRef)}
226
+ {...rest}
227
+ {...mergeDataAttributes(rest, dataAttributes({ disabled, open }))}
228
+ >
229
+ {children}
230
+ </Comp>
231
+ </DateRangePickerContext.Provider>
232
+ );
233
+ },
234
+ );
235
+
236
+ DateRangePickerRoot.displayName = 'DateRangePickerRoot';
@@ -0,0 +1,48 @@
1
+ import { createContext, useContext, type RefObject } from 'react';
2
+ import type { View } from 'react-native';
3
+ import type { DateComponentLabels, DateId } from '@cdx-ui/formatters';
4
+ import type { RangeCalendarFocus } from '../range-calendar/context';
5
+ import type { PickerSurfaceType } from '../date-picker/context';
6
+
7
+ /**
8
+ * A date range value. `endId` is optional: while the user is mid-selection (only
9
+ * the first endpoint chosen) the range carries `startId` alone. Build the ids
10
+ * with `dateId(...)` from `@cdx-ui/formatters`.
11
+ */
12
+ export interface DateRangeValue {
13
+ startId: DateId;
14
+ endId?: DateId;
15
+ }
16
+
17
+ export interface DateRangePickerContextValue {
18
+ startValue?: DateId;
19
+ endValue?: DateId;
20
+ onRangeChange?: (range: DateRangeValue | undefined) => void;
21
+ draftStart?: DateId;
22
+ draftEnd?: DateId;
23
+ /** Sets both draft ends; omit a key to leave it, pass `null` to clear. */
24
+ setDraftRange: (range: { startId?: DateId | null; endId?: DateId | null }) => void;
25
+ focusedField: RangeCalendarFocus;
26
+ setFocusedField: (field: RangeCalendarFocus) => void;
27
+ open: boolean;
28
+ setOpen: (open: boolean) => void;
29
+ disabled: boolean;
30
+ readOnly: boolean;
31
+ invalid: boolean;
32
+ required: boolean;
33
+ locale: string;
34
+ labels: DateComponentLabels;
35
+ registerSurface: (type: PickerSurfaceType) => void;
36
+ anchorRef: RefObject<View | null>;
37
+ triggerRef: RefObject<View | null>;
38
+ }
39
+
40
+ export const DateRangePickerContext = createContext<DateRangePickerContextValue | null>(null);
41
+
42
+ export function useDateRangePickerContext(): DateRangePickerContextValue {
43
+ const ctx = useContext(DateRangePickerContext);
44
+ if (!ctx) {
45
+ throw new Error('DateRangePicker compound components must be used within DateRangePickerRoot');
46
+ }
47
+ return ctx;
48
+ }
@@ -0,0 +1,8 @@
1
+ export { DateRangePickerRoot } from './DateRangePickerRoot';
2
+ export type { DateRangePickerRootProps } from './DateRangePickerRoot';
3
+ export {
4
+ DateRangePickerContext,
5
+ useDateRangePickerContext,
6
+ type DateRangePickerContextValue,
7
+ type DateRangeValue,
8
+ } from './context';
@@ -0,0 +1,156 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { Platform, TextInput, type TextInputKeyPressEvent } from 'react-native';
3
+ import { useDateTimeFieldContext } from './context';
4
+
5
+ /**
6
+ * Invisible input that owns keyboard focus while a segment is active.
7
+ * Mirrors `DateFieldHiddenInput`; switches to a default keyboard for day-period (A/P).
8
+ */
9
+ const HIDDEN_INPUT_STYLE = {
10
+ position: 'absolute' as const,
11
+ opacity: 0.01,
12
+ width: '100%' as const,
13
+ height: '100%' as const,
14
+ left: 0,
15
+ top: 0,
16
+ zIndex: 0,
17
+ fontSize: 16,
18
+ };
19
+
20
+ const NUMERIC_KEYBOARD = Platform.select<'number-pad' | 'phone-pad'>({
21
+ ios: 'phone-pad',
22
+ default: 'number-pad',
23
+ });
24
+
25
+ export function DateTimeFieldHiddenInput({ accessibilityLabel }: { accessibilityLabel: string }) {
26
+ const {
27
+ focusedSegmentIndex,
28
+ segments,
29
+ disabled,
30
+ readOnly,
31
+ segmentDraft,
32
+ handleSegmentInputChange,
33
+ handleSegmentBackspace,
34
+ handleDayPeriodKey,
35
+ focusNextEditableSegment,
36
+ focusPrevEditableSegment,
37
+ blurSegment,
38
+ } = useDateTimeFieldContext();
39
+
40
+ const inputRef = useRef<TextInput>(null);
41
+ const suppressBlurRef = useRef(false);
42
+ const focusedIndexRef = useRef(focusedSegmentIndex);
43
+ focusedIndexRef.current = focusedSegmentIndex;
44
+
45
+ const focusedSegment = focusedSegmentIndex != null ? segments[focusedSegmentIndex] : undefined;
46
+ const isDayPeriod = focusedSegment?.type === 'dayPeriod';
47
+ const isActive = focusedSegmentIndex != null && !disabled && !readOnly;
48
+ const draftValue = isDayPeriod
49
+ ? segmentDraft.replace(/[^aApP12]/g, '')
50
+ : segmentDraft.replace(/\D/g, '');
51
+
52
+ useEffect(() => {
53
+ if (!isActive) {
54
+ return;
55
+ }
56
+
57
+ suppressBlurRef.current = true;
58
+ const focusInput = () => {
59
+ inputRef.current?.focus();
60
+ };
61
+
62
+ const frame = requestAnimationFrame(focusInput);
63
+ const timer = setTimeout(() => {
64
+ focusInput();
65
+ suppressBlurRef.current = false;
66
+ }, 50);
67
+
68
+ return () => {
69
+ cancelAnimationFrame(frame);
70
+ clearTimeout(timer);
71
+ };
72
+ }, [isActive, focusedSegmentIndex]);
73
+
74
+ const onKeyPress = (event: TextInputKeyPressEvent) => {
75
+ if (!isActive) {
76
+ return;
77
+ }
78
+ const key = event.nativeEvent.key;
79
+ if (key === 'Backspace') {
80
+ if (draftValue.length === 0) {
81
+ handleSegmentBackspace();
82
+ }
83
+ return;
84
+ }
85
+ if (key === 'ArrowRight') {
86
+ focusNextEditableSegment();
87
+ return;
88
+ }
89
+ if (key === 'ArrowLeft') {
90
+ focusPrevEditableSegment();
91
+ return;
92
+ }
93
+ if (isDayPeriod && /^[apAP]$/.test(key)) {
94
+ handleDayPeriodKey(key);
95
+ }
96
+ };
97
+
98
+ return (
99
+ <TextInput
100
+ testID="date-time-field-keyboard-input"
101
+ accessibilityLabel={accessibilityLabel}
102
+ accessibilityElementsHidden
103
+ importantForAccessibility="no-hide-descendants"
104
+ ref={inputRef}
105
+ value={isActive ? draftValue : ''}
106
+ editable={isActive}
107
+ showSoftInputOnFocus={isActive}
108
+ pointerEvents="none"
109
+ caretHidden
110
+ importantForAutofill="no"
111
+ autoComplete="off"
112
+ autoCorrect={false}
113
+ spellCheck={false}
114
+ keyboardType={isDayPeriod ? 'default' : NUMERIC_KEYBOARD}
115
+ inputMode={isDayPeriod ? 'text' : 'numeric'}
116
+ style={HIDDEN_INPUT_STYLE}
117
+ onChangeText={(text) => {
118
+ if (!isActive) {
119
+ return;
120
+ }
121
+ handleSegmentInputChange(text);
122
+ }}
123
+ onKeyPress={onKeyPress}
124
+ onBlur={() => {
125
+ if (suppressBlurRef.current) {
126
+ return;
127
+ }
128
+ requestAnimationFrame(() => {
129
+ if (suppressBlurRef.current) {
130
+ return;
131
+ }
132
+ const index = focusedIndexRef.current;
133
+ if (index == null) {
134
+ return;
135
+ }
136
+ if (Platform.OS !== 'web') {
137
+ blurSegment(index);
138
+ return;
139
+ }
140
+ const node = inputRef.current as unknown as { isFocused?: () => boolean } | null;
141
+ if (node?.isFocused?.()) {
142
+ return;
143
+ }
144
+ const active = typeof document !== 'undefined' ? document.activeElement : null;
145
+ if (active && (active as HTMLElement).tagName === 'INPUT') {
146
+ const label = (active as HTMLElement).getAttribute('aria-label');
147
+ if (label === accessibilityLabel) {
148
+ return;
149
+ }
150
+ }
151
+ blurSegment(index);
152
+ });
153
+ }}
154
+ />
155
+ );
156
+ }
@@ -0,0 +1,119 @@
1
+ import { forwardRef, useEffect, type ComponentRef } from 'react';
2
+ import { Platform, View } from 'react-native';
3
+ import type { DateSegment } from '@cdx-ui/formatters';
4
+ import { DateFieldSegmentIndexProvider } from '../date-field/segmentIndex';
5
+ import { Slot } from '../slot';
6
+ import { dataAttributes, mergeDataAttributes } from '../utils/dataAttributes';
7
+ import { useDateTimeFieldContext } from './context';
8
+ import { DateTimeFieldHiddenInput } from './DateTimeFieldHiddenInput';
9
+
10
+ export interface DateTimeFieldInputProps {
11
+ children: (segment: DateSegment) => React.ReactNode;
12
+ asChild?: boolean;
13
+ className?: string;
14
+ style?: import('react-native').StyleProp<import('react-native').ViewStyle>;
15
+ }
16
+
17
+ export const DateTimeFieldInput = forwardRef<
18
+ ComponentRef<typeof View>,
19
+ DateTimeFieldInputProps & Omit<import('react-native').ViewProps, 'children'>
20
+ >(({ asChild, children, className, style, ...props }, ref) => {
21
+ const ctx = useDateTimeFieldContext();
22
+ const { segments, labels } = ctx;
23
+ const keyboardInputLabel = labels.dateFieldKeyboardInput;
24
+ const Comp = asChild ? Slot : View;
25
+
26
+ useEffect(() => {
27
+ if (Platform.OS !== 'web' || ctx.focusedSegmentIndex == null || ctx.disabled || ctx.readOnly) {
28
+ return;
29
+ }
30
+
31
+ const focusedIndex = ctx.focusedSegmentIndex;
32
+
33
+ const onKeyDown = (event: KeyboardEvent) => {
34
+ const activeLabel =
35
+ typeof document !== 'undefined'
36
+ ? document.activeElement?.getAttribute?.('aria-label')
37
+ : null;
38
+ const inputOwnsFocus = activeLabel === keyboardInputLabel;
39
+
40
+ if (event.key === 'Backspace') {
41
+ if (inputOwnsFocus) {
42
+ return;
43
+ }
44
+ event.preventDefault();
45
+ ctx.handleSegmentBackspace();
46
+ return;
47
+ }
48
+ if (event.key === 'ArrowRight') {
49
+ if (inputOwnsFocus) {
50
+ return;
51
+ }
52
+ event.preventDefault();
53
+ ctx.focusNextEditableSegment();
54
+ return;
55
+ }
56
+ if (event.key === 'ArrowLeft') {
57
+ if (inputOwnsFocus) {
58
+ return;
59
+ }
60
+ event.preventDefault();
61
+ ctx.focusPrevEditableSegment();
62
+ return;
63
+ }
64
+ if (event.key === 'Tab') {
65
+ ctx.blurSegment(focusedIndex);
66
+ return;
67
+ }
68
+ if (/^[apAP]$/.test(event.key)) {
69
+ if (inputOwnsFocus) {
70
+ return;
71
+ }
72
+ event.preventDefault();
73
+ ctx.handleDayPeriodKey(event.key);
74
+ return;
75
+ }
76
+ if (/^\d$/.test(event.key)) {
77
+ if (inputOwnsFocus) {
78
+ return;
79
+ }
80
+ event.preventDefault();
81
+ ctx.handleSegmentDigit(event.key);
82
+ }
83
+ };
84
+
85
+ document.addEventListener('keydown', onKeyDown);
86
+ return () => document.removeEventListener('keydown', onKeyDown);
87
+ }, [
88
+ ctx.blurSegment,
89
+ ctx.disabled,
90
+ ctx.focusNextEditableSegment,
91
+ ctx.focusPrevEditableSegment,
92
+ ctx.focusedSegmentIndex,
93
+ ctx.handleDayPeriodKey,
94
+ ctx.handleSegmentBackspace,
95
+ ctx.handleSegmentDigit,
96
+ ctx.readOnly,
97
+ keyboardInputLabel,
98
+ ]);
99
+
100
+ return (
101
+ <Comp
102
+ ref={ref}
103
+ className={className}
104
+ style={[{ position: 'relative' }, style]}
105
+ accessibilityRole="none"
106
+ {...props}
107
+ {...mergeDataAttributes(props, dataAttributes({ slot: 'date-time-field-input' }))}
108
+ >
109
+ {segments.map((segment: DateSegment, index: number) => (
110
+ <DateFieldSegmentIndexProvider key={`${segment.type}-${String(index)}`} index={index}>
111
+ {children(segment)}
112
+ </DateFieldSegmentIndexProvider>
113
+ ))}
114
+ <DateTimeFieldHiddenInput accessibilityLabel={keyboardInputLabel} />
115
+ </Comp>
116
+ );
117
+ });
118
+
119
+ DateTimeFieldInput.displayName = 'DateTimeFieldInput';