@12-apps/ui 6.82.0 → 6.84.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 (241) hide show
  1. package/components-catalog.md +7 -0
  2. package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
  3. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  4. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +3 -3
  5. package/dist/_internal/components/data-display/Carousel/Carousel.js +5 -5
  6. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +2 -2
  7. package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
  8. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  9. package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
  10. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  11. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  12. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +20 -19
  13. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +21 -20
  14. package/dist/_internal/components/data-display/DataViews/base-list-card.js +2 -2
  15. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +7 -3
  16. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +2 -2
  17. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +1 -1
  18. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +5 -4
  19. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +3 -3
  20. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +17 -16
  21. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +7 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +5 -4
  23. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +6 -5
  24. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +4 -3
  25. package/dist/_internal/components/data-display/DataViews/data-views-range-reset.js +9 -0
  26. package/dist/_internal/components/data-display/DataViews/data-views-range-reset.js.map +1 -0
  27. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +4 -4
  28. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +3 -3
  29. package/dist/_internal/components/data-display/DataViews/data-views-writers.js +3 -1
  30. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  31. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +8 -8
  32. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +7 -7
  33. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +1 -1
  34. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +9 -9
  35. package/dist/_internal/components/data-display/MapPreview/MapControlBar.js +3 -3
  36. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +4 -4
  37. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +3 -3
  38. package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js +2 -2
  39. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +6 -6
  40. package/dist/_internal/components/data-display/index.js +29 -29
  41. package/dist/_internal/components/form/CepField/CepField.js +1 -1
  42. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +3 -3
  43. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
  44. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +2 -2
  45. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +3 -3
  46. package/dist/_internal/components/form/InputOTP/InputOTP.hooks.js +1 -1
  47. package/dist/_internal/components/form/InputOTP/InputOTP.js +2 -2
  48. package/dist/_internal/components/form/index.js +8 -8
  49. package/dist/_internal/components/form/total-form/Fields/CepField.js +2 -2
  50. package/dist/_internal/components/form/total-form/Fields/TextField.js +1 -1
  51. package/dist/_internal/components/form/total-form/Fields/index.js +4 -4
  52. package/dist/_internal/components/index.js +37 -37
  53. package/dist/_internal/en-US.data-display.js +1 -1
  54. package/dist/_internal/pt-BR.data-display.js +1 -1
  55. package/dist/_internal/user-avatar/user-avatar.js +4 -4
  56. package/dist/charts.js +11 -11
  57. package/dist/{chunk-HF2WLLGH.js → chunk-2XI4R6UO.js} +2 -2
  58. package/dist/{chunk-HF2WLLGH.js.map → chunk-2XI4R6UO.js.map} +1 -1
  59. package/dist/{chunk-GYFKIPR2.js → chunk-4PUCT3RX.js} +2 -2
  60. package/dist/{chunk-JQSF3CUR.js → chunk-6HMDUUVJ.js} +2 -1
  61. package/dist/{chunk-JQSF3CUR.js.map → chunk-6HMDUUVJ.js.map} +1 -1
  62. package/dist/{chunk-THD3N4BJ.js → chunk-6ONQTXFM.js} +24 -5
  63. package/dist/chunk-6ONQTXFM.js.map +1 -0
  64. package/dist/{chunk-C2I7NQC4.js → chunk-74KCGLOU.js} +2 -2
  65. package/dist/{chunk-4J62V5OE.js → chunk-7YJYIMWP.js} +2 -2
  66. package/dist/{chunk-MT74NRLY.js → chunk-C2OX3C7L.js} +4 -4
  67. package/dist/{chunk-62XVHRTX.js → chunk-D7SOXI2K.js} +70 -21
  68. package/dist/chunk-D7SOXI2K.js.map +1 -0
  69. package/dist/{chunk-BO6IMK5P.js → chunk-DPHSJLMN.js} +2 -2
  70. package/dist/{chunk-7XSCEHGA.js → chunk-EOQ6EKTS.js} +7 -7
  71. package/dist/{chunk-4OTJ66ID.js → chunk-EXTES7LP.js} +15 -4
  72. package/dist/chunk-EXTES7LP.js.map +1 -0
  73. package/dist/{chunk-4IVEBBF6.js → chunk-FYJDI5BW.js} +4 -3
  74. package/dist/{chunk-4IVEBBF6.js.map → chunk-FYJDI5BW.js.map} +1 -1
  75. package/dist/{chunk-A5U7HEBI.js → chunk-GNDIVKWF.js} +4 -2
  76. package/dist/chunk-GNDIVKWF.js.map +1 -0
  77. package/dist/{chunk-XKPV52CG.js → chunk-GPTNZ57P.js} +2 -2
  78. package/dist/{chunk-ZGAOA7LN.js → chunk-H56CRMCM.js} +6 -6
  79. package/dist/{chunk-AMLHEKSV.js → chunk-HI7JPDD6.js} +5 -5
  80. package/dist/{chunk-JK3QB7MO.js → chunk-I54LHHZS.js} +2 -2
  81. package/dist/{chunk-GLAAX5JJ.js → chunk-I5NTADBO.js} +2 -1
  82. package/dist/{chunk-GLAAX5JJ.js.map → chunk-I5NTADBO.js.map} +1 -1
  83. package/dist/{chunk-LCGK22QQ.js → chunk-IKXCAYFH.js} +5 -5
  84. package/dist/{chunk-MLGAGZJ3.js → chunk-ILNAPS44.js} +8 -7
  85. package/dist/chunk-ILNAPS44.js.map +1 -0
  86. package/dist/{chunk-D22FGMGU.js → chunk-JIAIPOEV.js} +2 -2
  87. package/dist/{chunk-HQCZT6TO.js → chunk-JVOEVTCZ.js} +5 -5
  88. package/dist/{chunk-76IHYINM.js → chunk-KEBYZ2MO.js} +16 -9
  89. package/dist/chunk-KEBYZ2MO.js.map +1 -0
  90. package/dist/{chunk-JJNY5MZL.js → chunk-KG7OTJ26.js} +2 -2
  91. package/dist/{chunk-2ZMR3TZU.js → chunk-L6UTYEUS.js} +3 -3
  92. package/dist/{chunk-WWB43LWU.js → chunk-LOGSJH2Q.js} +2 -2
  93. package/dist/{chunk-YJPBNIEM.js → chunk-MGFTHOPG.js} +2 -2
  94. package/dist/{chunk-RB3R6BJL.js → chunk-O4G7QKDU.js} +2 -2
  95. package/dist/{chunk-DYHOBKPU.js → chunk-OA6T2ME3.js} +5 -5
  96. package/dist/{chunk-U5FOJBLG.js → chunk-OOLES6RR.js} +14 -2
  97. package/dist/chunk-OOLES6RR.js.map +1 -0
  98. package/dist/{chunk-YHKHHSZH.js → chunk-OQ554425.js} +3 -3
  99. package/dist/{chunk-54OJAOXC.js → chunk-PDSZN26U.js} +2 -2
  100. package/dist/{chunk-MNNIOQTQ.js → chunk-PGVGCDPD.js} +3 -3
  101. package/dist/{chunk-RDRXTH47.js → chunk-PWXDMP7G.js} +10 -6
  102. package/dist/chunk-PWXDMP7G.js.map +1 -0
  103. package/dist/{chunk-6ATXOJVQ.js → chunk-QADTI63U.js} +4 -4
  104. package/dist/{chunk-UETHX57J.js → chunk-R6L376KR.js} +21 -7
  105. package/dist/chunk-R6L376KR.js.map +1 -0
  106. package/dist/{chunk-SEUJNFOD.js → chunk-RLDTV5I2.js} +2 -2
  107. package/dist/{chunk-4UCXJYOO.js → chunk-RUQNKOSP.js} +4 -4
  108. package/dist/chunk-RUQNKOSP.js.map +1 -0
  109. package/dist/{chunk-7RG37FVT.js → chunk-RXKFPXVH.js} +29 -2
  110. package/dist/chunk-RXKFPXVH.js.map +1 -0
  111. package/dist/{chunk-KSJBFT4G.js → chunk-SGAHME6W.js} +3 -3
  112. package/dist/{chunk-SB2SEGR6.js → chunk-TIM4PXWN.js} +3 -3
  113. package/dist/{chunk-D4LMRSY7.js → chunk-UIWVSZ6I.js} +2 -2
  114. package/dist/{chunk-SMANO5OD.js → chunk-V2UJEICC.js} +3 -3
  115. package/dist/chunk-V2UJEICC.js.map +1 -0
  116. package/dist/{chunk-XATRYJ4Q.js → chunk-VQBY73QH.js} +4 -4
  117. package/dist/{chunk-SYERREN5.js → chunk-W2JYXZC2.js} +4 -4
  118. package/dist/{chunk-QCNUMOTL.js → chunk-YC2QYRNE.js} +9 -3
  119. package/dist/chunk-YC2QYRNE.js.map +1 -0
  120. package/dist/chunk-YOPMXGHY.js +23 -0
  121. package/dist/chunk-YOPMXGHY.js.map +1 -0
  122. package/dist/{chunk-QK3XXPBA.js → chunk-YWJCMGTE.js} +2 -2
  123. package/dist/{chunk-UQ6SAIX7.js → chunk-Z47SYKRX.js} +2 -2
  124. package/dist/data-display/Avatar.js +3 -3
  125. package/dist/data-display/CardKit.js +3 -3
  126. package/dist/data-display/Carousel.js +5 -5
  127. package/dist/data-display/Chart.js +11 -11
  128. package/dist/data-display/DataGrid.js +2 -2
  129. package/dist/data-display/DataViews.js +25 -24
  130. package/dist/data-display/FleetMap.js +9 -9
  131. package/dist/data-display/MapPreview.js +6 -6
  132. package/dist/en-US.js +1 -1
  133. package/dist/form/CepField.js +1 -1
  134. package/dist/form/DateRangePicker.js +5 -5
  135. package/dist/form/InputOTP.js +2 -2
  136. package/dist/form/total-form.js +4 -4
  137. package/dist/locales.js +2 -2
  138. package/dist/pt-BR.js +1 -1
  139. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +6 -0
  140. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  141. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +32 -5
  142. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
  143. package/dist/types/components/data-display/DataViews/data-views-filter-panel.d.ts +6 -0
  144. package/dist/types/components/data-display/DataViews/data-views-filter-panel.d.ts.map +1 -1
  145. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
  146. package/dist/types/components/data-display/DataViews/data-views-inline-bar.d.ts +3 -1
  147. package/dist/types/components/data-display/DataViews/data-views-inline-bar.d.ts.map +1 -1
  148. package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts +3 -1
  149. package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts.map +1 -1
  150. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
  151. package/dist/types/components/data-display/DataViews/data-views-range-reset.d.ts +16 -0
  152. package/dist/types/components/data-display/DataViews/data-views-range-reset.d.ts.map +1 -0
  153. package/dist/types/components/data-display/DataViews/data-views-writers.d.ts +13 -0
  154. package/dist/types/components/data-display/DataViews/data-views-writers.d.ts.map +1 -1
  155. package/dist/types/components/data-display/DataViews/use-data-views-state.d.ts +4 -0
  156. package/dist/types/components/data-display/DataViews/use-data-views-state.d.ts.map +1 -1
  157. package/dist/types/components/form/CepField/CepField.d.ts +2 -1
  158. package/dist/types/components/form/CepField/CepField.d.ts.map +1 -1
  159. package/dist/types/components/form/CepField/CepField.types.d.ts +24 -0
  160. package/dist/types/components/form/CepField/CepField.types.d.ts.map +1 -1
  161. package/dist/types/components/form/InputOTP/InputOTP.d.ts.map +1 -1
  162. package/dist/types/components/form/InputOTP/InputOTP.hooks.d.ts.map +1 -1
  163. package/dist/types/components/form/total-form/Fields/CepField.d.ts +11 -1
  164. package/dist/types/components/form/total-form/Fields/CepField.d.ts.map +1 -1
  165. package/dist/types/components/form/total-form/Fields/TextField.d.ts +22 -1
  166. package/dist/types/components/form/total-form/Fields/TextField.d.ts.map +1 -1
  167. package/dist/types/components/form/total-form/Fields/index.d.ts +1 -1
  168. package/dist/types/components/form/total-form/Fields/index.d.ts.map +1 -1
  169. package/dist/types/components/form/total-form/index.d.ts +1 -1
  170. package/dist/types/components/form/total-form/index.d.ts.map +1 -1
  171. package/dist/types/en-US.data-display.d.ts.map +1 -1
  172. package/dist/types/pt-BR.data-display.d.ts.map +1 -1
  173. package/dist/user-avatar.js +4 -4
  174. package/package.json +1 -1
  175. package/src/components/data-display/DataViews/data-views-copy.ts +6 -0
  176. package/src/components/data-display/DataViews/data-views-day-input.tsx +134 -38
  177. package/src/components/data-display/DataViews/data-views-empty.tsx +1 -1
  178. package/src/components/data-display/DataViews/data-views-filter-panel.tsx +8 -2
  179. package/src/components/data-display/DataViews/data-views-grid-parts.tsx +3 -1
  180. package/src/components/data-display/DataViews/data-views-inline-bar.tsx +7 -0
  181. package/src/components/data-display/DataViews/data-views-more-filters.tsx +4 -1
  182. package/src/components/data-display/DataViews/data-views-range-pill.tsx +11 -3
  183. package/src/components/data-display/DataViews/data-views-range-reset.ts +34 -0
  184. package/src/components/data-display/DataViews/data-views-writers.ts +24 -1
  185. package/src/components/data-display/DataViews/use-data-views-state.ts +6 -1
  186. package/src/components/form/CepField/CepField.md +29 -2
  187. package/src/components/form/CepField/CepField.tsx +44 -7
  188. package/src/components/form/CepField/CepField.types.ts +24 -0
  189. package/src/components/form/InputOTP/InputOTP.hooks.ts +48 -9
  190. package/src/components/form/InputOTP/InputOTP.md +6 -1
  191. package/src/components/form/InputOTP/InputOTP.tsx +40 -1
  192. package/src/components/form/total-form/Fields/CepField.tsx +16 -0
  193. package/src/components/form/total-form/Fields/TextField.tsx +64 -1
  194. package/src/components/form/total-form/Fields/index.ts +1 -1
  195. package/src/components/form/total-form/index.ts +1 -1
  196. package/src/en-US.data-display.ts +1 -0
  197. package/src/pt-BR.data-display.ts +1 -0
  198. package/dist/chunk-4OTJ66ID.js.map +0 -1
  199. package/dist/chunk-4UCXJYOO.js.map +0 -1
  200. package/dist/chunk-62XVHRTX.js.map +0 -1
  201. package/dist/chunk-76IHYINM.js.map +0 -1
  202. package/dist/chunk-7RG37FVT.js.map +0 -1
  203. package/dist/chunk-A5U7HEBI.js.map +0 -1
  204. package/dist/chunk-MLGAGZJ3.js.map +0 -1
  205. package/dist/chunk-QCNUMOTL.js.map +0 -1
  206. package/dist/chunk-RDRXTH47.js.map +0 -1
  207. package/dist/chunk-SMANO5OD.js.map +0 -1
  208. package/dist/chunk-THD3N4BJ.js.map +0 -1
  209. package/dist/chunk-U5FOJBLG.js.map +0 -1
  210. package/dist/chunk-UETHX57J.js.map +0 -1
  211. /package/dist/{chunk-GYFKIPR2.js.map → chunk-4PUCT3RX.js.map} +0 -0
  212. /package/dist/{chunk-C2I7NQC4.js.map → chunk-74KCGLOU.js.map} +0 -0
  213. /package/dist/{chunk-4J62V5OE.js.map → chunk-7YJYIMWP.js.map} +0 -0
  214. /package/dist/{chunk-MT74NRLY.js.map → chunk-C2OX3C7L.js.map} +0 -0
  215. /package/dist/{chunk-BO6IMK5P.js.map → chunk-DPHSJLMN.js.map} +0 -0
  216. /package/dist/{chunk-7XSCEHGA.js.map → chunk-EOQ6EKTS.js.map} +0 -0
  217. /package/dist/{chunk-XKPV52CG.js.map → chunk-GPTNZ57P.js.map} +0 -0
  218. /package/dist/{chunk-ZGAOA7LN.js.map → chunk-H56CRMCM.js.map} +0 -0
  219. /package/dist/{chunk-AMLHEKSV.js.map → chunk-HI7JPDD6.js.map} +0 -0
  220. /package/dist/{chunk-JK3QB7MO.js.map → chunk-I54LHHZS.js.map} +0 -0
  221. /package/dist/{chunk-LCGK22QQ.js.map → chunk-IKXCAYFH.js.map} +0 -0
  222. /package/dist/{chunk-D22FGMGU.js.map → chunk-JIAIPOEV.js.map} +0 -0
  223. /package/dist/{chunk-HQCZT6TO.js.map → chunk-JVOEVTCZ.js.map} +0 -0
  224. /package/dist/{chunk-JJNY5MZL.js.map → chunk-KG7OTJ26.js.map} +0 -0
  225. /package/dist/{chunk-2ZMR3TZU.js.map → chunk-L6UTYEUS.js.map} +0 -0
  226. /package/dist/{chunk-WWB43LWU.js.map → chunk-LOGSJH2Q.js.map} +0 -0
  227. /package/dist/{chunk-YJPBNIEM.js.map → chunk-MGFTHOPG.js.map} +0 -0
  228. /package/dist/{chunk-RB3R6BJL.js.map → chunk-O4G7QKDU.js.map} +0 -0
  229. /package/dist/{chunk-DYHOBKPU.js.map → chunk-OA6T2ME3.js.map} +0 -0
  230. /package/dist/{chunk-YHKHHSZH.js.map → chunk-OQ554425.js.map} +0 -0
  231. /package/dist/{chunk-54OJAOXC.js.map → chunk-PDSZN26U.js.map} +0 -0
  232. /package/dist/{chunk-MNNIOQTQ.js.map → chunk-PGVGCDPD.js.map} +0 -0
  233. /package/dist/{chunk-6ATXOJVQ.js.map → chunk-QADTI63U.js.map} +0 -0
  234. /package/dist/{chunk-SEUJNFOD.js.map → chunk-RLDTV5I2.js.map} +0 -0
  235. /package/dist/{chunk-KSJBFT4G.js.map → chunk-SGAHME6W.js.map} +0 -0
  236. /package/dist/{chunk-SB2SEGR6.js.map → chunk-TIM4PXWN.js.map} +0 -0
  237. /package/dist/{chunk-D4LMRSY7.js.map → chunk-UIWVSZ6I.js.map} +0 -0
  238. /package/dist/{chunk-XATRYJ4Q.js.map → chunk-VQBY73QH.js.map} +0 -0
  239. /package/dist/{chunk-SYERREN5.js.map → chunk-W2JYXZC2.js.map} +0 -0
  240. /package/dist/{chunk-QK3XXPBA.js.map → chunk-YWJCMGTE.js.map} +0 -0
  241. /package/dist/{chunk-UQ6SAIX7.js.map → chunk-Z47SYKRX.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CepField.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/CepField/CepField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAQxE,OAAO,KAAK,EAAc,aAAa,EAAmB,MAAM,kBAAkB,CAAC;AA6GnF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,KAAa,EACb,WAAyB,EACzB,KAAK,EACL,QAAgB,EAChB,UAAgB,EAChB,IAAmB,EACnB,UAAU,EACV,IAAI,GACL,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAiDpC;AAED,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"CepField.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/CepField/CepField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAQxE,OAAO,KAAK,EAAc,aAAa,EAAmB,MAAM,kBAAkB,CAAC;AA0InF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,KAAa,EACb,WAAyB,EACzB,KAAK,EACL,QAAgB,EAChB,UAAgB,EAChB,IAAmB,EACnB,UAAU,EACV,IAAI,EACJ,IAAI,EAAE,uDAAuD;AAC7D,cAAwB,EACxB,YAAY,GACb,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAsDpC;AAED,eAAe,QAAQ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { CepFieldCopy } from "../../../copy";
2
+ import type { InputSize } from "../Input/Input.base";
2
3
  /**
3
4
  * Types for {@link CepField} — the reusable CEP auto-completer.
4
5
  */
@@ -70,5 +71,28 @@ export interface CepFieldProps {
70
71
  name?: string;
71
72
  /** Test id for the input. Defaults to `cep-field-<name>`. */
72
73
  dataTestId?: string;
74
+ /**
75
+ * A step of the house size scale — the same values, and the same box
76
+ * heights, as {@link Input}'s `size`. Defaults to `md`.
77
+ */
78
+ size?: InputSize;
79
+ /**
80
+ * Where the label is drawn.
81
+ *
82
+ * - `above` (default): a stacked label over the box, as the field has always
83
+ * rendered. Every existing caller keeps it.
84
+ * - `inside`: the label sits in the box and floats up on focus or a value,
85
+ * exactly as `Input`'s label does. Use it beside `Input`s so the CEP block
86
+ * is the same height as its neighbours.
87
+ */
88
+ labelPlacement?: 'above' | 'inside';
89
+ /**
90
+ * The `<input>`'s `autocomplete`. Defaults to `postal-code`, which lets the
91
+ * browser offer the signed-in person's own CEP — right on their own address
92
+ * form, wrong on a form for somebody else's (a supplier): pass `off` there,
93
+ * or the owner's CEP goes in and the lookup fills the owner's street
94
+ * (FUT-4140).
95
+ */
96
+ autoComplete?: string;
73
97
  }
74
98
  //# sourceMappingURL=CepField.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CepField.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/CepField/CepField.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD;;GAEG;AAEH;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU;IACV,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,IAAI,EAAE,YAAY,CAAC;IACnB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACvD;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"CepField.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/CepField/CepField.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD;;GAEG;AAEH;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU;IACV,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,IAAI,EAAE,YAAY,CAAC;IACnB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACvD;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACpC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputOTP.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/InputOTP/InputOTP.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAO1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsBtD,eAAO,MAAM,QAAQ,sFAkDnB,CAAC"}
1
+ {"version":3,"file":"InputOTP.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/InputOTP/InputOTP.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAO1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAyDtD,eAAO,MAAM,QAAQ,sFAsDnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputOTP.hooks.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/InputOTP/InputOTP.hooks.ts"],"names":[],"mappings":"AAmBA,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GAAI,kDAAkD,QAAQ;;;+BAwB3E,MAAM,cAAc,MAAM;2BAgB1B,MAAM,KAAK,KAAK,CAAC,aAAa;qBAelC,KAAK,CAAC,cAAc;CAc3B,CAAC"}
1
+ {"version":3,"file":"InputOTP.hooks.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/InputOTP/InputOTP.hooks.ts"],"names":[],"mappings":"AAiDA,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GAAI,kDAAkD,QAAQ;;;+BAqC3E,MAAM,cAAc,MAAM;2BAkB1B,MAAM,KAAK,KAAK,CAAC,aAAa;qBAelC,KAAK,CAAC,cAAc;CAQ3B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { CepFieldCopy } from "../../../../copy";
2
2
  import React from 'react';
3
+ import type { InputSize } from '../../Input/Input.base';
3
4
  import { type CepAddress } from '../../CepField';
4
5
  /** The resolved address parts a form can receive. */
5
6
  type CepPart = 'street' | 'neighborhood' | 'city' | 'state';
@@ -22,6 +23,15 @@ export interface CepFieldProps {
22
23
  fills?: CepFills;
23
24
  /** Milliseconds to wait after the last keystroke before looking up. */
24
25
  debounceMs?: number;
26
+ /** The input's size — the same scale, and box heights, as `Input`. Defaults to `md`. */
27
+ size?: InputSize;
28
+ /** `above` (default) stacks the label over the box; `inside` floats it in the box like `Input`. */
29
+ labelPlacement?: 'above' | 'inside';
30
+ /**
31
+ * The `<input>`'s `autocomplete`. Defaults to `postal-code`; pass `off` when
32
+ * the form holds somebody else's address (FUT-4140).
33
+ */
34
+ autoComplete?: string;
25
35
  }
26
36
  /**
27
37
  * CEP field bound to {@link useFormContext}: masks and validates the CEP, then
@@ -42,6 +52,6 @@ export interface CepFieldProps {
42
52
  * />
43
53
  * ```
44
54
  */
45
- export declare function CepField({ name, label, lookup, fills, debounceMs, copy, }: CepFieldProps): React.ReactElement;
55
+ export declare function CepField({ name, label, lookup, fills, debounceMs, copy, size, labelPlacement, autoComplete, }: CepFieldProps): React.ReactElement;
46
56
  export {};
47
57
  //# sourceMappingURL=CepField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CepField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/total-form/Fields/CepField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAuC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG3E,qDAAqD;AACrD,KAAK,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,IAAI,EAAE,YAAY,CAAC;IACnB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,iEAAiE;IACjE,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAoDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,KAAK,EACL,UAAU,EACV,IAAI,GACL,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAsCpC"}
1
+ {"version":3,"file":"CepField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/total-form/Fields/CepField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAuC,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG3E,qDAAqD;AACrD,KAAK,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,IAAI,EAAE,YAAY,CAAC;IACnB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,iEAAiE;IACjE,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mGAAmG;IACnG,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,KAAK,EACL,UAAU,EACV,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,YAAY,GACb,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAyCpC"}
@@ -1,3 +1,4 @@
1
+ import type { InputHTMLAttributes } from 'react';
1
2
  import React from 'react';
2
3
  /** Props for the `total-form` {@link TextField}. */
3
4
  export interface TextFieldProps {
@@ -9,7 +10,27 @@ export interface TextFieldProps {
9
10
  type?: string;
10
11
  /** Placeholder shown when the field is empty. */
11
12
  placeholder?: string;
13
+ /**
14
+ * The `autocomplete` attribute of the `<input>`. Omitted, the browser decides
15
+ * from the `name` — which is how a supplier's `name`/`phone`/`email` gets
16
+ * offered the signed-in owner's own (FUT-4140). Pass `off` for somebody
17
+ * else's data, `new-password` for a secret the password manager must not
18
+ * fill. An `inputProps.autoComplete` wins over this one.
19
+ */
20
+ autoComplete?: string;
21
+ /**
22
+ * Attributes for the `<input>` element itself — `inputMode`, `autoCapitalize`,
23
+ * `autoCorrect`, `spellCheck`, `maxLength`, `pattern`, `enterKeyHint`…
24
+ *
25
+ * They reach the `<input>`, never the wrapper `div`, where a keypad hint does
26
+ * nothing. What the field owns — `id`, `name`, `type`, `value`, `onChange`,
27
+ * `placeholder` and the `total-form-field-<name>` test id — is not
28
+ * overridable here.
29
+ */
30
+ inputProps?: TextFieldInputProps;
12
31
  }
32
+ /** The `<input>` attributes {@link TextField} lets a caller set (see `inputProps`). */
33
+ export type TextFieldInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'name' | 'type' | 'value' | 'defaultValue' | 'onChange' | 'placeholder' | 'size' | 'color'>;
13
34
  /**
14
35
  * Text input field bound to {@link useFormContext}. Composes the existing
15
36
  * `@12-apps/ui` `Form*` presentational primitives and the `Input` control,
@@ -18,5 +39,5 @@ export interface TextFieldProps {
18
39
  * Renders its error via `total-form-field-<name>-message` and the input via
19
40
  * `total-form-field-<name>`.
20
41
  */
21
- export declare function TextField({ name, label, type, placeholder }: TextFieldProps): React.ReactElement;
42
+ export declare function TextField({ name, label, type, placeholder, autoComplete, inputProps, }: TextFieldProps): React.ReactElement;
22
43
  //# sourceMappingURL=TextField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/total-form/Fields/TextField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAa,EAAE,WAAW,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CA6BzG"}
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/total-form/Fields/TextField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED,uFAAuF;AACvF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAClG,CAAC;AA+BF;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EACL,IAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,GACX,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CA+BrC"}
@@ -3,7 +3,7 @@ export type { CategoryFieldProps } from './CategoryField';
3
3
  export { CepField } from './CepField';
4
4
  export type { CepFieldProps, CepFills } from './CepField';
5
5
  export { TextField } from './TextField';
6
- export type { TextFieldProps } from './TextField';
6
+ export type { TextFieldInputProps, TextFieldProps } from './TextField';
7
7
  export { SelectField } from './SelectField';
8
8
  export type { SelectFieldProps } from './SelectField';
9
9
  export { ToggleField } from './ToggleField';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/total-form/Fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/total-form/Fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -8,5 +8,5 @@ export { SubmitButton } from './SubmitButton';
8
8
  export type { SubmitButtonProps } from './SubmitButton';
9
9
  export * as Fields from './Fields';
10
10
  export { CategoryField, TextField, SelectField } from './Fields';
11
- export type { CategoryFieldProps, TextFieldProps, SelectFieldProps } from './Fields';
11
+ export type { CategoryFieldProps, TextFieldInputProps, TextFieldProps, SelectFieldProps } from './Fields';
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/total-form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/total-form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.data-display.d.ts","sourceRoot":"","sources":["../../src/en-US.data-display.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EAClB,MAAM,QAAQ,CAAC;AAQhB,eAAO,MAAM,mBAAmB,EAAE,YAcjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAOlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,cAAc,CAa3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,YAAY,CAItD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,iBAUvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAMnC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAqMnC,CAAC"}
1
+ {"version":3,"file":"en-US.data-display.d.ts","sourceRoot":"","sources":["../../src/en-US.data-display.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EAClB,MAAM,QAAQ,CAAC;AAQhB,eAAO,MAAM,mBAAmB,EAAE,YAcjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAOlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,cAAc,CAa3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,YAAY,CAItD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,iBAUvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAMnC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAsMnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pt-BR.data-display.d.ts","sourceRoot":"","sources":["../../src/pt-BR.data-display.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EAClB,MAAM,QAAQ,CAAC;AAQhB,eAAO,MAAM,mBAAmB,EAAE,YAcjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAOlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,cAAc,CAa3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,YAAY,CAItD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,iBAUvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAMnC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aA6LnC,CAAC"}
1
+ {"version":3,"file":"pt-BR.data-display.d.ts","sourceRoot":"","sources":["../../src/pt-BR.data-display.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAC;AACzF,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EAClB,MAAM,QAAQ,CAAC;AAQhB,eAAO,MAAM,mBAAmB,EAAE,YAcjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAOlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,cAAc,CAa3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,YAAY,CAItD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,iBAUvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAMnC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aA8LnC,CAAC"}
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  UserAvatar,
3
3
  UserMenu
4
- } from "./chunk-BO6IMK5P.js";
4
+ } from "./chunk-DPHSJLMN.js";
5
5
  import "./chunk-DQ22UKMZ.js";
6
6
  import "./chunk-UDQSIRAP.js";
7
- import "./chunk-4J62V5OE.js";
7
+ import "./chunk-7YJYIMWP.js";
8
8
  import "./chunk-3ZVUNSFF.js";
9
- import "./chunk-7XSCEHGA.js";
10
- import "./chunk-MTEQEPNY.js";
9
+ import "./chunk-EOQ6EKTS.js";
11
10
  import "./chunk-6ZZGK5DT.js";
11
+ import "./chunk-MTEQEPNY.js";
12
12
  import "./chunk-VUHLNYAE.js";
13
13
  import "./chunk-2GSIEDGN.js";
14
14
  import "./chunk-W2RXXF7K.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.82.0",
3
+ "version": "6.84.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -206,6 +206,12 @@ export interface DataViewsFiltersCopy {
206
206
  * wrong. `dd/mm/aaaa` is one locale's order and one locale's letters.
207
207
  */
208
208
  dayMask: string;
209
+ /**
210
+ * Under a day field holding eight digits that name no day (`31/02/2026`).
211
+ * Without it the field kept the previous filter and said nothing, so the
212
+ * list read like an answer to a date nobody could have meant (FUT-4144).
213
+ */
214
+ dayInvalid: string;
209
215
  /** Drop every applied filter, spelled out in the panel where there is room. */
210
216
  clearAllFilters: string;
211
217
  /** The day-range presets' labels, keyed by preset id. */
@@ -28,7 +28,7 @@
28
28
  * date, which is what keeps the run above at one request rather than four.
29
29
  */
30
30
  import TextField from '@mui/material/TextField/index.js';
31
- import React, { useEffect, useState } from 'react';
31
+ import React, { useEffect, useId, useState } from 'react';
32
32
  import { fieldTextFieldStyles } from '../../../tokens/field-height';
33
33
  import { sxRem } from '../../../tokens/relative';
34
34
 
@@ -146,6 +146,32 @@ export function maskDate(raw: string, mask: string): string {
146
146
  return out.join(separator);
147
147
  }
148
148
 
149
+ /** A wire day on its own, as a paste or an autofill delivers it: `2026-10-01`. */
150
+ const ISO_DAY = /^\s*(\d{4}-\d{2}-\d{2})\s*$/;
151
+
152
+ /**
153
+ * What the field shows for whatever arrived — typed, pasted, autofilled.
154
+ *
155
+ * A whole ISO day (`AAAA-MM-DD`) is READ AS THAT DAY and written in the mask's
156
+ * order. Through `maskDate` alone it is eight digits taken day-first, so a
157
+ * pasted `2026-10-01` came out as `20/26/1001` (FUT-4144). Anything else is
158
+ * masked exactly as typing always was, so the typed and pasted forms of one day
159
+ * land on the same text.
160
+ */
161
+ export function readDayText(raw: string, mask: string): string {
162
+ const iso = ISO_DAY.exec(raw)?.[1];
163
+ const masked = iso ? isoToMasked(iso, mask) : '';
164
+ return masked || maskDate(raw, mask);
165
+ }
166
+
167
+ /**
168
+ * Whether `text` is a WHOLE day that does not exist — `31/02/2026`. A partial
169
+ * entry is not impossible, only unfinished, and is never flagged.
170
+ */
171
+ export function isImpossibleDay(text: string, mask: string): boolean {
172
+ return text.replace(/\D/g, '').length === 8 && maskedToIso(text, mask) === '';
173
+ }
174
+
149
175
  /**
150
176
  * What has to land on the `<input>` itself rather than on the `TextField`.
151
177
  *
@@ -166,30 +192,19 @@ export function maskDate(raw: string, mask: string): string {
166
192
  * keypad to suggest names and addresses, none of which are a date, and none of
167
193
  * which the mask would keep.
168
194
  */
169
- function dayInputProps(testId: string, describedBy: string | undefined) {
195
+ function dayInputProps(testId: string, describedBy: readonly (string | undefined)[]) {
196
+ const ids = describedBy.filter(Boolean).join(' ');
170
197
  return {
171
198
  'data-testid': testId,
172
199
  maxLength: 10,
173
200
  inputMode: 'numeric' as const,
174
201
  autoComplete: 'off',
175
- ...(describedBy ? { 'aria-describedby': describedBy } : {}),
202
+ ...(ids ? { 'aria-describedby': ids } : {}),
176
203
  };
177
204
  }
178
205
 
179
- /**
180
- * One end of a day window. The BOUND stays `AAAA-MM-DD` — the form the backend's
181
- * inclusive day comparison already speaks, and the form the chip label reads —
182
- * so only the typing surface changes.
183
- */
184
- export function DayBoundInput({
185
- label,
186
- value,
187
- onChange,
188
- testId,
189
- error = false,
190
- describedBy,
191
- mask,
192
- }: {
206
+ /** Props of {@link DayBoundInput}. */
207
+ interface DayBoundInputProps {
193
208
  label: string;
194
209
  /** The applied bound, `AAAA-MM-DD`, or undefined when this end is open. */
195
210
  value: string | undefined;
@@ -215,46 +230,127 @@ export function DayBoundInput({
215
230
  * of that picker — which is exactly what it did.
216
231
  */
217
232
  mask: string;
218
- }): React.JSX.Element {
219
- const applied = value ?? '';
233
+ /**
234
+ * Said under the field when its eight digits name no day (`31/02/2026`); the
235
+ * field is then marked invalid and KEEPS the text on blur, so the reader sees
236
+ * what was refused instead of the old value quietly coming back (FUT-4144).
237
+ *
238
+ * Opt-in, because the field ships no words of its own: without it an
239
+ * impossible day is still never written, and blur still snaps back.
240
+ */
241
+ invalidMessage?: string;
242
+ }
243
+
244
+ /** What {@link useDayText} hands the field: its text, its verdict and its handlers. */
245
+ interface DayText {
246
+ text: string;
247
+ impossible: boolean;
248
+ handleChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
249
+ handlePaste: (event: React.ClipboardEvent<HTMLDivElement>) => void;
250
+ handleBlur: () => void;
251
+ }
252
+
253
+ /** The typed text of one bound, kept apart from the APPLIED bound it may commit. */
254
+ function useDayText(
255
+ applied: string,
256
+ mask: string,
257
+ onChange: (bound: string | undefined) => void,
258
+ judgesImpossible: boolean,
259
+ ): DayText {
220
260
  const [text, setText] = useState(() => isoToMasked(applied, mask));
261
+ const impossible = judgesImpossible && isImpossibleDay(text, mask);
262
+
263
+ // Emptying clears the bound. A COMPLETE day applies it. A partial (or an
264
+ // impossible) one does NEITHER — it leaves whatever is applied alone, so
265
+ // typing is never fought and a half-typed year never reaches the backend.
266
+ const enter = (next: string) => {
267
+ setText(next);
268
+ if (next === '') return onChange(undefined);
269
+ const iso = maskedToIso(next, mask);
270
+ if (iso) onChange(iso);
271
+ };
221
272
 
222
273
  // The bound is the APPLIED filter; `text` is what is being typed. Re-sync only
223
274
  // when the applied value moved somewhere the text does not already mean — a
224
275
  // "Limpar", a saved view, the other pill resetting the pair. Without that
225
276
  // guard the field's own write bounces straight back mid-edit and resets the
226
277
  // caret, which is the native control's worst habit reproduced by hand.
278
+ //
279
+ // "Already means" is a REAL day equal to the bound, or an empty field for an
280
+ // open bound. An impossible day parses to `''` too, so a bare comparison let
281
+ // a "Limpar" (applied → `''`) keep `31/02/2026` on screen, red, over a filter
282
+ // that had just been cleared.
227
283
  useEffect(() => {
228
- setText((current) =>
229
- maskedToIso(current, mask) === applied ? current : isoToMasked(applied, mask),
230
- );
284
+ setText((current) => {
285
+ const iso = maskedToIso(current, mask);
286
+ const means = (iso !== '' || current === '') && iso === applied;
287
+ return means ? current : isoToMasked(applied, mask);
288
+ });
231
289
  }, [applied, mask]);
232
290
 
291
+ return {
292
+ text,
293
+ impossible,
294
+ handleChange: (event) => enter(readDayText(event.target.value, mask)),
295
+ // A pasted ISO day REPLACES the field whatever it held: inserted at the
296
+ // caret into existing digits it would be read as more digits, and the
297
+ // `maxLength` would cut a padded one before `onChange` ever saw it.
298
+ handlePaste: (event) => {
299
+ const pasted = event.clipboardData.getData('text');
300
+ if (!ISO_DAY.test(pasted)) return;
301
+ event.preventDefault();
302
+ enter(readDayText(pasted, mask));
303
+ },
304
+ // Leaving a half-typed date on screen would show a filter the list is not
305
+ // actually using. On blur the field snaps back to what IS applied; a
306
+ // complete date already equals it, so this only ever tidies. An impossible
307
+ // day the field is SAYING is impossible stays, with its message: snapping
308
+ // it back is the silent forgetting FUT-4144 removed.
309
+ handleBlur: () => {
310
+ if (!impossible) setText(isoToMasked(applied, mask));
311
+ },
312
+ };
313
+ }
314
+
315
+ /**
316
+ * One end of a day window. The BOUND stays `AAAA-MM-DD` — the form the backend's
317
+ * inclusive day comparison already speaks, and the form the chip label reads —
318
+ * so only the typing surface changes.
319
+ */
320
+ export function DayBoundInput({
321
+ label,
322
+ value,
323
+ onChange,
324
+ testId,
325
+ error = false,
326
+ describedBy,
327
+ mask,
328
+ invalidMessage,
329
+ }: DayBoundInputProps): React.JSX.Element {
330
+ const id = useId();
331
+ const { text, impossible, handleChange, handlePaste, handleBlur } = useDayText(
332
+ value ?? '',
333
+ mask,
334
+ onChange,
335
+ invalidMessage !== undefined,
336
+ );
337
+
233
338
  return (
234
339
  <TextField
235
340
  size="small"
236
341
  type="text"
342
+ id={id}
237
343
  label={label}
238
- error={error}
344
+ error={error || impossible}
345
+ helperText={impossible ? invalidMessage : undefined}
239
346
  placeholder={mask}
240
347
  value={text}
241
- onChange={(event) => {
242
- const next = maskDate(event.target.value, mask);
243
- setText(next);
244
- // Emptying clears the bound. A COMPLETE day applies it. A partial one
245
- // does NEITHER — it leaves whatever is applied alone, so typing is never
246
- // fought and a half-typed year never reaches the backend.
247
- if (next === '') return onChange(undefined);
248
- const iso = maskedToIso(next, mask);
249
- if (iso) onChange(iso);
250
- }}
251
- // Leaving a half-typed (or impossible) date on screen would show a filter
252
- // the list is not actually using. On blur the field snaps back to what IS
253
- // applied; a complete date already equals it, so this only ever tidies.
254
- onBlur={() => setText(isoToMasked(applied, mask))}
348
+ onChange={handleChange}
349
+ onPaste={handlePaste}
350
+ onBlur={handleBlur}
255
351
  // The placeholder occupies the space an un-shrunk label would render into.
256
352
  InputLabelProps={{ shrink: true }}
257
- inputProps={dayInputProps(testId, describedBy)}
353
+ inputProps={dayInputProps(testId, [impossible ? `${id}-helper-text` : undefined, describedBy])}
258
354
  sx={[{ width: sxRem(165) }, fieldTextFieldStyles]}
259
355
  />
260
356
  );
@@ -111,7 +111,7 @@ export function ShellEmpty<T extends Record<string, unknown>>({
111
111
  return (
112
112
  <DataViewsEmpty
113
113
  filtered={c.activeFilterCount > 0 || c.state.search !== ""}
114
- onClearFilters={() => c.patch({ search: "", pills: {}, ranges: {} })}
114
+ onClearFilters={c.clearFilters}
115
115
  emptyState={emptyState}
116
116
  testIdPrefix={testIdPrefix}
117
117
  />
@@ -30,6 +30,12 @@ export interface GridFilterPanelProps<T extends Record<string, unknown>> {
30
30
  onChangeRange: (fieldId: string, range: RangeValue) => void;
31
31
  onClearField: (fieldId: string) => void;
32
32
  onClearAll: () => void;
33
+ /**
34
+ * Changes on every clear-all, from any surface (`useClearFilters`). The
35
+ * controls are keyed on it, so a clear also empties a field holding text the
36
+ * filter never applied — a refused day under an open range (FUT-4144).
37
+ */
38
+ clearKey?: number;
33
39
  }
34
40
 
35
41
  /** One pill field: a compact multi-select for long lists, else a checkbox list. */
@@ -135,7 +141,7 @@ export function GridFilterPanel<T extends Record<string, unknown>>(
135
141
  clearTestId={`${props.testIdPrefix}-clear-filters`}
136
142
  ariaLabel={copy.filters.panelTitle}
137
143
  >
138
- <FilterControls {...props} />
144
+ <FilterControls key={props.clearKey} {...props} />
139
145
  </TableFilter.Panel>
140
146
  );
141
147
  }
@@ -180,7 +186,7 @@ export function FilterDialog<T extends Record<string, unknown>>({
180
186
  {copy.filters.clearAllFilters}
181
187
  </Link>
182
188
  </Box>
183
- <FilterControls {...props} />
189
+ <FilterControls key={props.clearKey} {...props} />
184
190
  </Box>
185
191
  </StackedModalContent>
186
192
  </StackedModal>
@@ -85,6 +85,8 @@ interface FilterSurfaceProps<T extends Record<string, unknown>> {
85
85
  onChangeRange: (fieldId: string, range: RangeValue) => void;
86
86
  onClearField: (fieldId: string) => void;
87
87
  onClearAll: () => void;
88
+ /** Changes on every clear-all; the panel's controls are keyed on it. */
89
+ clearKey: number;
88
90
  /** Press a quick chip (its field becomes `[value]`), or release the pressed one. */
89
91
  onToggleQuick: (quick: QuickFilterConfig) => void;
90
92
  }
@@ -175,7 +177,7 @@ function useGridShellFilters<T extends Record<string, unknown>>({
175
177
  c.patch(({ pills }) => ({ pills: { ...pills, [fieldId]: togglePillValues(pills[fieldId], value, checked) } })),
176
178
  onChangeRange: (fieldId, range) => c.patch({ ranges: { ...c.ranges, [fieldId]: range } }),
177
179
  onClearField: (fieldId) => c.patch({ pills: { ...state.pills, [fieldId]: [] } }),
178
- onClearAll: () => c.patch({ search: "", pills: {}, ranges: {} }),
180
+ onClearAll: c.clearFilters, clearKey: c.clearKey,
179
181
  onToggleQuick: (quick) => c.patch(({ pills }) => ({ pills: toggleQuick(pills, quick) })),
180
182
  };
181
183
  return {
@@ -218,7 +218,10 @@ export function InlineFilterControls<T extends Record<string, unknown>>({
218
218
  activeFilterCount,
219
219
  onControlOpenChange,
220
220
  onToggleQuick,
221
+ clearKey,
221
222
  }: Omit<InlineFilterBarProps<T>, "fields" | "rangeFields"> & {
223
+ /** Changes on every clear-all; the "Mais" fields are keyed on it (FUT-4144). */
224
+ clearKey?: number;
222
225
  /** Presses or releases a quick chip — see `QuickFilterConfig`. */
223
226
  onToggleQuick?: (quick: QuickFilterConfig) => void;
224
227
  /** How many filters are applied — decides whether "Limpar" is on the bar at all. */
@@ -275,6 +278,7 @@ export function InlineFilterControls<T extends Record<string, unknown>>({
275
278
  compactControls={compactControls}
276
279
  clearAllHidden={clearAllHidden}
277
280
  testIdPrefix={testIdPrefix}
281
+ clearKey={clearKey}
278
282
  />
279
283
  )}
280
284
  </Box>
@@ -302,7 +306,9 @@ function FilterSlots<T extends Record<string, unknown>>({
302
306
  compactControls,
303
307
  clearAllHidden,
304
308
  testIdPrefix,
309
+ clearKey,
305
310
  }: {
311
+ clearKey?: number;
306
312
  onToggleQuick?: (quick: QuickFilterConfig) => void;
307
313
  inline: OverflowField<T>[];
308
314
  overflow: OverflowField<T>[];
@@ -335,6 +341,7 @@ function FilterSlots<T extends Record<string, unknown>>({
335
341
  />
336
342
  ))}
337
343
  <MoreFilters
344
+ clearKey={clearKey}
338
345
  onOpenChange={onControlOpenChange}
339
346
  onClearAll={onClearAll}
340
347
  anyApplied={activeFilterCount > 0}
@@ -207,8 +207,11 @@ export function MoreFilters<T extends Record<string, unknown>>({
207
207
  onClearAll,
208
208
  anyApplied,
209
209
  compact = false,
210
+ clearKey,
210
211
  ...rest
211
212
  }: MoreFiltersProps<T> & {
213
+ /** Changes on every clear-all; the fields here are keyed on it (FUT-4144). */
214
+ clearKey?: number;
212
215
  /** Icon only — the same rung that strips Exibir/Exportar. */
213
216
  compact?: boolean;
214
217
  /** Clears every filter, not just the ones in here. */
@@ -267,7 +270,7 @@ export function MoreFilters<T extends Record<string, unknown>>({
267
270
  means something refused to, which is a bug to fix rather than a
268
271
  scrollbar to live with. */}
269
272
  <Box sx={{ maxHeight: sxRem(320), overflowY: "auto", overflowX: "hidden", p: 1.5, minWidth: 0 }}>
270
- <MoreFields fields={fields} {...rest} />
273
+ <MoreFields key={clearKey} fields={fields} {...rest} />
271
274
  </Box>
272
275
  {anyApplied && (
273
276
  <MoreFooter onClearAll={onClearAll} testIdPrefix={rest.testIdPrefix} />
@@ -24,6 +24,7 @@ import { TableFilter } from '../../layout/TableFilter';
24
24
  import { DayBoundInput } from './data-views-day-input';
25
25
  import { NumberBoundInput } from './data-views-number-input';
26
26
  import { RangePresets } from './data-views-preset-chips';
27
+ import { useOutsideResetKey } from './data-views-range-reset';
27
28
  import { presetsFor } from './data-views-range-presets';
28
29
  import {
29
30
  isRangeInverted,
@@ -64,6 +65,7 @@ function BoundField<T extends Record<string, unknown>>({
64
65
  return (
65
66
  <DayBoundInput
66
67
  mask={copy.filters.dayMask}
68
+ invalidMessage={copy.filters.dayInvalid}
67
69
  label={label}
68
70
  value={value == null ? undefined : String(value)}
69
71
  onChange={onChange}
@@ -101,6 +103,7 @@ export function RangeBounds<T extends Record<string, unknown>>({
101
103
  }): React.JSX.Element {
102
104
  const copy = useDataViewsCopy();
103
105
  const inverted = isRangeInverted(value);
106
+ const { key, emitted } = useOutsideResetKey(value);
104
107
  return (
105
108
  <Box data-testid={`${testId}-panel`}>
106
109
  {/* Above the inputs, not below: the presets are the answer for most
@@ -108,19 +111,24 @@ export function RangeBounds<T extends Record<string, unknown>>({
108
111
  <Box sx={{ '&:not(:empty)': { mb: 1.5 } }}>
109
112
  <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />
110
113
  </Box>
111
- <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>
114
+ {/* Top-aligned: a day that does not exist grows ITS field by a message
115
+ line, and centring would push the other box half a line down. The two
116
+ boxes are one height, so with no message this is the same row. */}
117
+ <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>
112
118
  <BoundField
119
+ key={`min-${key}`}
113
120
  field={field}
114
121
  label={copy.filters.rangeStart}
115
122
  value={value.min}
116
- onChange={(min) => onChange({ ...value, min })}
123
+ onChange={(min) => onChange(emitted({ ...value, min }))}
117
124
  testId={`${testId}-min`}
118
125
  />
119
126
  <BoundField
127
+ key={`max-${key}`}
120
128
  field={field}
121
129
  label={copy.filters.rangeEnd}
122
130
  value={value.max}
123
- onChange={(max) => onChange({ ...value, max })}
131
+ onChange={(max) => onChange(emitted({ ...value, max }))}
124
132
  testId={`${testId}-max`}
125
133
  />
126
134
  </Box>