@multiplatform.one/forms 7.6.2 → 7.7.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 (492) hide show
  1. package/dist/cjs/Button/index.cjs +7 -1
  2. package/dist/cjs/Button/index.native.js +7 -1
  3. package/dist/cjs/Button/index.native.js.map +1 -1
  4. package/dist/cjs/Chip/index.cjs +1 -3
  5. package/dist/cjs/Chip/index.native.js +5 -3
  6. package/dist/cjs/Chip/index.native.js.map +1 -1
  7. package/dist/cjs/ContextualSaveBar/index.cjs +19 -3
  8. package/dist/cjs/ContextualSaveBar/index.native.js +19 -3
  9. package/dist/cjs/ContextualSaveBar/index.native.js.map +1 -1
  10. package/dist/cjs/DescriptionList/index.cjs +38 -12
  11. package/dist/cjs/DescriptionList/index.native.js +38 -12
  12. package/dist/cjs/DescriptionList/index.native.js.map +1 -1
  13. package/dist/cjs/ErrorSummary.cjs +4 -1
  14. package/dist/cjs/ErrorSummary.native.js +4 -1
  15. package/dist/cjs/ErrorSummary.native.js.map +1 -1
  16. package/dist/cjs/FloatingPanel/useFloatingPanel.cjs +24 -2
  17. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js +43 -2
  18. package/dist/cjs/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  19. package/dist/cjs/InputParts/index.cjs +42 -2
  20. package/dist/cjs/InputParts/index.native.js +42 -2
  21. package/dist/cjs/InputParts/index.native.js.map +1 -1
  22. package/dist/cjs/fields/Checkbox/Checkbox.cjs +5 -2
  23. package/dist/cjs/fields/Checkbox/Checkbox.native.js +6 -3
  24. package/dist/cjs/fields/Checkbox/Checkbox.native.js.map +1 -1
  25. package/dist/cjs/fields/Checkbox/CheckboxGroup.cjs +69 -59
  26. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js +75 -65
  27. package/dist/cjs/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  28. package/dist/cjs/fields/Checkbox/checkboxGroupContext.cjs +33 -0
  29. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js +36 -0
  30. package/dist/cjs/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  31. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.cjs +402 -0
  32. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
  33. package/dist/cjs/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  34. package/dist/cjs/fields/DatePicker/DatetimePicker.cjs +2 -376
  35. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js +69 -297
  36. package/dist/cjs/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  37. package/dist/cjs/fields/DatePicker/catalog.cjs +306 -0
  38. package/dist/cjs/fields/DatePicker/catalog.native.js +350 -0
  39. package/dist/cjs/fields/DatePicker/catalog.native.js.map +1 -0
  40. package/dist/cjs/fields/DatePicker/index.cjs +7 -280
  41. package/dist/cjs/fields/DatePicker/index.native.js +66 -185
  42. package/dist/cjs/fields/DatePicker/index.native.js.map +1 -1
  43. package/dist/cjs/fields/DatePicker/parts.cjs +12 -9
  44. package/dist/cjs/fields/DatePicker/parts.native.js +12 -9
  45. package/dist/cjs/fields/DatePicker/parts.native.js.map +1 -1
  46. package/dist/cjs/fields/Duration/index.cjs +29 -3
  47. package/dist/cjs/fields/Duration/index.native.js +29 -3
  48. package/dist/cjs/fields/Duration/index.native.js.map +1 -1
  49. package/dist/cjs/fields/PhoneInput/index.cjs +9 -4
  50. package/dist/cjs/fields/PhoneInput/index.native.js +13 -6
  51. package/dist/cjs/fields/PhoneInput/index.native.js.map +1 -1
  52. package/dist/cjs/fields/Rating/index.cjs +1 -1
  53. package/dist/cjs/fields/Rating/index.native.js +4 -1
  54. package/dist/cjs/fields/Rating/index.native.js.map +1 -1
  55. package/dist/cjs/fields/SearchInput/index.cjs +6 -0
  56. package/dist/cjs/fields/SearchInput/index.native.js +6 -0
  57. package/dist/cjs/fields/SearchInput/index.native.js.map +1 -1
  58. package/dist/cjs/fields/Select/index.cjs +75 -2
  59. package/dist/cjs/fields/Select/index.native.js +77 -2
  60. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  61. package/dist/cjs/fields/Signature/index.cjs +9 -5
  62. package/dist/cjs/fields/Signature/index.native.js +9 -5
  63. package/dist/cjs/fields/Signature/index.native.js.map +1 -1
  64. package/dist/cjs/fields/Slider/index.cjs +3 -1
  65. package/dist/cjs/fields/Slider/index.native.js +3 -1
  66. package/dist/cjs/fields/Slider/index.native.js.map +1 -1
  67. package/dist/cjs/fields/Switch/index.cjs +5 -18
  68. package/dist/cjs/fields/Switch/index.native.js +5 -18
  69. package/dist/cjs/fields/Switch/index.native.js.map +1 -1
  70. package/dist/cjs/fields/TextArea/index.cjs +19 -5
  71. package/dist/cjs/fields/TextArea/index.native.js +23 -5
  72. package/dist/cjs/fields/TextArea/index.native.js.map +1 -1
  73. package/dist/cjs/fields/TimePicker/catalog.cjs +203 -0
  74. package/dist/cjs/fields/TimePicker/catalog.native.js +227 -0
  75. package/dist/cjs/fields/TimePicker/catalog.native.js.map +1 -0
  76. package/dist/cjs/fields/TimePicker/index.cjs +6 -177
  77. package/dist/cjs/fields/TimePicker/index.native.js +74 -85
  78. package/dist/cjs/fields/TimePicker/index.native.js.map +1 -1
  79. package/dist/cjs/fields/TimeRangeScrubber/geometry.cjs +6 -0
  80. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js +6 -0
  81. package/dist/cjs/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  82. package/dist/cjs/fields/TimeRangeScrubber/index.cjs +34 -14
  83. package/dist/cjs/fields/TimeRangeScrubber/index.native.js +38 -14
  84. package/dist/cjs/fields/TimeRangeScrubber/index.native.js.map +1 -1
  85. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.cjs +202 -0
  86. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
  87. package/dist/cjs/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  88. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.cjs +30 -0
  89. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
  90. package/dist/cjs/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  91. package/dist/cjs/fields/nativeSelect.cjs +30 -0
  92. package/dist/cjs/fields/nativeSelect.native.js +33 -0
  93. package/dist/cjs/fields/nativeSelect.native.js.map +1 -0
  94. package/dist/cjs/index.cjs +1 -0
  95. package/dist/cjs/index.native.js +1 -0
  96. package/dist/cjs/index.native.js.map +1 -1
  97. package/dist/cjs/themedPrimitives.cjs +5 -0
  98. package/dist/cjs/themedPrimitives.native.js +5 -0
  99. package/dist/cjs/themedPrimitives.native.js.map +1 -1
  100. package/dist/esm/Button/index.mjs +8 -2
  101. package/dist/esm/Button/index.mjs.map +1 -1
  102. package/dist/esm/Button/index.native.js +8 -2
  103. package/dist/esm/Button/index.native.js.map +1 -1
  104. package/dist/esm/Chip/index.mjs +1 -3
  105. package/dist/esm/Chip/index.mjs.map +1 -1
  106. package/dist/esm/Chip/index.native.js +5 -3
  107. package/dist/esm/Chip/index.native.js.map +1 -1
  108. package/dist/esm/ContextualSaveBar/index.mjs +19 -3
  109. package/dist/esm/ContextualSaveBar/index.mjs.map +1 -1
  110. package/dist/esm/ContextualSaveBar/index.native.js +19 -3
  111. package/dist/esm/ContextualSaveBar/index.native.js.map +1 -1
  112. package/dist/esm/DescriptionList/index.mjs +38 -12
  113. package/dist/esm/DescriptionList/index.mjs.map +1 -1
  114. package/dist/esm/DescriptionList/index.native.js +38 -12
  115. package/dist/esm/DescriptionList/index.native.js.map +1 -1
  116. package/dist/esm/ErrorSummary.mjs +5 -2
  117. package/dist/esm/ErrorSummary.mjs.map +1 -1
  118. package/dist/esm/ErrorSummary.native.js +5 -2
  119. package/dist/esm/ErrorSummary.native.js.map +1 -1
  120. package/dist/esm/FloatingPanel/useFloatingPanel.mjs +24 -3
  121. package/dist/esm/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  122. package/dist/esm/FloatingPanel/useFloatingPanel.native.js +43 -3
  123. package/dist/esm/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  124. package/dist/esm/InputParts/index.mjs +43 -3
  125. package/dist/esm/InputParts/index.mjs.map +1 -1
  126. package/dist/esm/InputParts/index.native.js +43 -3
  127. package/dist/esm/InputParts/index.native.js.map +1 -1
  128. package/dist/esm/fields/Checkbox/Checkbox.mjs +5 -2
  129. package/dist/esm/fields/Checkbox/Checkbox.mjs.map +1 -1
  130. package/dist/esm/fields/Checkbox/Checkbox.native.js +6 -3
  131. package/dist/esm/fields/Checkbox/Checkbox.native.js.map +1 -1
  132. package/dist/esm/fields/Checkbox/CheckboxGroup.mjs +69 -59
  133. package/dist/esm/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
  134. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js +75 -65
  135. package/dist/esm/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  136. package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs +7 -0
  137. package/dist/esm/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
  138. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js +7 -0
  139. package/dist/esm/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  140. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
  141. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
  142. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js +413 -0
  143. package/dist/esm/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  144. package/dist/esm/fields/DatePicker/DatetimePicker.mjs +1 -375
  145. package/dist/esm/fields/DatePicker/DatetimePicker.mjs.map +1 -1
  146. package/dist/esm/fields/DatePicker/DatetimePicker.native.js +65 -293
  147. package/dist/esm/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  148. package/dist/esm/fields/DatePicker/catalog.mjs +276 -0
  149. package/dist/esm/fields/DatePicker/catalog.mjs.map +1 -0
  150. package/dist/esm/fields/DatePicker/catalog.native.js +317 -0
  151. package/dist/esm/fields/DatePicker/catalog.native.js.map +1 -0
  152. package/dist/esm/fields/DatePicker/index.mjs +1 -274
  153. package/dist/esm/fields/DatePicker/index.mjs.map +1 -1
  154. package/dist/esm/fields/DatePicker/index.native.js +60 -179
  155. package/dist/esm/fields/DatePicker/index.native.js.map +1 -1
  156. package/dist/esm/fields/DatePicker/parts.mjs +13 -10
  157. package/dist/esm/fields/DatePicker/parts.mjs.map +1 -1
  158. package/dist/esm/fields/DatePicker/parts.native.js +13 -10
  159. package/dist/esm/fields/DatePicker/parts.native.js.map +1 -1
  160. package/dist/esm/fields/Duration/index.mjs +29 -4
  161. package/dist/esm/fields/Duration/index.mjs.map +1 -1
  162. package/dist/esm/fields/Duration/index.native.js +29 -4
  163. package/dist/esm/fields/Duration/index.native.js.map +1 -1
  164. package/dist/esm/fields/PhoneInput/index.mjs +9 -4
  165. package/dist/esm/fields/PhoneInput/index.mjs.map +1 -1
  166. package/dist/esm/fields/PhoneInput/index.native.js +13 -6
  167. package/dist/esm/fields/PhoneInput/index.native.js.map +1 -1
  168. package/dist/esm/fields/Rating/index.mjs +2 -2
  169. package/dist/esm/fields/Rating/index.mjs.map +1 -1
  170. package/dist/esm/fields/Rating/index.native.js +5 -2
  171. package/dist/esm/fields/Rating/index.native.js.map +1 -1
  172. package/dist/esm/fields/SearchInput/index.mjs +6 -0
  173. package/dist/esm/fields/SearchInput/index.mjs.map +1 -1
  174. package/dist/esm/fields/SearchInput/index.native.js +6 -0
  175. package/dist/esm/fields/SearchInput/index.native.js.map +1 -1
  176. package/dist/esm/fields/Select/index.mjs +76 -3
  177. package/dist/esm/fields/Select/index.mjs.map +1 -1
  178. package/dist/esm/fields/Select/index.native.js +78 -3
  179. package/dist/esm/fields/Select/index.native.js.map +1 -1
  180. package/dist/esm/fields/Signature/index.mjs +10 -6
  181. package/dist/esm/fields/Signature/index.mjs.map +1 -1
  182. package/dist/esm/fields/Signature/index.native.js +10 -6
  183. package/dist/esm/fields/Signature/index.native.js.map +1 -1
  184. package/dist/esm/fields/Slider/index.mjs +4 -2
  185. package/dist/esm/fields/Slider/index.mjs.map +1 -1
  186. package/dist/esm/fields/Slider/index.native.js +4 -2
  187. package/dist/esm/fields/Slider/index.native.js.map +1 -1
  188. package/dist/esm/fields/Switch/index.mjs +6 -19
  189. package/dist/esm/fields/Switch/index.mjs.map +1 -1
  190. package/dist/esm/fields/Switch/index.native.js +6 -19
  191. package/dist/esm/fields/Switch/index.native.js.map +1 -1
  192. package/dist/esm/fields/TextArea/index.mjs +19 -5
  193. package/dist/esm/fields/TextArea/index.mjs.map +1 -1
  194. package/dist/esm/fields/TextArea/index.native.js +23 -5
  195. package/dist/esm/fields/TextArea/index.native.js.map +1 -1
  196. package/dist/esm/fields/TimePicker/catalog.mjs +174 -0
  197. package/dist/esm/fields/TimePicker/catalog.mjs.map +1 -0
  198. package/dist/esm/fields/TimePicker/catalog.native.js +195 -0
  199. package/dist/esm/fields/TimePicker/catalog.native.js.map +1 -0
  200. package/dist/esm/fields/TimePicker/index.mjs +2 -173
  201. package/dist/esm/fields/TimePicker/index.mjs.map +1 -1
  202. package/dist/esm/fields/TimePicker/index.native.js +76 -87
  203. package/dist/esm/fields/TimePicker/index.native.js.map +1 -1
  204. package/dist/esm/fields/TimeRangeScrubber/geometry.mjs +6 -1
  205. package/dist/esm/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
  206. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js +6 -1
  207. package/dist/esm/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  208. package/dist/esm/fields/TimeRangeScrubber/index.mjs +37 -18
  209. package/dist/esm/fields/TimeRangeScrubber/index.mjs.map +1 -1
  210. package/dist/esm/fields/TimeRangeScrubber/index.native.js +41 -18
  211. package/dist/esm/fields/TimeRangeScrubber/index.native.js.map +1 -1
  212. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
  213. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
  214. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js +172 -0
  215. package/dist/esm/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  216. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
  217. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
  218. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js +5 -0
  219. package/dist/esm/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  220. package/dist/esm/fields/nativeSelect.mjs +5 -0
  221. package/dist/esm/fields/nativeSelect.mjs.map +1 -0
  222. package/dist/esm/fields/nativeSelect.native.js +5 -0
  223. package/dist/esm/fields/nativeSelect.native.js.map +1 -0
  224. package/dist/esm/index.mjs +2 -2
  225. package/dist/esm/index.mjs.map +1 -1
  226. package/dist/esm/index.native.js +2 -2
  227. package/dist/esm/index.native.js.map +1 -1
  228. package/dist/esm/themedPrimitives.mjs +5 -0
  229. package/dist/esm/themedPrimitives.mjs.map +1 -1
  230. package/dist/esm/themedPrimitives.native.js +5 -0
  231. package/dist/esm/themedPrimitives.native.js.map +1 -1
  232. package/dist/jsx/Button/index.mjs +8 -2
  233. package/dist/jsx/Button/index.mjs.map +1 -1
  234. package/dist/jsx/Button/index.native.js +7 -1
  235. package/dist/jsx/Button/index.native.js.map +1 -1
  236. package/dist/jsx/Chip/index.mjs +1 -3
  237. package/dist/jsx/Chip/index.mjs.map +1 -1
  238. package/dist/jsx/Chip/index.native.js +5 -3
  239. package/dist/jsx/Chip/index.native.js.map +1 -1
  240. package/dist/jsx/ContextualSaveBar/index.mjs +19 -3
  241. package/dist/jsx/ContextualSaveBar/index.mjs.map +1 -1
  242. package/dist/jsx/ContextualSaveBar/index.native.js +19 -3
  243. package/dist/jsx/ContextualSaveBar/index.native.js.map +1 -1
  244. package/dist/jsx/DescriptionList/index.mjs +38 -12
  245. package/dist/jsx/DescriptionList/index.mjs.map +1 -1
  246. package/dist/jsx/DescriptionList/index.native.js +38 -12
  247. package/dist/jsx/DescriptionList/index.native.js.map +1 -1
  248. package/dist/jsx/ErrorSummary.mjs +5 -2
  249. package/dist/jsx/ErrorSummary.mjs.map +1 -1
  250. package/dist/jsx/ErrorSummary.native.js +4 -1
  251. package/dist/jsx/ErrorSummary.native.js.map +1 -1
  252. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs +24 -3
  253. package/dist/jsx/FloatingPanel/useFloatingPanel.mjs.map +1 -1
  254. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js +43 -2
  255. package/dist/jsx/FloatingPanel/useFloatingPanel.native.js.map +1 -1
  256. package/dist/jsx/InputParts/index.mjs +43 -3
  257. package/dist/jsx/InputParts/index.mjs.map +1 -1
  258. package/dist/jsx/InputParts/index.native.js +42 -2
  259. package/dist/jsx/InputParts/index.native.js.map +1 -1
  260. package/dist/jsx/fields/Checkbox/Checkbox.mjs +5 -2
  261. package/dist/jsx/fields/Checkbox/Checkbox.mjs.map +1 -1
  262. package/dist/jsx/fields/Checkbox/Checkbox.native.js +6 -3
  263. package/dist/jsx/fields/Checkbox/Checkbox.native.js.map +1 -1
  264. package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs +69 -59
  265. package/dist/jsx/fields/Checkbox/CheckboxGroup.mjs.map +1 -1
  266. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js +75 -65
  267. package/dist/jsx/fields/Checkbox/CheckboxGroup.native.js.map +1 -1
  268. package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs +7 -0
  269. package/dist/jsx/fields/Checkbox/checkboxGroupContext.mjs.map +1 -0
  270. package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js +36 -0
  271. package/dist/jsx/fields/Checkbox/checkboxGroupContext.native.js.map +1 -0
  272. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs +377 -0
  273. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.mjs.map +1 -0
  274. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js +441 -0
  275. package/dist/jsx/fields/DatePicker/DatetimePicker.catalog.native.js.map +1 -0
  276. package/dist/jsx/fields/DatePicker/DatetimePicker.mjs +1 -375
  277. package/dist/jsx/fields/DatePicker/DatetimePicker.mjs.map +1 -1
  278. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js +69 -297
  279. package/dist/jsx/fields/DatePicker/DatetimePicker.native.js.map +1 -1
  280. package/dist/jsx/fields/DatePicker/catalog.mjs +276 -0
  281. package/dist/jsx/fields/DatePicker/catalog.mjs.map +1 -0
  282. package/dist/jsx/fields/DatePicker/catalog.native.js +350 -0
  283. package/dist/jsx/fields/DatePicker/catalog.native.js.map +1 -0
  284. package/dist/jsx/fields/DatePicker/index.mjs +1 -274
  285. package/dist/jsx/fields/DatePicker/index.mjs.map +1 -1
  286. package/dist/jsx/fields/DatePicker/index.native.js +66 -185
  287. package/dist/jsx/fields/DatePicker/index.native.js.map +1 -1
  288. package/dist/jsx/fields/DatePicker/parts.mjs +13 -10
  289. package/dist/jsx/fields/DatePicker/parts.mjs.map +1 -1
  290. package/dist/jsx/fields/DatePicker/parts.native.js +12 -9
  291. package/dist/jsx/fields/DatePicker/parts.native.js.map +1 -1
  292. package/dist/jsx/fields/Duration/index.mjs +29 -4
  293. package/dist/jsx/fields/Duration/index.mjs.map +1 -1
  294. package/dist/jsx/fields/Duration/index.native.js +29 -3
  295. package/dist/jsx/fields/Duration/index.native.js.map +1 -1
  296. package/dist/jsx/fields/PhoneInput/index.mjs +9 -4
  297. package/dist/jsx/fields/PhoneInput/index.mjs.map +1 -1
  298. package/dist/jsx/fields/PhoneInput/index.native.js +13 -6
  299. package/dist/jsx/fields/PhoneInput/index.native.js.map +1 -1
  300. package/dist/jsx/fields/Rating/index.mjs +2 -2
  301. package/dist/jsx/fields/Rating/index.mjs.map +1 -1
  302. package/dist/jsx/fields/Rating/index.native.js +4 -1
  303. package/dist/jsx/fields/Rating/index.native.js.map +1 -1
  304. package/dist/jsx/fields/SearchInput/index.mjs +6 -0
  305. package/dist/jsx/fields/SearchInput/index.mjs.map +1 -1
  306. package/dist/jsx/fields/SearchInput/index.native.js +6 -0
  307. package/dist/jsx/fields/SearchInput/index.native.js.map +1 -1
  308. package/dist/jsx/fields/Select/index.mjs +76 -3
  309. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  310. package/dist/jsx/fields/Select/index.native.js +77 -2
  311. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  312. package/dist/jsx/fields/Signature/index.mjs +10 -6
  313. package/dist/jsx/fields/Signature/index.mjs.map +1 -1
  314. package/dist/jsx/fields/Signature/index.native.js +9 -5
  315. package/dist/jsx/fields/Signature/index.native.js.map +1 -1
  316. package/dist/jsx/fields/Slider/index.mjs +4 -2
  317. package/dist/jsx/fields/Slider/index.mjs.map +1 -1
  318. package/dist/jsx/fields/Slider/index.native.js +3 -1
  319. package/dist/jsx/fields/Slider/index.native.js.map +1 -1
  320. package/dist/jsx/fields/Switch/index.mjs +6 -19
  321. package/dist/jsx/fields/Switch/index.mjs.map +1 -1
  322. package/dist/jsx/fields/Switch/index.native.js +5 -18
  323. package/dist/jsx/fields/Switch/index.native.js.map +1 -1
  324. package/dist/jsx/fields/TextArea/index.mjs +19 -5
  325. package/dist/jsx/fields/TextArea/index.mjs.map +1 -1
  326. package/dist/jsx/fields/TextArea/index.native.js +23 -5
  327. package/dist/jsx/fields/TextArea/index.native.js.map +1 -1
  328. package/dist/jsx/fields/TimePicker/catalog.mjs +174 -0
  329. package/dist/jsx/fields/TimePicker/catalog.mjs.map +1 -0
  330. package/dist/jsx/fields/TimePicker/catalog.native.js +227 -0
  331. package/dist/jsx/fields/TimePicker/catalog.native.js.map +1 -0
  332. package/dist/jsx/fields/TimePicker/index.mjs +2 -173
  333. package/dist/jsx/fields/TimePicker/index.mjs.map +1 -1
  334. package/dist/jsx/fields/TimePicker/index.native.js +74 -85
  335. package/dist/jsx/fields/TimePicker/index.native.js.map +1 -1
  336. package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs +6 -1
  337. package/dist/jsx/fields/TimeRangeScrubber/geometry.mjs.map +1 -1
  338. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js +6 -0
  339. package/dist/jsx/fields/TimeRangeScrubber/geometry.native.js.map +1 -1
  340. package/dist/jsx/fields/TimeRangeScrubber/index.mjs +37 -18
  341. package/dist/jsx/fields/TimeRangeScrubber/index.mjs.map +1 -1
  342. package/dist/jsx/fields/TimeRangeScrubber/index.native.js +38 -14
  343. package/dist/jsx/fields/TimeRangeScrubber/index.native.js.map +1 -1
  344. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs +166 -0
  345. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.mjs.map +1 -0
  346. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js +211 -0
  347. package/dist/jsx/fields/nativeDateTime/OsDateTimeSheet.native.js.map +1 -0
  348. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs +5 -0
  349. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.mjs.map +1 -0
  350. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js +33 -0
  351. package/dist/jsx/fields/nativeDateTime/osDateTimeIosDisplay.native.js.map +1 -0
  352. package/dist/jsx/fields/nativeSelect.mjs +5 -0
  353. package/dist/jsx/fields/nativeSelect.mjs.map +1 -0
  354. package/dist/jsx/fields/nativeSelect.native.js +33 -0
  355. package/dist/jsx/fields/nativeSelect.native.js.map +1 -0
  356. package/dist/jsx/index.js +2 -2
  357. package/dist/jsx/index.js.map +1 -1
  358. package/dist/jsx/index.mjs +2 -2
  359. package/dist/jsx/index.mjs.map +1 -1
  360. package/dist/jsx/index.native.js +1 -0
  361. package/dist/jsx/index.native.js.map +1 -1
  362. package/dist/jsx/themedPrimitives.mjs +5 -0
  363. package/dist/jsx/themedPrimitives.mjs.map +1 -1
  364. package/dist/jsx/themedPrimitives.native.js +5 -0
  365. package/dist/jsx/themedPrimitives.native.js.map +1 -1
  366. package/package.json +12 -9
  367. package/src/Button/Button.labelInk.spec.tsx +1 -1
  368. package/src/Button/Button.sizeLadder.spec.tsx +124 -0
  369. package/src/Button/Button.spec.tsx +7 -17
  370. package/src/Button/Button.stories.tsx +14 -0
  371. package/src/Button/index.tsx +18 -3
  372. package/src/Chip/Chip.spec.tsx +15 -0
  373. package/src/Chip/Chip.stories.tsx +251 -0
  374. package/src/Chip/index.tsx +5 -1
  375. package/src/ContextualSaveBar/ContextualSaveBar.spec.tsx +51 -0
  376. package/src/ContextualSaveBar/ContextualSaveBar.stories.tsx +42 -23
  377. package/src/ContextualSaveBar/UnsavedChangesDialog.spec.tsx +167 -0
  378. package/src/ContextualSaveBar/index.tsx +14 -5
  379. package/src/DescriptionList/DescriptionList.spec.tsx +19 -1
  380. package/src/DescriptionList/DescriptionList.stories.tsx +5 -1
  381. package/src/DescriptionList/index.tsx +57 -19
  382. package/src/ErrorSummary.tsx +5 -2
  383. package/src/FloatingPanel/panelWidthContract.spec.ts +2 -2
  384. package/src/FloatingPanel/useFloatingPanel.spec.tsx +199 -1
  385. package/src/FloatingPanel/useFloatingPanel.ts +45 -3
  386. package/src/InputParts/index.tsx +56 -2
  387. package/src/Spinner/SpinnerGlyph.spec.tsx +132 -0
  388. package/src/Wheel/WheelEdgeFade.spec.tsx +141 -0
  389. package/src/fields/Checkbox/Checkbox.spec.tsx +24 -0
  390. package/src/fields/Checkbox/Checkbox.tsx +8 -3
  391. package/src/fields/Checkbox/CheckboxBox.spec.tsx +395 -0
  392. package/src/fields/Checkbox/CheckboxCard.spec.tsx +197 -0
  393. package/src/fields/Checkbox/CheckboxFieldFrame.spec.tsx +116 -0
  394. package/src/fields/Checkbox/CheckboxGroup.stories.tsx +15 -0
  395. package/src/fields/Checkbox/CheckboxGroup.tsx +77 -70
  396. package/src/fields/Checkbox/checkboxGroupContext.ts +12 -0
  397. package/src/fields/DatePicker/Calendar.spec.tsx +6 -5
  398. package/src/fields/DatePicker/DatePicker.stories.tsx +13 -0
  399. package/src/fields/DatePicker/DatetimePicker.catalog.tsx +586 -0
  400. package/src/fields/DatePicker/DatetimePicker.native.tsx +243 -0
  401. package/src/fields/DatePicker/DatetimePicker.tsx +2 -584
  402. package/src/fields/DatePicker/catalog.tsx +450 -0
  403. package/src/fields/DatePicker/index.native.tsx +261 -0
  404. package/src/fields/DatePicker/index.tsx +20 -448
  405. package/src/fields/DatePicker/parts.tsx +11 -6
  406. package/src/fields/Duration/Duration.spec.tsx +50 -0
  407. package/src/fields/Duration/Duration.stories.tsx +21 -0
  408. package/src/fields/Duration/index.tsx +43 -5
  409. package/src/fields/PhoneInput/PhoneInput.spec.tsx +16 -63
  410. package/src/fields/PhoneInput/PhoneInput.tvalue-source.spec.ts +23 -0
  411. package/src/fields/PhoneInput/index.tsx +10 -3
  412. package/src/fields/Rating/index.tsx +9 -1
  413. package/src/fields/SearchInput/SearchInput.spec.tsx +20 -0
  414. package/src/fields/SearchInput/index.tsx +6 -0
  415. package/src/fields/Select/Select.stories.tsx +23 -1
  416. package/src/fields/Select/index.tsx +77 -1
  417. package/src/fields/Signature/Signature.spec.tsx +22 -3
  418. package/src/fields/Signature/index.tsx +16 -7
  419. package/src/fields/Slider/index.tsx +4 -1
  420. package/src/fields/Switch/index.tsx +14 -12
  421. package/src/fields/TextArea/TextArea.spec.tsx +68 -0
  422. package/src/fields/TextArea/index.tsx +23 -5
  423. package/src/fields/TimePicker/TimePicker.stories.tsx +13 -0
  424. package/src/fields/TimePicker/catalog.tsx +265 -0
  425. package/src/fields/TimePicker/index.native.tsx +229 -0
  426. package/src/fields/TimePicker/index.tsx +6 -261
  427. package/src/fields/TimeRangeScrubber/TimeRangeScrubber.spec.tsx +36 -0
  428. package/src/fields/TimeRangeScrubber/geometry.ts +13 -0
  429. package/src/fields/TimeRangeScrubber/index.tsx +49 -8
  430. package/src/fields/nativeDateTime/OsDateTimeSheet.spec.ts +12 -0
  431. package/src/fields/nativeDateTime/OsDateTimeSheet.tsx +197 -0
  432. package/src/fields/nativeDateTime/osDateTimeIosDisplay.ts +4 -0
  433. package/src/fields/nativeSelect.spec.ts +28 -0
  434. package/src/fields/nativeSelect.ts +13 -0
  435. package/src/index.ts +2 -2
  436. package/src/themedPrimitives.tsx +10 -6
  437. package/types/Button/index.d.ts +3 -2
  438. package/types/Button/index.d.ts.map +1 -1
  439. package/types/Chip/index.d.ts.map +1 -1
  440. package/types/ContextualSaveBar/index.d.ts.map +1 -1
  441. package/types/DescriptionList/index.d.ts.map +1 -1
  442. package/types/ErrorSummary.d.ts.map +1 -1
  443. package/types/FloatingPanel/useFloatingPanel.d.ts +13 -0
  444. package/types/FloatingPanel/useFloatingPanel.d.ts.map +1 -1
  445. package/types/InputParts/index.d.ts.map +1 -1
  446. package/types/fields/Checkbox/Checkbox.d.ts.map +1 -1
  447. package/types/fields/Checkbox/CheckboxGroup.d.ts.map +1 -1
  448. package/types/fields/Checkbox/checkboxGroupContext.d.ts +8 -0
  449. package/types/fields/Checkbox/checkboxGroupContext.d.ts.map +1 -0
  450. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts +35 -0
  451. package/types/fields/DatePicker/DatetimePicker.catalog.d.ts.map +1 -0
  452. package/types/fields/DatePicker/DatetimePicker.d.ts +2 -32
  453. package/types/fields/DatePicker/DatetimePicker.d.ts.map +1 -1
  454. package/types/fields/DatePicker/DatetimePicker.native.d.ts +26 -0
  455. package/types/fields/DatePicker/DatetimePicker.native.d.ts.map +1 -0
  456. package/types/fields/DatePicker/catalog.d.ts +42 -0
  457. package/types/fields/DatePicker/catalog.d.ts.map +1 -0
  458. package/types/fields/DatePicker/index.d.ts +2 -39
  459. package/types/fields/DatePicker/index.d.ts.map +1 -1
  460. package/types/fields/DatePicker/index.native.d.ts +40 -0
  461. package/types/fields/DatePicker/index.native.d.ts.map +1 -0
  462. package/types/fields/DatePicker/parts.d.ts.map +1 -1
  463. package/types/fields/Duration/index.d.ts +2 -0
  464. package/types/fields/Duration/index.d.ts.map +1 -1
  465. package/types/fields/PhoneInput/index.d.ts.map +1 -1
  466. package/types/fields/Rating/index.d.ts.map +1 -1
  467. package/types/fields/SearchInput/index.d.ts.map +1 -1
  468. package/types/fields/Select/index.d.ts +6 -1
  469. package/types/fields/Select/index.d.ts.map +1 -1
  470. package/types/fields/Signature/index.d.ts.map +1 -1
  471. package/types/fields/Slider/index.d.ts.map +1 -1
  472. package/types/fields/Switch/index.d.ts.map +1 -1
  473. package/types/fields/TextArea/index.d.ts.map +1 -1
  474. package/types/fields/TimePicker/catalog.d.ts +41 -0
  475. package/types/fields/TimePicker/catalog.d.ts.map +1 -0
  476. package/types/fields/TimePicker/index.d.ts +2 -38
  477. package/types/fields/TimePicker/index.d.ts.map +1 -1
  478. package/types/fields/TimePicker/index.native.d.ts +31 -0
  479. package/types/fields/TimePicker/index.native.d.ts.map +1 -0
  480. package/types/fields/TimeRangeScrubber/geometry.d.ts +8 -0
  481. package/types/fields/TimeRangeScrubber/geometry.d.ts.map +1 -1
  482. package/types/fields/TimeRangeScrubber/index.d.ts +1 -1
  483. package/types/fields/TimeRangeScrubber/index.d.ts.map +1 -1
  484. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts +12 -0
  485. package/types/fields/nativeDateTime/OsDateTimeSheet.d.ts.map +1 -0
  486. package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts +3 -0
  487. package/types/fields/nativeDateTime/osDateTimeIosDisplay.d.ts.map +1 -0
  488. package/types/fields/nativeSelect.d.ts +12 -0
  489. package/types/fields/nativeSelect.d.ts.map +1 -0
  490. package/types/index.d.ts +2 -2
  491. package/types/index.d.ts.map +1 -1
  492. package/types/themedPrimitives.d.ts.map +1 -1
@@ -1,448 +1,20 @@
1
- import type { DeepKeys, DeepValue } from "@tanstack/form-core";
2
- import { type ComponentProps, useCallback, useEffect, useRef, useState } from "react";
3
- import { DatePickerFieldValueSync } from "./fieldValueSync";
4
- import { coerceToDate } from "./utils";
5
- import { type Popover, useProps } from "tamagui";
6
-
7
- import { Field, FieldLayout } from "../../fieldLayout";
8
- import { t } from "../../shared/t";
9
- import {
10
- getFieldError,
11
- mergeFieldHandler,
12
- useFormField,
13
- useResolvedValidators,
14
- } from "../../shared/utils";
15
- import type { FormFieldProps } from "../../fieldLayout";
16
- import { Input as InputParts } from "../../InputParts";
17
- import { Skeleton } from "../../Skeleton";
18
- import type { FieldComponentProps, Validator } from "../../types";
19
-
20
- import {
21
- CalendarDays,
22
- CalendarHeader,
23
- CalendarPanelFrame,
24
- DatePickerInputTrigger,
25
- DatePickerPopoverShell,
26
- CalendarViewSwitcher,
27
- formatDateDisplay,
28
- isSameDay,
29
- useCalendarData,
30
- useDateNavigation,
31
- yearPageSize,
32
- } from "./parts";
33
-
34
- import type { ViewMode } from "./parts";
35
-
36
- export type { ViewMode } from "./parts";
37
-
38
- // ---------------------------------------------------------------------------
39
- // Types
40
- // ---------------------------------------------------------------------------
41
-
42
- export type DatePickerProps<
43
- TParentData = any,
44
- TName extends DeepKeys<TParentData> = any,
45
- TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined,
46
- TFormValidator extends Validator<TParentData, unknown> | undefined = undefined,
47
- TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
48
- > = Omit<
49
- FormFieldProps<TParentData, TName, TFieldValidator, TFormValidator, TData>,
50
- // "onChange": FormFieldProps carries the DOM ChangeEventHandler from
51
- // YStackProps; this field exposes a canonical value callback instead.
52
- "children" | "field" | "onChange"
53
- > &
54
- Partial<
55
- Omit<
56
- FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>,
57
- "children"
58
- >
59
- > & {
60
- readOnly?: boolean;
61
- placeholder?: string;
62
- format?: string;
63
- minDate?: Date;
64
- maxDate?: Date;
65
- disabled?: boolean;
66
- inputProps?: Omit<ComponentProps<typeof InputParts.Area>, "value" | "onChangeText" | "ref">;
67
- /** When true, renders a skeleton placeholder instead of the date picker */
68
- skeleton?: boolean;
69
- /** When true, applies compact density (tighter layout gaps; control size unchanged) */
70
- compact?: boolean;
71
- /** Standalone controlled value (Date or ISO string). Ignored when used inside a form. */
72
- value?: Date | string | null;
73
- /**
74
- * Canonical change handler, consistent with the rest of the field family.
75
- * Prefer this over `onValueChange`.
76
- */
77
- onChange?: (value: Date | null) => void;
78
- /** @deprecated Use `onChange` instead. */
79
- onValueChange?: (value: Date | null) => void;
80
- };
81
-
82
- // ---------------------------------------------------------------------------
83
- // DayGrid — animated day cells (single-select)
84
- // ---------------------------------------------------------------------------
85
-
86
- interface DayGridProps {
87
- calendarData: ReturnType<typeof useCalendarData>;
88
- selectedDate: Date | null;
89
- onSelectDate: (date: Date) => void;
90
- minDate?: Date;
91
- maxDate?: Date;
92
- }
93
-
94
- function DayGrid({ calendarData, selectedDate, onSelectDate, minDate, maxDate }: DayGridProps) {
95
- return (
96
- <CalendarDays
97
- calendarData={calendarData}
98
- minDate={minDate}
99
- maxDate={maxDate}
100
- isSelected={(day) => isSameDay(selectedDate, day)}
101
- onSelect={onSelectDate}
102
- onToday={() => onSelectDate(new Date())}
103
- />
104
- );
105
- }
106
-
107
- // ---------------------------------------------------------------------------
108
- // CalendarBody — orchestrates day/month/year views
109
- // ---------------------------------------------------------------------------
110
-
111
- interface CalendarBodyProps {
112
- displayDate: Date;
113
- selectedDate: Date | null;
114
- onSelectDate: (date: Date) => void;
115
- onNavigateMonth: (direction: "prev" | "next") => void;
116
- onSetDisplayDate: (date: Date) => void;
117
- minDate?: Date;
118
- maxDate?: Date;
119
- }
120
-
121
- function CalendarBody({
122
- displayDate,
123
- selectedDate,
124
- onSelectDate,
125
- onNavigateMonth,
126
- onSetDisplayDate,
127
- minDate,
128
- maxDate,
129
- }: CalendarBodyProps) {
130
- const [viewMode, setViewMode] = useState<ViewMode>("day");
131
- const calendarData = useCalendarData(displayDate);
132
- const [yearPageStart, setYearPageStart] = useState(
133
- () => calendarData.year - (calendarData.year % yearPageSize),
134
- );
135
-
136
- return (
137
- <CalendarViewSwitcher
138
- calendarData={calendarData}
139
- displayDate={displayDate}
140
- onSetDisplayDate={onSetDisplayDate}
141
- viewMode={viewMode}
142
- setViewMode={setViewMode}
143
- yearPageStart={yearPageStart}
144
- setYearPageStart={setYearPageStart}
145
- >
146
- <CalendarPanelFrame>
147
- <CalendarHeader
148
- year={calendarData.year}
149
- monthName={calendarData.monthName}
150
- onPrevMonth={() => onNavigateMonth("prev")}
151
- onNextMonth={() => onNavigateMonth("next")}
152
- onYearPress={() => {
153
- setYearPageStart(calendarData.year - (calendarData.year % yearPageSize));
154
- setViewMode("year");
155
- }}
156
- onMonthPress={() => setViewMode("month")}
157
- />
158
- <DayGrid
159
- calendarData={calendarData}
160
- selectedDate={selectedDate}
161
- onSelectDate={onSelectDate}
162
- minDate={minDate}
163
- maxDate={maxDate}
164
- />
165
- </CalendarPanelFrame>
166
- </CalendarViewSwitcher>
167
- );
168
- }
169
-
170
- // ---------------------------------------------------------------------------
171
- // DatePicker — main exported component
172
- // ---------------------------------------------------------------------------
173
-
174
- export function DatePicker<
175
- TParentData,
176
- TName extends DeepKeys<TParentData>,
177
- TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined,
178
- TFormValidator extends Validator<TParentData, unknown> | undefined = undefined,
179
- TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
180
- >(props: DatePickerProps<TParentData, TName, TFieldValidator, TFormValidator, TData>) {
181
- const {
182
- defaultValue,
183
- value: controlledValue,
184
- onChange,
185
- onValueChange,
186
- form,
187
- inputProps: _inputProps,
188
- placeholder = t("Select date"),
189
- format: _format = "MM/DD/YYYY",
190
- minDate,
191
- maxDate,
192
- disabled,
193
- mode,
194
- name,
195
- preserveValue,
196
- validators,
197
- label,
198
- labelProps,
199
- error: errorProp,
200
- helperText,
201
- required,
202
- size,
203
- readOnly,
204
- onBlur,
205
- skeleton,
206
- compact,
207
- id: idProp,
208
- ..._restProps
209
- } = useProps(props);
210
-
211
- const { resolvedForm, knobProps, id } = useFormField({ form, id: idProp, compact });
212
- const resolvedValidators = useResolvedValidators(required, validators, label, name);
213
- const hasLabel = Boolean(label);
214
-
215
- const [open, setOpen] = useState(false);
216
- const [selectedDate, setSelectedDate] = useState<Date | null>(() =>
217
- coerceToDate(controlledValue ?? defaultValue),
218
- );
219
- // Sync external `value` changes (controlled standalone mode).
220
- useEffect(() => {
221
- if (controlledValue === undefined) return;
222
- setSelectedDate(coerceToDate(controlledValue));
223
- }, [controlledValue]);
224
- // Axiom 11 VALUE IS DATA: the calendar opens at the selected value's
225
- // month, not today's — seed the display date from the current value and
226
- // re-seed on every open (see openCalendar / handleOpenChange).
227
- const { displayDate, setDisplayDate, navigateMonth } = useDateNavigation(
228
- selectedDate ?? undefined,
229
- );
230
- const popoverRef = useRef<Popover>(null);
231
-
232
- const closePopover = useCallback(() => {
233
- setOpen(false);
234
- popoverRef.current?.close();
235
- }, []);
236
-
237
- useEffect(() => {
238
- if (selectedDate) closePopover();
239
- }, [selectedDate, closePopover]);
240
-
241
- const handleDateSelect = useCallback(
242
- (date: Date, fieldChange?: (value: any) => void) => {
243
- if (minDate && date < minDate) return;
244
- if (maxDate && date > maxDate) return;
245
- setSelectedDate(date);
246
- setDisplayDate(date);
247
- // Form mode: commit into TanStack field state (clears meta errors on change).
248
- fieldChange?.(date);
249
- // Canonical `onChange` and the alias `onValueChange` both fire (single emit).
250
- onChange?.(date);
251
- onValueChange?.(date);
252
- closePopover();
253
- },
254
- [minDate, maxDate, setDisplayDate, closePopover, onChange, onValueChange],
255
- );
256
-
257
- const handleClearDate = useCallback(
258
- (fieldChange?: (value: any) => void) => {
259
- setSelectedDate(null);
260
- setDisplayDate(new Date());
261
- fieldChange?.(null);
262
- onChange?.(null);
263
- onValueChange?.(null);
264
- },
265
- [setDisplayDate, onChange, onValueChange],
266
- );
267
-
268
- const calendarContent = (fieldChange?: (value: any) => void) => (
269
- <CalendarBody
270
- displayDate={displayDate}
271
- selectedDate={selectedDate}
272
- onSelectDate={(date) => handleDateSelect(date, fieldChange)}
273
- onNavigateMonth={navigateMonth}
274
- onSetDisplayDate={setDisplayDate}
275
- minDate={minDate}
276
- maxDate={maxDate}
277
- />
278
- );
279
-
280
- const renderPopover = (
281
- hasError?: boolean,
282
- blurHandler?: (...args: any[]) => void,
283
- fieldChange?: (value: any) => void,
284
- ) => {
285
- if (readOnly) {
286
- return (
287
- <InputParts.Box>
288
- <InputParts.Area
289
- value={formatDateDisplay(selectedDate)}
290
- readOnly
291
- aria-readonly="true"
292
- aria-required={required || undefined}
293
- aria-invalid={hasError || undefined}
294
- placeholder={placeholder}
295
- />
296
- </InputParts.Box>
297
- );
298
- }
299
-
300
- const handleOpenChange = (isOpen: boolean) => {
301
- // Re-seed the visible month from the current value on every open —
302
- // the value may have changed (externally or by a pick) since mount.
303
- if (isOpen && selectedDate) setDisplayDate(selectedDate);
304
- setOpen(isOpen);
305
- if (!isOpen) {
306
- blurHandler?.();
307
- }
308
- };
309
-
310
- return (
311
- <DatePickerPopoverShell
312
- open={open}
313
- onOpenChange={handleOpenChange}
314
- // Disabling only the trigger is what LET the panel open: the trigger
315
- // goes `pointerEvents:none`, so the click falls through to
316
- // FloatingPanel's own reference wrapper, which opens on click unless
317
- // it is told the field is disabled (SB-M-614). DatetimePicker and
318
- // TimePicker already pass it.
319
- disabled={disabled}
320
- popoverRef={popoverRef}
321
- // "Date, Jul 15 2026": VO gets the field name + current value on the
322
- // native trigger (the web trigger announces via aria on the Area).
323
- triggerA11y={{
324
- label: (typeof label === "string" && label) || t("Date"),
325
- value: formatDateDisplay(selectedDate) || placeholder,
326
- hint: helperText,
327
- }}
328
- trigger={
329
- <DatePickerInputTrigger
330
- value={formatDateDisplay(selectedDate)}
331
- placeholder={placeholder}
332
- disabled={disabled}
333
- open={open}
334
- onReset={() => handleClearDate(fieldChange)}
335
- onButtonPress={() => {
336
- if (selectedDate) setDisplayDate(selectedDate);
337
- setOpen(true);
338
- }}
339
- error={!!hasError}
340
- id={id}
341
- // Labelled: FieldLayout's Label wires `aria-labelledby` onto this
342
- // id itself — naming it here too doubles the spoken name.
343
- aria-label={hasLabel ? undefined : t("Date")}
344
- aria-describedby={
345
- [
346
- helperText && id ? `${id}-description` : undefined,
347
- hasError && id ? `${id}-error` : undefined,
348
- ]
349
- .filter(Boolean)
350
- .join(" ") || undefined
351
- }
352
- aria-required={required || undefined}
353
- aria-invalid={hasError || undefined}
354
- />
355
- }
356
- clearValue={formatDateDisplay(selectedDate)}
357
- onClear={() => handleClearDate(fieldChange)}
358
- >
359
- {calendarContent(fieldChange)}
360
- </DatePickerPopoverShell>
361
- );
362
- };
363
-
364
- // Render skeleton placeholder (after all hooks)
365
- if (skeleton) {
366
- return (
367
- <FieldLayout id={id} label={label} size={size} knobProps={knobProps}>
368
- <Skeleton variant="rounded" width="100%" height={knobProps.sizeToken} />
369
- </FieldLayout>
370
- );
371
- }
372
-
373
- if (!resolvedForm || !name) {
374
- return (
375
- <FieldLayout
376
- id={id}
377
- label={label}
378
- labelProps={labelProps}
379
- error={errorProp}
380
- helperText={helperText}
381
- required={required}
382
- size={size}
383
- knobProps={knobProps}
384
- onBlur={onBlur}
385
- // LC-40: FieldLayout owns the dimWhole assembly dim (keepLabel pins
386
- // the sibling label/helper readable) — it needs the disabled state.
387
- disabled={disabled}
388
- >
389
- <InputParts size={size || knobProps.sizeToken}>{renderPopover(!!errorProp)}</InputParts>
390
- </FieldLayout>
391
- );
392
- }
393
-
394
- return (
395
- <Field
396
- defaultValue={defaultValue}
397
- form={resolvedForm}
398
- mode={mode}
399
- name={name}
400
- preserveValue={preserveValue}
401
- validators={resolvedValidators}
402
- >
403
- {(field) => {
404
- const resolvedError = getFieldError(field, errorProp);
405
-
406
- return (
407
- <>
408
- {/* Form branch displays from `selectedDate` — keep it synced to
409
- the live field value (late seeds / programmatic updates). */}
410
- <DatePickerFieldValueSync value={field.state.value} onSync={setSelectedDate} />
411
- <FieldLayout
412
- id={id}
413
- label={label}
414
- labelProps={labelProps}
415
- error={resolvedError}
416
- helperText={helperText}
417
- required={required}
418
- size={size}
419
- knobProps={knobProps}
420
- // LC-40: see standalone branch — FieldLayout carries dimWhole.
421
- disabled={disabled}
422
- >
423
- <InputParts size={size || knobProps.sizeToken}>
424
- {renderPopover(
425
- !!resolvedError,
426
- mergeFieldHandler(field, "handleBlur", onBlur),
427
- mergeFieldHandler(field, "handleChange"),
428
- )}
429
- </InputParts>
430
- </FieldLayout>
431
- </>
432
- );
433
- }}
434
- </Field>
435
- );
436
- }
437
-
438
- // Re-export new picker variants
439
- export { MultiDatePicker } from "./MultiDatePicker";
440
- export type { MultiDatePickerProps } from "./MultiDatePicker";
441
- export { DateRangePicker } from "./DateRangePicker";
442
- export type { DateRange, DateRangePickerProps } from "./DateRangePicker";
443
- export { Calendar } from "./Calendar";
444
- export type { CalendarProps, CalendarMode } from "./Calendar";
445
- export { MonthPicker } from "./MonthPicker";
446
- export type { MonthPickerProps, MonthPickerValue } from "./MonthPicker";
447
- export { DatetimePicker } from "./DatetimePicker";
448
- export type { DatetimePickerProps } from "./DatetimePicker";
1
+ export {
2
+ Calendar,
3
+ DatePicker,
4
+ DateRangePicker,
5
+ DatetimePicker,
6
+ MonthPicker,
7
+ MultiDatePicker,
8
+ } from "./catalog";
9
+ export type {
10
+ CalendarMode,
11
+ CalendarProps,
12
+ DatePickerProps,
13
+ DateRange,
14
+ DateRangePickerProps,
15
+ DatetimePickerProps,
16
+ MonthPickerProps,
17
+ MonthPickerValue,
18
+ MultiDatePickerProps,
19
+ ViewMode,
20
+ } from "./catalog";
@@ -1,5 +1,10 @@
1
- import { ChevronLeft, ChevronRight } from "@tamagui/lucide-icons-2";
2
- import { CalendarBlankIcon, ClockIcon, XIcon } from "@phosphor-icons/react";
1
+ import {
2
+ CalendarBlankIcon,
3
+ CaretLeftIcon,
4
+ CaretRightIcon,
5
+ ClockIcon,
6
+ XIcon,
7
+ } from "@phosphor-icons/react";
3
8
  import {
4
9
  ensureFocusVisibleRing,
5
10
  formatAbsoluteDate,
@@ -622,7 +627,7 @@ export function CalendarHeader({
622
627
  >
623
628
  {showPrev && onPrevMonth ? (
624
629
  <CalendarChromeButton onPress={onPrevMonth} label={t("Previous month")}>
625
- <ChevronLeft size={16} />
630
+ <CaretLeftIcon size={16} color="currentColor" />
626
631
  </CalendarChromeButton>
627
632
  ) : (
628
633
  <View width={px} height={px} />
@@ -643,7 +648,7 @@ export function CalendarHeader({
643
648
 
644
649
  {showNext && onNextMonth ? (
645
650
  <CalendarChromeButton onPress={onNextMonth} label={t("Next month")}>
646
- <ChevronRight size={16} />
651
+ <CaretRightIcon size={16} color="currentColor" />
647
652
  </CalendarChromeButton>
648
653
  ) : (
649
654
  <View width={px} height={px} />
@@ -763,13 +768,13 @@ export function YearGrid({
763
768
  <View width={px * 7} alignSelf="center" {...knobProps.gap}>
764
769
  <View flexDirection="row" width={px * 7} alignItems="center" justifyContent="space-between">
765
770
  <CalendarChromeButton onPress={onPrevPage} label={t("Previous years")}>
766
- <ChevronLeft size={16} />
771
+ <CaretLeftIcon size={16} color="currentColor" />
767
772
  </CalendarChromeButton>
768
773
  <Text {...knobProps.label} {...knobProps.textWeight}>
769
774
  {years[0]} – {years[years.length - 1]}
770
775
  </Text>
771
776
  <CalendarChromeButton onPress={onNextPage} label={t("Next years")}>
772
- <ChevronRight size={16} />
777
+ <CaretRightIcon size={16} color="currentColor" />
773
778
  </CalendarChromeButton>
774
779
  </View>
775
780
 
@@ -7,6 +7,7 @@ import { TableCellContext } from "../../shared/tableCellContext";
7
7
  import { getFieldHeight } from "../../shared/utils";
8
8
  import {
9
9
  Duration,
10
+ DURATION_PRESET_SIZE,
10
11
  durationSegmentWidth,
11
12
  normalizeSeconds,
12
13
  parseDurationText,
@@ -133,6 +134,55 @@ describe("Duration", () => {
133
134
  });
134
135
 
135
136
  describe("design law", () => {
137
+ it("packs the clock and segments at the start of a stretched box", () => {
138
+ const result = renderWithProviders(<Duration label="Wide" value={3600} />);
139
+ const box = result.container.querySelector("[data-duration-box]") as HTMLElement;
140
+ const row = result.container.querySelector("[data-duration-row]") as HTMLElement;
141
+ expect(box).toBeTruthy();
142
+ expect(row).toBeTruthy();
143
+ expect(getComputedStyle(box).justifyContent).toMatch(/flex-start|start/);
144
+ expect(getComputedStyle(row).justifyContent).toMatch(/flex-start|start/);
145
+ });
146
+
147
+ it("keeps segment inputs inside the box at size $3", () => {
148
+ const result = renderWithProviders(<Duration label="S" size="$3" value={3600} />);
149
+ const box = result.container.querySelector("[data-duration-box]") as HTMLElement;
150
+ const hours = result.container.querySelector('input[aria-label="Hours"]') as HTMLElement;
151
+ expect(box).toBeTruthy();
152
+ expect(hours).toBeTruthy();
153
+ const recipeHeight = sizeRecipeForToken("$3").height;
154
+ expect(Number(hours.getAttribute("data-duration-input-height"))).toBe(recipeHeight);
155
+ const attrHeight = (el: HTMLElement) => {
156
+ const a = el.getAttribute("height");
157
+ if (a && /^\d+(\.\d+)?$/.test(a)) return Number(a);
158
+ const s = el.style.height;
159
+ if (s && /^\d+(\.\d+)?(px)?$/.test(s)) return Number.parseFloat(s);
160
+ return 0;
161
+ };
162
+ const inputH = attrHeight(hours);
163
+ if (inputH > 0) expect(inputH).toBeLessThanOrEqual(recipeHeight + 0.5);
164
+ const boxH = attrHeight(box);
165
+ if (boxH > 0 && inputH > 0) expect(inputH).toBeLessThanOrEqual(boxH + 0.5);
166
+ });
167
+
168
+ it("pins six default preset chips at the $2 / 28px family", () => {
169
+ expect(DURATION_PRESET_SIZE).toBe("$2");
170
+ expect(sizeRecipeForToken(DURATION_PRESET_SIZE).height).toBe(28);
171
+ const result = renderWithProviders(<Duration label="P" value={0} />);
172
+ const chips = result.container.querySelectorAll("[data-duration-preset]");
173
+ expect(chips).toHaveLength(6);
174
+ for (const chip of chips) {
175
+ const el = chip as HTMLElement;
176
+ const height =
177
+ parseFloat(getComputedStyle(el).height) ||
178
+ Number(el.getAttribute("height")) ||
179
+ parseFloat(el.style.height);
180
+ if (Number.isFinite(height) && height > 0) {
181
+ expect(height).toBe(sizeRecipeForToken(DURATION_PRESET_SIZE).height);
182
+ }
183
+ }
184
+ });
185
+
136
186
  it("sizes segments from the size recipe (LC-75)", () => {
137
187
  const small = renderWithProviders(<Duration label="S" size="$2" value={0} />);
138
188
  const large = renderWithProviders(<Duration label="L" size="$6" value={0} />);
@@ -120,6 +120,27 @@ export const Sizes: Story = {
120
120
  ),
121
121
  };
122
122
 
123
+ export const FullWidth: Story = {
124
+ name: "FullWidth",
125
+ render: () => (
126
+ <YStack width="100%" gap="$4">
127
+ <Duration
128
+ label="Full width"
129
+ helperText="Clock and segments stay on the left of a stretched box"
130
+ value={3600}
131
+ onChange={action("onChange")}
132
+ />
133
+ <Duration
134
+ label="Small"
135
+ size="$3"
136
+ helperText="Segment inputs fill the 36px box"
137
+ value={3600}
138
+ onChange={action("onChange")}
139
+ />
140
+ </YStack>
141
+ ),
142
+ };
143
+
123
144
  export const WithSeconds: Story = {
124
145
  args: {
125
146
  label: "Precise Duration",
@@ -51,6 +51,9 @@ const defaultPresets: DurationPreset[] = [
51
51
  { label: "8h", seconds: 28800 },
52
52
  ];
53
53
 
54
+ /** Preset chips stay on the $2 row (28px). The field size knob does not reach them. */
55
+ export const DURATION_PRESET_SIZE = "$2" as const;
56
+
54
57
  function DurationSegment({
55
58
  id,
56
59
  unit,
@@ -96,7 +99,14 @@ function DurationSegment({
96
99
  };
97
100
 
98
101
  return (
99
- <XStack alignItems="center" gap={recipe.gap} flexShrink={0} data-duration-segment={ariaLabel}>
102
+ <XStack
103
+ alignItems="center"
104
+ gap={recipe.gap}
105
+ flexGrow={0}
106
+ flexShrink={0}
107
+ height="100%"
108
+ data-duration-segment={ariaLabel}
109
+ >
100
110
  <InputParts.Area
101
111
  id={id}
102
112
  value={shown}
@@ -111,11 +121,18 @@ function DurationSegment({
111
121
  aria-invalid={hasError || undefined}
112
122
  color={formCommonColors.text}
113
123
  textAlign="right"
124
+ {...knobProps.controlType}
125
+ flex={0}
114
126
  width={segmentWidth}
115
127
  minWidth={segmentWidth}
128
+ maxWidth={segmentWidth}
129
+ height={recipe.height}
130
+ minHeight={0}
131
+ maxHeight={recipe.height}
132
+ size={sizeToken as SizeTokens}
133
+ data-duration-input-height={recipe.height}
116
134
  paddingHorizontal={0}
117
135
  maxLength={wide ? 5 : 3}
118
- {...knobProps.controlType}
119
136
  {...(isWeb && disabled ? { tabIndex: -1 } : undefined)}
120
137
  onChangeText={(text) => {
121
138
  if (locked) return;
@@ -222,9 +239,30 @@ function DurationControl({
222
239
  aria-label={hasLabel ? undefined : t("Duration")}
223
240
  data-ring-target="box"
224
241
  data-duration-box=""
242
+ justifyContent="flex-start"
243
+ alignItems="stretch"
244
+ size={sizeToken as SizeTokens}
245
+ height={recipe.height}
246
+ sizeRecipeEscape="duration-box"
225
247
  >
226
- <InputParts.Section>
227
- <XStack alignItems="center" flex={1} width="100%" gap={recipe.gap}>
248
+ <InputParts.Section
249
+ justifyContent="flex-start"
250
+ alignItems="stretch"
251
+ flexGrow={1}
252
+ flexShrink={1}
253
+ flexBasis="auto"
254
+ minWidth={0}
255
+ >
256
+ <XStack
257
+ alignItems="center"
258
+ justifyContent="flex-start"
259
+ width="100%"
260
+ height="100%"
261
+ flexGrow={0}
262
+ flexShrink={1}
263
+ gap={recipe.gap}
264
+ data-duration-row=""
265
+ >
228
266
  {resolvedClock != null ? (
229
267
  <InputParts.Icon adornment="leading">{resolvedClock}</InputParts.Icon>
230
268
  ) : null}
@@ -318,7 +356,7 @@ function DurationPresets({
318
356
  <Button
319
357
  key={preset.seconds}
320
358
  compact
321
- size="$2"
359
+ size={DURATION_PRESET_SIZE}
322
360
  outlined={!selected}
323
361
  accent={selected}
324
362
  data-duration-preset={preset.label}