@12-apps/ui 6.56.1 → 6.58.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 (292) hide show
  1. package/NATIVE.md +2 -2
  2. package/components-catalog.md +2 -2
  3. package/dist/_internal/components/data-display/Avatar/Avatar.js +2 -2
  4. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  5. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  6. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  7. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  8. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  9. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  10. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  11. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +18 -18
  12. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -25
  13. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
  14. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +3 -3
  15. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +3 -3
  16. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +5 -3
  17. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +45 -0
  18. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js.map +1 -0
  19. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +2 -2
  20. package/dist/_internal/components/data-display/DataViews/base-list-card.js +5 -4
  21. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +1 -1
  22. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +4 -4
  23. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +4 -4
  24. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +17 -17
  25. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
  26. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +4 -4
  27. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +5 -5
  28. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  29. package/dist/_internal/components/data-display/DataViews/data-views-selection-extra.js +3 -1
  30. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +3 -3
  31. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +6 -6
  32. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +2 -2
  33. package/dist/_internal/components/data-display/DataViews/data-views-url-echo.js +13 -0
  34. package/dist/_internal/components/data-display/DataViews/data-views-url-echo.js.map +1 -0
  35. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +1 -1
  36. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +1 -1
  37. package/dist/_internal/components/data-display/Progress/Progress.js +1 -1
  38. package/dist/_internal/components/data-display/index.js +15 -15
  39. package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
  40. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +1 -1
  41. package/dist/_internal/components/feedback/index.js +2 -2
  42. package/dist/_internal/components/index.js +35 -35
  43. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.js +1 -1
  44. package/dist/_internal/components/layout/SettingCard/SettingCard.js +5 -5
  45. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +3 -3
  46. package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +4 -4
  47. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +4 -4
  48. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +6 -6
  49. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +5 -5
  50. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +6 -6
  51. package/dist/_internal/components/layout/index.js +10 -10
  52. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +3 -3
  53. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +6 -6
  54. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +9 -9
  55. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +3 -3
  56. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +4 -4
  57. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +5 -5
  58. package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js +4 -4
  59. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +4 -4
  60. package/dist/_internal/components/navigation/index.js +12 -12
  61. package/dist/_internal/en-US.data-display.js +1 -1
  62. package/dist/_internal/icons/Icon.js +2 -2
  63. package/dist/_internal/icons/paths.generated.js +1 -1
  64. package/dist/_internal/pt-BR.data-display.js +1 -1
  65. package/dist/_internal/user-avatar/user-avatar.js +3 -3
  66. package/dist/charts.js +6 -6
  67. package/dist/{chunk-MKAA3YIJ.js → chunk-3K7WN2PO.js} +3 -3
  68. package/dist/{chunk-CLC4VIOF.js → chunk-4PYEDDYV.js} +2 -2
  69. package/dist/{chunk-573XC4HK.js → chunk-4QKS5Y35.js} +2 -2
  70. package/dist/{chunk-KX75HM5U.js → chunk-5YDS6HO3.js} +7 -2
  71. package/dist/{chunk-KX75HM5U.js.map → chunk-5YDS6HO3.js.map} +1 -1
  72. package/dist/{chunk-N4MR4EMC.js → chunk-6D2PFC5C.js} +2 -2
  73. package/dist/{chunk-JWXGZ4VM.js → chunk-6J27G2HT.js} +2 -2
  74. package/dist/{chunk-LJKWWXZD.js → chunk-6OSUK2C7.js} +28 -22
  75. package/dist/chunk-6OSUK2C7.js.map +1 -0
  76. package/dist/{chunk-ICSXPZXT.js → chunk-6QBT5TPS.js} +2 -2
  77. package/dist/{chunk-C67FDYG7.js → chunk-7CWZI6MQ.js} +5 -5
  78. package/dist/{chunk-WGFHZNFR.js → chunk-AEIJSEVV.js} +4 -1
  79. package/dist/{chunk-WGFHZNFR.js.map → chunk-AEIJSEVV.js.map} +1 -1
  80. package/dist/{chunk-JL77BSOL.js → chunk-AQI3UK6P.js} +2 -2
  81. package/dist/{chunk-A6EUQDRK.js → chunk-ARJIKW56.js} +4 -2
  82. package/dist/chunk-ARJIKW56.js.map +1 -0
  83. package/dist/{chunk-6E4XNOAC.js → chunk-CCCILWYZ.js} +4 -4
  84. package/dist/{chunk-GI24X7XA.js → chunk-DZIRCD2W.js} +2 -2
  85. package/dist/{chunk-53ACGKBW.js → chunk-EDBP62WG.js} +3 -3
  86. package/dist/{chunk-YXIVQFNW.js → chunk-EWIKSTJV.js} +4 -4
  87. package/dist/{chunk-LWZ2K225.js → chunk-FXZUVZON.js} +6 -6
  88. package/dist/chunk-G6EJLEVV.js +75 -0
  89. package/dist/chunk-G6EJLEVV.js.map +1 -0
  90. package/dist/{chunk-IK2ZVV3M.js → chunk-GK7JNSMK.js} +2 -2
  91. package/dist/{chunk-Y2HCYT5W.js → chunk-GRRW5NSR.js} +2 -2
  92. package/dist/{chunk-NZZ2BTIK.js → chunk-H7R6UKOE.js} +2 -2
  93. package/dist/{chunk-HFBQCJNP.js → chunk-HCYRCU4W.js} +2 -2
  94. package/dist/{chunk-C3BRCCHG.js → chunk-HH7PM5HT.js} +12 -24
  95. package/dist/chunk-HH7PM5HT.js.map +1 -0
  96. package/dist/{chunk-7AAJYWC3.js → chunk-HPO7PB4F.js} +2 -2
  97. package/dist/{chunk-WF3P7GE5.js → chunk-I3CQBEKS.js} +2 -2
  98. package/dist/{chunk-RREWYOKS.js → chunk-IL4FCC54.js} +2 -2
  99. package/dist/{chunk-7M3DRP7Q.js → chunk-ILNO4ZJ6.js} +3 -3
  100. package/dist/{chunk-AL3Z24VG.js → chunk-ILQVNZ5B.js} +2 -2
  101. package/dist/{chunk-5PN5MY2X.js → chunk-INQO5AYV.js} +3 -3
  102. package/dist/{chunk-2DV64INT.js → chunk-KEDZTZCV.js} +2 -2
  103. package/dist/{chunk-2CJZLL5Y.js → chunk-NHVL2QPG.js} +2 -1
  104. package/dist/{chunk-2CJZLL5Y.js.map → chunk-NHVL2QPG.js.map} +1 -1
  105. package/dist/{chunk-45PGSVOH.js → chunk-NTJUAPJM.js} +10 -8
  106. package/dist/chunk-NTJUAPJM.js.map +1 -0
  107. package/dist/{chunk-EUPUEMFX.js → chunk-PC4H5LVB.js} +7 -7
  108. package/dist/{chunk-44JLXXWQ.js → chunk-PPITQH3C.js} +2 -2
  109. package/dist/{chunk-KEKOPD43.js → chunk-PQ7RWH7L.js} +4 -2
  110. package/dist/chunk-PQ7RWH7L.js.map +1 -0
  111. package/dist/{chunk-HRMB72E4.js → chunk-QHP5PZNC.js} +2 -1
  112. package/dist/{chunk-HRMB72E4.js.map → chunk-QHP5PZNC.js.map} +1 -1
  113. package/dist/{chunk-GNBCSTXF.js → chunk-QKAYXAQE.js} +6 -6
  114. package/dist/{chunk-GNBCSTXF.js.map → chunk-QKAYXAQE.js.map} +1 -1
  115. package/dist/{chunk-JC244QQF.js → chunk-SEWUYHSG.js} +2 -2
  116. package/dist/{chunk-TZFBJ47T.js → chunk-SFLNHCA2.js} +39 -15
  117. package/dist/chunk-SFLNHCA2.js.map +1 -0
  118. package/dist/{chunk-OBMPE6PW.js → chunk-SSDYEOU4.js} +5 -5
  119. package/dist/{chunk-I6ESCBY3.js → chunk-TF27Z27K.js} +2 -2
  120. package/dist/{chunk-JF5LQOGB.js → chunk-U47KRLEW.js} +57 -45
  121. package/dist/chunk-U47KRLEW.js.map +1 -0
  122. package/dist/{chunk-RBHBJDOZ.js → chunk-UEU5NSIG.js} +4 -4
  123. package/dist/chunk-V4V2N6YJ.js +55 -0
  124. package/dist/chunk-V4V2N6YJ.js.map +1 -0
  125. package/dist/{chunk-XTHDWW4M.js → chunk-VAY6KESM.js} +7 -4
  126. package/dist/chunk-VAY6KESM.js.map +1 -0
  127. package/dist/{chunk-5XZEGI35.js → chunk-X7HCS3HP.js} +3 -3
  128. package/dist/{chunk-6ZLP7BA7.js → chunk-XC7YHO7Z.js} +3 -1
  129. package/dist/{chunk-6ZLP7BA7.js.map → chunk-XC7YHO7Z.js.map} +1 -1
  130. package/dist/{chunk-T2S7NIUG.js → chunk-XE4JVTM6.js} +2 -2
  131. package/dist/{chunk-G76BNXWE.js → chunk-XW5SEW3H.js} +6 -6
  132. package/dist/{chunk-SIWXMNQT.js → chunk-YDTCM5F6.js} +4 -4
  133. package/dist/{chunk-46ZATLQV.js → chunk-YIKFYWKD.js} +3 -3
  134. package/dist/{chunk-BQGWY577.js → chunk-ZCUVZ5PR.js} +3 -3
  135. package/dist/{chunk-4JBS6NOT.js → chunk-ZWBGQYVO.js} +35 -6
  136. package/dist/chunk-ZWBGQYVO.js.map +1 -0
  137. package/dist/{chunk-VWW2EXH7.js → chunk-ZYJZHXFU.js} +4 -4
  138. package/dist/data-display/Avatar.js +2 -2
  139. package/dist/data-display/Badge.js +2 -2
  140. package/dist/data-display/CardKit.js +10 -10
  141. package/dist/data-display/Carousel.js +2 -2
  142. package/dist/data-display/Chart.js +6 -6
  143. package/dist/data-display/DataGrid.js +2 -2
  144. package/dist/data-display/DataViews.js +31 -29
  145. package/dist/data-display/Progress.js +1 -1
  146. package/dist/en-US.js +1 -1
  147. package/dist/feedback/Dialog.js +2 -2
  148. package/dist/icons.js +2 -2
  149. package/dist/layout/ContentToolbar.js +1 -1
  150. package/dist/layout/SettingCard.js +9 -9
  151. package/dist/locales.js +2 -2
  152. package/dist/native/chunks/{chunk-QGTZGL7P.js → chunk-BUFQXX27.js} +2 -2
  153. package/dist/native/chunks/{chunk-EZO2KJF7.js → chunk-JFKH5YHF.js} +3 -1
  154. package/dist/native/chunks/{chunk-EZO2KJF7.js.map → chunk-JFKH5YHF.js.map} +1 -1
  155. package/dist/native/data-display/Alert.js +1 -1
  156. package/dist/native/data-display/Avatar.js +1 -1
  157. package/dist/native/data-display/Badge.js +1 -1
  158. package/dist/native/data-display/Chip.js +1 -1
  159. package/dist/native/data-display/EmptyState.js +2 -2
  160. package/dist/native/data-display/ErrorState.js +1 -1
  161. package/dist/native/data-display/FleetMap.js +2 -2
  162. package/dist/native/data-display/Progress.js +11 -5
  163. package/dist/native/data-display/Progress.js.map +1 -1
  164. package/dist/native/feedback/Dialog.js +2 -1
  165. package/dist/native/feedback/Dialog.js.map +1 -1
  166. package/dist/native/form/Checkbox.js +1 -1
  167. package/dist/native/form/Select.js +1 -1
  168. package/dist/native/icons.js +1 -1
  169. package/dist/navigation/AppHeader.js +3 -3
  170. package/dist/navigation/SectionNav.js +9 -9
  171. package/dist/pt-BR.js +1 -1
  172. package/dist/types/components/data-display/DataViews/DataViewsTableBase.d.ts.map +1 -1
  173. package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts +29 -1
  174. package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts.map +1 -1
  175. package/dist/types/components/data-display/DataViews/base-list-card-layout.d.ts +46 -0
  176. package/dist/types/components/data-display/DataViews/base-list-card-layout.d.ts.map +1 -0
  177. package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts +5 -2
  178. package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts.map +1 -1
  179. package/dist/types/components/data-display/DataViews/base-list-card.d.ts +10 -1
  180. package/dist/types/components/data-display/DataViews/base-list-card.d.ts.map +1 -1
  181. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +7 -0
  182. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  183. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
  184. package/dist/types/components/data-display/DataViews/data-views-selection-extra.d.ts +2 -0
  185. package/dist/types/components/data-display/DataViews/data-views-selection-extra.d.ts.map +1 -1
  186. package/dist/types/components/data-display/DataViews/data-views-shell-toolbar.d.ts +3 -1
  187. package/dist/types/components/data-display/DataViews/data-views-shell-toolbar.d.ts.map +1 -1
  188. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts +2 -0
  189. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
  190. package/dist/types/components/data-display/DataViews/data-views-url-echo.d.ts +47 -0
  191. package/dist/types/components/data-display/DataViews/data-views-url-echo.d.ts.map +1 -0
  192. package/dist/types/components/data-display/DataViews/list-card-rails.d.ts +17 -2
  193. package/dist/types/components/data-display/DataViews/list-card-rails.d.ts.map +1 -1
  194. package/dist/types/components/data-display/Progress/Progress.base.d.ts +8 -0
  195. package/dist/types/components/data-display/Progress/Progress.base.d.ts.map +1 -1
  196. package/dist/types/components/data-display/Progress/Progress.d.ts.map +1 -1
  197. package/dist/types/components/feedback/Dialog/Dialog.base.d.ts +2 -1
  198. package/dist/types/components/feedback/Dialog/Dialog.base.d.ts.map +1 -1
  199. package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
  200. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts +3 -2
  201. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts.map +1 -1
  202. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts +14 -0
  203. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts.map +1 -1
  204. package/dist/types/en-US.data-display.d.ts.map +1 -1
  205. package/dist/types/icons/paths.generated.d.ts +2 -0
  206. package/dist/types/icons/paths.generated.d.ts.map +1 -1
  207. package/dist/types/pt-BR.data-display.d.ts.map +1 -1
  208. package/dist/types-native/components/data-display/Progress/Progress.base.d.ts +8 -0
  209. package/dist/types-native/components/data-display/Progress/Progress.base.d.ts.map +1 -1
  210. package/dist/types-native/components/data-display/Progress/Progress.native.d.ts.map +1 -1
  211. package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts +2 -1
  212. package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts.map +1 -1
  213. package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts.map +1 -1
  214. package/dist/types-native/icons/paths.generated.d.ts +2 -0
  215. package/dist/types-native/icons/paths.generated.d.ts.map +1 -1
  216. package/dist/user-avatar.js +3 -3
  217. package/package.json +1 -1
  218. package/src/components/data-display/DataViews/DataViewsTableBase.tsx +7 -36
  219. package/src/components/data-display/DataViews/base-list-card-geometry.tsx +114 -40
  220. package/src/components/data-display/DataViews/base-list-card-layout.tsx +104 -0
  221. package/src/components/data-display/DataViews/base-list-card-slots.tsx +47 -3
  222. package/src/components/data-display/DataViews/base-list-card.tsx +65 -68
  223. package/src/components/data-display/DataViews/data-views-copy.ts +7 -0
  224. package/src/components/data-display/DataViews/data-views-grid-parts.tsx +2 -1
  225. package/src/components/data-display/DataViews/data-views-selection-extra.ts +10 -1
  226. package/src/components/data-display/DataViews/data-views-shell-toolbar.tsx +4 -0
  227. package/src/components/data-display/DataViews/data-views-toolbar.tsx +4 -0
  228. package/src/components/data-display/DataViews/data-views-url-echo.ts +134 -0
  229. package/src/components/data-display/DataViews/list-card-rails.tsx +22 -6
  230. package/src/components/data-display/Progress/Progress.base.ts +10 -0
  231. package/src/components/data-display/Progress/Progress.md +23 -0
  232. package/src/components/data-display/Progress/Progress.native.tsx +35 -25
  233. package/src/components/data-display/Progress/Progress.tsx +8 -5
  234. package/src/components/feedback/Dialog/Dialog.base.ts +2 -1
  235. package/src/components/feedback/Dialog/Dialog.look.native.ts +1 -0
  236. package/src/components/feedback/Dialog/Dialog.md +25 -1
  237. package/src/components/feedback/Dialog/Dialog.styles.ts +3 -0
  238. package/src/components/layout/ContentToolbar/ContentToolbar.md +5 -2
  239. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +51 -10
  240. package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +14 -0
  241. package/src/en-US.data-display.ts +1 -0
  242. package/src/icons/Icon.md +4 -0
  243. package/src/icons/glyphs.json +2 -0
  244. package/src/icons/paths.generated.ts +2 -0
  245. package/src/pt-BR.data-display.ts +1 -0
  246. package/dist/chunk-45PGSVOH.js.map +0 -1
  247. package/dist/chunk-4JBS6NOT.js.map +0 -1
  248. package/dist/chunk-A6EUQDRK.js.map +0 -1
  249. package/dist/chunk-C3BRCCHG.js.map +0 -1
  250. package/dist/chunk-JF5LQOGB.js.map +0 -1
  251. package/dist/chunk-KEKOPD43.js.map +0 -1
  252. package/dist/chunk-LJKWWXZD.js.map +0 -1
  253. package/dist/chunk-TZFBJ47T.js.map +0 -1
  254. package/dist/chunk-XTHDWW4M.js.map +0 -1
  255. /package/dist/{chunk-MKAA3YIJ.js.map → chunk-3K7WN2PO.js.map} +0 -0
  256. /package/dist/{chunk-CLC4VIOF.js.map → chunk-4PYEDDYV.js.map} +0 -0
  257. /package/dist/{chunk-573XC4HK.js.map → chunk-4QKS5Y35.js.map} +0 -0
  258. /package/dist/{chunk-N4MR4EMC.js.map → chunk-6D2PFC5C.js.map} +0 -0
  259. /package/dist/{chunk-JWXGZ4VM.js.map → chunk-6J27G2HT.js.map} +0 -0
  260. /package/dist/{chunk-ICSXPZXT.js.map → chunk-6QBT5TPS.js.map} +0 -0
  261. /package/dist/{chunk-C67FDYG7.js.map → chunk-7CWZI6MQ.js.map} +0 -0
  262. /package/dist/{chunk-JL77BSOL.js.map → chunk-AQI3UK6P.js.map} +0 -0
  263. /package/dist/{chunk-6E4XNOAC.js.map → chunk-CCCILWYZ.js.map} +0 -0
  264. /package/dist/{chunk-GI24X7XA.js.map → chunk-DZIRCD2W.js.map} +0 -0
  265. /package/dist/{chunk-53ACGKBW.js.map → chunk-EDBP62WG.js.map} +0 -0
  266. /package/dist/{chunk-YXIVQFNW.js.map → chunk-EWIKSTJV.js.map} +0 -0
  267. /package/dist/{chunk-LWZ2K225.js.map → chunk-FXZUVZON.js.map} +0 -0
  268. /package/dist/{chunk-IK2ZVV3M.js.map → chunk-GK7JNSMK.js.map} +0 -0
  269. /package/dist/{chunk-Y2HCYT5W.js.map → chunk-GRRW5NSR.js.map} +0 -0
  270. /package/dist/{chunk-NZZ2BTIK.js.map → chunk-H7R6UKOE.js.map} +0 -0
  271. /package/dist/{chunk-HFBQCJNP.js.map → chunk-HCYRCU4W.js.map} +0 -0
  272. /package/dist/{chunk-7AAJYWC3.js.map → chunk-HPO7PB4F.js.map} +0 -0
  273. /package/dist/{chunk-WF3P7GE5.js.map → chunk-I3CQBEKS.js.map} +0 -0
  274. /package/dist/{chunk-RREWYOKS.js.map → chunk-IL4FCC54.js.map} +0 -0
  275. /package/dist/{chunk-7M3DRP7Q.js.map → chunk-ILNO4ZJ6.js.map} +0 -0
  276. /package/dist/{chunk-AL3Z24VG.js.map → chunk-ILQVNZ5B.js.map} +0 -0
  277. /package/dist/{chunk-5PN5MY2X.js.map → chunk-INQO5AYV.js.map} +0 -0
  278. /package/dist/{chunk-2DV64INT.js.map → chunk-KEDZTZCV.js.map} +0 -0
  279. /package/dist/{chunk-EUPUEMFX.js.map → chunk-PC4H5LVB.js.map} +0 -0
  280. /package/dist/{chunk-44JLXXWQ.js.map → chunk-PPITQH3C.js.map} +0 -0
  281. /package/dist/{chunk-JC244QQF.js.map → chunk-SEWUYHSG.js.map} +0 -0
  282. /package/dist/{chunk-OBMPE6PW.js.map → chunk-SSDYEOU4.js.map} +0 -0
  283. /package/dist/{chunk-I6ESCBY3.js.map → chunk-TF27Z27K.js.map} +0 -0
  284. /package/dist/{chunk-RBHBJDOZ.js.map → chunk-UEU5NSIG.js.map} +0 -0
  285. /package/dist/{chunk-5XZEGI35.js.map → chunk-X7HCS3HP.js.map} +0 -0
  286. /package/dist/{chunk-T2S7NIUG.js.map → chunk-XE4JVTM6.js.map} +0 -0
  287. /package/dist/{chunk-G76BNXWE.js.map → chunk-XW5SEW3H.js.map} +0 -0
  288. /package/dist/{chunk-SIWXMNQT.js.map → chunk-YDTCM5F6.js.map} +0 -0
  289. /package/dist/{chunk-46ZATLQV.js.map → chunk-YIKFYWKD.js.map} +0 -0
  290. /package/dist/{chunk-BQGWY577.js.map → chunk-ZCUVZ5PR.js.map} +0 -0
  291. /package/dist/{chunk-VWW2EXH7.js.map → chunk-ZYJZHXFU.js.map} +0 -0
  292. /package/dist/native/chunks/{chunk-QGTZGL7P.js.map → chunk-BUFQXX27.js.map} +0 -0
@@ -34,6 +34,7 @@ import {
34
34
  } from './Progress.metrics';
35
35
  import type { ProgressProps, ProgressSize, ProgressVariant } from './Progress.types.native';
36
36
  import { useLoopedProgress } from '../../../platform/animation';
37
+ import { renderTextChildren } from '../../../platform/text-children';
37
38
  import { useUiTheme } from '../../../provider/use-ui-theme.native';
38
39
  import type { ColorValue } from '../../../tokens/vocabulary';
39
40
 
@@ -233,7 +234,8 @@ function CircularView({
233
234
  rest,
234
235
  thickness,
235
236
  circularSize,
236
- }: ViewArgs & { thickness: number; circularSize?: number }): React.JSX.Element {
237
+ centerContent,
238
+ }: ViewArgs & { thickness: number; circularSize?: number; centerContent?: React.ReactNode }): React.JSX.Element {
237
239
  const theme = useUiTheme();
238
240
  const indeterminate = value === undefined;
239
241
  const pulseStyle = usePulseStyle(pulse);
@@ -243,31 +245,37 @@ function CircularView({
243
245
 
244
246
  return (
245
247
  <View ref={containerRef} testID={testID} style={[styles.inline, style]}>
246
- <Animated.View
247
- testID={elementTestID}
248
- role="progressbar"
249
- {...valueAria(value)}
250
- style={[box, glow ? circularGlowStyle(theme, color) : null, pulseStyle]}
251
- {...rest}
252
- >
253
- <Animated.View style={[box, spin]}>
254
- <CircularDial
255
- diameter={diameter}
256
- thickness={thickness}
257
- stroke={progressPalette(theme, color).main}
258
- dashOffset={
259
- indeterminate
260
- ? circularCircumference(thickness) * (1 - CIRCULAR_INDETERMINATE.arc)
261
- : circularDashOffset(displayValue, thickness)
262
- }
263
- />
248
+ <View style={[box, styles.inline]}>
249
+ <Animated.View
250
+ testID={elementTestID}
251
+ role="progressbar"
252
+ {...valueAria(value)}
253
+ style={[box, glow ? circularGlowStyle(theme, color) : null, pulseStyle]}
254
+ {...rest}
255
+ >
256
+ <Animated.View style={[box, spin]}>
257
+ <CircularDial
258
+ diameter={diameter}
259
+ thickness={thickness}
260
+ stroke={progressPalette(theme, color).main}
261
+ dashOffset={
262
+ indeterminate
263
+ ? circularCircumference(thickness) * (1 - CIRCULAR_INDETERMINATE.arc)
264
+ : circularDashOffset(displayValue, thickness)
265
+ }
266
+ />
267
+ </Animated.View>
264
268
  </Animated.View>
265
- </Animated.View>
266
- {showLabel && !indeterminate ? (
267
- <View style={[StyleSheet.absoluteFill, styles.centre]}>
268
- <ProgressLabel size={size} label={displayLabel} testID={`${testID}-label`} muted />
269
- </View>
270
- ) : null}
269
+ {centerContent != null ? (
270
+ <View testID={`${testID}-center`} style={[StyleSheet.absoluteFill, styles.centre]}>
271
+ {renderTextChildren(centerContent, labelStyle(theme, size, true))}
272
+ </View>
273
+ ) : showLabel && !indeterminate ? (
274
+ <View style={[StyleSheet.absoluteFill, styles.centre]}>
275
+ <ProgressLabel size={size} label={displayLabel} testID={`${testID}-label`} muted />
276
+ </View>
277
+ ) : null}
278
+ </View>
271
279
  </View>
272
280
  );
273
281
  }
@@ -328,6 +336,7 @@ export const Progress = React.forwardRef<View, ProgressProps>((rawProps, ref) =>
328
336
  pulse,
329
337
  showLabel,
330
338
  label,
339
+ centerContent,
331
340
  segments,
332
341
  thickness,
333
342
  circularSize,
@@ -365,6 +374,7 @@ export const Progress = React.forwardRef<View, ProgressProps>((rawProps, ref) =>
365
374
  elementTestID={elementId ?? `${base}-circular`}
366
375
  thickness={thickness}
367
376
  circularSize={circularSize}
377
+ centerContent={centerContent}
368
378
  />
369
379
  );
370
380
  }
@@ -137,7 +137,7 @@ const ProgressLabel: React.FC<{ size: ProgressSize; label: string; testId: strin
137
137
 
138
138
  const CircularView = React.forwardRef<
139
139
  HTMLDivElement,
140
- ViewProps & { thickness: number; circularSize?: number }
140
+ ViewProps & { thickness: number; circularSize?: number; centerContent?: React.ReactNode }
141
141
  >(
142
142
  (
143
143
  {
@@ -152,6 +152,7 @@ const CircularView = React.forwardRef<
152
152
  dataTestId,
153
153
  thickness,
154
154
  circularSize,
155
+ centerContent,
155
156
  ...props
156
157
  },
157
158
  ref,
@@ -172,8 +173,9 @@ const CircularView = React.forwardRef<
172
173
  data-testid={`${dataTestId}-circular`}
173
174
  {...props}
174
175
  />
175
- {showLabel && value !== undefined && (
176
+ {(centerContent != null || (showLabel && value !== undefined)) && (
176
177
  <Box
178
+ data-testid={centerContent != null ? `${dataTestId}-center` : undefined}
177
179
  sx={{
178
180
  top: 0,
179
181
  left: 0,
@@ -185,7 +187,7 @@ const CircularView = React.forwardRef<
185
187
  justifyContent: 'center',
186
188
  }}
187
189
  >
188
- <Typography
190
+ {centerContent ?? <Typography
189
191
  variant="caption"
190
192
  component="div"
191
193
  color="text.secondary"
@@ -193,7 +195,7 @@ const CircularView = React.forwardRef<
193
195
  data-testid={`${dataTestId}-label`}
194
196
  >
195
197
  {displayLabel}
196
- </Typography>
198
+ </Typography>}
197
199
  </Box>
198
200
  )}
199
201
  </Box>
@@ -263,6 +265,7 @@ export const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(
263
265
  pulse,
264
266
  showLabel,
265
267
  label,
268
+ centerContent,
266
269
  segments,
267
270
  thickness,
268
271
  circularSize,
@@ -290,7 +293,7 @@ export const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(
290
293
 
291
294
  if (variant === 'circular') {
292
295
  return (
293
- <CircularView ref={ref} {...shared} thickness={thickness} circularSize={circularSize} />
296
+ <CircularView ref={ref} {...shared} thickness={thickness} circularSize={circularSize} centerContent={centerContent} />
294
297
  );
295
298
  }
296
299
 
@@ -13,7 +13,7 @@ import type { SizeValue } from '../../../tokens/vocabulary';
13
13
  * either side: MUI's own `onClose` reason argument is dropped by `Dialog.tsx`
14
14
  * before it reaches the caller, so both renderers pass a bare `() => void`.
15
15
  */
16
- export type DialogVariant = 'default' | 'glass' | 'fullscreen' | 'drawer';
16
+ export type DialogVariant = 'default' | 'glass' | 'fullscreen' | 'drawer' | 'bottom-sheet';
17
17
  export type DialogSize = SizeValue;
18
18
  export type DialogBorderRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl';
19
19
  export type DialogActionsAlignment = 'left' | 'center' | 'right' | 'space-between';
@@ -21,6 +21,7 @@ export type DialogActionsAlignment = 'left' | 'center' | 'right' | 'space-betwee
21
21
  export interface DialogBaseProps {
22
22
  open: boolean;
23
23
  children: ReactNode;
24
+ /** `bottom-sheet` keeps the default paper and inset, aligned to the bottom. */
24
25
  variant?: DialogVariant;
25
26
  size?: DialogSize;
26
27
  title?: ReactNode;
@@ -117,6 +117,7 @@ function variantPaper(theme: UiTheme, a: DialogLookArgs, radius: number): ViewSt
117
117
  function overlayFor(theme: UiTheme, variant: DialogVariant): ViewStyle {
118
118
  if (variant === 'fullscreen') return { flex: 1 };
119
119
  if (variant === 'drawer') return { flex: 1, alignItems: 'flex-end' };
120
+ if (variant === 'bottom-sheet') return { ...centredOverlay(theme), justifyContent: 'flex-end' };
120
121
  return centredOverlay(theme);
121
122
  }
122
123
 
@@ -26,7 +26,7 @@ The Dialog component provides a powerful, flexible modal dialog system with mult
26
26
  |------|------|---------|-------------|
27
27
  | `open` | `boolean` | (required) | Controls dialog visibility |
28
28
  | `onClose` | `() => void` | `undefined` | Callback when dialog is closed |
29
- | `variant` | `'default' \| 'glass' \| 'fullscreen' \| 'drawer'` | `'default'` | Visual style variant of the dialog |
29
+ | `variant` | `'default' \| 'glass' \| 'fullscreen' \| 'drawer' \| 'bottom-sheet'` | `'default'` | Visual style variant of the dialog |
30
30
  | `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Dialog size (xs: 400px, sm: 600px, md: 800px, lg: 1000px, xl: 1200px) |
31
31
  | `title` | `ReactNode` | `undefined` | Dialog title content |
32
32
  | `description` | `string` | `undefined` | Dialog subtitle/description text |
@@ -584,3 +584,27 @@ slot behaviour, make it a direct child.
584
584
  - **Modal** - Lower-level modal component
585
585
  - **Popover** - Lightweight overlay for contextual content
586
586
  - **Sheet** - Bottom sheet component for mobile-first experiences
587
+
588
+ ## Bottom-anchored confirmation surface
589
+
590
+ `variant="bottom-sheet"` uses the default dialog paper at the bottom of the
591
+ viewport. Its height follows the content, its width remains capped by `size`,
592
+ and its margins and all four corners continue to use the theme. This is an
593
+ inset modal surface, not a draggable sheet; no swipe-to-dismiss is implied.
594
+ It retains the existing native Modal inset behavior; this variant does not add
595
+ a separate safe-area provider or change platform system-bar settings.
596
+
597
+ It shares the existing modal lifecycle, focus handling, backdrop/Escape or
598
+ native Back dismissal, `persistent`, title, content and action slots. Native
599
+ keyboard overlap lifts the bottom edge by the same amount as other inset
600
+ dialogs, keeping the body scrollable and action slot visible. Put vertically
601
+ stacked full-width actions in shared layout components inside `DialogContent`
602
+ or `DialogActions`; the variant does not reorder or resize caller actions.
603
+
604
+ ```tsx
605
+ <Dialog open={open} variant="bottom-sheet" size="xs" title="End session?"
606
+ showCloseButton={false} onClose={onClose}>
607
+ <DialogContent>Save the completed work before leaving.</DialogContent>
608
+ <DialogActions>{actions}</DialogActions>
609
+ </Dialog>
610
+ ```
@@ -185,6 +185,9 @@ export function variantStylesOf(theme: Theme, opts: VariantStyleOptions): SxProp
185
185
  default:
186
186
  return {
187
187
  ...baseStylesOf(theme, opts),
188
+ // An auto cross-axis margin consumes the space above the paper while
189
+ // preserving the same themed bottom/side inset and modal focus path.
190
+ ...(opts.variant === 'bottom-sheet' ? { marginTop: 'auto' } : {}),
188
191
  ...decorations,
189
192
  ...defaultVariantStyles(theme, opts),
190
193
  ...NO_FOCUS_OUTLINE,
@@ -13,8 +13,10 @@ pages and projects.
13
13
  ```
14
14
 
15
15
  - **Left cluster** — always shows **Select All**. Once `hasSelection` is true it
16
- adds **Clear All**, an "N items selected" count, and two optional slots:
17
- `selectionExtra` then `actions`.
16
+ adds **Clear All**, the selection count, and two optional slots:
17
+ `selectionExtra` then `actions`. The count's words come from the required
18
+ `selectedCountLabel(count)` ("1 selecionado", "3 selecionados"); the
19
+ package ships no default, and DataViews feeds it `copy.selection.selectedCount`.
18
20
  - **`selectionExtra` vs `actions`** — `actions` is what HAPPENS to the selection
19
21
  (delete, export, send). `selectionExtra` is what the selection IS: the
20
22
  "select all N matching the filter" widening a paginated list needs once its
@@ -48,6 +50,7 @@ import {
48
50
  <ContentToolbar
49
51
  hasSelection={selected.size > 0}
50
52
  selectedCount={selected.size}
53
+ selectedCountLabel={(n) => `${n} ${n === 1 ? 'selecionado' : 'selecionados'}`}
51
54
  selectAll={selectAll}
52
55
  clearSelection={clear}
53
56
  actions={<DeleteButton />}
@@ -27,6 +27,8 @@ type SelectionClusterProps = Pick<
27
27
  ContentToolbarProps,
28
28
  | 'hasSelection'
29
29
  | 'selectedCount'
30
+ | 'selectedCountLabel'
31
+ | 'allSelected'
30
32
  | 'selectAll'
31
33
  | 'clearSelection'
32
34
  | 'actions'
@@ -39,10 +41,42 @@ type SelectionClusterProps = Pick<
39
41
  | 'clearAllText'
40
42
  >;
41
43
 
44
+ /**
45
+ * The phone's select-all box. Checked only when everything is ticked and
46
+ * partial while some is, when the host says which (`allSelected`) — the same
47
+ * reading as the table's header checkbox. A partial box selects the rest, as
48
+ * the header does; a full one clears.
49
+ */
50
+ function SelectAllBox({
51
+ hasSelection,
52
+ allSelected,
53
+ selectAll,
54
+ clearSelection,
55
+ selectAllTestId,
56
+ selectAllLabel,
57
+ }: Pick<
58
+ ContentToolbarProps,
59
+ 'hasSelection' | 'allSelected' | 'selectAll' | 'clearSelection' | 'selectAllTestId' | 'selectAllLabel'
60
+ >): React.JSX.Element {
61
+ return (
62
+ <Checkbox
63
+ size="small"
64
+ checked={allSelected ?? hasSelection}
65
+ indeterminate={hasSelection && allSelected === false}
66
+ onChange={() => (hasSelection && allSelected !== false ? clearSelection() : selectAll())}
67
+ data-testid={`${selectAllTestId}-checkbox`}
68
+ inputProps={{ 'aria-label': selectAllLabel }}
69
+ sx={{ p: 0.5, display: { xs: 'inline-flex', md: 'none' } }}
70
+ />
71
+ );
72
+ }
73
+
42
74
  /** The left cluster: Select All + (when selecting) Clear All / count / actions. */
43
75
  function SelectionCluster({
44
76
  hasSelection,
77
+ allSelected,
45
78
  selectedCount,
79
+ selectedCountLabel,
46
80
  selectAll,
47
81
  clearSelection,
48
82
  actions,
@@ -95,17 +129,18 @@ function SelectionCluster({
95
129
  >
96
130
  {selectAllText}
97
131
  </Button>
98
- <Checkbox
99
- size="small"
100
- checked={hasSelection}
101
- onChange={(event) => (event.target.checked ? selectAll() : clearSelection())}
102
- data-testid={`${selectAllTestId}-checkbox`}
103
- inputProps={{ 'aria-label': selectAllLabel }}
104
- sx={{ p: 0.5, display: { xs: 'inline-flex', md: 'none' } }}
132
+ <SelectAllBox
133
+ hasSelection={hasSelection}
134
+ allSelected={allSelected}
135
+ selectAll={selectAll}
136
+ clearSelection={clearSelection}
137
+ selectAllTestId={selectAllTestId}
138
+ selectAllLabel={selectAllLabel}
105
139
  />
106
140
  {hasSelection ? (
107
141
  <SelectionState
108
142
  selectedCount={selectedCount}
143
+ selectedCountLabel={selectedCountLabel}
109
144
  clearSelection={clearSelection}
110
145
  clearAllTestId={clearAllTestId}
111
146
  clearAllText={clearAllText}
@@ -128,13 +163,14 @@ function SelectionCluster({
128
163
  */
129
164
  function SelectionState({
130
165
  selectedCount,
166
+ selectedCountLabel,
131
167
  clearSelection,
132
168
  clearAllTestId,
133
169
  clearAllText,
134
170
  selectionExtra,
135
171
  }: Pick<
136
172
  ContentToolbarProps,
137
- 'selectedCount' | 'clearSelection' | 'clearAllTestId' | 'clearAllText' | 'selectionExtra'
173
+ 'selectedCount' | 'selectedCountLabel' | 'clearSelection' | 'clearAllTestId' | 'clearAllText' | 'selectionExtra'
138
174
  >): React.JSX.Element {
139
175
  return (
140
176
  <>
@@ -154,7 +190,7 @@ function SelectionState({
154
190
  data-testid="selected-count-indicator"
155
191
  sx={{ fontSize: sxRem(14), color: 'text.secondary', whiteSpace: 'nowrap', flexShrink: 0 }}
156
192
  >
157
- {selectedCount} {selectedCount === 1 ? 'item' : 'items'} selected
193
+ {selectedCountLabel(selectedCount)}
158
194
  </Typography>
159
195
  {selectionExtra !== undefined && (
160
196
  <>
@@ -246,7 +282,7 @@ function BrowsingClusters({
246
282
  /**
247
283
  * Shared toolbar for content pages (Favorites, Personal Space, Recents, …). The
248
284
  * left cluster owns selection chrome — **Select All**, and once items are
249
- * selected, **Clear All** + an "N items selected" count + an optional `actions`
285
+ * selected, **Clear All** + the count (`selectedCountLabel`) + an optional `actions`
250
286
  * slot. The right cluster is a free `rightControls` slot for page-specific
251
287
  * controls (ViewSelector, SortByDropdown, MultiSelectDropdown, FilterTrigger).
252
288
  *
@@ -259,6 +295,7 @@ function BrowsingClusters({
259
295
  * <ContentToolbar
260
296
  * hasSelection={selected.size > 0}
261
297
  * selectedCount={selected.size}
298
+ * selectedCountLabel={(n) => `${n} ${n === 1 ? 'selecionado' : 'selecionados'}`}
262
299
  * selectAll={selectAll}
263
300
  * clearSelection={clear}
264
301
  * rightControls={
@@ -274,7 +311,9 @@ function BrowsingClusters({
274
311
  */
275
312
  export function ContentToolbar({
276
313
  hasSelection,
314
+ allSelected,
277
315
  selectedCount,
316
+ selectedCountLabel,
278
317
  selectAll,
279
318
  clearSelection,
280
319
  rightControls,
@@ -316,7 +355,9 @@ export function ContentToolbar({
316
355
  selectAllText={selectAllText}
317
356
  clearAllText={clearAllText}
318
357
  hasSelection={hasSelection}
358
+ allSelected={allSelected}
319
359
  selectedCount={selectedCount}
360
+ selectedCountLabel={selectedCountLabel}
320
361
  selectAll={selectAll}
321
362
  clearSelection={clearSelection}
322
363
  actions={actions}
@@ -17,6 +17,20 @@ export interface ContentToolbarProps {
17
17
  hasSelection: boolean;
18
18
  /** Number of currently selected items. */
19
19
  selectedCount: number;
20
+ /**
21
+ * The words for that count — "1 selecionado", "3 selecionados".
22
+ * A function because the noun agrees with the number. REQUIRED: this package
23
+ * ships no default copy, and the English it used to hardcode here was the one
24
+ * string on a pt-BR admin list a host could not replace (FUT-1443).
25
+ */
26
+ selectedCountLabel: (count: number) => string;
27
+ /**
28
+ * Whether EVERYTHING the select-all box covers is selected. When given, the
29
+ * box reads checked only then, and partial (indeterminate) while just some
30
+ * rows are — as the table's own header checkbox does. Omitted, it keeps
31
+ * reading checked for any selection.
32
+ */
33
+ allSelected?: boolean;
20
34
  /** Select every item on the page. */
21
35
  selectAll: () => void;
22
36
  /** Clear the current selection. */
@@ -230,6 +230,7 @@ export const EN_US_DATA_VIEWS_COPY: DataViewsCopy = {
230
230
  clearSelection: "Clear selection",
231
231
  selectAll: "Select all",
232
232
  onThisPage: (count) => `${count} on this page`,
233
+ selectedCount: (count) => `${count} ${count === 1 ? "item selected" : "items selected"}`,
233
234
  selectRow: "Select",
234
235
  expandRow: "Expand details",
235
236
  collapseRow: "Collapse details",
package/src/icons/Icon.md CHANGED
@@ -26,3 +26,7 @@ list in `src/icons/glyphs.json`. Adding a glyph is one line there and
26
26
  Inside the package, a ported component draws its own glyphs through this
27
27
  component rather than importing `@mui/icons-material` directly, so its native
28
28
  twin can draw the same one.
29
+
30
+ The shared glyph catalog includes `VolumeUp` and `VolumeOff` for sound controls,
31
+ using the same generated Material paths on web and native. Name the enclosing
32
+ control with its action; leave the icon decorative when that control owns the label.
@@ -43,6 +43,8 @@
43
43
  "Settings",
44
44
  "Visibility",
45
45
  "VisibilityOff",
46
+ "VolumeOff",
47
+ "VolumeUp",
46
48
  "Warning",
47
49
  "WarningAmber"
48
50
  ]
@@ -51,6 +51,8 @@ export const ICON_PATHS = {
51
51
  Settings: ["M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"],
52
52
  Visibility: ["M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"],
53
53
  VisibilityOff: ["M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7M2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2m4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3z"],
54
+ VolumeOff: ["M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63m2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71M4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9zM12 4 9.91 6.09 12 8.18z"],
55
+ VolumeUp: ["M3 9v6h4l5 5V4L7 9zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02M14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77"],
54
56
  Warning: ["M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z"],
55
57
  WarningAmber: ["M12 5.99 19.53 19H4.47zM12 2 1 21h22z","M13 16h-2v2h2zm0-6h-2v5h2z"],
56
58
  } as const;
@@ -222,6 +222,7 @@ export const PT_BR_DATA_VIEWS_COPY: DataViewsCopy = {
222
222
  clearSelection: "Limpar seleção",
223
223
  selectAll: "Selecionar tudo",
224
224
  onThisPage: (count) => `${count} nesta página`,
225
+ selectedCount: (count) => `${count} ${count === 1 ? "selecionado" : "selecionados"}`,
225
226
  selectRow: "Selecionar",
226
227
  expandRow: "Expandir detalhes",
227
228
  collapseRow: "Recolher detalhes",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/DataViews/data-views-grid-parts.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { TableFilter } from \"../../layout/TableFilter\";\nimport { Stack } from \"../../../mui/Stack\";\n\nimport {\n DataViewsLayoutProvider,\n useDataViewsLayout,\n type DataViewsLayout,\n} from \"./data-views-layout-context\";\nimport { FilterDialog, GridFilterPanel } from \"./data-views-filter-panel\";\nimport { GridMain } from \"./data-views-grid-bodies\";\nimport type { ListGroupConfig } from \"./list-card-rails\";\nimport { InlineFilterControls } from \"./data-views-inline-bar\";\nimport { toOverflowFields, useFilterOverflow, type OverflowSplit } from \"./data-views-overflow\";\nimport { GridHeaderRow } from \"./data-views-header-row\";\nimport { resolveSelectionExtra, type SelectionExtraRender } from \"./data-views-selection-extra\";\nimport { ShellToolbar } from \"./data-views-shell-toolbar\";\nimport type { DisplayPanelView } from \"./data-views-display-panel\";\nimport type { DataViewExport } from \"./data-views-export\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { DataViewsEmpty } from \"./data-views-empty\";\nimport { DataViewsPagination } from \"./data-views-pagination\";\nimport type { BoardConfig } from \"./DataViewsBoard\";\nimport { type ScopeConfig } from \"./data-views-scopes\";\nimport { ScopeTabsSlot } from \"./data-views-scope-tabs\";\nimport { togglePillValues } from \"./data-views-grid-helpers\";\nimport type {\n DataViewCardSelection,\n FilterFieldConfig,\n RangeFieldConfig,\n RangeValue,\n RowAction,\n} from \"./data-views-types\";\nimport type { DataViewRowDetail } from \"./data-views-row-detail\";\nimport type { DataViewsController } from \"./use-data-views-state\";\n\n/* ── Layout ⇄ view-state mirror ──────────────────────────────────────────── */\n\n/**\n * Mirrors the LIVE layout back into the view state, so saving a view captures\n * the layout the user is actually looking at.\n *\n * A component rather than a callback prop because only something INSIDE the\n * provider can read the layout, and only the controller can write the state.\n * The `stored !== layout` guard is what makes it idempotent: `c` is rebuilt on\n * every render, so an unguarded effect here would patch → re-render → patch.\n *\n * It re-fires when `stored` changes too, which is the case that matters after\n * applying a saved view: `appliedState` REPLACES the state, so a view saved\n * before layouts were captured clears `state.layout`, and the mirror puts the\n * current one back rather than leaving the next save with nothing to store.\n */\nfunction LayoutStateSync<T extends Record<string, unknown>>({\n c,\n}: {\n c: DataViewsController<T>;\n}): null {\n const { layout } = useDataViewsLayout();\n const stored = c.state.layout;\n useEffect(() => {\n if (stored !== layout) c.patch({ layout });\n // `c` is intentionally out of the deps — see the guard above.\n }, [layout, stored]);\n return null;\n}\n\n/* ── Shell (composes toolbar + body + panel) ─────────────────────────────── */\n\n/** The shared filter-surface props consumed by the inline bar, panel, and modal. */\ninterface FilterSurfaceProps<T extends Record<string, unknown>> {\n testIdPrefix: string;\n search: string;\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n onSearchChange: (value: string) => void;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onChangeRange: (fieldId: string, range: RangeValue) => void;\n onClearField: (fieldId: string) => void;\n onClearAll: () => void;\n}\n\n/**\n * Derives the responsive filter state (which surface to show at this width) and\n * the filter-mutation handlers from the controller — pulled out of `GridShell`\n * so the component body stays under the size/complexity budget.\n */\n/** Grouped rather than positional: the list had grown past readability. */\ninterface GridShellFiltersArgs<T extends Record<string, unknown>> {\n c: DataViewsController<T>;\n inlineFilters: boolean;\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n testIdPrefix: string;\n alwaysShowSearch: boolean;\n /** Is \"Exportar\" on the bar? Half the right cluster's cost when it is not. */\n hasExport: boolean;\n}\n\nfunction useGridShellFilters<T extends Record<string, unknown>>({\n c,\n inlineFilters,\n fields,\n rangeFields,\n testIdPrefix,\n alwaysShowSearch,\n hasExport,\n}: GridShellFiltersArgs<T>): {\n showInline: boolean;\n useModal: boolean;\n inlineVisible: boolean;\n filterProps: FilterSurfaceProps<T>;\n split: OverflowSplit<T>;\n onControlOpenChange: (open: boolean) => void;\n} {\n const { state } = c;\n // How many filter controls are open. A COUNT, not a flag: closing one popover\n // by opening another overlaps, and a boolean would unfreeze mid-handover.\n const [openControls, setOpenControls] = useState(0);\n // ONE measurement for the whole shell: the filter row decides which controls\n // it can keep, and the TOOLBAR needs the same answer to drop its labels.\n // Measuring twice would let the two disagree at the crossover width.\n const split = useFilterOverflow(\n toOverflowFields(fields, rangeFields),\n state.pills,\n c.ranges,\n openControls > 0,\n hasExport,\n );\n // THE BAR RENDERS AT EVERY WIDTH. It used to be swapped for a full-screen\n // filter MODAL below `lg`, which was the responsive strategy before the\n // measured ladder existed — and the two now do the same job, badly together:\n // the modal took the bar away at 1199px, and with it the very degradation\n // (labels off, search collapsed, filters into \"Mais\") that exists to make a\n // narrow bar work. So a 900px window got no bar and no ladder, and the\n // operator lost the search entirely rather than gaining a compact one.\n //\n // The ladder is measured, so it already covers every width the modal did.\n const showInline = inlineFilters;\n const useModal = false;\n const inlineVisible =\n showInline &&\n (alwaysShowSearch || fields.length > 0 || rangeFields.length > 0 || state.search !== \"\");\n const filterProps: FilterSurfaceProps<T> = {\n testIdPrefix,\n search: state.search,\n fields,\n rangeFields,\n pills: state.pills,\n ranges: c.ranges,\n onSearchChange: (value) => c.patch({ search: value }),\n // Updater, never the render's `state` — see {@link DataViewStatePatch}.\n onTogglePill: (fieldId, value, checked) =>\n c.patch(({ pills }) => ({ pills: { ...pills, [fieldId]: togglePillValues(pills[fieldId], value, checked) } })),\n onChangeRange: (fieldId, range) => c.patch({ ranges: { ...c.ranges, [fieldId]: range } }),\n onClearField: (fieldId) => c.patch({ pills: { ...state.pills, [fieldId]: [] } }),\n onClearAll: () => c.patch({ search: \"\", pills: {}, ranges: {} }),\n };\n return {\n showInline,\n useModal,\n inlineVisible,\n filterProps,\n split,\n onControlOpenChange: (open) =>\n setOpenControls((count) => Math.max(0, count + (open ? 1 : -1))),\n };\n}\n\ninterface GridShellProps<T extends Record<string, unknown>> {\n c: DataViewsController<T>;\n rows: T[];\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n getRowId: (row: T) => string | number;\n testIdPrefix: string;\n dataTestId?: string;\n emptyState?: React.ReactNode;\n toolbarRightSlot?: React.ReactNode;\n rowActions?: RowAction<T>[];\n bulkActions?: (selectedRows: T[], clearSelection: () => void) => React.ReactNode;\n /** A widening control beside the selection count — see `resolveSelectionExtra`. */\n selectionExtra?: SelectionExtraRender<T>;\n /** Opt-in \"Grade\" (cards) layout: renders each row as an entity-supplied card.\n * Omit ⇒ table only (no layout toggle). */\n renderCard?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /**\n * Opt-in \"Quadro\" (board) layout. Needs `renderCard` too — the board reuses\n * the entity's card, so a board config without one simply offers no board\n * rather than failing: that is a config gap, not a runtime error.\n */\n board?: BoardConfig<T>;\n /** Opt-in \"Lista\" layout: one full-width, entity-rendered row per record. */\n renderListRow?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /** The Lista's shared columns, so its rows line up by construction. */\n listGroup?: ListGroupConfig<T>;\n /** Opt-in expandable rows, drawn by the table layout only. */\n rowDetail?: DataViewRowDetail<T>;\n /** The page-level partition rendered as tabs under the toolbar. */\n scopes?: ScopeConfig[];\n /**\n * The row field the scopes partition by. Compared against the board's\n * `groupBy` so the two are not shown as the same partition twice.\n */\n scopeFieldId?: string;\n /** Per-sort-field value kind, so directions read in the column's own terms. */\n sortKinds?: Record<string, string>;\n /** The saved-view chrome bracketing the Exibir panel. */\n displayView?: DisplayPanelView;\n /** Injected export — the host re-queries; the grid never fetches. */\n exportConfig?: DataViewExport;\n /** Page title in the grid's own header row, above the scopes + toolbar. */\n title?: string;\n /** Primary page actions rendered at the header row's right. */\n headerActions?: React.ReactNode;\n /** Which layout to show first when the user has expressed no preference (default \"table\"). */\n defaultLayout?: DataViewsLayout;\n /** Pin to `defaultLayout`, ignoring the remembered preference (stories/docs). */\n ignoreStoredLayout?: boolean;\n /**\n * Opt into the responsive inline filter UX: a collapsible filter row below the\n * toolbar on wide screens and a modal on narrow ones. When false (default),\n * keep the classic slide-in filter panel opened by the \"Filtros\" button.\n */\n inlineFilters?: boolean;\n /**\n * Keep the inline search box on screen even with no filter fields and no\n * active search. Without it a grid whose only filter IS the search (`fields`\n * empty) can never OFFER one: the row renders only once a search exists, so\n * the operator would have to hand-edit the URL to start one. Default false —\n * every grid that ships filter fields already shows the row.\n */\n alwaysShowSearch?: boolean;\n}\n\n/** The scrollable content region: scope tabs, toolbar, filter bar, body, pager. */\nfunction ShellStack<T extends Record<string, unknown>>({\n props,\n filters,\n}: {\n props: GridShellProps<T>;\n filters: ReturnType<typeof useGridShellFilters<T>>;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { c, testIdPrefix, dataTestId, scopes = [], emptyState, inlineFilters = false } = props;\n const { showInline, useModal, inlineVisible, filterProps, split, onControlOpenChange } = filters;\n // The grid renders the FILTERED empty state itself — it is the only party\n // that knows a filter is applied. See {@link DataViewsEmpty}.\n const body = (\n <DataViewsEmpty\n filtered={c.activeFilterCount > 0 || c.state.search !== \"\"}\n onClearFilters={() => c.patch({ search: \"\", pills: {}, ranges: {} })}\n emptyState={emptyState}\n testIdPrefix={testIdPrefix}\n />\n );\n return (\n <TableFilter\n copy={copy.tableFilter} open={c.filterOpen} onOpenChange={c.setFilterOpen}\n hasActiveFilters={c.activeFilterCount > 0}\n >\n <Stack spacing={0} data-testid={dataTestId ? `${dataTestId}-container` : undefined}>\n <GridHeaderRow title={props.title} headerActions={props.headerActions} testIdPrefix={testIdPrefix} />\n <ShellToolbar\n c={c}\n rows={props.rows}\n sortKinds={props.sortKinds}\n displayView={props.displayView}\n exportConfig={props.exportConfig}\n filterControls={\n inlineVisible ? (\n <InlineFilterControls\n {...filterProps} split={split} activeFilterCount={c.activeFilterCount}\n onControlOpenChange={onControlOpenChange}\n />\n ) : undefined\n }\n barRef={split.barRef}\n testIdPrefix={testIdPrefix}\n rowActions={props.rowActions}\n bulkActions={props.bulkActions}\n selectionExtra={resolveSelectionExtra(props)}\n toolbarRightSlot={props.toolbarRightSlot}\n compactControls={showInline && split.compactControls}\n counterHidden={showInline && split.counterHidden}\n showInline={showInline}\n />\n <ScopeTabsSlot\n scopes={scopes} scopeFieldId={props.scopeFieldId} board={props.board}\n value={c.scope} onChange={c.setScope} counts={c.scopeCounts}\n testIdPrefix={testIdPrefix}\n />\n <TableFilter.Layout>\n <TableFilter.Main>\n <GridMain\n c={c}\n getRowId={props.getRowId}\n renderCard={props.renderCard}\n renderListRow={props.renderListRow}\n listGroup={props.listGroup}\n board={props.board}\n rowDetail={props.rowDetail}\n dataTestId={dataTestId}\n testIdPrefix={testIdPrefix}\n emptyState={body}\n />\n <DataViewsPagination c={c} testIdPrefix={testIdPrefix} />\n </TableFilter.Main>\n {inlineFilters ? null : <GridFilterPanel {...filterProps} />}\n </TableFilter.Layout>\n {useModal && <FilterDialog open={c.filterOpen} onClose={() => c.setFilterOpen(false)} {...filterProps} />}\n </Stack>\n </TableFilter>\n );\n}\n\nexport function GridShell<T extends Record<string, unknown>>(props: GridShellProps<T>): React.JSX.Element {\n const {\n c,\n fields,\n rangeFields,\n testIdPrefix,\n renderCard,\n renderListRow,\n board,\n defaultLayout,\n ignoreStoredLayout,\n inlineFilters = false,\n alwaysShowSearch = false,\n } = props;\n const filters = useGridShellFilters({\n c,\n inlineFilters,\n fields,\n rangeFields,\n testIdPrefix,\n alwaysShowSearch,\n hasExport: props.exportConfig !== undefined,\n });\n return (\n <DataViewsLayoutProvider\n canUseCards={Boolean(renderCard)}\n canUseList={Boolean(renderListRow)}\n // The board reuses the entity's card, so it needs BOTH — a `board` with no\n // `renderCard` offers no board rather than throwing.\n canUseBoard={Boolean(board && renderCard)}\n defaultLayout={defaultLayout}\n ignoreStoredLayout={ignoreStoredLayout}\n viewLayout={c.state.layout}\n >\n <LayoutStateSync c={c} />\n <ShellStack props={props} filters={filters} />\n </DataViewsLayoutProvider>\n );\n}\n"],"mappings":"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","names":["default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/DataViews/base-list-card-slots.tsx"],"sourcesContent":["\"use client\";\n\nimport { Fragment, type ReactNode } from \"react\";\n\nimport { DescriptionItem, type DescriptionItemProps } from \"../DescriptionItem\";\nimport { RAIL_GAP_PX } from \"./list-card-rails\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\nimport type { Theme } from \"@mui/material/styles/index.js\";\n\nimport { rem, sxRem } from \"../../../tokens/relative\";\n\n/**\n * WHAT SITS IN EACH RAIL.\n *\n * Split from `base-list-card` at the size gate: that module is the shell, the\n * rails and the states; this is the content of each column.\n */\n\n/** Below this the row drops its middle columns. */\nexport const META_BREAK = 520;\n/** …and below this it leaves the shared rails and goes two-line. */\nexport const STACK_BREAK = 360;\n\n/** Money and dates line up only if their digits are the same width. */\nconst TABULAR = { fontVariantNumeric: \"tabular-nums\" } as const;\n\nconst CLAMP = {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n} as const;\n\n/**\n * Title over subtitle — and, when the row navigates, the anchor that covers it.\n *\n * The link is a real `<a>` stretched by `::after` over the whole card rather\n * than a click handler on a `<div>`. That buys cmd-click, middle-click, \"copy\n * link address\", the status bar preview and correct tab order, and it stops the\n * buttons elsewhere in the row from being interactive elements nested inside a\n * clickable one.\n */\nexport function ListCardCaption({\n title,\n subtitle,\n href,\n target,\n testId,\n}: {\n title?: ReactNode;\n subtitle?: ReactNode;\n href?: string;\n target?: string;\n testId?: string;\n}): React.JSX.Element {\n return (\n <Box data-slot=\"caption\" sx={{ minWidth: 0 }}>\n {title != null && (\n <Text variant=\"heading\" size=\"sm\" weight=\"bold\" as=\"p\">\n <Box\n {...(href ? { component: \"a\", href, target } : { component: \"span\" })}\n data-testid={testId}\n sx={{\n display: \"block\",\n lineHeight: 1.2,\n fontSize: sxRem(14.4),\n color: \"inherit\",\n textDecoration: \"none\",\n ...CLAMP,\n ...(href\n ? {\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n // Under the checkbox, drag grip, actions and menu, which\n // all raise themselves to 1.\n zIndex: 0,\n },\n \"&:hover\": { textDecoration: \"underline\" },\n }\n : {}),\n }}\n >\n {title}\n </Box>\n </Text>\n )}\n {subtitle != null && (\n <Text variant=\"caption\" size=\"xs\" color=\"secondary\" as=\"p\">\n <Box component=\"span\" sx={{ display: \"block\", ...CLAMP }}>\n {subtitle}\n </Box>\n </Text>\n )}\n </Box>\n );\n}\n\n/** One rule between two columns. Shared, so every gap gets the same mark. */\nfunction MetaRule(): React.JSX.Element {\n return (\n <Box\n aria-hidden\n sx={{\n flex: \"0 0 auto\",\n color: \"text.disabled\",\n opacity: 0.5,\n userSelect: \"none\",\n fontSize: sxRem(14),\n // A cancelled row strikes the whole meta cluster, and a struck `|` is a\n // dagger. The rule is punctuation, not data — nothing to void.\n textDecoration: \"none\",\n }}\n >\n |\n </Box>\n );\n}\n\n/**\n * The middle columns: stacked label-over-value pairs, separated by a rule.\n *\n * Stacked rather than side by side because `DATA 05/08/2026` inline spends the\n * horizontal room the value rail needs, and the separator is what stops two\n * adjacent pairs reading as one four-word phrase.\n *\n * EVEN GAPS, NOT EVEN BOXES. The rail takes a share of the row's spare width\n * per pair (see `metaRail`), and the obvious way to spend it — give every pair\n * an equal-width box and centre its content — puts the separator on the BOX\n * boundary, which is only the visual midpoint when both pairs are the same\n * width. They never are: `05/08/2026, 13:45` reaches almost to the edge of its\n * box while `PIX` stops well short of its own, so the rule ends up crowded\n * against the date and adrift from the method.\n *\n * So the pairs are sized to their content and the SPARE space is what gets\n * divided evenly. `space-evenly` gives every gap — including the two either\n * side of each separator — the same width, which puts each rule exactly halfway\n * between the two labels it separates, whatever they happen to say.\n */\nexport function ListCardMeta({\n meta,\n metaSlot,\n trailingRule,\n}: {\n meta?: DescriptionItemProps[];\n metaSlot?: ReactNode;\n /** Close the run with a rule, dividing the last pair from the value. */\n trailingRule?: boolean;\n}): React.JSX.Element {\n const items = meta ?? [];\n return (\n <Box\n data-slot=\"meta\"\n sx={(theme) => ({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-evenly\",\n // A FLOOR, not the spacing itself: `space-evenly` supplies the rest, and\n // this is only what keeps a rail with no room to spare from running the\n // date straight into the rule.\n gap: 1,\n whiteSpace: \"nowrap\",\n ...TABULAR,\n // Rung 1 of the ladder.\n [`@container (max-width: ${rem(theme, META_BREAK)})`]: { display: \"none\" },\n })}\n >\n {items.map((item, index) => (\n <Fragment key={`${item.label}-${index}`}>\n {/* ITS OWN ITEM, not the first child of the pair that follows it.\n Nested inside, the rule travelled with that pair's centred content\n and came to rest nearer one label than the other — a separator\n visibly closer to MÉTODO than to DATA reads as belonging to it. */}\n {index > 0 && <MetaRule />}\n {/* Centred: a stacked pair sitting in its own column reads as one\n unit only when the label is over the value rather than flush left\n of a value shorter than it — `MÉTODO` above `PIX` was visibly\n unhinged from it. Overridable per item. */}\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 0,\n // Sized to the pair, so the gaps either side of it are free space\n // that `space-evenly` can equalise.\n flex: \"0 0 auto\",\n }}\n >\n <DescriptionItem orientation=\"vertical\" align=\"center\" {...item} />\n </Box>\n </Fragment>\n ))}\n {metaSlot}\n {trailingRule && items.length > 0 && <MetaRule />}\n </Box>\n );\n}\n\n/**\n * The value sits flush against the meta rail, with no gap of its own.\n *\n * Its divider is now the LAST ITEM OF THE META CLUSTER, placed by the same\n * `space-evenly` that places the rules between the pairs — so it is equidistant\n * from `PIX` and from `R$ 13,90` for free, which a rule centred in the rail gap\n * could never be: the cluster's content stops well short of the rail's right\n * edge, leaving that rule 150px from the method and 12px from the money.\n *\n * Cancelling this one gap is what makes the two distances equal. Below\n * `META_BREAK` the cluster (and its rule) are gone, so the gap comes back —\n * otherwise the value would sit straight against the title.\n */\nconst valueFlush = (theme: Theme) => ({\n marginLeft: rem(theme, -RAIL_GAP_PX),\n [`@container (max-width: ${rem(theme, META_BREAK)})`]: { marginLeft: 0 },\n});\n\n/** The value, on its own rail, never truncated and never shunted by the chip. */\nfunction ListCardValue({ value }: { value: ReactNode }): React.JSX.Element {\n return (\n <Text variant=\"body\" size=\"sm\" weight=\"medium\" as=\"span\">\n <Box\n component=\"span\"\n sx={{ fontSize: sxRem(14), whiteSpace: \"nowrap\", ...TABULAR }}\n >\n {value}\n </Box>\n </Text>\n );\n}\n\n/**\n * The actions and the menu, at the end of the row.\n *\n * Actions are revealed on hover and `:focus-within` — always-visible buttons on\n * every row of fifty is a lot of chrome for something used on one of them.\n * `:focus-within` is what keeps them reachable by keyboard, and `visibility`\n * rather than `display` keeps their space reserved so nothing shifts.\n */\nexport function ListCardActions({\n actions,\n alwaysVisible,\n menu,\n testId,\n}: {\n actions?: ReactNode;\n alwaysVisible?: boolean;\n menu?: ReactNode;\n testId: (slot: string) => string | undefined;\n}): React.JSX.Element | null {\n if (actions == null && menu == null) return null;\n return (\n // z-index 1: above the stretched link, so these stay clickable.\n <Box\n data-slot=\"actions\"\n sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5, position: \"relative\", zIndex: 1 }}\n >\n {actions && (\n <Box\n data-testid={testId(\"actions\")}\n onClick={(event) => event.stopPropagation()}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.5,\n ...(alwaysVisible\n ? {}\n : {\n visibility: \"hidden\",\n \".MuiPaper-root:hover &, .MuiPaper-root:focus-within &\": {\n visibility: \"visible\",\n },\n }),\n }}\n >\n {actions}\n </Box>\n )}\n {menu && (\n <Box data-testid={testId(\"menu\")} onClick={(event) => event.stopPropagation()}>\n {menu}\n </Box>\n )}\n </Box>\n );\n}\n\n/** Value and actions — separate rails, not one flex run. */\nexport function ListCardTail({\n value,\n separated,\n actions,\n actionsAlwaysVisible,\n menu,\n testId,\n}: {\n value?: ReactNode;\n /** Whether a meta cluster precedes the value and wants dividing from it. */\n separated?: boolean;\n actions?: ReactNode;\n actionsAlwaysVisible?: boolean;\n menu?: ReactNode;\n testId: (slot: string) => string | undefined;\n}): React.JSX.Element {\n return (\n <>\n <Box\n data-slot=\"value\"\n sx={(theme) => ({\n textAlign: \"right\",\n ...(separated && value != null ? valueFlush(theme) : {}),\n })}\n data-testid={testId(\"value\")}\n >\n {value != null && <ListCardValue value={value} />}\n </Box>\n <ListCardActions\n actions={actions}\n alwaysVisible={actionsAlwaysVisible}\n menu={menu}\n testId={testId}\n />\n </>\n );\n}\n"],"mappings":"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","names":["Fragment","default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/DataViews/data-views-shell-toolbar.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The toolbar band, fed from the controller — ~25 props of pure forwarding and\n * nothing else, which is why it lives in its own file rather than in the shell.\n */\nimport { type ColumnVisibilityOption } from \"../../layout/ContentToolbar\";\n\nimport type { DisplayPanelView } from \"./data-views-display-panel\";\nimport type { DataViewExport } from \"./data-views-export\";\nimport { GridToolbar } from \"./data-views-toolbar\";\nimport type { RowAction } from \"./data-views-types\";\nimport type { DataViewsController } from \"./use-data-views-state\";\n\n/**\n * The toolbar band, fed from the controller. Split out of `GridShell` for that\n * function's size budget — it is ~25 props of pure forwarding and nothing else.\n */\nexport function ShellToolbar<T extends Record<string, unknown>>({\n c,\n rows,\n testIdPrefix,\n rowActions,\n bulkActions,\n selectionExtra,\n toolbarRightSlot,\n showInline,\n compactControls,\n counterHidden,\n sortKinds,\n displayView,\n exportConfig,\n filterControls,\n barRef,\n}: {\n c: DataViewsController<T>;\n rows: T[];\n testIdPrefix: string;\n sortKinds?: Record<string, string>;\n displayView?: DisplayPanelView;\n exportConfig?: DataViewExport;\n rowActions?: RowAction<T>[];\n bulkActions?: (selectedRows: T[], clearSelection: () => void) => React.ReactNode;\n /** Already resolved by the shell, which is the party that knows the page. */\n selectionExtra?: React.ReactNode;\n toolbarRightSlot?: React.ReactNode;\n /** Search + filters, rendered on the toolbar line (see `GridToolbar`). */\n filterControls?: React.ReactNode;\n barRef?: React.Ref<HTMLDivElement>;\n showInline: boolean;\n /** Step 2 of the ladder: Exibir/Exportar as icons only. */\n compactControls?: boolean;\n /** Step 5, last resort: drop the counter so the row still fits one line. */\n counterHidden?: boolean;\n}): React.JSX.Element {\n const columnOptions: ColumnVisibilityOption[] = c.hideableColumns.map((col) => ({\n id: col.id,\n label: col.label,\n visible: c.state.visibleColumns.includes(col.id),\n }));\n return (\n <GridToolbar\n c={c}\n sortKinds={sortKinds}\n displayView={displayView}\n exportConfig={exportConfig}\n filterControls={filterControls}\n barRef={barRef}\n compactControls={compactControls}\n counterHidden={counterHidden}\n testIdPrefix={testIdPrefix}\n selectedRows={c.selectedRows}\n selectAll={c.selectAll}\n clearSelection={c.clearSelection}\n rowActions={rowActions}\n bulkActions={bulkActions}\n selectionExtra={selectionExtra}\n sortFields={c.resolvedSortFields}\n activeSortField={c.activeSortField}\n activeSortOrder={c.activeSortOrder}\n onChangeSort={(field, order) => c.patch({ sortBy: [{ id: field, dir: order }] })}\n matchedCount={c.matched.length}\n totalCount={c.serverMode ? c.serverTotalCount : rows.length}\n toolbarRightSlot={toolbarRightSlot}\n columnOptions={columnOptions}\n onToggleColumn={c.toggleColumn}\n filterOpen={c.filterOpen}\n setFilterOpen={c.setFilterOpen}\n activeFilterCount={c.activeFilterCount}\n showFilterTrigger={!showInline}\n />\n );\n}\n\n/** Wires the controller into the shared toolbar + filter panel + grid/cards body. */\n"],"mappings":";;;;;AA6DI;AA3CG,SAAS,aAAgD;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAoBsB;AACpB,QAAM,gBAA0C,EAAE,gBAAgB,IAAI,CAAC,SAAS;AAAA,IAC9E,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,IACX,SAAS,EAAE,MAAM,eAAe,SAAS,IAAI,EAAE;AAAA,EACjD,EAAE;AACF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,EAAE;AAAA,MAChB,WAAW,EAAE;AAAA,MACb,gBAAgB,EAAE;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,EAAE;AAAA,MACd,iBAAiB,EAAE;AAAA,MACnB,iBAAiB,EAAE;AAAA,MACnB,cAAc,CAAC,OAAO,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,MAC/E,cAAc,EAAE,QAAQ;AAAA,MACxB,YAAY,EAAE,aAAa,EAAE,mBAAmB,KAAK;AAAA,MACrD;AAAA,MACA;AAAA,MACA,gBAAgB,EAAE;AAAA,MAClB,YAAY,EAAE;AAAA,MACd,eAAe,EAAE;AAAA,MACjB,mBAAmB,EAAE;AAAA,MACrB,mBAAmB,CAAC;AAAA;AAAA,EACtB;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/DataViews/DataViewsTableBase.tsx"],"sourcesContent":["\"use client\";\n\nimport type { SortFieldDefinition } from \"../../layout/ContentToolbar\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { DataViewsGrid } from \"./DataViewsGrid\";\nimport type { SelectionExtraRender } from \"./data-views-selection-extra\";\nimport type { ListGroupConfig } from \"./list-card-rails\";\nimport type { DisplayPanelView } from \"./data-views-display-panel\";\nimport { viewStateKey } from \"./data-views-dirty\";\nimport { DeleteViewDialog } from \"./DeleteViewDialog\";\nimport type { BoardConfig } from \"./DataViewsBoard\";\nimport type { DataViewExport } from \"./data-views-export\";\nimport type { ScopeConfig } from \"./data-views-scopes\";\nimport type { DataViewRowDetail } from \"./data-views-row-detail\";\nimport { ViewDialogs, ViewMutationErrorAlert } from \"./data-views-table-parts\";\nimport {\n useSavedViewsController,\n type SavedViewsController,\n} from \"./use-saved-views-controller\";\nimport {\n type DataViewColumn,\n type DataViewsLayout,\n type DataViewServer,\n type DataViewState,\n type DataViewSyncState,\n type DataViewPersistence,\n type DataViewRouter,\n type FilterFieldConfig,\n type RangeFieldConfig,\n type DataViewCardSelection,\n type RowAction,\n type SavedViewSummary,\n} from \"./data-views-types\";\n\nexport interface DataViewsTableBaseProps<T extends Record<string, unknown>> {\n /** The applied-view id read from the URL (`?view=`) on load, or null. */\n initialViewId?: string | null;\n /** Injected saved-view persistence (create/update/delete). */\n persistence: DataViewPersistence;\n /** Injected router side-effects (URL sync + refresh). */\n router: DataViewRouter;\n rows: T[];\n columns: DataViewColumn<T>[];\n fields: FilterFieldConfig<T>[];\n /** Optional numeric min/max range filters (advanced \"filter by amount\"). */\n rangeFields?: RangeFieldConfig<T>[];\n getRowId: (row: T) => string | number;\n onRowClick?: (row: T) => void;\n emptyState?: React.ReactNode;\n dataTestId?: string;\n testIdPrefix?: string;\n /** The user's + shared views for this table (from the server). */\n views: SavedViewSummary[];\n /** Big page title in the table header, beside the funnel + gear (GTA layout). */\n title?: string;\n /** Primary page actions (e.g. \"Novo produto\") rendered at the header's right. */\n headerActions?: React.ReactNode;\n /** Sort options for the toolbar's \"Sort By\" dropdown (defaults to sortable columns). */\n sortFields?: SortFieldDefinition[];\n /**\n * Per-sort-field VALUE KIND (`\"currency\" | \"number\" | \"date\" | \"text\"`), so the\n * Exibir panel phrases the direction in that column's own terms. \"Crescente\"\n * on a currency column is a puzzle; \"Menor → maior\" is not. Defaults to text.\n */\n sortKinds?: Record<string, string>;\n /**\n * Opt-in \"Exportar\" control. The grid hands the host the current query,\n * UNPAGINATED, and the host re-queries — the grid never fetches, and an\n * export therefore follows the filters rather than the loaded page.\n */\n exportConfig?: DataViewExport;\n /** Notified with the currently-visible (filtered) rows, so Export matches the view. */\n onVisibleRowsChange?: (rows: T[]) => void;\n /** Reusable row actions driving both the row \"⋮\" kebab and the bulk menu. */\n rowActions?: RowAction<T>[];\n /** Leading control in the auto kebab column (e.g. a favourite star). */\n rowActionsLeading?: (row: T) => React.ReactNode;\n /** Low-level bulk-action override; prefer `rowActions`. */\n bulkActions?: (selectedRows: T[], clearSelection: () => void) => React.ReactNode;\n /** A selection-widening control beside the count (e.g. \"select all matching\"). */\n selectionExtra?: SelectionExtraRender<T>;\n /** Bespoke per-row menu (an entity's self-contained 3-dots menu) instead of the auto kebab. */\n renderRowMenu?: (row: T) => React.ReactNode;\n /** Opt-in expandable rows (table layout only) — see {@link DataViewRowDetail}. */\n rowDetail?: DataViewRowDetail<T>;\n /** Opt-in \"Grade\" (cards) layout — a card renderer per row; adds a Grade/Tabela toggle. */\n renderCard?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /** Opt-in \"Quadro\" (board) layout — the loaded page as columns of one field. Needs `renderCard`. */\n board?: BoardConfig<T>;\n /** Opt-in \"Lista\" layout — one full-width, entity-rendered row per record (FUT-733). */\n renderListRow?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /** The Lista's shared columns, so its rows line up by construction not convention. */\n listGroup?: ListGroupConfig<T>;\n /** The page-level partition rendered as tabs under the toolbar (server mode only). */\n scopes?: ScopeConfig[];\n /** The row field the scopes partition by — used only to reject a pill over the same field. */\n scopeFieldId?: string;\n /** Which layout to show first when the user has expressed no preference (default \"table\"). */\n defaultLayout?: DataViewsLayout;\n /**\n * Ignore the remembered cross-screen layout preference and pin to\n * `defaultLayout`. For tables that exist to SHOW a layout — stories, docs,\n * screenshots — not for real screens.\n */\n ignoreStoredLayout?: boolean;\n /** Opt into the responsive inline filter UX (collapsible row / modal). Default keeps the panel. */\n inlineFilters?: boolean;\n /** Keep the inline search visible with no filter fields and no active search. */\n alwaysShowSearch?: boolean;\n /** Server-mode wiring (FUT-180): backend-driven rows/total + re-fetch. Omit for client mode. */\n server?: DataViewServer;\n /** Seed the initial view state (search/pills/ranges/sort) from the URL when no saved view applies. */\n initialState?: DataViewState;\n}\n\n/**\n * Derive the grid's reactive `syncState` from the URL-seeded `initialState` in\n * server mode so browser back/forward RE-APPLIES the search/pills/sort controls\n * (merging over live state, preserving hidden columns — see {@link DataViewSyncState}).\n * Client-mode tables (no `server`) get `undefined`. Callers memoize `initialState`\n * on the URL, so this reference only changes on genuine navigations.\n */\nfunction useUrlSyncState(\n server: DataViewServer | undefined,\n initialState: DataViewState | undefined,\n): DataViewSyncState | undefined {\n const isServerMode = server !== undefined;\n return useMemo<DataViewSyncState | undefined>(\n () =>\n isServerMode && initialState\n ? {\n search: initialState.search,\n pills: initialState.pills,\n ranges: initialState.ranges,\n sortBy: initialState.sortBy,\n // The scope belongs in the URL-driven slice alongside them: a\n // `?view=recusados`-style deep link and browser back/forward must\n // move the tab strip, and they must do it WITHOUT resetting the\n // user's hidden columns — which is the whole reason this is a\n // merging `syncState` and not a replacing `appliedState`.\n scope: initialState.scope,\n }\n : undefined,\n [isServerMode, initialState],\n );\n}\n\n/**\n * Resolve the initial applied view: a `?view=<id>` shortcut (FUT-90) wins, else\n * the user's default view, else none. Drives the seed state + trigger label.\n */\nfunction resolveInitialView(\n views: SavedViewSummary[],\n requestedId: string | null,\n): SavedViewSummary | undefined {\n const requested = requestedId ? views.find((view) => view.id === requestedId) : undefined;\n return requested ?? views.find((view) => view.isDefault);\n}\n\n/**\n * The Exibir panel's view chrome, assembled from the saved-views controller.\n * Extracted so {@link DataViewsTableBase} stays inside its size budget.\n */\nfunction buildDisplayView({\n ctl,\n views,\n activeView,\n dirty,\n onRequestDelete,\n}: {\n ctl: SavedViewsController;\n views: SavedViewSummary[];\n activeView: SavedViewSummary | undefined;\n dirty: boolean;\n /** Opens the confirmation; the delete itself happens on confirm. */\n onRequestDelete: (view: SavedViewSummary) => void;\n}): DisplayPanelView {\n return {\n activeViewName: ctl.activeViewName,\n dirty,\n onReset: () => (activeView ? ctl.applyView(activeView) : ctl.selectMain()),\n // Only offer \"Atualizar\" when there IS a view to update — otherwise the\n // single footer button is a plain \"Salvar visão\".\n onUpdate: activeView ? () => ctl.openEdit(activeView) : undefined,\n onSaveAs: ctl.openCreate,\n // The views themselves, not a dropdown: the panel renders them in its own\n // body (see `data-views-view-nav`), so there is no second popover to clip\n // the row actions.\n nav: {\n views,\n activeViewId: activeView?.id ?? null,\n onSelectView: (id) => {\n const next = id === null ? null : views.find((view) => view.id === id);\n if (next) ctl.applyView(next);\n else ctl.selectMain();\n },\n onEditView: ctl.openEdit,\n onPatchView: (view, changes) => void ctl.patchView(view, changes),\n onDeleteView: onRequestDelete,\n },\n };\n}\n\n/**\n * \"Are there unsaved changes?\" — the dot on Exibir, and whether Redefinir and\n * Salvar visão are live.\n *\n * Two things it gets right that the inline version did not. It compares\n * NORMALISED states (`viewStateKey`), so a filter applied and then removed is\n * clean again rather than clean-looking but flagged; and it re-baselines after\n * a SAVE, because the state just written is the clean one from that point.\n *\n * The baseline is the first state the grid emits for a view, not the view\n * itself: the grid normalises what it is handed — resolving visible columns,\n * filling in layout — so the applied view is never byte-identical to the state\n * it produces.\n */\nfunction useDirtyTracking(ctl: SavedViewsController): {\n dirty: boolean;\n noteState: (state: DataViewState) => void;\n markSaved: () => void;\n} {\n const [dirty, setDirty] = useState(false);\n const [savedAt, setSavedAt] = useState(0);\n const baseline = useRef<string | null>(null);\n const appliedKey = JSON.stringify(ctl.applied ?? null);\n\n useEffect(() => {\n baseline.current = null;\n setDirty(false);\n }, [appliedKey, savedAt]);\n\n return {\n dirty,\n noteState: (state) => {\n ctl.currentRef.current = state;\n const key = viewStateKey(state);\n if (baseline.current === null) {\n baseline.current = key;\n setDirty(false);\n return;\n }\n const next = key !== baseline.current;\n setDirty((prev) => (prev === next ? prev : next));\n },\n markSaved: () => setSavedAt((tick) => tick + 1),\n };\n}\n\n/**\n * The reusable admin table (FUT-89): the DataViews grid plus the full saved-views\n * experience — a views dropdown, a save/edit modal (with preview), and a manage\n * dialog. Framework-agnostic: saved-view persistence and router side-effects are\n * INJECTED (`persistence`, `router`, `initialViewId`) so the host app wires them\n * to its backend + framework router. A default view auto-applies on load; applying\n * a view restores its filters + columns + sort. Each table supplies its own columns\n * + filter fields; everything else is shared.\n */\nexport function DataViewsTableBase<T extends Record<string, unknown>>(\n props: DataViewsTableBaseProps<T>,\n): React.JSX.Element {\n // Forwarded as a whole rather than restated name-by-name twice (as in\n // DataViewsGrid): this component only ADDS the saved-views chrome, and a\n // 30-name destructure repeated in the JSX is exactly where a newly added prop\n // silently stops being passed on.\n const {\n initialViewId = null,\n persistence,\n router,\n columns,\n fields,\n testIdPrefix = \"table\",\n views,\n server,\n initialState,\n } = props;\n const initialView = resolveInitialView(views, initialViewId);\n const columnIds = columns.map((col) => col.id);\n const ctl = useSavedViewsController(persistence, router, columnIds, views, initialView, initialState);\n // Unsaved-changes flag for the Exibir panel. Set from `onStateChange` rather\n // than derived in render because the live state lives in a REF (the grid owns\n // it); the equality bail-out in `setDirty` is what stops the update loop.\n const { dirty, noteState, markSaved } = useDirtyTracking(ctl);\n // Deleting a saved view is confirmed, not immediate — see `DeleteViewDialog`.\n const [pendingDelete, setPendingDelete] = useState<SavedViewSummary | null>(null);\n // The view the panel's \"Redefinir\" restores: the applied one, or the built-in\n // \"Visão principal\" when none is.\n const activeView = views.find((view) => view.name === ctl.activeViewName);\n const displayView = buildDisplayView({\n ctl,\n views,\n activeView,\n dirty,\n onRequestDelete: setPendingDelete,\n });\n // Server-mode lists re-apply URL-derived controls on back/forward (not just the mount seed).\n const syncState = useUrlSyncState(server, initialState);\n\n return (\n <>\n <ViewMutationErrorAlert error={ctl.mutationError} onClose={ctl.clearMutationError} testIdPrefix={testIdPrefix} />\n <DataViewsGrid<T>\n {...props}\n testIdPrefix={testIdPrefix}\n appliedState={ctl.applied}\n syncState={syncState}\n onStateChange={noteState}\n // The saved-views menu is NOT a toolbar control any more: it lives in\n // the Exibir panel's VISÃO header, passed through `displayView`.\n displayView={displayView}\n />\n {renderViewDialogs(ctl, fields, columns, views, testIdPrefix, markSaved)}\n <DeleteViewDialog\n view={pendingDelete}\n onClose={() => setPendingDelete(null)}\n onConfirm={(view) => {\n void ctl.handleDelete(view);\n setPendingDelete(null);\n }}\n testIdPrefix={testIdPrefix}\n />\n </>\n );\n}\n\n/** The save + manage saved-view dialogs, split out to keep the base thin. */\nfunction renderViewDialogs<T extends Record<string, unknown>>(\n ctl: SavedViewsController,\n fields: DataViewsTableBaseProps<T>[\"fields\"],\n columns: DataViewsTableBaseProps<T>[\"columns\"],\n views: SavedViewSummary[],\n testIdPrefix: string,\n onSaved: () => void,\n): React.JSX.Element {\n return (\n <ViewDialogs<T>\n saveOpen={ctl.saveOpen}\n onCloseSave={ctl.closeSave}\n currentState={ctl.editing ? ctl.editing.state : ctl.currentRef.current}\n fields={fields}\n columns={columns}\n editing={ctl.editing}\n onSave={async (payload) => {\n await ctl.handleSave(payload);\n // The saved state is the clean one from here on.\n onSaved();\n }}\n manageOpen={ctl.manageOpen}\n onCloseManage={() => ctl.setManageOpen(false)}\n views={views}\n onEditFromManage={ctl.editFromManage}\n onDelete={(view) => void ctl.handleDelete(view)}\n testIdPrefix={testIdPrefix}\n />\n );\n}\n"],"mappings":"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","names":[]}