@osdk/react-components 0.12.0 → 0.13.0

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 (328) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +11 -0
  3. package/build/browser/action-form/ActionForm.js +19 -11
  4. package/build/browser/action-form/ActionForm.js.map +1 -1
  5. package/build/browser/action-form/ActionFormApi.js.map +1 -1
  6. package/build/browser/action-form/BaseForm.js +19 -13
  7. package/build/browser/action-form/BaseForm.js.map +1 -1
  8. package/build/browser/action-form/BaseForm.module.css +7 -7
  9. package/build/browser/action-form/FormField.js +5 -2
  10. package/build/browser/action-form/FormField.js.map +1 -1
  11. package/build/browser/action-form/FormField.module.css +6 -1
  12. package/build/browser/action-form/FormField.module.css.js +1 -0
  13. package/build/browser/action-form/FormFieldApi.js +7 -1
  14. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  15. package/build/browser/action-form/FormHeader.module.css +2 -2
  16. package/build/browser/action-form/fields/DateCalendar.js +41 -3
  17. package/build/browser/action-form/fields/DateCalendar.js.map +1 -1
  18. package/build/browser/action-form/fields/DateCalendar.module.css +59 -10
  19. package/build/browser/action-form/fields/DateCalendar.module.css.js +5 -1
  20. package/build/browser/action-form/fields/DateRangeCalendar.js +8 -5
  21. package/build/browser/action-form/fields/DateRangeCalendar.js.map +1 -1
  22. package/build/browser/action-form/fields/DateRangeInputField.js +76 -61
  23. package/build/browser/action-form/fields/DateRangeInputField.js.map +1 -1
  24. package/build/browser/action-form/fields/DateRangeInputField.module.css +0 -15
  25. package/build/browser/action-form/fields/DateRangeInputField.module.css.js +1 -2
  26. package/build/browser/action-form/fields/DatetimePickerField.js +74 -40
  27. package/build/browser/action-form/fields/DatetimePickerField.js.map +1 -1
  28. package/build/browser/action-form/fields/DatetimePickerField.module.css +2 -9
  29. package/build/browser/action-form/fields/FieldBridge.js +1 -1
  30. package/build/browser/action-form/fields/FieldBridge.js.map +1 -1
  31. package/build/browser/action-form/fields/FilePickerField.js +47 -39
  32. package/build/browser/action-form/fields/FilePickerField.js.map +1 -1
  33. package/build/browser/action-form/fields/FilePickerField.module.css +43 -31
  34. package/build/browser/action-form/fields/FilePickerField.module.css.js +2 -2
  35. package/build/browser/action-form/fields/FormFieldRenderer.js +9 -0
  36. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
  37. package/build/browser/action-form/fields/RadioButtonsField.module.css +3 -3
  38. package/build/browser/action-form/fields/SwitchField.js +34 -0
  39. package/build/browser/action-form/fields/SwitchField.js.map +1 -0
  40. package/build/browser/action-form/fields/TimePicker.js +165 -26
  41. package/build/browser/action-form/fields/TimePicker.js.map +1 -1
  42. package/build/browser/action-form/fields/TimePicker.module.css +27 -2
  43. package/build/browser/action-form/fields/TimePicker.module.css.js +3 -1
  44. package/build/browser/action-form/fields/calendarShared.js +5 -0
  45. package/build/browser/action-form/fields/calendarShared.js.map +1 -1
  46. package/build/browser/action-form/fields/useDateEditState.js +3 -4
  47. package/build/browser/action-form/fields/useDateEditState.js.map +1 -1
  48. package/build/browser/base-components/action-button/ActionButton.js +2 -1
  49. package/build/browser/base-components/action-button/ActionButton.js.map +1 -1
  50. package/build/browser/base-components/action-button/ActionButton.module.css +19 -0
  51. package/build/browser/base-components/action-button/ActionButton.module.css.js +2 -1
  52. package/build/browser/base-components/combobox/Combobox.module.css +31 -3
  53. package/build/browser/base-components/select/Select.module.css +18 -0
  54. package/build/browser/base-components/switch/Switch.module.css +18 -6
  55. package/build/browser/filter-list/base/inputs/ListogramInput.js +34 -6
  56. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  57. package/build/browser/filter-list/base/inputs/ListogramInput.module.css +11 -5
  58. package/build/browser/filter-list/base/inputs/ListogramInput.module.css.js +1 -1
  59. package/build/browser/filter-list/base/inputs/MultiSelectInput.js +20 -12
  60. package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  61. package/build/browser/filter-list/base/inputs/NoValueLabel.js +36 -0
  62. package/build/browser/filter-list/base/inputs/NoValueLabel.js.map +1 -0
  63. package/build/browser/filter-list/base/inputs/NoValueLabel.module.css +20 -0
  64. package/build/browser/filter-list/base/inputs/NoValueLabel.module.css.js +6 -0
  65. package/build/browser/filter-list/base/inputs/NullValueWrapper.js +4 -3
  66. package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
  67. package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
  68. package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css.js +1 -1
  69. package/build/browser/filter-list/base/inputs/SingleSelectInput.js +13 -8
  70. package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  71. package/build/browser/filter-list/base/inputs/TextTagsInput.js +6 -2
  72. package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
  73. package/build/browser/filter-list/hooks/useFilterListState.js +7 -6
  74. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  75. package/build/browser/filter-list/hooks/useStableMapEntries.js +35 -0
  76. package/build/browser/filter-list/hooks/useStableMapEntries.js.map +1 -0
  77. package/build/browser/filter-list/utils/filterValues.js +13 -0
  78. package/build/browser/filter-list/utils/filterValues.js.map +1 -1
  79. package/build/browser/object-table/DefaultCellRenderer.js +12 -2
  80. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
  81. package/build/browser/object-table/EditableCell.js +14 -4
  82. package/build/browser/object-table/EditableCell.js.map +1 -1
  83. package/build/browser/object-table/EditableCell.module.css +4 -0
  84. package/build/browser/object-table/EditableCell.module.css.js +1 -0
  85. package/build/browser/object-table/ObjectTable.js +3 -1
  86. package/build/browser/object-table/ObjectTable.js.map +1 -1
  87. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  88. package/build/browser/object-table/Table.js +8 -4
  89. package/build/browser/object-table/Table.js.map +1 -1
  90. package/build/browser/object-table/TableBody.js +4 -2
  91. package/build/browser/object-table/TableBody.js.map +1 -1
  92. package/build/browser/object-table/TableRow.js +12 -4
  93. package/build/browser/object-table/TableRow.js.map +1 -1
  94. package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
  95. package/build/browser/object-table/utils/editableUtils.js +39 -0
  96. package/build/browser/object-table/utils/editableUtils.js.map +1 -0
  97. package/build/browser/object-table/utils/shouldShowEditableCell.js +1 -1
  98. package/build/browser/object-table/utils/shouldShowEditableCell.js.map +1 -1
  99. package/build/browser/object-table/utils/types.js.map +1 -1
  100. package/build/browser/styles.css +331 -130
  101. package/build/browser/tokens/component-tokens/button.css +15 -0
  102. package/build/browser/tokens/component-tokens/combobox.css +9 -0
  103. package/build/browser/tokens/component-tokens/datetime-picker.css +2 -2
  104. package/build/browser/tokens/component-tokens/file-picker.css +0 -10
  105. package/build/browser/tokens/component-tokens/filter-list.css +9 -6
  106. package/build/browser/tokens/component-tokens/form-section.css +1 -1
  107. package/build/browser/tokens/component-tokens/form.css +9 -5
  108. package/build/browser/tokens/component-tokens/table.css +3 -5
  109. package/build/browser/tokens.css +1 -0
  110. package/build/browser/util/UserAgent.js +1 -1
  111. package/build/cjs/{DateCalendar-2W4QHEEI.css → DateCalendar-G7RC2FCG.css} +105 -8
  112. package/build/cjs/DateCalendar-G7RC2FCG.css.map +1 -0
  113. package/build/cjs/DateCalendar-RX7HP2XP.cjs +26 -0
  114. package/build/cjs/{DateCalendar-QGSYBWJB.cjs.map → DateCalendar-RX7HP2XP.cjs.map} +1 -1
  115. package/build/cjs/{DateRangeCalendar-M63S2LLG.css → DateRangeCalendar-JBVYJDBJ.css} +105 -8
  116. package/build/cjs/DateRangeCalendar-JBVYJDBJ.css.map +1 -0
  117. package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs +54 -0
  118. package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs.map +1 -0
  119. package/build/cjs/{chunk-T7I6O43T.cjs → chunk-6SPXSFPI.cjs} +237 -85
  120. package/build/cjs/chunk-6SPXSFPI.cjs.map +1 -0
  121. package/build/cjs/{chunk-SZXVBDSA.cjs → chunk-6UDBHYSO.cjs} +3 -3
  122. package/build/cjs/{chunk-SZXVBDSA.cjs.map → chunk-6UDBHYSO.cjs.map} +1 -1
  123. package/build/cjs/{chunk-YBDS5WQP.cjs → chunk-7H6WXQ35.cjs} +4 -4
  124. package/build/cjs/{chunk-YBDS5WQP.cjs.map → chunk-7H6WXQ35.cjs.map} +1 -1
  125. package/build/cjs/{chunk-VVJFMOZI.cjs → chunk-I3OSD6CF.cjs} +19 -45
  126. package/build/cjs/chunk-I3OSD6CF.cjs.map +1 -0
  127. package/build/cjs/chunk-MD4KDE44.cjs +41 -0
  128. package/build/cjs/chunk-MD4KDE44.cjs.map +1 -0
  129. package/build/cjs/{chunk-YPXTSEE7.cjs → chunk-MLFMSZJQ.cjs} +85 -38
  130. package/build/cjs/chunk-MLFMSZJQ.cjs.map +1 -0
  131. package/build/cjs/chunk-MQYOHGPY.cjs +52 -0
  132. package/build/cjs/chunk-MQYOHGPY.cjs.map +1 -0
  133. package/build/cjs/{chunk-BJDCC446.cjs → chunk-PTTCWNZZ.cjs} +417 -364
  134. package/build/cjs/chunk-PTTCWNZZ.cjs.map +1 -0
  135. package/build/cjs/{chunk-B2GRQRWU.cjs → chunk-TOJSJN3L.cjs} +44 -8
  136. package/build/cjs/chunk-TOJSJN3L.cjs.map +1 -0
  137. package/build/cjs/{chunk-JLESWL47.cjs → chunk-V7XWTJV7.cjs} +4 -2
  138. package/build/cjs/chunk-V7XWTJV7.cjs.map +1 -0
  139. package/build/cjs/{chunk-L5LPFCXT.cjs → chunk-W2IASYE4.cjs} +163 -125
  140. package/build/cjs/chunk-W2IASYE4.cjs.map +1 -0
  141. package/build/cjs/chunk-X337DNCW.cjs +45 -0
  142. package/build/cjs/chunk-X337DNCW.cjs.map +1 -0
  143. package/build/cjs/{chunk-SB2VTP67.cjs → chunk-Z7VHLTKD.cjs} +2 -64
  144. package/build/cjs/chunk-Z7VHLTKD.cjs.map +1 -0
  145. package/build/cjs/public/experimental/action-form.cjs +11 -9
  146. package/build/cjs/public/experimental/action-form.css +223 -68
  147. package/build/cjs/public/experimental/action-form.css.map +1 -1
  148. package/build/cjs/public/experimental/action-form.d.cts +83 -74
  149. package/build/cjs/public/experimental/filter-list.cjs +9 -8
  150. package/build/cjs/public/experimental/filter-list.css +38 -19
  151. package/build/cjs/public/experimental/filter-list.css.map +1 -1
  152. package/build/cjs/public/experimental/object-table.cjs +14 -12
  153. package/build/cjs/public/experimental/object-table.css +152 -59
  154. package/build/cjs/public/experimental/object-table.css.map +1 -1
  155. package/build/cjs/public/experimental/object-table.d.cts +39 -20
  156. package/build/cjs/public/experimental/pdf-viewer.cjs +24 -24
  157. package/build/cjs/public/experimental.cjs +46 -44
  158. package/build/cjs/public/experimental.css +242 -139
  159. package/build/cjs/public/experimental.css.map +1 -1
  160. package/build/cjs/public/primitives.cjs +8 -7
  161. package/build/cjs/public/primitives.css +15 -0
  162. package/build/cjs/public/primitives.css.map +1 -1
  163. package/build/cjs/public/primitives.d.cts +1 -0
  164. package/build/esm/action-form/ActionForm.js +19 -11
  165. package/build/esm/action-form/ActionForm.js.map +1 -1
  166. package/build/esm/action-form/ActionFormApi.js.map +1 -1
  167. package/build/esm/action-form/BaseForm.js +19 -13
  168. package/build/esm/action-form/BaseForm.js.map +1 -1
  169. package/build/esm/action-form/BaseForm.module.css +7 -7
  170. package/build/esm/action-form/FormField.js +5 -2
  171. package/build/esm/action-form/FormField.js.map +1 -1
  172. package/build/esm/action-form/FormField.module.css +6 -1
  173. package/build/esm/action-form/FormFieldApi.js +7 -1
  174. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  175. package/build/esm/action-form/FormHeader.module.css +2 -2
  176. package/build/esm/action-form/fields/DateCalendar.js +41 -3
  177. package/build/esm/action-form/fields/DateCalendar.js.map +1 -1
  178. package/build/esm/action-form/fields/DateCalendar.module.css +59 -10
  179. package/build/esm/action-form/fields/DateRangeCalendar.js +8 -5
  180. package/build/esm/action-form/fields/DateRangeCalendar.js.map +1 -1
  181. package/build/esm/action-form/fields/DateRangeInputField.js +76 -61
  182. package/build/esm/action-form/fields/DateRangeInputField.js.map +1 -1
  183. package/build/esm/action-form/fields/DateRangeInputField.module.css +0 -15
  184. package/build/esm/action-form/fields/DatetimePickerField.js +74 -40
  185. package/build/esm/action-form/fields/DatetimePickerField.js.map +1 -1
  186. package/build/esm/action-form/fields/DatetimePickerField.module.css +2 -9
  187. package/build/esm/action-form/fields/FieldBridge.js +1 -1
  188. package/build/esm/action-form/fields/FieldBridge.js.map +1 -1
  189. package/build/esm/action-form/fields/FilePickerField.js +47 -39
  190. package/build/esm/action-form/fields/FilePickerField.js.map +1 -1
  191. package/build/esm/action-form/fields/FilePickerField.module.css +43 -31
  192. package/build/esm/action-form/fields/FormFieldRenderer.js +9 -0
  193. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
  194. package/build/esm/action-form/fields/RadioButtonsField.module.css +3 -3
  195. package/build/esm/action-form/fields/SwitchField.js +34 -0
  196. package/build/esm/action-form/fields/SwitchField.js.map +1 -0
  197. package/build/esm/action-form/fields/TimePicker.js +165 -26
  198. package/build/esm/action-form/fields/TimePicker.js.map +1 -1
  199. package/build/esm/action-form/fields/TimePicker.module.css +27 -2
  200. package/build/esm/action-form/fields/calendarShared.js +5 -0
  201. package/build/esm/action-form/fields/calendarShared.js.map +1 -1
  202. package/build/esm/action-form/fields/useDateEditState.js +3 -4
  203. package/build/esm/action-form/fields/useDateEditState.js.map +1 -1
  204. package/build/esm/base-components/action-button/ActionButton.js +2 -1
  205. package/build/esm/base-components/action-button/ActionButton.js.map +1 -1
  206. package/build/esm/base-components/action-button/ActionButton.module.css +19 -0
  207. package/build/esm/base-components/combobox/Combobox.module.css +31 -3
  208. package/build/esm/base-components/select/Select.module.css +18 -0
  209. package/build/esm/base-components/switch/Switch.module.css +18 -6
  210. package/build/esm/filter-list/base/inputs/ListogramInput.js +34 -6
  211. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  212. package/build/esm/filter-list/base/inputs/ListogramInput.module.css +11 -5
  213. package/build/esm/filter-list/base/inputs/MultiSelectInput.js +20 -12
  214. package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  215. package/build/esm/filter-list/base/inputs/NoValueLabel.js +36 -0
  216. package/build/esm/filter-list/base/inputs/NoValueLabel.js.map +1 -0
  217. package/build/esm/filter-list/base/inputs/NoValueLabel.module.css +20 -0
  218. package/build/esm/filter-list/base/inputs/NullValueWrapper.js +4 -3
  219. package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
  220. package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
  221. package/build/esm/filter-list/base/inputs/SingleSelectInput.js +13 -8
  222. package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  223. package/build/esm/filter-list/base/inputs/TextTagsInput.js +6 -2
  224. package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
  225. package/build/esm/filter-list/hooks/useFilterListState.js +7 -6
  226. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  227. package/build/esm/filter-list/hooks/useStableMapEntries.js +35 -0
  228. package/build/esm/filter-list/hooks/useStableMapEntries.js.map +1 -0
  229. package/build/esm/filter-list/utils/filterValues.js +13 -0
  230. package/build/esm/filter-list/utils/filterValues.js.map +1 -1
  231. package/build/esm/object-table/DefaultCellRenderer.js +12 -2
  232. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
  233. package/build/esm/object-table/EditableCell.js +14 -4
  234. package/build/esm/object-table/EditableCell.js.map +1 -1
  235. package/build/esm/object-table/EditableCell.module.css +4 -0
  236. package/build/esm/object-table/ObjectTable.js +3 -1
  237. package/build/esm/object-table/ObjectTable.js.map +1 -1
  238. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  239. package/build/esm/object-table/Table.js +8 -4
  240. package/build/esm/object-table/Table.js.map +1 -1
  241. package/build/esm/object-table/TableBody.js +4 -2
  242. package/build/esm/object-table/TableBody.js.map +1 -1
  243. package/build/esm/object-table/TableRow.js +12 -4
  244. package/build/esm/object-table/TableRow.js.map +1 -1
  245. package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
  246. package/build/esm/object-table/utils/editableUtils.js +39 -0
  247. package/build/esm/object-table/utils/editableUtils.js.map +1 -0
  248. package/build/esm/object-table/utils/shouldShowEditableCell.js +1 -1
  249. package/build/esm/object-table/utils/shouldShowEditableCell.js.map +1 -1
  250. package/build/esm/object-table/utils/types.js.map +1 -1
  251. package/build/esm/tokens/component-tokens/button.css +15 -0
  252. package/build/esm/tokens/component-tokens/combobox.css +9 -0
  253. package/build/esm/tokens/component-tokens/datetime-picker.css +2 -2
  254. package/build/esm/tokens/component-tokens/file-picker.css +0 -10
  255. package/build/esm/tokens/component-tokens/filter-list.css +9 -6
  256. package/build/esm/tokens/component-tokens/form-section.css +1 -1
  257. package/build/esm/tokens/component-tokens/form.css +9 -5
  258. package/build/esm/tokens/component-tokens/table.css +3 -5
  259. package/build/esm/tokens.css +1 -0
  260. package/build/esm/util/UserAgent.js +1 -1
  261. package/build/types/action-form/ActionFormApi.d.ts +8 -8
  262. package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
  263. package/build/types/action-form/BaseForm.d.ts.map +1 -1
  264. package/build/types/action-form/FormFieldApi.d.ts +29 -22
  265. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  266. package/build/types/action-form/fields/DateCalendar.d.ts +6 -1
  267. package/build/types/action-form/fields/DateCalendar.d.ts.map +1 -1
  268. package/build/types/action-form/fields/DateRangeCalendar.d.ts.map +1 -1
  269. package/build/types/action-form/fields/DateRangeInputField.d.ts.map +1 -1
  270. package/build/types/action-form/fields/DatetimePickerField.d.ts.map +1 -1
  271. package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -1
  272. package/build/types/action-form/fields/FilePickerField.d.ts.map +1 -1
  273. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
  274. package/build/types/action-form/fields/SwitchField.d.ts +7 -0
  275. package/build/types/action-form/fields/SwitchField.d.ts.map +1 -0
  276. package/build/types/action-form/fields/TimePicker.d.ts +4 -5
  277. package/build/types/action-form/fields/TimePicker.d.ts.map +1 -1
  278. package/build/types/action-form/fields/useDateEditState.d.ts +2 -2
  279. package/build/types/base-components/action-button/ActionButton.d.ts +1 -0
  280. package/build/types/base-components/action-button/ActionButton.d.ts.map +1 -1
  281. package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
  282. package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
  283. package/build/types/filter-list/base/inputs/NoValueLabel.d.ts +15 -0
  284. package/build/types/filter-list/base/inputs/NoValueLabel.d.ts.map +1 -0
  285. package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -1
  286. package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
  287. package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -1
  288. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
  289. package/build/types/filter-list/hooks/useStableMapEntries.d.ts +9 -0
  290. package/build/types/filter-list/hooks/useStableMapEntries.d.ts.map +1 -0
  291. package/build/types/filter-list/utils/filterValues.d.ts +7 -0
  292. package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
  293. package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
  294. package/build/types/object-table/EditableCell.d.ts +1 -1
  295. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  296. package/build/types/object-table/ObjectTableApi.d.ts +26 -7
  297. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  298. package/build/types/object-table/Table.d.ts +9 -2
  299. package/build/types/object-table/Table.d.ts.map +1 -1
  300. package/build/types/object-table/TableBody.d.ts +2 -1
  301. package/build/types/object-table/TableBody.d.ts.map +1 -1
  302. package/build/types/object-table/TableRow.d.ts +2 -1
  303. package/build/types/object-table/TableRow.d.ts.map +1 -1
  304. package/build/types/object-table/utils/editableUtils.d.ts +16 -0
  305. package/build/types/object-table/utils/editableUtils.d.ts.map +1 -0
  306. package/build/types/object-table/utils/shouldShowEditableCell.d.ts +2 -1
  307. package/build/types/object-table/utils/shouldShowEditableCell.d.ts.map +1 -1
  308. package/build/types/object-table/utils/types.d.ts +4 -11
  309. package/build/types/object-table/utils/types.d.ts.map +1 -1
  310. package/docs/ActionForm.md +176 -0
  311. package/docs/CSSVariables.md +31 -30
  312. package/docs/ObjectTable.md +141 -16
  313. package/package.json +6 -5
  314. package/build/cjs/DateCalendar-2W4QHEEI.css.map +0 -1
  315. package/build/cjs/DateCalendar-QGSYBWJB.cjs +0 -24
  316. package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs +0 -48
  317. package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs.map +0 -1
  318. package/build/cjs/DateRangeCalendar-M63S2LLG.css.map +0 -1
  319. package/build/cjs/chunk-B2GRQRWU.cjs.map +0 -1
  320. package/build/cjs/chunk-BJDCC446.cjs.map +0 -1
  321. package/build/cjs/chunk-JLESWL47.cjs.map +0 -1
  322. package/build/cjs/chunk-L5LPFCXT.cjs.map +0 -1
  323. package/build/cjs/chunk-SB2VTP67.cjs.map +0 -1
  324. package/build/cjs/chunk-T7I6O43T.cjs.map +0 -1
  325. package/build/cjs/chunk-UCTQICPR.cjs +0 -10
  326. package/build/cjs/chunk-UCTQICPR.cjs.map +0 -1
  327. package/build/cjs/chunk-VVJFMOZI.cjs.map +0 -1
  328. package/build/cjs/chunk-YPXTSEE7.cjs.map +0 -1
@@ -19,7 +19,7 @@ import { Input } from "@base-ui/react/input";
19
19
  import { Popover } from "@base-ui/react/popover";
20
20
  import classnames from "classnames";
21
21
  import React, { useCallback, useId, useRef, useState } from "react";
22
- import { formatDateForDisplay, formatDateForInput, formatDatetimeForInput, getTimeValue, parseDateFromInput, parseDatetimeFromInput, parseTimeString } from "../../shared/dateUtils.js";
22
+ import { formatDateForInput, formatDatetimeForInput, parseDateFromInput, parseDatetimeFromInput } from "../../shared/dateUtils.js";
23
23
  import { EMPTY_RANGE } from "../FormFieldApi.js";
24
24
  import { stopPropagation } from "./calendarShared.js";
25
25
  import commonStyles from "./DatePickerCommon.module.css";
@@ -54,6 +54,10 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
54
54
  }) {
55
55
  const shouldCloseOnSelection = !showTime;
56
56
  const popoverId = useId();
57
+ // The range container anchors the shared popover without becoming a trigger.
58
+ // Each input is its own Popover.Trigger so the comboboxes are not nested in an
59
+ // interactive wrapper.
60
+ const triggerRef = useRef(null);
57
61
  const startInputRef = useRef(null);
58
62
  const endInputRef = useRef(null);
59
63
  const popoverRef = useRef(null);
@@ -69,9 +73,10 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
69
73
  const [startDate, endDate] = value ?? EMPTY_RANGE;
70
74
 
71
75
  // editFormatFn produces a parsable string for typing (e.g. "2024-01-15" or "2024-01-15 14:30").
72
- // displayFormatFn produces a human-readable string for idle state (e.g. "Jan 15, 2024").
76
+ // displayFormatFn produces the idle string. Defaults stay deterministic so
77
+ // users in different browser locales see the same date in form inputs.
73
78
  const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;
74
- const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput : formatDateForDisplay);
79
+ const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput : formatDateForInput);
75
80
  const parseFn = parseDate ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);
76
81
 
77
82
  // Wrap onChange to handle tuple construction and overlap rejection.
@@ -171,6 +176,18 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
171
176
  stopEndEditing();
172
177
  getActiveInputRef().current?.focus();
173
178
  }, [getActiveInputRef, stopStartEditing, stopEndEditing]);
179
+ const handleStartPointerDown = useCallback(() => {
180
+ // Opening from pointer-down keeps mouse interactions in sync with focus
181
+ // editing before Base UI's later click trigger handler runs.
182
+ startInputRef.current?.focus();
183
+ handleStartFocus();
184
+ }, [handleStartFocus]);
185
+ const handleEndPointerDown = useCallback(() => {
186
+ // Opening from pointer-down keeps mouse interactions in sync with focus
187
+ // editing before Base UI's later click trigger handler runs.
188
+ endInputRef.current?.focus();
189
+ handleEndFocus();
190
+ }, [handleEndFocus]);
174
191
 
175
192
  // --- Blur handlers ---
176
193
 
@@ -280,26 +297,14 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
280
297
 
281
298
  // --- Time handlers ---
282
299
 
283
- const handleStartTimeChange = useCallback(timeString => {
284
- const {
285
- hours,
286
- minutes
287
- } = parseTimeString(timeString);
288
- const base = startDate != null ? new Date(startDate.getTime()) : new Date();
289
- base.setHours(hours, minutes, 0, 0);
290
- onChange?.([base, endDate ?? null]);
291
- setStartDateValue(base);
292
- }, [startDate, endDate, onChange, setStartDateValue]);
293
- const handleEndTimeChange = useCallback(timeString => {
294
- const {
295
- hours,
296
- minutes
297
- } = parseTimeString(timeString);
298
- const base = endDate != null ? new Date(endDate.getTime()) : new Date();
299
- base.setHours(hours, minutes, 0, 0);
300
- onChange?.([startDate ?? null, base]);
301
- setEndDateValue(base);
302
- }, [startDate, endDate, onChange, setEndDateValue]);
300
+ const handleStartTimeChange = useCallback(time => {
301
+ onChange?.([time, endDate ?? null]);
302
+ setStartDateValue(time);
303
+ }, [endDate, onChange, setStartDateValue]);
304
+ const handleEndTimeChange = useCallback(time => {
305
+ onChange?.([startDate ?? null, time]);
306
+ setEndDateValue(time);
307
+ }, [startDate, onChange, setEndDateValue]);
303
308
 
304
309
  // --- Focus boundary handlers ---
305
310
  // Visually-hidden sentinels at the top/bottom of the popover that trap Tab
@@ -334,14 +339,12 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
334
339
  from: startDate ?? undefined,
335
340
  to: endDate ?? undefined
336
341
  } : undefined;
337
- const timeFooter = showTime ? /*#__PURE__*/React.createElement("div", {
338
- className: styles.osdkDateRangeTimeRow
339
- }, /*#__PURE__*/React.createElement(TimePicker, {
340
- value: getTimeValue(startDate),
342
+ const timeFooter = showTime ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TimePicker, {
343
+ value: startDate,
341
344
  onChange: handleStartTimeChange,
342
345
  label: "Start time"
343
346
  }), /*#__PURE__*/React.createElement(TimePicker, {
344
- value: getTimeValue(endDate),
347
+ value: endDate,
345
348
  onChange: handleEndTimeChange,
346
349
  label: "End time"
347
350
  })) : undefined;
@@ -349,6 +352,10 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
349
352
  ...SHARED_INPUT_PROPS,
350
353
  "aria-controls": popoverId
351
354
  };
355
+
356
+ // Keep Popover.Trigger on each input itself. Moving it to the range wrapper
357
+ // would make click handling simpler, but it would also nest interactive
358
+ // comboboxes inside an interactive trigger and reintroduce the axe violation.
352
359
  return /*#__PURE__*/React.createElement(Popover.Root, {
353
360
  open: isOpen,
354
361
  onOpenChange: handleOpenChange
@@ -356,45 +363,52 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
356
363
  // is not reinterpreted after the portal dismiss layer appears.
357
364
  ,
358
365
  modal: "trap-focus"
359
- }, /*#__PURE__*/React.createElement(Popover.Trigger, {
360
- nativeButton: false,
361
- render: /*#__PURE__*/React.createElement("div", {
362
- className: styles.osdkDateRangeContainer
363
- })
366
+ }, /*#__PURE__*/React.createElement("div", {
367
+ ref: triggerRef,
368
+ className: styles.osdkDateRangeContainer
364
369
  }, /*#__PURE__*/React.createElement("div", {
365
370
  className: classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDateRangeInputWrapper, startInvalid && commonStyles.osdkDatePickerInputWrapperError)
366
- }, /*#__PURE__*/React.createElement(Input, _extends({
367
- ref: startInputRef,
368
- id: id != null ? `${id}-start` : undefined,
369
- value: displayedStart,
370
- onValueChange: setStartInputValue,
371
- onFocus: handleStartFocus,
372
- onBlur: handleStartBlur,
373
- onKeyDown: handleStartKeyDown,
374
- placeholder: placeholderStart,
375
- "aria-expanded": isOpen && activeBoundary === "start",
376
- "aria-label": "Start date",
377
- "aria-invalid": startInvalid || undefined
378
- }, sharedInputProps))), /*#__PURE__*/React.createElement("div", {
371
+ }, /*#__PURE__*/React.createElement(Popover.Trigger, {
372
+ nativeButton: false,
373
+ render: /*#__PURE__*/React.createElement(Input, _extends({
374
+ ref: startInputRef,
375
+ id: id != null ? `${id}-start` : undefined,
376
+ value: displayedStart,
377
+ onValueChange: setStartInputValue,
378
+ onFocus: handleStartFocus,
379
+ onPointerDown: handleStartPointerDown,
380
+ onBlur: handleStartBlur,
381
+ onKeyDown: handleStartKeyDown,
382
+ placeholder: placeholderStart,
383
+ "aria-expanded": isOpen && activeBoundary === "start",
384
+ "aria-label": "Start date",
385
+ "aria-invalid": startInvalid || undefined
386
+ }, sharedInputProps))
387
+ })), /*#__PURE__*/React.createElement("div", {
379
388
  className: classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDateRangeInputWrapper, endInvalid && commonStyles.osdkDatePickerInputWrapperError)
380
- }, /*#__PURE__*/React.createElement(Input, _extends({
381
- ref: endInputRef,
382
- id: id != null ? `${id}-end` : undefined,
383
- value: displayedEnd,
384
- onValueChange: setEndInputValue,
385
- onFocus: handleEndFocus,
386
- onBlur: handleEndBlur,
387
- onKeyDown: handleEndKeyDown,
388
- placeholder: placeholderEnd,
389
- "aria-expanded": isOpen && activeBoundary === "end",
390
- "aria-label": "End date",
391
- "aria-invalid": endInvalid || undefined
392
- }, sharedInputProps)))), /*#__PURE__*/React.createElement(Popover.Portal, {
389
+ }, /*#__PURE__*/React.createElement(Popover.Trigger, {
390
+ nativeButton: false,
391
+ render: /*#__PURE__*/React.createElement(Input, _extends({
392
+ ref: endInputRef,
393
+ id: id != null ? `${id}-end` : undefined,
394
+ value: displayedEnd,
395
+ onValueChange: setEndInputValue,
396
+ onBlur: handleEndBlur,
397
+ onKeyDown: handleEndKeyDown,
398
+ onFocus: handleEndFocus,
399
+ onPointerDown: handleEndPointerDown,
400
+ placeholder: placeholderEnd,
401
+ "aria-expanded": isOpen && activeBoundary === "end",
402
+ "aria-label": "End date",
403
+ "aria-invalid": endInvalid || undefined
404
+ }, sharedInputProps))
405
+ }))), /*#__PURE__*/React.createElement(Popover.Portal, {
393
406
  container: portalContainer
394
407
  }, /*#__PURE__*/React.createElement(PortalDismissLayer, {
395
408
  className: commonStyles.osdkDatePickerDismissLayer,
396
409
  onDismiss: closePopover
397
410
  }), /*#__PURE__*/React.createElement(Popover.Positioner, {
411
+ anchor: triggerRef,
398
412
  className: commonStyles.osdkDatePickerPositioner,
399
413
  sideOffset: 4
400
414
  }, /*#__PURE__*/React.createElement(Popover.Popup, {
@@ -416,8 +430,9 @@ export const DateRangeInputField = /*#__PURE__*/React.memo(function ({
416
430
  selected: calendarSelected,
417
431
  onSelect: handleRangeSelect,
418
432
  min: min,
419
- max: max
420
- }), timeFooter, /*#__PURE__*/React.createElement("div", {
433
+ max: max,
434
+ footer: timeFooter
435
+ }), /*#__PURE__*/React.createElement("div", {
421
436
  onFocus: handleEndFocusBoundary,
422
437
  tabIndex: 0,
423
438
  "aria-label": "End of date range picker dialog",
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeInputField.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForDisplay","formatDateForInput","formatDatetimeForInput","getTimeValue","parseDateFromInput","parseDatetimeFromInput","parseTimeString","EMPTY_RANGE","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","PortalDismissLayer","TimePicker","useDateEditState","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangeInputField","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","shouldCloseOnSelection","popoverId","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","timeString","hours","minutes","base","Date","getTime","setHours","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","osdkDateRangeTimeRow","label","sharedInputProps","Root","open","onOpenChange","modal","Trigger","nativeButton","render","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","_extends","ref","onValueChange","onFocus","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","osdkDatePickerPositioner","sideOffset","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","start","end"],"sources":["DateRangeInputField.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForDisplay,\n formatDateForInput,\n formatDatetimeForInput,\n getTimeValue,\n parseDateFromInput,\n parseDatetimeFromInput,\n parseTimeString,\n} from \"../../shared/dateUtils.js\";\nimport { type DateRangeInputFieldProps, EMPTY_RANGE } from \"../FormFieldApi.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangeInputField.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { PortalDismissLayer } from \"./PortalDismissLayer.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangeInputField: React.NamedExoticComponent<\n DateRangeInputFieldProps\n> = React.memo(function DateRangeInputField({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n}: DateRangeInputFieldProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces a human-readable string for idle state (e.g. \"Jan 15, 2024\").\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForDisplay);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (timeString: string) => {\n const { hours, minutes } = parseTimeString(timeString);\n const base = startDate != null\n ? new Date(startDate.getTime())\n : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.([base, endDate ?? null]);\n setStartDateValue(base);\n },\n [startDate, endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (timeString: string) => {\n const { hours, minutes } = parseTimeString(timeString);\n const base = endDate != null ? new Date(endDate.getTime()) : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.([startDate ?? null, base]);\n setEndDateValue(base);\n },\n [startDate, endDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <div className={styles.osdkDateRangeTimeRow}>\n <TimePicker\n value={getTimeValue(startDate)}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={getTimeValue(endDate)}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </div>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n // Uses pointer-down outside dismissal so the click that opens the picker\n // is not reinterpreted after the portal dismiss layer appears.\n modal=\"trap-focus\"\n >\n <Popover.Trigger\n nativeButton={false}\n render={<div className={styles.osdkDateRangeContainer} />}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n onFocus={handleStartFocus}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n onFocus={handleEndFocus}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n placeholder={placeholderEnd}\n aria-expanded={isOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n </div>\n </Popover.Trigger>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n />\n {timeFooter}\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DateRangeInputField.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","parseDateFromInput","parseDatetimeFromInput","EMPTY_RANGE","stopPropagation","commonStyles","styles","LazyDateRangeCalendar","PortalDismissLayer","TimePicker","useDateEditState","SHARED_INPUT_PROPS","className","osdkDatePickerInput","type","onClick","autoComplete","role","DateRangeInputField","memo","id","value","onChange","min","max","placeholderStart","placeholderEnd","allowSingleDayRange","showTime","formatDate","parseDate","portalContainer","shouldCloseOnSelection","popoverId","triggerRef","startInputRef","endInputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","activeBoundary","setActiveBoundary","startDate","endDate","editFormatFn","displayFormatFn","parseFn","startOnChange","date","isOverlapping","endOnChange","isEditing","isEditingStart","dateValue","startParsedValue","inputError","startInputError","displayedValue","displayedStart","startEditing","beginStartEditing","stopEditing","stopStartEditing","commitAndStopEditing","commitStartAndStopEditing","setInputValue","setStartInputValue","setDateValue","setStartDateValue","isEditingEnd","endParsedValue","endInputError","displayedEnd","beginEndEditing","stopEndEditing","commitEndAndStopEditing","setEndInputValue","setEndDateValue","hasOverlapError","effectiveStart","undefined","effectiveEnd","startInvalid","endInvalid","getActiveInputRef","beginEditing","boundary","handleInputFocus","current","handleStartFocus","handleEndFocus","closePopoverForBoundaryExit","focus","handleStartPointerDown","handleEndPointerDown","handleStartBlur","e","related","relatedTarget","document","activeElement","contains","handleEndBlur","closePopover","blur","handleStartKeyDown","key","preventDefault","shiftKey","handleEndKeyDown","firstButton","querySelector","handleOpenChange","nextOpen","handleRangeSelect","range","newStart","from","newEnd","to","handleStartTimeChange","time","handleEndTimeChange","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","calendarSelected","timeFooter","createElement","Fragment","label","sharedInputProps","Root","open","onOpenChange","modal","ref","osdkDateRangeContainer","osdkDatePickerInputWrapper","osdkDateRangeInputWrapper","osdkDatePickerInputWrapperError","Trigger","nativeButton","render","_extends","onValueChange","onFocus","onPointerDown","onBlur","onKeyDown","placeholder","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","selected","onSelect","footer","start","end","getTime"],"sources":["DateRangeInputField.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport type { DateRange as RdpDateRange } from \"react-day-picker\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../../shared/dateUtils.js\";\nimport { type DateRangeInputFieldProps, EMPTY_RANGE } from \"../FormFieldApi.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DateRangeInputField.module.css\";\nimport { LazyDateRangeCalendar } from \"./LazyDateRangeCalendar.js\";\nimport { PortalDismissLayer } from \"./PortalDismissLayer.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\ntype ActiveBoundary = \"start\" | \"end\";\n\n// Shared props for both start/end inputs. role=\"combobox\" because each input\n// triggers a shared popup (the calendar popover) — matching WAI-ARIA combobox pattern.\nconst SHARED_INPUT_PROPS = {\n className: commonStyles.osdkDatePickerInput,\n type: \"text\" as const,\n onClick: stopPropagation,\n autoComplete: \"off\" as const,\n role: \"combobox\" as const,\n \"aria-haspopup\": \"dialog\" as const,\n} as const;\n\nexport const DateRangeInputField: React.NamedExoticComponent<\n DateRangeInputFieldProps\n> = React.memo(function DateRangeInputField({\n id,\n value,\n onChange,\n min,\n max,\n placeholderStart,\n placeholderEnd,\n allowSingleDayRange = true,\n showTime = false,\n formatDate,\n parseDate,\n portalContainer,\n}: DateRangeInputFieldProps) {\n const shouldCloseOnSelection = !showTime;\n const popoverId = useId();\n // The range container anchors the shared popover without becoming a trigger.\n // Each input is its own Popover.Trigger so the comboboxes are not nested in an\n // interactive wrapper.\n const triggerRef = useRef<HTMLDivElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When focus returns to an input after Tab exits the popover boundary, the\n // next input focus should not reopen the calendar before native Tab can\n // continue to the following form field.\n const skipReopenRef = useRef(false);\n // Tracks which input (start/end) owns the shared calendar popover.\n // Used to restore focus to the correct input when Tab-cycling through\n // focus boundaries and when the calendar selects a range endpoint.\n const [activeBoundary, setActiveBoundary] = useState<ActiveBoundary>(\"start\");\n\n const [startDate, endDate] = value ?? EMPTY_RANGE;\n\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n // Wrap onChange to handle tuple construction and overlap rejection.\n // Clearing (null) is always allowed; overlap is checked for non-null dates.\n const startOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(date, endDate, allowSingleDayRange)) {\n return;\n }\n onChange?.([date, endDate ?? null]);\n },\n [endDate, onChange, allowSingleDayRange],\n );\n\n const endOnChange = useCallback(\n (date: Date | null) => {\n if (date != null && isOverlapping(startDate, date, allowSingleDayRange)) {\n return;\n }\n onChange?.([startDate ?? null, date]);\n },\n [startDate, onChange, allowSingleDayRange],\n );\n\n const {\n isEditing: isEditingStart,\n dateValue: startParsedValue,\n inputError: startInputError,\n displayedValue: displayedStart,\n startEditing: beginStartEditing,\n stopEditing: stopStartEditing,\n commitAndStopEditing: commitStartAndStopEditing,\n setInputValue: setStartInputValue,\n setDateValue: setStartDateValue,\n } = useDateEditState({\n value: startDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: startOnChange,\n });\n const {\n isEditing: isEditingEnd,\n dateValue: endParsedValue,\n inputError: endInputError,\n displayedValue: displayedEnd,\n startEditing: beginEndEditing,\n stopEditing: stopEndEditing,\n commitAndStopEditing: commitEndAndStopEditing,\n setInputValue: setEndInputValue,\n setDateValue: setEndDateValue,\n } = useDateEditState({\n value: endDate,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange: endOnChange,\n });\n\n // --- Cross-input error: overlapping range (live feedback while typing) ---\n // Blur/Enter handlers prevent overlapping values from being committed,\n // so this only fires during editing for immediate red-border feedback.\n const hasOverlapError = (() => {\n if (!isEditingStart && !isEditingEnd) return false;\n const effectiveStart = isEditingStart\n ? startParsedValue\n : (startDate ?? undefined);\n const effectiveEnd = isEditingEnd\n ? endParsedValue\n : (endDate ?? undefined);\n return isOverlapping(effectiveStart, effectiveEnd, allowSingleDayRange);\n })();\n\n const startInvalid = startInputError != null || hasOverlapError;\n const endInvalid = endInputError != null || hasOverlapError;\n\n // --- Focus handlers ---\n\n const getActiveInputRef = useCallback(\n () => activeBoundary === \"start\" ? startInputRef : endInputRef,\n [activeBoundary],\n );\n\n const beginEditing = useCallback(\n (boundary: ActiveBoundary) => {\n if (boundary === \"start\") {\n beginStartEditing();\n } else {\n beginEndEditing();\n }\n setActiveBoundary(boundary);\n },\n [beginStartEditing, beginEndEditing],\n );\n\n const handleInputFocus = useCallback(\n (boundary: ActiveBoundary) => {\n beginEditing(boundary);\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n return;\n }\n setIsOpen(true);\n },\n [beginEditing],\n );\n\n const handleStartFocus = useCallback(() => {\n handleInputFocus(\"start\");\n }, [handleInputFocus]);\n\n const handleEndFocus = useCallback(() => {\n handleInputFocus(\"end\");\n }, [handleInputFocus]);\n\n const closePopoverForBoundaryExit = useCallback(() => {\n skipReopenRef.current = true;\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef, stopStartEditing, stopEndEditing]);\n\n const handleStartPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n startInputRef.current?.focus();\n handleStartFocus();\n }, [handleStartFocus]);\n\n const handleEndPointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n endInputRef.current?.focus();\n handleEndFocus();\n }, [handleEndFocus]);\n\n // --- Blur handlers ---\n\n const handleStartBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n // Focus moved into the popover portal — the field is still logically\n // active, so suppress the blur from bubbling to parent containers.\n e.stopPropagation();\n return;\n }\n if (endInputRef.current === related) {\n return;\n }\n commitStartAndStopEditing();\n },\n [commitStartAndStopEditing],\n );\n\n const handleEndBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n e.stopPropagation();\n return;\n }\n if (startInputRef.current === related) {\n return;\n }\n commitEndAndStopEditing();\n },\n [commitEndAndStopEditing],\n );\n\n // --- Popover helpers ---\n\n // Shared close sequence: dismiss the popover, reset both editing states,\n // and blur both inputs so focus doesn't linger after the calendar disappears.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopStartEditing();\n stopEndEditing();\n startInputRef.current?.blur();\n endInputRef.current?.blur();\n }, [stopStartEditing, stopEndEditing]);\n\n // --- Keyboard handlers ---\n\n const handleStartKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitStartAndStopEditing();\n // Auto-advance to end\n endInputRef.current?.focus();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitStartAndStopEditing, closePopover],\n );\n\n const handleEndKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitEndAndStopEditing();\n closePopover();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Tab from the end input bridges focus into the popover. The popover\n // doesn't auto-focus on open (to keep the cursor in the input for typing),\n // so we manually focus the first interactive element (nav button or select).\n const firstButton = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstButton != null) {\n e.preventDefault();\n firstButton.focus();\n }\n }\n },\n [commitEndAndStopEditing, closePopover, isOpen],\n );\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleRangeSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n const newStart = range?.from ?? null;\n const newEnd = range?.to ?? null;\n\n onChange?.([newStart, newEnd]);\n\n if (newStart != null && newEnd == null) {\n // Start selected — commit the start and advance to end.\n // displayedValue handles the display format after stopEditing.\n stopStartEditing();\n setActiveBoundary(\"end\");\n endInputRef.current?.focus();\n } else if (\n newStart != null\n && newEnd != null\n && shouldCloseOnSelection\n ) {\n // Full range selected — close and blur.\n closePopover();\n } else if (newStart != null && newEnd != null) {\n // Full range selected but popover stays open (showTime) —\n // inputs remain in editing mode, so update with editFormatFn.\n setStartDateValue(newStart);\n setEndDateValue(newEnd);\n }\n },\n [\n onChange,\n shouldCloseOnSelection,\n closePopover,\n stopStartEditing,\n setStartDateValue,\n setEndDateValue,\n ],\n );\n\n // --- Time handlers ---\n\n const handleStartTimeChange = useCallback(\n (time: Date) => {\n onChange?.([time, endDate ?? null]);\n setStartDateValue(time);\n },\n [endDate, onChange, setStartDateValue],\n );\n\n const handleEndTimeChange = useCallback(\n (time: Date) => {\n onChange?.([startDate ?? null, time]);\n setEndDateValue(time);\n },\n [startDate, onChange, setEndDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden sentinels at the top/bottom of the popover that trap Tab\n // cycling between the text inputs and calendar.\n\n // Start boundary (top): Shift+Tab past the first calendar element redirects\n // focus to whichever input is currently active.\n const handleStartFocusBoundary = useCallback(() => {\n getActiveInputRef().current?.focus();\n }, [getActiveInputRef]);\n\n // End boundary (bottom): Two cases —\n // (1) Tab past the last calendar element (focus came from inside the popover)\n // → close the popover and return focus to the active input so the next\n // native Tab continues to the next form field.\n // (2) Focus entered from outside the popover (e.g. reverse Tab from the page)\n // → redirect to the last interactive element inside the popover.\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const related = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(related as Node)) {\n closePopoverForBoundaryExit();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [closePopoverForBoundaryExit],\n );\n\n // --- Calendar selected range ---\n\n const calendarSelected: RdpDateRange | undefined =\n startDate != null || endDate != null\n ? { from: startDate ?? undefined, to: endDate ?? undefined }\n : undefined;\n\n const timeFooter = showTime\n ? (\n <>\n <TimePicker\n value={startDate}\n onChange={handleStartTimeChange}\n label=\"Start time\"\n />\n <TimePicker\n value={endDate}\n onChange={handleEndTimeChange}\n label=\"End time\"\n />\n </>\n )\n : undefined;\n\n const sharedInputProps = {\n ...SHARED_INPUT_PROPS,\n \"aria-controls\": popoverId,\n };\n\n // Keep Popover.Trigger on each input itself. Moving it to the range wrapper\n // would make click handling simpler, but it would also nest interactive\n // comboboxes inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n // Uses pointer-down outside dismissal so the click that opens the picker\n // is not reinterpreted after the portal dismiss layer appears.\n modal=\"trap-focus\"\n >\n <div\n ref={triggerRef}\n className={styles.osdkDateRangeContainer}\n >\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n startInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={startInputRef}\n id={id != null ? `${id}-start` : undefined}\n value={displayedStart}\n onValueChange={setStartInputValue}\n onFocus={handleStartFocus}\n onPointerDown={handleStartPointerDown}\n onBlur={handleStartBlur}\n onKeyDown={handleStartKeyDown}\n placeholder={placeholderStart}\n aria-expanded={isOpen && activeBoundary === \"start\"}\n aria-label=\"Start date\"\n aria-invalid={startInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n <div\n className={classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDateRangeInputWrapper,\n endInvalid && commonStyles.osdkDatePickerInputWrapperError,\n )}\n >\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={endInputRef}\n id={id != null ? `${id}-end` : undefined}\n value={displayedEnd}\n onValueChange={setEndInputValue}\n onBlur={handleEndBlur}\n onKeyDown={handleEndKeyDown}\n onFocus={handleEndFocus}\n onPointerDown={handleEndPointerDown}\n placeholder={placeholderEnd}\n aria-expanded={isOpen && activeBoundary === \"end\"}\n aria-label=\"End date\"\n aria-invalid={endInvalid || undefined}\n {...sharedInputProps}\n />\n }\n />\n </div>\n </div>\n <Popover.Portal container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={triggerRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date range picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the inputs.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateRangeCalendar\n selected={calendarSelected}\n onSelect={handleRangeSelect}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date range picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n\n/** True when the end boundary is before (or same-day when disallowed) the start. */\nfunction isOverlapping(\n start: Date | null | undefined,\n end: Date | null | undefined,\n allowSingleDayRange: boolean,\n): boolean {\n if (start == null || end == null) return false;\n if (!allowSingleDayRange && end.getTime() === start.getTime()) return true;\n return end.getTime() < start.getTime();\n}\n"],"mappings":"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","ignoreList":[]}
@@ -15,18 +15,3 @@
15
15
  flex: 1;
16
16
  min-width: 0;
17
17
  }
18
-
19
- /* Two TimePickers side-by-side, each centered under its calendar month.
20
- Negative horizontal margin counters the popover padding so the border-top
21
- spans the full width of the popover. */
22
- .osdkDateRangeTimeRow {
23
- display: flex;
24
- gap: var(--osdk-time-picker-gap);
25
- padding-top: var(--osdk-time-picker-padding-top);
26
- padding-left: var(--osdk-datetime-popover-padding);
27
- padding-right: var(--osdk-datetime-popover-padding);
28
- margin-top: var(--osdk-time-picker-margin-top);
29
- margin-left: calc(var(--osdk-datetime-popover-padding) * -1);
30
- margin-right: calc(var(--osdk-datetime-popover-padding) * -1);
31
- border-top: var(--osdk-time-picker-border-top);
32
- }
@@ -18,7 +18,7 @@ import { Input } from "@base-ui/react/input";
18
18
  import { Popover } from "@base-ui/react/popover";
19
19
  import classnames from "classnames";
20
20
  import React, { useCallback, useId, useRef, useState } from "react";
21
- import { formatDateForDisplay, formatDateForInput, formatDatetimeForInput, getTimeValue, parseDateFromInput, parseDatetimeFromInput, parseTimeString } from "../../shared/dateUtils.js";
21
+ import { formatDateForInput, formatDatetimeForInput, isDateInRange, parseDateFromInput, parseDatetimeFromInput } from "../../shared/dateUtils.js";
22
22
  import { stopPropagation } from "./calendarShared.js";
23
23
  import commonStyles from "./DatePickerCommon.module.css";
24
24
  import styles from "./DatetimePickerField.module.css";
@@ -43,9 +43,17 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
43
43
  }) {
44
44
  const shouldCloseOnSelection = closeOnSelection ?? !showTime;
45
45
  const popoverId = useId();
46
+ // The wrapper is only a visual/positioning anchor. The input itself remains
47
+ // the Popover.Trigger so axe does not see an interactive wrapper around an
48
+ // interactive combobox.
49
+ const wrapperRef = useRef(null);
46
50
  const inputRef = useRef(null);
47
51
  const popoverRef = useRef(null);
48
52
  const [isOpen, setIsOpen] = useState(false);
53
+ // activeDateValue is the selected/typed date; visibleCalendarMonth is only
54
+ // the calendar viewport. Keeping the viewport separate lets typed dates jump
55
+ // the calendar while next/previous month navigation still works.
56
+ const [visibleCalendarMonth, setVisibleCalendarMonth] = useState(value ?? new Date());
49
57
  // When true, the next handleFocus call skips reopening the popover.
50
58
  // Set before focusing the input from a popover boundary exit so that
51
59
  // Tab/Shift-Tab proceeds to the adjacent form field naturally.
@@ -53,13 +61,16 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
53
61
 
54
62
  // Format/parse: pick between date-only and datetime variants.
55
63
  // editFormatFn produces a parsable string for typing (e.g. "2024-01-15" or "2024-01-15 14:30").
56
- // displayFormatFn produces a human-readable string for idle state (e.g. "Jan 15, 2024").
64
+ // displayFormatFn produces the idle string. Defaults stay deterministic so
65
+ // users in different browser locales see the same date in form inputs.
57
66
  const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;
58
- const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput : formatDateForDisplay);
67
+ const displayFormatFn = formatDate ?? (showTime ? formatDatetimeForInput : formatDateForInput);
59
68
  const parseFn = parseDate ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);
60
69
  const {
70
+ isEditing,
61
71
  displayedValue,
62
72
  inputError,
73
+ dateValue,
63
74
  startEditing,
64
75
  stopEditing,
65
76
  commitAndStopEditing,
@@ -84,8 +95,22 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
84
95
  return;
85
96
  }
86
97
  startEditing();
98
+ setVisibleCalendarMonth(value ?? undefined);
87
99
  setIsOpen(true);
88
- }, [startEditing]);
100
+ }, [startEditing, value]);
101
+ const handlePointerDown = useCallback(() => {
102
+ // Opening from pointer-down keeps mouse interactions in sync with focus
103
+ // editing before Base UI's later click trigger handler runs.
104
+ inputRef.current?.focus();
105
+ handleFocus();
106
+ }, [handleFocus]);
107
+ const handleInputValueChange = useCallback(nextValue => {
108
+ setInputValue(nextValue);
109
+ const parsedDate = nextValue !== "" ? parseFn(nextValue) : undefined;
110
+ if (parsedDate != null && isDateInRange(parsedDate, min, max)) {
111
+ setVisibleCalendarMonth(parsedDate);
112
+ }
113
+ }, [max, min, parseFn, setInputValue]);
89
114
  const handleBlur = useCallback(e => {
90
115
  const relatedTarget = e.relatedTarget ?? document.activeElement;
91
116
  if (popoverRef.current?.contains(relatedTarget)) {
@@ -155,20 +180,19 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
155
180
  }
156
181
  onChange?.(date);
157
182
  setDateValue(date);
183
+ setVisibleCalendarMonth(date);
158
184
  if (shouldCloseOnSelection) {
159
185
  closePopover();
160
186
  }
161
187
  }, [onChange, showTime, value, shouldCloseOnSelection, setDateValue, setInputValue, closePopover]);
162
- const handleTimeChange = useCallback(timeString => {
163
- const {
164
- hours,
165
- minutes
166
- } = parseTimeString(timeString);
167
- const base = value != null ? new Date(value.getTime()) : new Date();
168
- base.setHours(hours, minutes, 0, 0);
169
- onChange?.(base);
170
- setDateValue(base);
171
- }, [value, onChange, setDateValue]);
188
+ const handleTimeChange = useCallback(time => {
189
+ onChange?.(time);
190
+ setDateValue(time);
191
+ }, [onChange, setDateValue]);
192
+ const handleCalendarClear = useCallback(() => {
193
+ onChange?.(null);
194
+ setDateValue(null);
195
+ }, [onChange, setDateValue]);
172
196
 
173
197
  // --- Focus boundary handlers ---
174
198
  // Visually-hidden elements at the start/end of the popover that trap Tab
@@ -195,16 +219,20 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
195
219
  }
196
220
  }, [stopEditing]);
197
221
 
198
- // --- Time picker (rendered as a popover sibling, not a DayPicker footer,
199
- // so the border-top can span the full popover width via negative margins) ---
222
+ // --- Time picker ---
200
223
 
224
+ const activeDateValue = isEditing && inputError == null ? dateValue : value ?? undefined;
201
225
  const timeFooter = showTime ? /*#__PURE__*/React.createElement("div", {
202
226
  className: styles.osdkDatetimeTimeFooter
203
227
  }, /*#__PURE__*/React.createElement(TimePicker, {
204
- value: getTimeValue(value),
228
+ value: activeDateValue ?? null,
205
229
  onChange: handleTimeChange
206
230
  })) : undefined;
207
231
  const wrapperClassName = classnames(commonStyles.osdkDatePickerInputWrapper, styles.osdkDatetimeInputWrapper, inputError != null && commonStyles.osdkDatePickerInputWrapperError);
232
+
233
+ // Keep Popover.Trigger on the input itself. Moving it to the wrapper would
234
+ // make click handling simpler, but it would also nest an interactive combobox
235
+ // inside an interactive trigger and reintroduce the axe violation.
208
236
  return /*#__PURE__*/React.createElement(Popover.Root, {
209
237
  open: isOpen,
210
238
  onOpenChange: handleOpenChange
@@ -212,29 +240,30 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
212
240
  // is not reinterpreted after the portal dismiss layer appears.
213
241
  ,
214
242
  modal: "trap-focus"
243
+ }, /*#__PURE__*/React.createElement("div", {
244
+ ref: wrapperRef,
245
+ className: wrapperClassName
215
246
  }, /*#__PURE__*/React.createElement(Popover.Trigger, {
216
247
  nativeButton: false,
217
- render: /*#__PURE__*/React.createElement("div", {
218
- className: wrapperClassName,
219
- tabIndex: -1
248
+ render: /*#__PURE__*/React.createElement(Input, {
249
+ ref: inputRef,
250
+ id: id,
251
+ className: commonStyles.osdkDatePickerInput,
252
+ type: "text",
253
+ value: displayedValue,
254
+ onValueChange: handleInputValueChange,
255
+ onFocus: handleFocus,
256
+ onPointerDown: handlePointerDown,
257
+ onBlur: handleBlur,
258
+ onClick: stopPropagation,
259
+ onKeyDown: handleKeyDown,
260
+ placeholder: placeholder,
261
+ autoComplete: "off",
262
+ role: "combobox",
263
+ "aria-expanded": isOpen,
264
+ "aria-controls": popoverId,
265
+ "aria-haspopup": "dialog"
220
266
  })
221
- }, /*#__PURE__*/React.createElement(Input, {
222
- ref: inputRef,
223
- id: id,
224
- className: commonStyles.osdkDatePickerInput,
225
- type: "text",
226
- value: displayedValue,
227
- onValueChange: setInputValue,
228
- onFocus: handleFocus,
229
- onBlur: handleBlur,
230
- onClick: stopPropagation,
231
- onKeyDown: handleKeyDown,
232
- placeholder: placeholder,
233
- autoComplete: "off",
234
- role: "combobox",
235
- "aria-expanded": isOpen,
236
- "aria-controls": popoverId,
237
- "aria-haspopup": "dialog"
238
267
  })), /*#__PURE__*/React.createElement(Popover.Portal, {
239
268
  ref: portalRef,
240
269
  container: portalContainer
@@ -242,6 +271,7 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
242
271
  className: commonStyles.osdkDatePickerDismissLayer,
243
272
  onDismiss: closePopover
244
273
  }), /*#__PURE__*/React.createElement(Popover.Positioner, {
274
+ anchor: wrapperRef,
245
275
  className: commonStyles.osdkDatePickerPositioner,
246
276
  sideOffset: 4
247
277
  }, /*#__PURE__*/React.createElement(Popover.Popup, {
@@ -260,11 +290,15 @@ export const DatetimePickerField = /*#__PURE__*/React.memo(function ({
260
290
  "aria-label": "Start of date picker dialog",
261
291
  className: commonStyles.osdkDatePickerFocusBoundary
262
292
  }), /*#__PURE__*/React.createElement(LazyDateCalendar, {
263
- dateSelected: value ?? undefined,
293
+ dateSelected: activeDateValue,
264
294
  onSelect: handleCalendarSelect,
295
+ onClear: handleCalendarClear,
296
+ month: visibleCalendarMonth,
297
+ onMonthChange: setVisibleCalendarMonth,
265
298
  min: min,
266
- max: max
267
- }), timeFooter, /*#__PURE__*/React.createElement("div", {
299
+ max: max,
300
+ footer: timeFooter
301
+ }), /*#__PURE__*/React.createElement("div", {
268
302
  onFocus: handleEndFocusBoundary,
269
303
  tabIndex: 0,
270
304
  "aria-label": "End of date picker dialog",