@12-apps/ui 6.11.0 → 6.11.1

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 (2502) hide show
  1. package/dist/_internal/button/button.js +9 -0
  2. package/dist/_internal/button/button.js.map +1 -0
  3. package/dist/_internal/components/data-display/Alert/Alert.js +9 -0
  4. package/dist/_internal/components/data-display/Alert/Alert.js.map +1 -0
  5. package/dist/_internal/components/data-display/Alert/Alert.styles.js +24 -0
  6. package/dist/_internal/components/data-display/Alert/Alert.styles.js.map +1 -0
  7. package/dist/_internal/components/data-display/Alert/Alert.types.js +1 -0
  8. package/dist/_internal/components/data-display/Alert/Alert.types.js.map +1 -0
  9. package/dist/_internal/components/data-display/AlertDialog/AlertDialog.js +8 -0
  10. package/dist/_internal/components/data-display/AlertDialog/AlertDialog.js.map +1 -0
  11. package/dist/_internal/components/data-display/AlertDialog/AlertDialog.types.js +1 -0
  12. package/dist/_internal/components/data-display/AlertDialog/AlertDialog.types.js.map +1 -0
  13. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +17 -0
  14. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js.map +1 -0
  15. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.types.js +1 -0
  16. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.types.js.map +1 -0
  17. package/dist/_internal/components/data-display/Avatar/Avatar.js +11 -0
  18. package/dist/_internal/components/data-display/Avatar/Avatar.js.map +1 -0
  19. package/dist/_internal/components/data-display/Avatar/Avatar.types.js +1 -0
  20. package/dist/_internal/components/data-display/Avatar/Avatar.types.js.map +1 -0
  21. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +8 -0
  22. package/dist/_internal/components/data-display/Avatar/Avatar.view.js.map +1 -0
  23. package/dist/_internal/components/data-display/Badge/Badge.animations.js +16 -0
  24. package/dist/_internal/components/data-display/Badge/Badge.animations.js.map +1 -0
  25. package/dist/_internal/components/data-display/Badge/Badge.helpers.js +14 -0
  26. package/dist/_internal/components/data-display/Badge/Badge.helpers.js.map +1 -0
  27. package/dist/_internal/components/data-display/Badge/Badge.js +13 -0
  28. package/dist/_internal/components/data-display/Badge/Badge.js.map +1 -0
  29. package/dist/_internal/components/data-display/Badge/Badge.styles.js +14 -0
  30. package/dist/_internal/components/data-display/Badge/Badge.styles.js.map +1 -0
  31. package/dist/_internal/components/data-display/Badge/Badge.types.js +1 -0
  32. package/dist/_internal/components/data-display/Badge/Badge.types.js.map +1 -0
  33. package/dist/_internal/components/data-display/Badge/Badge.variants.js +8 -0
  34. package/dist/_internal/components/data-display/Badge/Badge.variants.js.map +1 -0
  35. package/dist/_internal/components/data-display/Badge/BadgeContent.js +11 -0
  36. package/dist/_internal/components/data-display/Badge/BadgeContent.js.map +1 -0
  37. package/dist/_internal/components/data-display/Banner/Banner.js +9 -0
  38. package/dist/_internal/components/data-display/Banner/Banner.js.map +1 -0
  39. package/dist/_internal/components/data-display/Banner/Banner.styles.js +12 -0
  40. package/dist/_internal/components/data-display/Banner/Banner.styles.js.map +1 -0
  41. package/dist/_internal/components/data-display/Banner/Banner.types.js +1 -0
  42. package/dist/_internal/components/data-display/Banner/Banner.types.js.map +1 -0
  43. package/dist/_internal/components/data-display/CardKit/CardKebab.js +15 -0
  44. package/dist/_internal/components/data-display/CardKit/CardKebab.js.map +1 -0
  45. package/dist/_internal/components/data-display/CardKit/CardKit.types.js +1 -0
  46. package/dist/_internal/components/data-display/CardKit/CardKit.types.js.map +1 -0
  47. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +14 -0
  48. package/dist/_internal/components/data-display/CardKit/card-actions-context.js.map +1 -0
  49. package/dist/_internal/components/data-display/CardKit/list-card-parts.js +18 -0
  50. package/dist/_internal/components/data-display/CardKit/list-card-parts.js.map +1 -0
  51. package/dist/_internal/components/data-display/CardKit/row-actions-to-menu.js +8 -0
  52. package/dist/_internal/components/data-display/CardKit/row-actions-to-menu.js.map +1 -0
  53. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +25 -0
  54. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js.map +1 -0
  55. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +21 -0
  56. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js.map +1 -0
  57. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +11 -0
  58. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js.map +1 -0
  59. package/dist/_internal/components/data-display/Carousel/Carousel.hooks.js +8 -0
  60. package/dist/_internal/components/data-display/Carousel/Carousel.hooks.js.map +1 -0
  61. package/dist/_internal/components/data-display/Carousel/Carousel.js +22 -0
  62. package/dist/_internal/components/data-display/Carousel/Carousel.js.map +1 -0
  63. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +14 -0
  64. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js.map +1 -0
  65. package/dist/_internal/components/data-display/Carousel/Carousel.slide.js +10 -0
  66. package/dist/_internal/components/data-display/Carousel/Carousel.slide.js.map +1 -0
  67. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +9 -0
  68. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js.map +1 -0
  69. package/dist/_internal/components/data-display/Carousel/Carousel.types.js +1 -0
  70. package/dist/_internal/components/data-display/Carousel/Carousel.types.js.map +1 -0
  71. package/dist/_internal/components/data-display/Chart/Chart.js +14 -0
  72. package/dist/_internal/components/data-display/Chart/Chart.js.map +1 -0
  73. package/dist/_internal/components/data-display/Chart/Chart.types.js +1 -0
  74. package/dist/_internal/components/data-display/Chart/Chart.types.js.map +1 -0
  75. package/dist/_internal/components/data-display/Chart/ChartComposables.js +16 -0
  76. package/dist/_internal/components/data-display/Chart/ChartComposables.js.map +1 -0
  77. package/dist/_internal/components/data-display/Chart/ChartSpec.types.js +1 -0
  78. package/dist/_internal/components/data-display/Chart/ChartSpec.types.js.map +1 -0
  79. package/dist/_internal/components/data-display/Chart/SpecChart.js +18 -0
  80. package/dist/_internal/components/data-display/Chart/SpecChart.js.map +1 -0
  81. package/dist/_internal/components/data-display/Chart/chart-axis.js +16 -0
  82. package/dist/_internal/components/data-display/Chart/chart-axis.js.map +1 -0
  83. package/dist/_internal/components/data-display/Chart/chart-context.js +11 -0
  84. package/dist/_internal/components/data-display/Chart/chart-context.js.map +1 -0
  85. package/dist/_internal/components/data-display/Chart/chart-format.js +10 -0
  86. package/dist/_internal/components/data-display/Chart/chart-format.js.map +1 -0
  87. package/dist/_internal/components/data-display/Chart/chart-internals.js +17 -0
  88. package/dist/_internal/components/data-display/Chart/chart-internals.js.map +1 -0
  89. package/dist/_internal/components/data-display/Chart/chart-renderers.js +13 -0
  90. package/dist/_internal/components/data-display/Chart/chart-renderers.js.map +1 -0
  91. package/dist/_internal/components/data-display/Chart/chart-spec-registry.js +12 -0
  92. package/dist/_internal/components/data-display/Chart/chart-spec-registry.js.map +1 -0
  93. package/dist/_internal/components/data-display/Chart/chart-spec.js +16 -0
  94. package/dist/_internal/components/data-display/Chart/chart-spec.js.map +1 -0
  95. package/dist/_internal/components/data-display/Chip/Chip.helpers.js +20 -0
  96. package/dist/_internal/components/data-display/Chip/Chip.helpers.js.map +1 -0
  97. package/dist/_internal/components/data-display/Chip/Chip.js +9 -0
  98. package/dist/_internal/components/data-display/Chip/Chip.js.map +1 -0
  99. package/dist/_internal/components/data-display/Chip/Chip.types.js +1 -0
  100. package/dist/_internal/components/data-display/Chip/Chip.types.js.map +1 -0
  101. package/dist/_internal/components/data-display/DataGrid/DataGrid.body.js +14 -0
  102. package/dist/_internal/components/data-display/DataGrid/DataGrid.body.js.map +1 -0
  103. package/dist/_internal/components/data-display/DataGrid/DataGrid.cells.js +13 -0
  104. package/dist/_internal/components/data-display/DataGrid/DataGrid.cells.js.map +1 -0
  105. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +13 -0
  106. package/dist/_internal/components/data-display/DataGrid/DataGrid.js.map +1 -0
  107. package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js +9 -0
  108. package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js.map +1 -0
  109. package/dist/_internal/components/data-display/DataGrid/DataGrid.rows.js +10 -0
  110. package/dist/_internal/components/data-display/DataGrid/DataGrid.rows.js.map +1 -0
  111. package/dist/_internal/components/data-display/DataGrid/DataGrid.states.js +12 -0
  112. package/dist/_internal/components/data-display/DataGrid/DataGrid.states.js.map +1 -0
  113. package/dist/_internal/components/data-display/DataGrid/DataGrid.types.js +1 -0
  114. package/dist/_internal/components/data-display/DataGrid/DataGrid.types.js.map +1 -0
  115. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +15 -0
  116. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js.map +1 -0
  117. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +119 -0
  118. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js.map +1 -0
  119. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +152 -0
  120. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js.map +1 -0
  121. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +21 -0
  122. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js.map +1 -0
  123. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +30 -0
  124. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js.map +1 -0
  125. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +34 -0
  126. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js.map +1 -0
  127. package/dist/_internal/components/data-display/DataViews/base-card.js +24 -0
  128. package/dist/_internal/components/data-display/DataViews/base-card.js.map +1 -0
  129. package/dist/_internal/components/data-display/DataViews/base-list-card-disclosure.js +9 -0
  130. package/dist/_internal/components/data-display/DataViews/base-list-card-disclosure.js.map +1 -0
  131. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +36 -0
  132. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js.map +1 -0
  133. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +19 -0
  134. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js.map +1 -0
  135. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +34 -0
  136. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js.map +1 -0
  137. package/dist/_internal/components/data-display/DataViews/base-list-card.js +43 -0
  138. package/dist/_internal/components/data-display/DataViews/base-list-card.js.map +1 -0
  139. package/dist/_internal/components/data-display/DataViews/card-surface.js +17 -0
  140. package/dist/_internal/components/data-display/DataViews/card-surface.js.map +1 -0
  141. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +13 -0
  142. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js.map +1 -0
  143. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +41 -0
  144. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js.map +1 -0
  145. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +13 -0
  146. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js.map +1 -0
  147. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +20 -0
  148. package/dist/_internal/components/data-display/DataViews/data-views-columns.js.map +1 -0
  149. package/dist/_internal/components/data-display/DataViews/data-views-copy-context.js +10 -0
  150. package/dist/_internal/components/data-display/DataViews/data-views-copy-context.js.map +1 -0
  151. package/dist/_internal/components/data-display/DataViews/data-views-copy.js +1 -0
  152. package/dist/_internal/components/data-display/DataViews/data-views-copy.js.map +1 -0
  153. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +15 -0
  154. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js.map +1 -0
  155. package/dist/_internal/components/data-display/DataViews/data-views-dirty.js +8 -0
  156. package/dist/_internal/components/data-display/DataViews/data-views-dirty.js.map +1 -0
  157. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +28 -0
  158. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js.map +1 -0
  159. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +23 -0
  160. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js.map +1 -0
  161. package/dist/_internal/components/data-display/DataViews/data-views-drag.js +16 -0
  162. package/dist/_internal/components/data-display/DataViews/data-views-drag.js.map +1 -0
  163. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +17 -0
  164. package/dist/_internal/components/data-display/DataViews/data-views-empty.js.map +1 -0
  165. package/dist/_internal/components/data-display/DataViews/data-views-export.js +17 -0
  166. package/dist/_internal/components/data-display/DataViews/data-views-export.js.map +1 -0
  167. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +58 -0
  168. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js.map +1 -0
  169. package/dist/_internal/components/data-display/DataViews/data-views-filter.js +8 -0
  170. package/dist/_internal/components/data-display/DataViews/data-views-filter.js.map +1 -0
  171. package/dist/_internal/components/data-display/DataViews/data-views-glyphs.js +20 -0
  172. package/dist/_internal/components/data-display/DataViews/data-views-glyphs.js.map +1 -0
  173. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +38 -0
  174. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js.map +1 -0
  175. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +31 -0
  176. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js.map +1 -0
  177. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +113 -0
  178. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js.map +1 -0
  179. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +60 -0
  180. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js.map +1 -0
  181. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +33 -0
  182. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js.map +1 -0
  183. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +33 -0
  184. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js.map +1 -0
  185. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +36 -0
  186. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js.map +1 -0
  187. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +13 -0
  188. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js.map +1 -0
  189. package/dist/_internal/components/data-display/DataViews/data-views-overflow-costs.js +20 -0
  190. package/dist/_internal/components/data-display/DataViews/data-views-overflow-costs.js.map +1 -0
  191. package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +14 -0
  192. package/dist/_internal/components/data-display/DataViews/data-views-overflow.js.map +1 -0
  193. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +16 -0
  194. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js.map +1 -0
  195. package/dist/_internal/components/data-display/DataViews/data-views-preset-chips.js +10 -0
  196. package/dist/_internal/components/data-display/DataViews/data-views-preset-chips.js.map +1 -0
  197. package/dist/_internal/components/data-display/DataViews/data-views-preview.js +8 -0
  198. package/dist/_internal/components/data-display/DataViews/data-views-preview.js.map +1 -0
  199. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +22 -0
  200. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js.map +1 -0
  201. package/dist/_internal/components/data-display/DataViews/data-views-range-presets.js +14 -0
  202. package/dist/_internal/components/data-display/DataViews/data-views-range-presets.js.map +1 -0
  203. package/dist/_internal/components/data-display/DataViews/data-views-range-types.js +1 -0
  204. package/dist/_internal/components/data-display/DataViews/data-views-range-types.js.map +1 -0
  205. package/dist/_internal/components/data-display/DataViews/data-views-range-values.js +16 -0
  206. package/dist/_internal/components/data-display/DataViews/data-views-range-values.js.map +1 -0
  207. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +19 -0
  208. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js.map +1 -0
  209. package/dist/_internal/components/data-display/DataViews/data-views-scopes.js +19 -0
  210. package/dist/_internal/components/data-display/DataViews/data-views-scopes.js.map +1 -0
  211. package/dist/_internal/components/data-display/DataViews/data-views-search.js +13 -0
  212. package/dist/_internal/components/data-display/DataViews/data-views-search.js.map +1 -0
  213. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +17 -0
  214. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js.map +1 -0
  215. package/dist/_internal/components/data-display/DataViews/data-views-selection.js +9 -0
  216. package/dist/_internal/components/data-display/DataViews/data-views-selection.js.map +1 -0
  217. package/dist/_internal/components/data-display/DataViews/data-views-server-query.js +11 -0
  218. package/dist/_internal/components/data-display/DataViews/data-views-server-query.js.map +1 -0
  219. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +43 -0
  220. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js.map +1 -0
  221. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +60 -0
  222. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js.map +1 -0
  223. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +42 -0
  224. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js.map +1 -0
  225. package/dist/_internal/components/data-display/DataViews/data-views-types.js +16 -0
  226. package/dist/_internal/components/data-display/DataViews/data-views-types.js.map +1 -0
  227. package/dist/_internal/components/data-display/DataViews/data-views-view-mutations.js +9 -0
  228. package/dist/_internal/components/data-display/DataViews/data-views-view-mutations.js.map +1 -0
  229. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +23 -0
  230. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js.map +1 -0
  231. package/dist/_internal/components/data-display/DataViews/list-card-cells.js +18 -0
  232. package/dist/_internal/components/data-display/DataViews/list-card-cells.js.map +1 -0
  233. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +41 -0
  234. package/dist/_internal/components/data-display/DataViews/list-card-rails.js.map +1 -0
  235. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +14 -0
  236. package/dist/_internal/components/data-display/DataViews/save-view-preview.js.map +1 -0
  237. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +24 -0
  238. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js.map +1 -0
  239. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +12 -0
  240. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js.map +1 -0
  241. package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.hooks.js +8 -0
  242. package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.hooks.js.map +1 -0
  243. package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.js +9 -0
  244. package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.js.map +1 -0
  245. package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.types.js +1 -0
  246. package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.types.js.map +1 -0
  247. package/dist/_internal/components/data-display/DateTimeDisplay/index.js +10 -0
  248. package/dist/_internal/components/data-display/DateTimeDisplay/index.js.map +1 -0
  249. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +9 -0
  250. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js.map +1 -0
  251. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.types.js +1 -0
  252. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.types.js.map +1 -0
  253. package/dist/_internal/components/data-display/EmptyState/EmptyState.js +10 -0
  254. package/dist/_internal/components/data-display/EmptyState/EmptyState.js.map +1 -0
  255. package/dist/_internal/components/data-display/EmptyState/EmptyState.types.js +1 -0
  256. package/dist/_internal/components/data-display/EmptyState/EmptyState.types.js.map +1 -0
  257. package/dist/_internal/components/data-display/ErrorState/ErrorState.js +10 -0
  258. package/dist/_internal/components/data-display/ErrorState/ErrorState.js.map +1 -0
  259. package/dist/_internal/components/data-display/ErrorState/ErrorState.types.js +1 -0
  260. package/dist/_internal/components/data-display/ErrorState/ErrorState.types.js.map +1 -0
  261. package/dist/_internal/components/data-display/HoverCard/HoverCard.animations.js +18 -0
  262. package/dist/_internal/components/data-display/HoverCard/HoverCard.animations.js.map +1 -0
  263. package/dist/_internal/components/data-display/HoverCard/HoverCard.content.js +8 -0
  264. package/dist/_internal/components/data-display/HoverCard/HoverCard.content.js.map +1 -0
  265. package/dist/_internal/components/data-display/HoverCard/HoverCard.hooks.js +8 -0
  266. package/dist/_internal/components/data-display/HoverCard/HoverCard.hooks.js.map +1 -0
  267. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +13 -0
  268. package/dist/_internal/components/data-display/HoverCard/HoverCard.js.map +1 -0
  269. package/dist/_internal/components/data-display/HoverCard/HoverCard.styles.js +17 -0
  270. package/dist/_internal/components/data-display/HoverCard/HoverCard.styles.js.map +1 -0
  271. package/dist/_internal/components/data-display/HoverCard/HoverCard.types.js +1 -0
  272. package/dist/_internal/components/data-display/HoverCard/HoverCard.types.js.map +1 -0
  273. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.js +10 -0
  274. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.js.map +1 -0
  275. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +10 -0
  276. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js.map +1 -0
  277. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.js +14 -0
  278. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.js.map +1 -0
  279. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.types.js +1 -0
  280. package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.types.js.map +1 -0
  281. package/dist/_internal/components/data-display/LazyImage/LazyImage.hooks.js +12 -0
  282. package/dist/_internal/components/data-display/LazyImage/LazyImage.hooks.js.map +1 -0
  283. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +13 -0
  284. package/dist/_internal/components/data-display/LazyImage/LazyImage.js.map +1 -0
  285. package/dist/_internal/components/data-display/LazyImage/LazyImage.types.js +1 -0
  286. package/dist/_internal/components/data-display/LazyImage/LazyImage.types.js.map +1 -0
  287. package/dist/_internal/components/data-display/Lightbox/Lightbox.constants.js +32 -0
  288. package/dist/_internal/components/data-display/Lightbox/Lightbox.constants.js.map +1 -0
  289. package/dist/_internal/components/data-display/Lightbox/Lightbox.helpers.js +8 -0
  290. package/dist/_internal/components/data-display/Lightbox/Lightbox.helpers.js.map +1 -0
  291. package/dist/_internal/components/data-display/Lightbox/Lightbox.hooks.js +21 -0
  292. package/dist/_internal/components/data-display/Lightbox/Lightbox.hooks.js.map +1 -0
  293. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +21 -0
  294. package/dist/_internal/components/data-display/Lightbox/Lightbox.js.map +1 -0
  295. package/dist/_internal/components/data-display/Lightbox/Lightbox.types.js +1 -0
  296. package/dist/_internal/components/data-display/Lightbox/Lightbox.types.js.map +1 -0
  297. package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +16 -0
  298. package/dist/_internal/components/data-display/Lightbox/LightboxControls.js.map +1 -0
  299. package/dist/_internal/components/data-display/Lightbox/LightboxCurrentMedia.js +9 -0
  300. package/dist/_internal/components/data-display/Lightbox/LightboxCurrentMedia.js.map +1 -0
  301. package/dist/_internal/components/data-display/Lightbox/LightboxMedia.js +8 -0
  302. package/dist/_internal/components/data-display/Lightbox/LightboxMedia.js.map +1 -0
  303. package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +11 -0
  304. package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js.map +1 -0
  305. package/dist/_internal/components/data-display/Lightbox/LightboxStage.js +9 -0
  306. package/dist/_internal/components/data-display/Lightbox/LightboxStage.js.map +1 -0
  307. package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +9 -0
  308. package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js.map +1 -0
  309. package/dist/_internal/components/data-display/Lightbox/lightbox-copy-context.js +11 -0
  310. package/dist/_internal/components/data-display/Lightbox/lightbox-copy-context.js.map +1 -0
  311. package/dist/_internal/components/data-display/Lightbox/useLightbox.js +10 -0
  312. package/dist/_internal/components/data-display/Lightbox/useLightbox.js.map +1 -0
  313. package/dist/_internal/components/data-display/LoadingState/LoadingState.helpers.js +14 -0
  314. package/dist/_internal/components/data-display/LoadingState/LoadingState.helpers.js.map +1 -0
  315. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +14 -0
  316. package/dist/_internal/components/data-display/LoadingState/LoadingState.js.map +1 -0
  317. package/dist/_internal/components/data-display/LoadingState/LoadingState.types.js +1 -0
  318. package/dist/_internal/components/data-display/LoadingState/LoadingState.types.js.map +1 -0
  319. package/dist/_internal/components/data-display/MapPreview/MapControlBar.js +9 -0
  320. package/dist/_internal/components/data-display/MapPreview/MapControlBar.js.map +1 -0
  321. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +18 -0
  322. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js.map +1 -0
  323. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +12 -0
  324. package/dist/_internal/components/data-display/MapPreview/MapLayers.js.map +1 -0
  325. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +12 -0
  326. package/dist/_internal/components/data-display/MapPreview/MapMarkers.js.map +1 -0
  327. package/dist/_internal/components/data-display/MapPreview/MapOverlays.js +10 -0
  328. package/dist/_internal/components/data-display/MapPreview/MapOverlays.js.map +1 -0
  329. package/dist/_internal/components/data-display/MapPreview/MapPreview.constants.js +24 -0
  330. package/dist/_internal/components/data-display/MapPreview/MapPreview.constants.js.map +1 -0
  331. package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js +11 -0
  332. package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js.map +1 -0
  333. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +18 -0
  334. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js.map +1 -0
  335. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +24 -0
  336. package/dist/_internal/components/data-display/MapPreview/MapPreview.js.map +1 -0
  337. package/dist/_internal/components/data-display/MapPreview/MapPreview.types.js +1 -0
  338. package/dist/_internal/components/data-display/MapPreview/MapPreview.types.js.map +1 -0
  339. package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +8 -0
  340. package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js.map +1 -0
  341. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +10 -0
  342. package/dist/_internal/components/data-display/MapPreview/MapTiles.js.map +1 -0
  343. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +12 -0
  344. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js.map +1 -0
  345. package/dist/_internal/components/data-display/MapPreview/mapProjection.js +14 -0
  346. package/dist/_internal/components/data-display/MapPreview/mapProjection.js.map +1 -0
  347. package/dist/_internal/components/data-display/MapPreview/mapSurface.js +12 -0
  348. package/dist/_internal/components/data-display/MapPreview/mapSurface.js.map +1 -0
  349. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +11 -0
  350. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js.map +1 -0
  351. package/dist/_internal/components/data-display/Popover/Popover.js +8 -0
  352. package/dist/_internal/components/data-display/Popover/Popover.js.map +1 -0
  353. package/dist/_internal/components/data-display/Popover/Popover.types.js +1 -0
  354. package/dist/_internal/components/data-display/Popover/Popover.types.js.map +1 -0
  355. package/dist/_internal/components/data-display/Progress/Progress.helpers.js +8 -0
  356. package/dist/_internal/components/data-display/Progress/Progress.helpers.js.map +1 -0
  357. package/dist/_internal/components/data-display/Progress/Progress.js +10 -0
  358. package/dist/_internal/components/data-display/Progress/Progress.js.map +1 -0
  359. package/dist/_internal/components/data-display/Progress/Progress.styles.js +18 -0
  360. package/dist/_internal/components/data-display/Progress/Progress.styles.js.map +1 -0
  361. package/dist/_internal/components/data-display/Progress/Progress.types.js +1 -0
  362. package/dist/_internal/components/data-display/Progress/Progress.types.js.map +1 -0
  363. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +13 -0
  364. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js.map +1 -0
  365. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.types.js +1 -0
  366. package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.types.js.map +1 -0
  367. package/dist/_internal/components/data-display/Sheet/Sheet.animations.js +18 -0
  368. package/dist/_internal/components/data-display/Sheet/Sheet.animations.js.map +1 -0
  369. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +12 -0
  370. package/dist/_internal/components/data-display/Sheet/Sheet.body.js.map +1 -0
  371. package/dist/_internal/components/data-display/Sheet/Sheet.drag.js +8 -0
  372. package/dist/_internal/components/data-display/Sheet/Sheet.drag.js.map +1 -0
  373. package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +12 -0
  374. package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js.map +1 -0
  375. package/dist/_internal/components/data-display/Sheet/Sheet.js +25 -0
  376. package/dist/_internal/components/data-display/Sheet/Sheet.js.map +1 -0
  377. package/dist/_internal/components/data-display/Sheet/Sheet.parts.js +16 -0
  378. package/dist/_internal/components/data-display/Sheet/Sheet.parts.js.map +1 -0
  379. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +10 -0
  380. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js.map +1 -0
  381. package/dist/_internal/components/data-display/Sheet/Sheet.types.js +1 -0
  382. package/dist/_internal/components/data-display/Sheet/Sheet.types.js.map +1 -0
  383. package/dist/_internal/components/data-display/StatCard/StatCard.js +13 -0
  384. package/dist/_internal/components/data-display/StatCard/StatCard.js.map +1 -0
  385. package/dist/_internal/components/data-display/StatCard/StatCard.types.js +1 -0
  386. package/dist/_internal/components/data-display/StatCard/StatCard.types.js.map +1 -0
  387. package/dist/_internal/components/data-display/Stepper/Stepper.js +8 -0
  388. package/dist/_internal/components/data-display/Stepper/Stepper.js.map +1 -0
  389. package/dist/_internal/components/data-display/Stepper/Stepper.types.js +1 -0
  390. package/dist/_internal/components/data-display/Stepper/Stepper.types.js.map +1 -0
  391. package/dist/_internal/components/data-display/Table/Table.helpers.js +10 -0
  392. package/dist/_internal/components/data-display/Table/Table.helpers.js.map +1 -0
  393. package/dist/_internal/components/data-display/Table/Table.hooks.js +10 -0
  394. package/dist/_internal/components/data-display/Table/Table.hooks.js.map +1 -0
  395. package/dist/_internal/components/data-display/Table/Table.js +13 -0
  396. package/dist/_internal/components/data-display/Table/Table.js.map +1 -0
  397. package/dist/_internal/components/data-display/Table/Table.styles.js +8 -0
  398. package/dist/_internal/components/data-display/Table/Table.styles.js.map +1 -0
  399. package/dist/_internal/components/data-display/Table/Table.types.js +1 -0
  400. package/dist/_internal/components/data-display/Table/Table.types.js.map +1 -0
  401. package/dist/_internal/components/data-display/Table/TableParts.hooks.js +9 -0
  402. package/dist/_internal/components/data-display/Table/TableParts.hooks.js.map +1 -0
  403. package/dist/_internal/components/data-display/Table/TableParts.js +13 -0
  404. package/dist/_internal/components/data-display/Table/TableParts.js.map +1 -0
  405. package/dist/_internal/components/data-display/Table/TableStates.js +10 -0
  406. package/dist/_internal/components/data-display/Table/TableStates.js.map +1 -0
  407. package/dist/_internal/components/data-display/Timeline/Timeline.js +11 -0
  408. package/dist/_internal/components/data-display/Timeline/Timeline.js.map +1 -0
  409. package/dist/_internal/components/data-display/Timeline/Timeline.types.js +1 -0
  410. package/dist/_internal/components/data-display/Timeline/Timeline.types.js.map +1 -0
  411. package/dist/_internal/components/data-display/Timeline/TimelineRow.js +8 -0
  412. package/dist/_internal/components/data-display/Timeline/TimelineRow.js.map +1 -0
  413. package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.js +11 -0
  414. package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.js.map +1 -0
  415. package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.types.js +1 -0
  416. package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.types.js.map +1 -0
  417. package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.views.js +16 -0
  418. package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.views.js.map +1 -0
  419. package/dist/_internal/components/data-display/Tooltip/Tooltip.js +8 -0
  420. package/dist/_internal/components/data-display/Tooltip/Tooltip.js.map +1 -0
  421. package/dist/_internal/components/data-display/Tooltip/Tooltip.types.js +1 -0
  422. package/dist/_internal/components/data-display/Tooltip/Tooltip.types.js.map +1 -0
  423. package/dist/_internal/components/data-display/index.js +285 -0
  424. package/dist/_internal/components/data-display/index.js.map +1 -0
  425. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.hooks.js +8 -0
  426. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.hooks.js.map +1 -0
  427. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +12 -0
  428. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js.map +1 -0
  429. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.parts.js +10 -0
  430. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.parts.js.map +1 -0
  431. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.types.js +1 -0
  432. package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.types.js.map +1 -0
  433. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +17 -0
  434. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js.map +1 -0
  435. package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +12 -0
  436. package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js.map +1 -0
  437. package/dist/_internal/components/feedback/Dialog/Dialog.js +16 -0
  438. package/dist/_internal/components/feedback/Dialog/Dialog.js.map +1 -0
  439. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +11 -0
  440. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js.map +1 -0
  441. package/dist/_internal/components/feedback/Dialog/Dialog.types.js +1 -0
  442. package/dist/_internal/components/feedback/Dialog/Dialog.types.js.map +1 -0
  443. package/dist/_internal/components/feedback/Modal/Modal.js +13 -0
  444. package/dist/_internal/components/feedback/Modal/Modal.js.map +1 -0
  445. package/dist/_internal/components/feedback/Modal/Modal.styles.js +10 -0
  446. package/dist/_internal/components/feedback/Modal/Modal.styles.js.map +1 -0
  447. package/dist/_internal/components/feedback/Modal/Modal.transitions.js +10 -0
  448. package/dist/_internal/components/feedback/Modal/Modal.transitions.js.map +1 -0
  449. package/dist/_internal/components/feedback/Modal/Modal.types.js +1 -0
  450. package/dist/_internal/components/feedback/Modal/Modal.types.js.map +1 -0
  451. package/dist/_internal/components/feedback/Sonner/Sonner.js +17 -0
  452. package/dist/_internal/components/feedback/Sonner/Sonner.js.map +1 -0
  453. package/dist/_internal/components/feedback/Sonner/Sonner.types.js +1 -0
  454. package/dist/_internal/components/feedback/Sonner/Sonner.types.js.map +1 -0
  455. package/dist/_internal/components/feedback/Sonner/SonnerToast.js +8 -0
  456. package/dist/_internal/components/feedback/Sonner/SonnerToast.js.map +1 -0
  457. package/dist/_internal/components/feedback/StackedModal/StackedModal.hooks.js +10 -0
  458. package/dist/_internal/components/feedback/StackedModal/StackedModal.hooks.js.map +1 -0
  459. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +26 -0
  460. package/dist/_internal/components/feedback/StackedModal/StackedModal.js.map +1 -0
  461. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +28 -0
  462. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js.map +1 -0
  463. package/dist/_internal/components/feedback/StackedModal/StackedModal.styles.js +21 -0
  464. package/dist/_internal/components/feedback/StackedModal/StackedModal.styles.js.map +1 -0
  465. package/dist/_internal/components/feedback/StackedModal/StackedModal.types.js +1 -0
  466. package/dist/_internal/components/feedback/StackedModal/StackedModal.types.js.map +1 -0
  467. package/dist/_internal/components/feedback/StackedModal/modal-stack.js +11 -0
  468. package/dist/_internal/components/feedback/StackedModal/modal-stack.js.map +1 -0
  469. package/dist/_internal/components/feedback/Toast/Toast.js +14 -0
  470. package/dist/_internal/components/feedback/Toast/Toast.js.map +1 -0
  471. package/dist/_internal/components/feedback/Toast/Toast.types.js +1 -0
  472. package/dist/_internal/components/feedback/Toast/Toast.types.js.map +1 -0
  473. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.geometry.js +10 -0
  474. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.geometry.js.map +1 -0
  475. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.hooks.js +9 -0
  476. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.hooks.js.map +1 -0
  477. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +13 -0
  478. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js.map +1 -0
  479. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.types.js +1 -0
  480. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.types.js.map +1 -0
  481. package/dist/_internal/components/feedback/TutorialOverlay/TutorialStepBody.js +8 -0
  482. package/dist/_internal/components/feedback/TutorialOverlay/TutorialStepBody.js.map +1 -0
  483. package/dist/_internal/components/feedback/index.js +108 -0
  484. package/dist/_internal/components/feedback/index.js.map +1 -0
  485. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.helpers.js +14 -0
  486. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.helpers.js.map +1 -0
  487. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +15 -0
  488. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js.map +1 -0
  489. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +24 -0
  490. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js.map +1 -0
  491. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.mapper.js +12 -0
  492. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.mapper.js.map +1 -0
  493. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.types.js +1 -0
  494. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.types.js.map +1 -0
  495. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +13 -0
  496. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js.map +1 -0
  497. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +9 -0
  498. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js.map +1 -0
  499. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +9 -0
  500. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js.map +1 -0
  501. package/dist/_internal/components/form/AddressAutocomplete/AddressOption.js +8 -0
  502. package/dist/_internal/components/form/AddressAutocomplete/AddressOption.js.map +1 -0
  503. package/dist/_internal/components/form/AddressAutocomplete/AddressSuggestionsPaper.js +8 -0
  504. package/dist/_internal/components/form/AddressAutocomplete/AddressSuggestionsPaper.js.map +1 -0
  505. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +8 -0
  506. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js.map +1 -0
  507. package/dist/_internal/components/form/AddressAutocomplete/mockPlaces.js +12 -0
  508. package/dist/_internal/components/form/AddressAutocomplete/mockPlaces.js.map +1 -0
  509. package/dist/_internal/components/form/AddressAutocomplete/useAddressPredictions.js +10 -0
  510. package/dist/_internal/components/form/AddressAutocomplete/useAddressPredictions.js.map +1 -0
  511. package/dist/_internal/components/form/AddressAutocomplete/useAddressSelection.js +10 -0
  512. package/dist/_internal/components/form/AddressAutocomplete/useAddressSelection.js.map +1 -0
  513. package/dist/_internal/components/form/AddressAutocomplete/useCurrentLocation.js +10 -0
  514. package/dist/_internal/components/form/AddressAutocomplete/useCurrentLocation.js.map +1 -0
  515. package/dist/_internal/components/form/AddressAutocomplete/useGoogleMapsAPI.js +8 -0
  516. package/dist/_internal/components/form/AddressAutocomplete/useGoogleMapsAPI.js.map +1 -0
  517. package/dist/_internal/components/form/Autocomplete/Autocomplete.helpers.js +22 -0
  518. package/dist/_internal/components/form/Autocomplete/Autocomplete.helpers.js.map +1 -0
  519. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +14 -0
  520. package/dist/_internal/components/form/Autocomplete/Autocomplete.js.map +1 -0
  521. package/dist/_internal/components/form/Autocomplete/Autocomplete.keys.js +9 -0
  522. package/dist/_internal/components/form/Autocomplete/Autocomplete.keys.js.map +1 -0
  523. package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +21 -0
  524. package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js.map +1 -0
  525. package/dist/_internal/components/form/Autocomplete/Autocomplete.types.js +1 -0
  526. package/dist/_internal/components/form/Autocomplete/Autocomplete.types.js.map +1 -0
  527. package/dist/_internal/components/form/Autocomplete/useAutocomplete.js +10 -0
  528. package/dist/_internal/components/form/Autocomplete/useAutocomplete.js.map +1 -0
  529. package/dist/_internal/components/form/Button/Button.helpers.js +8 -0
  530. package/dist/_internal/components/form/Button/Button.helpers.js.map +1 -0
  531. package/dist/_internal/components/form/Button/Button.js +10 -0
  532. package/dist/_internal/components/form/Button/Button.js.map +1 -0
  533. package/dist/_internal/components/form/Button/Button.styles.js +16 -0
  534. package/dist/_internal/components/form/Button/Button.styles.js.map +1 -0
  535. package/dist/_internal/components/form/Button/Button.types.js +1 -0
  536. package/dist/_internal/components/form/Button/Button.types.js.map +1 -0
  537. package/dist/_internal/components/form/Calendar/Calendar.dates.js +24 -0
  538. package/dist/_internal/components/form/Calendar/Calendar.dates.js.map +1 -0
  539. package/dist/_internal/components/form/Calendar/Calendar.helpers.js +8 -0
  540. package/dist/_internal/components/form/Calendar/Calendar.helpers.js.map +1 -0
  541. package/dist/_internal/components/form/Calendar/Calendar.hooks.js +11 -0
  542. package/dist/_internal/components/form/Calendar/Calendar.hooks.js.map +1 -0
  543. package/dist/_internal/components/form/Calendar/Calendar.js +18 -0
  544. package/dist/_internal/components/form/Calendar/Calendar.js.map +1 -0
  545. package/dist/_internal/components/form/Calendar/Calendar.keyboard.js +11 -0
  546. package/dist/_internal/components/form/Calendar/Calendar.keyboard.js.map +1 -0
  547. package/dist/_internal/components/form/Calendar/Calendar.selection.js +13 -0
  548. package/dist/_internal/components/form/Calendar/Calendar.selection.js.map +1 -0
  549. package/dist/_internal/components/form/Calendar/Calendar.types.js +1 -0
  550. package/dist/_internal/components/form/Calendar/Calendar.types.js.map +1 -0
  551. package/dist/_internal/components/form/Calendar/CalendarDay.js +8 -0
  552. package/dist/_internal/components/form/Calendar/CalendarDay.js.map +1 -0
  553. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +11 -0
  554. package/dist/_internal/components/form/Calendar/CalendarDayCell.js.map +1 -0
  555. package/dist/_internal/components/form/Calendar/CalendarMonth.js +12 -0
  556. package/dist/_internal/components/form/Calendar/CalendarMonth.js.map +1 -0
  557. package/dist/_internal/components/form/CategorySelect/CategoryIcons.js +14 -0
  558. package/dist/_internal/components/form/CategorySelect/CategoryIcons.js.map +1 -0
  559. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +17 -0
  560. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js.map +1 -0
  561. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +12 -0
  562. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js.map +1 -0
  563. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +13 -0
  564. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js.map +1 -0
  565. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +13 -0
  566. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js.map +1 -0
  567. package/dist/_internal/components/form/CategorySelect/CategoryPanelSurface.js +10 -0
  568. package/dist/_internal/components/form/CategorySelect/CategoryPanelSurface.js.map +1 -0
  569. package/dist/_internal/components/form/CategorySelect/CategoryQuickActions.js +10 -0
  570. package/dist/_internal/components/form/CategorySelect/CategoryQuickActions.js.map +1 -0
  571. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +22 -0
  572. package/dist/_internal/components/form/CategorySelect/CategoryRows.js.map +1 -0
  573. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +27 -0
  574. package/dist/_internal/components/form/CategorySelect/CategorySelect.js.map +1 -0
  575. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +56 -0
  576. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js.map +1 -0
  577. package/dist/_internal/components/form/CategorySelect/CategorySelect.types.js +1 -0
  578. package/dist/_internal/components/form/CategorySelect/CategorySelect.types.js.map +1 -0
  579. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +11 -0
  580. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js.map +1 -0
  581. package/dist/_internal/components/form/CategorySelect/category-keyboard.js +8 -0
  582. package/dist/_internal/components/form/CategorySelect/category-keyboard.js.map +1 -0
  583. package/dist/_internal/components/form/CategorySelect/category-tree.js +30 -0
  584. package/dist/_internal/components/form/CategorySelect/category-tree.js.map +1 -0
  585. package/dist/_internal/components/form/CategorySelect/useCategoryCommit.js +8 -0
  586. package/dist/_internal/components/form/CategorySelect/useCategoryCommit.js.map +1 -0
  587. package/dist/_internal/components/form/CategorySelect/useCategoryKeyHandler.js +9 -0
  588. package/dist/_internal/components/form/CategorySelect/useCategoryKeyHandler.js.map +1 -0
  589. package/dist/_internal/components/form/CategorySelect/useCategorySelect.js +9 -0
  590. package/dist/_internal/components/form/CategorySelect/useCategorySelect.js.map +1 -0
  591. package/dist/_internal/components/form/CepField/CepField.js +18 -0
  592. package/dist/_internal/components/form/CepField/CepField.js.map +1 -0
  593. package/dist/_internal/components/form/CepField/CepField.types.js +1 -0
  594. package/dist/_internal/components/form/CepField/CepField.types.js.map +1 -0
  595. package/dist/_internal/components/form/Checkbox/Checkbox.helpers.js +10 -0
  596. package/dist/_internal/components/form/Checkbox/Checkbox.helpers.js.map +1 -0
  597. package/dist/_internal/components/form/Checkbox/Checkbox.js +9 -0
  598. package/dist/_internal/components/form/Checkbox/Checkbox.js.map +1 -0
  599. package/dist/_internal/components/form/Checkbox/Checkbox.types.js +1 -0
  600. package/dist/_internal/components/form/Checkbox/Checkbox.types.js.map +1 -0
  601. package/dist/_internal/components/form/CodeEditor/CodeEditor.helpers.js +10 -0
  602. package/dist/_internal/components/form/CodeEditor/CodeEditor.helpers.js.map +1 -0
  603. package/dist/_internal/components/form/CodeEditor/CodeEditor.hooks.js +9 -0
  604. package/dist/_internal/components/form/CodeEditor/CodeEditor.hooks.js.map +1 -0
  605. package/dist/_internal/components/form/CodeEditor/CodeEditor.js +12 -0
  606. package/dist/_internal/components/form/CodeEditor/CodeEditor.js.map +1 -0
  607. package/dist/_internal/components/form/CodeEditor/CodeEditor.monaco.js +16 -0
  608. package/dist/_internal/components/form/CodeEditor/CodeEditor.monaco.js.map +1 -0
  609. package/dist/_internal/components/form/CodeEditor/CodeEditor.types.js +1 -0
  610. package/dist/_internal/components/form/CodeEditor/CodeEditor.types.js.map +1 -0
  611. package/dist/_internal/components/form/CodeEditor/CodeEditorToolbar.js +8 -0
  612. package/dist/_internal/components/form/CodeEditor/CodeEditorToolbar.js.map +1 -0
  613. package/dist/_internal/components/form/Command/Command.hooks.js +10 -0
  614. package/dist/_internal/components/form/Command/Command.hooks.js.map +1 -0
  615. package/dist/_internal/components/form/Command/Command.js +25 -0
  616. package/dist/_internal/components/form/Command/Command.js.map +1 -0
  617. package/dist/_internal/components/form/Command/Command.parts.js +12 -0
  618. package/dist/_internal/components/form/Command/Command.parts.js.map +1 -0
  619. package/dist/_internal/components/form/Command/Command.styles.js +11 -0
  620. package/dist/_internal/components/form/Command/Command.styles.js.map +1 -0
  621. package/dist/_internal/components/form/Command/Command.types.js +1 -0
  622. package/dist/_internal/components/form/Command/Command.types.js.map +1 -0
  623. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +12 -0
  624. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js.map +1 -0
  625. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.types.js +1 -0
  626. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.types.js.map +1 -0
  627. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.dates.js +27 -0
  628. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.dates.js.map +1 -0
  629. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +12 -0
  630. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js.map +1 -0
  631. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +28 -0
  632. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js.map +1 -0
  633. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.quick.js +16 -0
  634. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.quick.js.map +1 -0
  635. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +19 -0
  636. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js.map +1 -0
  637. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.types.js +1 -0
  638. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.types.js.map +1 -0
  639. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +12 -0
  640. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js.map +1 -0
  641. package/dist/_internal/components/form/DateRangePicker/DateRangePickerQuickList.js +8 -0
  642. package/dist/_internal/components/form/DateRangePicker/DateRangePickerQuickList.js.map +1 -0
  643. package/dist/_internal/components/form/Form/Form.js +16 -0
  644. package/dist/_internal/components/form/Form/Form.js.map +1 -0
  645. package/dist/_internal/components/form/Form/Form.types.js +1 -0
  646. package/dist/_internal/components/form/Form/Form.types.js.map +1 -0
  647. package/dist/_internal/components/form/HeaderButton/HeaderButton.js +9 -0
  648. package/dist/_internal/components/form/HeaderButton/HeaderButton.js.map +1 -0
  649. package/dist/_internal/components/form/Input/Input.js +11 -0
  650. package/dist/_internal/components/form/Input/Input.js.map +1 -0
  651. package/dist/_internal/components/form/Input/Input.styles.js +22 -0
  652. package/dist/_internal/components/form/Input/Input.styles.js.map +1 -0
  653. package/dist/_internal/components/form/Input/Input.types.js +1 -0
  654. package/dist/_internal/components/form/Input/Input.types.js.map +1 -0
  655. package/dist/_internal/components/form/Input/text-field-slim.js +10 -0
  656. package/dist/_internal/components/form/Input/text-field-slim.js.map +1 -0
  657. package/dist/_internal/components/form/InputOTP/InputOTP.hooks.js +8 -0
  658. package/dist/_internal/components/form/InputOTP/InputOTP.hooks.js.map +1 -0
  659. package/dist/_internal/components/form/InputOTP/InputOTP.js +11 -0
  660. package/dist/_internal/components/form/InputOTP/InputOTP.js.map +1 -0
  661. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +8 -0
  662. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js.map +1 -0
  663. package/dist/_internal/components/form/InputOTP/InputOTP.types.js +1 -0
  664. package/dist/_internal/components/form/InputOTP/InputOTP.types.js.map +1 -0
  665. package/dist/_internal/components/form/Label/Label.js +12 -0
  666. package/dist/_internal/components/form/Label/Label.js.map +1 -0
  667. package/dist/_internal/components/form/Label/Label.parts.js +14 -0
  668. package/dist/_internal/components/form/Label/Label.parts.js.map +1 -0
  669. package/dist/_internal/components/form/Label/Label.styles.js +15 -0
  670. package/dist/_internal/components/form/Label/Label.styles.js.map +1 -0
  671. package/dist/_internal/components/form/Label/Label.types.js +1 -0
  672. package/dist/_internal/components/form/Label/Label.types.js.map +1 -0
  673. package/dist/_internal/components/form/Menubar/Menubar.hooks.js +8 -0
  674. package/dist/_internal/components/form/Menubar/Menubar.hooks.js.map +1 -0
  675. package/dist/_internal/components/form/Menubar/Menubar.item.js +10 -0
  676. package/dist/_internal/components/form/Menubar/Menubar.item.js.map +1 -0
  677. package/dist/_internal/components/form/Menubar/Menubar.js +20 -0
  678. package/dist/_internal/components/form/Menubar/Menubar.js.map +1 -0
  679. package/dist/_internal/components/form/Menubar/Menubar.separator.js +8 -0
  680. package/dist/_internal/components/form/Menubar/Menubar.separator.js.map +1 -0
  681. package/dist/_internal/components/form/Menubar/Menubar.styles.js +11 -0
  682. package/dist/_internal/components/form/Menubar/Menubar.styles.js.map +1 -0
  683. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +12 -0
  684. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js.map +1 -0
  685. package/dist/_internal/components/form/Menubar/Menubar.types.js +1 -0
  686. package/dist/_internal/components/form/Menubar/Menubar.types.js.map +1 -0
  687. package/dist/_internal/components/form/PasswordStrength/PasswordStrength.helpers.js +20 -0
  688. package/dist/_internal/components/form/PasswordStrength/PasswordStrength.helpers.js.map +1 -0
  689. package/dist/_internal/components/form/PasswordStrength/PasswordStrength.js +11 -0
  690. package/dist/_internal/components/form/PasswordStrength/PasswordStrength.js.map +1 -0
  691. package/dist/_internal/components/form/PasswordStrength/PasswordStrength.types.js +1 -0
  692. package/dist/_internal/components/form/PasswordStrength/PasswordStrength.types.js.map +1 -0
  693. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +10 -0
  694. package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js.map +1 -0
  695. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +13 -0
  696. package/dist/_internal/components/form/PhoneInput/PhoneInput.js.map +1 -0
  697. package/dist/_internal/components/form/PhoneInput/PhoneInput.types.js +1 -0
  698. package/dist/_internal/components/form/PhoneInput/PhoneInput.types.js.map +1 -0
  699. package/dist/_internal/components/form/PhoneInput/countries.js +8 -0
  700. package/dist/_internal/components/form/PhoneInput/countries.js.map +1 -0
  701. package/dist/_internal/components/form/PhoneInput/phone.js +12 -0
  702. package/dist/_internal/components/form/PhoneInput/phone.js.map +1 -0
  703. package/dist/_internal/components/form/RadioGroup/RadioGroup.animations.js +14 -0
  704. package/dist/_internal/components/form/RadioGroup/RadioGroup.animations.js.map +1 -0
  705. package/dist/_internal/components/form/RadioGroup/RadioGroup.js +12 -0
  706. package/dist/_internal/components/form/RadioGroup/RadioGroup.js.map +1 -0
  707. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +17 -0
  708. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js.map +1 -0
  709. package/dist/_internal/components/form/RadioGroup/RadioGroup.types.js +1 -0
  710. package/dist/_internal/components/form/RadioGroup/RadioGroup.types.js.map +1 -0
  711. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +24 -0
  712. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js.map +1 -0
  713. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.dom.js +14 -0
  714. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.dom.js.map +1 -0
  715. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.format.js +9 -0
  716. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.format.js.map +1 -0
  717. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.hooks.js +10 -0
  718. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.hooks.js.map +1 -0
  719. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +14 -0
  720. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js.map +1 -0
  721. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.types.js +1 -0
  722. package/dist/_internal/components/form/RichTextEditor/RichTextEditor.types.js.map +1 -0
  723. package/dist/_internal/components/form/RichTextEditor/RichTextEditorToolbar.js +8 -0
  724. package/dist/_internal/components/form/RichTextEditor/RichTextEditorToolbar.js.map +1 -0
  725. package/dist/_internal/components/form/SearchPalette/SearchPalette.js +11 -0
  726. package/dist/_internal/components/form/SearchPalette/SearchPalette.js.map +1 -0
  727. package/dist/_internal/components/form/SearchPalette/SearchPalette.parts.js +30 -0
  728. package/dist/_internal/components/form/SearchPalette/SearchPalette.parts.js.map +1 -0
  729. package/dist/_internal/components/form/SearchPalette/SearchPalette.types.js +1 -0
  730. package/dist/_internal/components/form/SearchPalette/SearchPalette.types.js.map +1 -0
  731. package/dist/_internal/components/form/Select/Select.js +8 -0
  732. package/dist/_internal/components/form/Select/Select.js.map +1 -0
  733. package/dist/_internal/components/form/Select/Select.types.js +1 -0
  734. package/dist/_internal/components/form/Select/Select.types.js.map +1 -0
  735. package/dist/_internal/components/form/Slider/Slider.animations.js +12 -0
  736. package/dist/_internal/components/form/Slider/Slider.animations.js.map +1 -0
  737. package/dist/_internal/components/form/Slider/Slider.js +11 -0
  738. package/dist/_internal/components/form/Slider/Slider.js.map +1 -0
  739. package/dist/_internal/components/form/Slider/Slider.styles.js +9 -0
  740. package/dist/_internal/components/form/Slider/Slider.styles.js.map +1 -0
  741. package/dist/_internal/components/form/Slider/Slider.types.js +1 -0
  742. package/dist/_internal/components/form/Slider/Slider.types.js.map +1 -0
  743. package/dist/_internal/components/form/Switch/Switch.animations.js +18 -0
  744. package/dist/_internal/components/form/Switch/Switch.animations.js.map +1 -0
  745. package/dist/_internal/components/form/Switch/Switch.js +12 -0
  746. package/dist/_internal/components/form/Switch/Switch.js.map +1 -0
  747. package/dist/_internal/components/form/Switch/Switch.parts.js +18 -0
  748. package/dist/_internal/components/form/Switch/Switch.parts.js.map +1 -0
  749. package/dist/_internal/components/form/Switch/Switch.styles.js +9 -0
  750. package/dist/_internal/components/form/Switch/Switch.styles.js.map +1 -0
  751. package/dist/_internal/components/form/Switch/Switch.types.js +1 -0
  752. package/dist/_internal/components/form/Switch/Switch.types.js.map +1 -0
  753. package/dist/_internal/components/form/Textarea/Textarea.js +9 -0
  754. package/dist/_internal/components/form/Textarea/Textarea.js.map +1 -0
  755. package/dist/_internal/components/form/Textarea/Textarea.styles.js +12 -0
  756. package/dist/_internal/components/form/Textarea/Textarea.styles.js.map +1 -0
  757. package/dist/_internal/components/form/Textarea/Textarea.types.js +1 -0
  758. package/dist/_internal/components/form/Textarea/Textarea.types.js.map +1 -0
  759. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +303 -0
  760. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js.map +1 -0
  761. package/dist/_internal/components/form/Toggle/Toggle.js +9 -0
  762. package/dist/_internal/components/form/Toggle/Toggle.js.map +1 -0
  763. package/dist/_internal/components/form/Toggle/Toggle.styles.js +14 -0
  764. package/dist/_internal/components/form/Toggle/Toggle.styles.js.map +1 -0
  765. package/dist/_internal/components/form/Toggle/Toggle.types.js +1 -0
  766. package/dist/_internal/components/form/Toggle/Toggle.types.js.map +1 -0
  767. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +8 -0
  768. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js.map +1 -0
  769. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.types.js +1 -0
  770. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.types.js.map +1 -0
  771. package/dist/_internal/components/form/UploadButton/UploadButton.hooks.js +8 -0
  772. package/dist/_internal/components/form/UploadButton/UploadButton.hooks.js.map +1 -0
  773. package/dist/_internal/components/form/UploadButton/UploadButton.js +10 -0
  774. package/dist/_internal/components/form/UploadButton/UploadButton.js.map +1 -0
  775. package/dist/_internal/components/form/UploadButton/UploadButton.parts.js +12 -0
  776. package/dist/_internal/components/form/UploadButton/UploadButton.parts.js.map +1 -0
  777. package/dist/_internal/components/form/UploadButton/UploadButton.types.js +1 -0
  778. package/dist/_internal/components/form/UploadButton/UploadButton.types.js.map +1 -0
  779. package/dist/_internal/components/form/index.js +250 -0
  780. package/dist/_internal/components/form/index.js.map +1 -0
  781. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +30 -0
  782. package/dist/_internal/components/form/total-form/Fields/CategoryField.js.map +1 -0
  783. package/dist/_internal/components/form/total-form/Fields/CepField.js +19 -0
  784. package/dist/_internal/components/form/total-form/Fields/CepField.js.map +1 -0
  785. package/dist/_internal/components/form/total-form/Fields/SelectField.js +14 -0
  786. package/dist/_internal/components/form/total-form/Fields/SelectField.js.map +1 -0
  787. package/dist/_internal/components/form/total-form/Fields/TextField.js +17 -0
  788. package/dist/_internal/components/form/total-form/Fields/TextField.js.map +1 -0
  789. package/dist/_internal/components/form/total-form/Fields/ToggleField.js +14 -0
  790. package/dist/_internal/components/form/total-form/Fields/ToggleField.js.map +1 -0
  791. package/dist/_internal/components/form/total-form/Fields/index.js +57 -0
  792. package/dist/_internal/components/form/total-form/Fields/index.js.map +1 -0
  793. package/dist/_internal/components/form/total-form/FormContainer.js +12 -0
  794. package/dist/_internal/components/form/total-form/FormContainer.js.map +1 -0
  795. package/dist/_internal/components/form/total-form/FormContext.js +11 -0
  796. package/dist/_internal/components/form/total-form/FormContext.js.map +1 -0
  797. package/dist/_internal/components/form/total-form/FormErrorSnackbar.js +12 -0
  798. package/dist/_internal/components/form/total-form/FormErrorSnackbar.js.map +1 -0
  799. package/dist/_internal/components/form/total-form/SubmitButton.js +14 -0
  800. package/dist/_internal/components/form/total-form/SubmitButton.js.map +1 -0
  801. package/dist/_internal/components/index.js +954 -0
  802. package/dist/_internal/components/index.js.map +1 -0
  803. package/dist/_internal/components/layout/Accordion/Accordion.js +15 -0
  804. package/dist/_internal/components/layout/Accordion/Accordion.js.map +1 -0
  805. package/dist/_internal/components/layout/Accordion/Accordion.styles.js +8 -0
  806. package/dist/_internal/components/layout/Accordion/Accordion.styles.js.map +1 -0
  807. package/dist/_internal/components/layout/Accordion/Accordion.types.js +1 -0
  808. package/dist/_internal/components/layout/Accordion/Accordion.types.js.map +1 -0
  809. package/dist/_internal/components/layout/Card/Card.helpers.js +8 -0
  810. package/dist/_internal/components/layout/Card/Card.helpers.js.map +1 -0
  811. package/dist/_internal/components/layout/Card/Card.js +18 -0
  812. package/dist/_internal/components/layout/Card/Card.js.map +1 -0
  813. package/dist/_internal/components/layout/Card/Card.styles.js +8 -0
  814. package/dist/_internal/components/layout/Card/Card.styles.js.map +1 -0
  815. package/dist/_internal/components/layout/Card/Card.types.js +1 -0
  816. package/dist/_internal/components/layout/Card/Card.types.js.map +1 -0
  817. package/dist/_internal/components/layout/CardGrid/CardGrid.js +9 -0
  818. package/dist/_internal/components/layout/CardGrid/CardGrid.js.map +1 -0
  819. package/dist/_internal/components/layout/Collapsible/Collapsible.helpers.js +14 -0
  820. package/dist/_internal/components/layout/Collapsible/Collapsible.helpers.js.map +1 -0
  821. package/dist/_internal/components/layout/Collapsible/Collapsible.js +13 -0
  822. package/dist/_internal/components/layout/Collapsible/Collapsible.js.map +1 -0
  823. package/dist/_internal/components/layout/Collapsible/Collapsible.types.js +1 -0
  824. package/dist/_internal/components/layout/Collapsible/Collapsible.types.js.map +1 -0
  825. package/dist/_internal/components/layout/Container/Container.js +8 -0
  826. package/dist/_internal/components/layout/Container/Container.js.map +1 -0
  827. package/dist/_internal/components/layout/Container/Container.types.js +1 -0
  828. package/dist/_internal/components/layout/Container/Container.types.js.map +1 -0
  829. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +9 -0
  830. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js.map +1 -0
  831. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.js +9 -0
  832. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.js.map +1 -0
  833. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.types.js +1 -0
  834. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.types.js.map +1 -0
  835. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +9 -0
  836. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js.map +1 -0
  837. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +10 -0
  838. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js.map +1 -0
  839. package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +15 -0
  840. package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js.map +1 -0
  841. package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +9 -0
  842. package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js.map +1 -0
  843. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +9 -0
  844. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js.map +1 -0
  845. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +9 -0
  846. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js.map +1 -0
  847. package/dist/_internal/components/layout/Dashboard/Dashboard.js +15 -0
  848. package/dist/_internal/components/layout/Dashboard/Dashboard.js.map +1 -0
  849. package/dist/_internal/components/layout/Dashboard/Dashboard.types.js +1 -0
  850. package/dist/_internal/components/layout/Dashboard/Dashboard.types.js.map +1 -0
  851. package/dist/_internal/components/layout/Dashboard/DashboardContext.js +11 -0
  852. package/dist/_internal/components/layout/Dashboard/DashboardContext.js.map +1 -0
  853. package/dist/_internal/components/layout/Dashboard/DashboardParts.js +22 -0
  854. package/dist/_internal/components/layout/Dashboard/DashboardParts.js.map +1 -0
  855. package/dist/_internal/components/layout/Drawer/Drawer.js +12 -0
  856. package/dist/_internal/components/layout/Drawer/Drawer.js.map +1 -0
  857. package/dist/_internal/components/layout/Drawer/Drawer.types.js +1 -0
  858. package/dist/_internal/components/layout/Drawer/Drawer.types.js.map +1 -0
  859. package/dist/_internal/components/layout/Resizable/Resizable.helpers.js +14 -0
  860. package/dist/_internal/components/layout/Resizable/Resizable.helpers.js.map +1 -0
  861. package/dist/_internal/components/layout/Resizable/Resizable.hooks.js +9 -0
  862. package/dist/_internal/components/layout/Resizable/Resizable.hooks.js.map +1 -0
  863. package/dist/_internal/components/layout/Resizable/Resizable.js +10 -0
  864. package/dist/_internal/components/layout/Resizable/Resizable.js.map +1 -0
  865. package/dist/_internal/components/layout/Resizable/Resizable.types.js +1 -0
  866. package/dist/_internal/components/layout/Resizable/Resizable.types.js.map +1 -0
  867. package/dist/_internal/components/layout/ScrollArea/ScrollArea.helpers.js +8 -0
  868. package/dist/_internal/components/layout/ScrollArea/ScrollArea.helpers.js.map +1 -0
  869. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +12 -0
  870. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js.map +1 -0
  871. package/dist/_internal/components/layout/ScrollArea/ScrollArea.styles.js +10 -0
  872. package/dist/_internal/components/layout/ScrollArea/ScrollArea.styles.js.map +1 -0
  873. package/dist/_internal/components/layout/ScrollArea/ScrollArea.types.js +1 -0
  874. package/dist/_internal/components/layout/ScrollArea/ScrollArea.types.js.map +1 -0
  875. package/dist/_internal/components/layout/ScrollArea/ScrollAreaContent.js +8 -0
  876. package/dist/_internal/components/layout/ScrollArea/ScrollAreaContent.js.map +1 -0
  877. package/dist/_internal/components/layout/ScrollArea/ScrollViewport.js +9 -0
  878. package/dist/_internal/components/layout/ScrollArea/ScrollViewport.js.map +1 -0
  879. package/dist/_internal/components/layout/Separator/Separator.js +9 -0
  880. package/dist/_internal/components/layout/Separator/Separator.js.map +1 -0
  881. package/dist/_internal/components/layout/Separator/Separator.styles.js +10 -0
  882. package/dist/_internal/components/layout/Separator/Separator.styles.js.map +1 -0
  883. package/dist/_internal/components/layout/Separator/Separator.types.js +1 -0
  884. package/dist/_internal/components/layout/Separator/Separator.types.js.map +1 -0
  885. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.filters.js +10 -0
  886. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.filters.js.map +1 -0
  887. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.items.js +13 -0
  888. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.items.js.map +1 -0
  889. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +18 -0
  890. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js.map +1 -0
  891. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.rail.js +12 -0
  892. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.rail.js.map +1 -0
  893. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.styles.js +18 -0
  894. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.styles.js.map +1 -0
  895. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.types.js +1 -0
  896. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.types.js.map +1 -0
  897. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +13 -0
  898. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js.map +1 -0
  899. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +11 -0
  900. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js.map +1 -0
  901. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionHeader.js +10 -0
  902. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionHeader.js.map +1 -0
  903. package/dist/_internal/components/layout/SettingsLayout/SettingsStatusMarker.js +10 -0
  904. package/dist/_internal/components/layout/SettingsLayout/SettingsStatusMarker.js.map +1 -0
  905. package/dist/_internal/components/layout/Sidebar/Sidebar.js +14 -0
  906. package/dist/_internal/components/layout/Sidebar/Sidebar.js.map +1 -0
  907. package/dist/_internal/components/layout/Sidebar/Sidebar.types.js +1 -0
  908. package/dist/_internal/components/layout/Sidebar/Sidebar.types.js.map +1 -0
  909. package/dist/_internal/components/layout/Skeleton/Skeleton.helpers.js +8 -0
  910. package/dist/_internal/components/layout/Skeleton/Skeleton.helpers.js.map +1 -0
  911. package/dist/_internal/components/layout/Skeleton/Skeleton.js +10 -0
  912. package/dist/_internal/components/layout/Skeleton/Skeleton.js.map +1 -0
  913. package/dist/_internal/components/layout/Skeleton/Skeleton.styles.js +14 -0
  914. package/dist/_internal/components/layout/Skeleton/Skeleton.styles.js.map +1 -0
  915. package/dist/_internal/components/layout/Skeleton/Skeleton.types.js +1 -0
  916. package/dist/_internal/components/layout/Skeleton/Skeleton.types.js.map +1 -0
  917. package/dist/_internal/components/layout/Spacer/Spacer.js +8 -0
  918. package/dist/_internal/components/layout/Spacer/Spacer.js.map +1 -0
  919. package/dist/_internal/components/layout/Spacer/Spacer.types.js +1 -0
  920. package/dist/_internal/components/layout/Spacer/Spacer.types.js.map +1 -0
  921. package/dist/_internal/components/layout/TableFilter/TableFilter.js +10 -0
  922. package/dist/_internal/components/layout/TableFilter/TableFilter.js.map +1 -0
  923. package/dist/_internal/components/layout/TableFilter/TableFilter.types.js +1 -0
  924. package/dist/_internal/components/layout/TableFilter/TableFilter.types.js.map +1 -0
  925. package/dist/_internal/components/layout/TableFilter/TableFilterContext.js +11 -0
  926. package/dist/_internal/components/layout/TableFilter/TableFilterContext.js.map +1 -0
  927. package/dist/_internal/components/layout/index.js +155 -0
  928. package/dist/_internal/components/layout/index.js.map +1 -0
  929. package/dist/_internal/components/navigation/AppHeader/AppHeader.brand.js +12 -0
  930. package/dist/_internal/components/navigation/AppHeader/AppHeader.brand.js.map +1 -0
  931. package/dist/_internal/components/navigation/AppHeader/AppHeader.colors.js +12 -0
  932. package/dist/_internal/components/navigation/AppHeader/AppHeader.colors.js.map +1 -0
  933. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +24 -0
  934. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js.map +1 -0
  935. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +14 -0
  936. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js.map +1 -0
  937. package/dist/_internal/components/navigation/AppHeader/AppHeader.js +12 -0
  938. package/dist/_internal/components/navigation/AppHeader/AppHeader.js.map +1 -0
  939. package/dist/_internal/components/navigation/AppHeader/AppHeader.types.js +1 -0
  940. package/dist/_internal/components/navigation/AppHeader/AppHeader.types.js.map +1 -0
  941. package/dist/_internal/components/navigation/Breadcrumbs/BreadcrumbEntry.js +9 -0
  942. package/dist/_internal/components/navigation/Breadcrumbs/BreadcrumbEntry.js.map +1 -0
  943. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.js +10 -0
  944. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -0
  945. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.styles.js +16 -0
  946. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.styles.js.map +1 -0
  947. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.types.js +1 -0
  948. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.types.js.map +1 -0
  949. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.helpers.js +12 -0
  950. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.helpers.js.map +1 -0
  951. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.hooks.js +9 -0
  952. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.hooks.js.map +1 -0
  953. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +14 -0
  954. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js.map +1 -0
  955. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.types.js +1 -0
  956. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.types.js.map +1 -0
  957. package/dist/_internal/components/navigation/CommandPalette/CommandPaletteResults.js +9 -0
  958. package/dist/_internal/components/navigation/CommandPalette/CommandPaletteResults.js.map +1 -0
  959. package/dist/_internal/components/navigation/CommandPalette/ShortcutChip.js +8 -0
  960. package/dist/_internal/components/navigation/CommandPalette/ShortcutChip.js.map +1 -0
  961. package/dist/_internal/components/navigation/ContextMenu/ContextMenu.js +8 -0
  962. package/dist/_internal/components/navigation/ContextMenu/ContextMenu.js.map +1 -0
  963. package/dist/_internal/components/navigation/ContextMenu/ContextMenu.types.js +1 -0
  964. package/dist/_internal/components/navigation/ContextMenu/ContextMenu.types.js.map +1 -0
  965. package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.js +8 -0
  966. package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.js.map +1 -0
  967. package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.types.js +1 -0
  968. package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.types.js.map +1 -0
  969. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +12 -0
  970. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js.map +1 -0
  971. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +14 -0
  972. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js.map +1 -0
  973. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.shell.js +17 -0
  974. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.shell.js.map +1 -0
  975. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.styles.js +12 -0
  976. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.styles.js.map +1 -0
  977. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.types.js +1 -0
  978. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.types.js.map +1 -0
  979. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.hooks.js +8 -0
  980. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.hooks.js.map +1 -0
  981. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +10 -0
  982. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js.map +1 -0
  983. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +12 -0
  984. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js.map +1 -0
  985. package/dist/_internal/components/navigation/Pagination/Pagination.helpers.js +14 -0
  986. package/dist/_internal/components/navigation/Pagination/Pagination.helpers.js.map +1 -0
  987. package/dist/_internal/components/navigation/Pagination/Pagination.js +11 -0
  988. package/dist/_internal/components/navigation/Pagination/Pagination.js.map +1 -0
  989. package/dist/_internal/components/navigation/Pagination/Pagination.styles.js +8 -0
  990. package/dist/_internal/components/navigation/Pagination/Pagination.styles.js.map +1 -0
  991. package/dist/_internal/components/navigation/Pagination/Pagination.types.js +1 -0
  992. package/dist/_internal/components/navigation/Pagination/Pagination.types.js.map +1 -0
  993. package/dist/_internal/components/navigation/Pagination/PaginationParts.js +11 -0
  994. package/dist/_internal/components/navigation/Pagination/PaginationParts.js.map +1 -0
  995. package/dist/_internal/components/navigation/Tabs/Tabs.js +10 -0
  996. package/dist/_internal/components/navigation/Tabs/Tabs.js.map +1 -0
  997. package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +8 -0
  998. package/dist/_internal/components/navigation/Tabs/Tabs.styles.js.map +1 -0
  999. package/dist/_internal/components/navigation/Tabs/Tabs.types.js +1 -0
  1000. package/dist/_internal/components/navigation/Tabs/Tabs.types.js.map +1 -0
  1001. package/dist/_internal/components/navigation/Tabs/TabsPanel.js +8 -0
  1002. package/dist/_internal/components/navigation/Tabs/TabsPanel.js.map +1 -0
  1003. package/dist/_internal/components/navigation/index.js +98 -0
  1004. package/dist/_internal/components/navigation/index.js.map +1 -0
  1005. package/dist/_internal/components/typography/Blockquote/Blockquote.js +8 -0
  1006. package/dist/_internal/components/typography/Blockquote/Blockquote.js.map +1 -0
  1007. package/dist/_internal/components/typography/Blockquote/Blockquote.types.js +1 -0
  1008. package/dist/_internal/components/typography/Blockquote/Blockquote.types.js.map +1 -0
  1009. package/dist/_internal/components/typography/Code/Code.js +8 -0
  1010. package/dist/_internal/components/typography/Code/Code.js.map +1 -0
  1011. package/dist/_internal/components/typography/Code/Code.types.js +1 -0
  1012. package/dist/_internal/components/typography/Code/Code.types.js.map +1 -0
  1013. package/dist/_internal/components/typography/Heading/Heading.js +9 -0
  1014. package/dist/_internal/components/typography/Heading/Heading.js.map +1 -0
  1015. package/dist/_internal/components/typography/Heading/Heading.styles.js +8 -0
  1016. package/dist/_internal/components/typography/Heading/Heading.styles.js.map +1 -0
  1017. package/dist/_internal/components/typography/Heading/Heading.types.js +1 -0
  1018. package/dist/_internal/components/typography/Heading/Heading.types.js.map +1 -0
  1019. package/dist/_internal/components/typography/Paragraph/Paragraph.js +8 -0
  1020. package/dist/_internal/components/typography/Paragraph/Paragraph.js.map +1 -0
  1021. package/dist/_internal/components/typography/Paragraph/Paragraph.types.js +1 -0
  1022. package/dist/_internal/components/typography/Paragraph/Paragraph.types.js.map +1 -0
  1023. package/dist/_internal/components/typography/Text/Text.js +9 -0
  1024. package/dist/_internal/components/typography/Text/Text.js.map +1 -0
  1025. package/dist/_internal/components/typography/Text/Text.types.js +1 -0
  1026. package/dist/_internal/components/typography/Text/Text.types.js.map +1 -0
  1027. package/dist/_internal/components/typography/index.js +29 -0
  1028. package/dist/_internal/components/typography/index.js.map +1 -0
  1029. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.animations.js +42 -0
  1030. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.animations.js.map +1 -0
  1031. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.js +13 -0
  1032. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.js.map +1 -0
  1033. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.styles.js +11 -0
  1034. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.styles.js.map +1 -0
  1035. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.types.js +1 -0
  1036. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.types.js.map +1 -0
  1037. package/dist/_internal/components/utility/AspectRatio/AspectRatio.js +8 -0
  1038. package/dist/_internal/components/utility/AspectRatio/AspectRatio.js.map +1 -0
  1039. package/dist/_internal/components/utility/AspectRatio/AspectRatio.types.js +1 -0
  1040. package/dist/_internal/components/utility/AspectRatio/AspectRatio.types.js.map +1 -0
  1041. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.hooks.js +10 -0
  1042. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.hooks.js.map +1 -0
  1043. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +10 -0
  1044. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js.map +1 -0
  1045. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.parts.js +14 -0
  1046. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.parts.js.map +1 -0
  1047. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.types.js +1 -0
  1048. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.types.js.map +1 -0
  1049. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.earlyCapture.js +16 -0
  1050. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.earlyCapture.js.map +1 -0
  1051. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.helpers.js +22 -0
  1052. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.helpers.js.map +1 -0
  1053. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +12 -0
  1054. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js.map +1 -0
  1055. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.styles.js +8 -0
  1056. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.styles.js.map +1 -0
  1057. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.types.js +1 -0
  1058. package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.types.js.map +1 -0
  1059. package/dist/_internal/components/utility/InstallPrompt/usePwaInstall.js +10 -0
  1060. package/dist/_internal/components/utility/InstallPrompt/usePwaInstall.js.map +1 -0
  1061. package/dist/_internal/components/utility/Overflow/overflow.js +11 -0
  1062. package/dist/_internal/components/utility/Overflow/overflow.js.map +1 -0
  1063. package/dist/_internal/components/utility/Portal/Portal.button-container.example.js +93 -0
  1064. package/dist/_internal/components/utility/Portal/Portal.button-container.example.js.map +1 -0
  1065. package/dist/_internal/components/utility/Portal/Portal.js +8 -0
  1066. package/dist/_internal/components/utility/Portal/Portal.js.map +1 -0
  1067. package/dist/_internal/components/utility/Portal/Portal.types.js +1 -0
  1068. package/dist/_internal/components/utility/Portal/Portal.types.js.map +1 -0
  1069. package/dist/_internal/components/utility/Transition/Transition.helpers.js +10 -0
  1070. package/dist/_internal/components/utility/Transition/Transition.helpers.js.map +1 -0
  1071. package/dist/_internal/components/utility/Transition/Transition.js +9 -0
  1072. package/dist/_internal/components/utility/Transition/Transition.js.map +1 -0
  1073. package/dist/_internal/components/utility/Transition/Transition.types.js +1 -0
  1074. package/dist/_internal/components/utility/Transition/Transition.types.js.map +1 -0
  1075. package/dist/_internal/components/utility/VirtualList/VirtualList.hooks.js +10 -0
  1076. package/dist/_internal/components/utility/VirtualList/VirtualList.hooks.js.map +1 -0
  1077. package/dist/_internal/components/utility/VirtualList/VirtualList.js +11 -0
  1078. package/dist/_internal/components/utility/VirtualList/VirtualList.js.map +1 -0
  1079. package/dist/_internal/components/utility/VirtualList/VirtualList.types.js +1 -0
  1080. package/dist/_internal/components/utility/VirtualList/VirtualList.types.js.map +1 -0
  1081. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +16 -0
  1082. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js.map +1 -0
  1083. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +13 -0
  1084. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js.map +1 -0
  1085. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +15 -0
  1086. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js.map +1 -0
  1087. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.types.js +1 -0
  1088. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.types.js.map +1 -0
  1089. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +10 -0
  1090. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js.map +1 -0
  1091. package/dist/_internal/components/utility/index.js +82 -0
  1092. package/dist/_internal/components/utility/index.js.map +1 -0
  1093. package/dist/_internal/copy/data-display.js +1 -0
  1094. package/dist/_internal/copy/data-display.js.map +1 -0
  1095. package/dist/_internal/copy/feedback.js +1 -0
  1096. package/dist/_internal/copy/feedback.js.map +1 -0
  1097. package/dist/_internal/copy/form.js +1 -0
  1098. package/dist/_internal/copy/form.js.map +1 -0
  1099. package/dist/_internal/copy/layout.js +1 -0
  1100. package/dist/_internal/copy/layout.js.map +1 -0
  1101. package/dist/_internal/copy/navigation.js +1 -0
  1102. package/dist/_internal/copy/navigation.js.map +1 -0
  1103. package/dist/_internal/copy/shared.js +1 -0
  1104. package/dist/_internal/copy/shared.js.map +1 -0
  1105. package/dist/_internal/copy/utility.js +1 -0
  1106. package/dist/_internal/copy/utility.js.map +1 -0
  1107. package/dist/_internal/en-US.data-display.js +20 -0
  1108. package/dist/_internal/en-US.data-display.js.map +1 -0
  1109. package/dist/_internal/en-US.feedback.js +10 -0
  1110. package/dist/_internal/en-US.feedback.js.map +1 -0
  1111. package/dist/_internal/en-US.form.js +20 -0
  1112. package/dist/_internal/en-US.form.js.map +1 -0
  1113. package/dist/_internal/en-US.layout.js +8 -0
  1114. package/dist/_internal/en-US.layout.js.map +1 -0
  1115. package/dist/_internal/en-US.navigation.js +10 -0
  1116. package/dist/_internal/en-US.navigation.js.map +1 -0
  1117. package/dist/_internal/en-US.shared.js +16 -0
  1118. package/dist/_internal/en-US.shared.js.map +1 -0
  1119. package/dist/_internal/en-US.utility.js +10 -0
  1120. package/dist/_internal/en-US.utility.js.map +1 -0
  1121. package/dist/_internal/pt-BR.data-display.js +20 -0
  1122. package/dist/_internal/pt-BR.data-display.js.map +1 -0
  1123. package/dist/_internal/pt-BR.feedback.js +10 -0
  1124. package/dist/_internal/pt-BR.feedback.js.map +1 -0
  1125. package/dist/_internal/pt-BR.form.js +20 -0
  1126. package/dist/_internal/pt-BR.form.js.map +1 -0
  1127. package/dist/_internal/pt-BR.layout.js +8 -0
  1128. package/dist/_internal/pt-BR.layout.js.map +1 -0
  1129. package/dist/_internal/pt-BR.navigation.js +10 -0
  1130. package/dist/_internal/pt-BR.navigation.js.map +1 -0
  1131. package/dist/_internal/pt-BR.shared.js +16 -0
  1132. package/dist/_internal/pt-BR.shared.js.map +1 -0
  1133. package/dist/_internal/pt-BR.utility.js +10 -0
  1134. package/dist/_internal/pt-BR.utility.js.map +1 -0
  1135. package/dist/_internal/social-login-button/social-login-button.js +33 -0
  1136. package/dist/_internal/social-login-button/social-login-button.js.map +1 -0
  1137. package/dist/_internal/user-avatar/user-avatar.js +24 -0
  1138. package/dist/_internal/user-avatar/user-avatar.js.map +1 -0
  1139. package/dist/_internal/utils/cn.js +8 -0
  1140. package/dist/_internal/utils/cn.js.map +1 -0
  1141. package/dist/_internal/utils/export-rows.js +8 -0
  1142. package/dist/_internal/utils/export-rows.js.map +1 -0
  1143. package/dist/_internal/utils/viewport.js +14 -0
  1144. package/dist/_internal/utils/viewport.js.map +1 -0
  1145. package/dist/_internal/utils/withDefaults.js +8 -0
  1146. package/dist/_internal/utils/withDefaults.js.map +1 -0
  1147. package/dist/button.js +3 -14
  1148. package/dist/button.js.map +1 -1
  1149. package/dist/charts.js +27 -12
  1150. package/dist/chunk-25ZHYJIV.js +225 -0
  1151. package/dist/chunk-25ZHYJIV.js.map +1 -0
  1152. package/dist/chunk-2CNG6YIC.js +41 -0
  1153. package/dist/chunk-2CNG6YIC.js.map +1 -0
  1154. package/dist/chunk-2DGJMXCD.js +115 -0
  1155. package/dist/chunk-2DGJMXCD.js.map +1 -0
  1156. package/dist/chunk-2DWBJJK6.js +40 -0
  1157. package/dist/chunk-2DWBJJK6.js.map +1 -0
  1158. package/dist/chunk-2GSIEDGN.js +1 -0
  1159. package/dist/chunk-2GSIEDGN.js.map +1 -0
  1160. package/dist/chunk-2IBFEHIX.js +1 -0
  1161. package/dist/chunk-2IBFEHIX.js.map +1 -0
  1162. package/dist/chunk-2JCRNWHE.js +22 -0
  1163. package/dist/chunk-2JCRNWHE.js.map +1 -0
  1164. package/dist/chunk-2JM65A4D.js +282 -0
  1165. package/dist/chunk-2LXHUGYB.js +1 -0
  1166. package/dist/chunk-2LXHUGYB.js.map +1 -0
  1167. package/dist/chunk-2O4TCECH.js +165 -0
  1168. package/dist/chunk-2O4TCECH.js.map +1 -0
  1169. package/dist/chunk-2ODSAREY.js +62 -0
  1170. package/dist/chunk-2ODSAREY.js.map +1 -0
  1171. package/dist/chunk-2UXQV7JY.js +323 -0
  1172. package/dist/chunk-2UXQV7JY.js.map +1 -0
  1173. package/dist/chunk-2W62GAT7.js +142 -0
  1174. package/dist/chunk-2W62GAT7.js.map +1 -0
  1175. package/dist/chunk-2WFDHFK4.js +52 -0
  1176. package/dist/chunk-2WFDHFK4.js.map +1 -0
  1177. package/dist/chunk-2XGJO7OO.js +54 -0
  1178. package/dist/chunk-2XGJO7OO.js.map +1 -0
  1179. package/dist/chunk-33LAPBYB.js +90 -0
  1180. package/dist/chunk-33LAPBYB.js.map +1 -0
  1181. package/dist/chunk-362OGE5J.js +261 -0
  1182. package/dist/chunk-362OGE5J.js.map +1 -0
  1183. package/dist/chunk-366747RT.js +236 -0
  1184. package/dist/chunk-366747RT.js.map +1 -0
  1185. package/dist/chunk-36NAZ2M5.js +33 -0
  1186. package/dist/chunk-36NAZ2M5.js.map +1 -0
  1187. package/dist/chunk-3CCUSLS2.js +53 -0
  1188. package/dist/chunk-3CCUSLS2.js.map +1 -0
  1189. package/dist/chunk-3CM277NN.js +75 -0
  1190. package/dist/chunk-3CM277NN.js.map +1 -0
  1191. package/dist/chunk-3D5J7R44.js +159 -0
  1192. package/dist/chunk-3D5J7R44.js.map +1 -0
  1193. package/dist/chunk-3EYRRVNT.js +64 -0
  1194. package/dist/chunk-3EYRRVNT.js.map +1 -0
  1195. package/dist/chunk-3FQ4Q6PX.js +61 -0
  1196. package/dist/chunk-3FQ4Q6PX.js.map +1 -0
  1197. package/dist/chunk-3HLKTBEO.js +21 -0
  1198. package/dist/chunk-3HLKTBEO.js.map +1 -0
  1199. package/dist/chunk-3IDY6OUA.js +49 -0
  1200. package/dist/chunk-3IDY6OUA.js.map +1 -0
  1201. package/dist/chunk-3JDP5OUR.js +55 -0
  1202. package/dist/chunk-3JDP5OUR.js.map +1 -0
  1203. package/dist/chunk-3L5OZCGA.js +100 -0
  1204. package/dist/chunk-3L5OZCGA.js.map +1 -0
  1205. package/dist/chunk-3P3LKQLE.js +293 -0
  1206. package/dist/chunk-3P3LKQLE.js.map +1 -0
  1207. package/dist/chunk-3QQVEYOR.js +1 -0
  1208. package/dist/chunk-3QQVEYOR.js.map +1 -0
  1209. package/dist/chunk-3VMXOGGI.js +1 -0
  1210. package/dist/chunk-3VMXOGGI.js.map +1 -0
  1211. package/dist/chunk-42VH7N5L.js +32 -0
  1212. package/dist/chunk-42VH7N5L.js.map +1 -0
  1213. package/dist/chunk-42Z34CKA.js +51 -0
  1214. package/dist/chunk-42Z34CKA.js.map +1 -0
  1215. package/dist/chunk-46UPILLK.js +189 -0
  1216. package/dist/chunk-46UPILLK.js.map +1 -0
  1217. package/dist/chunk-4DKJGJNZ.js +133 -0
  1218. package/dist/chunk-4DKJGJNZ.js.map +1 -0
  1219. package/dist/chunk-4EGKGOV2.js +187 -0
  1220. package/dist/chunk-4EGKGOV2.js.map +1 -0
  1221. package/dist/chunk-4GMSUI77.js +26 -0
  1222. package/dist/chunk-4GMSUI77.js.map +1 -0
  1223. package/dist/chunk-4HD5I7QO.js +200 -0
  1224. package/dist/chunk-4HD5I7QO.js.map +1 -0
  1225. package/dist/chunk-4HISFKZU.js +94 -0
  1226. package/dist/chunk-4HISFKZU.js.map +1 -0
  1227. package/dist/chunk-4HJOBQ7X.js +96 -0
  1228. package/dist/chunk-4HJOBQ7X.js.map +1 -0
  1229. package/dist/chunk-4MTMMCPZ.js +24 -0
  1230. package/dist/chunk-4MTMMCPZ.js.map +1 -0
  1231. package/dist/chunk-4N244WVL.js +1 -0
  1232. package/dist/chunk-4N244WVL.js.map +1 -0
  1233. package/dist/chunk-4N2XGPP7.js +338 -0
  1234. package/dist/chunk-4N2XGPP7.js.map +1 -0
  1235. package/dist/chunk-4NS4PJJH.js +1 -0
  1236. package/dist/chunk-4NS4PJJH.js.map +1 -0
  1237. package/dist/chunk-4PJ52YBO.js +1 -0
  1238. package/dist/chunk-4PJ52YBO.js.map +1 -0
  1239. package/dist/chunk-4R7QDDKR.js +206 -0
  1240. package/dist/chunk-4RKBX2DV.js +183 -0
  1241. package/dist/chunk-4RKBX2DV.js.map +1 -0
  1242. package/dist/chunk-4V532JF6.js +58 -0
  1243. package/dist/chunk-4V532JF6.js.map +1 -0
  1244. package/dist/chunk-4VRDFZ4G.js +59 -0
  1245. package/dist/chunk-4VRDFZ4G.js.map +1 -0
  1246. package/dist/chunk-4XK6JQ4D.js +16 -0
  1247. package/dist/chunk-4XK6JQ4D.js.map +1 -0
  1248. package/dist/chunk-53AAAF37.js +1 -0
  1249. package/dist/chunk-53AAAF37.js.map +1 -0
  1250. package/dist/chunk-54OVGXLV.js +85 -0
  1251. package/dist/chunk-54OVGXLV.js.map +1 -0
  1252. package/dist/chunk-56J55PEI.js +246 -0
  1253. package/dist/chunk-56J55PEI.js.map +1 -0
  1254. package/dist/chunk-56O2UXSW.js +80 -0
  1255. package/dist/chunk-56O2UXSW.js.map +1 -0
  1256. package/dist/chunk-56SJYTIT.js +55 -0
  1257. package/dist/chunk-56SJYTIT.js.map +1 -0
  1258. package/dist/chunk-573PQ6C6.js +1 -0
  1259. package/dist/chunk-573PQ6C6.js.map +1 -0
  1260. package/dist/chunk-5CUKSNWG.js +1 -0
  1261. package/dist/chunk-5CUKSNWG.js.map +1 -0
  1262. package/dist/chunk-5DBUZVTU.js +51 -0
  1263. package/dist/chunk-5DBUZVTU.js.map +1 -0
  1264. package/dist/chunk-5GNSZHXD.js +34 -0
  1265. package/dist/chunk-5GNSZHXD.js.map +1 -0
  1266. package/dist/chunk-5IFSSVYP.js +95 -0
  1267. package/dist/chunk-5IFSSVYP.js.map +1 -0
  1268. package/dist/chunk-5KLSLD72.js +1 -0
  1269. package/dist/chunk-5KLSLD72.js.map +1 -0
  1270. package/dist/chunk-5M4TYFR3.js +27 -0
  1271. package/dist/chunk-5M4TYFR3.js.map +1 -0
  1272. package/dist/chunk-5MXVT7DO.js +14 -0
  1273. package/dist/chunk-5MXVT7DO.js.map +1 -0
  1274. package/dist/chunk-5P6OV64V.js +38 -0
  1275. package/dist/chunk-5P6OV64V.js.map +1 -0
  1276. package/dist/chunk-5VCCFXSM.js +25 -0
  1277. package/dist/chunk-5VCCFXSM.js.map +1 -0
  1278. package/dist/chunk-5WN6ZIAH.js +328 -0
  1279. package/dist/chunk-5WN6ZIAH.js.map +1 -0
  1280. package/dist/chunk-5XY7BFFP.js +37 -0
  1281. package/dist/chunk-5XY7BFFP.js.map +1 -0
  1282. package/dist/chunk-5ZFO7ROE.js +1 -0
  1283. package/dist/chunk-5ZFO7ROE.js.map +1 -0
  1284. package/dist/chunk-62FET2BM.js +1 -0
  1285. package/dist/chunk-62FET2BM.js.map +1 -0
  1286. package/dist/chunk-62FKAPLI.js +104 -0
  1287. package/dist/chunk-62FKAPLI.js.map +1 -0
  1288. package/dist/chunk-62OGPVCL.js +18 -0
  1289. package/dist/chunk-62OGPVCL.js.map +1 -0
  1290. package/dist/chunk-63ZWSFEW.js +85 -0
  1291. package/dist/chunk-63ZWSFEW.js.map +1 -0
  1292. package/dist/chunk-6A2SQM5W.js +193 -0
  1293. package/dist/chunk-6A2SQM5W.js.map +1 -0
  1294. package/dist/chunk-6AVN3CIZ.js +190 -0
  1295. package/dist/chunk-6AVN3CIZ.js.map +1 -0
  1296. package/dist/chunk-6B5VS2ER.js +94 -0
  1297. package/dist/chunk-6B5VS2ER.js.map +1 -0
  1298. package/dist/chunk-6BSAQPKT.js +91 -0
  1299. package/dist/chunk-6BSAQPKT.js.map +1 -0
  1300. package/dist/chunk-6CUNJ4JF.js +1 -0
  1301. package/dist/chunk-6CUNJ4JF.js.map +1 -0
  1302. package/dist/chunk-6DN4ZULV.js +139 -0
  1303. package/dist/chunk-6DN4ZULV.js.map +1 -0
  1304. package/dist/chunk-6GP2DOOO.js +1 -0
  1305. package/dist/chunk-6GP2DOOO.js.map +1 -0
  1306. package/dist/chunk-6HLWZR3X.js +32 -0
  1307. package/dist/chunk-6HLWZR3X.js.map +1 -0
  1308. package/dist/chunk-6I3TYKE2.js +1 -0
  1309. package/dist/chunk-6I3TYKE2.js.map +1 -0
  1310. package/dist/chunk-6IAQGSXD.js +99 -0
  1311. package/dist/chunk-6IAQGSXD.js.map +1 -0
  1312. package/dist/chunk-6J7WX3GX.js +167 -0
  1313. package/dist/chunk-6J7WX3GX.js.map +1 -0
  1314. package/dist/chunk-6M5UKP62.js +76 -0
  1315. package/dist/chunk-6M5UKP62.js.map +1 -0
  1316. package/dist/chunk-6MWS5OHP.js +207 -0
  1317. package/dist/chunk-6MWS5OHP.js.map +1 -0
  1318. package/dist/chunk-6OS4AKWT.js +1 -0
  1319. package/dist/chunk-6OS4AKWT.js.map +1 -0
  1320. package/dist/chunk-6PFNFMGY.js +53 -0
  1321. package/dist/chunk-6PFNFMGY.js.map +1 -0
  1322. package/dist/chunk-6S7RF73B.js +166 -0
  1323. package/dist/chunk-6S7RF73B.js.map +1 -0
  1324. package/dist/chunk-6VRUI5JF.js +175 -0
  1325. package/dist/chunk-6VRUI5JF.js.map +1 -0
  1326. package/dist/chunk-6VTLJWCK.js +249 -0
  1327. package/dist/chunk-6VTLJWCK.js.map +1 -0
  1328. package/dist/chunk-6WUP22G7.js +306 -0
  1329. package/dist/chunk-6WUP22G7.js.map +1 -0
  1330. package/dist/chunk-6XLMTOJ3.js +1 -0
  1331. package/dist/chunk-6XLMTOJ3.js.map +1 -0
  1332. package/dist/chunk-6Z6SNY3X.js +71 -0
  1333. package/dist/chunk-6Z6SNY3X.js.map +1 -0
  1334. package/dist/chunk-774B27QA.js +129 -0
  1335. package/dist/chunk-774B27QA.js.map +1 -0
  1336. package/dist/chunk-77U2IMF3.js +194 -0
  1337. package/dist/chunk-77U2IMF3.js.map +1 -0
  1338. package/dist/chunk-7A27MGH6.js +154 -0
  1339. package/dist/chunk-7A27MGH6.js.map +1 -0
  1340. package/dist/chunk-7AIL2F5E.js +16 -0
  1341. package/dist/chunk-7AIL2F5E.js.map +1 -0
  1342. package/dist/chunk-7EFVS4JH.js +79 -0
  1343. package/dist/chunk-7EFVS4JH.js.map +1 -0
  1344. package/dist/chunk-7FPQOFJF.js +57 -0
  1345. package/dist/chunk-7FPQOFJF.js.map +1 -0
  1346. package/dist/chunk-7ICBEB3Z.js +129 -0
  1347. package/dist/chunk-7ICBEB3Z.js.map +1 -0
  1348. package/dist/chunk-7LQUDX54.js +278 -0
  1349. package/dist/chunk-7LQUDX54.js.map +1 -0
  1350. package/dist/chunk-7MDYOZE2.js +52 -0
  1351. package/dist/chunk-7MDYOZE2.js.map +1 -0
  1352. package/dist/chunk-7OFAXH25.js +110 -0
  1353. package/dist/chunk-7OFAXH25.js.map +1 -0
  1354. package/dist/chunk-7VP7VSIG.js +20 -0
  1355. package/dist/chunk-7VP7VSIG.js.map +1 -0
  1356. package/dist/chunk-7VRCGWQL.js +61 -0
  1357. package/dist/chunk-7VRCGWQL.js.map +1 -0
  1358. package/dist/chunk-7ZQGXK63.js +45 -0
  1359. package/dist/chunk-7ZXGAMBO.js +262 -0
  1360. package/dist/chunk-7ZXGAMBO.js.map +1 -0
  1361. package/dist/chunk-A3ASTBON.js +73 -0
  1362. package/dist/chunk-A3ASTBON.js.map +1 -0
  1363. package/dist/chunk-A4TYNHBR.js +1 -0
  1364. package/dist/chunk-A4TYNHBR.js.map +1 -0
  1365. package/dist/chunk-A7RIZOAL.js +13 -0
  1366. package/dist/chunk-A7RIZOAL.js.map +1 -0
  1367. package/dist/chunk-AFYFD2I4.js +146 -0
  1368. package/dist/chunk-AFYFD2I4.js.map +1 -0
  1369. package/dist/chunk-AH54NYFW.js +125 -0
  1370. package/dist/chunk-AH54NYFW.js.map +1 -0
  1371. package/dist/chunk-AJIGT23X.js +106 -0
  1372. package/dist/chunk-AJIGT23X.js.map +1 -0
  1373. package/dist/chunk-AM24WGZJ.js +83 -0
  1374. package/dist/chunk-AM24WGZJ.js.map +1 -0
  1375. package/dist/chunk-AOPR5TVW.js +32 -0
  1376. package/dist/chunk-AOPR5TVW.js.map +1 -0
  1377. package/dist/chunk-AQ3M2I2F.js +1 -0
  1378. package/dist/chunk-AQ3M2I2F.js.map +1 -0
  1379. package/dist/chunk-ASCUWG55.js +63 -0
  1380. package/dist/chunk-ASCUWG55.js.map +1 -0
  1381. package/dist/chunk-AUQRGZE7.js +20 -0
  1382. package/dist/chunk-AUQRGZE7.js.map +1 -0
  1383. package/dist/chunk-AUYC5K5K.js +21 -0
  1384. package/dist/chunk-AUYC5K5K.js.map +1 -0
  1385. package/dist/chunk-AXJMSH44.js +59 -0
  1386. package/dist/chunk-AXJMSH44.js.map +1 -0
  1387. package/dist/chunk-AY7LXHAJ.js +1 -0
  1388. package/dist/chunk-AY7LXHAJ.js.map +1 -0
  1389. package/dist/chunk-AYP6ICAY.js +96 -0
  1390. package/dist/chunk-AYP6ICAY.js.map +1 -0
  1391. package/dist/chunk-B6FRVP2R.js +66 -0
  1392. package/dist/chunk-B6FRVP2R.js.map +1 -0
  1393. package/dist/chunk-BCDQPMP4.js +221 -0
  1394. package/dist/chunk-BCDQPMP4.js.map +1 -0
  1395. package/dist/chunk-BD6TZIF7.js +57 -0
  1396. package/dist/chunk-BD6TZIF7.js.map +1 -0
  1397. package/dist/chunk-BF63NETF.js +298 -0
  1398. package/dist/chunk-BF63NETF.js.map +1 -0
  1399. package/dist/chunk-BGYLL467.js +108 -0
  1400. package/dist/chunk-BGYLL467.js.map +1 -0
  1401. package/dist/chunk-BH5GSBR3.js +1 -0
  1402. package/dist/chunk-BH5GSBR3.js.map +1 -0
  1403. package/dist/chunk-BN6POCYF.js +1 -0
  1404. package/dist/chunk-BN6POCYF.js.map +1 -0
  1405. package/dist/chunk-BNBBPGA4.js +65 -0
  1406. package/dist/chunk-BNBBPGA4.js.map +1 -0
  1407. package/dist/chunk-BO6S47KI.js +1 -0
  1408. package/dist/chunk-BO6S47KI.js.map +1 -0
  1409. package/dist/chunk-BPSGDJ7F.js +78 -0
  1410. package/dist/chunk-BPSGDJ7F.js.map +1 -0
  1411. package/dist/chunk-BQ4QD3UM.js +137 -0
  1412. package/dist/chunk-BQ4QD3UM.js.map +1 -0
  1413. package/dist/chunk-BTM4SJIT.js +273 -0
  1414. package/dist/chunk-BTM4SJIT.js.map +1 -0
  1415. package/dist/chunk-BTOFGWM2.js +62 -0
  1416. package/dist/chunk-BTOFGWM2.js.map +1 -0
  1417. package/dist/chunk-BWLDUAKD.js +158 -0
  1418. package/dist/chunk-BWLDUAKD.js.map +1 -0
  1419. package/dist/chunk-BWMR623X.js +133 -0
  1420. package/dist/chunk-BWMR623X.js.map +1 -0
  1421. package/dist/chunk-BWZKLKDT.js +1 -0
  1422. package/dist/chunk-BWZKLKDT.js.map +1 -0
  1423. package/dist/chunk-BXC6GRLE.js +16 -0
  1424. package/dist/chunk-BXC6GRLE.js.map +1 -0
  1425. package/dist/chunk-BY3JEK5T.js +1 -0
  1426. package/dist/chunk-BY3JEK5T.js.map +1 -0
  1427. package/dist/chunk-C2OAUSOX.js +181 -0
  1428. package/dist/chunk-C2OAUSOX.js.map +1 -0
  1429. package/dist/chunk-C2PB3NUO.js +210 -0
  1430. package/dist/chunk-C2PB3NUO.js.map +1 -0
  1431. package/dist/chunk-C3UKR3NT.js +1 -0
  1432. package/dist/chunk-C3UKR3NT.js.map +1 -0
  1433. package/dist/chunk-C3ZI3AVR.js +123 -0
  1434. package/dist/chunk-C3ZI3AVR.js.map +1 -0
  1435. package/dist/chunk-C5H7HUF3.js +68 -0
  1436. package/dist/chunk-C5H7HUF3.js.map +1 -0
  1437. package/dist/chunk-C6ATAHBX.js +56 -0
  1438. package/dist/chunk-C6ATAHBX.js.map +1 -0
  1439. package/dist/chunk-CBJ2Z4GO.js +101 -0
  1440. package/dist/chunk-CBJ2Z4GO.js.map +1 -0
  1441. package/dist/chunk-CBOB5AV6.js +73 -0
  1442. package/dist/chunk-CBOB5AV6.js.map +1 -0
  1443. package/dist/chunk-CDWUT3GB.js +58 -0
  1444. package/dist/chunk-CDWUT3GB.js.map +1 -0
  1445. package/dist/chunk-CMMPGAMJ.js +1 -0
  1446. package/dist/chunk-CMMPGAMJ.js.map +1 -0
  1447. package/dist/chunk-CMTFAYDY.js +90 -0
  1448. package/dist/chunk-CMTFAYDY.js.map +1 -0
  1449. package/dist/chunk-CN46HGXE.js +1 -0
  1450. package/dist/chunk-CN46HGXE.js.map +1 -0
  1451. package/dist/chunk-CRN4KKNI.js +124 -0
  1452. package/dist/chunk-CRN4KKNI.js.map +1 -0
  1453. package/dist/chunk-CSFE7AUR.js +68 -0
  1454. package/dist/chunk-CSSCGM27.js +25 -0
  1455. package/dist/chunk-CSSCGM27.js.map +1 -0
  1456. package/dist/chunk-CUMSPE6B.js +16 -0
  1457. package/dist/chunk-CUMSPE6B.js.map +1 -0
  1458. package/dist/chunk-D7TN6M7Z.js +164 -0
  1459. package/dist/chunk-D7TN6M7Z.js.map +1 -0
  1460. package/dist/chunk-DCT2CPR5.js +91 -0
  1461. package/dist/chunk-DCT2CPR5.js.map +1 -0
  1462. package/dist/chunk-DDH5E2IC.js +56 -0
  1463. package/dist/chunk-DDH5E2IC.js.map +1 -0
  1464. package/dist/chunk-DG4LXIPT.js +36 -0
  1465. package/dist/chunk-DG4LXIPT.js.map +1 -0
  1466. package/dist/chunk-DHCTGDIG.js +70 -0
  1467. package/dist/chunk-DHCTGDIG.js.map +1 -0
  1468. package/dist/chunk-DIUY263I.js +229 -0
  1469. package/dist/chunk-DIUY263I.js.map +1 -0
  1470. package/dist/chunk-DLJGBJZW.js +187 -0
  1471. package/dist/chunk-DLJGBJZW.js.map +1 -0
  1472. package/dist/chunk-DMNZD3Q7.js +31 -0
  1473. package/dist/chunk-DMNZD3Q7.js.map +1 -0
  1474. package/dist/chunk-DRPVFYE2.js +144 -0
  1475. package/dist/chunk-DRPVFYE2.js.map +1 -0
  1476. package/dist/chunk-DTKYXNCE.js +1 -0
  1477. package/dist/chunk-DTKYXNCE.js.map +1 -0
  1478. package/dist/chunk-DU4ZMVNY.js +150 -0
  1479. package/dist/chunk-DU4ZMVNY.js.map +1 -0
  1480. package/dist/chunk-DUAPT3WK.js +1 -0
  1481. package/dist/chunk-DUAPT3WK.js.map +1 -0
  1482. package/dist/chunk-DURAH4VI.js +1 -0
  1483. package/dist/chunk-DURAH4VI.js.map +1 -0
  1484. package/dist/chunk-DVTCZR3K.js +122 -0
  1485. package/dist/chunk-DVTCZR3K.js.map +1 -0
  1486. package/dist/chunk-DZEC6RFM.js +39 -0
  1487. package/dist/chunk-DZEC6RFM.js.map +1 -0
  1488. package/dist/chunk-E2Y7G4MP.js +93 -0
  1489. package/dist/chunk-E2Y7G4MP.js.map +1 -0
  1490. package/dist/chunk-E4CNWOJS.js +39 -0
  1491. package/dist/chunk-E4CNWOJS.js.map +1 -0
  1492. package/dist/chunk-E4M4VMHQ.js +67 -0
  1493. package/dist/chunk-E4M4VMHQ.js.map +1 -0
  1494. package/dist/chunk-E5ACI7EA.js +22 -0
  1495. package/dist/chunk-E5ACI7EA.js.map +1 -0
  1496. package/dist/chunk-EJDOH7IN.js +1 -0
  1497. package/dist/chunk-EJDOH7IN.js.map +1 -0
  1498. package/dist/chunk-EM6EJEQ3.js +308 -0
  1499. package/dist/chunk-EM6EJEQ3.js.map +1 -0
  1500. package/dist/chunk-EMYESBIT.js +53 -0
  1501. package/dist/chunk-EMYESBIT.js.map +1 -0
  1502. package/dist/chunk-ENORM6S2.js +1 -0
  1503. package/dist/chunk-ENORM6S2.js.map +1 -0
  1504. package/dist/chunk-EO5XH5IL.js +146 -0
  1505. package/dist/chunk-EO5XH5IL.js.map +1 -0
  1506. package/dist/chunk-EPWXEGLH.js +132 -0
  1507. package/dist/chunk-EPWXEGLH.js.map +1 -0
  1508. package/dist/chunk-EQB4HJSI.js +49 -0
  1509. package/dist/chunk-EQB4HJSI.js.map +1 -0
  1510. package/dist/chunk-EV6GK7TS.js +241 -0
  1511. package/dist/chunk-EV6GK7TS.js.map +1 -0
  1512. package/dist/chunk-EYQA66UV.js +200 -0
  1513. package/dist/chunk-EYQA66UV.js.map +1 -0
  1514. package/dist/chunk-EYU6AVZJ.js +146 -0
  1515. package/dist/chunk-EYU6AVZJ.js.map +1 -0
  1516. package/dist/chunk-F42MJOHM.js +196 -0
  1517. package/dist/chunk-F42MJOHM.js.map +1 -0
  1518. package/dist/chunk-FFQ4NOJT.js +28 -0
  1519. package/dist/chunk-FFQ4NOJT.js.map +1 -0
  1520. package/dist/chunk-FHQ3NLTT.js +223 -0
  1521. package/dist/chunk-FHQ3NLTT.js.map +1 -0
  1522. package/dist/chunk-FJQ6YFDQ.js +14 -0
  1523. package/dist/chunk-FJQ6YFDQ.js.map +1 -0
  1524. package/dist/chunk-FN4H5C7H.js +167 -0
  1525. package/dist/chunk-FN4H5C7H.js.map +1 -0
  1526. package/dist/chunk-FO7RI5P7.js +144 -0
  1527. package/dist/chunk-FO7RI5P7.js.map +1 -0
  1528. package/dist/chunk-FOC64RMR.js +43 -0
  1529. package/dist/chunk-FOC64RMR.js.map +1 -0
  1530. package/dist/chunk-FRABWVBM.js +177 -0
  1531. package/dist/chunk-FRABWVBM.js.map +1 -0
  1532. package/dist/chunk-FRAVVI4A.js +95 -0
  1533. package/dist/chunk-FRAVVI4A.js.map +1 -0
  1534. package/dist/chunk-FRYHXCFG.js +172 -0
  1535. package/dist/chunk-FRYHXCFG.js.map +1 -0
  1536. package/dist/chunk-FRYIS47S.js +61 -0
  1537. package/dist/chunk-FRYIS47S.js.map +1 -0
  1538. package/dist/chunk-FUBSPSI3.js +63 -0
  1539. package/dist/chunk-FUBSPSI3.js.map +1 -0
  1540. package/dist/chunk-FZJ2FTGE.js +1 -0
  1541. package/dist/chunk-FZJ2FTGE.js.map +1 -0
  1542. package/dist/chunk-G3E66C6J.js +58 -0
  1543. package/dist/chunk-G3E66C6J.js.map +1 -0
  1544. package/dist/chunk-G6T64PRY.js +81 -0
  1545. package/dist/chunk-G6T64PRY.js.map +1 -0
  1546. package/dist/chunk-GCC66ZSD.js +77 -0
  1547. package/dist/chunk-GCC66ZSD.js.map +1 -0
  1548. package/dist/chunk-GCZJH4XL.js +55 -0
  1549. package/dist/chunk-GCZJH4XL.js.map +1 -0
  1550. package/dist/chunk-GD7HXHOT.js +107 -0
  1551. package/dist/chunk-GD7HXHOT.js.map +1 -0
  1552. package/dist/chunk-GHI5SPTS.js +93 -0
  1553. package/dist/chunk-GHI5SPTS.js.map +1 -0
  1554. package/dist/chunk-GJ2NPAXA.js +110 -0
  1555. package/dist/chunk-GOWBYHYW.js +152 -0
  1556. package/dist/chunk-GOWBYHYW.js.map +1 -0
  1557. package/dist/chunk-GQ6WEQCZ.js +1 -0
  1558. package/dist/chunk-GQ6WEQCZ.js.map +1 -0
  1559. package/dist/chunk-GQ75VOPI.js +210 -0
  1560. package/dist/chunk-GQ75VOPI.js.map +1 -0
  1561. package/dist/chunk-GRHECKHU.js +13 -0
  1562. package/dist/chunk-GRHECKHU.js.map +1 -0
  1563. package/dist/chunk-GVBSCGFZ.js +46 -0
  1564. package/dist/chunk-GVBSCGFZ.js.map +1 -0
  1565. package/dist/chunk-GXNVXKD6.js +1 -0
  1566. package/dist/chunk-GXNVXKD6.js.map +1 -0
  1567. package/dist/chunk-GYLOBDUC.js +268 -0
  1568. package/dist/chunk-GYLOBDUC.js.map +1 -0
  1569. package/dist/chunk-H2J2MTRE.js +23 -0
  1570. package/dist/chunk-H2J2MTRE.js.map +1 -0
  1571. package/dist/chunk-H2PTB6FD.js +1 -0
  1572. package/dist/chunk-H2PTB6FD.js.map +1 -0
  1573. package/dist/chunk-H54E2ZGJ.js +87 -0
  1574. package/dist/chunk-H54E2ZGJ.js.map +1 -0
  1575. package/dist/chunk-H7NA4TXY.js +1 -0
  1576. package/dist/chunk-H7NA4TXY.js.map +1 -0
  1577. package/dist/chunk-HAFE43QJ.js +21 -0
  1578. package/dist/chunk-HAFE43QJ.js.map +1 -0
  1579. package/dist/chunk-HBQU2LWP.js +114 -0
  1580. package/dist/chunk-HBQU2LWP.js.map +1 -0
  1581. package/dist/chunk-HEBZ7Q7O.js +97 -0
  1582. package/dist/chunk-HEBZ7Q7O.js.map +1 -0
  1583. package/dist/chunk-HGVERQTG.js +181 -0
  1584. package/dist/chunk-HGVERQTG.js.map +1 -0
  1585. package/dist/chunk-HIRSTFDW.js +114 -0
  1586. package/dist/chunk-HNIC46DX.js +177 -0
  1587. package/dist/chunk-HNIC46DX.js.map +1 -0
  1588. package/dist/chunk-HPJJYCNX.js +59 -0
  1589. package/dist/chunk-HPJJYCNX.js.map +1 -0
  1590. package/dist/chunk-HPK33ACY.js +15 -0
  1591. package/dist/chunk-HQBXB5QB.js +101 -0
  1592. package/dist/chunk-HQBXB5QB.js.map +1 -0
  1593. package/dist/chunk-HWT6SIVS.js +190 -0
  1594. package/dist/chunk-HWT6SIVS.js.map +1 -0
  1595. package/dist/chunk-HXYXDQ7U.js +19 -0
  1596. package/dist/chunk-HXYXDQ7U.js.map +1 -0
  1597. package/dist/chunk-I53WONUS.js +1 -0
  1598. package/dist/chunk-I53WONUS.js.map +1 -0
  1599. package/dist/chunk-I73C7TIA.js +87 -0
  1600. package/dist/chunk-I73C7TIA.js.map +1 -0
  1601. package/dist/chunk-IAGOUTI6.js +112 -0
  1602. package/dist/chunk-IAGOUTI6.js.map +1 -0
  1603. package/dist/chunk-ICG4PNIH.js +65 -0
  1604. package/dist/chunk-ICG4PNIH.js.map +1 -0
  1605. package/dist/chunk-IFLZNCAI.js +22 -0
  1606. package/dist/chunk-IFLZNCAI.js.map +1 -0
  1607. package/dist/chunk-IGWUOCSX.js +58 -0
  1608. package/dist/chunk-IGWUOCSX.js.map +1 -0
  1609. package/dist/chunk-IHPLDHQD.js +109 -0
  1610. package/dist/chunk-IHPLDHQD.js.map +1 -0
  1611. package/dist/chunk-IHS3GDPZ.js +32 -0
  1612. package/dist/chunk-II3YNC5S.js +1 -0
  1613. package/dist/chunk-II3YNC5S.js.map +1 -0
  1614. package/dist/chunk-IIUB4IOH.js +237 -0
  1615. package/dist/chunk-IIUB4IOH.js.map +1 -0
  1616. package/dist/chunk-IJ6Q7LXQ.js +264 -0
  1617. package/dist/chunk-IJ6Q7LXQ.js.map +1 -0
  1618. package/dist/chunk-ILEJ3DVD.js +116 -0
  1619. package/dist/chunk-ILEJ3DVD.js.map +1 -0
  1620. package/dist/chunk-IM7YDS43.js +93 -0
  1621. package/dist/chunk-IM7YDS43.js.map +1 -0
  1622. package/dist/chunk-IMLIIW77.js +55 -0
  1623. package/dist/chunk-IMLIIW77.js.map +1 -0
  1624. package/dist/chunk-IO36MEBD.js +1 -0
  1625. package/dist/chunk-IO36MEBD.js.map +1 -0
  1626. package/dist/chunk-IQ6WX2GS.js +1 -0
  1627. package/dist/chunk-IQ6WX2GS.js.map +1 -0
  1628. package/dist/chunk-IR4FEROD.js +34 -0
  1629. package/dist/chunk-IR4FEROD.js.map +1 -0
  1630. package/dist/chunk-ISW5K72V.js +230 -0
  1631. package/dist/chunk-ISW5K72V.js.map +1 -0
  1632. package/dist/chunk-ITACE45O.js +1 -0
  1633. package/dist/chunk-ITACE45O.js.map +1 -0
  1634. package/dist/chunk-IUP42CH6.js +81 -0
  1635. package/dist/chunk-IUP42CH6.js.map +1 -0
  1636. package/dist/chunk-IX2BRFQ3.js +150 -0
  1637. package/dist/chunk-IX2BRFQ3.js.map +1 -0
  1638. package/dist/chunk-IXM2QSFN.js +135 -0
  1639. package/dist/chunk-IXM2QSFN.js.map +1 -0
  1640. package/dist/chunk-IYM4LTA5.js +1 -0
  1641. package/dist/chunk-IYM4LTA5.js.map +1 -0
  1642. package/dist/chunk-J2KRN3YM.js +191 -0
  1643. package/dist/chunk-J2KRN3YM.js.map +1 -0
  1644. package/dist/chunk-J3FNTWIG.js +184 -0
  1645. package/dist/chunk-J3FNTWIG.js.map +1 -0
  1646. package/dist/chunk-J3IGWNGH.js +87 -0
  1647. package/dist/chunk-J3IGWNGH.js.map +1 -0
  1648. package/dist/chunk-J4CKZ5YB.js +56 -0
  1649. package/dist/chunk-J4CKZ5YB.js.map +1 -0
  1650. package/dist/chunk-JBE3LH4C.js +1 -0
  1651. package/dist/chunk-JBE3LH4C.js.map +1 -0
  1652. package/dist/chunk-JBVTKNS2.js +49 -0
  1653. package/dist/chunk-JBVTKNS2.js.map +1 -0
  1654. package/dist/chunk-JC5DL4JO.js +53 -0
  1655. package/dist/chunk-JC5DL4JO.js.map +1 -0
  1656. package/dist/chunk-JCSZUDY4.js +224 -0
  1657. package/dist/chunk-JCSZUDY4.js.map +1 -0
  1658. package/dist/chunk-JD364H3Y.js +18 -0
  1659. package/dist/chunk-JD364H3Y.js.map +1 -0
  1660. package/dist/chunk-JD5BVIM7.js +1 -0
  1661. package/dist/chunk-JD5BVIM7.js.map +1 -0
  1662. package/dist/chunk-JDFTIK4L.js +89 -0
  1663. package/dist/chunk-JDFTIK4L.js.map +1 -0
  1664. package/dist/chunk-JDQACVKT.js +203 -0
  1665. package/dist/chunk-JDQACVKT.js.map +1 -0
  1666. package/dist/chunk-JE4CLMYD.js +1 -0
  1667. package/dist/chunk-JE4CLMYD.js.map +1 -0
  1668. package/dist/chunk-JEBPCAWD.js +1 -0
  1669. package/dist/chunk-JEBPCAWD.js.map +1 -0
  1670. package/dist/chunk-JG6ASCPE.js +41 -0
  1671. package/dist/chunk-JG6ASCPE.js.map +1 -0
  1672. package/dist/chunk-JGPXMJ3X.js +266 -0
  1673. package/dist/chunk-JGPXMJ3X.js.map +1 -0
  1674. package/dist/chunk-JKB3LODO.js +179 -0
  1675. package/dist/chunk-JKB3LODO.js.map +1 -0
  1676. package/dist/chunk-JOEISLPP.js +99 -0
  1677. package/dist/chunk-JOEISLPP.js.map +1 -0
  1678. package/dist/chunk-JQCWDFFH.js +116 -0
  1679. package/dist/chunk-JQCWDFFH.js.map +1 -0
  1680. package/dist/chunk-JU2NUKOP.js +68 -0
  1681. package/dist/chunk-JU2NUKOP.js.map +1 -0
  1682. package/dist/chunk-JWA6J352.js +182 -0
  1683. package/dist/chunk-JWA6J352.js.map +1 -0
  1684. package/dist/chunk-JWBTG3CP.js +52 -0
  1685. package/dist/chunk-JWBTG3CP.js.map +1 -0
  1686. package/dist/chunk-JZMMPFQT.js +155 -0
  1687. package/dist/chunk-JZMMPFQT.js.map +1 -0
  1688. package/dist/chunk-K3OXT45X.js +263 -0
  1689. package/dist/chunk-K3OXT45X.js.map +1 -0
  1690. package/dist/chunk-K66HYBAS.js +129 -0
  1691. package/dist/chunk-K66HYBAS.js.map +1 -0
  1692. package/dist/chunk-K7BR3U57.js +18 -0
  1693. package/dist/chunk-K7BR3U57.js.map +1 -0
  1694. package/dist/chunk-KAK5SAEA.js +1 -0
  1695. package/dist/chunk-KAK5SAEA.js.map +1 -0
  1696. package/dist/chunk-KB6AGBMD.js +86 -0
  1697. package/dist/chunk-KB6AGBMD.js.map +1 -0
  1698. package/dist/chunk-KD34ODAZ.js +124 -0
  1699. package/dist/chunk-KD34ODAZ.js.map +1 -0
  1700. package/dist/chunk-KEXYN5F5.js +103 -0
  1701. package/dist/chunk-KEXYN5F5.js.map +1 -0
  1702. package/dist/chunk-KG2D7C2M.js +289 -0
  1703. package/dist/chunk-KG2D7C2M.js.map +1 -0
  1704. package/dist/chunk-KHG57NAE.js +25 -0
  1705. package/dist/chunk-KHG57NAE.js.map +1 -0
  1706. package/dist/chunk-KIVTQAI5.js +121 -0
  1707. package/dist/chunk-KIVTQAI5.js.map +1 -0
  1708. package/dist/chunk-KJ5LUG36.js +38 -0
  1709. package/dist/chunk-KJ5LUG36.js.map +1 -0
  1710. package/dist/chunk-KPFQXOWP.js +175 -0
  1711. package/dist/chunk-KPFQXOWP.js.map +1 -0
  1712. package/dist/chunk-KSSUJSST.js +138 -0
  1713. package/dist/chunk-KSSUJSST.js.map +1 -0
  1714. package/dist/chunk-KTKU2EBY.js +1 -0
  1715. package/dist/chunk-KTKU2EBY.js.map +1 -0
  1716. package/dist/chunk-KVN3K4J3.js +37 -0
  1717. package/dist/chunk-KVN3K4J3.js.map +1 -0
  1718. package/dist/chunk-KXF4RD5B.js +217 -0
  1719. package/dist/chunk-KXOHUVGD.js +158 -0
  1720. package/dist/chunk-KXOHUVGD.js.map +1 -0
  1721. package/dist/chunk-L5CPOEDP.js +1 -0
  1722. package/dist/chunk-L5CPOEDP.js.map +1 -0
  1723. package/dist/chunk-LGCMG7AT.js +279 -0
  1724. package/dist/chunk-LGCMG7AT.js.map +1 -0
  1725. package/dist/chunk-LGH5HJQF.js +200 -0
  1726. package/dist/chunk-LGH5HJQF.js.map +1 -0
  1727. package/dist/chunk-LHTSYQIW.js +297 -0
  1728. package/dist/chunk-LHTSYQIW.js.map +1 -0
  1729. package/dist/chunk-LOEYEGUD.js +154 -0
  1730. package/dist/chunk-LOEYEGUD.js.map +1 -0
  1731. package/dist/chunk-LPBAISNF.js +315 -0
  1732. package/dist/chunk-LPBAISNF.js.map +1 -0
  1733. package/dist/chunk-LR65TAV5.js +170 -0
  1734. package/dist/chunk-LR65TAV5.js.map +1 -0
  1735. package/dist/chunk-LRC2ZU2F.js +193 -0
  1736. package/dist/chunk-LRC2ZU2F.js.map +1 -0
  1737. package/dist/chunk-LRO376TY.js +88 -0
  1738. package/dist/chunk-LRO376TY.js.map +1 -0
  1739. package/dist/chunk-LTEXWGK6.js +176 -0
  1740. package/dist/chunk-LTEXWGK6.js.map +1 -0
  1741. package/dist/chunk-LV3AFLW4.js +288 -0
  1742. package/dist/chunk-LV3AFLW4.js.map +1 -0
  1743. package/dist/chunk-LVDRVPGD.js +1 -0
  1744. package/dist/chunk-LVDRVPGD.js.map +1 -0
  1745. package/dist/chunk-LWPAYLL5.js +263 -0
  1746. package/dist/chunk-LWPAYLL5.js.map +1 -0
  1747. package/dist/chunk-M2M4OT5S.js +112 -0
  1748. package/dist/chunk-M2M4OT5S.js.map +1 -0
  1749. package/dist/chunk-M624PGL4.js +236 -0
  1750. package/dist/chunk-MALNOZNY.js +219 -0
  1751. package/dist/chunk-MALNOZNY.js.map +1 -0
  1752. package/dist/chunk-MBF6DLMA.js +156 -0
  1753. package/dist/chunk-MBF6DLMA.js.map +1 -0
  1754. package/dist/chunk-MFE3GSKU.js +216 -0
  1755. package/dist/chunk-MFE3GSKU.js.map +1 -0
  1756. package/dist/chunk-MHWZHOTX.js +75 -0
  1757. package/dist/chunk-MHWZHOTX.js.map +1 -0
  1758. package/dist/chunk-MLM3X2KC.js +267 -0
  1759. package/dist/chunk-MLM3X2KC.js.map +1 -0
  1760. package/dist/chunk-MM4LVILH.js +196 -0
  1761. package/dist/chunk-MM4LVILH.js.map +1 -0
  1762. package/dist/chunk-MMZAGB64.js +41 -0
  1763. package/dist/chunk-MMZAGB64.js.map +1 -0
  1764. package/dist/chunk-MOLQGQEQ.js +1 -0
  1765. package/dist/chunk-MOLQGQEQ.js.map +1 -0
  1766. package/dist/chunk-MQCUXRZA.js +98 -0
  1767. package/dist/chunk-MQCUXRZA.js.map +1 -0
  1768. package/dist/chunk-MQJDMQJZ.js +1 -0
  1769. package/dist/chunk-MQJDMQJZ.js.map +1 -0
  1770. package/dist/chunk-MTFCPPZ5.js +28 -0
  1771. package/dist/chunk-MTFCPPZ5.js.map +1 -0
  1772. package/dist/chunk-MTGEJRE4.js +34 -0
  1773. package/dist/chunk-MTGEJRE4.js.map +1 -0
  1774. package/dist/chunk-MYHQU7WR.js +57 -0
  1775. package/dist/chunk-MYHQU7WR.js.map +1 -0
  1776. package/dist/chunk-MZ7XU5HB.js +78 -0
  1777. package/dist/chunk-MZ7XU5HB.js.map +1 -0
  1778. package/dist/chunk-MZXZIOSF.js +255 -0
  1779. package/dist/chunk-MZXZIOSF.js.map +1 -0
  1780. package/dist/chunk-N2L3B6SG.js +165 -0
  1781. package/dist/chunk-N2L3B6SG.js.map +1 -0
  1782. package/dist/chunk-N2SNPUZ5.js +87 -0
  1783. package/dist/chunk-N2SNPUZ5.js.map +1 -0
  1784. package/dist/chunk-N4LU2MP7.js +93 -0
  1785. package/dist/chunk-N4LU2MP7.js.map +1 -0
  1786. package/dist/chunk-N5ZWC6CB.js +1 -0
  1787. package/dist/chunk-N5ZWC6CB.js.map +1 -0
  1788. package/dist/chunk-N6NVLQNE.js +51 -0
  1789. package/dist/chunk-N6NVLQNE.js.map +1 -0
  1790. package/dist/chunk-N6Y3BWHA.js +83 -0
  1791. package/dist/chunk-N6Y3BWHA.js.map +1 -0
  1792. package/dist/chunk-NBXICKLU.js +30 -0
  1793. package/dist/chunk-NBXICKLU.js.map +1 -0
  1794. package/dist/chunk-NCS2TBIP.js +1 -0
  1795. package/dist/chunk-NCS2TBIP.js.map +1 -0
  1796. package/dist/chunk-NFZANKAN.js +96 -0
  1797. package/dist/chunk-NFZANKAN.js.map +1 -0
  1798. package/dist/chunk-NHL5ERBM.js +10 -0
  1799. package/dist/chunk-NPK5TRIC.js +288 -0
  1800. package/dist/chunk-NTCVB7HO.js +1 -0
  1801. package/dist/chunk-NTCVB7HO.js.map +1 -0
  1802. package/dist/chunk-NUGT7LMR.js +1 -0
  1803. package/dist/chunk-NUGT7LMR.js.map +1 -0
  1804. package/dist/chunk-NY3E3NRZ.js +85 -0
  1805. package/dist/chunk-NY3E3NRZ.js.map +1 -0
  1806. package/dist/chunk-NY4QY5U3.js +168 -0
  1807. package/dist/chunk-NY4QY5U3.js.map +1 -0
  1808. package/dist/chunk-NYZO3JNB.js +46 -0
  1809. package/dist/chunk-NYZO3JNB.js.map +1 -0
  1810. package/dist/chunk-NYZZOQV4.js +73 -0
  1811. package/dist/chunk-NYZZOQV4.js.map +1 -0
  1812. package/dist/chunk-NZC63KJ7.js +108 -0
  1813. package/dist/chunk-NZC63KJ7.js.map +1 -0
  1814. package/dist/chunk-NZD2WISW.js +156 -0
  1815. package/dist/chunk-NZD2WISW.js.map +1 -0
  1816. package/dist/chunk-O2CYLVPM.js +200 -0
  1817. package/dist/chunk-O2CYLVPM.js.map +1 -0
  1818. package/dist/chunk-O37LNDKC.js +149 -0
  1819. package/dist/chunk-O37LNDKC.js.map +1 -0
  1820. package/dist/chunk-O57I5POV.js +144 -0
  1821. package/dist/chunk-O57I5POV.js.map +1 -0
  1822. package/dist/chunk-O7QPPJAK.js +172 -0
  1823. package/dist/chunk-O7QPPJAK.js.map +1 -0
  1824. package/dist/chunk-OCJFMTYA.js +94 -0
  1825. package/dist/chunk-OI333WMD.js +171 -0
  1826. package/dist/chunk-OI333WMD.js.map +1 -0
  1827. package/dist/chunk-OJSVHBQO.js +1 -0
  1828. package/dist/chunk-OJSVHBQO.js.map +1 -0
  1829. package/dist/chunk-ONMSTW4B.js +1 -0
  1830. package/dist/chunk-ONMSTW4B.js.map +1 -0
  1831. package/dist/chunk-OOTIGGEN.js +73 -0
  1832. package/dist/chunk-OOTIGGEN.js.map +1 -0
  1833. package/dist/chunk-OP3EGS6R.js +127 -0
  1834. package/dist/chunk-OP3EGS6R.js.map +1 -0
  1835. package/dist/chunk-OPRYFHPL.js +191 -0
  1836. package/dist/chunk-OPRYFHPL.js.map +1 -0
  1837. package/dist/chunk-OSIJPYG2.js +195 -0
  1838. package/dist/chunk-OSIJPYG2.js.map +1 -0
  1839. package/dist/chunk-OY4RUX4H.js +28 -0
  1840. package/dist/chunk-OY4RUX4H.js.map +1 -0
  1841. package/dist/chunk-OYKAYMD5.js +167 -0
  1842. package/dist/chunk-OYKAYMD5.js.map +1 -0
  1843. package/dist/chunk-P5WJUR7X.js +1 -0
  1844. package/dist/chunk-P5WJUR7X.js.map +1 -0
  1845. package/dist/chunk-P6UO57RW.js +173 -0
  1846. package/dist/chunk-P6UO57RW.js.map +1 -0
  1847. package/dist/chunk-PCLXWMZL.js +78 -0
  1848. package/dist/chunk-PCLXWMZL.js.map +1 -0
  1849. package/dist/chunk-PGM5RRQO.js +1 -0
  1850. package/dist/chunk-PGM5RRQO.js.map +1 -0
  1851. package/dist/chunk-PLEKRWH3.js +228 -0
  1852. package/dist/chunk-PLEKRWH3.js.map +1 -0
  1853. package/dist/chunk-PPDG6FRL.js +72 -0
  1854. package/dist/chunk-PPDG6FRL.js.map +1 -0
  1855. package/dist/chunk-PQECNGDE.js +56 -0
  1856. package/dist/chunk-PQECNGDE.js.map +1 -0
  1857. package/dist/chunk-PQZKUPHQ.js +64 -0
  1858. package/dist/chunk-PQZKUPHQ.js.map +1 -0
  1859. package/dist/chunk-PSWJ6OFI.js +64 -0
  1860. package/dist/chunk-PSWJ6OFI.js.map +1 -0
  1861. package/dist/chunk-PTHUUYAG.js +170 -0
  1862. package/dist/chunk-PTHUUYAG.js.map +1 -0
  1863. package/dist/chunk-PWF4PYZL.js +92 -0
  1864. package/dist/chunk-PWF4PYZL.js.map +1 -0
  1865. package/dist/chunk-PZS7N74L.js +85 -0
  1866. package/dist/chunk-PZS7N74L.js.map +1 -0
  1867. package/dist/chunk-Q3XNEFO6.js +76 -0
  1868. package/dist/chunk-Q3XNEFO6.js.map +1 -0
  1869. package/dist/chunk-Q56BXYKT.js +184 -0
  1870. package/dist/chunk-Q56BXYKT.js.map +1 -0
  1871. package/dist/chunk-Q72ZRUOB.js +308 -0
  1872. package/dist/chunk-Q72ZRUOB.js.map +1 -0
  1873. package/dist/chunk-QBJVRPTF.js +55 -0
  1874. package/dist/chunk-QBJVRPTF.js.map +1 -0
  1875. package/dist/chunk-QDNQGWEW.js +67 -0
  1876. package/dist/chunk-QDNQGWEW.js.map +1 -0
  1877. package/dist/chunk-QF6LTUCE.js +78 -0
  1878. package/dist/chunk-QF6LTUCE.js.map +1 -0
  1879. package/dist/chunk-QJCZ3IQP.js +1 -0
  1880. package/dist/chunk-QJCZ3IQP.js.map +1 -0
  1881. package/dist/chunk-QKHK32TJ.js +76 -0
  1882. package/dist/chunk-QKHK32TJ.js.map +1 -0
  1883. package/dist/chunk-QKLSHNOH.js +63 -0
  1884. package/dist/chunk-QKLSHNOH.js.map +1 -0
  1885. package/dist/chunk-QOB473HS.js +1 -0
  1886. package/dist/chunk-QOB473HS.js.map +1 -0
  1887. package/dist/chunk-QR2GBPYM.js +82 -0
  1888. package/dist/chunk-QR2GBPYM.js.map +1 -0
  1889. package/dist/chunk-QS5OHHBY.js +1 -0
  1890. package/dist/chunk-QS5OHHBY.js.map +1 -0
  1891. package/dist/chunk-QVWNK4JO.js +22 -0
  1892. package/dist/chunk-QVWNK4JO.js.map +1 -0
  1893. package/dist/chunk-QWVETTIY.js +199 -0
  1894. package/dist/chunk-QWVETTIY.js.map +1 -0
  1895. package/dist/chunk-QXMBYYNG.js +162 -0
  1896. package/dist/chunk-QXMBYYNG.js.map +1 -0
  1897. package/dist/chunk-QYKDY4EI.js +1 -0
  1898. package/dist/chunk-QYKDY4EI.js.map +1 -0
  1899. package/dist/chunk-R445KMGG.js +1 -0
  1900. package/dist/chunk-R445KMGG.js.map +1 -0
  1901. package/dist/chunk-R52HJAYO.js +126 -0
  1902. package/dist/chunk-R72WO3PQ.js +124 -0
  1903. package/dist/chunk-R72WO3PQ.js.map +1 -0
  1904. package/dist/chunk-RATVTIZN.js +246 -0
  1905. package/dist/chunk-RATVTIZN.js.map +1 -0
  1906. package/dist/chunk-RB4ZAXNU.js +197 -0
  1907. package/dist/chunk-RB4ZAXNU.js.map +1 -0
  1908. package/dist/chunk-RCOX5YSF.js +65 -0
  1909. package/dist/chunk-RCOX5YSF.js.map +1 -0
  1910. package/dist/chunk-RCPZGE45.js +82 -0
  1911. package/dist/chunk-RCPZGE45.js.map +1 -0
  1912. package/dist/chunk-RHIDWUK7.js +29 -0
  1913. package/dist/chunk-RHIDWUK7.js.map +1 -0
  1914. package/dist/chunk-RI5JZLZL.js +18 -0
  1915. package/dist/chunk-RI5JZLZL.js.map +1 -0
  1916. package/dist/chunk-RIPALLQG.js +84 -0
  1917. package/dist/chunk-RIPALLQG.js.map +1 -0
  1918. package/dist/chunk-RIPTJNRP.js +103 -0
  1919. package/dist/chunk-RIPTJNRP.js.map +1 -0
  1920. package/dist/chunk-RO3PJBHB.js +137 -0
  1921. package/dist/chunk-RO3PJBHB.js.map +1 -0
  1922. package/dist/chunk-RPGTRJQP.js +60 -0
  1923. package/dist/chunk-RPGTRJQP.js.map +1 -0
  1924. package/dist/chunk-RSQMPCCR.js +141 -0
  1925. package/dist/chunk-RSQMPCCR.js.map +1 -0
  1926. package/dist/chunk-RTIOXLGI.js +317 -0
  1927. package/dist/chunk-RTIOXLGI.js.map +1 -0
  1928. package/dist/chunk-RUIV5TVA.js +61 -0
  1929. package/dist/chunk-RUIV5TVA.js.map +1 -0
  1930. package/dist/chunk-RUSQTJET.js +107 -0
  1931. package/dist/chunk-RUSQTJET.js.map +1 -0
  1932. package/dist/chunk-S22FEBOC.js +143 -0
  1933. package/dist/chunk-S22FEBOC.js.map +1 -0
  1934. package/dist/chunk-S2GDYA6R.js +116 -0
  1935. package/dist/chunk-S2GDYA6R.js.map +1 -0
  1936. package/dist/chunk-S2YVBYWZ.js +45 -0
  1937. package/dist/chunk-S2YVBYWZ.js.map +1 -0
  1938. package/dist/chunk-S7KQOZ7X.js +35 -0
  1939. package/dist/chunk-S7KQOZ7X.js.map +1 -0
  1940. package/dist/chunk-SAAUWIY7.js +140 -0
  1941. package/dist/chunk-SAAUWIY7.js.map +1 -0
  1942. package/dist/chunk-SCRN2RE4.js +64 -0
  1943. package/dist/chunk-SCRN2RE4.js.map +1 -0
  1944. package/dist/chunk-SIKI6I7S.js +185 -0
  1945. package/dist/chunk-SIKI6I7S.js.map +1 -0
  1946. package/dist/chunk-SJBTJPSZ.js +68 -0
  1947. package/dist/chunk-SJBTJPSZ.js.map +1 -0
  1948. package/dist/chunk-SJRTT3PA.js +1 -0
  1949. package/dist/chunk-SJRTT3PA.js.map +1 -0
  1950. package/dist/chunk-SJXSWVJG.js +1 -0
  1951. package/dist/chunk-SJXSWVJG.js.map +1 -0
  1952. package/dist/chunk-SNCSGLJ6.js +1 -0
  1953. package/dist/chunk-SNCSGLJ6.js.map +1 -0
  1954. package/dist/chunk-SO2J7ULY.js +1 -0
  1955. package/dist/chunk-SO2J7ULY.js.map +1 -0
  1956. package/dist/chunk-SS4MHTGU.js +1 -0
  1957. package/dist/chunk-SS4MHTGU.js.map +1 -0
  1958. package/dist/chunk-SSF4XHCK.js +46 -0
  1959. package/dist/chunk-SSF4XHCK.js.map +1 -0
  1960. package/dist/chunk-STWPNHBB.js +170 -0
  1961. package/dist/chunk-STWPNHBB.js.map +1 -0
  1962. package/dist/chunk-SUALMVL7.js +25 -0
  1963. package/dist/chunk-SUALMVL7.js.map +1 -0
  1964. package/dist/chunk-SUZXPDUQ.js +144 -0
  1965. package/dist/chunk-SUZXPDUQ.js.map +1 -0
  1966. package/dist/chunk-SWELYVW5.js +227 -0
  1967. package/dist/chunk-SWELYVW5.js.map +1 -0
  1968. package/dist/chunk-SX3E6UC2.js +1 -0
  1969. package/dist/chunk-SX3E6UC2.js.map +1 -0
  1970. package/dist/chunk-SXYIXCUB.js +129 -0
  1971. package/dist/chunk-SXYIXCUB.js.map +1 -0
  1972. package/dist/chunk-T2HWWUOS.js +163 -0
  1973. package/dist/chunk-T2HWWUOS.js.map +1 -0
  1974. package/dist/chunk-T4DCMN5W.js +21 -0
  1975. package/dist/chunk-T4DCMN5W.js.map +1 -0
  1976. package/dist/chunk-T4J3FUKJ.js +223 -0
  1977. package/dist/chunk-T4J3FUKJ.js.map +1 -0
  1978. package/dist/chunk-T7R5DWJX.js +84 -0
  1979. package/dist/chunk-T7R5DWJX.js.map +1 -0
  1980. package/dist/chunk-TAF3YYMK.js +1 -0
  1981. package/dist/chunk-TAF3YYMK.js.map +1 -0
  1982. package/dist/chunk-TEQYTEM2.js +23 -0
  1983. package/dist/chunk-TEQYTEM2.js.map +1 -0
  1984. package/dist/chunk-TERT6TIS.js +77 -0
  1985. package/dist/chunk-TERT6TIS.js.map +1 -0
  1986. package/dist/chunk-TFTGMFW7.js +148 -0
  1987. package/dist/chunk-TFTGMFW7.js.map +1 -0
  1988. package/dist/chunk-THYO66RE.js +140 -0
  1989. package/dist/chunk-THYO66RE.js.map +1 -0
  1990. package/dist/chunk-TJT4KVMD.js +170 -0
  1991. package/dist/chunk-TJT4KVMD.js.map +1 -0
  1992. package/dist/chunk-TMSWLFL4.js +1 -0
  1993. package/dist/chunk-TMSWLFL4.js.map +1 -0
  1994. package/dist/chunk-TQ6FPOPD.js +105 -0
  1995. package/dist/chunk-TQ6FPOPD.js.map +1 -0
  1996. package/dist/chunk-TTHDDTJU.js +90 -0
  1997. package/dist/chunk-TTHDDTJU.js.map +1 -0
  1998. package/dist/chunk-TUBCN4DJ.js +46 -0
  1999. package/dist/chunk-TUBCN4DJ.js.map +1 -0
  2000. package/dist/chunk-TXCIFJ6M.js +113 -0
  2001. package/dist/chunk-TXCIFJ6M.js.map +1 -0
  2002. package/dist/chunk-TZ4ONDDE.js +26 -0
  2003. package/dist/chunk-TZ4ONDDE.js.map +1 -0
  2004. package/dist/chunk-U24LRH5M.js +121 -0
  2005. package/dist/chunk-U24LRH5M.js.map +1 -0
  2006. package/dist/chunk-U2AC4AQX.js +228 -0
  2007. package/dist/chunk-U2AC4AQX.js.map +1 -0
  2008. package/dist/chunk-U72QL2OR.js +30 -0
  2009. package/dist/chunk-U72QL2OR.js.map +1 -0
  2010. package/dist/chunk-UAVVI7IP.js +68 -0
  2011. package/dist/chunk-UAVVI7IP.js.map +1 -0
  2012. package/dist/chunk-UCYU56FO.js +1 -0
  2013. package/dist/chunk-UCYU56FO.js.map +1 -0
  2014. package/dist/chunk-UDQSIRAP.js +1 -0
  2015. package/dist/chunk-UDQSIRAP.js.map +1 -0
  2016. package/dist/chunk-UDSVB7VW.js +160 -0
  2017. package/dist/chunk-UDSVB7VW.js.map +1 -0
  2018. package/dist/chunk-UETHX57J.js +67 -0
  2019. package/dist/chunk-UETHX57J.js.map +1 -0
  2020. package/dist/chunk-UF2WLQ6K.js +76 -0
  2021. package/dist/chunk-UF2WLQ6K.js.map +1 -0
  2022. package/dist/chunk-UFJ7DSIL.js +157 -0
  2023. package/dist/chunk-UFJ7DSIL.js.map +1 -0
  2024. package/dist/chunk-UGVWIIZO.js +159 -0
  2025. package/dist/chunk-UGVWIIZO.js.map +1 -0
  2026. package/dist/chunk-UJP2VS2H.js +1 -0
  2027. package/dist/chunk-UJP2VS2H.js.map +1 -0
  2028. package/dist/chunk-ULJ4C6JW.js +65 -0
  2029. package/dist/chunk-ULJ4C6JW.js.map +1 -0
  2030. package/dist/chunk-UM35GGCS.js +1 -0
  2031. package/dist/chunk-UM35GGCS.js.map +1 -0
  2032. package/dist/chunk-UOS7DEQZ.js +21 -0
  2033. package/dist/chunk-UOS7DEQZ.js.map +1 -0
  2034. package/dist/chunk-UPWGSWXG.js +78 -0
  2035. package/dist/chunk-UPWGSWXG.js.map +1 -0
  2036. package/dist/chunk-UQSGEEAI.js +72 -0
  2037. package/dist/chunk-UQSGEEAI.js.map +1 -0
  2038. package/dist/chunk-URB3VVMR.js +1 -0
  2039. package/dist/chunk-URB3VVMR.js.map +1 -0
  2040. package/dist/chunk-UUL44SUX.js +54 -0
  2041. package/dist/chunk-UUL44SUX.js.map +1 -0
  2042. package/dist/chunk-UUXNFPCP.js +111 -0
  2043. package/dist/chunk-UUXNFPCP.js.map +1 -0
  2044. package/dist/chunk-UWCH6KVJ.js +107 -0
  2045. package/dist/chunk-UWCH6KVJ.js.map +1 -0
  2046. package/dist/chunk-UZOG6HNN.js +52 -0
  2047. package/dist/chunk-UZOG6HNN.js.map +1 -0
  2048. package/dist/chunk-V3QBKFKP.js +181 -0
  2049. package/dist/chunk-V3QBKFKP.js.map +1 -0
  2050. package/dist/chunk-V3ZOI7BS.js +216 -0
  2051. package/dist/chunk-V3ZOI7BS.js.map +1 -0
  2052. package/dist/chunk-V6AS4S2T.js +234 -0
  2053. package/dist/chunk-V6AS4S2T.js.map +1 -0
  2054. package/dist/chunk-VA5DNBWZ.js +85 -0
  2055. package/dist/chunk-VA5DNBWZ.js.map +1 -0
  2056. package/dist/chunk-VBA7J2MR.js +134 -0
  2057. package/dist/chunk-VBA7J2MR.js.map +1 -0
  2058. package/dist/chunk-VBOYWWG5.js +305 -0
  2059. package/dist/chunk-VFBFI4AG.js +61 -0
  2060. package/dist/chunk-VFBFI4AG.js.map +1 -0
  2061. package/dist/chunk-VJG2WFBN.js +70 -0
  2062. package/dist/chunk-VJG2WFBN.js.map +1 -0
  2063. package/dist/chunk-VKXGYBXD.js +113 -0
  2064. package/dist/chunk-VMSAKD4H.js +120 -0
  2065. package/dist/chunk-VMSAKD4H.js.map +1 -0
  2066. package/dist/chunk-VN6Z6F7R.js +68 -0
  2067. package/dist/chunk-VN6Z6F7R.js.map +1 -0
  2068. package/dist/chunk-VQNQA3DV.js +103 -0
  2069. package/dist/chunk-VQNQA3DV.js.map +1 -0
  2070. package/dist/chunk-VRPCZ3IE.js +83 -0
  2071. package/dist/chunk-VRPCZ3IE.js.map +1 -0
  2072. package/dist/chunk-VWP5QJJH.js +85 -0
  2073. package/dist/chunk-VWP5QJJH.js.map +1 -0
  2074. package/dist/chunk-VXBTEVOX.js +47 -0
  2075. package/dist/chunk-VXBTEVOX.js.map +1 -0
  2076. package/dist/chunk-VXLERR3V.js +71 -0
  2077. package/dist/chunk-VXLERR3V.js.map +1 -0
  2078. package/dist/chunk-VZGPFUEA.js +150 -0
  2079. package/dist/chunk-VZGPFUEA.js.map +1 -0
  2080. package/dist/chunk-W3TTRP2W.js +42 -0
  2081. package/dist/chunk-W3TTRP2W.js.map +1 -0
  2082. package/dist/chunk-W5AALTIW.js +83 -0
  2083. package/dist/chunk-W5AALTIW.js.map +1 -0
  2084. package/dist/chunk-WE2WKC6F.js +184 -0
  2085. package/dist/chunk-WE2WKC6F.js.map +1 -0
  2086. package/dist/chunk-WG2WFANT.js +1 -0
  2087. package/dist/chunk-WG2WFANT.js.map +1 -0
  2088. package/dist/chunk-WGHFNNPK.js +51 -0
  2089. package/dist/chunk-WGHFNNPK.js.map +1 -0
  2090. package/dist/chunk-WHKR6RJD.js +29 -0
  2091. package/dist/chunk-WHKR6RJD.js.map +1 -0
  2092. package/dist/chunk-WJOQM3AJ.js +153 -0
  2093. package/dist/chunk-WJOQM3AJ.js.map +1 -0
  2094. package/dist/chunk-WKUA6P3W.js +51 -0
  2095. package/dist/chunk-WKUA6P3W.js.map +1 -0
  2096. package/dist/chunk-WMV66OKU.js +38 -0
  2097. package/dist/chunk-WMV66OKU.js.map +1 -0
  2098. package/dist/chunk-WMY276HD.js +1 -0
  2099. package/dist/chunk-WMY276HD.js.map +1 -0
  2100. package/dist/chunk-WR7ELCIL.js +168 -0
  2101. package/dist/chunk-WR7ELCIL.js.map +1 -0
  2102. package/dist/chunk-WSVVWL3G.js +81 -0
  2103. package/dist/chunk-WSVVWL3G.js.map +1 -0
  2104. package/dist/chunk-WTJ2643W.js +131 -0
  2105. package/dist/chunk-WTJ2643W.js.map +1 -0
  2106. package/dist/chunk-WTOTWP6A.js +27 -0
  2107. package/dist/chunk-WTOTWP6A.js.map +1 -0
  2108. package/dist/chunk-WTR74VUV.js +88 -0
  2109. package/dist/chunk-WTR74VUV.js.map +1 -0
  2110. package/dist/chunk-WTUV5BM5.js +196 -0
  2111. package/dist/chunk-WTUV5BM5.js.map +1 -0
  2112. package/dist/chunk-WUE5EK42.js +79 -0
  2113. package/dist/chunk-WUE5EK42.js.map +1 -0
  2114. package/dist/chunk-WVML3ENZ.js +1 -0
  2115. package/dist/chunk-WVML3ENZ.js.map +1 -0
  2116. package/dist/chunk-WXYLH3QZ.js +60 -0
  2117. package/dist/chunk-WXYLH3QZ.js.map +1 -0
  2118. package/dist/chunk-WYRI5RO7.js +84 -0
  2119. package/dist/chunk-WYRI5RO7.js.map +1 -0
  2120. package/dist/chunk-WZ4RBOFD.js +1 -0
  2121. package/dist/chunk-WZ4RBOFD.js.map +1 -0
  2122. package/dist/chunk-X3HL5C6H.js +1 -0
  2123. package/dist/chunk-X3HL5C6H.js.map +1 -0
  2124. package/dist/chunk-X3MT3H4W.js +220 -0
  2125. package/dist/chunk-X3MT3H4W.js.map +1 -0
  2126. package/dist/chunk-XA7HTVZO.js +146 -0
  2127. package/dist/chunk-XA7HTVZO.js.map +1 -0
  2128. package/dist/chunk-XBHQT4BQ.js +85 -0
  2129. package/dist/chunk-XBHQT4BQ.js.map +1 -0
  2130. package/dist/chunk-XBS4HWQU.js +131 -0
  2131. package/dist/chunk-XBS4HWQU.js.map +1 -0
  2132. package/dist/chunk-XCBQXSTR.js +1 -0
  2133. package/dist/chunk-XCBQXSTR.js.map +1 -0
  2134. package/dist/chunk-XDWNHACB.js +64 -0
  2135. package/dist/chunk-XHLLSKKY.js +149 -0
  2136. package/dist/chunk-XHLLSKKY.js.map +1 -0
  2137. package/dist/chunk-XLUADX33.js +1 -0
  2138. package/dist/chunk-XLUADX33.js.map +1 -0
  2139. package/dist/chunk-XNAATHFY.js +106 -0
  2140. package/dist/chunk-XNAATHFY.js.map +1 -0
  2141. package/dist/chunk-XPHTCJER.js +167 -0
  2142. package/dist/chunk-XPHTCJER.js.map +1 -0
  2143. package/dist/chunk-XTMVF3YN.js +55 -0
  2144. package/dist/chunk-XTMVF3YN.js.map +1 -0
  2145. package/dist/chunk-XXOQWYYG.js +233 -0
  2146. package/dist/chunk-XXOQWYYG.js.map +1 -0
  2147. package/dist/chunk-Y2U2E7X3.js +97 -0
  2148. package/dist/chunk-Y2U2E7X3.js.map +1 -0
  2149. package/dist/chunk-Y4KKS6WL.js +44 -0
  2150. package/dist/chunk-Y5ULB2OY.js +254 -0
  2151. package/dist/chunk-Y5ULB2OY.js.map +1 -0
  2152. package/dist/chunk-Y6SB4WU2.js +165 -0
  2153. package/dist/chunk-Y6SB4WU2.js.map +1 -0
  2154. package/dist/chunk-Y7R6XH3L.js +276 -0
  2155. package/dist/chunk-Y7R6XH3L.js.map +1 -0
  2156. package/dist/chunk-Y7ZHWA5W.js +35 -0
  2157. package/dist/chunk-Y7ZHWA5W.js.map +1 -0
  2158. package/dist/chunk-YA2ZL3VG.js +1 -0
  2159. package/dist/chunk-YA2ZL3VG.js.map +1 -0
  2160. package/dist/chunk-YC4DEUYW.js +25 -0
  2161. package/dist/chunk-YC4DEUYW.js.map +1 -0
  2162. package/dist/chunk-YGQX7BNI.js +63 -0
  2163. package/dist/chunk-YGQX7BNI.js.map +1 -0
  2164. package/dist/chunk-YICNA5LG.js +1 -0
  2165. package/dist/chunk-YICNA5LG.js.map +1 -0
  2166. package/dist/chunk-YLHCICYS.js +166 -0
  2167. package/dist/chunk-YLHCICYS.js.map +1 -0
  2168. package/dist/chunk-YP6ZD54S.js +102 -0
  2169. package/dist/chunk-YP6ZD54S.js.map +1 -0
  2170. package/dist/chunk-YPBWZBWV.js +167 -0
  2171. package/dist/chunk-YPBWZBWV.js.map +1 -0
  2172. package/dist/chunk-YQR2AHWW.js +80 -0
  2173. package/dist/chunk-YQR2AHWW.js.map +1 -0
  2174. package/dist/chunk-YRCK4I4C.js +53 -0
  2175. package/dist/chunk-YRCK4I4C.js.map +1 -0
  2176. package/dist/chunk-YROUM5BG.js +97 -0
  2177. package/dist/chunk-YROUM5BG.js.map +1 -0
  2178. package/dist/chunk-YRRVE2Q2.js +132 -0
  2179. package/dist/chunk-YRRVE2Q2.js.map +1 -0
  2180. package/dist/chunk-YSTIA37W.js +79 -0
  2181. package/dist/chunk-YSTIA37W.js.map +1 -0
  2182. package/dist/chunk-YWFTXJI3.js +290 -0
  2183. package/dist/chunk-YWFTXJI3.js.map +1 -0
  2184. package/dist/chunk-Z24VOTA7.js +18 -0
  2185. package/dist/chunk-Z24VOTA7.js.map +1 -0
  2186. package/dist/chunk-Z6FXJ44X.js +240 -0
  2187. package/dist/chunk-Z6FXJ44X.js.map +1 -0
  2188. package/dist/chunk-Z6TIAVEG.js +52 -0
  2189. package/dist/chunk-Z6TIAVEG.js.map +1 -0
  2190. package/dist/chunk-ZASIPWXI.js +172 -0
  2191. package/dist/chunk-ZASIPWXI.js.map +1 -0
  2192. package/dist/chunk-ZAY4U5ML.js +70 -0
  2193. package/dist/chunk-ZAY4U5ML.js.map +1 -0
  2194. package/dist/chunk-ZB4VIVRS.js +1 -0
  2195. package/dist/chunk-ZB4VIVRS.js.map +1 -0
  2196. package/dist/chunk-ZHILFSFU.js +100 -0
  2197. package/dist/chunk-ZHILFSFU.js.map +1 -0
  2198. package/dist/chunk-ZLAYBWLN.js +60 -0
  2199. package/dist/chunk-ZLAYBWLN.js.map +1 -0
  2200. package/dist/chunk-ZLNTTNNQ.js +263 -0
  2201. package/dist/chunk-ZLNTTNNQ.js.map +1 -0
  2202. package/dist/chunk-ZOIKDERY.js +43 -0
  2203. package/dist/chunk-ZOIKDERY.js.map +1 -0
  2204. package/dist/chunk-ZOLAYP2D.js +37 -0
  2205. package/dist/chunk-ZOLAYP2D.js.map +1 -0
  2206. package/dist/chunk-ZOUWHGV3.js +73 -0
  2207. package/dist/chunk-ZOUWHGV3.js.map +1 -0
  2208. package/dist/chunk-ZR3EJVR7.js +1 -0
  2209. package/dist/chunk-ZR3EJVR7.js.map +1 -0
  2210. package/dist/chunk-ZSMKFQVQ.js +1 -0
  2211. package/dist/chunk-ZSMKFQVQ.js.map +1 -0
  2212. package/dist/chunk-ZU4NDURP.js +1 -0
  2213. package/dist/chunk-ZU4NDURP.js.map +1 -0
  2214. package/dist/chunk-ZWFHTM6H.js +125 -0
  2215. package/dist/chunk-ZWFHTM6H.js.map +1 -0
  2216. package/dist/chunk-ZZ35CIK7.js +262 -0
  2217. package/dist/chunk-ZZ35CIK7.js.map +1 -0
  2218. package/dist/chunk-ZZVL523U.js +254 -0
  2219. package/dist/chunk-ZZVL523U.js.map +1 -0
  2220. package/dist/data-display/Alert.js +3 -1
  2221. package/dist/data-display/AlertDialog.js +2 -1
  2222. package/dist/data-display/AsyncStateContainer.js +10 -61
  2223. package/dist/data-display/AsyncStateContainer.js.map +1 -1
  2224. package/dist/data-display/Avatar.js +3 -1
  2225. package/dist/data-display/Badge.js +7 -578
  2226. package/dist/data-display/Badge.js.map +1 -1
  2227. package/dist/data-display/Banner.js +4 -344
  2228. package/dist/data-display/Banner.js.map +1 -1
  2229. package/dist/data-display/CardKit.js +36 -259
  2230. package/dist/data-display/CardKit.js.map +1 -1
  2231. package/dist/data-display/Carousel.js +13 -757
  2232. package/dist/data-display/Carousel.js.map +1 -1
  2233. package/dist/data-display/Chart.js +27 -12
  2234. package/dist/data-display/Chip.js +4 -127
  2235. package/dist/data-display/Chip.js.map +1 -1
  2236. package/dist/data-display/DataGrid.js +7 -1
  2237. package/dist/data-display/DataViews.js +182 -6720
  2238. package/dist/data-display/DataViews.js.map +1 -1
  2239. package/dist/data-display/DescriptionItem.js +3 -2
  2240. package/dist/data-display/EmptyState.js +1 -1
  2241. package/dist/data-display/ErrorState.js +2 -1
  2242. package/dist/data-display/HoverCard.js +8 -563
  2243. package/dist/data-display/HoverCard.js.map +1 -1
  2244. package/dist/data-display/InteractiveTooltip.js +6 -228
  2245. package/dist/data-display/InteractiveTooltip.js.map +1 -1
  2246. package/dist/data-display/LazyImage.js +8 -350
  2247. package/dist/data-display/LazyImage.js.map +1 -1
  2248. package/dist/data-display/Lightbox.js +15 -820
  2249. package/dist/data-display/Lightbox.js.map +1 -1
  2250. package/dist/data-display/LoadingState.js +6 -2
  2251. package/dist/data-display/MapPreview.js +18 -955
  2252. package/dist/data-display/MapPreview.js.map +1 -1
  2253. package/dist/data-display/Popover.js +4 -116
  2254. package/dist/data-display/Popover.js.map +1 -1
  2255. package/dist/data-display/Progress.js +6 -322
  2256. package/dist/data-display/Progress.js.map +1 -1
  2257. package/dist/data-display/SectionOnboarding.js +5 -184
  2258. package/dist/data-display/SectionOnboarding.js.map +1 -1
  2259. package/dist/data-display/Sheet.js +11 -3
  2260. package/dist/data-display/StatCard.js +6 -192
  2261. package/dist/data-display/StatCard.js.map +1 -1
  2262. package/dist/data-display/Stepper.js +1 -1
  2263. package/dist/data-display/Table.js +9 -900
  2264. package/dist/data-display/Table.js.map +1 -1
  2265. package/dist/data-display/Timeline.js +5 -344
  2266. package/dist/data-display/Timeline.js.map +1 -1
  2267. package/dist/data-display/TimingDiagram.js +5 -378
  2268. package/dist/data-display/TimingDiagram.js.map +1 -1
  2269. package/dist/data-display/Tooltip.js +4 -139
  2270. package/dist/data-display/Tooltip.js.map +1 -1
  2271. package/dist/en-US.js +31 -18
  2272. package/dist/feedback/ConfirmAction.js +19 -7
  2273. package/dist/feedback/Dialog.js +3 -2
  2274. package/dist/feedback/Modal.js +7 -176
  2275. package/dist/feedback/Modal.js.map +1 -1
  2276. package/dist/feedback/Sonner.js +8 -392
  2277. package/dist/feedback/Sonner.js.map +1 -1
  2278. package/dist/feedback/StackedModal.js +12 -5
  2279. package/dist/feedback/Toast.js +2 -1
  2280. package/dist/feedback/TutorialOverlay.js +7 -661
  2281. package/dist/feedback/TutorialOverlay.js.map +1 -1
  2282. package/dist/form/AddressAutocomplete.js +18 -885
  2283. package/dist/form/AddressAutocomplete.js.map +1 -1
  2284. package/dist/form/Autocomplete.js +9 -764
  2285. package/dist/form/Autocomplete.js.map +1 -1
  2286. package/dist/form/Button.js +3 -1
  2287. package/dist/form/Calendar.js +10 -1
  2288. package/dist/form/CategorySelect.js +21 -3
  2289. package/dist/form/CepField.js +9 -3
  2290. package/dist/form/Checkbox.js +3 -1
  2291. package/dist/form/CodeEditor.js +8 -456
  2292. package/dist/form/CodeEditor.js.map +1 -1
  2293. package/dist/form/Command.js +14 -529
  2294. package/dist/form/Command.js.map +1 -1
  2295. package/dist/form/CreatableSelect.js +5 -153
  2296. package/dist/form/CreatableSelect.js.map +1 -1
  2297. package/dist/form/DateRangePicker.js +26 -562
  2298. package/dist/form/DateRangePicker.js.map +1 -1
  2299. package/dist/form/Form.js +2 -1
  2300. package/dist/form/HeaderButton.js +2 -1
  2301. package/dist/form/Input.js +5 -1
  2302. package/dist/form/InputOTP.js +6 -219
  2303. package/dist/form/InputOTP.js.map +1 -1
  2304. package/dist/form/Label.js +7 -313
  2305. package/dist/form/Label.js.map +1 -1
  2306. package/dist/form/Menubar.js +12 -459
  2307. package/dist/form/Menubar.js.map +1 -1
  2308. package/dist/form/PasswordStrength.js +5 -366
  2309. package/dist/form/PasswordStrength.js.map +1 -1
  2310. package/dist/form/PhoneInput.js +7 -507
  2311. package/dist/form/PhoneInput.js.map +1 -1
  2312. package/dist/form/RadioGroup.js +7 -590
  2313. package/dist/form/RadioGroup.js.map +1 -1
  2314. package/dist/form/RichTextEditor.js +8 -552
  2315. package/dist/form/RichTextEditor.js.map +1 -1
  2316. package/dist/form/SearchPalette.js +6 -364
  2317. package/dist/form/SearchPalette.js.map +1 -1
  2318. package/dist/form/Select.js +2 -1
  2319. package/dist/form/Slider.js +5 -2
  2320. package/dist/form/Switch.js +6 -2
  2321. package/dist/form/Textarea.js +4 -210
  2322. package/dist/form/Textarea.js.map +1 -1
  2323. package/dist/form/Toggle.js +5 -229
  2324. package/dist/form/Toggle.js.map +1 -1
  2325. package/dist/form/ToggleGroup.js +2 -1
  2326. package/dist/form/UploadButton.js +6 -429
  2327. package/dist/form/UploadButton.js.map +1 -1
  2328. package/dist/form/total-form.js +56 -309
  2329. package/dist/form/total-form.js.map +1 -1
  2330. package/dist/layout/Accordion.js +8 -231
  2331. package/dist/layout/Accordion.js.map +1 -1
  2332. package/dist/layout/Card.js +4 -1
  2333. package/dist/layout/CardGrid.js +3 -46
  2334. package/dist/layout/CardGrid.js.map +1 -1
  2335. package/dist/layout/Collapsible.js +6 -211
  2336. package/dist/layout/Collapsible.js.map +1 -1
  2337. package/dist/layout/Container.js +4 -66
  2338. package/dist/layout/Container.js.map +1 -1
  2339. package/dist/layout/ContentToolbar.js +21 -7
  2340. package/dist/layout/Dashboard.js +11 -384
  2341. package/dist/layout/Dashboard.js.map +1 -1
  2342. package/dist/layout/Drawer.js +6 -143
  2343. package/dist/layout/Drawer.js.map +1 -1
  2344. package/dist/layout/Resizable.js +6 -194
  2345. package/dist/layout/Resizable.js.map +1 -1
  2346. package/dist/layout/ScrollArea.js +8 -521
  2347. package/dist/layout/ScrollArea.js.map +1 -1
  2348. package/dist/layout/Separator.js +3 -1
  2349. package/dist/layout/SettingsLayout.js +15 -988
  2350. package/dist/layout/SettingsLayout.js.map +1 -1
  2351. package/dist/layout/Sidebar.js +7 -116
  2352. package/dist/layout/Sidebar.js.map +1 -1
  2353. package/dist/layout/Skeleton.js +3 -1
  2354. package/dist/layout/Spacer.js +3 -60
  2355. package/dist/layout/Spacer.js.map +1 -1
  2356. package/dist/layout/TableFilter.js +5 -2
  2357. package/dist/locales.js +62 -36
  2358. package/dist/locales.js.map +1 -1
  2359. package/dist/navigation/AppHeader.js +30 -633
  2360. package/dist/navigation/AppHeader.js.map +1 -1
  2361. package/dist/navigation/Breadcrumbs.js +5 -585
  2362. package/dist/navigation/Breadcrumbs.js.map +1 -1
  2363. package/dist/navigation/CommandPalette.js +8 -548
  2364. package/dist/navigation/CommandPalette.js.map +1 -1
  2365. package/dist/navigation/ContextMenu.js +4 -203
  2366. package/dist/navigation/ContextMenu.js.map +1 -1
  2367. package/dist/navigation/DropdownMenu.js +2 -1
  2368. package/dist/navigation/NavigationMenu.js +10 -1030
  2369. package/dist/navigation/NavigationMenu.js.map +1 -1
  2370. package/dist/navigation/Pagination.js +5 -1
  2371. package/dist/navigation/Tabs.js +6 -430
  2372. package/dist/navigation/Tabs.js.map +1 -1
  2373. package/dist/pt-BR.js +30 -17
  2374. package/dist/social-login-button.js +20 -157
  2375. package/dist/social-login-button.js.map +1 -1
  2376. package/dist/types/components/form/Input/Input.d.ts.map +1 -1
  2377. package/dist/types/components/form/Input/text-field-slim.d.ts +35 -0
  2378. package/dist/types/components/form/Input/text-field-slim.d.ts.map +1 -0
  2379. package/dist/typography/Blockquote.js +3 -142
  2380. package/dist/typography/Blockquote.js.map +1 -1
  2381. package/dist/typography/Code.js +4 -190
  2382. package/dist/typography/Code.js.map +1 -1
  2383. package/dist/typography/Heading.js +3 -1
  2384. package/dist/typography/Paragraph.js +3 -81
  2385. package/dist/typography/Paragraph.js.map +1 -1
  2386. package/dist/typography/Text.js +1 -1
  2387. package/dist/user-avatar.js +14 -69
  2388. package/dist/user-avatar.js.map +1 -1
  2389. package/dist/utility/AnimatedIcon.js +6 -510
  2390. package/dist/utility/AnimatedIcon.js.map +1 -1
  2391. package/dist/utility/AspectRatio.js +4 -76
  2392. package/dist/utility/AspectRatio.js.map +1 -1
  2393. package/dist/utility/InfiniteScroll.js +6 -172
  2394. package/dist/utility/InfiniteScroll.js.map +1 -1
  2395. package/dist/utility/InstallPrompt.js +16 -383
  2396. package/dist/utility/InstallPrompt.js.map +1 -1
  2397. package/dist/utility/Overflow.js +2 -1
  2398. package/dist/utility/Portal.js +4 -32
  2399. package/dist/utility/Portal.js.map +1 -1
  2400. package/dist/utility/Transition.js +5 -71
  2401. package/dist/utility/Transition.js.map +1 -1
  2402. package/dist/utility/VirtualList.js +6 -327
  2403. package/dist/utility/VirtualList.js.map +1 -1
  2404. package/dist/utility/WorkflowStep.js +7 -518
  2405. package/dist/utility/WorkflowStep.js.map +1 -1
  2406. package/dist/utils.js +6 -52
  2407. package/dist/utils.js.map +1 -1
  2408. package/package.json +1 -1
  2409. package/src/components/form/Input/Input.tsx +13 -4
  2410. package/src/components/form/Input/text-field-slim.tsx +261 -0
  2411. package/dist/TextareaRichEditor-ZFB44VWZ.js +0 -303
  2412. package/dist/TextareaRichEditor-ZFB44VWZ.js.map +0 -1
  2413. package/dist/chunk-2S2SB5C7.js +0 -145
  2414. package/dist/chunk-2S2SB5C7.js.map +0 -1
  2415. package/dist/chunk-2XFGVZTZ.js +0 -449
  2416. package/dist/chunk-2XFGVZTZ.js.map +0 -1
  2417. package/dist/chunk-3X3JVF6E.js +0 -438
  2418. package/dist/chunk-3X3JVF6E.js.map +0 -1
  2419. package/dist/chunk-5ETQ3NX5.js +0 -236
  2420. package/dist/chunk-5FC7M2Y5.js +0 -149
  2421. package/dist/chunk-5FC7M2Y5.js.map +0 -1
  2422. package/dist/chunk-5TCPZ6GR.js +0 -217
  2423. package/dist/chunk-5TCPZ6GR.js.map +0 -1
  2424. package/dist/chunk-5YQGQUZL.js +0 -44
  2425. package/dist/chunk-6J7WQGE5.js +0 -126
  2426. package/dist/chunk-7A3ZBFNC.js +0 -68
  2427. package/dist/chunk-7XUYRPRQ.js +0 -158
  2428. package/dist/chunk-7XUYRPRQ.js.map +0 -1
  2429. package/dist/chunk-ADCIUZX2.js +0 -123
  2430. package/dist/chunk-ADCIUZX2.js.map +0 -1
  2431. package/dist/chunk-AL3W7TXN.js +0 -465
  2432. package/dist/chunk-AL3W7TXN.js.map +0 -1
  2433. package/dist/chunk-ANNZ3PLI.js +0 -304
  2434. package/dist/chunk-ANNZ3PLI.js.map +0 -1
  2435. package/dist/chunk-AR5LUIBC.js +0 -1605
  2436. package/dist/chunk-AR5LUIBC.js.map +0 -1
  2437. package/dist/chunk-ARNQIGA4.js +0 -305
  2438. package/dist/chunk-DI44UBHQ.js +0 -379
  2439. package/dist/chunk-DI44UBHQ.js.map +0 -1
  2440. package/dist/chunk-DSO6BL77.js +0 -288
  2441. package/dist/chunk-ENUVGXLE.js +0 -206
  2442. package/dist/chunk-FD4W36WR.js +0 -110
  2443. package/dist/chunk-FKWNB4LW.js +0 -111
  2444. package/dist/chunk-GSEAUMCS.js +0 -402
  2445. package/dist/chunk-GSEAUMCS.js.map +0 -1
  2446. package/dist/chunk-HR7KRGJQ.js +0 -64
  2447. package/dist/chunk-ILXGVET4.js +0 -327
  2448. package/dist/chunk-ILXGVET4.js.map +0 -1
  2449. package/dist/chunk-KR2BP7NK.js +0 -651
  2450. package/dist/chunk-KR2BP7NK.js.map +0 -1
  2451. package/dist/chunk-KXARS46L.js +0 -689
  2452. package/dist/chunk-KXARS46L.js.map +0 -1
  2453. package/dist/chunk-L7L6SX64.js +0 -419
  2454. package/dist/chunk-L7L6SX64.js.map +0 -1
  2455. package/dist/chunk-LGB6Z34C.js +0 -898
  2456. package/dist/chunk-LGB6Z34C.js.map +0 -1
  2457. package/dist/chunk-MXVO2KXV.js +0 -899
  2458. package/dist/chunk-MXVO2KXV.js.map +0 -1
  2459. package/dist/chunk-N554AFDB.js +0 -123
  2460. package/dist/chunk-N554AFDB.js.map +0 -1
  2461. package/dist/chunk-OOKQ2LMM.js +0 -250
  2462. package/dist/chunk-OOKQ2LMM.js.map +0 -1
  2463. package/dist/chunk-P3IPM2SZ.js +0 -114
  2464. package/dist/chunk-PQWPMIGH.js +0 -94
  2465. package/dist/chunk-PVLDKXKR.js +0 -732
  2466. package/dist/chunk-PVLDKXKR.js.map +0 -1
  2467. package/dist/chunk-RXE5CUUE.js +0 -445
  2468. package/dist/chunk-RXE5CUUE.js.map +0 -1
  2469. package/dist/chunk-S3H5DVFY.js +0 -10
  2470. package/dist/chunk-S4R6CKIG.js +0 -564
  2471. package/dist/chunk-S4R6CKIG.js.map +0 -1
  2472. package/dist/chunk-SQ5AV7IK.js +0 -282
  2473. package/dist/chunk-TLBCBVYY.js +0 -217
  2474. package/dist/chunk-TSPG6TWK.js +0 -32
  2475. package/dist/chunk-U7CIYYA7.js +0 -45
  2476. package/dist/chunk-UNM7KFDX.js +0 -1281
  2477. package/dist/chunk-UNM7KFDX.js.map +0 -1
  2478. package/dist/chunk-UY7UF7IN.js +0 -333
  2479. package/dist/chunk-UY7UF7IN.js.map +0 -1
  2480. package/dist/chunk-Y2JYDXL7.js +0 -15
  2481. package/dist/chunk-YKN5S2F6.js +0 -125
  2482. package/dist/chunk-YKN5S2F6.js.map +0 -1
  2483. package/dist/chunk-ZTF64TGW.js +0 -177
  2484. package/dist/chunk-ZTF64TGW.js.map +0 -1
  2485. /package/dist/{chunk-SQ5AV7IK.js.map → chunk-2JM65A4D.js.map} +0 -0
  2486. /package/dist/{chunk-ENUVGXLE.js.map → chunk-4R7QDDKR.js.map} +0 -0
  2487. /package/dist/{chunk-U7CIYYA7.js.map → chunk-7ZQGXK63.js.map} +0 -0
  2488. /package/dist/{chunk-7A3ZBFNC.js.map → chunk-CSFE7AUR.js.map} +0 -0
  2489. /package/dist/{chunk-FD4W36WR.js.map → chunk-GJ2NPAXA.js.map} +0 -0
  2490. /package/dist/{chunk-P3IPM2SZ.js.map → chunk-HIRSTFDW.js.map} +0 -0
  2491. /package/dist/{chunk-Y2JYDXL7.js.map → chunk-HPK33ACY.js.map} +0 -0
  2492. /package/dist/{chunk-TSPG6TWK.js.map → chunk-IHS3GDPZ.js.map} +0 -0
  2493. /package/dist/{chunk-TLBCBVYY.js.map → chunk-KXF4RD5B.js.map} +0 -0
  2494. /package/dist/{chunk-5ETQ3NX5.js.map → chunk-M624PGL4.js.map} +0 -0
  2495. /package/dist/{chunk-S3H5DVFY.js.map → chunk-NHL5ERBM.js.map} +0 -0
  2496. /package/dist/{chunk-DSO6BL77.js.map → chunk-NPK5TRIC.js.map} +0 -0
  2497. /package/dist/{chunk-PQWPMIGH.js.map → chunk-OCJFMTYA.js.map} +0 -0
  2498. /package/dist/{chunk-6J7WQGE5.js.map → chunk-R52HJAYO.js.map} +0 -0
  2499. /package/dist/{chunk-ARNQIGA4.js.map → chunk-VBOYWWG5.js.map} +0 -0
  2500. /package/dist/{chunk-FKWNB4LW.js.map → chunk-VKXGYBXD.js.map} +0 -0
  2501. /package/dist/{chunk-HR7KRGJQ.js.map → chunk-XDWNHACB.js.map} +0 -0
  2502. /package/dist/{chunk-5YQGQUZL.js.map → chunk-Y4KKS6WL.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-display/DataViews/base-card.tsx","../../src/components/data-display/DataViews/data-views-drag.tsx","../../src/components/data-display/DataViews/card-surface.ts","../../src/components/data-display/DataViews/data-views-types.ts","../../src/components/data-display/DataViews/data-views-copy-context.tsx","../../src/components/data-display/DataViews/base-list-card.tsx","../../src/components/data-display/DataViews/base-list-card-disclosure.ts","../../src/components/data-display/DataViews/base-list-card-geometry.tsx","../../src/components/data-display/DataViews/data-views-layout-context.tsx","../../src/components/data-display/DataViews/list-card-rails.tsx","../../src/components/data-display/DataViews/list-card-cells.tsx","../../src/components/data-display/DataViews/base-list-card-slots.tsx","../../src/components/data-display/DataViews/base-list-card-gutters.tsx","../../src/components/data-display/DataViews/DataViewsGrid.tsx","../../src/components/data-display/DataViews/data-views-grid-parts.tsx","../../src/components/data-display/DataViews/data-views-filter-panel.tsx","../../src/components/data-display/DataViews/data-views-category-pill.tsx","../../src/components/data-display/DataViews/data-views-range-pill.tsx","../../src/components/data-display/DataViews/data-views-number-input.tsx","../../src/components/data-display/DataViews/data-views-preset-chips.tsx","../../src/components/data-display/DataViews/data-views-range-presets.ts","../../src/components/data-display/DataViews/data-views-range-values.ts","../../src/components/data-display/DataViews/data-views-grid-bodies.tsx","../../src/components/data-display/DataViews/data-views-grid-helpers.tsx","../../src/components/data-display/DataViews/DataViewsBoard.tsx","../../src/components/data-display/DataViews/data-views-select-all-strip.tsx","../../src/components/data-display/DataViews/data-views-inline-bar.tsx","../../src/components/data-display/DataViews/data-views-bar-controls.tsx","../../src/components/data-display/DataViews/data-views-more-filters.tsx","../../src/components/data-display/DataViews/data-views-more-fields.tsx","../../src/components/data-display/DataViews/data-views-search.tsx","../../src/components/data-display/DataViews/data-views-overflow.ts","../../src/components/data-display/DataViews/data-views-overflow-costs.ts","../../src/components/data-display/DataViews/data-views-toolbar.tsx","../../src/components/data-display/DataViews/data-views-display-panel.tsx","../../src/components/data-display/DataViews/data-views-columns-tab.tsx","../../src/components/data-display/DataViews/data-views-view-nav.tsx","../../src/components/data-display/DataViews/data-views-display-tabs.tsx","../../src/components/data-display/DataViews/data-views-glyphs.tsx","../../src/components/data-display/DataViews/data-views-export.tsx","../../src/components/data-display/DataViews/data-views-shell-toolbar.tsx","../../src/components/data-display/DataViews/data-views-empty.tsx","../../src/components/data-display/DataViews/data-views-pagination.tsx","../../src/components/data-display/DataViews/data-views-scopes.tsx","../../src/components/data-display/DataViews/data-views-scope-tabs.tsx","../../src/components/data-display/DataViews/use-data-views-state.ts","../../src/components/data-display/DataViews/data-views-filter.ts","../../src/components/data-display/DataViews/data-views-columns.ts","../../src/components/data-display/DataViews/data-views-server-query.ts","../../src/components/data-display/DataViews/data-views-selection.ts","../../src/components/data-display/DataViews/DataViewsTableBase.tsx","../../src/components/data-display/DataViews/data-views-dirty.ts","../../src/components/data-display/DataViews/DeleteViewDialog.tsx","../../src/components/data-display/DataViews/ManageViewsDialog.tsx","../../src/components/data-display/DataViews/SaveViewModal.tsx","../../src/components/data-display/DataViews/data-views-preview.ts","../../src/components/data-display/DataViews/save-view-preview.tsx","../../src/components/data-display/DataViews/data-views-table-parts.tsx","../../src/components/data-display/DataViews/use-saved-views-controller.ts","../../src/components/data-display/DataViews/data-views-view-mutations.ts"],"sourcesContent":["\"use client\";\n\nimport { type ReactNode } from \"react\";\n\nimport { useTheme, type CSSObject } from \"@mui/material\";\n\n/** See the note on `CardSx` in `card-surface` — these fragments get merged. */\ntype CardSx = CSSObject | Record<string, unknown>;\n\nimport { Checkbox } from \"../../form/Checkbox\";\nimport { Card } from \"../../layout/Card\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport { DragHandle, useDragItem } from \"./data-views-drag\";\nimport {\n CARD_RADIUS,\n cardSurfaceStyles,\n isActionable,\n isSelectable,\n slotTestIds,\n type CardSurfaceProps,\n} from \"./card-surface\";\nimport { CARD_ASPECT_RATIOS, type CardAspectRatio } from \"./data-views-types\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\nexport interface BaseCardProps extends CardSurfaceProps {\n /** Extra body content below the caption (chips, meta). Optional. */\n children?: ReactNode;\n /** Tile proportion. Defaults to \"4:3\". */\n aspectRatio?: CardAspectRatio;\n /**\n * Size multiplier from the zoom slider (1 = base).\n *\n * Applied as `zoom`, so the whole card grows together — padding, typography,\n * the checkbox, the menu and the media alike — in step with its width, which\n * the grid sizes to base × scale. A card at scale 2 renders at ~twice the\n * size, its proportion preserved by `aspectRatio`. Default 1.\n */\n scale?: number;\n /** Display-image node (e.g. an `<img>` / thumbnail) filling the media region. */\n image?: ReactNode;\n /** Shown centered in the media region when there is no `image` (icon/initial). */\n imageFallback?: ReactNode;\n /** First-class title, rendered in the caption. */\n title?: ReactNode;\n /** Secondary caption line under the title. */\n subtitle?: ReactNode;\n /** The 3-dots menu (or any action node) pinned to the top-right corner. */\n menu?: ReactNode;\n /** Toggle this card's selection. Omit to hide the checkbox (non-selectable). */\n onToggleSelect?: () => void;\n /**\n * This card's id for drag purposes.\n *\n * Draggable ONLY inside a {@link DragContainerProvider} — see\n * `data-views-drag`. On the board that is how a card moves between columns;\n * in a grade it is how the operator reorders. Outside a container this is\n * inert and no grip appears.\n */\n dragId?: string | number;\n checkboxTestId?: string;\n}\n\n/**\n * The outlined-tile style: fixed ratio, scaled padding, selected/dimmed states.\n *\n * See the note on the row: `zoom` scales EVERY length in the subtree, including\n * the MUI internals (checkbox, chip, icon button) that no prop of ours reaches.\n * The grid still sizes the track to BASE_CARD_WIDTH x scale, so the tile fills\n * its track physically and lays its contents out in the unscaled box behind it\n * — which is what \"the whole card grows together\" was always meant to mean.\n */\nfunction cardSx(opts: {\n aspectRatio: CardAspectRatio;\n pad: number;\n scale: number;\n interactive: boolean;\n draggable: boolean;\n}): CardSx {\n const { aspectRatio, pad, scale, interactive, draggable } = opts;\n return {\n position: \"relative\",\n zoom: scale,\n aspectRatio: String(CARD_ASPECT_RATIOS[aspectRatio]),\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n p: pad,\n cursor: draggable ? \"grab\" : interactive ? \"pointer\" : undefined,\n ...(draggable ? { touchAction: \"none\", \"&:active\": { cursor: \"grabbing\" } } : {}),\n };\n}\n\n/**\n * How far the first block in flow must start below the tile's top edge to clear\n * the absolute overlays: their 4px inset plus the checkbox's 38px hit area (20px\n * glyph in MUI's 9px padding), which is the taller of the two corners.\n */\nconst OVERLAY_BAND_PX = 42;\n\n/**\n * The top margin each stacked slot needs, in MUI spacing units.\n *\n * The overlays are absolute, so they cost the flow nothing — over MEDIA that is\n * the whole point (a checkbox on a thumbnail reads as a checkbox on a\n * thumbnail). Over TEXT it is a collision: a title-only tile started its first\n * line at the padding edge, directly under the checkbox, and rendered\n * `Selecionada` with the box sitting on the `Se`. So when nothing pictorial is\n * there to absorb them, whichever block comes first clears the band instead.\n */\nfunction contentGaps(opts: {\n hasMedia: boolean;\n hasBody: boolean;\n overlays: boolean;\n pad: number;\n}): { body: number; caption: number } {\n const { hasMedia, hasBody, overlays, pad } = opts;\n const gap = pad * 0.5;\n const clear = !hasMedia && overlays ? Math.max(0, OVERLAY_BAND_PX / 8 - pad) : 0;\n return { body: hasMedia ? gap : clear, caption: hasMedia || hasBody ? gap : clear };\n}\n\n/** The top-corner overlays: the select checkbox (left) and the menu slot (right). */\nfunction CardOverlays({\n selected,\n onToggleSelect,\n checkboxTestId,\n menu,\n}: Pick<BaseCardProps, \"selected\" | \"onToggleSelect\" | \"checkboxTestId\" | \"menu\">): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <>\n {onToggleSelect && (\n <Box sx={{ position: \"absolute\", top: 4, left: 4, zIndex: 2 }}>\n <Checkbox\n checked={selected}\n onChange={() => onToggleSelect()}\n // Selecting must never trigger the card's own click (open/edit).\n onClick={(event) => event.stopPropagation()}\n size=\"small\"\n data-testid={checkboxTestId}\n aria-label={copy.selection.selectRow}\n />\n </Box>\n )}\n {menu && (\n <Box\n sx={{ position: \"absolute\", top: 4, right: 4, zIndex: 2 }}\n // Acting on the menu must never trigger the card's own click.\n onClick={(event) => event.stopPropagation()}\n >\n {menu}\n </Box>\n )}\n </>\n );\n}\n\n/**\n * Media region: fills the tile above the caption; centers `imageFallback` when\n * there is no image so title-only entities still fill the ratio box and mixed\n * grids stay aligned.\n */\nfunction CardMedia({ image, imageFallback }: Pick<BaseCardProps, \"image\" | \"imageFallback\">): React.JSX.Element {\n return (\n <Box\n sx={{\n flex: 1,\n minHeight: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n borderRadius: 1,\n \"& img\": { width: \"100%\", height: \"100%\", objectFit: \"cover\" },\n }}\n >\n {image ?? imageFallback}\n </Box>\n );\n}\n\n/** The body slot (chips/meta); fills remaining space when there is no media. */\nfunction CardBodyContent({\n children,\n fill,\n topGap,\n}: {\n children: ReactNode;\n fill: boolean;\n topGap: number;\n}): React.JSX.Element {\n return (\n <Box\n sx={{\n flex: fill ? 1 : \"none\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 0.75,\n mt: topGap,\n overflow: \"hidden\",\n }}\n >\n {children}\n </Box>\n );\n}\n\n/** The title/subtitle caption. */\nfunction CardCaption({\n title,\n subtitle,\n topGap,\n}: {\n title?: ReactNode;\n subtitle?: ReactNode;\n topGap: number;\n}): React.JSX.Element {\n return (\n <Box sx={{ mt: topGap, minWidth: 0 }}>\n {title != null && (\n <Text\n variant=\"heading\"\n size=\"sm\"\n weight=\"bold\"\n as=\"p\"\n style={{\n lineHeight: 1.15,\n fontSize: \"0.95rem\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </Text>\n )}\n {subtitle != null && (\n <Text variant=\"caption\" size=\"xs\" color=\"secondary\" as=\"p\">\n {subtitle}\n </Text>\n )}\n </Box>\n );\n}\n\n/** The stacked media / body / caption slots inside the tile (below the overlays). */\nfunction CardContents({\n children,\n image,\n imageFallback,\n title,\n subtitle,\n overlays,\n pad,\n}: Pick<BaseCardProps, \"children\" | \"image\" | \"imageFallback\" | \"title\" | \"subtitle\"> & {\n overlays: boolean;\n pad: number;\n}): React.JSX.Element {\n const hasMedia = image != null || imageFallback != null;\n const hasBody = children != null;\n const hasCaption = title != null || subtitle != null;\n const top = contentGaps({ hasMedia, hasBody, overlays, pad });\n return (\n <>\n {hasMedia && <CardMedia image={image} imageFallback={imageFallback} />}\n {hasBody && (\n <CardBodyContent fill={!hasMedia} topGap={top.body}>\n {children}\n </CardBodyContent>\n )}\n {hasCaption && <CardCaption title={title} subtitle={subtitle} topGap={top.caption} />}\n </>\n );\n}\n\n/**\n * Reusable selectable card shell for the DataViews \"Grade\" (cards) layout, and\n * the ONLY card component that lives in `@12-apps/ui` — every domain \"kind card\"\n * (product, mesa, role, …) lives in the app and composes this envelope. See the\n * per-slot helpers above; this shell just assembles them within a fixed-ratio\n * tile. Reads no context, so it renders standalone as well as inside the grid.\n */\n/**\n * Everything the tile derives from its props before it can render — pulled out\n * so `BaseCard` itself stays inside the complexity budget.\n */\nfunction useCardShell(props: BaseCardProps) {\n const actionable = isActionable(props.state);\n return {\n selectable: isSelectable(props),\n actionable,\n theme: useTheme(),\n slot: slotTestIds(props.testId),\n scale: props.scale ?? 1,\n // The card's own veto over the container's decision — see `CardSurfaceProps`.\n drag: useDragItem(props.draggable === false || !actionable ? undefined : props.dragId),\n };\n}\n\nexport function BaseCard(props: BaseCardProps): React.JSX.Element {\n const { aspectRatio = \"4:3\", selected = false } = props;\n const { menu, onToggleSelect, onClick } = props;\n const { selectable, actionable, theme, slot, scale, drag } = useCardShell(props);\n const dataTestId = props.testId;\n const checkboxTestId = slot(\"checkbox\");\n const pad = 1.5;\n\n return (\n <Card\n variant=\"outlined\"\n onClick={onClick}\n dataTestId={dataTestId}\n className={props.className}\n aria-label={props[\"aria-label\"]}\n aria-disabled={actionable ? undefined : true}\n {...drag.itemProps}\n // A PLAIN OBJECT, not a function. `Card` merges by spreading\n // (`sx={{ ...defaults, ...sx }}`), and spreading a function yields\n // nothing at all — the styles vanish silently, which is exactly how the\n // first version of this shipped with no variants and no effects.\n sx={{\n // The same corner the row uses: a Grade and a Lista of the same records\n // sit beside each other, and a tile that rounds harder than the row\n // reads as a different component.\n borderRadius: CARD_RADIUS,\n // The shared half — variant, colour, selection, effects — identical to\n // the one BaseListCard uses, so a Grade and a Lista of the same records\n // are dressed by one set of rules.\n ...cardSurfaceStyles(\n {\n ...props,\n selectable,\n shape: \"tile\",\n // A card mid-drag is a ghost of itself; the drop target is what the\n // eye should be on.\n state: drag.dragging ? \"disabled\" : props.state,\n },\n theme,\n ),\n // …and the tile's own geometry on top.\n ...cardSx({\n aspectRatio, pad, scale,\n interactive: onClick != null,\n draggable: drag.draggable && drag.handleProps === undefined,\n }),\n }}\n >\n {/* Bottom-left, opposite the menu and clear of the checkbox — a grip in\n the same corner as a control that toggles selection means every drag\n starts with a near-miss on it. */}\n {drag.draggable && (\n <Box sx={{ position: \"absolute\", bottom: 4, left: 4, zIndex: 2 }}>\n <DragHandle\n handleProps={drag.handleProps}\n gated={drag.handleProps !== undefined}\n testId={slot(\"drag\")}\n />\n </Box>\n )}\n <CardOverlays\n selected={selected}\n onToggleSelect={selectable ? onToggleSelect ?? (() => {}) : undefined}\n checkboxTestId={checkboxTestId}\n menu={menu}\n />\n <CardContents\n image={props.image}\n imageFallback={props.imageFallback}\n title={props.title}\n subtitle={props.subtitle}\n overlays={selectable || menu != null}\n pad={pad}\n >\n {props.children}\n </CardContents>\n </Card>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport { Box } from \"../../../mui/Box\";\n\n/**\n * DRAGGING, OWNED BY THE CONTAINER AND NOT BY THE CARD.\n *\n * A card cannot know whether it is draggable. The same `BaseListCard` renders\n * inside a reorderable queue, a read-only report and a board column that moves\n * items between columns — and only the thing holding them knows which. So the\n * container publishes a drag context and every card inside it becomes\n * draggable; a card with no container above it renders exactly as before, with\n * no handle and no listeners.\n *\n * This is a SEAM, not a drag implementation. It carries whatever props the\n * host's library hands out — dnd-kit's `attributes`/`listeners`, react-dnd's\n * connector output, or plain HTML5 `draggable` + `onDragStart` — because\n * picking one of those for every consumer of `@12-apps/ui` is a decision this\n * package has no business making. There is no drag dependency here, and adding\n * one would force it on every app that installs the library.\n */\n\n/** The props a container hands to one item. Deliberately untyped-ish: each DnD library has its own shape. */\nexport type DragItemProps = Record<string, unknown>;\n\nexport interface DragContainerValue {\n /**\n * Props for the item's ROOT — the element that moves. dnd-kit wants its\n * `setNodeRef` and transform style here; HTML5 wants `draggable` and\n * `onDragStart`.\n */\n itemProps: (id: string | number) => DragItemProps;\n /**\n * Props for the HANDLE alone, when the container wants drags to start only\n * from the grip.\n *\n * Whole-card dragging breaks the two things a card must still do: selecting\n * text in it, and hitting the checkbox without the row sliding away. When a\n * container returns handle props, the card puts them on the grip and leaves\n * the rest of itself alone.\n */\n handleProps?: (id: string | number) => DragItemProps;\n /** The id currently being dragged, so its card can dim itself. */\n activeId?: string | number | null;\n /**\n * WHERE THE DRAGGED ITEM WOULD LAND — the one thing a drag cannot be honest\n * without.\n *\n * A list that dims the row you picked up and shows nothing else asks you to\n * guess the outcome and find out by dropping. The marker turns that into a\n * statement: THIS gap is where it goes.\n *\n * Published by the container, not computed by the card, for the same reason\n * everything else here is: only the thing holding the items knows the\n * geometry — which one you are over, which edge of it, and whether that\n * position is legal. A card knows none of that about its neighbours.\n *\n * `null` while nothing is being dragged, or while the pointer is over no\n * valid target.\n */\n dropIndicator?: { id: string | number; edge: \"before\" | \"after\" } | null;\n}\n\nconst DragContainerContext = createContext<DragContainerValue | null>(null);\n\n/**\n * Marks everything inside as draggable. Cards read this; nothing else does.\n */\nexport function DragContainerProvider({\n value,\n children,\n}: {\n value: DragContainerValue;\n children: ReactNode;\n}): React.JSX.Element {\n return <DragContainerContext.Provider value={value}>{children}</DragContainerContext.Provider>;\n}\n\n/**\n * What one card needs to know about dragging.\n *\n * Returns the inert answer when there is no container OR no `dragId` — a card\n * that forgot its id must not render a handle that does nothing, which is worse\n * than no handle at all.\n */\nexport function useDragItem(dragId: string | number | undefined): {\n draggable: boolean;\n itemProps: DragItemProps;\n handleProps: DragItemProps | undefined;\n dragging: boolean;\n /** Which of this card's edges the marker sits on, or null for neither. */\n dropEdge: \"before\" | \"after\" | null;\n} {\n const container = useContext(DragContainerContext);\n if (!container || dragId === undefined) {\n return { draggable: false, itemProps: {}, handleProps: undefined, dragging: false, dropEdge: null };\n }\n const indicator = container.dropIndicator;\n return {\n draggable: true,\n itemProps: container.itemProps(dragId),\n handleProps: container.handleProps?.(dragId),\n dragging: container.activeId === dragId,\n dropEdge: indicator != null && indicator.id === dragId ? indicator.edge : null,\n };\n}\n\n/**\n * THE DROP MARKER — one rule across the card's edge, drawn where the item lands.\n *\n * Shared by every draggable surface rather than reimplemented per card, so a\n * reorderable list, a board column and a grid of tiles all say the same thing\n * the same way. A consumer wiring its own DnD gets this for free by publishing\n * `dropIndicator`; it never draws the marker itself.\n *\n * ABSOLUTE, AND OUTSIDE THE FLOW ON PURPOSE. A marker that took layout space\n * would push every row below it down by its own height the moment it appeared —\n * the list would twitch as you dragged across it, and the gap you were aiming\n * at would move out from under the pointer. Drawn over the gap instead, nothing\n * reflows.\n *\n * `pointerEvents: none` so it cannot swallow the dragover events that placed it,\n * and `aria-hidden` because the position it reports belongs in a live region the\n * LIST owns — fifty rows each announcing a marker is a screen-reader nightmare.\n */\nexport function DropIndicator({ edge }: { edge: \"before\" | \"after\" }): React.JSX.Element {\n return (\n <Box\n aria-hidden\n data-slot=\"drop-indicator\"\n data-drop-edge={edge}\n sx={{\n position: \"absolute\",\n left: 0,\n right: 0,\n // Centred ON the gap rather than inside the card: the item lands\n // BETWEEN two rows, and a rule sitting within one of them reads as\n // \"into this row\" instead.\n ...(edge === \"before\" ? { top: -2 } : { bottom: -2 }),\n height: 3,\n borderRadius: 2,\n bgcolor: \"primary.main\",\n pointerEvents: \"none\",\n zIndex: 2,\n }}\n />\n );\n}\n\n/**\n * The grip. Six dots, the convention everywhere, drawn rather than imported so\n * this costs no icon dependency.\n *\n * `cursor: grab` on the handle only when the container gates drags to it —\n * otherwise the whole card carries the cursor and the handle is just an\n * affordance saying so.\n */\nexport function DragHandle({\n handleProps,\n gated,\n testId,\n}: {\n handleProps: DragItemProps | undefined;\n gated: boolean;\n testId?: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"span\"\n aria-hidden={handleProps ? undefined : true}\n data-testid={testId}\n {...handleProps}\n sx={{\n display: \"inline-grid\",\n gridTemplateColumns: \"repeat(2, 3px)\",\n gap: \"2px\",\n flexShrink: 0,\n p: 0.5,\n borderRadius: 1,\n color: \"text.disabled\",\n cursor: gated ? \"grab\" : \"inherit\",\n touchAction: \"none\",\n \"&:active\": { cursor: gated ? \"grabbing\" : \"inherit\" },\n \"&:hover\": { color: \"text.secondary\" },\n }}\n >\n {Array.from({ length: 6 }).map((_, index) => (\n <Box\n key={index}\n component=\"span\"\n sx={{ width: 3, height: 3, borderRadius: \"50%\", bgcolor: \"currentColor\" }}\n />\n ))}\n </Box>\n );\n}\n","import { alpha, keyframes, type CSSObject, type Theme } from \"@mui/material\";\n\nimport { fadeInScaleAnimation } from \"../Badge/Badge.animations\";\n\n/**\n * A plain style object, not MUI's `SxProps`.\n *\n * `SxProps` is a union including arrays and functions, so a value typed as one\n * cannot be spread — and these fragments exist precisely to be merged. Note also\n * that `Card` merges by SPREADING (`sx={{ ...defaults, ...sx }}`), so handing it\n * a function yields nothing at all: resolve the theme with `useTheme` first.\n */\ntype CardSx = CSSObject | Record<string, unknown>;\n\n/** The ring, as scale + opacity so it never leaves the compositor. */\nconst pulseRing = keyframes`\n 0% { transform: scale(1); opacity: 0.9; }\n 70% { transform: scale(1.04); opacity: 0; }\n 100% { transform: scale(1.04); opacity: 0; }\n`;\n\n/**\n * THE CONTRACT BOTH CARDS IMPLEMENT.\n *\n * `BaseCard` (a tile) and `BaseListCard` (a row) are one object seen from two\n * angles, so the surface — variant, colour, selectability, draggability,\n * emphasis and state — is declared once and spread into both.\n */\n\n/**\n * How much chrome the surface claims. Button's vocabulary, spelled Button's\n * way: a card and a button are both surfaces the operator presses, and having\n * one say `outline` while the other says `outlined` taxes everyone who writes\n * both. Chip's `filled | outlined` was the wrong model — a chip is a token in a\n * sentence and has only those two things to say.\n */\nexport type CardSurfaceVariant = \"outline\" | \"ghost\" | \"text\" | \"glass\";\n\n/** The theme colour a card's selection and emphasis are drawn in. */\nexport type CardSurfaceColor =\n | \"primary\"\n | \"secondary\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"info\";\n\n/**\n * Why this card is asking to be noticed.\n *\n * ONE union, not six booleans. `glow`/`pulse`/`animate`/`bounce`/`shimmer`\n * combined into 32 states of which about three meant anything —\n * `pulse + shimmer + bounce` is not a thing anyone wants, and every one of\n * those combinations was a state somebody could reach by accident.\n */\nexport type CardEmphasis =\n /** Nothing. The overwhelming default. */\n | \"none\"\n /** Look here now: an accent bar, and a ring that beats six times and settles. */\n | \"attention\"\n /** This just arrived: an accent bar and one fade-in. */\n | \"new\";\n\n/** A row and a tile carry emphasis differently — see `emphasisSx`. */\ntype CardShape = \"row\" | \"tile\";\n\n/**\n * What this record IS, as opposed to how it looks.\n *\n * `dimmed` only greyed pixels, which left a cancelled row's buttons live and\n * clickable. This carries the meaning, so the card can also stop offering\n * actions on something that cannot be acted on.\n */\nexport type CardState = \"default\" | \"cancelled\" | \"disabled\";\n\nexport interface CardSurfaceProps {\n /** How much chrome the surface claims. Defaults to `outline`. */\n variant?: CardSurfaceVariant;\n /** Theme colour for selection and emphasis. Defaults to `primary`. */\n color?: CardSurfaceColor;\n /**\n * Can this card be selected — and does it show it?\n *\n * The capability, separate from the handler. `selectable` gets the checkbox\n * AND the selected treatment; `selectable={false}` has neither, however\n * `selected` is set, so a stale flag arriving with the data cannot make a\n * read-only row render as picked. Defaults to whether `onToggleSelect` exists.\n */\n selectable?: boolean;\n /** Whether this card is currently in the selection. */\n selected?: boolean;\n /**\n * Opt OUT of dragging even inside a drag container.\n *\n * Draggability is the container's decision (see `data-views-drag`); this is\n * the card's veto — a pinned row, a summary line, a record that may not move.\n */\n draggable?: boolean;\n /**\n * Where this card leads.\n *\n * PREFER THIS TO `onClick`. A clickable `<div>` cannot be cmd-clicked,\n * middle-clicked or \"copy link address\"'d, and wrapping interactive children\n * in a click handler is the a11y violation it looks like. With `href` the\n * title is a real `<a>` stretched over the card by a pseudo-element: one\n * whole-row target, correct tab order, every browser affordance intact, and\n * the buttons inside stay ordinary buttons.\n */\n href?: string;\n /** Anchor target, when `href` is set. */\n target?: string;\n /** Card click, for a card that does not navigate. See `href` first. */\n onClick?: () => void;\n /** What this record is. `cancelled`/`disabled` also suppress the actions. */\n state?: CardState;\n /** Why this card is asking to be noticed. Defaults to `none`. */\n emphasis?: CardEmphasis;\n className?: string;\n /**\n * One id; the parts derive from it (`${testId}-checkbox`, `-drag`, `-menu`,\n * `-value`). A prop per slot would have been `checkboxTestId`,\n * `menuTestId`, `valueTestId`… one for every part anybody ever tested.\n */\n testId?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * ONE RADIUS FOR BOTH SHAPES, off the token scale on purpose.\n *\n * `Card`'s own steps are 4px and 8px and its `lg` is 16px, all chosen for a\n * surface nearly as tall as it is wide. A 56px row is not that shape — the\n * corner runs most of the way down both ends and curves away from the square\n * checkbox and square thumbnail inside it — and a tile that rounds harder than\n * the row it sits beside in the same view reads as a different component.\n *\n * 3px takes the hard point off the corner without being seen as a curve.\n * `divider` rows override it back to 0; a bottom rule has no corners to round.\n */\nexport const CARD_RADIUS = \"3px\";\n\n/** Every slot's test id, derived from the card's one. */\nexport function slotTestIds(testId: string | undefined): (slot: string) => string | undefined {\n return (slot) => (testId ? `${testId}-${slot}` : undefined);\n}\n\n/** Is this card selectable? Explicit wins; otherwise a handler implies it. */\nexport function isSelectable(\n props: Pick<CardSurfaceProps, \"selectable\"> & { onToggleSelect?: () => void },\n): boolean {\n return props.selectable ?? props.onToggleSelect != null;\n}\n\n/** Can this record be acted on at all? */\nexport function isActionable(state: CardState | undefined): boolean {\n return state !== \"disabled\" && state !== \"cancelled\";\n}\n\n/**\n * Variant styling. Everything but `outline` drops the border.\n *\n * `ghost` keeps a faint SURFACE where `text` has none — without that the two\n * were pixel-identical at rest and the union carried a distinction it did not\n * draw. Ghost is \"a surface, quietly\"; text is \"no surface at all\", which is\n * what a host wants when it is drawing the container itself.\n */\nfunction variantSx(variant: CardSurfaceVariant, theme: Theme): CardSx {\n if (variant === \"ghost\") {\n return {\n border: 0,\n backgroundColor: \"action.hover\",\n \"&:hover\": { backgroundColor: \"action.selected\" },\n };\n }\n if (variant === \"text\") {\n return { border: 0, backgroundColor: \"transparent\", boxShadow: \"none\" };\n }\n if (variant === \"glass\") {\n // THEME-AWARE, and it keeps its edges.\n //\n // This was a hardcoded `rgba(255,255,255,·)` fill with a near-white border,\n // which had two problems. On a dark palette a 55%-white pane is not frosted\n // glass, it is a pale rectangle. And on a light one BOTH the fill and the\n // border land on white and vanish, so `glass` rendered as `text` — the same\n // nothing, reached by a different name.\n //\n // The blur is what makes it glass, and a blur is only visible over\n // something. So the pane keeps a real hairline and a shallow shadow: over a\n // plain surface it still reads as a raised pane rather than as absence, and\n // over an image or a gradient the blur does the rest.\n return {\n backgroundColor: alpha(theme.palette.background.paper, 0.55),\n backdropFilter: \"blur(8px)\",\n // `divider` as-is. NOT `alpha(divider, …)`: MUI's `alpha` REPLACES the\n // channel rather than scaling it, and `divider` is already a 12% black —\n // so asking for 80% of it produced an 80% black slab of a border.\n borderColor: theme.palette.divider,\n boxShadow: `0 1px 3px ${alpha(theme.palette.common.black, 0.1)}`,\n };\n }\n return {};\n}\n\n/**\n * MOTION IS OPT-IN, ALWAYS.\n *\n * Everything animated here is wrapped in this. Fifty rows breathing in unison\n * is a vestibular trigger, and honouring the OS setting is not a polish item —\n * it is the difference between a list somebody can look at and one they cannot.\n */\nconst MOTION_OK = \"@media (prefers-reduced-motion: no-preference)\";\n\n/**\n * THE ROW'S ATTENTION SIGNAL IS A BAR, NOT A HALO.\n *\n * A glow is a weak signal in a list: full-width rows stacked tight means the\n * halo bleeds 15px into the neighbours above and below and reads as a rendering\n * artifact, and stacked with a `selected` ring and the browser's focus ring it\n * becomes three concentric halos on one row. Five rows needing attention at\n * once turns the page into a smear.\n *\n * A 3px accent on the leading edge is stronger, costs no motion at all, works\n * under reduced-motion, cannot bleed into a neighbour, and stacks cleanly\n * however many rows raise their hand. It is where operational tables land.\n */\nfunction accentBar(main: string): CardSx {\n return {\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n insetInlineStart: 0,\n insetBlock: 0,\n width: 3,\n borderStartStartRadius: \"inherit\",\n borderEndStartRadius: \"inherit\",\n backgroundColor: main,\n pointerEvents: \"none\",\n },\n };\n}\n\n/**\n * The tile's lift — a card that has been RAISED, not one that is lit from within.\n *\n * This was Button's glow: a 20px bloom at 0.6 over a 40px bloom at 0.3, plus\n * `brightness(1.05)`. On a button, which is small and pressed and gone, that\n * reads as energy. On a tile it read as a neon sign — 40px of saturated colour\n * bleeding into the gaps of a grid whose whole job is to let the eye compare\n * cards, and the brightness filter washing the image and the caption with it.\n *\n * Three shadows doing three jobs instead: a hairline ring that tints the card's\n * own edge in the accent colour, a tight contact shadow, and one soft shadow\n * offset DOWNWARD. Offset is what separates elevation from emission — a glow is\n * symmetrical because its source is the object; a shadow falls because the\n * light is somewhere else. It stays legible on a dark canvas, where the old\n * bloom was the brightest thing on the screen.\n */\nfunction liftSx(main: string): CardSx {\n return {\n boxShadow: [\n `0 0 0 1px ${alpha(main, 0.45)}`,\n `0 1px 2px ${alpha(main, 0.12)}`,\n `0 8px 20px -6px ${alpha(main, 0.3)}`,\n ].join(\", \"),\n };\n}\n\n/**\n * A breath that STOPS.\n *\n * Six iterations, not `infinite`. A restaurant admin has this open for a whole\n * shift, and something pulsing in the periphery forever is fatigue rather than\n * urgency — worse, once two or three rows are doing it the signal means\n * nothing. It settles, and the accent bar carries the state from then on.\n *\n * Animating `transform`/`opacity` on a pseudo-element, never `box-shadow`: a\n * box-shadow keyframe repaints every frame, and fifty of them drop frames on\n * exactly the tablet a restaurant floor uses. This one is compositor-only.\n */\nfunction pulseSx(main: string): CardSx {\n return {\n [MOTION_OK]: {\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n borderRadius: \"inherit\",\n border: `2px solid ${main}`,\n animation: `${pulseRing} 1.6s ease-out 6`,\n pointerEvents: \"none\",\n },\n },\n };\n}\n\n/** The emphasis treatments, in the terms the shape can actually carry. */\nfunction emphasisSx(emphasis: CardEmphasis, main: string, shape: CardShape): CardSx {\n if (emphasis === \"attention\") {\n // The bar on both; the lift only where there is room for it to spread.\n return {\n ...accentBar(main),\n ...(shape === \"tile\" ? liftSx(main) : {}),\n ...pulseSx(main),\n };\n }\n if (emphasis === \"new\") {\n return {\n ...accentBar(main),\n [MOTION_OK]: { animation: `${fadeInScaleAnimation} 240ms ease-out` },\n };\n }\n return {};\n}\n\n/**\n * The shared half of a card's styling. Each component adds its own geometry —\n * a tile's aspect ratio, a row's rails.\n */\n/**\n * WHAT THE TWO NON-DEFAULT STATES LOOK LIKE — and why they cannot look alike.\n *\n * Both were `opacity: 0.6` and nothing else, so a record the business CANCELLED\n * and a row this user merely cannot touch were pixel-identical. The type has\n * always drawn the distinction (`CardState`); only the styling had not, which\n * made `cancelled` a comment rather than a state.\n *\n * `cancelled` is a VOIDED record: still there, still worth reading, no longer\n * counting. The figures get struck through, because a dimmed `R$ 1.250,00`\n * still reads as money owed and a struck one cannot.\n *\n * `disabled` is INERT: nothing to read into, nothing to do with. It goes\n * greyscale — which also drains the status chip's colour, the one thing on the\n * row still shouting for attention — and says so on hover.\n */\nfunction stateSx(state: CardState): CardSx {\n if (state === \"cancelled\") {\n return {\n opacity: 0.65,\n // The META CLUSTER is struck too. It was left out, so a voided row kept a\n // crisp `05/08/2026, 13:45` and `PIX` between a struck title and a struck\n // total — the middle of the row reading as live data on a record the two\n // ends call void. Both lines of each pair go, as both lines of the caption\n // already do: on a cancelled record the label is as void as the value.\n '& [data-slot=\"value\"], & [data-slot=\"caption\"], & [data-slot=\"meta\"]': {\n textDecoration: \"line-through\",\n },\n };\n }\n if (state === \"disabled\") {\n return { opacity: 0.45, filter: \"grayscale(1)\", cursor: \"not-allowed\" };\n }\n return { opacity: 1 };\n}\n\nexport function cardSurfaceStyles(\n props: CardSurfaceProps & { selectable: boolean; shape: CardShape },\n theme: Theme,\n): CardSx {\n const { variant = \"outline\", color = \"primary\", selected = false, selectable } = props;\n const { state = \"default\", emphasis = \"none\" } = props;\n const main = theme.palette[color].main;\n // Selection styling is gated on the CAPABILITY: a card that cannot be\n // selected must not render as selected because a stale flag came with its data.\n const showSelected = selectable && selected;\n return {\n transition: \"border-color 120ms, box-shadow 120ms, background-color 120ms\",\n ...stateSx(state),\n ...variantSx(variant, theme),\n ...(showSelected\n ? {\n borderColor: `${color}.main`,\n boxShadow: `inset 0 0 0 1px ${main}`,\n backgroundColor: \"action.selected\",\n }\n : {}),\n ...emphasisSx(emphasis, main, props.shape),\n };\n}\n","import type { GridColumn, GridSort } from \"../DataGrid\";\nimport type { DropdownMenuItem } from \"../../navigation/DropdownMenu\";\n// A re-export does not bring the name into local scope, and the state/query\n// types below are written in terms of it.\nimport type { RangeValue } from \"./data-views-range-types\";\n\n/**\n * Shared types for the reusable admin \"DataViews\" table (FUT-88): a filter bar\n * (search-across-all + typed multi-select pills + column visibility) whose full\n * state — filters + sort + visible columns — a saved view (FUT-89) can capture\n * and restore. Each table declares its own columns + filter fields.\n */\n\n/**\n * A single, reusable row action. ONE definition drives BOTH the per-row \"⋮\"\n * kebab menu and the bulk-actions menu (tabwoah model): `onSelect` receives the\n * affected rows — `[row]` from a kebab, the whole selection from the bulk menu.\n * Single-item-only actions (e.g. \"Editar\") set `bulk: false` so they never\n * appear in the bulk menu.\n */\nexport interface RowAction<T extends Record<string, unknown>> {\n /** Stable id (also the `data-testid` suffix). */\n id: string;\n /** Menu label. In the kebab, `rowLabel` overrides it per row when provided. */\n label: string;\n /** Menu-item colour (e.g. `\"error\"` for destructive). */\n color?: DropdownMenuItem[\"color\"];\n /**\n * Runs on the affected rows: `[row]` from the kebab, all selected from bulk.\n * May be async — the bulk menu awaits it and only clears the selection once it\n * settles (keeping the selection on failure so the user can retry).\n */\n onSelect: (rows: T[]) => void | Promise<void>;\n /** Include in the bulk menu (2+ selected). Defaults to `true`. */\n bulk?: boolean;\n /** Include in the per-row kebab. Defaults to `true`. */\n row?: boolean;\n /** Per-row kebab label (e.g. `row.active ? \"Inativar\" : \"Ativar\"`). */\n rowLabel?: (row: T) => string;\n /**\n * Per-row applicability (e.g. state-machine guards). `false` hides the\n * kebab item for that row; in bulk the action runs only on the passing\n * rows and is dropped when none pass. Defaults to applicable.\n */\n isVisible?: (row: T) => boolean;\n}\n\n/** Selection state handed to a card renderer so it can drive its own checkbox. */\nexport interface DataViewCardSelection {\n selected: boolean;\n onToggleSelect: () => void;\n /**\n * Card SIZE multiplier from the toolbar zoom slider. The grid sizes the card's\n * width to `base × scale`; a card passes this to {@link BaseCard} `scale` so its\n * padding + typography grow by the same factor — the whole card scales together\n * (scale 2 → ~2× size). The proportion (aspect ratio) stays constant.\n */\n scale: number;\n}\n\n/**\n * The fixed proportions a {@link BaseCard} tile can take. The tile keeps this\n * ratio and grows in BOTH width and height as the zoom slider widens its grid\n * track, so a grid of cards stays visually uniform.\n */\nexport type CardAspectRatio = \"1:1\" | \"4:3\" | \"16:9\" | \"9:16\" | \"3:4\" | \"3:1\";\n\n/** Numeric width/height factor for each {@link CardAspectRatio} (CSS `aspect-ratio`). */\nexport const CARD_ASPECT_RATIOS: Record<CardAspectRatio, number> = {\n \"1:1\": 1,\n \"4:3\": 4 / 3,\n \"16:9\": 16 / 9,\n \"9:16\": 9 / 16,\n \"3:4\": 3 / 4,\n /**\n * The BANNER tile: too short for media, sized for two lines of text.\n *\n * Every other ratio here is picture-shaped, because they were added for cards\n * built around a thumbnail. A card whose subject is a NAME and a NUMBER — a\n * cart, an order, anything triaged rather than browsed — spends most of a 4:3\n * tile on an icon that repeats down the whole grid and says nothing.\n */\n \"3:1\": 3,\n};\n\n/** One selectable value inside a filter pill. */\nexport interface FilterOption {\n value: string;\n label: string;\n /**\n * Parent option's `value`, for a hierarchical field (`control: \"category\"`).\n * Ignored by the flat controls, so one option list serves both.\n */\n parentId?: string | null;\n}\n\n/** A typed, multi-select filter pill's configuration for a table. */\nexport interface FilterFieldConfig<T extends Record<string, unknown>> {\n /** Stable id; also the default row key when no `accessor` is given. */\n id: string;\n label: string;\n options: FilterOption[];\n /**\n * How the field renders in the filter panel. `checkboxes` (default) is best for\n * a few fixed options; `multiselect` is a compact dropdown for long option\n * lists; `category` is the hierarchical picker, for an option set that nests\n * via {@link FilterOption.parentId} — it renders parents as headings and\n * their children as the selectable rows, rather than flattening the tree into\n * one indistinguishable list.\n */\n control?: \"checkboxes\" | \"multiselect\" | \"category\";\n /**\n * Forces this filter to render as a searchable multi-select dropdown with the\n * search box always shown, regardless of how many options are currently\n * loaded. Use it when the option set can grow unbounded (e.g. a filter backed\n * by a relation such as Roles or Categories). Omit it for a closed value set\n * (an enum), which keeps the plain checkbox / \"search only when long\"\n * behavior.\n */\n searchEnabled?: boolean;\n /**\n * Reads the row's value(s) for this field. A row matches the pill when any of\n * its values is selected. Defaults to `String(row[id])`.\n */\n accessor?: (row: T) => string | string[];\n}\n\n/**\n * The range types live in `data-views-range-types` (this file outgrew the\n * size gate); they are re-exported here so `data-views-types` stays the one\n * name every consumer imports the model from.\n */\nexport type {\n DayRangeFieldConfig,\n NumberRangeFieldConfig,\n RangeFieldConfig,\n RangeFieldKind,\n RangePreset,\n RangeValue,\n} from \"./data-views-range-types\";\n\n/** A grid column that can join the search scan and the column-visibility menu. */\nexport interface DataViewColumn<T extends Record<string, unknown>> extends GridColumn<T> {\n /** Included in \"search across all columns\" (needs a resolvable value). */\n searchable?: boolean;\n /** Toggleable in the column-visibility menu. Defaults to true; set false for\n * structural columns (image thumbnail, actions kebab) that must always show. */\n hideable?: boolean;\n}\n\n/**\n * The DataViews layout (view type): the dense \"Tabela\" grid, the \"Grade\" of\n * cards, the \"Lista\" of full-width rows, or the \"Quadro\" board of state columns.\n * Lives with the state types rather than with the toggle because a saved view\n * CAPTURES it — see {@link DataViewState.layout}.\n */\nexport type DataViewsLayout = \"cards\" | \"list\" | \"board\" | \"table\";\n\n/** The full, serializable state a view captures. */\nexport interface DataViewState {\n /** Free text matched across every `searchable` column. */\n search: string;\n /** fieldId → selected option values (empty/absent = no constraint). */\n pills: Record<string, string[]>;\n /** fieldId → selected numeric range (min/max). Absent/empty = no constraint. */\n ranges?: Record<string, RangeValue>;\n sortBy: GridSort[];\n /** Column ids kept visible; a hideable column not listed here is hidden. */\n visibleColumns: string[];\n /**\n * Column ids in READING ORDER. Absent ⇒ the order the table declared them in.\n *\n * Order is view state for the same reason visibility is: reordering columns is\n * an operator deciding what to read FIRST, and a saved view that restored the\n * columns but not their order would restore half a decision. Ids the table no\n * longer declares are ignored at render, and ids missing from a stale list\n * fall in after it — so a column added since the view was saved appears rather\n * than disappearing.\n */\n order?: string[];\n /**\n * The active SCOPE id — the page-level partition the scope tabs select (see\n * `ScopeConfig`). Optional, so a table that declares no scopes is untouched\n * and no view persisted before scopes existed breaks.\n *\n * Stored raw and RESOLVED at read time: the declared scopes change underneath\n * a saved view, and a view naming a scope that has since been removed must\n * fall back at render rather than break.\n */\n scope?: string;\n /**\n * The layout the view was saved in. Optional — absent means \"whatever the user\n * is currently using\", which is the pre-existing behaviour.\n *\n * A LAYOUT FALLBACK IS NOT A LAYOUT CHANGE: a table rendered as stacked rows\n * on a phone still has `\"table\"` stored here, so the view round-trips the\n * stored layout regardless of the device that opened it.\n */\n layout?: DataViewsLayout;\n}\n\n/** A pristine view state showing every given column and no filters/sort. */\nexport function emptyViewState(visibleColumns: string[]): DataViewState {\n return { search: \"\", pills: {}, ranges: {}, sortBy: [], visibleColumns };\n}\n\n/**\n * The URL-driven slice of {@link DataViewState} — the controls a server-mode host\n * mirrors from the address bar (search / pills / ranges / sort), WITHOUT\n * `visibleColumns`. Supplying it re-applies those controls when its reference\n * changes (e.g. browser back/forward or a deep-link on the same route), merging\n * over the current state so a user's show/hide column choices are preserved —\n * unlike `appliedState`, which fully replaces the state to apply a saved view.\n */\nexport type DataViewSyncState = Pick<\n DataViewState,\n \"search\" | \"pills\" | \"ranges\" | \"sortBy\" | \"scope\"\n>;\n\n/**\n * The query a SERVER-mode table emits whenever its filter/sort/page changes\n * (FUT-180). The host translates this into a backend request (see\n * `@12-apps/shared-helpers/search`) — in server mode the grid never filters,\n * sorts, or paginates in the browser; it renders exactly the page the server\n * returned. `page` is 1-based to match the backend contract.\n */\nexport interface DataViewQuery {\n search: string;\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n sortBy: GridSort[];\n /**\n * The RESOLVED active scope (see `resolveScope`), when the table declares\n * scopes. The KEY IS ABSENT for a table that declares none — not present-and-\n * undefined — so a host that never opted in sees a byte-identical query.\n *\n * It carries the resolved id, never the stored one: a deep link or a saved\n * view naming a scope the table no longer declares must not put that id on the\n * wire, where the backend would reject it and replace the page with an error.\n */\n scope?: string;\n page: number;\n pageSize: number;\n}\n\n/**\n * Server-mode wiring for a DataViews table. Its PRESENCE flips the table from\n * in-browser filtering/sorting/pagination to backend-driven: the rows handed in\n * are already the current page, `totalCount` is the unpaginated total, and\n * `onQueryChange` fires (search debounced by the host) whenever the user changes\n * a filter, the sort, or the page. This is the ONLY way an admin list should run\n * (see the app-side `DataViewsTable` wrapper, which requires it).\n */\nexport interface DataViewServer {\n /** Total matched rows across all pages (drives the counter + page count). */\n totalCount: number;\n /** Current 1-based page. */\n page: number;\n /** Rows per page. */\n pageSize: number;\n /** Fired when the effective query changes; the host re-fetches the page. */\n onQueryChange: (query: DataViewQuery) => void;\n /**\n * Per-scope totals for the scope tabs: `scopeId → count`. THE ONLY PIECE OF\n * THIS CONTRACT THAT CANNOT BE DONE CLIENT-SIDE — a count computed from the\n * loaded page is wrong the moment there is a second page, which is the\n * concrete bug scopes exist to fix.\n *\n * Compute it over search + pills + ranges while IGNORING the active scope.\n * Computed WITH the scope applied, every inactive tab reads zero, which is\n * worse than no counts at all.\n *\n * Omit it and the tabs render with no numbers. Nothing is ever invented from\n * the loaded rows to fill the gap.\n */\n scopeCounts?: Record<string, number>;\n}\n\n/**\n * Coerce an opaque persisted state (a saved view's JSON) into a valid\n * DataViewState, filling any missing part with a sane default. Guards against\n * legacy/older shapes so applying a saved view never renders an empty grid.\n */\nexport function coerceViewState(raw: unknown, allColumnIds: string[]): DataViewState {\n const value = (raw ?? {}) as Partial<DataViewState>;\n return {\n search: typeof value.search === \"string\" ? value.search : \"\",\n pills: asRecord<string[]>(value.pills),\n ranges: asRecord<RangeValue>(value.ranges),\n sortBy: Array.isArray(value.sortBy) ? value.sortBy : [],\n visibleColumns: Array.isArray(value.visibleColumns) ? value.visibleColumns : allColumnIds,\n order: Array.isArray(value.order) ? value.order : undefined,\n // Carried through UNVALIDATED against the declared scopes on purpose: a view\n // written before scopes existed has none (⇒ undefined ⇒ the first declared\n // scope at render), and one naming a since-removed scope keeps its stored id\n // here and falls back at READ time. Resolving here would rewrite the view.\n scope: typeof value.scope === \"string\" ? value.scope : undefined,\n layout: isLayout(value.layout) ? value.layout : undefined,\n };\n}\n\n/** Every layout this build knows how to render — the guard's single source. */\nexport const DATA_VIEWS_LAYOUTS: readonly DataViewsLayout[] = [\"cards\", \"list\", \"board\", \"table\"];\n\n/** Is this a layout this build knows how to render? Guards persisted JSON. */\nfunction isLayout(value: unknown): value is DataViewsLayout {\n return DATA_VIEWS_LAYOUTS.includes(value as DataViewsLayout);\n}\n\n/** A persisted map, or an empty one — persisted JSON can hold anything. */\nfunction asRecord<V>(value: unknown): Record<string, V> {\n return value !== null && typeof value === \"object\" ? (value as Record<string, V>) : {};\n}\n\n/** A saved view as consumed by the DataViews UI (FUT-89), with ownership flag. */\nexport interface SavedViewSummary {\n id: string;\n name: string;\n description: string | null;\n state: DataViewState;\n shared: boolean;\n pinned: boolean;\n isDefault: boolean;\n /** True when the current user owns the view (may edit/delete/pin/share it). */\n isOwner: boolean;\n}\n\n/** A saved-view repository record (opaque `state`), as returned to server pages. */\ninterface SavedViewRecordLike {\n id: string;\n name: string;\n description: string | null;\n state: unknown;\n shared: boolean;\n pinned: boolean;\n isDefault: boolean;\n isOwner: boolean;\n}\n\n/** Map a repository record to the client summary (opaque state → DataViewState). */\nexport function toSavedViewSummary(record: SavedViewRecordLike): SavedViewSummary {\n return { ...record, state: (record.state ?? {}) as DataViewState };\n}\n\n/**\n * Dependency-injection contracts for the framework-agnostic DataViewsTableBase:\n * the host app supplies saved-view persistence + router side-effects so the ui\n * component imports neither a backend (server actions) nor a framework router.\n */\n\n/** A saved view's editable fields, as the host persists them. */\nexport interface DataViewSaveInput {\n name: string;\n description: string;\n state: DataViewState;\n shared: boolean;\n pinned: boolean;\n isDefault: boolean;\n}\n\n/** Result of a persistence call — mirrors the app's `Result` without importing it. */\nexport type DataViewMutationResult = { ok: true } | { ok: false; error: string };\n\n/** Injected saved-view persistence (create/update/delete), wired by the host. */\nexport interface DataViewPersistence {\n create: (input: DataViewSaveInput) => Promise<DataViewMutationResult>;\n update: (id: string, input: DataViewSaveInput) => Promise<DataViewMutationResult>;\n remove: (id: string) => Promise<DataViewMutationResult>;\n}\n\n/** Injected router side-effects: sync the `?view=` param and re-fetch on change. */\nexport interface DataViewRouter {\n syncViewParam: (viewId: string | null) => void;\n refresh: () => void;\n}\n","import { createContext, useContext, type JSX, type ReactNode } from \"react\";\n\nimport type { DataViewsCopy } from \"./data-views-copy\";\n\n/**\n * The words this component family renders, put in scope once by the host.\n *\n * Context rather than a prop per component for the same reason\n * `data-views-layout-context` uses one: the nineteen files here are a single\n * surface mounted once, and threading words through leaves a host never names\n * is the prop-drilling context exists to avoid.\n */\nconst DataViewsCopyContext = createContext<DataViewsCopy | null>(null);\n\nexport function DataViewsCopyProvider({\n copy,\n children,\n}: {\n copy: DataViewsCopy;\n children: ReactNode;\n}): JSX.Element {\n return <DataViewsCopyContext.Provider value={copy}>{children}</DataViewsCopyContext.Provider>;\n}\n\n/**\n * The copy in scope.\n *\n * THROWS outside a provider rather than falling back. There is no meaningful\n * empty answer: a saved-views dialog with no words is broken, and any default\n * would be the origin host's Portuguese — which is the exact thing this config\n * exists to stop being silent. Failing at the first render names the wiring\n * mistake; blank buttons would hide it.\n */\nexport function useDataViewsCopy(): DataViewsCopy {\n const copy = useContext(DataViewsCopyContext);\n if (!copy) {\n throw new Error(\n \"DataViews components must be rendered inside <DataViewsCopyProvider copy={…}>. \" +\n \"@12-apps/ui ships no default copy; pass PT_BR_DATA_VIEWS_COPY to keep the pt-BR wording.\",\n );\n }\n return copy;\n}\n","\"use client\";\n\nimport { Collapse } from \"@mui/material\";\nimport { type ReactNode } from \"react\";\n\nimport { Card } from \"../../layout/Card\";\nimport type { DescriptionItemProps } from \"../DescriptionItem\";\nimport { Box } from \"../../../mui/Box\";\n\nimport { type CardSurfaceProps } from \"./card-surface\";\nimport { DropIndicator } from \"./data-views-drag\";\nimport { useDisclosure } from \"./base-list-card-disclosure\";\nimport { actionProps, metaShape, rowStyles, useRowShell } from \"./base-list-card-geometry\";\nimport { DiscloseSlot, DragSlot, SelectSlot } from \"./base-list-card-gutters\";\nimport { type DataViewsDensity } from \"./data-views-layout-context\";\nimport { cellRailsTemplate } from \"./list-card-rails\";\nimport { ListCardCells, cellTracks, useCellConfig, type ListCardCellConfig } from \"./list-card-cells\";\nimport {\n ListCardActions,\n ListCardCaption,\n ListCardMeta,\n ListCardTail,\n} from \"./base-list-card-slots\";\n\n/**\n * THE \"LISTA\" LAYOUT'S CARD — {@link BaseCard}'s horizontal sibling.\n *\n * `ListBody` always described the shape it wanted (\"a marker, a title, a\n * subtitle and a value on the right\") and never provided it, so every host\n * hand-rolled a `<Box>` flex row: a tint for selection with no checkbox, fixed\n * `minWidth` columns that ignored density and never collapsed, no hover, no\n * focus ring, and a `borderBottom` fighting the gap between rows.\n *\n * THE LIST OWNS THE COLUMNS. Inside a {@link ListCardGroup} this card is\n * `grid-template-columns: subgrid` across the group's rails, so the value sits\n * on its own edge and cannot be shunted about by the width of the status chip\n * beside it. Standalone it falls back to the same template on its own. See\n * `list-card-rails`.\n *\n * IT ANSWERS ITS OWN WIDTH, not the viewport — a container query, because the\n * same row renders full-bleed on a phone, in a 300px board column, and beside a\n * filter panel that opens and closes. Below `STACK_BREAK` it leaves the shared\n * rails entirely and goes two-line, which is the standard mobile transaction\n * row and beats truncating everything: title + value, then subtitle + status.\n */\n\nexport interface BaseListCardProps extends CardSurfaceProps {\n /** A marker: avatar, thumbnail or status glyph. Earn the pixels — a generic\n * icon repeated down fifty rows is noise. */\n leading?: ReactNode;\n /** First-class title. Rendered as the link when `href` is set. */\n title?: ReactNode;\n /** Secondary line under the title. */\n subtitle?: ReactNode;\n /**\n * Middle columns as labelled pairs — {@link DescriptionItem}s, not free-form\n * nodes, so a screen reader reads \"Data, 05/08/2026\" rather than four\n * unrelated strings. Stacked (label above value) by default.\n *\n * The FIRST rung of the collapse ladder: the only slot whose absence does not\n * stop the row being identified or acted on.\n */\n meta?: DescriptionItemProps[];\n /** Escape hatch for a middle section these pairs cannot express. */\n metaSlot?: ReactNode;\n /** The number this row is about. Its own rail, tabular figures, never truncated. */\n value?: ReactNode;\n /**\n * Inline actions — the one or two things done often enough to deserve a\n * button. Revealed on hover and `:focus-within` by default, so fifty rows of\n * buttons are not the resting state of the page.\n */\n actions?: ReactNode;\n /** Always show the inline actions, rather than on hover/focus. */\n actionsAlwaysVisible?: boolean;\n /** The 3-dots overflow menu, pinned to the end. Also opens on right-click. */\n menu?: ReactNode;\n /** What opens the overflow menu on right-click / long-press. */\n onContextMenu?: (event: React.MouseEvent) => void;\n /**\n * THE EXPANDABLE BODY — and the whole reason this is a card and not a table\n * row.\n *\n * A summary row of labelled columns is a table row with a border round it: it\n * restates what the table already says and gives nobody a reason to switch to\n * it. What a card can do that a table cell cannot is OPEN — carry the record's\n * own detail underneath its summary, in whatever shape that record wants.\n *\n * So this container makes no claim about what goes in here. It spans every\n * rail and imposes nothing: an order puts its line items and a totals ledger\n * here, a cart adds its recovery actions, a role lists its permissions. The\n * design of that area belongs entirely to the consumer, and none of it is the\n * envelope's business.\n *\n * ABSENT ⇒ NO CHEVRON. A row given nothing to reveal renders no disclosure\n * control at all, rather than one that opens onto an empty box, so a column of\n * chevrons is a truthful index of which rows have more behind them.\n */\n children?: ReactNode;\n /** Open on first render, for an uncontrolled card. Ignored when `expanded` is set. */\n defaultExpanded?: boolean;\n /**\n * Open state, when the LIST wants to own it.\n *\n * Left unset the card keeps its own, and rows open independently — several at\n * once, which is what comparing two records requires. Pass this (with\n * `onExpandedChange`) to impose something else, an accordion being the usual\n * reason.\n */\n expanded?: boolean;\n /** Fired with the state the card is asking to move to. */\n onExpandedChange?: (expanded: boolean) => void;\n /** Toggle this row's selection. Receives the raw event so a list can range-select. */\n onToggleSelect?: (event?: React.MouseEvent) => void;\n /** How much air the row gets. Vertical only — a full-width row cannot narrow. */\n density?: DataViewsDensity;\n /**\n * Fine-grained size multiplier on top of `density` (1 = base).\n *\n * Applied as `zoom`, so it scales EVERYTHING the row draws — type, gutters,\n * gaps, padding, the checkbox, the grip, the chip and the menu — not just the\n * handful of font sizes it once multiplied.\n */\n scale?: number;\n /** Flush style: a bottom rule instead of an outline. Row-only. */\n divider?: boolean;\n /** This row's id for drag purposes. Inert outside a `DragContainerProvider`. */\n dragId?: string | number;\n /**\n * The record this row is about, read by the list's cell config.\n *\n * Required only when cells are configured — the config's `primary`/`secondary`\n * are functions of the row, so without one there is nothing to render them\n * from and the card falls back to its named slots.\n */\n row?: Record<string, unknown>;\n /**\n * A cell config for a STANDALONE card.\n *\n * Inside a `ListCardGroup` the list's config wins and this is ignored: one\n * declaration of the list's shape is the whole point, and a row permitted to\n * override it could put its columns somewhere no other row has them.\n */\n cells?: readonly ListCardCellConfig<never>[];\n}\n\n\n\n\n/**\n * Which cell config applies, and whether this row resolves its own tracks.\n *\n * The list's config wins over the card's: one declaration of the list's shape is\n * the point, so a row inside a group cannot introduce a column of its own. And\n * the template is standalone-only — inside a group the GROUP owns it and the row\n * is subgrid over it, because a row resolving its own tracks is exactly what\n * stops a list from lining up.\n */\nfunction useResolvedCells(\n props: BaseListCardProps,\n inGroup: boolean,\n): {\n cells: readonly ListCardCellConfig<never>[] | null;\n configured: boolean;\n cellTemplate: string | null;\n} {\n const groupCells = useCellConfig();\n const cells = groupCells ?? props.cells ?? null;\n const configured = cells != null && cells.length > 0 && props.row != null;\n const cellTemplate = configured && !inGroup ? cellRailsTemplate(cellTracks(cells)) : null;\n return { cells, configured, cellTemplate };\n}\n\n\n/**\n * The row's middle: either the list's configured cells, or the named slots.\n *\n * Split out because the branch is the only conditional shape the card has, and\n * inlined it pushed `BaseListCard` past both the line and the complexity gate.\n */\nfunction RowContent({\n card,\n cells,\n configured,\n slot,\n actionable,\n meta,\n}: {\n card: BaseListCardProps;\n cells: readonly ListCardCellConfig<never>[] | null;\n configured: boolean;\n slot: (name: string) => string | undefined;\n actionable: boolean;\n meta: { columns: number; present: boolean };\n}): React.JSX.Element {\n if (configured && cells != null) {\n return (\n <>\n {/* The list's columns, rendered from this row. */}\n <ListCardCells cells={cells} row={card.row as never} />\n {/* THE MENU IS NOT PART OF THE CONFIG and never optional: it is where a\n * row's actions live, and a list that folded it into a cell would have\n * nowhere left to put them. So it brackets the cells on its own rail,\n * exactly as the gutters do at the other end. */}\n <ListCardActions\n actions={actionable ? card.actions : undefined}\n alwaysVisible={card.actionsAlwaysVisible}\n menu={card.menu}\n testId={slot}\n />\n </>\n );\n }\n return (\n <>\n <ListCardCaption\n title={card.title}\n subtitle={card.subtitle}\n href={card.href}\n target={card.target}\n testId={slot(\"title\")}\n />\n <ListCardMeta meta={card.meta} metaSlot={card.metaSlot} trailingRule={card.value != null} />\n <ListCardTail\n value={card.value}\n separated={meta.present}\n actions={actionable ? card.actions : undefined}\n actionsAlwaysVisible={card.actionsAlwaysVisible}\n menu={card.menu}\n testId={slot}\n />\n </>\n );\n}\n\n/**\n * The revealed body, and the rule that separates it from the summary.\n *\n * `gridColumn: 1 / -1` so it spans every rail: the summary's columns are the\n * LIST's, and nothing about them should constrain a detail area whose design\n * belongs to the consumer.\n *\n * Collapse rather than an unmount, so the body animates open and keeps its own\n * state between peeks — a consumer putting a form or a scrolled table in here\n * would otherwise have it reset on every toggle. `unmountOnExit` is deliberately\n * NOT set: fifty closed rows pay for fifty hidden subtrees, which is the trade\n * taken because the alternative re-runs every consumer's effects per toggle.\n */\nfunction ExpandableBody({\n disclosure,\n padY,\n pad,\n children,\n}: {\n disclosure: { expandable: boolean; expanded: boolean; regionId: string };\n padY: number;\n pad: number;\n children: ReactNode;\n}): React.JSX.Element {\n if (!disclosure.expandable) return <></>;\n return (\n <Box sx={{ gridColumn: \"1 / -1\", minWidth: 0 }}>\n <Collapse in={disclosure.expanded} timeout={150}>\n <Box\n id={disclosure.regionId}\n role=\"region\"\n sx={{\n minWidth: 0,\n // `padY`, not a fraction of the horizontal padding. The card's own\n // `py` wraps the summary AND the body, so once the body is in flow\n // the summary has no bottom padding of its own — at `comfortable`\n // the row visibly lost the height it had while closed.\n mt: padY,\n pt: padY,\n // A RULE BETWEEN SUMMARY AND BODY, bled through the row's horizontal\n // padding so it spans the card edge to edge. Inset, it reads as a\n // border around the content rather than a division of the card.\n borderTop: 1,\n borderColor: \"divider\",\n mx: -pad,\n px: pad,\n }}\n >\n {children}\n </Box>\n </Collapse>\n </Box>\n );\n}\n\nexport function BaseListCard(props: BaseListCardProps): React.JSX.Element {\n const { selected = false, onClick } = props;\n const shell = useRowShell(props);\n const { actionable, selectable, slot, drag, reserve, pad, padY, acts } = shell;\n const meta = metaShape(props);\n const disclosure = useDisclosure(props);\n const { cells, configured, cellTemplate } = useResolvedCells(props, shell.group != null);\n\n return (\n <Card\n variant=\"outlined\"\n className={props.className}\n dataTestId={props.testId}\n aria-label={props[\"aria-label\"]}\n aria-disabled={actionable ? undefined : true}\n onContextMenu={props.onContextMenu}\n {...(acts ? actionProps(onClick) : {})}\n {...drag.itemProps}\n // A PLAIN OBJECT: `Card` merges by spreading, so a function sx vanishes.\n sx={rowStyles(props, shell, cellTemplate)}\n >\n {drag.dropEdge != null && <DropIndicator edge={drag.dropEdge} />}\n <DiscloseSlot\n expandable={disclosure.expandable}\n expanded={disclosure.expanded}\n reserve={reserve}\n onToggle={disclosure.toggle}\n controls={disclosure.regionId}\n testId={slot(\"disclose\")}\n />\n <DragSlot drag={drag} reserve={reserve} testId={slot(\"drag\")} />\n <SelectSlot\n selectable={selectable}\n selected={selected}\n reserve={reserve}\n onToggleSelect={props.onToggleSelect}\n testId={slot(\"checkbox\")}\n />\n <Box data-slot=\"leading\" sx={{ display: \"flex\", alignItems: \"center\" }}>\n {props.leading}\n </Box>\n <RowContent card={props} cells={cells} configured={configured} slot={slot} actionable={actionable} meta={meta} />\n <ExpandableBody disclosure={disclosure} padY={padY} pad={pad}>\n {props.children}\n </ExpandableBody>\n </Card>\n );\n}\n\nexport { META_BREAK, STACK_BREAK } from \"./base-list-card-slots\";\n","\"use client\";\n\nimport { useId, useState } from \"react\";\n\nimport type { BaseListCardProps } from \"./base-list-card\";\n\n/**\n * The row's open state, whether it owns it or the list does.\n *\n * Controlled the moment `expanded` is passed, so a list imposing an accordion\n * is never fighting a second copy of the truth inside each row. Uncontrolled\n * otherwise, and rows then open independently — which is what comparing two\n * records side by side actually needs.\n */\nexport function useDisclosure(props: BaseListCardProps): {\n expandable: boolean;\n expanded: boolean;\n toggle: () => void;\n regionId: string;\n} {\n const [own, setOwn] = useState(props.defaultExpanded ?? false);\n // CONTROLLED ONLY WITH AN OWNER. `expanded` without `onExpandedChange` is a\n // value nothing can ever change — the chevron would move nothing and the row\n // would look broken. Storybook can persist a stray arg into a URL and produce\n // exactly that, so the pair is required before the card gives up its state.\n const controlled = props.expanded != null && props.onExpandedChange != null;\n const expanded = controlled ? props.expanded === true : own;\n // `useId` rather than a counter: the id has to survive an SSR pass and match\n // on hydration, or `aria-controls` points at nothing on the first paint.\n const regionId = useId();\n return {\n expandable: props.children != null,\n expanded,\n regionId,\n toggle: () => {\n if (!controlled) setOwn((open) => !open);\n props.onExpandedChange?.(!expanded);\n },\n };\n}\n","\"use client\";\n\nimport { useTheme } from \"@mui/material\";\n\nimport {\n CARD_RADIUS,\n cardSurfaceStyles,\n isActionable,\n isSelectable,\n slotTestIds,\n} from \"./card-surface\";\nimport { useDragItem } from \"./data-views-drag\";\nimport { DENSITY_ROW_PADDING } from \"./data-views-layout-context\";\nimport { RAIL_COUNT, RAIL_GAP, railsTemplateFor, useListRails } from \"./list-card-rails\";\nimport { STACK_BREAK } from \"./base-list-card-slots\";\nimport type { BaseListCardProps } from \"./base-list-card\";\n\n/**\n * THE ROW'S GEOMETRY AND SURFACE, split from the component at the size gate.\n *\n * Everything here answers \"what shape is this row, and where do its slots land\"\n * — the rails, the density padding, the two-line collapse, the drag and\n * selection plumbing. None of it renders anything, which is why the two halves\n * can live apart without either becoming harder to follow.\n */\n/**\n * Whether a click was really a click, or the tail of a text selection.\n *\n * Without this, selecting an order id to copy it navigates away instead — the\n * single most annoying thing a clickable row does.\n */\nfunction isTextSelection(): boolean {\n return (globalThis.getSelection?.()?.toString().length ?? 0) > 0;\n}\n\n/** Keyboard equivalence for a card that acts but does not navigate. */\nfunction clickKeys(onClick: () => void) {\n return (event: React.KeyboardEvent): void => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onClick();\n };\n}\n\n/**\n * Geometry: the rails, the density padding, the two-line collapse.\n *\n * SCALE IS `zoom`, NOT A SET OF MULTIPLIED FONT SIZES.\n *\n * It used to be the latter, on exactly three values — title, value, row padding\n * — so the slider left the subtitle, the meta labels, the rules, the checkbox,\n * the grip, the chip and the menu at their fixed sizes, and the row came apart\n * as you dragged it. Multiplying the rest is not a fix: the checkbox and the\n * chip are MUI internals sized in their own px, and no prop we pass reaches\n * them.\n *\n * `zoom` scales the used value of every length in the subtree — ours and theirs\n * — and unlike `transform: scale` it REFLOWS, so the row still occupies the\n * space it draws and the rails still resolve. Verified against the group: at\n * 1.4 all four rows keep identical rail edges, because subgrid tracks and the\n * zoom that reads them are the same for every row.\n */\n/**\n * DIVIDER COMPOSES WITH THE VARIANT — it changes the row's SHAPE, not its\n * surface.\n *\n * It used to set `border: 0` and hard-code its own rule colour, which discarded\n * whatever the variant had drawn: `outline`, `text` and `ghost` all collapsed\n * to one identical flush row, and the variant control silently stopped meaning\n * anything the moment `divider` was on.\n *\n * Now only the GEOMETRY changes here — the box's sides go, one edge stays — and\n * no `borderColor` is written, so the colour set by `cardSurfaceStyles` survives.\n * A variant that draws no border of its own gets the neutral rule from\n * {@link rowStyles}.\n */\nexport function rowSx(opts: {\n inGroup: boolean;\n railCount: number;\n cellTemplate: string | null;\n gutters: { disclose: boolean; drag: boolean; select: boolean };\n metaColumns: number;\n pad: number;\n padY: number;\n scale: number;\n divider: boolean;\n interactive: boolean;\n draggable: boolean;\n}): Record<string, unknown> {\n const { inGroup, railCount, cellTemplate, gutters, metaColumns, pad, padY, scale, divider, interactive, draggable } = opts;\n return {\n position: \"relative\",\n borderRadius: CARD_RADIUS,\n display: \"grid\",\n zoom: scale,\n // SUBGRID AND `container-type` CANNOT COEXIST on one element: containment\n // makes the box size independently of its parent, so the browser drops the\n // subgrid and every slot stacks into one column. (Observed exactly that —\n // computed `grid-template-columns: 1222px` on a card asking for subgrid.)\n //\n // So inside a group the GROUP is the query container and the row is the\n // subgrid; standalone, the row is both the container and its own grid.\n ...(inGroup\n ? { gridColumn: `span ${railCount}`, gridTemplateColumns: \"subgrid\" }\n : {\n containerType: \"inline-size\",\n gridTemplateColumns: cellTemplate ?? railsTemplateFor(gutters, metaColumns),\n }),\n alignItems: \"center\",\n // Wide enough that the meta cluster, the value and the status read as three\n // columns rather than one run of text — the complaint that started all this\n // was `MÉTODO PIX R$ 13,90` scanning as a single phrase.\n columnGap: RAIL_GAP,\n width: \"100%\",\n px: pad,\n py: padY,\n cursor: draggable ? \"grab\" : interactive ? \"pointer\" : undefined,\n ...(draggable ? { touchAction: \"none\", \"&:active\": { cursor: \"grabbing\" } } : {}),\n ...(interactive ? { \"&:hover\": { backgroundColor: \"action.hover\" } } : {}),\n // A real focus ring, which a clickable <div> never had.\n \"&:focus-visible\": { outline: 2, outlineStyle: \"solid\", outlineColor: \"primary.main\", outlineOffset: 2 },\n // TWO-LINE, below the point where the shared rails stop helping.\n //\n // The standard mobile transaction row: what the record IS and what it COST\n // on the first line, the supporting detail on the second. Better than\n // truncating four columns into ellipses, and the reason each slot carries a\n // `data-slot` — the placement is explicit rather than whatever order the\n // children happen to be in.\n //\n // [ select ][ leading ][ title …………… ][ menu ]\n // [ (cells) …………… ][ value ]\n //\n // The MENU stays in the top-right corner at every width. It is the row's\n // one fixed landmark — an overflow that moves to the second line on a phone\n // is an overflow nobody finds twice.\n [`@container (max-width: ${STACK_BREAK}px)`]: {\n gridTemplateColumns: \"auto auto minmax(0, 1fr) max-content\",\n ...(inGroup ? { gridColumn: `span ${RAIL_COUNT}` } : {}),\n rowGap: 0.75,\n columnGap: 1,\n '& > [data-slot=\"drag\"]': { display: \"none\" },\n '& > [data-slot=\"select\"]': { gridArea: \"1 / 1\" },\n '& > [data-slot=\"leading\"]': { gridArea: \"1 / 2\" },\n '& > [data-slot=\"caption\"]': { gridArea: \"1 / 3\" },\n '& > [data-slot=\"actions\"]': { gridArea: \"1 / 4\", justifyContent: \"flex-end\" },\n '& > [data-slot=\"meta\"]': { display: \"none\" },\n // Second line, starting under the title rather than under the checkbox.\n '& > [data-slot=\"value\"]': { gridArea: \"2 / 4\", textAlign: \"right\" },\n },\n ...(divider\n ? { borderRadius: 0, borderWidth: 0, borderBottomWidth: 1, borderStyle: \"solid\" }\n : {}),\n };\n}\n\n/**\n * A selectable full-width row: a marker, a title over a subtitle, labelled\n * middle columns, a value, a status, actions and a menu.\n *\n * A SHELL, like {@link BaseCard}. Domain rows live in the app and compose it.\n */\n/**\n * The id this row drags under, or nothing.\n *\n * `undefined` is the inert answer: `useDragItem` treats a missing id as \"no\n * drag\", which is how the card's own veto (`draggable={false}`) and an\n * unactionable record both switch dragging off without the card knowing\n * anything about the container above it.\n */\nfunction dragIdFor(\n props: BaseListCardProps,\n actionable: boolean,\n): string | number | undefined {\n return props.draggable === false || !actionable ? undefined : props.dragId;\n}\n\n/**\n * What the meta cluster amounts to — asked once, used three times: to size the\n * rail, to close the cluster with a rule, and to decide whether the value has\n * anything to be divided FROM.\n */\nexport function metaShape(props: BaseListCardProps): { columns: number; present: boolean } {\n const columns = props.meta?.length ?? 0;\n return { columns, present: columns > 0 || props.metaSlot != null };\n}\n\n/**\n * Everything the row derives before it can render — extracted so the component\n * stays inside the size budget.\n */\nexport function useRowShell(props: BaseListCardProps) {\n const actionable = isActionable(props.state);\n const group = useListRails();\n const scale = props.scale ?? 1;\n return {\n group,\n actionable,\n scale,\n theme: useTheme(),\n selectable: isSelectable(props),\n slot: slotTestIds(props.testId),\n drag: useDragItem(dragIdFor(props, actionable)),\n // Standalone holds no gutter open: there is no list beside it to line up\n // with, so a reserved-but-empty rail is pure inset.\n reserve: group?.reserveGutters ?? false,\n // 1, not 1.5. The row's contents still have to line up with the toolbar\n // above them, but 12px of card padding stacked on the checkbox's own 9px\n // and an empty drag gutter's 24px read as a row indented for no reason.\n //\n // Not multiplied by `scale` — the row's `zoom` already scales it, and doing\n // both would square the factor on padding alone.\n pad: 1,\n padY: DENSITY_ROW_PADDING[group?.density ?? props.density ?? \"cozy\"],\n // A card that navigates does so with a real anchor, so it takes no click\n // handler of its own — the stretched link IS the target.\n acts: props.onClick != null && props.href == null && actionable,\n };\n}\n\n/** The click/keyboard props a row that acts (but does not navigate) needs. */\nexport function actionProps(onClick: (() => void) | undefined) {\n return {\n role: \"button\",\n tabIndex: 0,\n onClick: () => {\n if (isTextSelection()) return;\n onClick?.();\n },\n onKeyDown: clickKeys(() => onClick?.()),\n };\n}\n\n/** The surface and the geometry, merged — the row's whole `sx` in one place. */\n\n/**\n * The row's painted surface, plus the divider's colour fallback.\n *\n * A variant with no border of its own (`text`, `ghost`) would draw its rule in\n * the inherited colour — the TEXT colour, i.e. a black bar across the row. The\n * neutral divider token is supplied only in that case; a variant that has a\n * border keeps it, which is the whole point of composing the two.\n */\nfunction rowSurface(\n props: BaseListCardProps,\n shell: ReturnType<typeof useRowShell>,\n): Record<string, unknown> {\n const { theme, selectable, drag } = shell;\n const surface = cardSurfaceStyles(\n { ...props, selectable, shape: \"row\", state: drag.dragging ? \"disabled\" : props.state },\n theme,\n );\n if (props.divider !== true || surface.borderColor != null) return surface;\n return { ...surface, borderBottomColor: theme.palette.divider };\n}\n\nexport function rowStyles(\n props: BaseListCardProps,\n shell: ReturnType<typeof useRowShell>,\n cellTemplate: string | null,\n): Record<string, unknown> {\n const { group, selectable, drag, reserve, pad, padY, scale, acts } = shell;\n return {\n ...rowSurface(props, shell),\n ...rowSx({\n inGroup: group !== null,\n railCount: group?.railCount ?? RAIL_COUNT,\n cellTemplate,\n gutters: {\n disclose: reserve || props.children != null,\n drag: reserve || drag.draggable,\n select: reserve || selectable,\n },\n metaColumns: metaShape(props).columns,\n pad,\n padY,\n scale,\n divider: props.divider ?? false,\n interactive: acts || props.href != null,\n draggable: drag.draggable && drag.handleProps === undefined,\n }),\n };\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport GridViewOutlinedIcon from \"@mui/icons-material/GridViewOutlined\";\n\nimport { Slider } from \"../../form/Slider\";\nimport { Box } from \"../../../mui/Box\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { DATA_VIEWS_LAYOUTS, type DataViewsLayout } from \"./data-views-types\";\n\n/**\n * The DataViews layout (view type): the dense \"Tabela\" grid, the \"Grade\" of\n * cards, the \"Lista\" of full-width rows, or the \"Quadro\" board of state columns.\n * Shared across the toolbar (the toggle) and the body (the selector) via context\n * so a single source of truth drives what renders — each layout only appears\n * when the table opts into it (`renderCard` for the grade, `renderListRow` for\n * the lista, `board` + `renderCard` for the quadro).\n */\nexport type { DataViewsLayout };\n\ninterface DataViewsLayoutValue {\n layout: DataViewsLayout;\n setLayout: (layout: DataViewsLayout) => void;\n /** How much air each record gets — see {@link DataViewsDensity}. */\n density: DataViewsDensity;\n setDensity: (density: DataViewsDensity) => void;\n /** Whether the cards layout is available (a `renderCard` was supplied). */\n canUseCards: boolean;\n /** Whether the list layout is available (a `renderListRow` was supplied). */\n canUseList: boolean;\n /** Whether the board layout is available (a `board` config AND a `renderCard`). */\n canUseBoard: boolean;\n /** Card-size zoom (0–100); drives the card grid's min column width. */\n zoom: number;\n setZoom: (zoom: number) => void;\n}\n\nconst DataViewsLayoutContext = createContext<DataViewsLayoutValue | null>(null);\n\n/** Default card zoom (0–100). */\nconst DEFAULT_ZOOM = 35;\n/** The card's width in px at scale 1 — the zoom slider multiplies this. */\nconst BASE_CARD_WIDTH = 180;\n/** The size multiplier the zoom slider spans (0.75× to 2×). */\nconst CARD_SCALE_RANGE = { min: 0.75, max: 2 } as const;\n\n/**\n * Where the user's layout preference is remembered. ONE key for every DataViews\n * table in the app, on purpose: picking \"Grade\" on Produtos is a statement about\n * how this operator likes to read lists, not about that one screen. Every other\n * screen that CAN render cards then opens in cards, and one that cannot falls\n * back without forgetting the preference.\n */\nconst LAYOUT_STORAGE_KEY = \"dataviews:layout\";\n\n/**\n * The density preference, remembered app-wide for the same reason as the layout:\n * an operator who wants tight rows wants them on every list, not on one.\n */\nconst DENSITY_STORAGE_KEY = \"dataviews:density\";\n\n/**\n * How much room each record gets. It means different things per layout, and\n * that is the point — one control, phrased in the terms of what is on screen:\n *\n * - table / list → row height (\"Baixa / Média / Alta\")\n * - cards → how many fit per row (\"Muitos / Médio / Poucos\")\n *\n * The board is unaffected: its cards are already sized by the zoom slider.\n */\nexport type DataViewsDensity = \"compact\" | \"cozy\" | \"comfortable\";\n\n/** Every density this build knows — the guard's single source. */\nconst DENSITIES: readonly DataViewsDensity[] = [\"compact\", \"cozy\", \"comfortable\"];\n\n/** Vertical padding (theme spacing units) per density, for a table or list row. */\nexport const DENSITY_ROW_PADDING: Record<DataViewsDensity, number> = {\n compact: 0.25,\n cozy: 0.75,\n comfortable: 1.5,\n};\n\n/**\n * The card WIDTH each density aims for, as a multiple of the base card width.\n *\n * Density used to cap the column COUNT, with a track floor of\n * `max(baseWidth, 100% / count)`. That base is a constant, so wherever it won\n * the arithmetic every density produced an identical track — \"Muitos\" and\n * \"Medio\" both drew 3 cards of 279px at md — and where the percentage won\n * instead, on a wide screen, the count was pinned and each card grew to a share\n * of the viewport: ~430px of card holding one chip and two lines of text.\n *\n * One width per density fixes both, because the number `auto-fill` divides by\n * now differs per density at every size. The spread is chosen so the three land\n * on DIFFERENT column counts across the range rather than by eye — 4/3/2 at md,\n * 6/4/3 at lg, 7/5/4 at xl, 13/9/8 at 2560.\n */\nexport const DENSITY_CARD_SCALE: Record<DataViewsDensity, number> = {\n compact: 0.84,\n cozy: 1.15,\n comfortable: 1.4,\n};\n\n/** The width a card aims for: the base width, scaled by zoom, then by density. */\nexport function cardTargetWidthFor(zoom: number, density: DataViewsDensity): number {\n return Math.round(cardMinWidthForZoom(zoom) * DENSITY_CARD_SCALE[density]);\n}\n\n/**\n * The BOARD's column-width multiplier per density.\n *\n * Density means \"how much air a record gets\", and on a board that is the column\n * width — narrow columns fit more etapas on screen, wide ones give each card\n * room to be read. Without this the board was the one layout the Exibição tab\n * offered nothing for: the format tile switched to Quadro and the whole density\n * section vanished, which reads as a control that broke rather than one that\n * does not apply.\n *\n * The spread is deliberately narrower than the card grid's. A board column has\n * a hard floor (`MIN_COLUMN_WIDTH` — a card below it stops being readable), so\n * a multiplier that undershoots it buys nothing and makes \"Estreita\" a tile\n * that does nothing on a phone.\n */\nexport const DENSITY_BOARD_SCALE: Record<DataViewsDensity, number> = {\n compact: 0.95,\n cozy: 1,\n comfortable: 1.25,\n};\n\n/**\n * Map the 0–100 zoom to the card SIZE multiplier. This is the single knob: the\n * card's width is {@link BASE_CARD_WIDTH} × scale and its padding + typography\n * scale by the same factor, so the whole card grows together (scale 2 → twice\n * the size, proportion preserved by the aspect ratio). Passed to a card via\n * `DataViewCardSelection.scale`.\n */\nexport function cardScaleForZoom(zoom: number): number {\n const clamped = Math.max(0, Math.min(100, zoom));\n return CARD_SCALE_RANGE.min + (clamped / 100) * (CARD_SCALE_RANGE.max - CARD_SCALE_RANGE.min);\n}\n\n/** The card grid's min column width in px = base width × the zoom size multiplier. */\nexport function cardMinWidthForZoom(zoom: number): number {\n return Math.round(BASE_CARD_WIDTH * cardScaleForZoom(zoom));\n}\n\n/** Which layouts this table can actually render. */\ninterface LayoutAvailability {\n canUseCards: boolean;\n canUseList: boolean;\n canUseBoard: boolean;\n}\n\n/** Is this a layout string this build knows? Guards whatever is in storage. */\nfunction isLayout(value: unknown): value is DataViewsLayout {\n return DATA_VIEWS_LAYOUTS.includes(value as DataViewsLayout);\n}\n\n/** Is this a density this build knows? Guards whatever is in storage. */\nfunction isDensity(value: unknown): value is DataViewsDensity {\n return DENSITIES.includes(value as DataViewsDensity);\n}\n\n/** The remembered density, or undefined (no window, no value, junk). */\nfunction readStoredDensity(): DataViewsDensity | undefined {\n try {\n if (typeof window === \"undefined\") return undefined;\n const stored = window.localStorage.getItem(DENSITY_STORAGE_KEY);\n return isDensity(stored) ? stored : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Pin a layout to one this table can render. \"Tabela\" is always available, so it\n * is the floor: a page with no `renderCard` never renders a cards body, one with\n * no `renderListRow` never renders a list, and one with no `board` config never\n * renders a board — whatever is stored, saved in a view, or requested.\n */\nfunction pinLayout(layout: DataViewsLayout, available: LayoutAvailability): DataViewsLayout {\n if (layout === \"cards\") return available.canUseCards ? \"cards\" : \"table\";\n if (layout === \"list\") return available.canUseList ? \"list\" : \"table\";\n if (layout === \"board\") return available.canUseBoard ? \"board\" : \"table\";\n return \"table\";\n}\n\n/** The stored cross-screen preference, or undefined (no window, no value, junk). */\nfunction readStoredLayout(): DataViewsLayout | undefined {\n // Guarded rather than assumed: this module is also imported in Node (tests,\n // any SSR host), and a `localStorage` access can throw outright under a\n // restrictive privacy setting — a thrown read must not take the grid with it.\n try {\n if (typeof window === \"undefined\") return undefined;\n const stored = window.localStorage.getItem(LAYOUT_STORAGE_KEY);\n return isLayout(stored) ? stored : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Remember a preference for every other screen. A failed write is not an error. */\nfunction writeStored(key: string, value: string): void {\n try {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(key, value);\n } catch {\n // Private mode / quota / disabled storage: the preference simply does not\n // survive the session. Nothing about the current view depends on it.\n }\n}\n\ninterface LayoutProviderProps extends Partial<LayoutAvailability> {\n /** Which layout to show first when the user has expressed no preference. */\n defaultLayout?: DataViewsLayout;\n /**\n * The layout an APPLIED SAVED VIEW pins, when it stored one. It wins over the\n * remembered preference for as long as that view is applied — the view is a\n * snapshot someone chose to keep — but it does NOT overwrite the preference:\n * only the toggle does that, because only the toggle is the user saying so.\n */\n viewLayout?: DataViewsLayout;\n /**\n * Ignore — and stop writing — the remembered cross-screen preference, making\n * `defaultLayout` authoritative for this table.\n *\n * For a table that exists to SHOW a particular layout rather than to be\n * browsed: a Storybook story called \"Board\", a docs example, a screenshot\n * harness. Without it the remembered preference wins, so opening \"Board\"\n * after having clicked Tabela anywhere renders a table — the demonstration\n * silently showing the wrong thing, and a shared link doing it for everyone\n * whose preference differs.\n *\n * A real screen leaves this off: remembering how someone likes to read\n * lists is the point.\n */\n ignoreStoredLayout?: boolean;\n children: ReactNode;\n}\n\n/**\n * Provides the view-type state, seeded from (in order) the applied saved view's\n * layout, the user's remembered cross-screen preference, then `defaultLayout` —\n * each pinned to what this table can actually render.\n */\nexport function DataViewsLayoutProvider({\n canUseCards = false,\n canUseList = false,\n canUseBoard = false,\n defaultLayout = \"table\",\n viewLayout,\n ignoreStoredLayout = false,\n children,\n}: LayoutProviderProps): React.JSX.Element {\n const availability = { canUseCards, canUseList, canUseBoard };\n const [layout, setLayoutState] = useState<DataViewsLayout>(() =>\n pinLayout(\n viewLayout ?? (ignoreStoredLayout ? undefined : readStoredLayout()) ?? defaultLayout,\n availability,\n ),\n );\n const [density, setDensityState] = useState<DataViewsDensity>(\n () => (ignoreStoredLayout ? undefined : readStoredDensity()) ?? \"cozy\",\n );\n const [zoom, setZoom] = useState(DEFAULT_ZOOM);\n // A newly applied view carrying a layout switches to it (its reference-change\n // is the signal, exactly as `appliedState` works for the filters).\n useEffect(() => {\n if (viewLayout) setLayoutState(pinLayout(viewLayout, availability));\n // Availability is derived from props that do not change for a mounted table.\n }, [viewLayout]);\n // Pin again on read: `canUseCards`/`canUseBoard` can flip for a mounted table\n // (a page that supplies `renderCard` only once its card data has loaded), and\n // a stale \"cards\" would otherwise render a cards body with no renderer.\n const effective = pinLayout(layout, availability);\n\n const value = useMemo<DataViewsLayoutValue>(\n () => ({\n layout: effective,\n setLayout: (next: DataViewsLayout) => {\n const pinned = pinLayout(next, availability);\n setLayoutState(pinned);\n // Remember the user's own choice across every screen — see LAYOUT_STORAGE_KEY.\n // A table pinned to a layout does not write: it would teach the\n // preference a value the operator never chose.\n if (!ignoreStoredLayout) writeStored(LAYOUT_STORAGE_KEY, pinned);\n },\n density,\n setDensity: (next: DataViewsDensity) => {\n setDensityState(next);\n if (!ignoreStoredLayout) writeStored(DENSITY_STORAGE_KEY, next);\n },\n canUseCards,\n canUseList,\n canUseBoard,\n zoom,\n setZoom,\n }),\n [effective, density, canUseCards, canUseList, canUseBoard, zoom],\n );\n return <DataViewsLayoutContext.Provider value={value}>{children}</DataViewsLayoutContext.Provider>;\n}\n\n/** Read the current DataViews layout. Throws outside a provider. */\nexport function useDataViewsLayout(): DataViewsLayoutValue {\n const ctx = useContext(DataViewsLayoutContext);\n if (!ctx) {\n throw new Error(\"useDataViewsLayout must be used within a DataViewsLayoutProvider\");\n }\n return ctx;\n}\n\n/**\n * Card-size slider for the toolbar — shown in the CARD-BASED layouts (\"Grade\"\n * and \"Quadro\"), mirroring the tabwoah view-selector's zoom. The board reuses\n * the same `renderCard`, so the same knob scales both.\n *\n * Deliberately ABSENT in \"Lista\" and \"Tabela\" (FUT-733): a list row is\n * full-width and sized by its content, so a card-size multiplier has nothing to\n * act on — a slider that moved and changed nothing would be worse than none.\n */\nexport function DataViewsZoomSlider({ testIdPrefix }: { testIdPrefix: string }): React.JSX.Element | null {\n const { layout, zoom, setZoom } = useDataViewsLayout();\n const copy = useDataViewsCopy();\n if (layout !== \"cards\" && layout !== \"board\") return null;\n return (\n <Box\n sx={{\n display: { xs: \"none\", sm: \"flex\" },\n alignItems: \"center\",\n gap: 1,\n color: \"text.secondary\",\n }}\n >\n <GridViewOutlinedIcon sx={{ fontSize: 14 }} />\n <Box sx={{ width: 88, display: \"flex\", alignItems: \"center\" }}>\n <Slider\n size=\"sm\"\n showValue={false}\n value={zoom}\n min={0}\n max={100}\n step={5}\n onChange={(_event, next) => setZoom(Array.isArray(next) ? (next[0] ?? 0) : next)}\n aria-label={copy.display.cardZoom}\n data-testid={`${testIdPrefix}-card-zoom`}\n />\n </Box>\n <GridViewOutlinedIcon sx={{ fontSize: 20 }} />\n </Box>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { DENSITY_ROW_PADDING, type DataViewsDensity } from \"./data-views-layout-context\";\nimport { CellConfigProvider, cellTracks, type ListCardCellConfig } from \"./list-card-cells\";\n\n/**\n * THE LIST OWNS THE COLUMNS, NOT THE ROW.\n *\n * Every row laying itself out with flex produces a list where nothing lines up.\n * The caption takes `flex: 1` and shoves the rest right; the value sits after\n * the meta cluster with the same gap as any other pair, so `MÉTODO PIX\n * R$ 13,90` reads as one continuous run and the only unlabelled thing in the\n * row is the number that matters most; and because the status chip's width\n * varies with its text (`Pago` vs `Em aberto` vs `Cancelado`), the money jitters\n * left and right on every row down the page.\n *\n * So the rails are declared ONCE, here, and each card is `grid-template-columns:\n * subgrid` spanning them. One set of edges for the whole list, the value on its\n * own rail, the status in a slot wide enough for the longest label it will ever\n * hold. Adding a row cannot move the column.\n *\n * Subgrid needs the card to be a DIRECT child of this grid — no wrapper element\n * between them, which is why the group renders its children bare.\n */\n\n/** One rail. Fixed where alignment matters, flexible where it does not. */\nexport interface ListRails {\n /**\n * The disclosure chevron, ahead of everything.\n *\n * Reserved on the same terms as the gutters behind it: a list where only SOME\n * rows carry an expandable body would otherwise indent those rows and no\n * others, and a column of captions that starts at two different offsets reads\n * as a rendering fault rather than as a row you can open.\n */\n disclose: string;\n /** Reserved even when nothing drags: toggling drag mode must not shift the list. */\n drag: string;\n /** Reserved even when nothing is selectable, for the same reason. */\n select: string;\n leading: string;\n /** Absorbs spare width, alongside `meta`. */\n caption: string;\n /** Also absorbs spare width, so the middle columns spread rather than bunch. */\n meta: string;\n /** The value's own rail, with a fixed right edge. */\n value: string;\n actions: string;\n}\n\n/**\n * The meta rail, sized to sit its pairs on even intervals WITH the caption.\n *\n * ONE SHARE OF THE SPARE WIDTH PER PAIR, not one for the cluster. A single `1fr`\n * handed the whole cluster as much room as the title and then split it between\n * the pairs, so the title sat on a full share while `DATA` and `MÉTODO` had half\n * a share each — which is why the gap after the title came out twice the gap\n * between the pairs. Even columns need even shares, so the rail grows with the\n * number of pairs it has to hold.\n *\n * `max-content` still floors it: the evenness is never paid for with a clipped\n * label on a row too narrow to afford it.\n */\nexport function metaRail(columns: number): string {\n return `minmax(max-content, ${Math.max(columns, 1)}fr)`;\n}\n\n/**\n * The caption and meta rails, resolved TOGETHER — because exactly one of them\n * has to be the flexible track, and which one depends on whether the row has any\n * middle columns at all.\n *\n * A grid distributes its free space to `fr` tracks; with no `fr` present it\n * spreads it across every `auto` track instead — including the empty gutters,\n * the empty meta rail and the empty status rail. So a row with a title and a\n * value and nothing between them drifted its title into the middle of the row,\n * each empty rail having claimed an equal share of the slack.\n *\n * With pairs to place, `meta` is the flexible one and the caption sizes to its\n * title (the spare width belongs to the only rail with several things to space\n * out). With no pairs, there is nothing to distribute and the caption takes the\n * slack back, which is what it always did.\n */\nexport function contentRails(metaColumns: number): Pick<ListRails, \"caption\" | \"meta\"> {\n return metaColumns > 0\n ? { caption: \"minmax(0, auto)\", meta: metaRail(metaColumns) }\n : { caption: \"minmax(0, 1fr)\", meta: \"auto\" };\n}\n\nexport const DEFAULT_RAILS: ListRails = {\n disclose: \"auto\",\n drag: \"auto\",\n select: \"auto\",\n leading: \"auto\",\n // Two is the canonical row (a date and a method); a list carrying a different\n // number says so with `metaColumns`, and a standalone card counts its own.\n ...contentRails(2),\n // `max-content` on the value, so the rail is as wide as the widest amount in\n // the list and no wider — a fixed px guess is either clipping or dead space.\n // NOT an `fr`: the value's whole promise is a fixed right edge, and a rail\n // that grows with the spare width moves that edge on every list.\n value: \"max-content\",\n actions: \"auto\",\n};\n\nexport interface ListRailsValue {\n density: DataViewsDensity;\n /** Whether the gutters are held open even when empty. */\n reserveGutters: boolean;\n /**\n * How many tracks a row spans.\n *\n * Fixed at {@link RAIL_COUNT} for the named-slot layout, but a cell-configured\n * list has as many tracks as the config declares, and every row must span the\n * same number or subgrid tears.\n */\n railCount: number;\n}\n\nconst ListRailsContext = createContext<ListRailsValue | null>(null);\n\n/** Is this card inside a group that owns the rails? */\nexport function useListRails(): ListRailsValue | null {\n return useContext(ListRailsContext);\n}\n\n/**\n * The column template, as one `grid-template-columns` value.\n *\n * A rail set to `null` is DROPPED rather than sized to zero. The two are not the\n * same: a zero-width track still takes a `column-gap` beside it, so a gutter\n * nobody is using still pushes the row's contents inward. Only a standalone card\n * may drop one — inside a group the rails are subgrid over a shared template and\n * every row must span the same count.\n */\nexport function railsTemplate(rails: RailOverrides): string {\n return [\n rails.disclose,\n rails.drag,\n rails.select,\n rails.leading,\n rails.caption,\n rails.meta,\n rails.value,\n rails.actions,\n ]\n .filter((rail): rail is string => rail != null)\n .join(\" \");\n}\n\n/** A rail set, where `null` means \"this rail is not in the template at all\". */\ntype RailOverrides = { [K in keyof ListRails]: ListRails[K] | null };\n\n/** The gap between rails, in theme spacing units. */\nexport const RAIL_GAP = 3;\n\n/** …the same gap in pixels, for anything drawing INTO it. */\nexport const RAIL_GAP_PX = RAIL_GAP * 8;\n\n/**\n * AN EMPTY GUTTER COSTS ITS OWN WIDTH *AND* THE RAIL GAP BESIDE IT.\n *\n * A zero-width grid track still gets a `column-gap`, and no margin on the item\n * inside it can win that back — gaps sit between TRACKS, and a track's position\n * is settled before any item's margin is applied. (Tried it; the box simply\n * overhangs its own track and everything after it stays put.) So a row with\n * nothing to drag was paying 24px for a rail holding nothing, which was the\n * single biggest contributor to the left inset the checkbox appeared to have.\n *\n * The only way out is for the track NOT TO EXIST: the slot renders nothing and\n * the rail leaves the template, which is safe because grid auto-placement fills\n * the remaining tracks in DOM order. Standalone only — inside a\n * {@link ListCardGroup} the rails are subgrid across a shared template and the\n * count cannot vary per row, which is also where `reserveGutters` earns its\n * keep: a selectable list and a read-only one still line up, and turning drag\n * mode on does not shift every row sideways.\n */\nexport function railsTemplateFor(\n gutters: { disclose: boolean; drag: boolean; select: boolean },\n metaColumns: number,\n): string {\n return railsTemplate({\n ...DEFAULT_RAILS,\n // Standalone, the card can simply COUNT its pairs — no `metaColumns` to be\n // told, and no guess.\n ...contentRails(metaColumns),\n ...(gutters.disclose ? {} : { disclose: null }),\n ...(gutters.drag ? {} : { drag: null }),\n ...(gutters.select ? {} : { select: null }),\n });\n}\n\n/** How many rails the named-slot layout has — the span such a card claims. */\nexport const RAIL_COUNT = 8;\n\n/**\n * The gutters and the trailing menu that bracket a CONFIGURED row.\n *\n * A cell-configured list still has a head and a tail the config does not\n * describe: the disclosure chevron, the drag grip and the checkbox in front, and\n * the overflow menu behind. The menu is not optional — it is where a row's\n * actions live, and a list that hid it would have nowhere to put them.\n */\nconst CELL_FIXED_RAILS = 4;\n\n/** Tracks for a cell-configured row: gutters, leading, the cells, then the menu. */\nexport function cellRailsTemplate(cells: readonly string[]): string {\n return [\n DEFAULT_RAILS.disclose,\n DEFAULT_RAILS.drag,\n DEFAULT_RAILS.select,\n DEFAULT_RAILS.leading,\n ...cells,\n DEFAULT_RAILS.actions,\n ].join(\" \");\n}\n\n/** How many tracks such a row spans — the fixed head/tail plus one per cell. */\nexport function cellRailCount(cells: number): number {\n return CELL_FIXED_RAILS + cells + 1;\n}\n\n/**\n * A {@link ListCardGroup}'s configuration, as a value a caller can pass around.\n *\n * The same fields the group takes as props, named once so a table can accept\n * \"the list's columns\" as a single prop and hand them straight over. It is what\n * makes a list line up BY CONSTRUCTION rather than by convention: without it\n * every row resolves its own tracks from its own copy of the config, which\n * agrees with its neighbours right until one row carries an unusually wide value.\n */\nexport interface ListGroupConfig<T extends Record<string, unknown>> {\n /**\n * The cells every row renders. Supplying these replaces the named-slot layout\n * (title/subtitle/meta/value/status) for the rows inside.\n */\n cells?: readonly ListCardCellConfig<T>[];\n /**\n * How many labelled pairs the rows carry, in the named-slot layout. The group\n * renders its children opaquely and cannot count them.\n */\n metaColumns?: number;\n /** Override individual rails; anything omitted keeps its default. */\n rails?: Partial<ListRails>;\n /**\n * Hold the drag and select gutters open even when nothing uses them. On by\n * default, so a selectable list and a read-only one still line up.\n */\n reserveGutters?: boolean;\n}\n\n/**\n * A list of {@link BaseListCard}s that share one set of columns.\n *\n * Also the natural home for the things a review pointed out belong to the list\n * rather than the card: the density every row answers, and — when it lands —\n * shift-click range selection and the single `aria-live` region a list needs\n * (fifty polite live regions is a screen-reader nightmare, which is why the\n * card no longer takes one).\n */\nexport function ListCardGroup({\n children,\n density = \"cozy\",\n cells,\n metaColumns,\n rails,\n reserveGutters = true,\n gap,\n dataTestId,\n}: {\n children: ReactNode;\n density?: DataViewsDensity;\n /**\n * The list's CELL CONFIG — declared once here, obeyed by every row.\n *\n * This is what makes the columns line up by construction rather than by\n * convention: the group resolves the tracks and hands the same config to every\n * card, so two rows cannot disagree about the shape of the list because\n * neither of them decides it.\n *\n * Supplying this replaces the named-slot layout (title/subtitle/meta/value/\n * status) for the rows inside — they render `row` through these cells instead.\n * The gutters and the overflow menu are unaffected; they bracket the cells and\n * are not the config's to describe.\n */\n cells?: readonly ListCardCellConfig<never>[];\n /**\n * How many labelled pairs the rows in this list carry.\n *\n * The rail claims one share of the spare width per pair, so the title and\n * every pair land on even intervals. A list is homogeneous — its rows show\n * the same fields — but the group renders its children opaquely and cannot\n * count them, so this is the one thing it has to be told.\n */\n metaColumns?: number;\n /** Override individual rails; anything omitted keeps its default. */\n rails?: Partial<ListRails>;\n /**\n * Hold the drag and select gutters open even when nothing uses them.\n *\n * On by default: a selectable list and a read-only one should line up, and\n * turning drag mode on should not shift every row sideways.\n */\n reserveGutters?: boolean;\n /** Row gap. Defaults to the density's own spacing. */\n gap?: number;\n dataTestId?: string;\n}): React.JSX.Element {\n const resolved = {\n ...DEFAULT_RAILS,\n ...(metaColumns == null ? {} : contentRails(metaColumns)),\n ...rails,\n };\n const configured = cells != null && cells.length > 0;\n const template = configured ? cellRailsTemplate(cellTracks(cells)) : railsTemplate(resolved);\n const railCount = configured ? cellRailCount(cells.length) : RAIL_COUNT;\n return (\n <ListRailsContext.Provider value={{ density, reserveGutters, railCount }}>\n <CellConfigProvider cells={cells}>\n <Box\n data-testid={dataTestId}\n sx={{\n // The query container for every row inside it — a row cannot be one\n // itself and a subgrid at the same time (containment drops subgrid).\n // Every row in a list is the same width anyway, so the group is the\n // honest place to ask the question.\n containerType: \"inline-size\",\n display: \"grid\",\n gridTemplateColumns: template,\n alignItems: \"center\",\n rowGap: gap ?? DENSITY_ROW_PADDING[density],\n }}\n >\n {children}\n </Box>\n </CellConfigProvider>\n </ListRailsContext.Provider>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport { Box } from \"../../../mui/Box\";\n\n/**\n * THE CELL CONFIG — the list declares its columns once, every row obeys them.\n *\n * The row used to name its middle slots: a title, a subtitle beneath it, then\n * labelled `meta` pairs, then a value, then a status. That vocabulary was the\n * mistake twice over. It reads as a description of every list, and no list is\n * quite that shape — so a consumer wanting a date over a time, or an order\n * number over the client who placed it, had to pick whichever named slot was\n * least wrong and take its styling with it. And because each row decided its own\n * content, alignment across a list was a convention the rows could break.\n *\n * So cells are CONFIGURED, the way a data grid's columns are: the list declares\n * them once, and every card renders the same columns in the same tracks from its\n * own row. Two cards cannot disagree about the shape of the list, because\n * neither of them is deciding it.\n *\n * THE SECOND LINE IS AN OPTION, NOT A SUBTITLE. `secondary` is not \"the small\n * grey text under the title\" — it is the cell's second line, for whatever pairs\n * naturally in this list: date over time, name over e-mail, pedido over cliente.\n * It carries no meaning the config did not put there, and a cell that wants one\n * line simply omits it.\n */\nexport interface ListCardCellConfig<T extends Record<string, unknown> = Record<string, unknown>> {\n /** Stable key. Also the cell's `data-slot`, so a test can find it by name. */\n id: string;\n /** The cell's first line, from the row. */\n primary: (row: T) => ReactNode;\n /** An optional second line beneath it. Anything that pairs with the first. */\n secondary?: (row: T) => ReactNode;\n /**\n * Which edge the lines sit on. `end` is what a column of numbers wants, so its\n * digits line up with the values above and below it — and it switches the cell\n * to tabular figures, since nothing else ever asks for that alignment.\n */\n align?: \"start\" | \"center\" | \"end\";\n /**\n * This cell's track, as a `grid-template-columns` entry. Defaults to an even\n * share of the spare width.\n *\n * A cell holding a number usually wants `max-content`: the rail is then as\n * wide as the widest amount in the list and no wider, and its right edge does\n * not move when a longer row arrives.\n */\n width?: string;\n /** Emphasise the first line — for the one figure the row is really about. */\n strong?: boolean;\n}\n\nconst ALIGN_ITEMS = { start: \"flex-start\", center: \"center\", end: \"flex-end\" } as const;\nconst TEXT_ALIGN = { start: \"left\", center: \"center\", end: \"right\" } as const;\n\n/** The default track: an even share of whatever width the row has spare. */\nexport const DEFAULT_CELL_WIDTH = \"minmax(0, 1fr)\";\n\n/** The tracks a cell config asks for, in order. */\nexport function cellTracks(cells: readonly ListCardCellConfig<never>[] | undefined): string[] {\n return (cells ?? []).map((cell) => cell.width ?? DEFAULT_CELL_WIDTH);\n}\n\n/**\n * The config handed down by the list.\n *\n * A card inside a group takes its columns from here rather than from props, so\n * there is exactly one declaration of the list's shape and no way for a row to\n * hold a different one.\n */\nconst CellConfigContext = createContext<readonly ListCardCellConfig<never>[] | null>(null);\n\nexport function CellConfigProvider({\n cells,\n children,\n}: {\n cells: readonly ListCardCellConfig<never>[] | undefined;\n children: ReactNode;\n}): React.JSX.Element {\n return <CellConfigContext.Provider value={cells ?? null}>{children}</CellConfigContext.Provider>;\n}\n\n/** The list's cell config, if it declared one. */\nexport function useCellConfig(): readonly ListCardCellConfig<never>[] | null {\n return useContext(CellConfigContext);\n}\n\n/**\n * One cell rendered from its config.\n *\n * Both lines truncate rather than wrap: a row is a fixed-height scanning unit,\n * and a cell that grows to two lines because one name was long drags every rail\n * on that row down with it. Whatever does not fit belongs in the expandable\n * body, which is the entire reason the body exists.\n */\nfunction Cell<T extends Record<string, unknown>>({\n config,\n row,\n}: {\n config: ListCardCellConfig<T>;\n row: T;\n}): React.JSX.Element {\n const align = config.align ?? \"start\";\n const numeric = align === \"end\" ? { fontVariantNumeric: \"tabular-nums\" } : {};\n const clamp = {\n minWidth: 0,\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n } as const;\n const secondary = config.secondary?.(row);\n return (\n <Box\n data-slot={`cell-${config.id}`}\n sx={{\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: ALIGN_ITEMS[align],\n justifyContent: \"center\",\n textAlign: TEXT_ALIGN[align],\n }}\n >\n <Box\n component=\"span\"\n sx={{ ...clamp, fontSize: 14, fontWeight: config.strong ? 700 : 600, lineHeight: 1.25, ...numeric }}\n >\n {config.primary(row)}\n </Box>\n {secondary != null && (\n <Box\n component=\"span\"\n sx={{ ...clamp, fontSize: 12.5, lineHeight: 1.3, color: \"text.secondary\", ...numeric }}\n >\n {secondary}\n </Box>\n )}\n </Box>\n );\n}\n\n/** Every configured cell of a row, in the list's declared order. */\nexport function ListCardCells<T extends Record<string, unknown>>({\n cells,\n row,\n}: {\n cells: readonly ListCardCellConfig<T>[];\n row: T;\n}): React.JSX.Element {\n return (\n <>\n {cells.map((config) => (\n <Cell key={config.id} config={config} row={row} />\n ))}\n </>\n );\n}\n","\"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\";\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: \"0.9rem\",\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: \"0.875rem\",\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={{\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: ${META_BREAK}px)`]: { 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 VALUE_FLUSH = {\n marginLeft: `-${RAIL_GAP_PX}px`,\n [`@container (max-width: ${META_BREAK}px)`]: { marginLeft: 0 },\n} as const;\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: \"0.875rem\", 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={{\n textAlign: \"right\",\n ...(separated && value != null ? VALUE_FLUSH : {}),\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","\"use client\";\n\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\nimport { IconButton } from \"@mui/material\";\n\nimport { Checkbox } from \"../../form/Checkbox\";\nimport { Box } from \"../../../mui/Box\";\n\nimport { DragHandle, useDragItem } from \"./data-views-drag\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/**\n * THE THREE GUTTERS AT THE HEAD OF A ROW — the disclosure chevron, the drag grip\n * and the select checkbox.\n *\n * Split from `base-list-card` at the size gate. All three answer the same\n * question in the same way: whether to occupy a rail, hold one open, or leave\n * the template altogether. See `railsTemplateFor` for why the third option has\n * to exist.\n */\n\n/**\n * MUI's Checkbox carries 9px of hit-area padding on every side.\n *\n * Left uncancelled, a row asking for 8px of padding puts the checkbox SQUARE 17px\n * in — and with the empty drag gutter's gap ahead of it, 46px in, which is what\n * made the left edge look like a mistake. The hit area is worth keeping; the\n * optical inset is not, so the padding is cancelled with a negative margin and\n * the glyph lands where the row's own padding says it should.\n */\nconst CHECKBOX_PAD = \"-9px\";\n\n/** The grip. Its gutter is reserved only when the list says to reserve it. */\nexport function DragSlot({\n drag,\n reserve,\n testId,\n}: {\n drag: ReturnType<typeof useDragItem>;\n reserve: boolean;\n testId?: string;\n}): React.JSX.Element | null {\n if (!drag.draggable) return reserve ? <Box data-slot=\"drag\" /> : null;\n return (\n // display:flex, as on the checkbox below: the grip is an inline-grid, and in\n // a block parent an inline box sits on the text baseline — the line box adds\n // descender leading under it (21px glyph in a 31px slot) and drops the grip\n // 5px below the row's centre. A flex parent has no baseline to sit on.\n <Box\n data-slot=\"drag\"\n sx={{ position: \"relative\", zIndex: 1, display: \"flex\", alignItems: \"center\" }}\n >\n <DragHandle\n handleProps={drag.handleProps}\n gated={drag.handleProps !== undefined}\n testId={testId}\n />\n </Box>\n );\n}\n\n/** The select checkbox. Its gutter is reserved only when the list says to. */\nexport function SelectSlot({\n selectable,\n selected,\n reserve,\n onToggleSelect,\n testId,\n}: {\n selectable: boolean;\n selected: boolean;\n reserve: boolean;\n onToggleSelect?: (event?: React.MouseEvent) => void;\n testId?: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (!selectable) return reserve ? <Box data-slot=\"select\" /> : null;\n return (\n // z-index 1: above the stretched link, or the anchor swallows the click.\n <Box\n data-slot=\"select\"\n sx={{ position: \"relative\", zIndex: 1, mx: CHECKBOX_PAD, display: \"flex\" }}\n >\n <Checkbox\n checked={selected}\n onChange={() => onToggleSelect?.()}\n onClick={(event) => {\n event.stopPropagation();\n onToggleSelect?.(event);\n }}\n size=\"small\"\n data-testid={testId}\n aria-label={copy.selection.selectRow}\n />\n </Box>\n );\n}\n\n/**\n * THE DISCLOSURE CHEVRON — the affordance that says this row has more.\n *\n * Rendered only when the card was given a body to reveal. A chevron on a row\n * that opens onto nothing is worse than no chevron: it is a promise the row\n * cannot keep, and an operator who presses it twice learns to stop trusting the\n * column. So `BaseListCard` passes `null` here when it has no children, the\n * slot returns nothing, and — standalone — the rail leaves the template\n * entirely.\n *\n * ROTATED, NOT SWAPPED. One glyph turned 90° rather than a right-chevron\n * exchanged for a down-chevron: the rotation is animatable and reads as the\n * same object moving, where a swap is two icons flickering. It also keeps the\n * button's box identical in both states, so the caption beside it cannot shift\n * as the row opens.\n *\n * `stopPropagation`, because a row is frequently clickable in its own right —\n * opening the record is not the same act as peeking at its detail, and without\n * this the chevron would do both at once.\n */\nexport function DiscloseSlot({\n expandable,\n expanded,\n reserve,\n onToggle,\n controls,\n testId,\n}: {\n expandable: boolean;\n expanded: boolean;\n reserve: boolean;\n onToggle: () => void;\n /** The id of the region this button opens, for `aria-controls`. */\n controls: string;\n testId?: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (!expandable) return reserve ? <Box data-slot=\"disclose\" /> : null;\n return (\n // z-index 1 and flex for the same reasons the other two gutters use them:\n // above a stretched link that would otherwise swallow the click, and out of\n // a baseline that would drop the glyph below the row's centre.\n <Box\n data-slot=\"disclose\"\n sx={{ position: \"relative\", zIndex: 1, display: \"flex\", alignItems: \"center\" }}\n >\n <IconButton\n size=\"small\"\n aria-expanded={expanded}\n aria-controls={expanded ? controls : undefined}\n aria-label={expanded ? copy.selection.collapseRow : copy.selection.expandRow}\n data-testid={testId}\n onClick={(event) => {\n event.stopPropagation();\n onToggle();\n }}\n // The row's own keyboard handler treats Enter/Space as \"open the\n // record\"; the button already handles both, so the event must not reach\n // it and fire the second action too.\n onKeyDown={(event) => event.stopPropagation()}\n sx={{\n p: 0.25,\n transform: expanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 150ms ease\",\n // Honour a reduced-motion preference: the state is carried by the\n // angle, not by the animation, so dropping the tween loses nothing.\n \"@media (prefers-reduced-motion: reduce)\": { transition: \"none\" },\n }}\n >\n <KeyboardArrowRightIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nimport { type SortFieldDefinition } from \"../../layout/ContentToolbar\";\n\nimport { GridShell } from \"./data-views-grid-parts\";\nimport type { ListGroupConfig } from \"./list-card-rails\";\nimport type { DisplayPanelView } from \"./data-views-display-panel\";\nimport type { BoardConfig } from \"./DataViewsBoard\";\nimport type { DataViewExport } from \"./data-views-export\";\nimport type { ScopeConfig } from \"./data-views-scopes\";\nimport type { DataViewCardSelection } from \"./data-views-types\";\nimport {\n type DataViewColumn,\n type DataViewsLayout,\n type DataViewServer,\n type DataViewState,\n type DataViewSyncState,\n type FilterFieldConfig,\n type RangeFieldConfig,\n type RowAction,\n} from \"./data-views-types\";\nimport { useDataViewsState } from \"./use-data-views-state\";\n\ninterface DataViewsGridProps<T extends Record<string, unknown>> {\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 /** Row click opens the row; clicks in the actions column are ignored. */\n onRowClick?: (row: T) => void;\n emptyState?: React.ReactNode;\n dataTestId?: string;\n testIdPrefix?: string;\n /** Seed/replace the view state. A NEW reference re-applies (used to apply a saved view). */\n appliedState?: DataViewState;\n /**\n * URL-driven controls (search/pills/ranges/sort) that RE-APPLY on reference\n * change while preserving column visibility — for server-mode lists that keep\n * their filter/sort/page in the address bar (see {@link DataViewSyncState}).\n */\n syncState?: DataViewSyncState;\n /** Notified on every view-state change (so a save-view modal can read it). */\n onStateChange?: (state: DataViewState) => void;\n /**\n * Notified with the currently-visible (search + filter matched) rows whenever\n * they change — so a page-level Export exports what the user sees, not the\n * full dataset.\n */\n onVisibleRowsChange?: (rows: T[]) => void;\n /** Saved-views UI injected into the toolbar (FUT-89). */\n toolbarRightSlot?: React.ReactNode;\n /**\n * The saved-view chrome for the Exibir panel: its VISÃO header (with the\n * views dropdown) and its Redefinir / Salvar visão footer. Supplied by\n * `DataViewsTableBase`; without it the panel is tabs only.\n */\n displayView?: DisplayPanelView;\n /** Big page title in the header row (next to the funnel + gear). */\n title?: string;\n /** Primary page actions rendered at the header's right. */\n headerActions?: React.ReactNode;\n /**\n * Sort options for the toolbar's \"Sort By\" dropdown. Defaults to the sortable\n * columns (asc/desc each) when omitted.\n */\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 /**\n * A single, reusable list of row actions that drives BOTH the per-row \"⋮\"\n * kebab AND the bulk-actions menu (tabwoah model). When provided, the grid\n * appends a kebab actions column automatically (unless the page already\n * defines one) and shows an \"Ações\" bulk menu when rows are selected.\n */\n rowActions?: RowAction<T>[];\n /**\n * Extra leading control rendered in the auto kebab column, before the \"⋮\"\n * (e.g. a favourite star). Only used when `rowActions` is set.\n */\n rowActionsLeading?: (row: T) => React.ReactNode;\n /**\n * Low-level override for the selection bulk control. Prefer `rowActions`.\n * Receives the selected rows + a `clearSelection` callback.\n */\n bulkActions?: (selectedRows: T[], clearSelection: () => void) => React.ReactNode;\n /**\n * Render a bespoke per-row menu in the actions column instead of the auto\n * kebab — typically an entity's self-contained 3-dots menu that owns its own\n * popups, so the SAME menu component drives both the table row and the card.\n * `rowActions`/`bulkActions` still drive the multi-row bulk menu.\n */\n renderRowMenu?: (row: T) => React.ReactNode;\n /**\n * Opt-in \"Grade\" (cards) layout. When provided, a Grade/Tabela toggle appears in\n * the toolbar and the cards body renders each visible row via this function\n * (reusing the same search/filter/sort). Omit ⇒ table only (unchanged).\n */\n renderCard?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /**\n * Opt-in \"Quadro\" (board) layout: the loaded page laid out as columns of one\n * grouping field. Reuses `renderCard`, so supplying a board WITHOUT one simply\n * offers no board. Best when the groups are states in a state machine — derive\n * these groups and `scopes` from ONE definition so the two cannot drift.\n */\n board?: BoardConfig<T>;\n /**\n * Opt-in \"Lista\" layout (FUT-733): one FULL-WIDTH row per record, rendered by\n * the entity — a marker, a title, a subtitle and a value on the right. Sits\n * between the table (compare columns) and the cards (browse); omit ⇒ not\n * offered, exactly as `renderCard` gates the cards.\n */\n renderListRow?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /**\n * The Lista's SHARED COLUMNS — declared once for the list, obeyed by every row.\n *\n * This is what makes a list line up by construction rather than by convention.\n * Omit it and each row still resolves its own tracks from its own config,\n * which agrees with its neighbours right up until one row carries an unusually\n * wide value.\n */\n listGroup?: ListGroupConfig<T>;\n /**\n * The page-level partition rendered as an exclusive tab strip above the\n * toolbar, with server-supplied counts. Requires `server`: a scope is applied\n * at the backend, never in the browser.\n */\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 /**\n * Opt into the responsive inline filter UX (collapsible filter row on wide\n * screens, modal on narrow). Default `false` keeps the classic slide-in panel.\n */\n inlineFilters?: boolean;\n /** Keep the inline search visible with no filter fields and no active search. */\n alwaysShowSearch?: boolean;\n /** Server-mode wiring; when set the grid is backend-driven (no client filter/sort/paginate). */\n server?: DataViewServer;\n}\n\n/**\n * Surface the visible (filtered) rows so a page-level Export matches the view.\n *\n * Pages pass inline column/field arrays, so `matched` is a fresh reference on\n * every render even when its contents are unchanged. The guard is a signature\n * over the rows' *contents* (not just their ids), so the callback — and the\n * parent `useState` it usually drives — fires only when the visible data\n * actually changes. Ids alone are not enough: a server refresh can change a\n * visible row's values while keeping its id, and the export must reflect them.\n * Content-equal renders keep the same signature, so this never loops.\n */\nfunction useVisibleRowsNotifier<T>(matched: T[], onVisibleRowsChange?: (rows: T[]) => void): void {\n const visibleSignature = JSON.stringify(matched);\n const lastSignature = useRef<string | null>(null);\n useEffect(() => {\n if (lastSignature.current === visibleSignature) return;\n lastSignature.current = visibleSignature;\n onVisibleRowsChange?.(matched);\n }, [visibleSignature, matched, onVisibleRowsChange]);\n}\n\n/**\n * The reusable admin DataViews table (FUT-88): the shared ContentToolbar +\n * TableFilter panel over `@12-apps/ui` DataGrid. State + derived data live in\n * {@link useDataViewsState}; the render lives in `GridShell`. This component just\n * connects the two. Reused across every admin list page.\n */\nexport function DataViewsGrid<T extends Record<string, unknown>>(\n props: DataViewsGridProps<T>,\n): React.JSX.Element {\n // Forwarded as a whole rather than restated name-by-name twice: this component\n // only ADDS the controller, and a 25-name destructure repeated in the JSX is\n // where a newly added prop silently stops being passed on.\n const { rangeFields = [], testIdPrefix = \"table\" } = props;\n const controller = useDataViewsState({ ...props, rangeFields, testIdPrefix });\n useVisibleRowsNotifier(controller.matched, props.onVisibleRowsChange);\n return <GridShell {...props} c={controller} rangeFields={rangeFields} testIdPrefix={testIdPrefix} />;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { TableFilter } from \"../../layout/TableFilter\";\nimport { Text } from \"../../typography/Text\";\nimport { Box } from \"../../../mui/Box\";\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 { 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 { DataViewsController } from \"./use-data-views-state\";\n\n/* ── Header row ──────────────────────────────────────────────────────────── */\n\n/**\n * The grid's own header row: the page title on the left, the primary page\n * actions on the right.\n *\n * `title` and `headerActions` were DECLARED on `DataViewsGridProps` and\n * `DataViewsTableBaseProps` but never destructured or forwarded — dead props\n * whose types lied to every caller that set them. Wired here rather than\n * deleted: a table that carries its own title keeps the title, the scope tabs\n * and the toolbar as one block, instead of the page having to space them.\n *\n * Renders NOTHING when neither is supplied, so no existing table gains a row.\n */\nfunction GridHeaderRow({\n title,\n headerActions,\n testIdPrefix,\n}: {\n title?: string;\n headerActions?: React.ReactNode;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n if (!title && !headerActions) return null;\n return (\n <Box\n data-testid={`${testIdPrefix}-header`}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 2,\n flexWrap: \"wrap\",\n pb: 1.5,\n }}\n >\n {title ? (\n <Text variant=\"heading\" size=\"lg\" as=\"h2\">\n {title}\n </Text>\n ) : (\n <Box />\n )}\n {headerActions && <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>{headerActions}</Box>}\n </Box>\n );\n}\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 onTogglePill: (fieldId, value, checked) =>\n c.patch({ pills: { ...state.pills, [fieldId]: togglePillValues(state.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 /** 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 /** 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 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 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","\"use client\";\n\nimport { Box, Link } from \"@mui/material\";\n\nimport { StackedModal, StackedModalContent } from \"../../feedback/StackedModal\";\nimport { TableFilter } from \"../../layout/TableFilter\";\n\nimport { PillControl } from \"./data-views-category-pill\";\nimport { PanelRangeField } from \"./data-views-range-pill\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport type {\n FilterFieldConfig,\n RangeFieldConfig,\n RangeValue,\n} from \"./data-views-types\";\n\n/* ── Filter panel ────────────────────────────────────────────────────────── */\n\nexport interface GridFilterPanelProps<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/** One pill field: a compact multi-select for long lists, else a checkbox list. */\nfunction PillField<T extends Record<string, unknown>>({\n field,\n selected,\n testIdPrefix,\n onTogglePill,\n onClearField,\n}: {\n field: FilterFieldConfig<T>;\n selected: string[];\n testIdPrefix: string;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onClearField: (fieldId: string) => void;\n}): React.JSX.Element {\n const testId = `${testIdPrefix}-filter-${field.id}`;\n // `searchEnabled` forces the searchable multi-select; a plain `multiselect`\n // keeps the auto \"search only when the list is long\" rule. `category` is the\n // hierarchical tree — see PillControl.\n if (field.searchEnabled || field.control === \"multiselect\" || field.control === \"category\") {\n return (\n <PillControl\n fieldId={field.id}\n pill={field}\n selected={selected}\n onTogglePill={onTogglePill}\n onClearField={onClearField}\n testIdPrefix={testIdPrefix}\n layout=\"stacked\"\n />\n );\n }\n return (\n <TableFilter.CheckboxField\n label={field.label}\n options={field.options}\n selected={new Set(selected)}\n onToggle={(value, checked) => onTogglePill(field.id, value, checked)}\n testId={testId}\n />\n );\n}\n\n/** The filter controls (keyword + pill facets + numeric ranges), surface-agnostic. */\nfunction FilterControls<T extends Record<string, unknown>>({\n testIdPrefix,\n search,\n fields,\n rangeFields,\n pills,\n ranges,\n onSearchChange,\n onTogglePill,\n onChangeRange,\n onClearField,\n}: Omit<GridFilterPanelProps<T>, \"onClearAll\">): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <>\n <TableFilter.Keyword\n value={search}\n onChange={onSearchChange}\n label={copy.search.allColumnsLabel}\n placeholder={copy.search.keywordPlaceholder}\n testId={`${testIdPrefix}-search-all`}\n />\n {(fields.length > 0 || rangeFields.length > 0) && (\n <TableFilter.Section title={copy.filters.panelTitle}>\n {fields.map((field) => (\n <PillField\n key={field.id}\n field={field}\n selected={pills[field.id] ?? []}\n testIdPrefix={testIdPrefix}\n onTogglePill={onTogglePill}\n onClearField={onClearField}\n />\n ))}\n {rangeFields.map((field) => (\n <PanelRangeField\n key={field.id}\n field={field}\n value={ranges[field.id] ?? {}}\n onChange={(range) => onChangeRange(field.id, range)}\n testId={`${testIdPrefix}-range-${field.id}`}\n />\n ))}\n </TableFilter.Section>\n )}\n </>\n );\n}\n\n/** The slide-in filter panel: keyword + checkbox facets + numeric ranges. */\nexport function GridFilterPanel<T extends Record<string, unknown>>(\n props: GridFilterPanelProps<T>,\n): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <TableFilter.Panel\n onClearAll={props.onClearAll}\n clearTestId={`${props.testIdPrefix}-clear-filters`}\n ariaLabel={copy.filters.panelTitle}\n >\n <FilterControls {...props} />\n </TableFilter.Panel>\n );\n}\n\n/** Props for the modal filter surface used below the inline breakpoint. */\ninterface FilterDialogProps<T extends Record<string, unknown>> extends GridFilterPanelProps<T> {\n open: boolean;\n onClose: () => void;\n}\n\n/**\n * The same filter controls in a centered modal — used on smaller screens where the\n * slide-in panel would overlap the table. The \"Filtros\" toolbar button opens it.\n */\nexport function FilterDialog<T extends Record<string, unknown>>({\n open,\n onClose,\n ...props\n}: FilterDialogProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <StackedModal\n open={open}\n onClose={onClose}\n navigationTitle={copy.filters.panelTitle}\n backLabel={copy.nav.goBack}\n modalId={`${props.testIdPrefix}-filters`}\n maxWidth=\"xs\"\n dataTestId={`${props.testIdPrefix}-filter-dialog`}\n >\n <StackedModalContent>\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2.5 }}>\n <Box sx={{ display: \"flex\", justifyContent: \"flex-end\" }}>\n <Link\n component=\"button\"\n type=\"button\"\n underline=\"hover\"\n onClick={props.onClearAll}\n data-testid={`${props.testIdPrefix}-clear-filters`}\n sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}\n >\n {copy.filters.clearAllFilters}\n </Link>\n </Box>\n <FilterControls {...props} />\n </Box>\n </StackedModalContent>\n </StackedModal>\n );\n}\n","\"use client\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { CategorySelect } from \"../../form/CategorySelect\";\nimport { MultiSelectDropdown } from \"../../layout/ContentToolbar\";\n\nimport type { FilterFieldConfig, FilterOption } from \"./data-views-types\";\n\n/**\n * Diff a whole-array selection back into per-value toggles.\n *\n * The filter state's only channel is `onTogglePill(field, value, checked)`, but\n * a tree hands back the entire selection at once. Diffing here keeps that one\n * channel the single way a pill ever changes, rather than giving the\n * hierarchical control a private path into the state.\n */\nexport function emitPillDiff(\n fieldId: string,\n before: readonly string[],\n after: readonly string[],\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void,\n): void {\n const had = new Set(before);\n const wants = new Set(after);\n after.forEach((value) => {\n if (!had.has(value)) onTogglePill(fieldId, value, true);\n });\n before.forEach((value) => {\n if (!wants.has(value)) onTogglePill(fieldId, value, false);\n });\n}\n\n/** A filter option as the category tree wants it. */\nconst toCategoryOption = (option: FilterOption) => ({\n id: option.value,\n name: option.label,\n parentId: option.parentId ?? null,\n});\n\ninterface PillControlProps<T extends Record<string, unknown>> {\n fieldId: string;\n pill: FilterFieldConfig<T>;\n selected: string[];\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onClearField: (fieldId: string) => void;\n onOpenChange?: (open: boolean) => void;\n testIdPrefix: string;\n /** `stacked` in the filter panel, `pill` on the inline bar. */\n layout?: \"stacked\" | \"pill\";\n}\n\n/**\n * One filter pill: the hierarchical category tree, or the flat multi-select.\n *\n * A category set nests, and flattening it into one list is what made \"Massas\"\n * (mercearia) indistinguishable from \"Massas\" (pratos principais). `control:\n * \"category\"` opts a field into the tree, which shows each hit under its parent.\n */\nexport function PillControl<T extends Record<string, unknown>>({\n fieldId,\n pill,\n selected,\n onTogglePill,\n onClearField,\n onOpenChange,\n testIdPrefix,\n layout = \"pill\",\n}: PillControlProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const testId = `${testIdPrefix}-filter-${fieldId}`;\n if (pill.control === \"category\") {\n return (\n <CategorySelect\n copy={copy.categorySelect}\n placeholder={pill.label}\n label={layout === \"stacked\" ? pill.label : undefined}\n fullWidth={layout === \"stacked\"}\n options={pill.options.map(toCategoryOption)}\n value={selected}\n onChange={(next) => emitPillDiff(fieldId, selected, next, onTogglePill)}\n dataTestId={testId}\n />\n );\n }\n return (\n <MultiSelectDropdown\n extraOptionsHeading={copy.filters.optionsHeading}\n clearText={copy.filters.clear}\n clearLabel={copy.filters.clearRange(pill.label)}\n label={pill.label}\n options={pill.options}\n selected={new Set(selected)}\n onToggle={(value, checked) => onTogglePill(fieldId, value, checked)}\n onClear={() => onClearField(fieldId)}\n allLabel={copy.filters.allOption}\n searchable={pill.searchEnabled ? true : undefined}\n searchPlaceholder={copy.filters.optionSearchPlaceholder}\n noResultsLabel={copy.filters.optionsEmpty}\n layout={layout}\n onOpenChange={onOpenChange}\n data-testid={testId}\n />\n );\n}\n","'use client';\n\n/**\n * A range filter as a PILL in the inline filter bar — the same affordance the\n * multi-select facets use, so \"Data\" and \"Valor\" sit in the filter row beside\n * \"Pagamento\"/\"Situação\"/\"Método\" instead of floating above the grid.\n *\n * Before this the inline bar rendered pills only, and `rangeFields` had a\n * surface on the slide-in panel alone — which `inlineFilters` REPLACES on a wide\n * screen. So a range filter was invisible on exactly the screens that use it,\n * and a page wanting one had to hang its own inputs outside the grid, outside\n * `DataViewState`, and outside the grid's \"Limpar filtros\" (FUT-668).\n */\nimport CloseIcon from '@mui/icons-material/Close';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { Box, Button, Popover, Typography } from '@mui/material';\nimport React, { useState } from 'react';\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { TableFilter } from '../../layout/TableFilter';\nimport { DayBoundInput } from './data-views-day-input';\nimport { NumberBoundInput } from './data-views-number-input';\nimport { RangePresets } from './data-views-preset-chips';\nimport { presetsFor } from './data-views-range-presets';\nimport {\n isRangeInverted,\n isRangeSet,\n numericRange,\n rangeChipLabel,\n} from './data-views-range-values';\nimport type { RangeFieldConfig, RangeValue } from './data-views-types';\n\n\n\n/**\n * One end of the range. A day keeps its `AAAA-MM-DD` string verbatim (the form\n * both the field and the backend speak) and is typed through the masked\n * `dd/mm/aaaa` field rather than a native date input — see\n * {@link DayBoundInput} for why. A number parses, and an unparseable/blank\n * entry CLEARS the bound rather than writing `NaN`.\n */\nfunction BoundField<T extends Record<string, unknown>>({\n field,\n label,\n value,\n onChange,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n label: string;\n value: number | string | undefined;\n onChange: (bound: number | string | undefined) => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (field.kind === 'day') {\n return (\n <DayBoundInput\n mask={copy.filters.dayMask}\n label={label}\n value={value == null ? undefined : String(value)}\n onChange={onChange}\n testId={testId}\n />\n );\n }\n return (\n <NumberBoundInput\n label={label}\n value={value}\n unit={field.unit}\n onChange={onChange}\n testId={testId}\n />\n );\n}\n\n\n/**\n * The `De`/`Até` pair for a range — shared by the pill's popover and the\n * slide-in panel's day fields, so the two surfaces cannot drift on what a bound\n * accepts or how it clears.\n */\nexport function RangeBounds<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const inverted = isRangeInverted(value);\n return (\n <Box data-testid={`${testId}-panel`}>\n {/* Above the inputs, not below: the presets are the answer for most\n merchants, and the two date pickers are the escape hatch. */}\n <Box sx={{ '&:not(:empty)': { mb: 1.5 } }}>\n <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <BoundField\n field={field}\n label={copy.filters.rangeStart}\n value={value.min}\n onChange={(min) => onChange({ ...value, min })}\n testId={`${testId}-min`}\n />\n <BoundField\n field={field}\n label={copy.filters.rangeEnd}\n value={value.max}\n onChange={(max) => onChange({ ...value, max })}\n testId={`${testId}-max`}\n />\n </Box>\n {inverted && (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inverted`}\n sx={{ mt: 0.75, fontSize: '0.75rem', color: 'error.main' }}\n >\n {copy.filters.rangeInvalid}\n </Typography>\n )}\n {/* BOTH days are in the result. Saying so is FUT-668's other half: the\n bounds compare as ISO strings precisely so `até` keeps its whole day,\n and nothing on screen would otherwise tell the merchant that. */}\n {field.kind === 'day' && !inverted && (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inclusive`}\n sx={{ mt: 0.75, fontSize: '0.75rem', color: 'text.disabled' }}\n >\n {copy.filters.rangeInclusiveNote}\n </Typography>\n )}\n </Box>\n );\n}\n\n/**\n * The pill + its popover. Bounds commit on change (the list is server-driven, so\n * each edit is a query) and the popover stays open, which is what lets a\n * merchant set \"de\" and then \"até\" without re-opening it.\n */\n/** An applied range clears from the pill itself — re-opening to empty two fields is three gestures for one intent. */\nfunction ClearAffordance({\n label,\n onClear,\n testId,\n}: {\n label: string;\n onClear: () => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const clear = (event: React.SyntheticEvent): void => {\n event.stopPropagation();\n onClear();\n };\n return (\n <Box\n component=\"span\"\n role=\"button\"\n tabIndex={0}\n aria-label={copy.filters.clearRange(label)}\n data-testid={testId}\n onClick={clear}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n clear(event);\n }}\n sx={{ display: 'inline-flex', borderRadius: 999, p: 0.125, '&:hover': { bgcolor: 'action.selected' } }}\n >\n <CloseIcon sx={{ fontSize: 14 }} />\n </Box>\n );\n}\n\n/** The pill button: its label carries the applied window, and its tone the state. */\nfunction RangeTrigger<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n onOpen,\n open,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n onOpen: (anchor: HTMLElement) => void;\n open: boolean;\n testId: string;\n}): React.JSX.Element {\n const active = isRangeSet(value);\n const inverted = isRangeInverted(value);\n // An INVERTED window gets its own tone rather than the ordinary \"applied\"\n // one: it is applied, and it matches nothing, and those are different states.\n const tone = inverted ? 'error.main' : active ? 'primary.main' : 'divider';\n return (\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n size=\"small\"\n data-testid={testId}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={(event) => onOpen(event.currentTarget)}\n // ✕ FIRST, chevron LAST — the same shape as every other pill. It used to\n // replace the chevron at the end, so a range pill and a multi-select pill\n // put the clear in different places, and an applied range lost the\n // affordance that says it opens.\n startIcon={\n active ? (\n <ClearAffordance label={field.label} onClear={() => onChange({})} testId={`${testId}-clear-inline`} />\n ) : undefined\n }\n endIcon={<ChevronDownIcon sx={{ fontSize: 16 }} />}\n sx={{\n borderRadius: 999,\n height: 34,\n px: 1.5,\n maxWidth: 280,\n color: inverted ? 'error.main' : 'text.primary',\n fontWeight: 600,\n fontSize: '0.8125rem',\n textTransform: 'none',\n whiteSpace: 'nowrap',\n borderColor: tone,\n bgcolor: active ? 'action.selected' : 'background.paper',\n '&:hover': {\n borderColor: active ? tone : 'text.primary',\n bgcolor: active ? 'action.selected' : 'action.hover',\n },\n }}\n >\n {/* The applied bounds, in the label — a pill reading only \"Valor\" hides\n the very thing that is narrowing the list. */}\n <Box component=\"span\" sx={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {active ? rangeChipLabel(field, value) : field.label}\n </Box>\n </Button>\n );\n}\n\nexport function RangePill<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n onOpenChange,\n testIdPrefix,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n /** So a measured toolbar can hold still while this is open. */\n onOpenChange?: (open: boolean) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const active = isRangeSet(value);\n const testId = `${testIdPrefix}-range-${field.id}`;\n return (\n <>\n <RangeTrigger\n field={field}\n value={value}\n onChange={onChange}\n onOpen={(element) => {\n setAnchor(element);\n onOpenChange?.(true);\n }}\n open={Boolean(anchor)}\n testId={testId}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => {\n setAnchor(null);\n onOpenChange?.(false);\n }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n slotProps={{ paper: { sx: { p: 2, mt: 0.5 } } }}\n >\n <RangeBounds field={field} value={value} onChange={onChange} testId={testId} />\n {/* An inverted window is not an error the merchant must fix before the\n list responds — it simply matches nothing, and saying so beats an\n empty grid with no explanation (FUT-668). */}\n {active && (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 2, mt: 1.5 }}>\n <Typography component=\"span\" sx={{ fontSize: '0.75rem', color: 'text.secondary' }}>\n {rangeChipLabel(field, value)}\n </Typography>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => onChange({})}\n data-testid={`${testId}-clear`}\n sx={{ textTransform: 'none' }}\n >\n {copy.filters.clear}\n </Button>\n </Box>\n )}\n </Popover>\n </>\n );\n}\n\n\n/**\n * One range on the SLIDE-IN panel (and the narrow-screen modal): the numeric\n * control the panel already had, or — for a day range, which that control cannot\n * express — the same `De`/`Até` pair the pill's popover uses.\n */\nexport function PanelRangeField<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (field.kind === \"day\") {\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <Typography component=\"span\" sx={{ fontSize: \"0.75rem\", fontWeight: 500, color: \"text.secondary\" }}>\n {field.label}\n </Typography>\n <RangeBounds field={field} value={value} onChange={onChange} testId={testId} />\n </Box>\n );\n }\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <TableFilter.RangeField\n label={field.label}\n unit={field.unit}\n value={numericRange(value)}\n onChange={(range) => onChange(range)}\n testId={testId}\n />\n {/* Below the numeric control here, unlike the pill's popover: this one\n renders its own label, and chips above it would separate the label\n from the field it names. */}\n <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />\n </Box>\n );\n}\n","'use client';\n\n/**\n * A numeric bound typed the way Brazilians write numbers, replacing\n * `<input type=\"number\">`.\n *\n * The native control parses in the BROWSER's locale, and it does not fail\n * loudly when the text does not match — it drops what it cannot read and keeps\n * the rest. Typing `50,00` into it, measured in Chromium:\n *\n * digitado \"50,00\" -> campo \"5000\" -> filtro R$ 5.000\n * digitado \"17,50\" -> campo \"1750\" -> filtro R$ 1.750\n * digitado \"50.00\" -> campo \"500\" -> filtro R$ 500\n *\n * The comma is deleted and the digits close ranks, so the merchant asks for\n * fifty reais and gets a filter a HUNDRED times larger. The list empties, the\n * chip reads `Valor: ≥ R$ 5000`, and nothing on screen connects that to the\n * `50,00` they typed. It reads as \"the value filter is broken\", which is how it\n * was reported.\n *\n * So the field parses pt-BR itself: `,` is the decimal separator and `.` groups\n * thousands, which is what `R$ 1.234,56` means to the person reading it. A\n * plain `50` still works, and so does `50.00` — a dot with exactly two digits\n * after it is far more likely to be a decimal typed on a numeric keypad than a\n * thousands group, and reading it as `5000` is the very failure this replaces.\n *\n * WHICH KEYPAD, and where the request has to be made. `inputMode` goes on the\n * `<input>`, via `inputProps` — set on the `TextField` it rides the spread onto\n * the root `FormControl` div, an element nothing types into, so the attribute\n * has no effect and a phone goes on offering letters for a field that accepts\n * none of them. It is `decimal` rather than `numeric` because the numeric pad\n * has no comma on iOS, and the comma is the separator this field exists to\n * accept — `numeric` here would reopen the bug above from the other side, with\n * `17,50` untypeable rather than misread. Autofill is off alongside it: its\n * saved-value strip covers the keypad to offer names and addresses, none of\n * which survive `ALLOWED` anyway.\n */\nimport { Box, TextField } from '@mui/material';\nimport React, { useEffect, useState } from 'react';\n\n/** Everything this field lets through: digits and the two separators. */\nconst ALLOWED = /[^\\d.,]/g;\n\n/**\n * pt-BR text → number, or `undefined` when it is not one (yet).\n *\n * `.` is a thousands group and `,` is the decimal point, EXCEPT when a lone dot\n * is followed by one or two digits and no comma is present — `50.00` and `1.5`\n * are decimals somebody typed, while `1.234` is a thousand.\n */\nexport function parsePtBrNumber(text: string): number | undefined {\n const cleaned = text.replace(ALLOWED, '');\n if (cleaned === '') return undefined;\n const hasComma = cleaned.includes(',');\n const dots = cleaned.split('.').length - 1;\n const lastDot = cleaned.lastIndexOf('.');\n const dotIsDecimal =\n !hasComma && dots === 1 && cleaned.length - lastDot - 1 > 0 && cleaned.length - lastDot - 1 <= 2;\n const normalized = dotIsDecimal\n ? cleaned\n : cleaned.replace(/\\./g, '').replace(',', '.');\n const amount = Number(normalized);\n return Number.isFinite(amount) ? amount : undefined;\n}\n\n/**\n * A stored bound → the text the merchant reads, with a comma for the decimal\n * point.\n *\n * It takes a STRING too, and that is not defensive typing: a range restored\n * from the URL arrives as one (`?totalCents_gte=5000`). Narrowing to `number`\n * and dropping the rest emptied the field on every reload — and then the next\n * keystroke wrote a bound built from nothing.\n */\nexport function formatPtBrNumber(amount: number | string | undefined): string {\n if (amount == null || amount === '') return '';\n return String(amount).replace('.', ',');\n}\n\n/** The same, as a number — `undefined` when the bound is unset or unusable. */\nfunction boundAsNumber(amount: number | string | undefined): number | undefined {\n if (amount == null || amount === '') return undefined;\n const parsed = typeof amount === 'number' ? amount : Number(amount);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * One end of a numeric range. The BOUND stays a plain `number` — nothing\n * downstream learns that the typing surface changed.\n */\nexport function NumberBoundInput({\n label,\n value,\n unit,\n onChange,\n testId,\n}: {\n label: string;\n /** The applied bound. A range restored from the URL hands this over as a string. */\n value: number | string | undefined;\n /** Rendered as a start adornment (\"R$\"), not parsed out of the text. */\n unit?: string;\n onChange: (bound: number | undefined) => void;\n testId: string;\n}): React.JSX.Element {\n const applied = boundAsNumber(value);\n const [text, setText] = useState(() => formatPtBrNumber(value));\n\n // Re-sync only when the applied bound moved somewhere the text does not\n // already mean — a \"Limpar\", a saved view. Comparing through the PARSE rather\n // than the string keeps `50,` and `50,00` from being rewritten mid-edit.\n useEffect(() => {\n setText((current) => (parsePtBrNumber(current) === applied ? current : formatPtBrNumber(applied)));\n }, [applied]);\n\n return (\n <TextField\n size=\"small\"\n type=\"text\"\n label={label}\n value={text}\n onChange={(event) => {\n // Reject the characters rather than silently dropping them AFTER\n // parsing — a letter should not move the number.\n const next = event.target.value.replace(ALLOWED, '');\n setText(next);\n const amount = parsePtBrNumber(next);\n // A bare separator (`50,`) parses to nothing yet; leave the applied\n // bound alone rather than clearing it half-way through a decimal.\n if (next === '') return onChange(undefined);\n if (amount !== undefined) onChange(amount);\n }}\n // Blur TIDIES, it does not rewrite. Text that already means the applied\n // bound is left exactly as typed — `20`, `17,50` and `1.234,56` all stay\n // — and only something that does not (`50,,`) snaps back.\n //\n // Padding the field to the chip's precision was tried and is worse than\n // the mismatch it closed: settling `20` to `20,00` means the next edit\n // starts from text the merchant did not write, so appending a digit to\n // make it 200 produces `20,000`, which parses back to 20. The filter then\n // ignores the keystroke, which is exactly the \"não funciona\" this whole\n // control exists to end. An input must hold what was typed into it; the\n // CHIP is where the applied window gets written in full.\n onBlur={() =>\n setText((current) =>\n parsePtBrNumber(current) === applied ? current : formatPtBrNumber(applied),\n )\n }\n InputLabelProps={{ shrink: true }}\n // `inputMode` belongs on the `<input>`, never on the TextField — see the\n // keypad note at the top of this file for what goes wrong up there.\n inputProps={{ 'data-testid': testId, inputMode: 'decimal', autoComplete: 'off' }}\n InputProps={\n unit\n ? {\n startAdornment: (\n <Box component=\"span\" sx={{ mr: 0.5, color: 'text.secondary' }}>\n {unit}\n </Box>\n ),\n }\n : undefined\n }\n sx={{ width: 140 }}\n />\n );\n}\n","\"use client\";\n\n/**\n * THE ONE-CLICK WINDOWS ABOVE A RANGE'S `De`/`Até` INPUTS.\n *\n * \"Filter by last month\" is two date pickers, four gestures and a mental\n * calculation of which day the month ended on. It is also the overwhelmingly\n * common case. So the common windows get a chip each, and the inputs stay for\n * the windows nobody could enumerate.\n *\n * Clicking an active preset CLEARS it. A chip that reads as pressed and does\n * nothing when pressed again is a dead control, and the alternative — hunting\n * for the pill's ✕ — is the gesture this row exists to remove.\n */\nimport { Box } from \"@mui/material\";\n\nimport { isPresetActive, resolvePreset } from \"./data-views-range-presets\";\nimport type { RangePreset, RangeValue } from \"./data-views-types\";\n\n/** One preset, styled as the same pill-shaped chip the filter bar uses. */\nfunction PresetChip({\n preset,\n active,\n onSelect,\n testId,\n}: {\n preset: RangePreset;\n active: boolean;\n onSelect: () => void;\n testId: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onSelect}\n aria-pressed={active}\n data-testid={testId}\n sx={{\n px: 1.25,\n py: 0.5,\n border: 1,\n borderStyle: \"solid\",\n borderColor: active ? \"primary.main\" : \"divider\",\n borderRadius: 999,\n bgcolor: active ? \"action.selected\" : \"background.paper\",\n color: active ? \"primary.main\" : \"text.secondary\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n \"&:hover\": { borderColor: active ? \"primary.main\" : \"text.primary\" },\n }}\n >\n {preset.label}\n </Box>\n );\n}\n\n/**\n * The preset row. Renders nothing when a field declares none, so a numeric\n * range without host-configured windows keeps the popover it had.\n *\n * Carries no outer margin — the three surfaces that host it (the pill's\n * popover, the slide-in panel, the \"Mais\" overflow) each sit it in a different\n * stack, and a baked-in margin would be wrong in two of them.\n */\nexport function RangePresets({\n presets,\n value,\n onChange,\n testId,\n}: {\n presets: RangePreset[];\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n}): React.JSX.Element | null {\n if (presets.length === 0) return null;\n return (\n <Box\n data-testid={`${testId}-presets`}\n sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 0.75 }}\n >\n {presets.map((preset) => {\n const active = isPresetActive(preset, value);\n return (\n <PresetChip\n key={preset.id}\n preset={preset}\n active={active}\n onSelect={() => onChange(active ? {} : resolvePreset(preset))}\n testId={`${testId}-preset-${preset.id}`}\n />\n );\n })}\n </Box>\n );\n}\n","import type { DataViewsCopy } from \"./data-views-copy\";\nimport type { RangeFieldConfig, RangePreset, RangeValue } from \"./data-views-types\";\n\n/**\n * THE CALENDAR WINDOWS BEHIND A DATE FILTER'S ONE-CLICK PRESETS.\n *\n * Pure and component-free, for the same reason `data-views-range-values` is:\n * the pill's popover, the slide-in panel and the \"Mais\" overflow all offer the\n * same presets, and none of them should have to import a component to know what\n * \"Esta semana\" resolves to.\n *\n * Every window is computed in the LOCAL calendar and emitted as `AAAA-MM-DD`.\n * Going through `toISOString()` would answer in UTC, which for every Brazilian\n * timezone is a day ahead after 21:00 — \"Hoje\" would quietly become tomorrow\n * every evening.\n */\n\n/** `AAAA-MM-DD` for a date, read in the local calendar (never UTC). */\nfunction isoDay(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${date.getFullYear()}-${month}-${day}`;\n}\n\n/** The same date shifted by whole days, without mutating the original. */\nfunction shiftDays(date: Date, days: number): Date {\n const next = new Date(date);\n next.setDate(next.getDate() + days);\n return next;\n}\n\n/**\n * The five windows every date filter wants, resolved when CLICKED.\n *\n * Each is a whole calendar unit rather than a unit-to-date: \"Este mês\" is the\n * whole month, not the 1st through today. It is what the words say, it matches\n * the label a merchant reads back on the pill, and it changes nothing for a\n * dataset with no future rows — while a page that does have them (scheduled\n * orders) would otherwise hide them under a preset that claims to show the\n * month.\n *\n * The week starts on SUNDAY, following the Brazilian calendar these grids are\n * read against rather than ISO-8601's Monday.\n */\nexport function dayRangePresets(copy: DataViewsCopy): RangePreset[] {\n return [\n {\n id: \"hoje\",\n range: () => {\n const today = isoDay(new Date());\n return { min: today, max: today };\n },\n },\n {\n id: \"ontem\",\n range: () => {\n const yesterday = isoDay(shiftDays(new Date(), -1));\n return { min: yesterday, max: yesterday };\n },\n },\n {\n id: \"semana\",\n range: () => {\n const now = new Date();\n const sunday = shiftDays(now, -now.getDay());\n return { min: isoDay(sunday), max: isoDay(shiftDays(sunday, 6)) };\n },\n },\n {\n id: \"mes\",\n range: () => {\n const now = new Date();\n const year = now.getFullYear();\n const month = now.getMonth();\n // Day 0 of the NEXT month is the last day of this one — the only spelling\n // that needs no month-length table and no leap-year branch.\n return { min: isoDay(new Date(year, month, 1)), max: isoDay(new Date(year, month + 1, 0)) };\n },\n },\n {\n id: \"ano\",\n range: () => {\n const year = new Date().getFullYear();\n return { min: `${year}-01-01`, max: `${year}-12-31` };\n },\n },\n ].map((preset) => ({ ...preset, label: copy.filters.rangePresets[preset.id] ?? preset.id }));\n}\n\n/**\n * The presets a field offers: its own, or the calendar defaults for a day field\n * that declared none. An explicit `[]` means none — a host suppressing them is\n * saying something, and must not be overridden by the fallback.\n */\nexport function presetsFor<T extends Record<string, unknown>>(\n field: RangeFieldConfig<T>,\n copy: DataViewsCopy,\n): RangePreset[] {\n if (field.presets) return field.presets;\n return field.kind === \"day\" ? dayRangePresets(copy) : [];\n}\n\n/** A preset's window, evaluating it if it is time-dependent. */\nexport function resolvePreset(preset: RangePreset): RangeValue {\n return typeof preset.range === \"function\" ? preset.range() : preset.range;\n}\n\n/**\n * Is this preset the window currently applied?\n *\n * Bounds compare as STRINGS because a `number` field's stored bound may have\n * arrived from an input as `100` while the preset declares `100` — same window,\n * and `undefined` vs a missing key must read as equal too.\n */\nexport function isPresetActive(preset: RangePreset, value: RangeValue): boolean {\n const resolved = resolvePreset(preset);\n const same = (a: number | string | undefined, b: number | string | undefined): boolean =>\n String(a ?? \"\") === String(b ?? \"\");\n return same(resolved.min, value.min) && same(resolved.max, value.max);\n}\n","import type { RangeFieldConfig, RangeValue } from \"./data-views-types\";\n\n/**\n * What a range VALUE means, separate from the controls that edit one.\n *\n * Pure and component-free: whether a window is set, whether it is inverted, how\n * it reads as a label, and its numeric form. The pill, the overflow panel and\n * the filter panel all ask these questions, and none of them should have to\n * import a component to do it.\n */\n\n/** Is either bound set? Drives the pill's active styling and the chip. */\nexport function isRangeSet(range: RangeValue | undefined): boolean {\n return Boolean(range && (range.min != null || range.max != null));\n}\n/** `AAAA-MM-DD` → `DD/MM` — the compact form a chip shows. */\nfunction shortDay(day: string): string {\n const [, month, date] = day.split('-');\n return month && date ? `${date}/${month}` : day;\n}\n/**\n * How many decimals a bound is WRITTEN with, taken from the field's own `step`.\n *\n * `step` is already the field's statement about its precision — money declares\n * `0.01` — so nothing new has to be configured for a chip to know that R$ 17,50\n * has two decimals and a quantity has none.\n */\nfunction decimalsFor(step: number | undefined): number {\n if (!step || Number.isInteger(step)) return 0;\n return String(step).split('.')[1]?.length ?? 0;\n}\n\n/**\n * A numeric bound as the merchant writes it: decimal COMMA, thousands grouped.\n *\n * `String(17.5)` reads `17.5` — a decimal point in a currency that has none —\n * and padding it to the field's own precision is what makes `R$ 17,50` instead\n * of `R$ 17,5`. Shared with the input's blur so the chip and the field it was\n * typed into can never disagree, which matters because the chip is the ONLY\n * place the applied window is stated once the popover closes.\n */\nexport function formatBoundNumber(amount: number, step?: number): string {\n const decimals = decimalsFor(step);\n return new Intl.NumberFormat('pt-BR', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: Math.max(decimals, 2),\n }).format(amount);\n}\n\n/** One bound, rendered for the chip: money in reais, a day as `DD/MM`. */\nfunction boundLabel<T extends Record<string, unknown>>(\n field: RangeFieldConfig<T>,\n bound: number | string,\n): string {\n if (field.kind === 'day') return shortDay(String(bound));\n const amount = typeof bound === 'number' ? bound : Number(bound);\n const text = Number.isFinite(amount) ? formatBoundNumber(amount, field.step) : String(bound);\n return field.unit ? `${field.unit} ${text}` : text;\n}\n/**\n * The chip text for an applied range: \"Data: 01/07–31/07\" when both ends are\n * set, and a one-sided window as the inequality it actually is (\"Valor: ≥ R$ 20\")\n * rather than an en-dash with a blank side.\n */\nexport function rangeChipLabel<T extends Record<string, unknown>>(\n field: RangeFieldConfig<T>,\n range: RangeValue,\n): string {\n const { min, max } = range;\n if (min != null && max != null) {\n return `${field.label}: ${boundLabel(field, min)}–${boundLabel(field, max)}`;\n }\n if (min != null) return `${field.label}: ≥ ${boundLabel(field, min)}`;\n return `${field.label}: ≤ ${boundLabel(field, max as number | string)}`;\n}\n/**\n * Is the window INVERTED — a `de` after its `até`?\n *\n * Not an error the merchant must clear before the list responds: it simply\n * matches nothing. But an empty grid with no explanation reads as \"there is no\n * data\", so the control says which of the two it is.\n */\nexport function isRangeInverted(value: RangeValue): boolean {\n return value.min != null && value.max != null && value.min > value.max;\n}\n/**\n * A stored range narrowed to NUMBERS, for the slide-in panel's numeric control.\n * A bound that doesn't parse is dropped rather than passed on as `NaN`, which\n * the control would render as an empty box that still filtered.\n */\nexport function numericRange(range: RangeValue): { min?: number; max?: number } {\n const parse = (bound: number | string | undefined): number | undefined => {\n if (bound == null || bound === \"\") return undefined;\n const value = Number(bound);\n return Number.isNaN(value) ? undefined : value;\n };\n const min = parse(range.min);\n const max = parse(range.max);\n return { ...(min !== undefined ? { min } : {}), ...(max !== undefined ? { max } : {}) };\n}\n","\"use client\";\n\nimport React from \"react\";\n\nimport { DataGrid, type GridColumn, type GridSort } from \"../DataGrid\";\nimport { Box } from \"../../../mui/Box\";\n\nimport {\n cardTargetWidthFor,\n cardScaleForZoom,\n DENSITY_BOARD_SCALE,\n DENSITY_ROW_PADDING,\n useDataViewsLayout,\n type DataViewsDensity,\n} from \"./data-views-layout-context\";\nimport { cardGridTracks } from \"./data-views-grid-helpers\";\nimport { DataViewsBoard, type BoardConfig } from \"./DataViewsBoard\";\nimport { SelectAllStrip } from \"./data-views-select-all-strip\";\nimport { ListCardGroup, type ListGroupConfig } from \"./list-card-rails\";\nimport type { DataViewCardSelection } from \"./data-views-types\";\nimport type { DataViewsController } from \"./use-data-views-state\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/* ── Body (grid) ─────────────────────────────────────────────────────────── */\n\ninterface GridBodyProps<T extends Record<string, unknown>> {\n rows: T[];\n columns: GridColumn<T>[];\n getRowId: (row: T) => string | number;\n selectedIds: Array<string | number>;\n onChangeSelected: (ids: Array<string | number>) => void;\n sortBy: GridSort[];\n onChangeSortBy: (next: GridSort[]) => void;\n /** \"server\" defers ordering to the backend (rows render as-is); \"client\" sorts in-grid. */\n sortMode: \"client\" | \"server\";\n /** Vertical cell padding, from the density preference. */\n rowPadding: number;\n dataTestId?: string;\n emptyState?: React.ReactNode;\n}\n\n/** The dense DataGrid with multi-select, wrapped in the scrollable table region. */\nfunction GridBody<T extends Record<string, unknown>>({\n rows,\n columns,\n getRowId,\n selectedIds,\n onChangeSelected,\n sortBy,\n onChangeSortBy,\n sortMode,\n rowPadding,\n dataTestId,\n emptyState,\n}: GridBodyProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box\n sx={{\n width: \"100%\",\n overflowX: \"auto\",\n mt: 1.5,\n // Tabwoah-style dense rows: MUI's default TableCell padding keeps rows\n // tall regardless of rowHeight, so the DENSITY preference is applied\n // here rather than through `rowHeight`, which it would fight.\n \"& .MuiTableCell-root\": { py: rowPadding, fontSize: \"0.8125rem\" },\n \"& .MuiTableCell-head\": { py: 0.5, fontSize: \"0.75rem\" },\n }}\n >\n <DataGrid<T>\n rows={rows}\n columns={columns}\n getRowId={(row) => getRowId(row)}\n virtualizeRows={false}\n density=\"compact\"\n rowHeight={36}\n headerHeight={36}\n selection={{ mode: \"multi\", selectedRowIds: selectedIds, onChangeSelected }}\n sorting={{ mode: sortMode, sortBy, onChangeSortBy }}\n data-testid={dataTestId}\n emptyState={emptyState}\n emptyText={copy.grid.emptyFilteredTitle}\n />\n </Box>\n );\n}\n\n/* ── Body (cards) ────────────────────────────────────────────────────────── */\n\ninterface CardBodyProps<T extends Record<string, unknown>> {\n rows: T[];\n renderCard: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n getRowId: (row: T) => string | number;\n selectedIds: Set<string | number>;\n onToggleId: (id: string | number) => void;\n /** The width each card asks for; `auto-fill` turns it into a column count. */\n targetCardWidth: number;\n /** Content scale (padding + type) handed to each card, from the zoom slider. */\n cardScale: number;\n dataTestId?: string;\n emptyState?: React.ReactNode;\n}\n\n/**\n * The \"Grade\" layout: the filtered/sorted rows rendered as an auto-filling grid\n * of entity-supplied cards. Reuses `rows` (= `c.matched`), so search/filter/sort\n * apply; the column width comes from the zoom slider, and each card is handed its\n * selection state so it can drive its own checkbox (BaseCard) — the same\n * selection model as the table.\n */\nfunction CardBody<T extends Record<string, unknown>>({\n rows,\n renderCard,\n getRowId,\n selectedIds,\n onToggleId,\n targetCardWidth,\n cardScale,\n dataTestId,\n emptyState,\n}: CardBodyProps<T>): React.JSX.Element {\n if (rows.length === 0) {\n return <Box sx={{ mt: 1.5 }}>{emptyState}</Box>;\n }\n return (\n <Box\n sx={{\n mt: 1.5,\n display: \"grid\",\n // Fixed inter-card gap — deliberately NOT scaled by the zoom slider, so\n // only the cards grow while the space between them stays constant.\n gap: 1.5,\n ...cardGridTracks(targetCardWidth),\n }}\n data-testid={dataTestId ? `${dataTestId}-cards` : \"data-views-cards\"}\n >\n {rows.map((row) => {\n const id = getRowId(row);\n return (\n <Box key={id}>\n {renderCard(row, {\n selected: selectedIds.has(id),\n onToggleSelect: () => onToggleId(id),\n scale: cardScale,\n })}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/* ── Body (list) ─────────────────────────────────────────────────────────── */\n\ninterface ListBodyProps<T extends Record<string, unknown>> {\n rows: T[];\n renderListRow: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n getRowId: (row: T) => string | number;\n selectedIds: Set<string | number>;\n onToggleId: (id: string | number) => void;\n /** Gap between rows, from the density preference. */\n rowGap: number;\n /** The list's shared column config. See {@link ListGroupConfig}. */\n group?: ListGroupConfig<T>;\n /** The density every row answers, handed to the group when there is one. */\n density: DataViewsDensity;\n dataTestId?: string;\n emptyState?: React.ReactNode;\n}\n\n/**\n * The \"Lista\" layout: one FULL-WIDTH row per record, rendered by the entity — a\n * marker, a title, a subtitle and a value on the right is the shape it was\n * designed for (FUT-733).\n *\n * It sits between the table and the cards rather than replacing either: the\n * table is for comparing many columns, the cards are for browsing, and the list\n * is for scanning a queue on a narrow screen. Selection is the SAME model as\n * both — each row receives its selection state, so it can drive its own\n * checkbox and the bulk menu behaves identically in every layout.\n *\n * `scale` is handed over as 1 rather than the zoom multiplier, and the zoom\n * slider is hidden in this layout: a full-width row has no card size to\n * multiply. See {@link DataViewsZoomSlider}.\n */\nfunction ListBody<T extends Record<string, unknown>>({\n rows,\n renderListRow,\n getRowId,\n selectedIds,\n onToggleId,\n rowGap,\n group,\n density,\n dataTestId,\n emptyState,\n}: ListBodyProps<T>): React.JSX.Element {\n if (rows.length === 0) {\n return <Box sx={{ mt: 1.5 }}>{emptyState}</Box>;\n }\n const testId = dataTestId ? `${dataTestId}-list` : \"data-views-list\";\n const selectionFor = (id: string | number): DataViewCardSelection => ({\n selected: selectedIds.has(id),\n onToggleSelect: () => onToggleId(id),\n scale: 1,\n });\n\n if (group) {\n return (\n <Box sx={{ mt: 1.5 }}>\n <ListCardGroup\n cells={group.cells}\n metaColumns={group.metaColumns}\n rails={group.rails}\n reserveGutters={group.reserveGutters}\n density={density}\n gap={rowGap}\n dataTestId={testId}\n >\n {rows.map((row) => {\n const id = getRowId(row);\n // A FRAGMENT, NOT A BOX. The row is subgrid over the group's tracks\n // (`gridColumn: span railCount`), which only resolves while the card\n // is a DIRECT child of the group's grid. One wrapper element and the\n // span is measured against a grid that isn't there, so every rail\n // collapses — the exact failure the group exists to prevent.\n return (\n <React.Fragment key={id}>\n {renderListRow(row, selectionFor(id))}\n </React.Fragment>\n );\n })}\n </ListCardGroup>\n </Box>\n );\n }\n\n return (\n <Box\n sx={{ mt: 1.5, display: \"flex\", flexDirection: \"column\", gap: rowGap }}\n data-testid={testId}\n >\n {rows.map((row) => {\n const id = getRowId(row);\n return <Box key={id}>{renderListRow(row, selectionFor(id))}</Box>;\n })}\n </Box>\n );\n}\n\n/* ── Body selector (board vs list vs cards vs table, from context) ───────── */\n\ninterface GridMainProps<T extends Record<string, unknown>> {\n c: DataViewsController<T>;\n getRowId: (row: T) => string | number;\n renderCard?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /** Opt-in \"Lista\" layout — one full-width row per record. */\n renderListRow?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /** The Lista's shared columns. Omitted, each row resolves its own tracks. */\n listGroup?: ListGroupConfig<T>;\n /** Opt-in \"Quadro\" (board) layout — needs `renderCard`, since it reuses the card. */\n board?: BoardConfig<T>;\n dataTestId?: string;\n emptyState?: React.ReactNode;\n testIdPrefix: string;\n}\n\n/**\n * The headerless layouts, each preceded by its own select-all.\n *\n * The strip is rendered HERE rather than inside each body so all three agree on\n * where it sits and what it says — and so the table, which already has one in\n * its `<thead>`, never gets a second.\n */\nfunction Headerless<T extends Record<string, unknown>>({\n c,\n getRowId,\n testIdPrefix,\n children,\n}: {\n c: DataViewsController<T>;\n getRowId: (row: T) => string | number;\n testIdPrefix: string;\n children: React.ReactNode;\n}): React.JSX.Element {\n return (\n <>\n <SelectAllStrip\n rows={c.matched}\n getRowId={getRowId}\n selectedIds={c.selectedIds}\n onChange={(next) => c.setSelectedIds(next)}\n testIdPrefix={testIdPrefix}\n />\n {children}\n </>\n );\n}\n\n/**\n * The body for one of the three HEADERLESS layouts, or `null` for the table.\n *\n * Split out from {@link GridMain} so the select-all strip is wrapped around the\n * result exactly once instead of being repeated identically in every branch —\n * which is also what keeps either function inside the line budget.\n */\nfunction headerlessBody<T extends Record<string, unknown>>(\n { c, getRowId, renderCard, renderListRow, listGroup, board, dataTestId, emptyState }: GridMainProps<T>,\n { layout, zoom, density }: ReturnType<typeof useDataViewsLayout>,\n): React.ReactNode | null {\n if (layout === \"list\" && renderListRow) {\n return (\n <ListBody\n rows={c.matched}\n renderListRow={renderListRow}\n getRowId={getRowId}\n selectedIds={c.selectedIds}\n onToggleId={c.toggleId}\n rowGap={DENSITY_ROW_PADDING[density]}\n group={listGroup}\n density={density}\n dataTestId={dataTestId}\n emptyState={emptyState}\n />\n );\n }\n if (layout === \"board\" && board && renderCard) {\n return (\n <DataViewsBoard\n rows={c.matched}\n board={board}\n getRowId={getRowId}\n renderCard={renderCard}\n selectedIds={c.selectedIds}\n onToggleId={c.toggleId}\n // DENSITY, not zoom: the board's own knob in the Exibição tab is how\n // wide its columns are, and it is the only sizing control the board\n // has since the zoom slider was removed.\n cardScale={DENSITY_BOARD_SCALE[density]}\n dataTestId={dataTestId}\n />\n );\n }\n if (layout === \"cards\" && renderCard) {\n return (\n <CardBody\n rows={c.matched}\n renderCard={renderCard}\n getRowId={getRowId}\n selectedIds={c.selectedIds}\n onToggleId={c.toggleId}\n targetCardWidth={cardTargetWidthFor(zoom, density)}\n cardScale={cardScaleForZoom(zoom)}\n dataTestId={dataTestId}\n emptyState={emptyState}\n />\n );\n }\n return null;\n}\n\n/** Picks the body from the layout context: board, list, cards, or the dense grid. */\nexport function GridMain<T extends Record<string, unknown>>(props: GridMainProps<T>): React.JSX.Element {\n const { c, getRowId, dataTestId, emptyState, testIdPrefix } = props;\n const layoutState = useDataViewsLayout();\n const body = headerlessBody(props, layoutState);\n if (body) {\n return (\n <Headerless c={c} getRowId={getRowId} testIdPrefix={testIdPrefix}>\n {body}\n </Headerless>\n );\n }\n return (\n <GridBody\n rows={c.matched}\n columns={c.gridColumns}\n getRowId={getRowId}\n selectedIds={[...c.selectedIds]}\n onChangeSelected={(ids) => c.setSelectedIds(new Set(ids))}\n sortBy={c.state.sortBy}\n onChangeSortBy={(next: GridSort[]) => c.patch({ sortBy: next })}\n sortMode={c.serverMode ? \"server\" : \"client\"}\n rowPadding={DENSITY_ROW_PADDING[layoutState.density]}\n dataTestId={dataTestId}\n emptyState={emptyState}\n />\n );\n}\n\n","\"use client\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { type GridColumn } from \"../DataGrid\";\nimport { type SortFieldDefinition } from \"../../layout/ContentToolbar\";\nimport { Box } from \"../../../mui/Box\";\nimport { Button } from \"../../form/Button\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../../navigation/DropdownMenu\";\n\nimport type {\n DataViewColumn,\n DataViewState,\n FilterFieldConfig,\n RangeFieldConfig,\n RowAction,\n} from \"./data-views-types\";\n\n/** Is this the non-clickable actions column? */\nexport function isActionsColumn<T extends Record<string, unknown>>(col: GridColumn<T>): boolean {\n return col.type === \"actions\" || col.id === \"actions\";\n}\n\n/**\n * Map the DataView columns to grid columns, applying visibility and — when a row\n * click handler is present — wrapping each non-actions cell so clicking opens the row.\n */\nexport function buildGridColumns<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n visibleColumns: string[],\n onRowClick: ((row: T) => void) | undefined,\n): GridColumn<T>[] {\n return columns.map((col) => {\n const hidden = col.hideable !== false && !visibleColumns.includes(col.id);\n if (!onRowClick || isActionsColumn(col)) return { ...col, hidden };\n return {\n ...col,\n hidden,\n cell: (ctx) => {\n const content = col.cell ? col.cell(ctx) : ctx.value == null ? \"\" : String(ctx.value);\n return (\n <Box\n onClick={() => onRowClick(ctx.row)}\n sx={{ cursor: \"pointer\", width: \"100%\", height: \"100%\", display: \"flex\", alignItems: \"center\" }}\n >\n {content}\n </Box>\n );\n },\n };\n });\n}\n\ninterface ActionsColumnConfig<T extends Record<string, unknown>> {\n /** Actions that build the auto \"⋮\" kebab. Ignored when `renderRowMenu` is set. */\n rowActions: RowAction<T>[];\n /** Optional leading slot (e.g. a favourite star) rendered before the kebab. */\n leading?: (row: T) => React.ReactNode;\n testIdPrefix: string;\n getRowId: (row: T) => string | number;\n /**\n * Escape hatch: render a bespoke per-row menu (e.g. an entity's self-contained\n * 3-dots menu that owns its own popups) INSTEAD of the auto kebab built from\n * `rowActions`. This is how the table row and the card share ONE menu component.\n * `rowActions`/`bulkActions` still drive the multi-row bulk menu, which a\n * single-row menu intentionally does not replace.\n */\n renderRowMenu?: (row: T) => React.ReactNode;\n}\n\n/**\n * The auto \"⋮\" kebab actions column built from the reusable `rowActions` — the\n * SAME definitions that feed the bulk menu, so the two never drift. Each item\n * acts on just this row; `rowLabel` provides a per-row label when set. An\n * optional `leading` slot (e.g. a favourite star) renders before the kebab.\n * When `renderRowMenu` is supplied, the cell renders that bespoke menu instead.\n */\nexport function buildRowActionsColumn<T extends Record<string, unknown>>(\n config: ActionsColumnConfig<T>,\n): DataViewColumn<T> {\n const { rowActions, leading, testIdPrefix, getRowId, renderRowMenu } = config;\n const kebabActions = rowActions.filter((action) => action.row !== false);\n return {\n id: \"actions\",\n header: \"\",\n type: \"actions\",\n enableSort: false,\n hideable: false,\n // Narrow: the column only holds the \"⋮\" kebab (plus an optional leading icon),\n // so it needs room for just one or two icons.\n width: leading ? 72 : 44,\n cell: ({ row }) => (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 2, justifyContent: \"flex-end\" }}>\n {leading?.(row)}\n {renderRowMenu\n ? renderRowMenu(row)\n : renderAutoKebab(kebabActions, row, testIdPrefix, getRowId)}\n </span>\n ),\n };\n}\n\n/** The built-in kebab menu for one row, derived from `rowActions`. */\nfunction renderAutoKebab<T extends Record<string, unknown>>(\n kebabActions: RowAction<T>[],\n row: T,\n testIdPrefix: string,\n getRowId: (row: T) => string | number,\n): React.ReactNode {\n const copy = useDataViewsCopy();\n const items: DropdownMenuItem[] = kebabActions\n .filter((action) => action.isVisible?.(row) ?? true)\n .map((action) => ({\n id: action.id,\n label: action.rowLabel ? action.rowLabel(row) : action.label,\n color: action.color,\n onClick: () => void action.onSelect([row]),\n }));\n if (items.length === 0) return null;\n return (\n <DropdownMenu\n size=\"sm\"\n items={items}\n trigger={\n <Button variant=\"text\" size=\"sm\" dataTestId={`${testIdPrefix}-actions-${getRowId(row)}`} aria-label={copy.grid.rowActions}>\n ⋮\n </Button>\n }\n />\n );\n}\n\n/** Sort options derived from the sortable columns when a page supplies none. */\nexport function defaultSortFields<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n): SortFieldDefinition[] {\n return columns\n .filter(\n (col) =>\n col.enableSort !== false &&\n col.type !== \"actions\" &&\n col.id !== \"actions\" &&\n typeof col.header === \"string\" &&\n col.header !== \"\",\n )\n .map((col) => ({\n value: col.id,\n label: col.header as string,\n orderOptions: [\n { value: \"asc\", label: \"Crescente\" },\n { value: \"desc\", label: \"Decrescente\" },\n ],\n }));\n}\n\n/** Count active filters (search + selected pills + bounded ranges) for the badge. */\nexport function computeActiveFilterCount<T extends Record<string, unknown>>(\n state: DataViewState,\n fields: FilterFieldConfig<T>[],\n rangeFields: RangeFieldConfig<T>[],\n): number {\n const ranges = state.ranges ?? {};\n const pillCount = fields.reduce((n, field) => n + ((state.pills[field.id]?.length ?? 0) > 0 ? 1 : 0), 0);\n const rangeCount = rangeFields.reduce((n, field) => {\n const range = ranges[field.id];\n return n + (range && (range.min != null || range.max != null) ? 1 : 0);\n }, 0);\n return (state.search.trim() ? 1 : 0) + pillCount + rangeCount;\n}\n\nfunction bulkMenuItems<T extends Record<string, unknown>>(\n rowActions: RowAction<T>[],\n selectedRows: T[],\n clearSelection: () => void,\n): DropdownMenuItem[] {\n return rowActions\n .filter((action) => action.bulk !== false)\n .map((action) => {\n // State-machine guards: the action runs only on the rows it applies to,\n // and disappears from the menu when none of the selection qualifies.\n const targets = action.isVisible ? selectedRows.filter(action.isVisible) : selectedRows;\n return { action, targets };\n })\n .filter(({ targets }) => targets.length > 0)\n .map(({ action, targets }) => ({\n id: action.id,\n label: action.label,\n color: action.color,\n onClick: () => {\n // Run the (possibly async) handler on the captured selection, then clear\n // it — but only once the work settles. On failure keep the selection so\n // the user can see which rows still need action and retry.\n const result = action.onSelect(targets);\n if (result instanceof Promise) {\n void result.then(\n () => clearSelection(),\n () => {\n /* keep the selection on failure so the user can retry */\n },\n );\n } else {\n clearSelection();\n }\n },\n }));\n}\n\ninterface RenderBulkArgs<T extends Record<string, unknown>> {\n rowActions: RowAction<T>[] | undefined;\n bulkActions: ((selectedRows: T[], clearSelection: () => void) => React.ReactNode) | undefined;\n selectedRows: T[];\n clearSelection: () => void;\n testIdPrefix: string;\n}\n\n/**\n * The selection bulk control shown in the toolbar. Prefers the reusable\n * `rowActions` (an \"Ações\" dropdown mirroring the row kebab); falls back to the\n * low-level `bulkActions` render prop. Renders nothing with no selection.\n */\nexport function renderBulkActions<T extends Record<string, unknown>>({\n rowActions,\n bulkActions,\n selectedRows,\n clearSelection,\n testIdPrefix,\n}: RenderBulkArgs<T>): React.ReactNode {\n const copy = useDataViewsCopy();\n if (selectedRows.length === 0) return undefined;\n if (rowActions) {\n const items = bulkMenuItems(rowActions, selectedRows, clearSelection);\n if (items.length === 0) return undefined;\n return (\n <DropdownMenu\n size=\"sm\"\n items={items}\n trigger={\n <Button variant=\"outline\" size=\"sm\" dataTestId={`${testIdPrefix}-bulk-actions`}>\n {copy.grid.bulkActions(selectedRows.length)}\n </Button>\n }\n />\n );\n }\n return bulkActions ? bulkActions(selectedRows, clearSelection) : undefined;\n}\n\n/** Toggle a single value in a pill's selected-list (returns the next list). */\nexport function togglePillValues(current: string[] | undefined, value: string, checked: boolean): string[] {\n const list = current ?? [];\n return checked ? [...list, value] : list.filter((v) => v !== value);\n}\n\n/**\n * The card grid's `grid-template-columns`, as an sx fragment.\n *\n * One rule at every width: each card asks for `targetWidth` and `auto-fill`\n * decides how many fit. Density moves the target, so it changes the count at\n * every size — which the previous column-count cap could not do, because its\n * track floor bottomed out at a constant shared by all three densities.\n *\n * Below `sm` this is a single column, and no target changes that. That is why\n * the density control hides itself there rather than offering three settings\n * that all draw the same thing.\n */\nexport function cardGridTracks(targetWidth: number) {\n return {\n gridTemplateColumns: {\n xs: \"1fr\",\n sm: `repeat(auto-fill, minmax(${targetWidth}px, 1fr))`,\n },\n };\n}\n","\"use client\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { DataViewCardSelection } from \"./data-views-types\";\n\n/**\n * One column of the board — a single value of the grouping field, with the label\n * to print above it.\n *\n * `tone` is an opaque palette hint (e.g. `\"success\"`, `\"error\"`) the host picks\n * from its own state machine; the board only uses it to colour the column's\n * header accent, so an unknown tone degrades to the default rather than throwing.\n */\nexport interface BoardGroup {\n value: string;\n label: string;\n tone?: string;\n}\n\n/**\n * The BOARD layout's configuration: the same page the table rendered, laid out\n * as columns of the entity's own card.\n *\n * The board earns its place when a page's buckets are STATES IN A STATE MACHINE\n * rather than arbitrary groupings — payments are exactly that shape. Derive\n * `groups` and the table's `scopes` from ONE state-machine definition: two\n * hand-maintained lists of the same states will drift, and the drift shows up as\n * a column the tabs do not have.\n */\nexport interface BoardConfig<T extends Record<string, unknown>> {\n /** The row field whose value places a card in a column. */\n groupBy: keyof T & string;\n /** The columns, in DELIBERATE reading order — the board renders this order. */\n groups: BoardGroup[];\n /** Optional numeric row field summed per column (e.g. the amount in cents). */\n sumBy?: keyof T & string;\n /**\n * Formats a column's total. The PAGE's own formatter, so the board prints\n * money in the store's currency instead of inventing a second convention.\n * Omitted ⇒ the raw sum.\n */\n formatSum?: (total: number) => string;\n /** Header for the column collecting rows in states the front end does not declare. */\n extraLabel?: string;\n}\n\n/** The default header for the catch-all column (see {@link groupRows}). */\nconst DEFAULT_EXTRA_LABEL = \"Sem etapa\";\n\n/** One resolved column: a declared group (or the catch-all) plus its loaded rows. */\ninterface ResolvedColumn<T> {\n key: string;\n label: string;\n tone?: string;\n rows: T[];\n}\n\n/** Read the grouping value off a row as a string (`null`/`undefined` ⇒ \"\"). */\nfunction groupValueOf<T extends Record<string, unknown>>(row: T, groupBy: string): string {\n const value = row[groupBy];\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/**\n * Place every loaded row into a column, in the DECLARED order, and collect the\n * leftovers into one extra column at the end.\n *\n * Nothing is ever dropped, and that is the point: a state added to the back end\n * before the front end knows about it must not make rows disappear. On a\n * payments board, a silently dropped row is money nobody can see. The extra\n * column only exists when something landed in it — once every row is placed it\n * is gone, so the common case shows exactly the declared columns.\n *\n * A declared group with no rows KEEPS its position: the order is a reading\n * order chosen by the host, not a ranking derived from the data.\n */\nexport function groupRows<T extends Record<string, unknown>>(\n rows: T[],\n board: BoardConfig<T>,\n): ResolvedColumn<T>[] {\n const declared = new Map<string, T[]>(board.groups.map((group) => [group.value, []]));\n const extra: T[] = [];\n for (const row of rows) {\n const bucket = declared.get(groupValueOf(row, board.groupBy));\n if (bucket) bucket.push(row);\n else extra.push(row);\n }\n const columns: ResolvedColumn<T>[] = board.groups.map((group) => ({\n key: group.value,\n label: group.label,\n tone: group.tone,\n rows: declared.get(group.value) ?? [],\n }));\n if (extra.length > 0) {\n columns.push({ key: \"__extra__\", label: board.extraLabel ?? DEFAULT_EXTRA_LABEL, rows: extra });\n }\n return columns;\n}\n\n/** A column's total over the rows ON THIS PAGE, or null when nothing is summed. */\nfunction sumOf<T extends Record<string, unknown>>(rows: T[], sumBy: string | undefined): number | null {\n if (!sumBy) return null;\n return rows.reduce((total, row) => {\n const value = row[sumBy];\n return typeof value === \"number\" && Number.isFinite(value) ? total + value : total;\n }, 0);\n}\n\n/** Map a `tone` hint onto a theme colour, defaulting for anything unrecognised. */\nfunction toneColor(tone: string | undefined): string {\n const known = [\"primary\", \"secondary\", \"success\", \"warning\", \"error\", \"info\"];\n return tone && known.includes(tone) ? `${tone}.main` : \"divider\";\n}\n\n/**\n * A column's heading: the label, the page count and the optional sum.\n *\n * The count is labelled \"nesta página\" EVERYWHERE it appears, including in its\n * accessible name. The scope tabs above the board show whole-query totals from\n * the server; an unlabelled column count would contradict them the moment there\n * is a second page, and the reader has no way to tell which number to believe.\n */\nfunction BoardColumnHeader({\n label,\n count,\n sum,\n testId,\n}: {\n label: string;\n count: number;\n /** The formatted total, or null when the board sums nothing. */\n sum: string | null;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 0.25 }}>\n <Box sx={{ display: \"flex\", alignItems: \"baseline\", justifyContent: \"space-between\", gap: 1 }}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ fontWeight: 600 }}>\n {label}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"span\">\n <Box\n component=\"span\"\n data-testid={`${testId}-count`}\n aria-label={copy.board.countOnPage(label, count)}\n sx={{ color: \"text.secondary\", whiteSpace: \"nowrap\" }}\n >\n {copy.board.onThisPage(count)}\n </Box>\n </Text>\n </Box>\n {sum !== null && (\n <Text variant=\"caption\" as=\"span\">\n <Box\n component=\"span\"\n data-testid={`${testId}-sum`}\n aria-label={copy.board.pageSum(sum)}\n sx={{ color: \"text.secondary\" }}\n >\n {sum}\n </Box>\n </Text>\n )}\n </Box>\n );\n}\n\ninterface BoardColumnProps<T extends Record<string, unknown>> {\n column: ResolvedColumn<T>;\n board: BoardConfig<T>;\n getRowId: (row: T) => string | number;\n renderCard: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n selectedIds: Set<string | number>;\n onToggleId: (id: string | number) => void;\n cardScale: number;\n width: number;\n testId: string;\n}\n\n/** One column: its header over a vertical stack of the entity's own cards. */\nfunction BoardColumn<T extends Record<string, unknown>>({\n column,\n board,\n getRowId,\n renderCard,\n selectedIds,\n onToggleId,\n cardScale,\n width,\n testId,\n}: BoardColumnProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const total = sumOf(column.rows, board.sumBy);\n return (\n <Box\n data-testid={testId}\n sx={{\n flex: `0 0 ${width}px`,\n minWidth: width,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 1,\n borderTop: 3,\n borderStyle: \"solid\",\n borderColor: toneColor(column.tone),\n borderRadius: 1,\n bgcolor: \"action.hover\",\n p: 1,\n }}\n >\n <BoardColumnHeader\n label={column.label}\n count={column.rows.length}\n sum={total === null ? null : String(board.formatSum ? board.formatSum(total) : total)}\n testId={testId}\n />\n {column.rows.length === 0 ? (\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" data-testid={`${testId}-empty`} sx={{ color: \"text.disabled\" }}>\n {copy.board.emptyColumn}\n </Box>\n </Text>\n ) : (\n column.rows.map((row) => {\n const id = getRowId(row);\n return (\n <Box key={id}>\n {renderCard(row, {\n selected: selectedIds.has(id),\n onToggleSelect: () => onToggleId(id),\n scale: cardScale,\n })}\n </Box>\n );\n })\n )}\n </Box>\n );\n}\n\ninterface DataViewsBoardProps<T extends Record<string, unknown>> {\n /** The LOADED page, verbatim. The board never filters, sorts or paginates. */\n rows: T[];\n board: BoardConfig<T>;\n getRowId: (row: T) => string | number;\n renderCard: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n selectedIds: Set<string | number>;\n onToggleId: (id: string | number) => void;\n /** Card size multiplier from the toolbar zoom slider — the same knob as cards. */\n cardScale: number;\n dataTestId?: string;\n}\n\n/** The board's column width at scale 1; the zoom slider multiplies it. */\nconst BASE_COLUMN_WIDTH = 240;\n/** Never narrower than this, however far the zoom is wound down (touch targets). */\nconst MIN_COLUMN_WIDTH = 220;\n\n/**\n * The BOARD layout: the loaded page distributed into columns of the entity's own\n * card. A rendering, not a second source of truth — switching to it emits no\n * query, and it shows exactly the rows the table showed.\n *\n * The board scrolls HORIZONTALLY inside its own box rather than letting the page\n * scroll sideways, and its columns keep a usable width at every zoom, so a phone\n * gets a real board instead of six unreadable slivers.\n *\n * Cards are not draggable between columns. Dragging a payment from Recusado to\n * Pago is a domain transition with side effects, not a re-render: it needs the\n * allowed-transition set from the state machine plus a confirmation, and\n * `RowAction.isVisible` is the existing per-row guard to reuse when that lands.\n */\nexport function DataViewsBoard<T extends Record<string, unknown>>({\n rows,\n board,\n getRowId,\n renderCard,\n selectedIds,\n onToggleId,\n cardScale,\n dataTestId,\n}: DataViewsBoardProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const columns = groupRows(rows, board);\n const width = Math.max(MIN_COLUMN_WIDTH, Math.round(BASE_COLUMN_WIDTH * cardScale));\n const testId = dataTestId ? `${dataTestId}-board` : \"data-views-board\";\n return (\n <Box sx={{ mt: 1.5 }}>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" data-testid={`${testId}-scale-note`} sx={{ color: \"text.secondary\" }}>\n {copy.board.pageScopeNote}\n </Box>\n </Text>\n <Box\n data-testid={testId}\n sx={{\n mt: 1,\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 1.5,\n // The BOARD scrolls, not the page: without `maxWidth` the flex row\n // widens its parent and the whole document scrolls sideways.\n maxWidth: \"100%\",\n overflowX: \"auto\",\n pb: 1,\n }}\n >\n {columns.map((column) => (\n <BoardColumn\n key={column.key}\n column={column}\n board={board}\n getRowId={getRowId}\n renderCard={renderCard}\n selectedIds={selectedIds}\n onToggleId={onToggleId}\n cardScale={cardScale}\n width={width}\n testId={`${testId}-column-${column.key}`}\n />\n ))}\n </Box>\n </Box>\n );\n}\n","\"use client\";\n\nimport { Checkbox } from \"@mui/material\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\n/**\n * SELECT-ALL FOR THE LAYOUTS THAT HAVE NO HEADER ROW.\n *\n * The table gets this for free: its `<thead>` carries a checkbox, so beginning\n * a selection is one click on a control that sits with the rows it selects.\n * The cards, the list and the board have no header at all — so without this\n * there is NO way to start a selection except clicking an item first, and\n * \"select everything on this page\" costs one click per row.\n *\n * It is deliberately NOT more toolbar chrome. It sits directly above the\n * content it selects, which is exactly where the table's `<thead>` checkbox\n * sits; putting it in the toolbar would separate the control from its object\n * and would also be the third place in this component that renders a\n * select-all.\n *\n * Renders nothing for an empty page: a select-all over zero rows is a control\n * that cannot do anything, and reserving its band would make the empty state\n * sit lower in the cards than it does in the table.\n */\nexport function SelectAllStrip<T>({\n rows,\n getRowId,\n selectedIds,\n onChange,\n testIdPrefix,\n}: {\n rows: T[];\n getRowId: (row: T) => string | number;\n selectedIds: Set<string | number>;\n onChange: (next: Set<string | number>) => void;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (rows.length === 0) return null;\n const pageIds = rows.map(getRowId);\n const selectedHere = pageIds.filter((id) => selectedIds.has(id)).length;\n const all = selectedHere === pageIds.length;\n // INDETERMINATE, not just checked/unchecked: with 3 of 25 selected, an\n // unchecked box says \"nothing is selected\" and a checked one says\n // \"everything is\". Both are wrong, and the third state is the honest one.\n const some = selectedHere > 0 && !all;\n\n const toggle = (): void => {\n if (all) {\n // Clear only THIS page's ids — a selection made on another page is not\n // this control's to discard.\n const next = new Set(selectedIds);\n pageIds.forEach((id) => next.delete(id));\n onChange(next);\n return;\n }\n onChange(new Set([...selectedIds, ...pageIds]));\n };\n\n return (\n <Box\n data-testid={`${testIdPrefix}-select-all-strip`}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n mt: 1.5,\n px: 1,\n py: 0.75,\n borderBottom: 1,\n borderColor: \"divider\",\n bgcolor: \"action.hover\",\n borderRadius: 1,\n }}\n >\n <Checkbox\n size=\"small\"\n checked={all}\n indeterminate={some}\n onChange={toggle}\n data-testid={`${testIdPrefix}-select-all-box`}\n inputProps={{ \"aria-label\": copy.selection.selectAllOnPage }}\n sx={{ p: 0.5 }}\n />\n <Button\n variant=\"text\"\n size=\"sm\"\n color=\"secondary\"\n onClick={toggle}\n dataTestId={`${testIdPrefix}-select-all-toggle`}\n >\n {all ? copy.selection.clearSelection : copy.selection.selectAll}\n </Button>\n <Text variant=\"caption\" as=\"span\">\n {/* \"nesta página\" is load-bearing: the scope tabs above show\n whole-query totals, so an unqualified count here would read as one. */}\n <Box component=\"span\" sx={{ ml: \"auto\", color: \"text.disabled\", whiteSpace: \"nowrap\" }}>\n {copy.selection.onThisPage(rows.length)}\n </Box>\n </Text>\n </Box>\n );\n}\n","\"use client\";\n\n/**\n * The INLINE filter bar — the horizontal row of controls a grid renders instead\n * of the slide-in panel on a wide screen (`inlineFilters`): the compact keyword\n * box, one pill per facet, one pill per range, and \"Mais N\" for whatever had no\n * room.\n *\n * There is no \"Filtros ativos\" row beneath it. Listing every applied filter a\n * second time, under the controls already showing them, was the same\n * information twice — and put the ✕ that removes a filter somewhere other than\n * the control that applied it. Each pill carries its own.\n *\n * Split from `data-views-filter-panel` because they are two surfaces, not one:\n * the panel is a column of stacked fields, this is a row of pills, and the only\n * thing they share is the prop shape they are both driven by.\n */\nimport { Box } from \"@mui/material\";\nimport { useState } from \"react\";\n\n\nimport { ClearAllControl, CloseSearchControl } from \"./data-views-bar-controls\";\nimport type { GridFilterPanelProps } from \"./data-views-filter-panel\";\nimport { MoreFilters } from \"./data-views-more-filters\";\nimport type { OverflowField, OverflowSplit } from \"./data-views-overflow\";\nimport { CollapsedSearch, InlineKeyword } from \"./data-views-search\";\nimport { PillControl } from \"./data-views-category-pill\";\nimport { RangePill } from \"./data-views-range-pill\";\nimport type { RangeValue } from \"./data-views-types\";\n\n\n\n/* ── Inline (second-line) filter bar ─────────────────────────────────────── */\n\n/** The search, in whichever of its two forms the measurement asked for. */\nfunction SearchSlot({\n search,\n onSearchChange,\n collapsed,\n expanded,\n fill,\n onOpen,\n onEscape,\n testIdPrefix,\n}: {\n search: string;\n onSearchChange: (value: string) => void;\n collapsed: boolean;\n expanded: boolean;\n /** The box owns the cluster alone, so it may shrink below its usual floor. */\n fill: boolean;\n onOpen: () => void;\n onEscape: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n if (collapsed) {\n return (\n <CollapsedSearch active={search !== \"\"} onOpen={onOpen} testId={`${testIdPrefix}-search-all`} />\n );\n }\n return (\n <InlineKeyword\n value={search}\n onChange={onSearchChange}\n testId={`${testIdPrefix}-search-all`}\n autoFocus={expanded}\n onEscape={onEscape}\n fill={fill}\n />\n );\n}\n\n/** Props the inline bar needs (the slide-in panel's, minus its own chrome). */\ntype InlineFilterBarProps<T extends Record<string, unknown>> = Pick<\n GridFilterPanelProps<T>,\n | \"testIdPrefix\"\n | \"search\"\n | \"fields\"\n | \"rangeFields\"\n | \"pills\"\n | \"ranges\"\n | \"onSearchChange\"\n | \"onTogglePill\"\n | \"onChangeRange\"\n | \"onClearField\"\n | \"onClearAll\"\n> & {\n /** The measured degradation state, computed once in `GridShell`. */\n split: OverflowSplit<T>;\n};\n\n/**\n * One filter control on the bar: a multi-select pill or a min/max range. The\n * two are the same thing from the bar's point of view — a labelled control that\n * writes into the view state — so which one to build is decided here rather\n * than in the bar's own render.\n */\nfunction InlineControl<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n onClearField,\n onOpenChange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n onOpenChange?: (open: boolean) => void;\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onChangeRange: (fieldId: string, range: RangeValue) => void;\n onClearField: (fieldId: string) => void;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n if (field.group === \"pill\" && field.pill) {\n return (\n <PillControl\n fieldId={field.id}\n pill={field.pill}\n selected={pills[field.id] ?? []}\n onTogglePill={onTogglePill}\n onClearField={onClearField}\n onOpenChange={onOpenChange}\n testIdPrefix={testIdPrefix}\n />\n );\n }\n if (field.group === \"range\" && field.range) {\n return (\n <RangePill\n field={field.range}\n value={ranges[field.id] ?? {}}\n onChange={(range) => onChangeRange(field.id, range)}\n onOpenChange={onOpenChange}\n testIdPrefix={testIdPrefix}\n />\n );\n }\n return null;\n}\n\n/**\n * WHICH OF THE SEARCH'S THREE STATES THE BAR IS IN.\n *\n * Resting, expanded-and-sharing, or expanded-and-owning-the-cluster. They were\n * one boolean until a phone showed why they are not:\n *\n * - `fill` — an expanded box drops its usual 200px floor and takes whatever the\n * cluster has. That floor is right for a box that lives on the row; it is\n * wrong for one expanded into a cluster the ladder sized for an icon, where\n * insisting on it made the row scroll sideways (154px of overhang at 320px,\n * 84px at 390px, 42px at 500px).\n * - `takesOver` — the narrower case, where shrinking has run out of road and\n * what is left would be too small to read. Only then do the filters stand\n * down. A large phone has room to share, and evicting them there cost the\n * operator their filters for nothing.\n *\n * Once CLICKED the box stays open until Escape or its ✕, so typing is never\n * interrupted by a re-measure.\n */\nfunction useSearchMode<T extends Record<string, unknown>>(\n split: OverflowSplit<T>,\n): {\n showBox: boolean;\n expanded: boolean;\n fill: boolean;\n takesOver: boolean;\n open: () => void;\n close: () => void;\n} {\n const [searchOpen, setSearchOpen] = useState(false);\n return {\n showBox: !split.searchCollapsed || searchOpen,\n expanded: searchOpen,\n fill: split.searchCollapsed && searchOpen,\n takesOver: searchOpen && split.searchTakeover,\n open: () => setSearchOpen(true),\n close: () => setSearchOpen(false),\n };\n}\n\n/**\n * The filter CONTROLS alone — search, the fields that fit, and \"Mais N\" for the\n * ones that don't — with no row chrome of its own, because it is rendered ON\n * the toolbar line rather than under it (`ContentToolbar`'s `leadingControls`).\n *\n * The measurement driving the collapse lives on the toolbar ROW, not here —\n * see the note on `split` below.\n */\nexport function InlineFilterControls<T extends Record<string, unknown>>({\n testIdPrefix,\n pills,\n ranges,\n search,\n onSearchChange,\n onTogglePill,\n onChangeRange,\n onClearField,\n split,\n onClearAll,\n activeFilterCount,\n onControlOpenChange,\n}: Omit<InlineFilterBarProps<T>, \"fields\" | \"rangeFields\"> & {\n /** How many filters are applied — decides whether \"Limpar\" is on the bar at all. */\n activeFilterCount: number;\n /** Reports a control opening/closing so the shell can freeze the measurement. */\n onControlOpenChange?: (open: boolean) => void;\n}): React.JSX.Element {\n // MEASURED, not breakpointed — and measured ONCE, in the shell, because the\n // toolbar around it needs the same answer to drop its labels. The measured\n // element is the whole toolbar ROW (see `GridToolbar`), not this cluster:\n // `RESERVED` prices the counter and Exibir/Exportar, so measuring only the\n // controls would charge for that furniture a second time and collapse the\n // ladder while the row still had hundreds of free pixels.\n const { inline, overflow, compactControls, clearAllHidden } = split;\n const { showBox, expanded, fill, takesOver, open, close } = useSearchMode(split);\n return (\n <Box\n data-testid={`${testIdPrefix}-inline-filters`}\n sx={{\n display: \"flex\",\n flexWrap: \"nowrap\",\n alignItems: \"center\",\n gap: 1,\n minWidth: 0,\n // No squeezing: if the estimate over-packs, the row must overflow (and\n // the next measure sheds a control), not shrink labels to an ellipsis.\n \"& > *\": { flexShrink: 0 },\n }}\n >\n <SearchSlot\n search={search}\n onSearchChange={onSearchChange}\n collapsed={!showBox}\n expanded={expanded}\n fill={fill}\n onOpen={open}\n onEscape={close}\n testIdPrefix={testIdPrefix}\n />\n {takesOver && <CloseSearchControl onClose={close} testIdPrefix={testIdPrefix} />}\n {!takesOver && (\n <FilterSlots\n inline={inline}\n overflow={overflow}\n pills={pills}\n ranges={ranges}\n onTogglePill={onTogglePill}\n onChangeRange={onChangeRange}\n onClearField={onClearField}\n onClearAll={onClearAll}\n onControlOpenChange={onControlOpenChange}\n activeFilterCount={activeFilterCount}\n compactControls={compactControls}\n clearAllHidden={clearAllHidden}\n testIdPrefix={testIdPrefix}\n />\n )}\n </Box>\n );\n}\n\n/**\n * Everything to the right of the search: the fields that fit, \"Mais N\" for the\n * ones that don't, and \"Limpar\". Split out of `InlineFilterControls` only to\n * keep that function inside the size gate — the three are one cluster and the\n * order they render in is the order they shed in.\n */\nfunction FilterSlots<T extends Record<string, unknown>>({\n inline,\n overflow,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n onClearField,\n onClearAll,\n onControlOpenChange,\n activeFilterCount,\n compactControls,\n clearAllHidden,\n testIdPrefix,\n}: {\n inline: OverflowField<T>[];\n overflow: OverflowField<T>[];\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\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 onControlOpenChange?: (open: boolean) => void;\n activeFilterCount: number;\n compactControls: boolean;\n clearAllHidden: boolean;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <>\n {inline.map((field) => (\n <InlineControl\n key={field.id}\n field={field}\n onOpenChange={onControlOpenChange}\n pills={pills}\n ranges={ranges}\n onTogglePill={onTogglePill}\n onChangeRange={onChangeRange}\n onClearField={onClearField}\n testIdPrefix={testIdPrefix}\n />\n ))}\n <MoreFilters\n onOpenChange={onControlOpenChange}\n onClearAll={onClearAll}\n anyApplied={activeFilterCount > 0}\n compact={compactControls}\n fields={overflow}\n pills={pills}\n ranges={ranges}\n onTogglePill={onTogglePill}\n onChangeRange={onChangeRange}\n testIdPrefix={testIdPrefix}\n />\n {activeFilterCount > 0 && !clearAllHidden && (\n <ClearAllControl\n onClearAll={onClearAll}\n compact={compactControls}\n testIdPrefix={testIdPrefix}\n />\n )}\n </>\n );\n}\n\n","\"use client\";\n\n/**\n * THE TWO BARE AFFORDANCES ON THE FILTER BAR.\n *\n * Neither opens anything, which is what sets them apart from every other\n * control on that row and why they are styled flat rather than as outlined\n * pills: one clears the filters, one leaves a search takeover. Giving them a\n * pill's weight made \"Limpar\" read as a sixth filter.\n *\n * Their own module because `data-views-inline-bar` outgrew the file-size gate.\n */\nimport CloseRoundedIcon from \"@mui/icons-material/CloseRounded\";\nimport FilterAltOffRoundedIcon from \"@mui/icons-material/FilterAltOffRounded\";\nimport { Tooltip } from \"@mui/material\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/**\n * \"Limpar\" — one gesture back to the unfiltered list.\n *\n * Present ONLY while something is applied, and last in the cluster, because it\n * is destructive and must never be where a filter control was a moment ago.\n * Each pill already carries its own ✕; this is the other job — six applied\n * filters is six ✕ hunts, and the operator who wants \"show me everything\n * again\" has no way to say it.\n *\n * Loses its label on the same rung Exibir/Exportar lose theirs, and keeps a\n * tooltip when it does: it is one of the two controls (with the search) whose\n * icon has to carry the whole meaning on a phone.\n */\nexport function ClearAllControl({\n onClearAll,\n compact,\n testIdPrefix,\n}: {\n onClearAll: () => void;\n compact: boolean;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n // No border, no fill. Every other control on this row is an outlined pill\n // because it OPENS something; this one is an escape hatch, and giving it the\n // same weight made it read as a sixth filter. Quiet until hovered.\n const button = (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClearAll}\n data-testid={`${testIdPrefix}-clear-all`}\n aria-label={copy.filters.clearAll}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.5,\n height: 34,\n px: compact ? 0.75 : 1,\n border: 0,\n borderRadius: 1,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.8125rem\",\n whiteSpace: \"nowrap\",\n color: \"text.secondary\",\n \"&:hover\": { color: \"text.primary\", bgcolor: \"action.hover\" },\n }}\n >\n <FilterAltOffRoundedIcon sx={{ fontSize: 16 }} />\n {!compact && <Box component=\"span\">{copy.filters.clear}</Box>}\n </Box>\n );\n return compact ? <Tooltip title={copy.filters.clearAll}>{button}</Tooltip> : button;\n}\n\n/**\n * The way out of a search takeover.\n *\n * A phone has no Escape key, and without this the takeover is a one-way door\n * onto a bar with no filters on it.\n\n/**\n * The way out of a search takeover.\n *\n * A phone has no Escape key, and without this the takeover is a one-way door\n * onto a bar with no filters on it.\n */\nexport function CloseSearchControl({\n onClose,\n testIdPrefix,\n}: {\n onClose: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Tooltip title={copy.search.close}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClose}\n aria-label={copy.search.close}\n data-testid={`${testIdPrefix}-search-close`}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n height: 34,\n px: 0.75,\n border: 0,\n borderRadius: 1,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n color: \"text.secondary\",\n \"&:hover\": { color: \"text.primary\", bgcolor: \"action.hover\" },\n }}\n >\n <CloseRoundedIcon sx={{ fontSize: 18 }} />\n </Box>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport KeyboardArrowDownRoundedIcon from \"@mui/icons-material/KeyboardArrowDownRounded\";\n// A FUNNEL, not the tune sliders this used to share with \"Exibir\". The two\n// sit a few px apart on the same bar and do unrelated things — one narrows\n// WHICH rows you see, the other changes HOW they are shown — and with one\n// glyph between them the bar offered the operator no way to tell which was\n// which. On a phone, where both are icon-only, they were indistinguishable.\nimport FilterAltRoundedIcon from \"@mui/icons-material/FilterAltRounded\";\nimport { Popover } from \"@mui/material\";\nimport { useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport { fieldClearing, MoreGroup, type MoreFieldProps } from \"./data-views-more-fields\";\nimport type { OverflowField } from \"./data-views-overflow\";\n\n/**\n * \"MAIS\" — the filter overflow: its trigger, its panel and its footer. What\n * goes INSIDE it is `data-views-more-fields`.\n *\n * It holds the fields that had no room on the toolbar. An applied filter is\n * ranked ahead of an idle one for the visible slots but is NOT exempt (see\n * `useFilterOverflow`), so an applied filter can be in here — on a phone, most\n * of them are. That is why the trigger changes tone and counts the applied\n * ones: a filter you cannot see is a filter you forget you set, and the badge\n * is what stops that.\n */\n\ninterface MoreFiltersProps<T extends Record<string, unknown>> extends MoreFieldProps {\n fields: OverflowField<T>[];\n}\n\n/**\n * The trigger, badged with how many fields had no room on the bar — and told\n * apart when some of them are APPLIED.\n *\n * An applied filter can land in here now (it is ranked first, not exempt), so\n * this button is the only thing on screen still saying it exists. A neutral\n * badge reading \"3\" would make \"three filters you have not used\" and \"three\n * filters narrowing this list\" look identical, which is the whole failure the\n * old exemption was written to avoid. So an overflow holding applied filters\n * takes the applied tone and counts them in its own badge.\n */\nfunction MoreTrigger({\n count,\n appliedCount,\n compact,\n onOpen,\n testIdPrefix,\n}: {\n count: number;\n appliedCount: number;\n /** Icon only — the same rung that strips Exibir/Exportar. */\n compact: boolean;\n onOpen: (anchor: HTMLElement) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const applied = appliedCount > 0;\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n color=\"neutral\"\n onClick={(event) => onOpen(event.currentTarget as HTMLElement)}\n dataTestId={`${testIdPrefix}-more-filters`}\n aria-label={\n applied\n ? copy.filters.moreFiltersApplied(count, appliedCount)\n : copy.filters.moreFilters(count)\n }\n >\n <Box\n component=\"span\"\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.5,\n color: applied ? \"primary.main\" : undefined,\n }}\n >\n <FilterAltRoundedIcon fontSize=\"small\" />\n {!compact && (\n <Box component=\"span\" sx={{ display: { xs: \"none\", sm: \"inline\" } }}>\n {copy.filters.moreTriggerLabel}\n </Box>\n )}\n <Box\n component=\"span\"\n data-testid={`${testIdPrefix}-more-badge`}\n sx={{\n px: 0.75,\n borderRadius: 5,\n bgcolor: applied ? \"primary.main\" : \"action.selected\",\n color: applied ? \"primary.contrastText\" : undefined,\n fontSize: \"0.6875rem\",\n fontWeight: applied ? 700 : undefined,\n }}\n >\n {applied ? appliedCount : count}\n </Box>\n {!compact && <KeyboardArrowDownRoundedIcon fontSize=\"small\" />}\n </Box>\n </Button>\n );\n}\n\n/** The panel's heading: what these are, and why they are in here. */\nfunction MoreHeading(): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n px: 1.5,\n py: 1,\n borderBottom: 1,\n borderColor: \"divider\",\n }}\n >\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ textTransform: \"uppercase\", letterSpacing: 0.5, color: \"text.disabled\" }}>\n {copy.filters.moreHeading}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ ml: \"auto\", color: \"text.disabled\" }}>\n {copy.filters.overflowNote}\n </Box>\n </Text>\n </Box>\n );\n}\n\n/**\n * The panel's own way back to the unfiltered list.\n *\n * The bar's \"Limpar\" is the primary one, but it is a control like any other\n * and the ladder can take its label — and on the narrowest rungs this panel is\n * where most of the fields ended up anyway. Clearing everything from inside it\n * saves closing it to reach a button three pixels wide.\n */\nfunction MoreFooter({\n onClearAll,\n testIdPrefix,\n}: {\n onClearAll: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box sx={{ px: 1.5, py: 1, borderTop: 1, borderColor: \"divider\" }}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClearAll}\n data-testid={`${testIdPrefix}-more-clear-all`}\n sx={{\n width: \"100%\",\n border: 0,\n p: 0,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.8125rem\",\n textAlign: \"left\",\n color: \"primary.main\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n {copy.filters.clearAll}\n </Box>\n </Box>\n );\n}\n\n/** The overflow trigger + panel. Renders nothing when everything fits. */\nexport function MoreFilters<T extends Record<string, unknown>>({\n fields,\n onOpenChange,\n onClearAll,\n anyApplied,\n compact = false,\n ...rest\n}: MoreFiltersProps<T> & {\n /** Icon only — the same rung that strips Exibir/Exportar. */\n compact?: boolean;\n /** Clears every filter, not just the ones in here. */\n onClearAll: () => void;\n /** Whether anything is applied anywhere — the footer is pointless otherwise. */\n anyApplied: boolean;\n /**\n * So the shell can FREEZE the measured split while this panel is open.\n *\n * Applying a filter in here makes its field active, and an active field\n * takes an inline slot first — so the field being edited was promoted OUT of\n * this panel mid-keystroke, taking the focused input with it. Typing \"12\"\n * got as far as \"1\" and then had nowhere to go.\n */\n onOpenChange?: (open: boolean) => void;\n}): React.JSX.Element | null {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n if (fields.length === 0) return null;\n return (\n <>\n <MoreTrigger\n count={fields.length}\n appliedCount={\n fields.filter(\n (field) =>\n fieldClearing({\n field,\n pills: rest.pills,\n ranges: rest.ranges,\n onTogglePill: rest.onTogglePill,\n onChangeRange: rest.onChangeRange,\n }).applied,\n ).length\n }\n compact={compact}\n onOpen={(element) => {\n setAnchor(element);\n onOpenChange?.(true);\n }}\n testIdPrefix={rest.testIdPrefix}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => {\n setAnchor(null);\n onOpenChange?.(false);\n }}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\n slotProps={{ paper: { sx: { width: 300, maxWidth: \"calc(100vw - 32px)\" } } }}\n >\n <Box data-testid={`${rest.testIdPrefix}-more-panel`}>\n <MoreHeading />\n {/* overflowX hidden, not auto: this panel is a fixed 300px and its\n contents are told to shrink into it. A horizontal scrollbar here\n means something refused to, which is a bug to fix rather than a\n scrollbar to live with. */}\n <Box sx={{ maxHeight: 320, overflowY: \"auto\", overflowX: \"hidden\", p: 1.5, minWidth: 0 }}>\n {fields.map((field) => (\n <MoreGroup key={field.id} field={field} {...rest} />\n ))}\n </Box>\n {anyApplied && (\n <MoreFooter onClearAll={onClearAll} testIdPrefix={rest.testIdPrefix} />\n )}\n </Box>\n </Popover>\n </>\n );\n}\n","\"use client\";\n\n/**\n * ONE FIELD, RENDERED INSIDE THE \"MAIS\" PANEL.\n *\n * Split from `data-views-more-filters` at the file-size gate, along the seam\n * that was already there: that module is the trigger, the panel and its\n * footer — the chrome — and this is what goes in it.\n *\n * A field with one or two options renders FLAT: inside a panel there is no\n * space to win back, and two labelled checkboxes are faster than a dropdown\n * needing a second click. Past that it becomes a {@link MultiSelectDropdown} —\n * see `INLINE_OPTION_LIMIT`.\n */\nimport { Checkbox } from \"@mui/material\";\n\nimport { MultiSelectDropdown } from \"../../layout/ContentToolbar\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { OverflowField } from \"./data-views-overflow\";\nimport { RangeBounds } from \"./data-views-range-pill\";\nimport { isRangeSet } from \"./data-views-range-values\";\nimport type { RangeValue } from \"./data-views-types\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/** What each field's control needs, minus the panel's own chrome. */\nexport interface MoreFieldProps {\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onChangeRange: (fieldId: string, range: RangeValue) => void;\n testIdPrefix: string;\n}\n\n/**\n * Above this many options a field is a DROPDOWN rather than a flat row of\n * checkboxes. Two options cost two lines and read faster laid out; a \"Cliente\"\n * with a dozen turns the panel into a scrolling wall and buries every field\n * under it, which is exactly what the overflow was meant to avoid.\n */\nconst INLINE_OPTION_LIMIT = 2;\n\n/** One overflowed pill: its options as checkboxes, all visible at once. */\nfunction OverflowPill<T extends Record<string, unknown>>({\n field,\n values,\n onToggle,\n onClear,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n values: string[];\n onToggle: (value: string, checked: boolean) => void;\n onClear: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const options = field.pill?.options ?? [];\n if (options.length > INLINE_OPTION_LIMIT) {\n return (\n <MultiSelectDropdown\n extraOptionsHeading={copy.filters.optionsHeading}\n clearText={copy.filters.clear}\n clearLabel={copy.filters.clearRange(field.label)}\n label={field.pill?.label ?? field.label}\n options={options}\n selected={new Set(values)}\n onToggle={onToggle}\n onClear={onClear}\n allLabel={copy.filters.allOption}\n searchable={options.length > 6 ? true : undefined}\n searchPlaceholder={copy.filters.optionSearchPlaceholder}\n noResultsLabel={copy.filters.optionsEmpty}\n layout=\"pill\"\n data-testid={`${testIdPrefix}-more-${field.id}`}\n />\n );\n }\n return (\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 0.75 }}>\n {(field.pill?.options ?? []).map((option) => {\n const checked = values.includes(option.value);\n return (\n <Box\n key={option.value}\n component=\"label\"\n data-testid={`${testIdPrefix}-more-${field.id}-${option.value}`}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.25,\n pr: 1,\n border: 1,\n borderStyle: \"solid\",\n borderColor: checked ? \"primary.main\" : \"divider\",\n bgcolor: checked ? \"action.selected\" : \"transparent\",\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: \"0.8125rem\",\n color: checked ? \"primary.main\" : \"text.secondary\",\n }}\n >\n <Checkbox\n size=\"small\"\n checked={checked}\n onChange={(event) => onToggle(option.value, event.target.checked)}\n inputProps={{ \"aria-label\": `${field.label}: ${option.label}` }}\n />\n {option.label}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n\n/**\n * One overflowed range: its presets and its two bounds, as the same controls\n * the pill uses.\n *\n * The whole control DELEGATES to {@link RangeBounds} rather than being built\n * here, which is the point — this panel used to render a raw\n * `<input type=\"date\">`, so the masked `dd/mm/aaaa` field existed only while\n * the filter FITTED on the bar. The moment \"Data\" overflowed it reverted to the\n * native control the mask replaced, and a merchant on a narrow screen never saw\n * the fix at all (FUT-744). `Valor` had the twin bug: a bare `type=\"number\"`\n * plus `Number(raw)` dropped the decimal comma this panel is meant to accept.\n *\n * That also retires the intrinsic-width workaround this pair used to need — a\n * native date input reports a wide minimum (its own mask plus the picker\n * glyph), which is what made two of them refuse to shrink and scrolled the\n * panel sideways. A text input has no such minimum.\n *\n * `RangeBounds` renders the preset chips ITSELF, above the inputs. This panel\n * must NOT render its own row as well: when the delegation above landed, the\n * chips it used to draw by hand stayed behind, and \"Data\" showed Hoje/Ontem/\n * Esta semana/Este mês/Este ano twice — two rows, duplicated test ids, and half\n * the panel's height spent saying the same thing (FUT-751).\n */\nfunction OverflowRange<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n // `group === \"range\"` is what selects this component, so `range` is always\n // set; the guard is for the type, not for a state the caller can reach.\n if (!field.range) return null;\n return (\n <RangeBounds\n field={field.range}\n value={value}\n onChange={onChange}\n testId={`${testIdPrefix}-more-${field.id}`}\n />\n );\n}\n\n/**\n * The trigger, badged with how many fields had no room on the bar — and told\n * apart when some of them are APPLIED.\n *\n * An applied filter can land in here now (it is ranked first, not exempt), so\n * this button is the only thing on screen still saying it exists. A neutral\n * badge reading \"3\" would make \"three filters you have not used\" and \"three\n * filters narrowing this list\" look identical, which is the whole failure the\n * old exemption was written to avoid. So an overflow holding applied filters\n * takes the applied tone and counts them in its own badge.\n\n/**\n * Whether a field has anything applied, and how to unapply it — the two shapes\n * (a pill's selected values, a range's bounds) answered in one place so the\n * group that renders them stays a renderer.\n */\nexport function fieldClearing<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n}: {\n field: OverflowField<T>;\n} & Pick<MoreFieldProps, \"pills\" | \"ranges\" | \"onTogglePill\" | \"onChangeRange\">): {\n applied: boolean;\n clear: () => void;\n} {\n if (field.group === \"range\") {\n return {\n applied: isRangeSet(ranges[field.id] ?? {}),\n clear: () => onChangeRange(field.id, {}),\n };\n }\n const values = pills[field.id] ?? [];\n return {\n applied: values.length > 0,\n clear: () => values.forEach((value) => onTogglePill(field.id, value, false)),\n };\n}\n\n\n/** One labelled group in the panel: the field's name, then its control. */\nexport function MoreGroup<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n} & MoreFieldProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { applied, clear } = fieldClearing({ field, pills, ranges, onTogglePill, onChangeRange });\n return (\n <Box sx={{ mb: 1.5, \"&:last-of-type\": { mb: 0 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, mb: 0.5 }}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ color: \"text.secondary\" }}>\n {field.label}\n {field.group === \"range\" && isRangeSet(ranges[field.id] ?? {}) ? \" •\" : \"\"}\n </Box>\n </Text>\n {/* The panel's equivalent of the pill's ✕. Without it a field applied\n in here could only be cleared by finding it again on the bar —\n which is where it goes the moment it becomes active, so the\n operator has to close this panel to undo what they just did. */}\n {applied && (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={clear}\n data-testid={`${testIdPrefix}-more-${field.id}-clear`}\n sx={{\n ml: \"auto\",\n border: 0,\n p: 0,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.75rem\",\n color: \"primary.main\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n {copy.filters.clear}\n </Box>\n )}\n </Box>\n {field.group === \"pill\" ? (\n <OverflowPill\n field={field}\n values={pills[field.id] ?? []}\n onToggle={(value, checked) => onTogglePill(field.id, value, checked)}\n onClear={() => (pills[field.id] ?? []).forEach((v) => onTogglePill(field.id, v, false))}\n testIdPrefix={testIdPrefix}\n />\n ) : (\n <OverflowRange\n field={field}\n value={ranges[field.id] ?? {}}\n onChange={(range) => onChangeRange(field.id, range)}\n testIdPrefix={testIdPrefix}\n />\n )}\n </Box>\n );\n}\n\n","\"use client\";\n\n/**\n * THE INLINE BAR'S SEARCH — the one control on the toolbar that cannot be\n * guessed from an icon's position, which is why it is the LAST thing the\n * degradation ladder takes away. See `data-views-overflow.ts`.\n */\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport { IconButton, InputAdornment, TextField } from \"@mui/material\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/** How long the box waits after the last keystroke before it queries. */\nconst SEARCH_DEBOUNCE_MS = 350;\n\n/**\n * How wide the keyword box is allowed to be.\n *\n * The 200px floor is right while the box shares the row: a search you cannot\n * read six characters in is not a search. It is WRONG once the box has been\n * expanded out of its collapsed state on a narrow screen, where the cluster was\n * sized for a magnifier — the floor cannot be met there, so the row scrolled\n * sideways instead (154px of overhang at 320px). In that mode the box shrinks,\n * and if what is left would still be unreadable the bar hands it the whole\n * cluster instead (`searchTakeover`).\n */\nfunction boxWidth(fill: boolean): { flex: number; minWidth: number; maxWidth: number | \"none\" } {\n return { flex: 1, minWidth: fill ? 0 : 200, maxWidth: fill ? \"none\" : 384 };\n}\n\n/**\n * The bar's keyword box.\n *\n * DEBOUNCED rather than committed on Enter/blur. In server mode every commit is\n * a round trip, and a box that only fires on blur makes the operator press a\n * key they were not told about to see any result at all — they type, nothing\n * happens, and the list looks broken. 350ms is long enough that a word costs\n * one query, short enough to feel like live search.\n *\n * `Escape` clears; the X clears without leaving the box. Both exist because\n * clearing by selecting-and-deleting is three gestures for the most common\n * thing anyone does to a search box.\n */\nexport function InlineKeyword({\n value,\n onChange,\n testId,\n autoFocus,\n onEscape,\n fill = false,\n}: {\n value: string;\n onChange: (value: string) => void;\n testId?: string;\n autoFocus?: boolean;\n /** Called on Escape with the box already empty — the collapsed bar closes it. */\n onEscape?: () => void;\n /** Take whatever width there is, with no minimum — see {@link boxWidth}. */\n fill?: boolean;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const [draft, setDraft] = useState(value);\n const prev = useRef(value);\n // An external change (a saved view, the URL, \"Limpar\") wins over the draft.\n if (prev.current !== value) {\n prev.current = value;\n if (draft !== value) setDraft(value);\n }\n useEffect(() => {\n if (draft === value) return undefined;\n const timer = setTimeout(() => onChange(draft), SEARCH_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [draft, value, onChange]);\n\n return (\n <TextField\n size=\"small\"\n value={draft}\n autoFocus={autoFocus}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n if (draft === \"\") onEscape?.();\n setDraft(\"\");\n return;\n }\n // Enter still commits IMMEDIATELY, ahead of the debounce — someone who\n // presses it has decided, and waiting out the timer reads as a stall.\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n if (draft !== value) onChange(draft);\n }}\n placeholder={copy.search.placeholder}\n inputProps={{ \"aria-label\": copy.search.allColumnsLabel, \"data-testid\": testId }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon sx={{ fontSize: 16, color: \"text.secondary\" }} />\n </InputAdornment>\n ),\n endAdornment: draft ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n aria-label={copy.search.clear}\n data-testid={testId ? `${testId}-clear` : undefined}\n onClick={() => setDraft(\"\")}\n sx={{ p: 0.25 }}\n >\n <CloseIcon sx={{ fontSize: 14 }} />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n }}\n // Takes the free space and gives it up first — step 3 of the ladder,\n // which needs no flag because flex does it (see `computeSplit`).\n sx={boxWidth(fill)}\n />\n );\n}\n\n/**\n * Step 4 of the ladder: the search as a magnifier.\n *\n * Carries a dot when a search is APPLIED. Collapsing a control that is\n * currently filtering the list, with nothing saying so, is how an operator ends\n * up staring at 3 rows of 214 and reading it as missing data.\n */\nexport function CollapsedSearch({\n active,\n onOpen,\n testId,\n}: {\n active: boolean;\n onOpen: () => void;\n testId?: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <IconButton\n size=\"small\"\n onClick={onOpen}\n aria-label={copy.search.open}\n aria-expanded={false}\n data-testid={testId ? `${testId}-collapsed` : undefined}\n sx={{\n position: \"relative\",\n border: 1,\n borderRadius: 1,\n borderColor: active ? \"primary.main\" : \"divider\",\n color: active ? \"primary.main\" : \"text.secondary\",\n bgcolor: active ? \"action.selected\" : \"background.paper\",\n }}\n >\n <SearchIcon sx={{ fontSize: 18 }} />\n {active && (\n <Box\n component=\"span\"\n sx={{\n position: \"absolute\",\n top: 2,\n right: 2,\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n bgcolor: \"primary.main\",\n }}\n />\n )}\n </IconButton>\n );\n}\n\n","\"use client\";\n\nimport { useRef } from \"react\";\n\nimport { splitToFit, useMeasuredWidth } from \"../../utility/Overflow\";\nimport {\n estimateWidth,\n furnitureCost,\n GAP,\n isRangeSet,\n pillText,\n RESERVED,\n rightClusterCost,\n} from \"./data-views-overflow-costs\";\nimport type { FilterFieldConfig, RangeFieldConfig, RangeValue } from \"./data-views-types\";\n\n/**\n * PROGRESSIVE COLLAPSE — which filter controls fit on the toolbar, measured.\n *\n * Two rules, and both come from watching the all-or-nothing version fail:\n *\n * 1. Controls shed ONE AT A TIME into an overflow, never all at once. With four\n * filters and room for three, hiding all four throws away the room that was\n * there.\n * 2. An APPLIED filter is ranked first, not exempt. Applied controls take the\n * visible slots ahead of idle ones, and go into \"Mais\" like anything else\n * when even those slots run out. Exempting them outright — the earlier rule\n * — meant four applied filters on a phone claimed more width than the row\n * had, and the bar painted past its own edge: the pills were reachable only\n * by scrolling the toolbar sideways. Hiding one is safe because \"Mais\" says\n * how many applied filters are behind it; scrolling one off-screen says\n * nothing at all.\n *\n * It MEASURES rather than picking a breakpoint, which is what\n * `FILTERS-CONTRACT.md` asks for: pages declare different numbers of filters\n * with different label lengths, and the same page collapses at a different\n * width in another language. A shared breakpoint is wrong for at least one\n * table by construction.\n *\n * Collapsing is presentation only — nothing here emits a query, drops a filter\n * or changes a rendered row.\n */\n\n/** A filter control on the bar: a multi-select pill or a min/max range. */\nexport interface OverflowField<T extends Record<string, unknown>> {\n id: string;\n label: string;\n /** Which control it is — the caller renders the right one. */\n group: \"pill\" | \"range\";\n pill?: FilterFieldConfig<T>;\n range?: RangeFieldConfig<T>;\n}\n\n/** What the caller renders inline, and what goes behind \"Mais\". */\nexport interface OverflowSplit<T extends Record<string, unknown>> {\n inline: OverflowField<T>[];\n overflow: OverflowField<T>[];\n /**\n * Step 2 — Exibir/Exportar drop their text labels and become icons.\n * Cheap: both keep their icon, their tooltip and their position.\n */\n compactControls: boolean;\n /**\n * Step 5, and the LAST resort — the \"N de N\" counter is dropped.\n *\n * Only once every control has already collapsed and the row STILL does not\n * fit, which on a six-filter table is below about 400px. The counter goes\n * last because it is the only thing left that reports rather than does: an\n * operator can act without knowing the total, but not without the search.\n */\n counterHidden: boolean;\n /**\n * Step 4 — the search collapses to a magnifier that expands on click.\n * The most expensive step, so it is taken last: the search is the one\n * control on the bar that cannot be guessed from an icon's position.\n */\n searchCollapsed: boolean;\n /**\n * Step 6, below even the counter — \"Limpar\" leaves the bar.\n *\n * The one control here with a second home: the overflow panel's footer\n * carries \"Limpar todos os filtros\". So it goes before the search icon or\n * \"Mais\", neither of which has anywhere else to be.\n */\n clearAllHidden: boolean;\n /**\n * Expanding the magnifier must take the whole cluster, filters and all.\n *\n * Only on the rungs where what is left over would be too narrow to read —\n * on a large phone the box simply shrinks and the filters stay, which is why\n * this is its own answer rather than `searchCollapsed` reused.\n */\n searchTakeover: boolean;\n /** Attach to the toolbar row being measured. */\n barRef: React.RefObject<HTMLDivElement | null>;\n}\n\n/** Every declared control, pills first, in the order the bar renders them. */\nexport function toOverflowFields<T extends Record<string, unknown>>(\n fields: FilterFieldConfig<T>[],\n rangeFields: RangeFieldConfig<T>[],\n): OverflowField<T>[] {\n return [\n ...fields.map((pill) => ({ id: pill.id, label: pill.label, group: \"pill\" as const, pill })),\n ...rangeFields.map((range) => ({ id: range.id, label: range.label, group: \"range\" as const, range })),\n ];\n}\n\n\n/** Is this control carrying a value the operator set? */\nfunction isActiveField<T extends Record<string, unknown>>(\n field: OverflowField<T>,\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n): boolean {\n return field.group === \"pill\"\n ? (pills[field.id]?.length ?? 0) > 0\n : isRangeSet(ranges[field.id]);\n}\n\n/** Estimated rendered width of one control at its CURRENT value. */\nfunction fieldWidth<T extends Record<string, unknown>>(\n field: OverflowField<T>,\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n): number {\n if (field.group === \"pill\") return estimateWidth(pillText(field, pills[field.id] ?? []), 0);\n // A bounded range renders two number inputs beside its label.\n return estimateWidth(field.label, isRangeSet(ranges[field.id]) ? 100 : 0);\n}\n\n/** What one split costs on the bar, so the ladder below can price the next step. */\ntype Split<T extends Record<string, unknown>> = {\n inline: OverflowField<T>[];\n overflow: OverflowField<T>[];\n /** Width the surviving inline controls occupy, incl. the \"Mais\" button. */\n used: number;\n};\n\n/** Step 1 — shed filter controls into the overflow. Pure. */\nfunction splitFilters<T extends Record<string, unknown>>(\n all: OverflowField<T>[],\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n width: number,\n /** Search + counter + right cluster + chrome, at the rung being considered. */\n furniture: number,\n /** Is the bar already down to icons? \"Mais\" shrinks with everything else. */\n compact: boolean,\n): Split<T> {\n const active = all.filter((field) => isActiveField(field, pills, ranges));\n const idle = all.filter((field) => !isActiveField(field, pills, ranges));\n\n // \"Limpar\" rides the end of the cluster whenever anything is applied.\n const clearCost = active.length > 0 ? RESERVED.clearAll + GAP : 0;\n // APPLIED FIRST, BUT NOT EXEMPT.\n //\n // Applied controls take the visible slots ahead of idle ones — that part was\n // always right. Exempting them from the overflow entirely was not: applying\n // a value LENGTHENS a control (\"Pagamento (1)\"), so on a phone four applied\n // filters claimed more width than the row had and the bar simply painted\n // past its own edge, leaving pills reachable only by scrolling sideways.\n //\n // An applied filter hidden in \"Mais\" is not lost the way it would be if it\n // vanished silently: the trigger goes to the applied tone and says how many\n // are in there (see `MoreTrigger`), which is the same signal the pill itself\n // was carrying. A control you scroll off-screen carries no signal at all.\n //\n // The keep-what-fits loop itself is `splitToFit` (`utility/Overflow`) — the\n // one part of this that is not filter-shaped, and the part a second cluster\n // in the design system would otherwise have had to reimplement.\n const split = splitToFit(all, {\n widthOf: (field) => fieldWidth(field, pills, ranges),\n keyOf: (field) => field.id,\n gap: GAP,\n available: width - furniture - clearCost,\n // The overflow button at the width it will actually have, which on a phone\n // is the icon-and-badge one.\n overflowCost: compact ? RESERVED.overflowButtonCompact : RESERVED.overflowButton,\n priority: [...active, ...idle],\n });\n return { ...split, used: split.used + clearCost };\n}\n\n/**\n * THE DEGRADATION LADDER — cheapest loss first, and each rung taken only if\n * the one before it did not free enough:\n *\n * 1. filter controls move into the \"Mais\" overflow (`splitFilters`)\n * 2. Exibir / Exportar drop their text labels (`compactControls`)\n * 3. the search shrinks toward its minimum (CSS: it is `flex: 1`)\n * 4. the search itself collapses to an icon (`searchCollapsed`)\n *\n * Step 3 needs no flag — the search is a flex child, so it gives up width on\n * its own until it hits `RESERVED.search`. The flags mark the two steps that\n * change what is RENDERED rather than how wide it is.\n *\n * Measured against what is CURRENTLY on the bar, never a breakpoint: a\n * two-filter page and a five-filter page would otherwise collapse at the same\n * width, and only one of them would be right.\n */\nfunction computeSplit<T extends Record<string, unknown>>(\n all: OverflowField<T>[],\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n width: number,\n /** Does the host render \"Exportar\" beside \"Exibir\"? Half the cluster if not. */\n hasExport: boolean,\n): Omit<OverflowSplit<T>, \"barRef\"> {\n // Unmeasured (SSR, or jsdom without a ResizeObserver) ⇒ degrade nothing.\n if (width === 0) {\n return {\n inline: all,\n overflow: [],\n compactControls: false,\n counterHidden: false,\n searchCollapsed: false,\n clearAllHidden: false,\n searchTakeover: false,\n };\n }\n // Pass 1 prices the furniture at its widest — no rung has been taken yet.\n let split = splitFilters(all, pills, ranges, width, furnitureCost(UNCOLLAPSED, hasExport), false);\n let flags = ladderFlags(split, width, hasExport);\n // RE-SPEND WHAT THE LATER RUNGS FREED.\n //\n // Rungs 2/4/5 turn 200 + 96 + 216 of furniture into 44 + 0 + 140, and until\n // this loop existed nobody handed those ~330px back to the filters: the\n // split was decided once, against the uncollapsed row, so a phone shed every\n // control and then sat with a band of empty bar beside \"Mais 5\".\n //\n // Settles rather than oscillates, and cannot overfill: a cheaper furniture\n // can only give the filters MORE room, more filter width can only push the\n // ladder FURTHER down, and a further rung can only make the furniture\n // cheaper again — so the budget decreases monotonically and the loop exits\n // the moment it stops moving. The bound is a backstop, not the exit.\n let budget = furnitureCost(UNCOLLAPSED, hasExport);\n for (let pass = 0; pass < 3; pass += 1) {\n const freed = furnitureCost(flags, hasExport);\n if (freed >= budget) break;\n budget = freed;\n split = splitFilters(all, pills, ranges, width, budget, flags.compactControls);\n flags = ladderFlags(split, width, hasExport);\n }\n return { inline: split.inline, overflow: split.overflow, ...flags };\n}\n\n/** The widest the furniture ever is — every rung still untaken. */\nconst UNCOLLAPSED = { searchCollapsed: false, counterHidden: false, compactControls: false };\n\n/** Rungs 2 and 4-6, priced against what the filters actually took. */\nfunction ladderFlags<T extends Record<string, unknown>>(\n split: Split<T>,\n width: number,\n hasExport: boolean,\n): Omit<OverflowSplit<T>, \"barRef\" | \"inline\" | \"overflow\"> {\n const { overflow, used } = split;\n const base = width - used - RESERVED.chrome;\n\n // Would the search still make its minimum with the labels on?\n const compactControls = base - RESERVED.counter - rightClusterCost(hasExport, false) < RESERVED.search;\n const rightCost = rightClusterCost(hasExport, compactControls);\n // …and with them off?\n const searchCollapsed = base - RESERVED.counter - rightCost < RESERVED.search;\n // Everything has collapsed and the row STILL overflows. The controls cannot\n // shrink further — they are `flexShrink: 0` precisely so an over-packed row\n // sheds rather than squeezes — so without this last rung they simply paint\n // outside the toolbar, which is what a narrow phone was doing.\n const counterHidden =\n searchCollapsed && base - RESERVED.counter - rightCost < RESERVED.searchIcon;\n // Step 6 — below even that, \"Limpar\" leaves the bar. It is the ONLY control\n // here with a second home: the overflow panel's footer carries \"Limpar todos\n // os filtros\", so nothing is lost, which is exactly why it goes before the\n // search icon or \"Mais\" (neither of which has anywhere else to be). Guarded\n // on there BEING an overflow, because with no panel the footer does not\n // exist and dropping this would strand the operator.\n const clearAllHidden = counterHidden && overflow.length > 0;\n // What the keyword box would get if the operator expanded the magnifier.\n // `searchCollapsed` is a different question — it asks whether the box fits at\n // its PREFERRED 200px, and is deliberately pessimistic — so reusing it to\n // decide the takeover evicted the filters on screens where the box had plenty\n // of room to simply shrink.\n //\n // Asked with the inline filters SHED, because shedding them is exactly what\n // expanding the box does: the row re-splits and they go behind \"Mais\".\n // Measuring against the resting row instead made a filter argue for its own\n // eviction — now that a large phone keeps one, its width came out of `base`,\n // pushed the box under `usableSearch`, and tipped a row that had ample space\n // to share into a full takeover.\n const overflowButton = compactControls\n ? RESERVED.overflowButtonCompact\n : RESERVED.overflowButton;\n const shedRoom = width - RESERVED.chrome - (overflow.length > 0 ? overflowButton : 0);\n const searchBoxRoom = shedRoom - (counterHidden ? 0 : RESERVED.counter) - rightCost;\n // Below this a box is too narrow to read what you typed into it, and shrinking\n // further buys nothing; that is the only point at which taking the whole\n // cluster is worth losing the filters.\n const searchTakeover = searchCollapsed && searchBoxRoom < RESERVED.usableSearch;\n\n return { compactControls, counterHidden, searchCollapsed, clearAllHidden, searchTakeover };\n}\n\n/**\n * Split the declared filter controls into what fits and what goes behind\n * \"Mais\", measured against the live toolbar width.\n *\n * Cached on a SIGNATURE rather than by `useMemo` over the inputs: hosts declare\n * their fields inline, so `all` is a fresh array on every render while the\n * configuration is unchanged, and a reference-keyed memo would never hit.\n */\nexport function useFilterOverflow<T extends Record<string, unknown>>(\n all: OverflowField<T>[],\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n /**\n * A filter control is open — hold the current answer until it closes.\n *\n * Applying a filter changes that control's LABEL (\"Valor\" becomes \"Valor: ≥\n * R$ 1\"), which changes its measured width, which re-runs the whole split\n * while its popover is open on top of it. Measured: setting a minimum moved\n * the trigger 192px left, took the popover with it, and pushed two other\n * controls into a newly-appeared \"Mais 2\" — so reaching for the second bound\n * meant chasing the control across the row. Nobody sets a range that way.\n *\n * Frozen only for the duration: closing re-measures against the new labels,\n * so the row still ends up correct, it just does not rearrange under a hand\n * that is mid-edit.\n */\n frozen = false,\n /** Whether \"Exportar\" is on the bar — see `rightClusterCost`. */\n hasExport = true,\n): OverflowSplit<T> {\n // The measurement is `useMeasuredWidth` (`utility/Overflow`): the same\n // ResizeObserver every collapsing cluster in the design system reads, so\n // there is one loop to get right rather than one per bar. `0` until the\n // first measurement lands (and forever under SSR or jsdom), which\n // `computeSplit` reads as \"degrade nothing\".\n const { ref: barRef, width } = useMeasuredWidth<HTMLDivElement>();\n const signature = JSON.stringify({\n ids: all.map((field) => field.id),\n pills,\n ranges,\n width,\n hasExport,\n });\n const cache = useRef<{ signature: string; split: ReturnType<typeof computeSplit<T>> } | null>(null);\n if (cache.current === null || (!frozen && cache.current.signature !== signature)) {\n cache.current = { signature, split: computeSplit(all, pills, ranges, width, hasExport) };\n }\n return { ...cache.current.split, barRef };\n}\n","/**\n * WHAT EACH THING ON THE TOOLBAR COSTS, IN PIXELS.\n *\n * The pricing half of the collapse ladder, split from `data-views-overflow` at\n * the file-size gate. Pure arithmetic and constants: no React, no measurement,\n * no decisions. `data-views-overflow` measures the row and spends what this\n * says it has.\n *\n * Every number here is either MEASURED in a browser (and says so) or\n * deliberately generous. Over-pricing sheds one control too early, which the\n * \"Mais\" button absorbs invisibly; under-pricing breaks the line.\n */\nimport type { OverflowField } from \"./data-views-overflow\";\nimport type { RangeValue } from \"./data-views-types\";\n\n/**\n * Rough rendered width of a control, in px.\n *\n * An ESTIMATE from the label text rather than a real measurement, deliberately:\n * measuring the true width needs every control mounted first, and mounting them\n * to decide whether to mount them is the layout thrash this hook exists to\n * avoid. The estimate only has to rank controls and find the cut point — being\n * a few px out moves the cut by at most one control, and the overflow catches it.\n */\nexport function estimateWidth(text: string, extra: number): number {\n /**\n * ~7.6px per character at the toolbar's font size, plus 76px of chrome:\n * horizontal padding, the border, and the dropdown chevron. The chrome used\n * to be 52, which under-priced every control by roughly a chevron's width —\n * six of them then \"fitted\" a row they overflowed, and because they are flex\n * children the row paid for it by squeezing labels to \"D…\" and \"V…\" rather\n * than by shedding a control into the overflow.\n *\n * Deliberately generous: over-pricing sheds one control too early, which the\n * \"Mais\" button absorbs invisibly. Under-pricing breaks the line.\n *\n * The chrome was 76, and generous had turned into wrong. MEASURED on the\n * Pedidos bar: \"Pagamento\" renders at 123px against an estimate of 144, and\n * \"Situação\" at 107 against 137 — every pill over-priced by ~22%, which on a\n * phone is the whole difference between one pill on the bar and none. 56 is\n * still above the ~50 measured, so the slack the comment above asks for is\n * intact; it is just slack rather than a second control's worth of budget.\n */\n return Math.round(text.length * 7.6) + 56 + extra;\n}\n\n/** Is a range bounded at either end? */\nexport function isRangeSet(range: RangeValue | undefined): boolean {\n return Boolean(range && (range.min !== undefined || range.max !== undefined));\n}\n\n/** The label a pill actually renders, which is what decides its width. */\nexport function pillText<T extends Record<string, unknown>>(field: OverflowField<T>, values: string[]): string {\n if (values.length === 0) return field.label;\n if (values.length === 1) {\n const option = field.pill?.options.find((entry) => entry.value === values[0]);\n return `${field.label}: ${option?.label ?? values[0]}`;\n }\n return `${field.label}: ${values.length}`;\n}\n\n/** Fixed toolbar furniture the filters have to fit around, in px. */\nexport const RESERVED = {\n /** The search box never shrinks below this. */\n search: 200,\n /**\n * The \"N de N\" counter.\n *\n * MEASURED at 35px, plus its divider and gap. The old 96 was priced for a\n * counter reading \"1.234 de 5.678\"; a phone shows \"3 de 3\", and charging\n * nearly triple its rendered width came straight out of the filter budget.\n */\n counter: 56,\n /**\n * ONE right-hand control (Exibir, or Exportar) WITH its text label.\n *\n * Priced per control rather than for the pair, because the pair is not what\n * every page renders: \"Exportar\" exists only when the host passes an\n * `exportConfig`, and several pages (Pedidos among them) put their export in\n * the PAGE HEADER instead. Charging 216 there billed the filters for a button\n * that was never on the bar — ~108px of budget spent on nothing, which on a\n * phone is the difference between one filter pill and none.\n */\n displayControl: 108,\n /**\n * The same control as an icon only — step 2 of the ladder.\n *\n * MEASURED at 133px for the PAIR (66 each: a Button's minimum tap target is\n * a good deal wider than the 20px glyph inside it); 70 keeps that total's\n * slack at one control's granularity.\n */\n displayControlCompact: 70,\n /**\n * What step 4 leaves behind: the search as a bare magnifier.\n *\n * MEASURED at 30px on the Pedidos bar (`…-search-all-collapsed`); 38 keeps a\n * tap target's worth of slack over it.\n */\n searchIcon: 38,\n /**\n * The narrowest keyword box still worth typing into — below it the operator\n * cannot read back what they wrote, and the box takes over the cluster\n * instead of sharing it (see `searchTakeover`).\n *\n * 120 rather than 140 because this is compared against the ESTIMATE, which\n * over-prices on purpose (see `estimateWidth`). At 140 a large phone took the\n * whole cluster to produce a box barely wider than the one it could have had\n * while keeping its filters — paying for nothing.\n */\n usableSearch: 120,\n /**\n * The \"Mais\" button, only charged when there IS an overflow — and priced by\n * the state it is actually in, like the right-hand cluster beside it.\n *\n * MEASURED: 128px with its label, badge and chevron; 69px once the ladder has\n * it down to icon + badge. One number for both was wrong in BOTH directions —\n * it under-priced the wide bar (the row's own failure mode) and over-priced\n * the narrow one by a whole pill.\n */\n overflowButton: 136,\n overflowButtonCompact: 80,\n /**\n * \"Limpar\", only charged when there IS something to clear.\n *\n * It appears exactly when the row is at its widest — every applied filter\n * has a longer label than the idle one it replaced — so leaving it unpriced\n * would break the line at the one moment the operator most needs it.\n * Measured at 64 as an icon; 72 with slack.\n */\n clearAll: 72,\n /**\n * The row's own padding, plus the gaps BETWEEN the fixed furniture.\n *\n * Not the per-control gaps — `splitFilters` already adds a `GAP` for every\n * filter it keeps, so counting a fourth one here charged one gap twice.\n * MEASURED: 32px of padding (16 each side) + three 8px gaps between the\n * search, the counter and the right cluster.\n */\n chrome: 56,\n} as const;\n\n/** The gap between two controls. */\nexport const GAP = 8;\n\n/** What the right-hand cluster costs, given what the host actually renders. */\nexport function rightClusterCost(hasExport: boolean, compact: boolean): number {\n const one = compact ? RESERVED.displayControlCompact : RESERVED.displayControl;\n return hasExport ? one * 2 : one;\n}\n\n/**\n * What the toolbar furniture costs at a given rung of the ladder — the budget\n * the filter controls have to fit AROUND.\n *\n * This exists because the two halves used to disagree. `splitFilters` priced\n * the furniture at its widest (search 200 + counter 96 + right 216) and shed\n * every filter to make room; the ladder then collapsed those very controls to\n * 44 + 0 + 140 and nobody handed the ~330px back. On a 428px phone that showed\n * as a bar carrying a magnifier, a \"Mais 5\" pill, and a band of nothing.\n */\nexport function furnitureCost(\n flags: { searchCollapsed: boolean; counterHidden: boolean; compactControls: boolean },\n hasExport: boolean,\n): number {\n return (\n (flags.searchCollapsed ? RESERVED.searchIcon : RESERVED.search) +\n (flags.counterHidden ? 0 : RESERVED.counter) +\n rightClusterCost(hasExport, flags.compactControls) +\n RESERVED.chrome\n );\n}\n","\"use client\";\n\nimport { Divider } from \"@mui/material\";\n\nimport {\n ContentToolbar,\n FilterTrigger,\n type ColumnVisibilityOption,\n type SortFieldDefinition,\n} from \"../../layout/ContentToolbar\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { DataViewsDisplayPanel, type DisplayPanelView } from \"./data-views-display-panel\";\nimport { DataViewsExportMenu, type DataViewExport } from \"./data-views-export\";\nimport { renderBulkActions } from \"./data-views-grid-helpers\";\nimport type { RowAction } from \"./data-views-types\";\nimport type { DataViewsController } from \"./use-data-views-state\";\n\nexport interface GridToolbarProps<T extends Record<string, unknown>> {\n testIdPrefix: string;\n selectedRows: T[];\n selectAll: () => void;\n clearSelection: () => void;\n rowActions?: RowAction<T>[];\n bulkActions?: (selectedRows: T[], clearSelection: () => void) => React.ReactNode;\n sortFields: SortFieldDefinition[];\n activeSortField: string;\n activeSortOrder: \"asc\" | \"desc\";\n onChangeSort: (field: string, order: \"asc\" | \"desc\") => void;\n matchedCount: number;\n totalCount: number;\n toolbarRightSlot?: React.ReactNode;\n columnOptions: ColumnVisibilityOption[];\n onToggleColumn: (id: string, visible: boolean) => void;\n filterOpen: boolean;\n setFilterOpen: (open: boolean) => void;\n activeFilterCount: number;\n /** Hide the \"Filtros\" slide-in trigger (compact layout shows filters inline). */\n showFilterTrigger?: boolean;\n /**\n * Search + filter controls, rendered ON the toolbar line rather than on a row\n * beneath it. Absent ⇒ the toolbar keeps its plain two-cluster shape.\n */\n filterControls?: React.ReactNode;\n /** Measures the toolbar ROW for the filter overflow — see `useFilterOverflow`. */\n barRef?: React.Ref<HTMLDivElement>;\n /** The controller, so \"Exibir\" can drive sort, columns, order and format. */\n c: DataViewsController<T>;\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, when the host has views. */\n displayView?: DisplayPanelView;\n /** Injected export. Absent ⇒ no Exportar control. */\n exportConfig?: DataViewExport;\n /**\n * Step 2 of the degradation ladder: Exibir/Exportar as icons only.\n * MEASURED upstream (see `useFilterOverflow`) rather than switched at a\n * breakpoint, so a two-filter page keeps its labels where a five-filter one\n * has already given them up.\n */\n compactControls?: boolean;\n /**\n * Step 5 of the ladder, and its floor: on a screen too narrow for even the\n * fully-collapsed row, the counter is dropped so the controls still fit one\n * line instead of spilling outside the toolbar.\n */\n counterHidden?: boolean;\n}\n\n/** The right-aligned toolbar controls: Sort By, the counter, zoom/layout/columns, filters. */\nfunction ToolbarRightControls<T extends Record<string, unknown>>(props: GridToolbarProps<T>): React.JSX.Element {\n const { testIdPrefix, matchedCount, totalCount, filterOpen, setFilterOpen } = props;\n return (\n <>\n {/* MEASURED, never breakpointed: `RESERVED.counter` prices it into the\n ladder, so hiding it at `md` was the ladder and a breakpoint\n disagreeing about the same pixels — which broke the row at exactly\n 900px. It is dropped only as the ladder's last rung. */}\n {!props.counterHidden && (\n <>\n <Text variant=\"caption\" as=\"span\">\n <Box\n component=\"span\"\n data-testid={`${testIdPrefix}-counter`}\n sx={{ whiteSpace: \"nowrap\" }}\n >\n {matchedCount} de {totalCount}\n </Box>\n </Text>\n {/* Divides the READING of the list from the controls that change it —\n the counter states what is on screen, everything right of here\n acts on it. */}\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ height: 20, alignSelf: \"center\", mx: 0.5 }}\n />\n </>\n )}\n {props.toolbarRightSlot}\n {/* Sort + columns + format, in ONE control — see DataViewsDisplayPanel. */}\n <DataViewsDisplayPanel\n c={props.c}\n testIdPrefix={testIdPrefix}\n sortKinds={props.sortKinds}\n view={props.displayView}\n compact={props.compactControls}\n />\n {props.exportConfig && (\n <DataViewsExportMenu\n config={props.exportConfig}\n query={props.c.currentQuery}\n totalCount={props.totalCount}\n selectedIds={[...props.c.selectedIds]}\n columns={props.columnOptions.filter((col) => col.visible).map((col) => ({ id: col.id, label: col.label }))}\n testIdPrefix={testIdPrefix}\n compact={props.compactControls}\n />\n )}\n {props.showFilterTrigger !== false && (\n <FilterTrigger\n open={filterOpen}\n onOpenChange={setFilterOpen}\n activeCount={props.activeFilterCount}\n data-testid={`${testIdPrefix}-filters-toggle`}\n />\n )}\n </>\n );\n}\n\n/**\n * The bordered toolbar band: selection chrome + Sort By, the result counter, the\n * saved-views slot, and the filter funnel. The negative margin lets the top/bottom\n * separators reach the sidebar's vertical line and the window edge.\n */\nexport function GridToolbar<T extends Record<string, unknown>>(props: GridToolbarProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { testIdPrefix, selectedRows } = props;\n return (\n <Box\n ref={props.barRef}\n sx={{\n borderTop: 1,\n borderBottom: 1,\n borderColor: \"divider\",\n py: 1.25,\n mx: { xs: -2, md: -3 },\n px: { xs: 2, md: 3 },\n }}\n >\n <ContentToolbar\n selectAllLabel={copy.selection.selectAll}\n selectAllText={copy.selection.selectAllOnPage}\n clearAllText={copy.filters.clearAll}\n hasSelection={selectedRows.length > 0}\n selectedCount={selectedRows.length}\n selectAll={props.selectAll}\n clearSelection={props.clearSelection}\n selectAllTestId={`${testIdPrefix}-select-all`}\n clearAllTestId={`${testIdPrefix}-clear-all`}\n actions={renderBulkActions({\n rowActions: props.rowActions,\n bulkActions: props.bulkActions,\n selectedRows,\n clearSelection: props.clearSelection,\n testIdPrefix,\n })}\n leadingControls={props.filterControls}\n // Selection takes the whole line: no Select All while browsing, and no\n // search/filters/Exibir/Exportar once a row is ticked.\n exclusiveSelection\n rightControls={<ToolbarRightControls {...props} />}\n />\n </Box>\n );\n}\n","\"use client\";\n\nimport type { DataViewsCopy } from \"./data-views-copy\";\nimport KeyboardArrowDownRoundedIcon from \"@mui/icons-material/KeyboardArrowDownRounded\";\n// Says \"display settings\" rather than the generic tune sliders it used to\n// share with the \"Mais\" FILTER trigger — see the note there.\nimport DisplaySettingsRoundedIcon from \"@mui/icons-material/DisplaySettingsRounded\";\nimport { Popover } from \"@mui/material\";\nimport { useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\n\nimport { ColumnsTab } from \"./data-views-columns-tab\";\nimport {\n ViewActions,\n ViewFooter,\n ViewHeader,\n ViewsList,\n type ViewNavHandlers,\n} from \"./data-views-view-nav\";\nimport type { SavedViewSummary } from \"./data-views-types\";\nimport { DisplayTab, SortTab } from \"./data-views-display-tabs\";\nimport type { DataViewsController } from \"./use-data-views-state\";\n\n/**\n * \"EXIBIR\" — one panel for every question about how the list is READ.\n *\n * Sort, columns and format used to be three separate toolbar dropdowns, which\n * asked the operator to already know which one held what. They are one decision\n * (\"how do I want to read this?\") so they are one control with three tabs.\n *\n * A view BRACKETS the panel: its name pinned at the top, the save actions\n * pinned at the bottom, both visible on every tab — so a change made in Colunas\n * is one glance away from the button that saves it. A separate \"Visão\" button\n * in the toolbar would be the same concept twice, in two places, disagreeing\n * about whether there are unsaved changes.\n */\n\n/** Which tab is showing. `columns` first: it is what an operator opens this for. */\ntype DisplayTabKey = \"sort\" | \"columns\" | \"display\";\n\nfunction displayTabs(copy: DataViewsCopy): { key: DisplayTabKey; label: string }[] {\n return [\n { key: \"sort\", label: copy.display.sortTab },\n { key: \"columns\", label: copy.display.columnsTab },\n { key: \"display\", label: copy.display.panelTab },\n ];\n}\n\n/** The saved-view chrome the panel brackets its tabs with, when a host supplies it. */\nexport interface DisplayPanelView {\n /** The applied view's name, or undefined for the built-in \"Visão principal\". */\n activeViewName?: string;\n /** True when the live state differs from the applied view (or from pristine). */\n dirty: boolean;\n /** Restore the applied view (or the pristine default) — discards local changes. */\n onReset: () => void;\n /** Persist the live state over the applied view. Absent ⇒ no update affordance. */\n onUpdate?: () => void;\n /** Persist the live state as a NEW view. */\n onSaveAs: () => void;\n /**\n * The saved views themselves, rendered INLINE in this panel's body when the\n * VISÃO header is opened — not as a dropdown of their own. The panel stays\n * data-free: the host owns the views and every mutation, this only decides\n * where they appear.\n */\n nav?: ViewNavHandlers;\n}\n\ninterface DisplayPanelProps<T extends Record<string, unknown>> {\n c: DataViewsController<T>;\n testIdPrefix: string;\n /** Per-sort-field value kind, so directions read in the column's own terms. */\n sortKinds?: Record<string, string>;\n view?: DisplayPanelView;\n /** Icon only — step 2 of the toolbar's measured degradation ladder. */\n compact?: boolean;\n}\n\n/** The tab strip inside the panel. */\nfunction PanelTabs({\n tab,\n onChange,\n muted,\n testIdPrefix,\n}: {\n tab: DisplayTabKey;\n onChange: (tab: DisplayTabKey) => void;\n /** The views own the body — no tab is showing, so none reads as selected. */\n muted?: boolean;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box sx={{ display: \"flex\", gap: 0.5, p: 0.75, bgcolor: \"action.hover\", borderBottom: 1, borderColor: \"divider\" }}>\n {displayTabs(copy).map((entry) => {\n const active = tab === entry.key && !muted;\n return (\n <Box\n key={entry.key}\n component=\"button\"\n type=\"button\"\n onClick={() => onChange(entry.key)}\n data-testid={`${testIdPrefix}-display-tab-${entry.key}`}\n aria-current={active}\n sx={{\n flex: 1,\n px: 1,\n py: 0.75,\n border: 0,\n borderRadius: 1,\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.8125rem\",\n bgcolor: active ? \"background.paper\" : \"transparent\",\n boxShadow: active ? 1 : 0,\n fontWeight: active ? 600 : 400,\n color: active ? \"text.primary\" : \"text.secondary\",\n }}\n >\n {entry.label}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/** The active tab's body. */\nfunction PanelBody<T extends Record<string, unknown>>({\n tab,\n c,\n sortKinds,\n testIdPrefix,\n}: {\n tab: DisplayTabKey;\n c: DataViewsController<T>;\n sortKinds?: Record<string, string>;\n testIdPrefix: string;\n}): React.JSX.Element {\n if (tab === \"sort\") {\n return (\n <SortTab\n fields={c.resolvedSortFields}\n activeField={c.activeSortField}\n activeOrder={c.activeSortOrder}\n onChange={(field, order) => c.patch({ sortBy: [{ id: field, dir: order }] })}\n sortKinds={sortKinds}\n testIdPrefix={testIdPrefix}\n />\n );\n }\n if (tab === \"columns\") {\n return (\n <ColumnsTab\n columns={c.hideableColumns}\n order={c.columnOrder}\n visibleColumns={c.state.visibleColumns}\n onToggle={c.toggleColumn}\n onReorder={(order) => c.patch({ order })}\n onShowAll={() => c.patch({ visibleColumns: c.columnOrder })}\n // \"Padrão\" restores BOTH: the declared order and every column visible.\n onReset={() => c.patch({ visibleColumns: c.columnOrder, order: undefined })}\n testIdPrefix={testIdPrefix}\n />\n );\n }\n return <DisplayTab testIdPrefix={testIdPrefix} />;\n}\n\n/** Everything inside the popover: VISÃO header, tabs, body, save footer. */\nfunction PanelSurface<T extends Record<string, unknown>>({\n c, view, nav, tab, onTab, viewsOpen, onToggleViews, actionsFor, onOpenActions,\n onBack, sortKinds, onDone, testIdPrefix,\n}: {\n c: DataViewsController<T>;\n view?: DisplayPanelView;\n nav?: ViewNavHandlers;\n tab: DisplayTabKey;\n onTab: (tab: DisplayTabKey) => void;\n viewsOpen: boolean;\n onToggleViews: () => void;\n actionsFor: SavedViewSummary | null;\n onOpenActions: (view: SavedViewSummary) => void;\n onBack: () => void;\n sortKinds?: Record<string, string>;\n onDone: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Box data-testid={`${testIdPrefix}-display-panel`}>\n {view && (\n <ViewHeader\n view={view}\n open={viewsOpen}\n onToggle={onToggleViews}\n testIdPrefix={testIdPrefix}\n />\n )}\n <PanelTabs\n tab={tab}\n onChange={onTab}\n muted={Boolean(nav)}\n testIdPrefix={testIdPrefix}\n />\n {/* Constrained + scrolled: the columns list is unbounded, and a panel\n taller than the viewport puts its own save button off screen. */}\n <Box sx={{ maxHeight: 320, minHeight: 220, overflowY: \"auto\" }}>\n {nav ? (\n <ViewsBody\n nav={nav}\n actionsFor={actionsFor}\n onOpenActions={onOpenActions}\n onBack={onBack}\n testIdPrefix={testIdPrefix}\n />\n ) : (\n <PanelBody tab={tab} c={c} sortKinds={sortKinds} testIdPrefix={testIdPrefix} />\n )}\n </Box>\n {view && <ViewFooter view={view} onDone={onDone} testIdPrefix={testIdPrefix} />}\n </Box>\n );\n}\n\n\n/** The views as the panel's body: the list, or one view's actions. */\nfunction ViewsBody({\n nav,\n actionsFor,\n onOpenActions,\n onBack,\n testIdPrefix,\n}: {\n nav: ViewNavHandlers;\n actionsFor: SavedViewSummary | null;\n onOpenActions: (view: SavedViewSummary) => void;\n onBack: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n // Resolve against the LIVE list, not the object captured when the kebab was\n // clicked: toggling \"Fixar\" or \"Compartilhar\" replaces the view in `views`,\n // and a held snapshot would keep showing the state from before the click.\n const live = actionsFor ? nav.views.find((view) => view.id === actionsFor.id) : undefined;\n if (live) {\n return <ViewActions view={live} handlers={nav} onBack={onBack} testIdPrefix={testIdPrefix} />;\n }\n return <ViewsList handlers={nav} onOpenActions={onOpenActions} testIdPrefix={testIdPrefix} />;\n}\n\n/** The \"Exibir\" button, with the dot that says the view has unsaved changes. */\nfunction DisplayTrigger({\n dirty,\n compact,\n onOpen,\n testIdPrefix,\n}: {\n dirty: boolean;\n compact: boolean;\n onOpen: (anchor: HTMLElement) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n color=\"neutral\"\n onClick={(event) => onOpen(event.currentTarget as HTMLElement)}\n dataTestId={`${testIdPrefix}-display-trigger`}\n aria-label={copy.display.trigger}\n title={compact ? copy.display.trigger : undefined}\n >\n <Box component=\"span\" sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.5 }}>\n <DisplaySettingsRoundedIcon fontSize=\"small\" />\n {!compact && (\n <Box component=\"span\" sx={{ display: { xs: \"none\", sm: \"inline\" } }}>\n {copy.display.trigger}\n </Box>\n )}\n {dirty && (\n <Box component=\"span\" sx={{ height: 6, width: 6, borderRadius: \"50%\", bgcolor: \"primary.main\" }} />\n )}\n {/* The chevron goes with the label. Once the control is a bare icon it\n is already unmistakably a button, and on the rung where that happens\n the ~24px it costs is the difference between a row that fits and one\n that scrolls. */}\n {!compact && <KeyboardArrowDownRoundedIcon fontSize=\"small\" />}\n </Box>\n </Button>\n );\n}\n\n/**\n * The toolbar's \"Exibir\" control: one button, one popover, three tabs, and the\n * view bracketing all of it.\n */\nexport function DataViewsDisplayPanel<T extends Record<string, unknown>>({\n c,\n testIdPrefix,\n sortKinds,\n view,\n compact,\n}: DisplayPanelProps<T>): React.JSX.Element {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const [tab, setTab] = useState<DisplayTabKey>(\"columns\");\n // The views REPLACE the tab body rather than opening over it — see\n // `data-views-view-nav`. `actionsFor` is the second level of that drill-down.\n const [viewsOpen, setViewsOpen] = useState(false);\n const [actionsFor, setActionsFor] = useState<SavedViewSummary | null>(null);\n // Non-null only while the views are the body — the one place that decides\n // whether this panel is showing tabs or views.\n const nav = viewsOpen ? view?.nav : undefined;\n const close = (): void => setAnchor(null);\n const leaveViews = (): void => {\n setViewsOpen(false);\n setActionsFor(null);\n };\n return (\n <>\n <DisplayTrigger\n dirty={Boolean(view?.dirty)}\n compact={Boolean(compact)}\n onOpen={setAnchor}\n testIdPrefix={testIdPrefix}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={close}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n slotProps={{ paper: { sx: { width: 320, maxWidth: \"calc(100vw - 32px)\" } } }}\n >\n <PanelSurface\n c={c}\n view={view}\n nav={nav}\n tab={tab}\n onTab={(next) => {\n setTab(next);\n leaveViews();\n }}\n viewsOpen={viewsOpen}\n onToggleViews={() => {\n setViewsOpen((prev) => !prev);\n setActionsFor(null);\n }}\n actionsFor={actionsFor}\n onOpenActions={setActionsFor}\n onBack={() => setActionsFor(null)}\n sortKinds={sortKinds}\n onDone={close}\n testIdPrefix={testIdPrefix}\n />\n </Popover>\n </>\n );\n}\n","\"use client\";\n\nimport ArrowDownwardRoundedIcon from \"@mui/icons-material/ArrowDownwardRounded\";\nimport ArrowUpwardRoundedIcon from \"@mui/icons-material/ArrowUpwardRounded\";\nimport DragIndicatorRoundedIcon from \"@mui/icons-material/DragIndicatorRounded\";\nimport { Checkbox } from \"@mui/material\";\nimport { useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { HideableColumn } from \"./data-views-columns\";\n\n/* ── Colunas ─────────────────────────────────────────────────────────────── */\n\ninterface ColumnsTabProps {\n columns: HideableColumn[];\n /** Every column id in the CURRENT order (including non-hideable ones). */\n order: string[];\n visibleColumns: string[];\n onToggle: (id: string, visible: boolean) => void;\n onReorder: (order: string[]) => void;\n onShowAll: () => void;\n onReset: () => void;\n testIdPrefix: string;\n}\n\n/** Swap the column at `id` with its neighbour `delta` places away. */\nfunction moved(order: string[], id: string, delta: number): string[] {\n const from = order.indexOf(id);\n const to = from + delta;\n if (from < 0 || to < 0 || to >= order.length) return order;\n const next = [...order];\n [next[from], next[to]] = [next[to]!, next[from]!];\n return next;\n}\n\n/**\n * Visibility AND order in one list, because they are the same decision: an\n * operator reordering columns is deciding what to read first, and hiding one is\n * deciding not to read it at all. Drag the grip, or use the arrows — the arrows\n * exist because drag-and-drop is unusable by keyboard and awkward on a phone.\n */\nexport function ColumnsTab({\n columns,\n order,\n visibleColumns,\n onToggle,\n onReorder,\n onShowAll,\n onReset,\n testIdPrefix,\n}: ColumnsTabProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n const [dragId, setDragId] = useState<string | null>(null);\n const byId = new Map(columns.map((column) => [column.id, column]));\n const ordered = order.map((id) => byId.get(id)).filter((column): column is HideableColumn => Boolean(column));\n // Counted against `columns`, which is the HIDEABLE set — `visibleColumns`\n // also carries the locked ones (a `hideable: false` id like the row's\n // identifier), and counting it whole reads \"9 de 8 visíveis\".\n const visibleHideableCount = visibleColumns.filter((id) => byId.has(id)).length;\n\n const dropOn = (id: string): void => {\n if (!dragId || dragId === id) return;\n const without = order.filter((key) => key !== dragId);\n without.splice(without.indexOf(id), 0, dragId);\n onReorder(without);\n setDragId(null);\n };\n\n return (\n <Box>\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", px: 1.5, py: 1 }}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ color: \"text.secondary\" }} data-testid={`${testIdPrefix}-columns-count`}>\n {copy.columns.visibleCount(visibleHideableCount, columns.length)}\n </Box>\n </Text>\n <Box sx={{ display: \"flex\", gap: 1 }}>\n <LinkButton label={copy.columns.showAll} onClick={onShowAll} testId={`${testIdPrefix}-columns-show-all`} />\n <LinkButton label={copy.columns.reset} onClick={onReset} testId={`${testIdPrefix}-columns-reset`} muted />\n </Box>\n </Box>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 1.5, pb: 0.5, display: \"block\", color: \"text.disabled\" }}>\n {copy.columns.dragHint}\n </Box>\n </Text>\n <Box sx={{ px: 0.75, pb: 0.75 }}>\n {ordered.map((column) => (\n <ColumnRow\n key={column.id}\n column={column}\n visible={visibleColumns.includes(column.id)}\n dragging={dragId === column.id}\n onToggle={onToggle}\n onDragStart={() => setDragId(column.id)}\n onDragEnd={() => setDragId(null)}\n onDrop={() => dropOn(column.id)}\n onMove={(delta) => onReorder(moved(order, column.id, delta))}\n testIdPrefix={testIdPrefix}\n />\n ))}\n </Box>\n </Box>\n );\n}\n\n/** A borderless text action, for the two column resets. */\nfunction LinkButton({\n label,\n onClick,\n testId,\n muted,\n}: {\n label: string;\n onClick: () => void;\n testId: string;\n muted?: boolean;\n}): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n sx={{\n border: 0,\n background: \"none\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.75rem\",\n p: 0,\n color: muted ? \"text.secondary\" : \"primary.main\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n {label}\n </Box>\n );\n}\n\ninterface ColumnRowProps {\n column: HideableColumn;\n visible: boolean;\n dragging: boolean;\n onToggle: (id: string, visible: boolean) => void;\n onDragStart: () => void;\n onDragEnd: () => void;\n onDrop: () => void;\n onMove: (delta: number) => void;\n testIdPrefix: string;\n}\n\n/** One column: grip, checkbox, label, and the keyboard-reachable move arrows. */\nfunction ColumnRow({\n column,\n visible,\n dragging,\n onToggle,\n onDragStart,\n onDragEnd,\n onDrop,\n onMove,\n testIdPrefix,\n}: ColumnRowProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box\n draggable\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={(event: React.DragEvent) => event.preventDefault()}\n onDrop={onDrop}\n data-testid={`${testIdPrefix}-column-row-${column.id}`}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.5,\n px: 0.75,\n py: 0.25,\n borderRadius: 1,\n opacity: dragging ? 0.4 : 1,\n \"&:hover\": { bgcolor: \"action.hover\" },\n \"&:hover .dv-col-move\": { opacity: 1 },\n }}\n >\n <Box component=\"span\" aria-hidden sx={{ display: \"flex\", color: \"action.disabled\", cursor: \"grab\" }}>\n <DragIndicatorRoundedIcon fontSize=\"small\" />\n </Box>\n <Checkbox\n size=\"small\"\n checked={visible}\n onChange={(event) => onToggle(column.id, event.target.checked)}\n inputProps={{ \"aria-label\": column.label }}\n data-testid={`${testIdPrefix}-column-toggle-${column.id}`}\n />\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ flex: 1, color: visible ? \"text.primary\" : \"text.disabled\" }}>\n {column.label}\n </Box>\n </Text>\n <Box className=\"dv-col-move\" sx={{ ml: \"auto\", display: \"flex\", opacity: 0, transition: \"opacity .15s\" }}>\n <MoveButton label={copy.columns.moveUp(column.label)} onClick={() => onMove(-1)} up />\n <MoveButton label={copy.columns.moveDown(column.label)} onClick={() => onMove(1)} />\n </Box>\n </Box>\n );\n}\n\n/** One of the two reorder arrows — the keyboard's path through the drag handle. */\nfunction MoveButton({\n label,\n onClick,\n up,\n}: {\n label: string;\n onClick: () => void;\n up?: boolean;\n}): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n aria-label={label}\n onClick={onClick}\n sx={{\n display: \"flex\",\n border: 0,\n p: 0.25,\n background: \"none\",\n borderRadius: 0.5,\n cursor: \"pointer\",\n color: \"text.secondary\",\n \"&:hover\": { bgcolor: \"action.selected\" },\n }}\n >\n {up ? <ArrowUpwardRoundedIcon sx={{ fontSize: 14 }} /> : <ArrowDownwardRoundedIcon sx={{ fontSize: 14 }} />}\n </Box>\n );\n}\n\n","\"use client\";\n\n/**\n * The saved views, rendered INSIDE the Exibir panel rather than in a dropdown\n * of their own.\n *\n * Two levels, both of them replacing the panel's BODY (the tabs stay put):\n * the list of views, and one view's actions. It is a drill-down and not a\n * nested menu on purpose — an absolutely positioned popover inside the panel's\n * own scroll container gets clipped by it, which is how copy.nav.deleteView ends\n * up unreachable. One level, no clipping, and it works on touch.\n */\nimport ChevronLeftRoundedIcon from \"@mui/icons-material/ChevronLeftRounded\";\nimport CheckRoundedIcon from \"@mui/icons-material/CheckRounded\";\nimport DeleteOutlineRoundedIcon from \"@mui/icons-material/DeleteOutlineRounded\";\nimport EditOutlinedIcon from \"@mui/icons-material/EditOutlined\";\nimport GroupOutlinedIcon from \"@mui/icons-material/GroupOutlined\";\nimport MoreVertRoundedIcon from \"@mui/icons-material/MoreVertRounded\";\nimport PushPinOutlinedIcon from \"@mui/icons-material/PushPinOutlined\";\nimport StarOutlineRoundedIcon from \"@mui/icons-material/StarOutlined\";\nimport StarOutlineRoundedIcon2 from \"@mui/icons-material/StarOutlineRounded\";\nimport { IconButton } from \"@mui/material\";\n\nimport KeyboardArrowDownRoundedIcon from \"@mui/icons-material/KeyboardArrowDownRounded\";\nimport RestartAltRoundedIcon from \"@mui/icons-material/RestartAltRounded\";\nimport SaveOutlinedIcon from \"@mui/icons-material/SaveOutlined\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { DisplayPanelView } from \"./data-views-display-panel\";\nimport type { SavedViewSummary } from \"./data-views-types\";\n\n/** What the panel needs to drive the views without owning any of them. */\nexport interface ViewNavHandlers {\n views: SavedViewSummary[];\n activeViewId?: string | null;\n /** `null` selects the built-in \"{copy.nav.mainView}\". */\n onSelectView: (id: string | null) => void;\n onEditView: (view: SavedViewSummary) => void;\n onPatchView: (\n view: SavedViewSummary,\n changes: Partial<Pick<SavedViewSummary, \"isDefault\" | \"pinned\" | \"shared\">>,\n ) => void;\n onDeleteView: (view: SavedViewSummary) => void;\n}\n\nconst rowSx = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n width: \"100%\",\n px: 1.25,\n py: 1,\n border: 0,\n borderRadius: 1,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.8125rem\",\n textAlign: \"left\",\n color: \"text.primary\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n} as const;\n\n/** The list: the built-in view, then each saved one with its own \"⋮\". */\nexport function ViewsList({\n handlers,\n onOpenActions,\n testIdPrefix,\n}: {\n handlers: ViewNavHandlers;\n onOpenActions: (view: SavedViewSummary) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { views, activeViewId, onSelectView } = handlers;\n const onMain = !activeViewId;\n return (\n <Box sx={{ p: 0.75 }} data-testid={`${testIdPrefix}-views-list`}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={() => onSelectView(null)}\n data-testid={`${testIdPrefix}-view-main`}\n sx={{ ...rowSx, color: onMain ? \"primary.main\" : \"text.primary\", fontWeight: onMain ? 600 : 400 }}\n >\n <Box component=\"span\" sx={{ flex: 1 }}>\n {copy.nav.mainView}\n </Box>\n {onMain && <CheckRoundedIcon fontSize=\"small\" />}\n </Box>\n\n {views.map((view) => {\n const active = view.id === activeViewId;\n return (\n <Box key={view.id} sx={{ display: \"flex\", alignItems: \"center\" }}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={() => onSelectView(view.id)}\n data-testid={`${testIdPrefix}-view-${view.id}`}\n sx={{ ...rowSx, minWidth: 0, color: active ? \"primary.main\" : \"text.primary\", fontWeight: active ? 600 : 400 }}\n >\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {view.name}\n </Box>\n {/* What the row-menu toggles DID, readable without opening it:\n a view set as default, pinned or shared says so here. */}\n {view.isDefault && (\n <StarOutlineRoundedIcon fontSize=\"small\" sx={{ color: \"warning.main\" }} titleAccess={copy.nav.defaultTag} />\n )}\n {view.pinned && (\n <PushPinOutlinedIcon fontSize=\"small\" sx={{ color: \"text.disabled\" }} titleAccess=\"Fixada\" />\n )}\n {view.shared && (\n <GroupOutlinedIcon fontSize=\"small\" sx={{ color: \"text.disabled\" }} titleAccess=\"Compartilhada\" />\n )}\n {active && <CheckRoundedIcon fontSize=\"small\" />}\n </Box>\n <IconButton\n size=\"small\"\n onClick={() => onOpenActions(view)}\n aria-label={copy.nav.viewOptions(view.name)}\n data-testid={`${testIdPrefix}-view-${view.id}-menu`}\n >\n <MoreVertRoundedIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n );\n })}\n\n {views.length === 0 && (\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ display: \"block\", px: 1.25, py: 1.5, color: \"text.secondary\", lineHeight: 1.6 }}>\n {copy.nav.emptyHint}\n </Box>\n </Text>\n )}\n </Box>\n );\n}\n\n/** One view's actions, reached from its \"⋮\" and left by the back row. */\nexport function ViewActions({\n view,\n handlers,\n onBack,\n testIdPrefix,\n}: {\n view: SavedViewSummary;\n handlers: ViewNavHandlers;\n onBack: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { onEditView, onPatchView, onDeleteView } = handlers;\n const action = (\n key: string,\n Icon: typeof StarOutlineRoundedIcon2,\n label: string,\n onClick: () => void,\n opts: { on?: boolean; danger?: boolean } = {},\n ): React.JSX.Element => (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClick}\n data-testid={`${testIdPrefix}-view-action-${key}`}\n sx={{\n ...rowSx,\n color: opts.danger ? \"error.main\" : \"text.primary\",\n \"&:hover\": { bgcolor: opts.danger ? \"error.lighter\" : \"action.hover\" },\n }}\n >\n <Icon fontSize=\"small\" sx={{ color: opts.danger ? \"inherit\" : \"text.disabled\" }} />\n <Box component=\"span\" sx={{ flex: 1 }}>\n {label}\n </Box>\n {opts.on && <CheckRoundedIcon fontSize=\"small\" color=\"primary\" />}\n </Box>\n );\n\n return (\n <Box sx={{ p: 0.75 }} data-testid={`${testIdPrefix}-view-actions`}>\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onBack}\n data-testid={`${testIdPrefix}-view-actions-back`}\n sx={{ ...rowSx, color: \"text.secondary\", fontSize: \"0.75rem\" }}\n >\n <ChevronLeftRoundedIcon fontSize=\"small\" />\n <Box component=\"span\" sx={{ flex: 1, fontWeight: 600, color: \"text.primary\" }}>\n {view.name}\n </Box>\n </Box>\n <Box sx={{ my: 0.5, borderTop: 1, borderColor: \"divider\" }} />\n {action(\"edit\", EditOutlinedIcon, copy.nav.editView, () => onEditView(view))}\n {action(\"default\", StarOutlineRoundedIcon2, copy.nav.setDefault, () => onPatchView(view, { isDefault: !view.isDefault }), { on: view.isDefault })}\n {action(\"pin\", PushPinOutlinedIcon, copy.nav.pinToSidebar, () => onPatchView(view, { pinned: !view.pinned }), { on: view.pinned })}\n {action(\"share\", GroupOutlinedIcon, copy.nav.shareWithTeam, () => onPatchView(view, { shared: !view.shared }), { on: view.shared })}\n <Box sx={{ my: 0.5, borderTop: 1, borderColor: \"divider\" }} />\n {action(\"delete\", DeleteOutlineRoundedIcon, copy.nav.deleteView, () => onDeleteView(view), { danger: true })}\n </Box>\n );\n}\n\n/** Name, unsaved dot, chevron — the parts, so the toggle has one decision. */\nfunction ToggleContents({\n view,\n open,\n interactive,\n testIdPrefix,\n}: {\n view: DisplayPanelView;\n open: boolean;\n interactive: boolean;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <>\n <Box component=\"span\" sx={{ fontWeight: 600 }} data-testid={`${testIdPrefix}-display-view-name`}>\n {view.activeViewName ?? \"{copy.nav.mainView}\"}\n </Box>\n {view.dirty && (\n <Box\n component=\"span\"\n aria-label={copy.nav.unsavedChanges}\n data-testid={`${testIdPrefix}-display-dirty`}\n sx={{ height: 6, width: 6, borderRadius: \"50%\", bgcolor: \"primary.main\" }}\n />\n )}\n {interactive && (\n <KeyboardArrowDownRoundedIcon\n fontSize=\"small\"\n sx={{ color: \"text.disabled\", transform: open ? \"rotate(180deg)\" : \"none\" }}\n />\n )}\n </>\n );\n}\n\n/** The name + unsaved dot; a button only when there are views to open. */\nfunction ViewToggle({\n view,\n open,\n onToggle,\n testIdPrefix,\n}: {\n view: DisplayPanelView;\n open: boolean;\n onToggle: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const interactive = Boolean(view.nav);\n // One decision, not eight: a panel with no views renders the same row as\n // plain text rather than as a button that opens nothing.\n const affordance = interactive\n ? { px: 0.75, py: 0.25, cursor: \"pointer\", \"&:hover\": { bgcolor: \"action.hover\" } }\n : { px: 0, py: 0, cursor: \"default\" };\n return (\n <Box\n component={interactive ? \"button\" : \"div\"}\n type={interactive ? \"button\" : undefined}\n onClick={interactive ? onToggle : undefined}\n aria-expanded={interactive ? open : undefined}\n data-testid={`${testIdPrefix}-display-view-toggle`}\n sx={{\n ml: \"auto\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.75,\n minWidth: 0,\n border: 0,\n borderRadius: 1,\n font: \"inherit\",\n fontSize: \"0.75rem\",\n bgcolor: open ? \"action.selected\" : \"transparent\",\n ...affordance,\n }}\n >\n <ToggleContents view={view} open={open} interactive={interactive} testIdPrefix={testIdPrefix} />\n </Box>\n );\n}\n\n/** The VISÃO row above the tabs. */\nexport function ViewHeader(props: {\n view: DisplayPanelView;\n open: boolean;\n onToggle: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, px: 1.5, py: 1, borderBottom: 1, borderColor: \"divider\" }}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ textTransform: \"uppercase\", letterSpacing: 0.5, color: \"text.disabled\" }}>\n {copy.nav.label}\n </Box>\n </Text>\n <ViewToggle {...props} />\n </Box>\n );\n}\n\n/** Redefinir / Salvar como nova / Atualizar, pinned below the tabs. */\nexport function ViewFooter({\n view,\n onDone,\n testIdPrefix,\n}: {\n view: DisplayPanelView;\n onDone: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 1,\n px: 1.5,\n py: 1,\n borderTop: 1,\n borderColor: \"divider\",\n bgcolor: \"action.hover\",\n }}\n >\n <Button\n variant=\"text\"\n size=\"sm\"\n color=\"neutral\"\n disabled={!view.dirty}\n startIcon={<RestartAltRoundedIcon fontSize=\"small\" />}\n onClick={view.onReset}\n dataTestId={`${testIdPrefix}-display-reset`}\n >\n {copy.nav.reset}\n </Button>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n {/* Only meaningful with a view APPLIED: on {copy.nav.mainView} the single\n \"Salvar visão\" already is \"save as new\". */}\n {view.onUpdate && (\n <Button\n variant=\"text\"\n size=\"sm\"\n color=\"neutral\"\n onClick={() => {\n view.onSaveAs();\n onDone();\n }}\n dataTestId={`${testIdPrefix}-display-save-as`}\n >\n {copy.nav.saveAs}\n </Button>\n )}\n {/* Enabled only when something in Ordenar / Colunas / Exibição (or the\n filters the view also stores) differs from the applied view: the\n filled button is a STATE — \"there is something to save\" — not a\n permanent fixture. */}\n <Button\n size=\"sm\"\n disabled={!view.dirty}\n startIcon={<SaveOutlinedIcon fontSize=\"small\" />}\n onClick={() => {\n (view.onUpdate ?? view.onSaveAs)();\n onDone();\n }}\n dataTestId={`${testIdPrefix}-display-save`}\n >\n {view.onUpdate ? copy.nav.update : copy.nav.save}\n </Button>\n </Box>\n </Box>\n );\n}\n\n","\"use client\";\n\nimport type { DataViewsCopy } from \"./data-views-copy\";\nimport ArrowDownwardRoundedIcon from \"@mui/icons-material/ArrowDownwardRounded\";\nimport ArrowUpwardRoundedIcon from \"@mui/icons-material/ArrowUpwardRounded\";\nimport { useMediaQuery } from \"@mui/material\";\nimport type { Theme } from \"@mui/material\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport type { SortFieldDefinition } from \"../../layout/ContentToolbar\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport {\n BoardGlyph,\n ColumnsGlyph,\n GridGlyph,\n ListGlyph,\n RowsGlyph,\n TableGlyph,\n} from \"./data-views-glyphs\";\nimport {\n useDataViewsLayout,\n type DataViewsDensity,\n type DataViewsLayout,\n} from \"./data-views-layout-context\";\n\n/**\n * Two of the three tabs inside the \"Exibir\" panel — Ordenar and Exibição. The\n * Colunas tab is its own file (`data-views-columns-tab.tsx`) for the size budget.\n *\n * They live together because they answer one question (\"how do I want to read\n * this list?\") and were previously three separate toolbar dropdowns that the\n * operator had to know apart. Split into this file so the panel that frames\n * them, and each tab, stays inside the size budget.\n */\n\n/* ── Shared tile ─────────────────────────────────────────────────────────── */\n\n/** A picker tile: a glyph over its label, highlighted when it is the choice. */\nfunction Tile({\n active,\n label,\n onClick,\n testId,\n children,\n}: {\n active: boolean;\n label: string;\n onClick: () => void;\n testId: string;\n children: React.ReactNode;\n}): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n data-testid={testId}\n sx={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 0.75,\n p: 1.25,\n border: 1,\n borderStyle: \"solid\",\n borderColor: active ? \"primary.main\" : \"divider\",\n bgcolor: active ? \"action.selected\" : \"transparent\",\n borderRadius: 1,\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.75rem\",\n fontWeight: active ? 600 : 400,\n color: active ? \"primary.main\" : \"text.secondary\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n }}\n >\n {children}\n {label}\n </Box>\n );\n}\n\n/* ── Ordenar ─────────────────────────────────────────────────────────────── */\n\n/**\n * Direction labels read in the COLUMN'S OWN TERMS. \"Crescente\" on a currency\n * column is a puzzle the operator has to solve every time; \"Menor → maior\" is\n * not, and \"Mais recente\" is what someone actually means about a date.\n */\nconst DIRECTION_LABELS: Record<string, [string, string]> = {\n number: [\"Menor → maior\", \"Maior → menor\"],\n currency: [\"Menor → maior\", \"Maior → menor\"],\n date: [\"Mais antigo\", \"Mais recente\"],\n text: [\"A → Z\", \"Z → A\"],\n};\n\n/** The direction wording for a sort field, falling back to alphabetical. */\nfunction directionLabels(kind: string | undefined): [string, string] {\n return DIRECTION_LABELS[kind ?? \"text\"] ?? DIRECTION_LABELS.text!;\n}\n\ninterface SortTabProps {\n fields: SortFieldDefinition[];\n activeField: string;\n activeOrder: \"asc\" | \"desc\";\n onChange: (field: string, order: \"asc\" | \"desc\") => void;\n /** Per-field value kind, so the direction can be phrased in its own terms. */\n sortKinds?: Record<string, string>;\n testIdPrefix: string;\n}\n\n/** Direction first (two tiles), then the field list — the order they are decided in. */\nexport function SortTab({\n fields,\n activeField,\n activeOrder,\n onChange,\n sortKinds,\n testIdPrefix,\n}: SortTabProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n const [ascLabel, descLabel] = directionLabels(sortKinds?.[activeField]);\n return (\n <Box sx={{ p: 1 }}>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, color: \"text.secondary\" }}>\n {copy.display.direction}\n </Box>\n </Text>\n <Box sx={{ display: \"flex\", gap: 0.75, mb: 1.5, mt: 0.5 }}>\n {([\"asc\", \"desc\"] as const).map((direction, index) => (\n <Tile\n key={direction}\n active={activeOrder === direction}\n label={index === 0 ? ascLabel : descLabel}\n onClick={() => onChange(activeField || fields[0]?.value || \"\", direction)}\n testId={`${testIdPrefix}-sort-dir-${direction}`}\n >\n {direction === \"asc\" ? (\n <ArrowUpwardRoundedIcon fontSize=\"small\" />\n ) : (\n <ArrowDownwardRoundedIcon fontSize=\"small\" />\n )}\n </Tile>\n ))}\n </Box>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, color: \"text.secondary\" }}>\n {copy.display.fieldHeading}\n </Box>\n </Text>\n {fields.map((field) => (\n <SortFieldRow\n key={field.value}\n label={field.label}\n active={field.value === activeField}\n onClick={() => onChange(field.value, activeOrder)}\n testId={`${testIdPrefix}-sort-field-${field.value}`}\n />\n ))}\n </Box>\n );\n}\n\n/** One sort field: a dot and its label, highlighted when it is the active sort. */\nfunction SortFieldRow({\n label,\n active,\n onClick,\n testId,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n testId: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n width: \"100%\",\n px: 1,\n py: 0.75,\n border: 0,\n background: \"none\",\n borderRadius: 1,\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: \"0.8125rem\",\n textAlign: \"left\",\n fontWeight: active ? 600 : 400,\n color: active ? \"primary.main\" : \"text.primary\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n }}\n >\n <Box\n component=\"span\"\n sx={{ height: 6, width: 6, borderRadius: \"50%\", bgcolor: active ? \"primary.main\" : \"action.disabled\" }}\n />\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0 }}>\n {label}\n </Box>\n </Box>\n );\n}\n\n/* ── Exibição ────────────────────────────────────────────────────────────── */\n\n\n/**\n * What density MEANS in each layout — same three values, three different\n * questions. A table's is how tall its rows are, a card grid's is how many fit\n * on a line, and a board's is how wide its columns are. The heading and the\n * tile labels change with the layout because \"Alta\" over a board is meaningless\n * where \"Larga\" is not.\n */\n\n\n/** The density tiles, phrased for whichever layout is on screen. */\nfunction densityTiles(\n layout: DataViewsLayout,\n copy: DataViewsCopy,\n): { value: DataViewsDensity; label: string; gap: number; columns: number }[] {\n // A layout the pack does not key falls back to the table's words rather\n // than rendering three blank tiles — a host adding a layout should still see\n // a usable control while it writes the labels for it.\n const labels = copy.display.densityLabels[layout] ?? copy.display.densityLabels.table;\n return [\n { value: \"compact\", label: labels?.compact ?? \"compact\", gap: 2, columns: 4 },\n { value: \"cozy\", label: labels?.cozy ?? \"cozy\", gap: 5, columns: 3 },\n { value: \"comfortable\", label: labels?.comfortable ?? \"comfortable\", gap: 8, columns: 2 },\n ];\n}\n\n/** The preview for one density tile, in the terms that layout's density is in. */\nfunction densityGlyph(\n layout: DataViewsLayout,\n tile: { gap: number; columns: number },\n active: boolean,\n): React.JSX.Element {\n if (layout === \"cards\") return <GridGlyph n={tile.columns} active={active} />;\n // A wider column means FEWER of them across the same board, so the\n // comfortable end draws two fat columns and the compact end four thin ones.\n if (layout === \"board\") return <ColumnsGlyph n={tile.columns} active={active} />;\n return <RowsGlyph gap={tile.gap} active={active} />;\n}\n\n/** The glyph for a layout tile. */\nfunction layoutGlyph(layout: DataViewsLayout, active: boolean): React.JSX.Element {\n if (layout === \"table\") return <TableGlyph active={active} />;\n if (layout === \"list\") return <ListGlyph active={active} />;\n if (layout === \"cards\") return <GridGlyph active={active} />;\n return <BoardGlyph active={active} />;\n}\n\nconst LAYOUT_TILE_LABELS: Record<DataViewsLayout, string> = {\n table: \"Tabela\",\n list: \"Lista\",\n cards: \"Grade\",\n board: \"Quadro\",\n};\n\n/**\n * Format and density, both shown as PREVIEWS rather than words — see\n * `data-views-glyphs.tsx` for why. A layout this table cannot render is simply\n * not offered, and the panel says why rather than leaving a gap.\n */\n/**\n * The three density tiles — or, on a phone, a line saying why there are none:\n * the card grid is `1fr` there, so all three would draw one card per row. Says\n * so rather than vanishing, for the same reason as the board note below it.\n */\nfunction DensityTiles({ testIdPrefix }: { testIdPrefix: string }): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { layout, density, setDensity } = useDataViewsLayout();\n // Matches the card grid's own `xs: \"1fr\"` track, so the control and the thing\n // it controls agree on where density stops meaning anything.\n const isOneColumn = useMediaQuery((t: Theme) => t.breakpoints.down(\"sm\"));\n if (layout === \"cards\" && isOneColumn) {\n return (\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, pt: 0.5, display: \"block\", color: \"text.disabled\" }}>\n {copy.display.densityUnavailableNarrow}\n </Box>\n </Text>\n );\n }\n return (\n <Box sx={{ display: \"grid\", gridTemplateColumns: \"repeat(3, 1fr)\", gap: 0.75, mt: 0.5 }}>\n {densityTiles(layout, copy).map((tile) => (\n <Tile\n key={tile.value}\n active={density === tile.value}\n label={tile.label}\n onClick={() => setDensity(tile.value)}\n testId={`${testIdPrefix}-density-${tile.value}`}\n >\n {densityGlyph(layout, tile, density === tile.value)}\n </Tile>\n ))}\n </Box>\n );\n}\n\nexport function DisplayTab({ testIdPrefix }: { testIdPrefix: string }): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { layout, setLayout, canUseCards, canUseList, canUseBoard } = useDataViewsLayout();\n const available: DataViewsLayout[] = [\n \"table\",\n ...(canUseList ? ([\"list\"] as const) : []),\n ...(canUseCards ? ([\"cards\"] as const) : []),\n ...(canUseBoard ? ([\"board\"] as const) : []),\n ];\n return (\n <Box sx={{ p: 1 }}>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, color: \"text.secondary\" }}>\n {copy.display.formatHeading}\n </Box>\n </Text>\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: available.length > 3 ? \"repeat(2, 1fr)\" : `repeat(${available.length}, 1fr)`,\n gap: 0.75,\n mt: 0.5,\n }}\n >\n {available.map((value) => (\n <Tile\n key={value}\n active={layout === value}\n label={LAYOUT_TILE_LABELS[value]}\n onClick={() => setLayout(value)}\n testId={`${testIdPrefix}-layout-${value}`}\n >\n {layoutGlyph(value, layout === value)}\n </Tile>\n ))}\n </Box>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, py: 1, display: \"block\", color: \"text.disabled\" }}>\n {copy.display.layoutHints[layout]}\n </Box>\n </Text>\n {/* Every layout gets this, the board included. It used to be hidden on\n Quadro, which left the format tile switching to a view with no sizing\n control at all — and the section disappearing on select reads as a\n control that broke rather than one that does not apply. */}\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, color: \"text.secondary\" }}>\n {copy.display.densityHeadings[layout]}\n </Box>\n </Text>\n <DensityTiles testIdPrefix={testIdPrefix} />\n {!canUseBoard && (\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ px: 0.5, pt: 1.25, display: \"block\", color: \"text.disabled\" }}>\n {copy.display.boardUnavailable}\n </Box>\n </Text>\n )}\n </Box>\n );\n}\n","\"use client\";\n\nimport { Box } from \"../../../mui/Box\";\n\n/**\n * Miniature previews of what a layout or a density setting DOES.\n *\n * \"Baixa / Média / Alta\" tells an operator nothing until they try it, and\n * \"Grade\" vs \"Lista\" is only obvious to whoever named them. A glyph that draws\n * three tight rows, or three loose ones, or a grid of blocks, answers the\n * question before the click — so the picker is read once instead of cycled\n * through.\n *\n * Deliberately CSS boxes rather than icons: the point is to show spacing and\n * proportion, which is exactly what an icon font flattens away.\n */\n\n/** The glyph's own footprint, so every tile in a picker lines up. */\nconst FRAME = { width: 32, height: 24, display: \"flex\" } as const;\n\n/** Active tiles use the accent; the rest stay muted so the choice reads at a glance. */\nfunction barColor(active: boolean): string {\n return active ? \"primary.main\" : \"action.disabled\";\n}\n\n/** Three rows at a given gap — the density preview for the table and list. */\nexport function RowsGlyph({ gap, active }: { gap: number; active: boolean }): React.JSX.Element {\n return (\n <Box sx={{ ...FRAME, flexDirection: \"column\", justifyContent: \"center\", gap: `${gap}px` }}>\n {[0, 1, 2].map((index) => (\n <Box key={index} sx={{ height: 2, width: \"100%\", borderRadius: 1, bgcolor: barColor(active) }} />\n ))}\n </Box>\n );\n}\n\n/** A dense block grid — the table layout. */\nexport function TableGlyph({ active }: { active: boolean }): React.JSX.Element {\n return (\n <Box sx={{ ...FRAME, display: \"grid\", gridTemplateColumns: \"repeat(3, 1fr)\", gap: \"2px\" }}>\n {Array.from({ length: 9 }).map((_, index) => (\n <Box\n key={index}\n sx={{ borderRadius: 0.5, bgcolor: barColor(active), opacity: index < 3 ? 1 : 0.55 }}\n />\n ))}\n </Box>\n );\n}\n\n/** Full-width rows each carrying a leading mark — the list layout. */\nexport function ListGlyph({ active }: { active: boolean }): React.JSX.Element {\n return (\n <Box sx={{ ...FRAME, flexDirection: \"column\", justifyContent: \"center\", gap: \"4px\" }}>\n {[0, 1, 2].map((index) => (\n <Box\n key={index}\n sx={{\n height: 5,\n width: \"100%\",\n borderRadius: 0.5,\n bgcolor: barColor(active),\n opacity: 0.7,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Box sx={{ ml: \"2px\", height: 3, width: 3, borderRadius: \"50%\", bgcolor: \"background.paper\" }} />\n </Box>\n ))}\n </Box>\n );\n}\n\n/**\n * A grid of blocks — the cards layout, and ALSO the cards density preview: `n`\n * is how many fit per row, so \"Muitos / Médio / Poucos\" is shown rather than\n * described.\n */\nexport function GridGlyph({ n = 3, active }: { n?: number; active: boolean }): React.JSX.Element {\n return (\n <Box sx={{ ...FRAME, display: \"grid\", gridTemplateColumns: `repeat(${n}, 1fr)`, gap: \"2px\" }}>\n {Array.from({ length: n * 2 }).map((_, index) => (\n <Box key={index} sx={{ borderRadius: 0.5, bgcolor: barColor(active) }} />\n ))}\n </Box>\n );\n}\n\n/**\n * Full-height columns, `n` of them — the board's DENSITY, where fewer, wider\n * columns is the comfortable end. Distinct from {@link BoardGlyph}, which\n * stands for the board format itself and shows cards stacked at differing\n * depths; this one is about the columns' width, so the bars are solid.\n */\nexport function ColumnsGlyph({ n, active }: { n: number; active: boolean }): React.JSX.Element {\n return (\n <Box sx={{ ...FRAME, gap: \"2px\" }}>\n {Array.from({ length: n }).map((_, column) => (\n <Box key={column} sx={{ flex: 1, borderRadius: 0.5, bgcolor: barColor(active) }} />\n ))}\n </Box>\n );\n}\n\n/** Three columns of decreasing height — the board. */\nexport function BoardGlyph({ active }: { active: boolean }): React.JSX.Element {\n return (\n <Box sx={{ ...FRAME, gap: \"2px\" }}>\n {[3, 2, 1].map((count, column) => (\n <Box key={column} sx={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: \"2px\" }}>\n {Array.from({ length: count }).map((_, index) => (\n <Box key={index} sx={{ height: 5, borderRadius: 0.5, bgcolor: barColor(active) }} />\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n","\"use client\";\n\nimport DownloadRoundedIcon from \"@mui/icons-material/DownloadRounded\";\nimport KeyboardArrowDownRoundedIcon from \"@mui/icons-material/KeyboardArrowDownRounded\";\nimport { CircularProgress, Popover } from \"@mui/material\";\nimport { useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { DataViewQuery } from \"./data-views-types\";\n\n/**\n * EXPORT — the current QUERY, never the rendered page.\n *\n * Exporting what happens to be on screen is the single most common bug in an\n * admin table: the operator filtered 214 records, sees 25, exports, and gets\n * 25 — with nothing anywhere saying so. So this control does not touch the\n * loaded rows at all. It hands the host the same `DataViewQuery` the grid is\n * showing, unpaginated, and the HOST re-queries the backend — the same\n * division as everywhere else here: the component emits, the host fetches.\n *\n * The menu states the number it is about to export before the click, so the\n * two possible answers (the selection, or the whole filtered set) are never a\n * guess.\n */\n\n/** What a host can be asked to produce. */\nexport type DataViewExportFormat = \"xlsx\" | \"csv\" | \"json\";\n\n/** The request handed to the host when the operator picks a format. */\nexport interface DataViewExportRequest {\n format: DataViewExportFormat;\n /**\n * The live query with `page: 1` and `pageSize` set to the whole matched\n * total — i.e. \"everything this filter selects\", not this page.\n */\n query: DataViewQuery;\n /**\n * The selected row ids, when the operator has a selection. The host filters\n * the re-queried rows to these; absent means the whole filtered set.\n */\n selectedIds?: Array<string | number>;\n /** The visible columns, in the operator's current order. */\n columns: { id: string; label: string }[];\n}\n\n/** Injected export. Absent ⇒ no Exportar control, exactly like `renderCard`. */\nexport interface DataViewExport {\n /** Runs the export. Awaited, so the trigger can show it is working. */\n onExport: (request: DataViewExportRequest) => Promise<void> | void;\n /** Formats to offer, in menu order. Defaults to all three. */\n formats?: DataViewExportFormat[];\n}\n\n/** One line per format: what it is, and when to reach for it. */\n\nconst ALL_FORMATS: DataViewExportFormat[] = [\"xlsx\", \"csv\", \"json\"];\n\ninterface ExportMenuProps {\n config: DataViewExport;\n /** The live query — copied and unpaginated before it reaches the host. */\n query: DataViewQuery;\n /** The unpaginated total, so the label can state what \"tudo\" means. */\n totalCount: number;\n selectedIds: Array<string | number>;\n columns: { id: string; label: string }[];\n testIdPrefix: string;\n /** Render icon-only (measured upstream). */\n compact?: boolean;\n}\n\n/** \"Exportando 214 itens filtrados\" / \"3 itens selecionados\" — never a guess. */\nfunction scopeLabel(selected: number, total: number): string {\n if (selected > 0) {\n return `${selected} ${selected === 1 ? \"item selecionado\" : \"itens selecionados\"}`;\n }\n return `${total} ${total === 1 ? \"item filtrado\" : \"itens filtrados\"}`;\n}\n\n/** The trigger. Shows a spinner while the host's export is still running. */\nfunction ExportTrigger({\n busy,\n onOpen,\n testIdPrefix,\n compact,\n}: {\n busy: boolean;\n onOpen: (anchor: HTMLElement) => void;\n testIdPrefix: string;\n /** Icon only — step 2 of the toolbar's degradation ladder. */\n compact?: boolean;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n color=\"neutral\"\n disabled={busy}\n onClick={(event) => onOpen(event.currentTarget as HTMLElement)}\n dataTestId={`${testIdPrefix}-export-trigger`}\n aria-label={copy.export.trigger}\n // The label is gone, so the tooltip is the only thing naming the control.\n title={compact ? copy.export.trigger : undefined}\n >\n <Box component=\"span\" sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.5 }}>\n {busy ? <CircularProgress size={14} /> : <DownloadRoundedIcon fontSize=\"small\" />}\n {!compact && (\n <Box component=\"span\" sx={{ display: { xs: \"none\", sm: \"inline\" } }}>\n {copy.export.triggerLabel}\n </Box>\n )}\n {/* Dropped with the label — see the note on the Exibir trigger. */}\n {!compact && <KeyboardArrowDownRoundedIcon fontSize=\"small\" />}\n </Box>\n </Button>\n );\n}\n\n/** One format row: what it produces, and when to reach for it. */\nfunction FormatRow({\n format,\n onPick,\n testIdPrefix,\n}: {\n format: DataViewExportFormat;\n onPick: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onPick}\n data-testid={`${testIdPrefix}-export-${format}`}\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n width: \"100%\",\n px: 1.5,\n py: 1,\n border: 0,\n background: \"none\",\n cursor: \"pointer\",\n font: \"inherit\",\n textAlign: \"left\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n }}\n >\n <Box component=\"span\" sx={{ fontSize: \"0.8125rem\" }}>\n {copy.export.formats[format]?.label ?? format}\n </Box>\n <Box component=\"span\" sx={{ fontSize: \"0.6875rem\", color: \"text.disabled\" }}>\n {copy.export.formats[format]?.hint ?? \"\"}\n </Box>\n </Box>\n );\n}\n\n/** The panel: what is about to be exported, then the formats. */\nfunction ExportPanel({\n formats,\n selectedCount,\n totalCount,\n columnCount,\n onPick,\n testIdPrefix,\n}: {\n formats: DataViewExportFormat[];\n selectedCount: number;\n totalCount: number;\n columnCount: number;\n onPick: (format: DataViewExportFormat) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box data-testid={`${testIdPrefix}-export-panel`}>\n <Box sx={{ px: 1.5, pt: 1, pb: 1, borderBottom: 1, borderColor: \"divider\" }}>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" data-testid={`${testIdPrefix}-export-scope`}>\n Exportando {scopeLabel(selectedCount, totalCount)}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ color: \"text.disabled\" }}>\n {copy.export.visibleColumns(columnCount)}\n </Box>\n </Text>\n </Box>\n {formats.map((format) => (\n <FormatRow\n key={format}\n format={format}\n onPick={() => onPick(format)}\n testIdPrefix={testIdPrefix}\n />\n ))}\n </Box>\n );\n}\n\n/** The toolbar's Exportar control. Renders nothing when no host wired it. */\nexport function DataViewsExportMenu({\n config,\n query,\n totalCount,\n selectedIds,\n columns,\n testIdPrefix,\n compact,\n}: ExportMenuProps): React.JSX.Element {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const [busy, setBusy] = useState(false);\n\n const run = async (format: DataViewExportFormat): Promise<void> => {\n setAnchor(null);\n setBusy(true);\n try {\n await config.onExport({\n format,\n // UNPAGINATED: page 1 of a page as large as the whole result. The host\n // re-queries with this; nothing here reads the loaded rows.\n query: { ...query, page: 1, pageSize: Math.max(1, totalCount) },\n selectedIds: selectedIds.length > 0 ? [...selectedIds] : undefined,\n columns,\n });\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <>\n <ExportTrigger busy={busy} onOpen={setAnchor} testIdPrefix={testIdPrefix} compact={compact} />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n slotProps={{ paper: { sx: { width: 260, maxWidth: \"calc(100vw - 32px)\" } } }}\n >\n <ExportPanel\n formats={config.formats ?? ALL_FORMATS}\n selectedCount={selectedIds.length}\n totalCount={totalCount}\n columnCount={columns.length}\n onPick={(format) => void run(format)}\n testIdPrefix={testIdPrefix}\n />\n </Popover>\n </>\n );\n}\n","\"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 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 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 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","\"use client\";\n\nimport FilterAltOffRoundedIcon from \"@mui/icons-material/FilterAltOffRounded\";\nimport InboxRoundedIcon from \"@mui/icons-material/InboxRounded\";\n\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/**\n * TWO EMPTY STATES, NOT ONE.\n *\n * \"Nenhum pagamento registrado\" under an active filter is a lie, and it is the\n * expensive kind: the operator reads it as \"this store has no payments\" and\n * goes looking for the bug somewhere else. The page's own empty copy answers\n * \"there is nothing here yet\"; it cannot answer \"nothing matches what you\n * typed\", because it does not know what was typed.\n *\n * So the grid renders the FILTERED variant itself — it is the only party that\n * knows a filter is applied — and defers to the host's `emptyState` only when\n * the list is genuinely empty. The filtered one carries the way out, which is\n * the whole point: the fix is one click, and it is right there.\n */\nexport function DataViewsEmpty({\n filtered,\n onClearFilters,\n emptyState,\n testIdPrefix,\n}: {\n /** Is anything narrowing the list right now (search, pills or ranges)? */\n filtered: boolean;\n onClearFilters: () => void;\n /** The page's own copy for a genuinely empty list. */\n emptyState?: React.ReactNode;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const Icon = filtered ? FilterAltOffRoundedIcon : InboxRoundedIcon;\n return (\n <Box\n data-testid={`${testIdPrefix}-empty${filtered ? \"-filtered\" : \"\"}`}\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n textAlign: \"center\",\n py: 8,\n px: 2,\n }}\n >\n <Box\n sx={{\n display: \"inline-flex\",\n p: 2,\n mb: 1.5,\n borderRadius: \"50%\",\n bgcolor: \"action.hover\",\n color: \"text.disabled\",\n }}\n >\n <Icon />\n </Box>\n {filtered ? (\n <>\n <Text variant=\"body\" as=\"p\">\n <Box component=\"span\" sx={{ fontWeight: 600 }}>\n {copy.grid.emptyFilteredTitle}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ display: \"block\", mt: 0.5, mb: 2, color: \"text.secondary\", maxWidth: 380 }}>\n {copy.grid.emptyFilteredHint}\n </Box>\n </Text>\n <Button\n variant=\"outline\"\n size=\"sm\"\n color=\"secondary\"\n onClick={onClearFilters}\n dataTestId={`${testIdPrefix}-empty-clear`}\n >\n {copy.grid.emptyFilteredAction}\n </Button>\n </>\n ) : (\n // The page's own words for \"nothing here yet\" — it knows what the\n // entity is and how one comes to exist; this component does not.\n emptyState\n )}\n </Box>\n );\n}\n","\"use client\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { Pagination } from \"../../navigation/Pagination\";\n\nimport type { DataViewsController } from \"./use-data-views-state\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\n\n/**\n * The server-mode pagination control rendered beneath the grid — shown only\n * when the table is backend-driven and there is more than one page. Client-mode\n * tables render every matched row at once, so they never show it (FUT-180).\n */\nexport function DataViewsPagination<T extends Record<string, unknown>>({\n c,\n testIdPrefix,\n}: {\n c: DataViewsController<T>;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (!c.serverMode || c.serverPageCount <= 1) return null;\n return (\n <Box sx={{ mt: 2, display: \"flex\", justifyContent: \"center\" }}>\n <Pagination\n pageSizeLabel={copy.nav.pageSize}\n page={c.serverPage}\n count={c.serverPageCount}\n onChange={(_event, page) => c.changePage(page)}\n dataTestId={`${testIdPrefix}-pagination`}\n />\n </Box>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Box } from \"../../../mui/Box\";\n\n/**\n * SCOPES — a page-level partition rendered as a strip of tabs under the toolbar.\n *\n * A scope is not a filter. Filters NARROW within the current partition and are\n * multi-select by design; a scope PARTITIONS and is exclusive. The distinction\n * is load-bearing for three reasons, and each is why `FilterFieldConfig` could\n * not express these tabs:\n *\n * 1. They are mutually exclusive, and a pill is not.\n * 2. They carry counts of the WHOLE query, which no client can compute under\n * pagination — the count has to come off the response\n * ({@link DataViewServer.scopeCounts}).\n * 3. They compose with the filters instead of competing with them: the scope\n * picks the bucket, the pills narrow inside it.\n *\n * The `predicate` is deliberately opaque to this package. Only the host knows\n * what \"recusados\" selects; the component's whole job is to say WHICH scope is\n * active and let the server answer.\n */\nexport interface ScopeConfig {\n /** Stable id — travels in `DataViewQuery.scope` and in a saved view's state. */\n id: string;\n label: string;\n /**\n * Opaque payload the SERVER interprets. Omitted on the \"all\" scope. Never read\n * by this package: a scope is applied at the backend, never in the browser.\n */\n predicate?: unknown;\n}\n\n/**\n * The active scope id, resolved against what the table currently declares.\n *\n * Resolution happens at READ time, on purpose. A saved view is written once and\n * read many times, and the declared scopes change underneath it — a scope\n * removed after a view was saved must fall back at render rather than break the\n * view or, worse, emit a scope the backend rejects. Resolving on write would\n * bake the mistake in.\n *\n * Returns `undefined` when the table declares no scopes, which is what keeps\n * `scope` out of the emitted query entirely for every table that never opted in.\n */\nexport function resolveScope(scopes: ScopeConfig[], stored: string | undefined): string | undefined {\n if (scopes.length === 0) return undefined;\n const declared = stored !== undefined && scopes.some((scope) => scope.id === stored);\n return declared ? stored : scopes[0]?.id;\n}\n\n/** Are we running outside production? Config mistakes fail loudly only here. */\nfunction isDevelopment(): boolean {\n return typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\";\n}\n\n/**\n * Reject a table that partitions by a field AND declares a filter pill over the\n * same field. Two controls over one field is how a tab and a pill end up\n * contradicting each other — the pill says \"estado ∈ {pago, recusado}\" while the\n * tab says \"estado = recusado\", and nothing in either control can show the user\n * which one the server honoured.\n *\n * Throws in DEVELOPMENT ONLY. A thrown config error in production is strictly\n * worse than a duplicated control: the duplicate is confusing, the throw is a\n * blank page. Fail where it is seen and fixed.\n *\n * `scopeFieldId` is the field the scopes partition by, when the host knows it.\n * Absent, the scope IDS are checked against the field ids — which catches the\n * common shape where the scope ids ARE the field's values (`pago`, `recusado`)\n * declared a second time as a pill.\n */\nexport function assertNoScopePillOverlap(\n scopes: ScopeConfig[],\n fieldIds: string[],\n scopeFieldId?: string,\n): void {\n if (scopes.length === 0 || !isDevelopment()) return;\n const clash = scopeFieldId !== undefined && fieldIds.includes(scopeFieldId) ? scopeFieldId : undefined;\n if (clash === undefined) return;\n throw new Error(\n `DataViews: the field \"${clash}\" is both the scope partition (scopes: ` +\n `${scopes.map((scope) => scope.id).join(\", \")}) and a filter field (fields: ` +\n `${fieldIds.join(\", \")}). A field may drive the scope tabs or a filter pill, not both — ` +\n `drop one of the two declarations.`,\n );\n}\n\n/**\n * A development-only warning that scopes need server wiring. Scopes are resolved\n * and emitted, never applied in the browser: filtering locally would make the\n * counts, the \"N de N\" counter and the rendered rows disagree the moment a\n * second page exists.\n */\nexport function warnScopesNeedServer(scopes: ScopeConfig[], hasServer: boolean): void {\n if (scopes.length === 0 || hasServer || !isDevelopment()) return;\n // eslint-disable-next-line no-console -- a config warning has no other channel.\n console.warn(\n \"DataViews: `scopes` require server mode. The scope is tracked and would be emitted, \" +\n \"but with no `server` there is nothing to emit it to and rows are NOT filtered in the browser. \" +\n \"Supply `server` (see DataViewServer) or drop the scopes.\",\n );\n}\n\n/**\n * The scope configuration's setup-time checks, run once per configuration rather\n * than per render: reject a field that is both a scope partition and a filter\n * pill (development only — see `assertNoScopePillOverlap`), and warn about\n * scopes declared with no server to apply them.\n *\n * In a `useMemo` so a mistake surfaces during the FIRST render, where the stack\n * still points at the table that made it.\n */\nexport function useScopeConfigChecks(\n scopes: ScopeConfig[],\n fieldIds: string[],\n scopeFieldId: string | undefined,\n hasServer: boolean,\n): void {\n useMemo(() => {\n assertNoScopePillOverlap(scopes, fieldIds, scopeFieldId);\n warnScopesNeedServer(scopes, hasServer);\n // Keyed on the ids rather than the arrays: hosts pass inline literals, so the\n // array identity changes every render while the configuration does not.\n }, [scopes, fieldIds.join(\",\"), scopeFieldId, hasServer]);\n}\n\n/** Everything the tab strip needs; `counts` is absent when the server omits it. */\ninterface DataViewsScopeTabsProps {\n scopes: ScopeConfig[];\n /** The RESOLVED active scope id (see {@link resolveScope}). */\n value: string | undefined;\n onChange: (id: string) => void;\n /** Server-supplied per-scope totals. Absent ⇒ tabs render WITHOUT numbers. */\n counts?: Record<string, number>;\n testIdPrefix: string;\n}\n\n/** The accessible name of one tab: its label, plus its count when there is one. */\nfunction tabLabel(label: string, count: number | undefined): string {\n return count === undefined ? label : `${label}, ${count}`;\n}\n\n/**\n * Move focus + selection between tabs with the arrow keys, wrapping at both\n * ends. Selection FOLLOWS focus here (an \"automatic activation\" tab list): each\n * arrow press is one scope change, which is one query — the same cost as a\n * click, and it keeps the strip's behaviour identical whichever input the\n * operator uses.\n */\nfunction arrowTarget(key: string, index: number, total: number): number | null {\n if (key === \"ArrowRight\") return (index + 1) % total;\n if (key === \"ArrowLeft\") return (index - 1 + total) % total;\n if (key === \"Home\") return 0;\n if (key === \"End\") return total - 1;\n return null;\n}\n\n/** The active tab's own scroll-into-view, so a deep link to a late scope lands visible. */\nfunction useScrollActiveIntoView(value: string | undefined): React.RefObject<HTMLDivElement | null> {\n const stripRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n const strip = stripRef.current;\n if (!strip || value === undefined) return;\n const active = strip.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]');\n // jsdom implements neither, so guard rather than assume the DOM is a browser's.\n active?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n }, [value]);\n return stripRef;\n}\n\n/** One tab's visual + a11y state, kept out of the strip's map for readability. */\nfunction scopeTabSx(active: boolean): Record<string, unknown> {\n return {\n // A 44px min target: the strip is the first thing a thumb reaches on a phone.\n minHeight: 44,\n px: 1.5,\n py: 1,\n border: 0,\n borderBottom: 2,\n borderStyle: \"solid\",\n borderColor: active ? \"primary.main\" : \"transparent\",\n background: \"none\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n font: \"inherit\",\n fontSize: \"0.8125rem\",\n fontWeight: active ? 600 : 400,\n color: active ? \"primary.main\" : \"text.secondary\",\n \"&:hover\": { color: active ? \"primary.main\" : \"text.primary\" },\n \"&:focus-visible\": { outline: \"2px solid\", outlineColor: \"primary.main\", outlineOffset: -2 },\n };\n}\n\n/** The count badge. Rendered only when the server actually supplied a number. */\nfunction ScopeCount({\n count,\n active,\n testId,\n}: {\n count: number;\n active: boolean;\n testId: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"span\"\n // The number is already in the tab's `aria-label`; announcing it twice\n // would read \"Recusados 2, 2\".\n aria-hidden=\"true\"\n data-testid={testId}\n sx={{\n ml: 0.75,\n px: 0.75,\n borderRadius: 5,\n fontSize: \"0.6875rem\",\n fontWeight: 600,\n bgcolor: active ? \"primary.main\" : \"action.selected\",\n color: active ? \"primary.contrastText\" : \"text.secondary\",\n }}\n >\n {count}\n </Box>\n );\n}\n\ninterface ScopeTabProps {\n scope: ScopeConfig;\n index: number;\n total: number;\n active: boolean;\n count: number | undefined;\n onChange: (id: string) => void;\n /**\n * Move to the tab at `index`: focus it AND select it. Only the strip knows\n * the other scopes and owns the DOM, so the move belongs to it.\n */\n moveTo: (index: number) => void;\n testIdPrefix: string;\n}\n\n/** One tab: a real `<button role=\"tab\">` with a roving tabindex and arrow keys. */\nfunction ScopeTab({\n scope,\n index,\n total,\n active,\n count,\n onChange,\n moveTo,\n testIdPrefix,\n}: ScopeTabProps): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n role=\"tab\"\n id={`${testIdPrefix}-scope-tab-${scope.id}`}\n aria-selected={active}\n // Roving tabindex: one tab stop for the whole strip, arrows move within it.\n tabIndex={active ? 0 : -1}\n aria-label={tabLabel(scope.label, count)}\n data-testid={`${testIdPrefix}-scope-${scope.id}`}\n onClick={() => onChange(scope.id)}\n onKeyDown={(event: React.KeyboardEvent<HTMLButtonElement>) => {\n const target = arrowTarget(event.key, index, total);\n if (target === null) return;\n event.preventDefault();\n moveTo(target);\n }}\n sx={scopeTabSx(active)}\n >\n {scope.label}\n {count !== undefined && (\n <ScopeCount\n count={count}\n active={active}\n testId={`${testIdPrefix}-scope-count-${scope.id}`}\n />\n )}\n </Box>\n );\n}\n\n/** The strip's own layout: one non-wrapping row that scrolls horizontally. */\nconst STRIP_SX = {\n display: \"flex\",\n alignItems: \"stretch\",\n gap: 0.5,\n // One row that scrolls — never wraps, never collapses into a select.\n flexWrap: \"nowrap\",\n overflowX: \"auto\",\n overflowY: \"hidden\",\n scrollbarWidth: \"thin\",\n borderBottom: 1,\n borderColor: \"divider\",\n mx: { xs: -2, md: -3 },\n px: { xs: 2, md: 3 },\n} as const;\n\n/**\n * The scope strip: a horizontally scrolling tab list under the toolbar.\n *\n * It SCROLLS rather than collapsing into a select on a narrow screen, which is\n * the opposite of what the filter pills do — and deliberately. The counts are\n * the reason the tabs exist at all; burying them behind a menu costs a tap per\n * glance, exactly on the device where glancing is the point.\n *\n * Counts render verbatim from `counts` — never derived from the loaded page, and\n * never invented when the key is missing. A missing count means \"the server did\n * not say\", which reads honestly as no badge at all.\n */\nexport function DataViewsScopeTabs({\n scopes,\n value,\n onChange,\n counts,\n testIdPrefix,\n}: DataViewsScopeTabsProps): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n const stripRef = useScrollActiveIntoView(value);\n const moveTo = (index: number): void => {\n // Focus FIRST, then select: the roving tabindex follows the selection, so\n // focusing afterwards would land on a tab that has given up its tab stop.\n stripRef.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')?.[index]?.focus();\n const next = scopes[index];\n if (next) onChange(next.id);\n };\n // Reserve NO vertical space when there is nothing to show: a page that\n // declares no scopes must not gain an empty row.\n if (scopes.length === 0) return null;\n const activeIndex = Math.max(\n 0,\n scopes.findIndex((scope) => scope.id === value),\n );\n\n return (\n <Box ref={stripRef} role=\"tablist\" aria-label={copy.filters.scopesLabel} data-testid={`${testIdPrefix}-scopes`} sx={STRIP_SX}>\n {scopes.map((scope, index) => (\n <ScopeTab\n key={scope.id}\n scope={scope}\n index={index}\n total={scopes.length}\n active={index === activeIndex}\n count={counts?.[scope.id]}\n onChange={onChange}\n moveTo={moveTo}\n testIdPrefix={testIdPrefix}\n />\n ))}\n </Box>\n );\n}\n","\"use client\";\n\n/**\n * WHERE THE SCOPE TABS GO, AND WHEN THEY DO NOT GO THERE AT ALL.\n *\n * Its own module because it is a placement rule rather than a control: the\n * strip itself is `DataViewsScopeTabs`, and this decides whether the grid shows\n * one.\n */\nimport { DataViewsScopeTabs, type ScopeConfig } from \"./data-views-scopes\";\nimport { useDataViewsLayout } from \"./data-views-layout-context\";\n\n/**\n * The scope tabs — BELOW the toolbar, and absent when the board is already\n * showing the same partition.\n *\n * A \"Quadro\" grouped by `situacao` is a column per situação; a scope strip over\n * the same field is a tab per situação. Together they are the same partition\n * offered twice, one of which silently narrows what the other displays —\n * picking the \"Cancelado\" tab leaves a board with one populated column and the\n * rest empty, which reads as data loss rather than as a filter.\n *\n * Only when they partition by the SAME field: a board grouped by one field\n * beside scopes over another are two different cuts, and both belong.\n */\nexport function ScopeTabsSlot({\n scopes,\n scopeFieldId,\n board,\n value,\n onChange,\n counts,\n testIdPrefix,\n}: {\n scopes: ScopeConfig[];\n scopeFieldId?: string;\n board?: { groupBy: string };\n value?: string;\n onChange: (id: string) => void;\n counts?: Record<string, number>;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n const { layout } = useDataViewsLayout();\n const boardOwnsThisPartition =\n layout === \"board\" && Boolean(scopeFieldId) && scopeFieldId === board?.groupBy;\n if (boardOwnsThisPartition) return null;\n // Renders nothing (and reserves nothing) for an empty scope list.\n return (\n <DataViewsScopeTabs\n scopes={scopes}\n value={value}\n onChange={onChange}\n counts={counts}\n testIdPrefix={testIdPrefix}\n />\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { type GridColumn } from \"../DataGrid\";\nimport { type SortFieldDefinition } from \"../../layout/ContentToolbar\";\n\nimport { filterRows } from \"./data-views-filter\";\nimport {\n useColumnsWithActions,\n useRenderedColumns,\n type HideableColumn,\n} from \"./data-views-columns\";\nimport { computeActiveFilterCount, defaultSortFields } from \"./data-views-grid-helpers\";\nimport { resolveScope, useScopeConfigChecks, type ScopeConfig } from \"./data-views-scopes\";\nimport { serverDerived, useServerQuery } from \"./data-views-server-query\";\nimport { useSelection } from \"./data-views-selection\";\nimport {\n emptyViewState,\n type DataViewColumn,\n type DataViewServer,\n type DataViewState,\n type DataViewSyncState,\n type FilterFieldConfig,\n type RangeFieldConfig,\n type DataViewQuery,\n type RangeValue,\n type RowAction,\n} from \"./data-views-types\";\n\nexport type { HideableColumn };\n\n/** Inputs the hook needs to own the view state + derived data. */\ninterface UseDataViewsStateArgs<T extends Record<string, unknown>> {\n rows: T[];\n columns: DataViewColumn<T>[];\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n getRowId: (row: T) => string | number;\n onRowClick?: (row: T) => void;\n appliedState?: DataViewState;\n /**\n * URL-driven controls (search/pills/ranges/sort) that re-apply on reference\n * change while preserving column visibility — see {@link DataViewSyncState}.\n */\n syncState?: DataViewSyncState;\n onStateChange?: (state: DataViewState) => void;\n testIdPrefix: string;\n sortFields?: SortFieldDefinition[];\n rowActions?: RowAction<T>[];\n rowActionsLeading?: (row: T) => React.ReactNode;\n /** Bespoke per-row menu rendered in the actions column instead of the auto kebab. */\n renderRowMenu?: (row: T) => React.ReactNode;\n /**\n * When present, the table is BACKEND-driven: `rows` is already the current\n * page (no in-browser filter/sort/paginate), and query changes re-fetch via\n * `server.onQueryChange`. Omit for the legacy client-side behaviour.\n */\n server?: DataViewServer;\n /**\n * The page-level partition rendered as tabs under the toolbar. Requires server\n * mode: a scope is applied at the BACKEND, never in the browser.\n */\n scopes?: ScopeConfig[];\n /**\n * The row field the scopes partition by, when the host knows it — used only to\n * reject the pill/scope clash at setup. See `assertNoScopePillOverlap`.\n */\n scopeFieldId?: string;\n}\n\n/** Everything the DataViewsGrid render needs; keeps the component itself thin. */\nexport interface DataViewsController<T extends Record<string, unknown>> {\n state: DataViewState;\n ranges: Record<string, RangeValue>;\n patch: (next: Partial<DataViewState>) => void;\n matched: T[];\n gridColumns: GridColumn<T>[];\n /** Columns eligible for the show/hide menu (hideable, with a text header). */\n hideableColumns: HideableColumn[];\n /** Every column id in reading order — what the Colunas tab reorders. */\n columnOrder: string[];\n /** Toggle one column's visibility in the current view state. */\n toggleColumn: (id: string, visible: boolean) => void;\n selectedIds: Set<string | number>;\n setSelectedIds: (ids: Set<string | number>) => void;\n /**\n * Add/remove ONE id from the selection. The card and board bodies both need\n * it, so it lives here rather than being written out twice at the call sites —\n * one selection model, one toggle, identical in every layout.\n */\n toggleId: (id: string | number) => void;\n selectedRows: T[];\n clearSelection: () => void;\n selectAll: () => void;\n filterOpen: boolean;\n setFilterOpen: (open: boolean) => void;\n resolvedSortFields: SortFieldDefinition[];\n activeSortField: string;\n activeSortOrder: \"asc\" | \"desc\";\n activeFilterCount: number;\n /** True when the table is backend-driven (server mode). */\n serverMode: boolean;\n /** Server-mode pagination: 1-based current page (1 when client mode). */\n serverPage: number;\n /** Server-mode pagination: total pages (1 when client mode). */\n serverPageCount: number;\n /** Server-mode: total matched rows across all pages (drives the counter). */\n serverTotalCount: number;\n /** Server-mode: request a specific 1-based page (re-fetches via onQueryChange). */\n changePage: (page: number) => void;\n /**\n * The active scope id, RESOLVED against the declared scopes (see\n * `resolveScope`). `undefined` when the table declares none — which is what\n * keeps `scope` out of the emitted query for every table that never opted in.\n */\n scope: string | undefined;\n /** Select a scope: re-fetches from page 1 and drops the selection. */\n setScope: (id: string) => void;\n /**\n * The query the grid is currently showing. Read by Export, which hands it\n * back to the host UNPAGINATED — so an export follows the filters rather\n * than the 25 rows that happen to be loaded.\n */\n currentQuery: DataViewQuery;\n /**\n * Server-supplied per-scope totals, passed through verbatim, or `undefined`\n * when the server omits them. NEVER falls back to counting `matched`: a count\n * off the loaded page is wrong under pagination, which is the bug scopes fix.\n */\n scopeCounts?: Record<string, number>;\n}\n\n/**\n * The rows to render: in server mode `rows` is already the current page (the\n * backend filtered/sorted/paginated), so it passes through untouched; otherwise\n * the client search/pill/range filter narrows it.\n */\nfunction useMatchedRows<T extends Record<string, unknown>>(\n server: DataViewServer | undefined,\n rows: T[],\n columns: DataViewColumn<T>[],\n fields: FilterFieldConfig<T>[],\n rangeFields: RangeFieldConfig<T>[],\n state: DataViewState,\n): T[] {\n return useMemo(\n () =>\n server\n ? rows\n : filterRows(\n rows,\n columns,\n fields,\n { search: state.search, pills: state.pills, ranges: state.ranges },\n rangeFields,\n ),\n [server, rows, columns, fields, rangeFields, state.search, state.pills, state.ranges],\n );\n}\n\n/** Add or remove one column id from the visible-columns list. */\nfunction nextVisibleColumns(current: string[], id: string, visible: boolean): string[] {\n const without = current.filter((colId) => colId !== id);\n return visible ? [...without, id] : without;\n}\n\n/**\n * Reconcile external state changes and surface every change to the caller:\n * - `appliedState` (a saved view) fully REPLACES the state — it is columns-\n * authoritative, so applying a view restores its filters, sort AND columns.\n * - `syncState` (URL-driven controls) MERGES over the current state, leaving\n * `visibleColumns` untouched — so browser back/forward or a same-route\n * deep-link re-applies search/pills/sort without wiping a user's hidden columns.\n * Each channel only fires when its own reference changes (after the first run).\n */\nfunction useStateSyncEffects(\n appliedState: DataViewState | undefined,\n syncState: DataViewSyncState | undefined,\n state: DataViewState,\n onStateChange: ((state: DataViewState) => void) | undefined,\n setState: React.Dispatch<React.SetStateAction<DataViewState>>,\n): void {\n const firstApplied = useRef(true);\n useEffect(() => {\n if (firstApplied.current) {\n firstApplied.current = false;\n return;\n }\n if (appliedState) setState(appliedState);\n // `setState` is a stable useState setter (passed in), included to satisfy\n // exhaustive-deps; the effect still only re-applies when `appliedState` changes.\n }, [appliedState, setState]);\n const firstSync = useRef(true);\n useEffect(() => {\n if (firstSync.current) {\n firstSync.current = false;\n return;\n }\n // Merge — keep the current `visibleColumns` (never URL-carried); only the\n // URL-driven controls change.\n if (syncState) setState((prev) => ({ ...prev, ...syncState }));\n }, [syncState, setState]);\n useEffect(() => {\n onStateChange?.(state);\n }, [state, onStateChange]);\n}\n\n/**\n * The seed view state: a saved view (`appliedState`) or a pristine all-columns\n * one, with the URL-driven controls (`syncState`) merged over it so a deep-linked\n * filter or scope is reflected on the FIRST render. Column visibility is never\n * URL-carried, so the merge cannot wipe it.\n */\nfunction seedState(\n appliedState: DataViewState | undefined,\n syncState: DataViewSyncState | undefined,\n allColumnIds: string[],\n): DataViewState {\n const seed = appliedState ?? emptyViewState(allColumnIds);\n return syncState ? { ...seed, ...syncState } : seed;\n}\n\n/**\n * Selecting a scope: record it, then DROP the selection.\n *\n * A scope change renders a different result set. A selection that survived it\n * would let a bulk action run against rows the user can no longer see — the\n * same reason changing any other part of the query clears it.\n */\nfunction makeSetScope(\n patch: (next: Partial<DataViewState>) => void,\n clearSelection: () => void,\n): (id: string) => void {\n return (id) => {\n patch({ scope: id });\n clearSelection();\n };\n}\n\n/**\n * The declared column ids in the stored reading order — the same tolerance\n * `applyOrder` uses, so the Colunas tab lists exactly what the grid renders.\n */\nfunction orderedColumnIds(allColumnIds: string[], order: string[] | undefined): string[] {\n if (!order || order.length === 0) return allColumnIds;\n const declared = new Set(allColumnIds);\n const kept = order.filter((id) => declared.has(id));\n const seen = new Set(kept);\n return [...kept, ...allColumnIds.filter((id) => !seen.has(id))];\n}\n\n/**\n * The query the grid is currently SHOWING — the same shape `onQueryChange`\n * emits, kept as a value so a host control (Exportar) can re-run it against the\n * backend rather than reading the loaded rows.\n */\nfunction liveQuery(\n state: DataViewState,\n scope: string | undefined,\n server: DataViewServer | undefined,\n matchedCount: number,\n): DataViewQuery {\n return {\n search: state.search,\n pills: state.pills,\n ranges: state.ranges ?? {},\n sortBy: state.sortBy,\n // Absent, not undefined, when the table declares no scopes.\n ...(scope !== undefined ? { scope } : {}),\n page: server?.page ?? 1,\n // Client mode has one page, and it is everything that matched.\n pageSize: server?.pageSize ?? matchedCount,\n };\n}\n\n/** The toolbar's active sort, read off the state's FIRST sort entry. */\nfunction activeSortOf(\n state: DataViewState,\n resolvedSortFields: SortFieldDefinition[],\n): { activeSortField: string; activeSortOrder: \"asc\" | \"desc\" } {\n const active = state.sortBy?.[0];\n return {\n activeSortField: active?.id ?? resolvedSortFields[0]?.value ?? \"\",\n activeSortOrder: active?.dir === \"desc\" ? \"desc\" : \"asc\",\n };\n}\n\n/**\n * Owns the DataViews view state (search/pills/ranges/sort/visibleColumns),\n * multi-select, the filter-panel toggle, and every derived value (filtered rows,\n * grid columns, active sort/filter counts). Extracted from the component so the\n * render stays within the size/complexity budget.\n */\nexport function useDataViewsState<T extends Record<string, unknown>>({\n rows,\n columns,\n fields,\n rangeFields,\n getRowId,\n onRowClick,\n appliedState,\n syncState,\n onStateChange,\n testIdPrefix,\n sortFields,\n rowActions,\n rowActionsLeading,\n renderRowMenu,\n server,\n scopes = [],\n scopeFieldId,\n}: UseDataViewsStateArgs<T>): DataViewsController<T> {\n useScopeConfigChecks(scopes, fields.map((field) => field.id), scopeFieldId, server !== undefined);\n const { columnsWithActions, allColumnIds } = useColumnsWithActions(columns, {\n rowActions,\n rowActionsLeading,\n renderRowMenu,\n testIdPrefix,\n getRowId,\n });\n // Seed once — see {@link seedState}.\n const [state, setState] = useState<DataViewState>(() =>\n seedState(appliedState, syncState, allColumnIds),\n );\n const [filterOpen, setFilterOpen] = useState(false);\n\n useStateSyncEffects(appliedState, syncState, state, onStateChange, setState);\n\n const patch = (next: Partial<DataViewState>): void => setState((prev) => ({ ...prev, ...next }));\n const matched = useMatchedRows(server, rows, columns, fields, rangeFields, state);\n // Resolved at READ time, every render: a stale deep link or a saved view naming\n // a scope that has since been removed falls back to the first declared scope\n // instead of putting an id the backend rejects on the wire.\n const scope = resolveScope(scopes, state.scope);\n // Server mode: re-fetch on query change (page resets to 1) + drive pagination.\n const { changePage } = useServerQuery(server, state, scope);\n const { gridColumns, hideableColumns } = useRenderedColumns(\n columnsWithActions,\n state.visibleColumns,\n onRowClick,\n state.order,\n );\n const toggleColumn = (id: string, visible: boolean): void =>\n setState((prev) => ({ ...prev, visibleColumns: nextVisibleColumns(prev.visibleColumns, id, visible) }));\n const selection = useSelection(matched, getRowId);\n const resolvedSortFields = sortFields ?? defaultSortFields(columns);\n\n return {\n state,\n ranges: state.ranges ?? {},\n patch,\n matched,\n gridColumns,\n hideableColumns,\n columnOrder: orderedColumnIds(allColumnIds, state.order),\n toggleColumn,\n ...selection,\n filterOpen,\n setFilterOpen,\n resolvedSortFields,\n ...activeSortOf(state, resolvedSortFields),\n activeFilterCount: computeActiveFilterCount(state, fields, rangeFields),\n ...serverDerived(server, matched.length),\n changePage,\n scope,\n setScope: makeSetScope(patch, selection.clearSelection),\n currentQuery: liveQuery(state, scope, server, matched.length),\n // Verbatim, or absent. See DataViewServer.scopeCounts for why there is no\n // client-side fallback.\n scopeCounts: server?.scopeCounts,\n };\n}\n","import type { GridColumn } from \"../DataGrid\";\n\nimport type {\n DataViewColumn,\n FilterFieldConfig,\n RangeFieldConfig,\n RangeValue,\n} from \"./data-views-types\";\n\n/**\n * Pure filtering for the DataViews table (FUT-88) — kept out of the component so\n * the search + pill semantics are unit-testable in isolation. The grid does its\n * own sorting + column hiding; this narrows the row set (and drives the \"showing\n * X of Y\" counter), so all filtering lives here in one place.\n */\n\n/** Resolve a column's raw value for a row (function accessor, key, or id fallback). */\nfunction resolveColumnValue<T extends Record<string, unknown>>(\n row: T,\n col: Pick<GridColumn<T>, \"accessor\" | \"id\">,\n): unknown {\n const { accessor, id } = col;\n if (typeof accessor === \"function\") return accessor(row);\n if (accessor) return row[accessor];\n return row[id as keyof T];\n}\n\nfunction matchesSearch<T extends Record<string, unknown>>(\n row: T,\n searchableColumns: DataViewColumn<T>[],\n term: string,\n): boolean {\n if (!term) return true;\n const q = term.trim().toLowerCase();\n if (!q) return true;\n return searchableColumns.some((col) => {\n const value = resolveColumnValue(row, col);\n return value != null && String(value).toLowerCase().includes(q);\n });\n}\n\nfunction matchesPills<T extends Record<string, unknown>>(\n row: T,\n fields: FilterFieldConfig<T>[],\n pills: Record<string, string[]>,\n): boolean {\n return fields.every((field) => {\n const selected = pills[field.id];\n if (!selected || selected.length === 0) return true;\n const raw = field.accessor ? field.accessor(row) : row[field.id];\n const values = Array.isArray(raw) ? raw.map((v) => String(v)) : [String(raw ?? \"\")];\n return values.some((value) => selected.includes(value));\n });\n}\n\n/**\n * Is this range an active filter? A missing range, one with no bounds, or an\n * inverted one (max < min, which is invalid) is inactive — an inactive range\n * never filters anything out; the UI surfaces the inverted case as an error.\n */\nfunction isRangeActive(range: RangeValue | undefined): range is RangeValue {\n if (!range || (range.min == null && range.max == null)) return false;\n if (range.min != null && range.max != null) {\n const order = compareBounds(range.max, range.min);\n if (order !== null && order < 0) return false;\n }\n return true;\n}\n\n/**\n * Order two bounds of the SAME range. A field's bounds are always one kind —\n * both numbers, or both `AAAA-MM-DD` days, which sort correctly as strings.\n * Mixed kinds are not comparable and return null, which every caller reads as\n * \"this bound constrains nothing\" rather than silently ordering them wrong.\n */\nfunction compareBounds(a: number | string, b: number | string): number | null {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"string\" && typeof b === \"string\") return a < b ? -1 : a > b ? 1 : 0;\n return null;\n}\n\n/**\n * Is `value` on the allowed side of ONE bound? `direction` is +1 for a lower\n * bound (value must be at or above it) and -1 for an upper one. An absent bound\n * constrains nothing; an incomparable pair excludes the row rather than\n * quietly admitting it.\n */\nfunction withinBound(\n value: number | string,\n bound: number | string | undefined,\n direction: 1 | -1,\n): boolean {\n if (bound == null) return true;\n const order = compareBounds(value, bound);\n return order !== null && order * direction >= 0;\n}\n\n/** Does one value satisfy a single (possibly one-sided) range? */\nfunction rangeAllows(\n range: RangeValue | undefined,\n value: number | string | null | undefined,\n): boolean {\n if (!isRangeActive(range)) return true;\n // A row without a comparable value can't satisfy a bounded range.\n if (value == null || (typeof value === \"number\" && Number.isNaN(value))) return false;\n return withinBound(value, range.min, 1) && withinBound(value, range.max, -1);\n}\n\n/** Does the row fall within every bounded range? */\nfunction matchesRanges<T extends Record<string, unknown>>(\n row: T,\n rangeFields: RangeFieldConfig<T>[],\n ranges: Record<string, RangeValue>,\n): boolean {\n return rangeFields.every((field) => rangeAllows(ranges[field.id], field.accessor(row)));\n}\n\n/**\n * The rows matching the current search + pill selections + numeric ranges\n * (order unchanged). `rangeFields` is optional so existing multi-select-only\n * tables call this unchanged.\n */\nexport function filterRows<T extends Record<string, unknown>>(\n rows: T[],\n columns: DataViewColumn<T>[],\n fields: FilterFieldConfig<T>[],\n criteria: { search: string; pills: Record<string, string[]>; ranges?: Record<string, RangeValue> },\n rangeFields: RangeFieldConfig<T>[] = [],\n): T[] {\n const searchable = columns.filter((col) => col.searchable);\n const ranges = criteria.ranges ?? {};\n return rows.filter(\n (row) =>\n matchesSearch(row, searchable, criteria.search) &&\n matchesPills(row, fields, criteria.pills) &&\n matchesRanges(row, rangeFields, ranges),\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { type GridColumn } from \"../DataGrid\";\n\nimport {\n buildGridColumns,\n buildRowActionsColumn,\n isActionsColumn,\n} from \"./data-views-grid-helpers\";\nimport type { DataViewColumn, RowAction } from \"./data-views-types\";\n\n/**\n * Every column derivation the DataViews grid needs, in one place: the auto kebab\n * actions column, the id list that seeds a pristine view state, what the grid\n * actually renders once visibility is applied, and the show/hide menu's list.\n */\n\n/** A column the user may show/hide via the toolbar's ColumnsMenu. */\nexport interface HideableColumn {\n id: string;\n label: string;\n}\n\n/**\n * The columns the user may show/hide: explicitly hideable (not `hideable:false`,\n * which marks structural columns like the image thumbnail or actions kebab) and\n * carrying a text header to label the checkbox.\n */\nfunction computeHideableColumns<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n): HideableColumn[] {\n return columns\n .filter((col) => col.hideable !== false && typeof col.header === \"string\" && col.header !== \"\")\n .map((col) => ({ id: col.id, label: col.header as string }));\n}\n\n/**\n * Append the auto kebab actions column unless the page already defines one. The\n * column is added when there are `rowActions` OR a bespoke `renderRowMenu` (an\n * entity's self-contained menu that owns its own popups).\n */\nfunction appendActionsColumn<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n opts: {\n rowActions?: RowAction<T>[];\n rowActionsLeading?: (row: T) => React.ReactNode;\n renderRowMenu?: (row: T) => React.ReactNode;\n testIdPrefix: string;\n getRowId: (row: T) => string | number;\n },\n): DataViewColumn<T>[] {\n const { rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId } = opts;\n if ((!rowActions && !renderRowMenu) || columns.some(isActionsColumn)) return columns;\n return [\n ...columns,\n buildRowActionsColumn({\n rowActions: rowActions ?? [],\n leading: rowActionsLeading,\n testIdPrefix,\n getRowId,\n renderRowMenu,\n }),\n ];\n}\n\n/** Options {@link appendActionsColumn} needs to build the auto kebab column. */\ntype ActionsColumnOpts<T extends Record<string, unknown>> = {\n rowActions?: RowAction<T>[];\n rowActionsLeading?: (row: T) => React.ReactNode;\n renderRowMenu?: (row: T) => React.ReactNode;\n testIdPrefix: string;\n getRowId: (row: T) => string | number;\n};\n\n/**\n * The declared columns plus the auto kebab column (unless the page defines its\n * own), and every column id — which is what seeds a pristine view state's\n * `visibleColumns`, so it is derived BEFORE the state exists.\n */\nexport function useColumnsWithActions<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n opts: ActionsColumnOpts<T>,\n): { columnsWithActions: DataViewColumn<T>[]; allColumnIds: string[] } {\n const { rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId } = opts;\n const columnsWithActions = useMemo(\n () =>\n appendActionsColumn(columns, { rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId }),\n [columns, rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId],\n );\n const allColumnIds = useMemo(() => columnsWithActions.map((col) => col.id), [columnsWithActions]);\n return { columnsWithActions, allColumnIds };\n}\n\n/**\n * Apply a stored column ORDER, tolerantly.\n *\n * A stored list goes stale in both directions and neither may lose a column: an\n * id the table no longer declares is dropped, and a column the table declares\n * but the list never mentioned (added since the view was saved) falls in AFTER\n * the ordered ones rather than vanishing. Absent order ⇒ declaration order.\n */\nfunction applyOrder<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n order: string[] | undefined,\n): DataViewColumn<T>[] {\n if (!order || order.length === 0) return columns;\n const byId = new Map(columns.map((column) => [column.id, column]));\n const ordered = order.map((id) => byId.get(id)).filter((c): c is DataViewColumn<T> => Boolean(c));\n const seen = new Set(ordered.map((column) => column.id));\n return [...ordered, ...columns.filter((column) => !seen.has(column.id))];\n}\n\n/** What the grid actually renders: order + visibility applied, plus the menu's list. */\nexport function useRenderedColumns<T extends Record<string, unknown>>(\n columnsWithActions: DataViewColumn<T>[],\n visibleColumns: string[],\n onRowClick: ((row: T) => void) | undefined,\n order?: string[],\n): { gridColumns: GridColumn<T>[]; hideableColumns: HideableColumn[] } {\n const gridColumns = useMemo(\n () => buildGridColumns(applyOrder(columnsWithActions, order), visibleColumns, onRowClick),\n [columnsWithActions, onRowClick, visibleColumns, order],\n );\n const hideableColumns = useMemo(() => computeHideableColumns(columnsWithActions), [columnsWithActions]);\n return { gridColumns, hideableColumns };\n}\n\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\nimport type { DataViewServer, DataViewState } from \"./data-views-types\";\n\n/**\n * Server-mode wiring extracted from {@link useDataViewsState} (keeps it within\n * the size/complexity budget): re-fetch on every effective-query change (page\n * resets to 1) and expose `changePage` for the pagination control. Read the\n * latest `state`/`server` at fire time so an inline `server` object per render\n * doesn't loop the effect.\n */\nexport function useServerQuery(\n server: DataViewServer | undefined,\n state: DataViewState,\n scope: string | undefined,\n): {\n changePage: (page: number) => void;\n} {\n const emit = (page: number): void => {\n if (!server) return;\n server.onQueryChange({\n search: state.search,\n pills: state.pills,\n ranges: state.ranges ?? {},\n sortBy: state.sortBy,\n // Spread rather than `scope: scope`: a table declaring no scopes must emit\n // a query with NO `scope` key at all, not one present-and-undefined that\n // every host would then have to know to ignore.\n ...(scope !== undefined ? { scope } : {}),\n page,\n pageSize: server.pageSize,\n });\n };\n const queryKey = server\n ? JSON.stringify({\n q: state.search,\n pills: state.pills,\n ranges: state.ranges ?? {},\n sort: state.sortBy,\n // The RESOLVED scope, so a deep link naming a removed scope re-fetches\n // once for the fallback rather than looping on the stored id.\n scope,\n })\n : \"\";\n const firstQuery = useRef(true);\n useEffect(() => {\n if (!server) return;\n if (firstQuery.current) {\n firstQuery.current = false;\n return;\n }\n emit(1);\n // Emit only when the query key changes; `emit` reads fresh state at fire time.\n }, [queryKey]);\n return { changePage: (page: number) => emit(page) };\n}\n\n/** The controller's server-mode derived fields (or client-mode defaults). */\nexport function serverDerived(\n server: DataViewServer | undefined,\n fallbackCount: number,\n): { serverMode: boolean; serverPage: number; serverPageCount: number; serverTotalCount: number } {\n if (!server) {\n return { serverMode: false, serverPage: 1, serverPageCount: 1, serverTotalCount: fallbackCount };\n }\n return {\n serverMode: true,\n serverPage: server.page,\n serverPageCount: Math.max(1, Math.ceil(server.totalCount / server.pageSize)),\n serverTotalCount: server.totalCount,\n };\n}\n\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\n\n/** The multi-select model, identical in every layout (table, cards, board). */\ninterface DataViewsSelection<T> {\n selectedIds: Set<string | number>;\n setSelectedIds: (ids: Set<string | number>) => void;\n /** Add/remove ONE id — what a card's or board card's checkbox calls. */\n toggleId: (id: string | number) => void;\n /** The selected rows, narrowed to what is currently rendered. */\n selectedRows: T[];\n clearSelection: () => void;\n selectAll: () => void;\n}\n\n/**\n * Owns the DataViews selection. ONE set of ids across every layout, so switching\n * from the board to the table (or to the cards) keeps exactly the same rows\n * selected and offers exactly the same bulk actions.\n *\n * Extracted from {@link useDataViewsState} for that hook's size budget, and\n * because `toggleId` needs a functional update: two cards toggled in the same\n * tick would otherwise both read the pre-render set and the second would drop\n * the first's change.\n */\nexport function useSelection<T>(\n matched: T[],\n getRowId: (row: T) => string | number,\n): DataViewsSelection<T> {\n const [selectedIds, setSelectedIds] = useState<Set<string | number>>(new Set());\n const selectedRows = useMemo(\n () => matched.filter((row) => selectedIds.has(getRowId(row))),\n [matched, selectedIds, getRowId],\n );\n return {\n selectedIds,\n setSelectedIds,\n toggleId: (id) =>\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n }),\n selectedRows,\n clearSelection: () => setSelectedIds(new Set()),\n selectAll: () => setSelectedIds(new Set(matched.map((row) => getRowId(row)))),\n };\n}\n","\"use client\";\n\nimport type { SortFieldDefinition } from \"../../layout/ContentToolbar\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { DataViewsGrid } from \"./DataViewsGrid\";\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 { 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 /** 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 \"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","import type { DataViewState, RangeValue } from \"./data-views-types\";\n\n/**\n * A comparable key for a view state — the answer to \"has anything changed?\".\n *\n * `JSON.stringify(state)` is not that answer. Clearing a filter does not remove\n * its entry, it leaves an EMPTY one (`pills: { pagamento: [] }`), and an emptied\n * range leaves `{}` behind; both stringify differently from the state that never\n * had them, so a filter applied and then removed left the view reading \"unsaved\n * changes\" over a state identical to the one it started from. The only way back\n * was \"Redefinir\", which is the operator undoing something they had already\n * undone.\n *\n * So: drop what is empty, sort what is unordered, and keep what actually\n * distinguishes one view from another.\n */\n\n/** Is this range bounded at either end? An empty one is not a constraint. */\nfunction isSet(range: RangeValue | undefined): boolean {\n return Boolean(range && (range.min !== undefined || range.max !== undefined));\n}\n\n/** Selected values, sorted — picking A then B is the same view as B then A. */\nfunction normalizePills(pills: Record<string, string[]> | undefined): Record<string, string[]> {\n const out: Record<string, string[]> = {};\n for (const key of Object.keys(pills ?? {}).sort()) {\n const values = pills?.[key];\n if (values && values.length > 0) out[key] = [...values].sort();\n }\n return out;\n}\n\nfunction normalizeRanges(\n ranges: Record<string, RangeValue> | undefined,\n): Record<string, RangeValue> {\n const out: Record<string, RangeValue> = {};\n for (const key of Object.keys(ranges ?? {}).sort()) {\n const range = ranges?.[key];\n if (isSet(range)) out[key] = range as RangeValue;\n }\n return out;\n}\n\n/**\n * Everything a saved view stores, in a stable shape.\n *\n * `visibleColumns` is SORTED — it is a set, and its array order carries no\n * meaning (reading order lives in `order`). `order` is not sorted, for the\n * opposite reason.\n */\nexport function viewStateKey(state: DataViewState): string {\n return JSON.stringify({\n search: state.search.trim(),\n pills: normalizePills(state.pills),\n ranges: normalizeRanges(state.ranges),\n sortBy: state.sortBy ?? [],\n visibleColumns: [...(state.visibleColumns ?? [])].sort(),\n order: state.order ?? null,\n scope: state.scope ?? null,\n layout: state.layout ?? null,\n });\n}\n","\"use client\";\n\n/**\n * The confirmation in front of \"Excluir visão\".\n *\n * Deleting was immediate: one click in a row menu, on a control sitting\n * directly under four harmless toggles, and the view was gone. A saved view is\n * somebody's filters, columns and sort — cheap to rebuild only if you remember\n * what they were.\n *\n * It names the view rather than saying \"this view\", says plainly that the\n * records are untouched, and warns separately when the view is SHARED, because\n * that deletion takes it from everyone rather than from one person.\n */\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Dialog, DialogContent } from \"../../feedback/Dialog\";\nimport { Button } from \"../../form/Button\";\nimport { Stack } from \"../../../mui/Stack\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { SavedViewSummary } from \"./data-views-types\";\n\nexport function DeleteViewDialog({\n view,\n onClose,\n onConfirm,\n /** What this table holds, for the \"your records are safe\" line. */\n entityLabel = \"Os registros\",\n testIdPrefix = \"view\",\n}: {\n view: SavedViewSummary | null;\n onClose: () => void;\n onConfirm: (view: SavedViewSummary) => void;\n entityLabel?: string;\n testIdPrefix?: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (!view) return null;\n return (\n <Dialog\n open\n onClose={onClose}\n title={copy.deleteView.title}\n size=\"sm\"\n showCloseButton\n dataTestId={`${testIdPrefix}-delete-modal`}\n >\n <DialogContent>\n <Stack spacing={1.5}>\n <Text variant=\"body\" as=\"p\" data-testid={`${testIdPrefix}-delete-target`}>\n {copy.deleteView.target(view.name)}\n </Text>\n\n {view.shared && (\n <Text variant=\"body\" color=\"warning\" as=\"p\" data-testid={`${testIdPrefix}-delete-shared`}>\n {copy.deleteView.sharedWarning}\n </Text>\n )}\n\n <Text variant=\"body\" color=\"secondary\" as=\"p\">\n {copy.deleteView.rowsUnaffected(entityLabel)}\n </Text>\n\n <Stack direction=\"row\" spacing={1.5} sx={{ justifyContent: \"flex-end\", pt: 0.5 }}>\n <Button\n variant=\"text\"\n color=\"neutral\"\n onClick={onClose}\n dataTestId={`${testIdPrefix}-delete-cancel`}\n >\n {copy.deleteView.cancel}\n </Button>\n <Button\n color=\"danger\"\n onClick={() => onConfirm(view)}\n dataTestId={`${testIdPrefix}-delete-confirm`}\n >\n {copy.deleteView.confirm}\n </Button>\n </Stack>\n </Stack>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport type { ConfirmActionCopy } from \"../../../copy\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { createConfirmButton } from \"../../feedback/ConfirmAction\";\nimport { Dialog, DialogContent } from \"../../feedback/Dialog\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Stack } from \"../../../mui/Stack\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { SavedViewSummary } from \"./data-views-types\";\n\ninterface ManageViewsDialogProps {\n /** The confirm dialog's words. REQUIRED — this package ships no default copy. */\n confirmCopy: ConfirmActionCopy;\n open: boolean;\n onClose: () => void;\n views: SavedViewSummary[];\n onEdit: (view: SavedViewSummary) => void;\n onDelete: (view: SavedViewSummary) => void;\n testIdPrefix?: string;\n}\n\nfunction tags(view: SavedViewSummary): string[] {\n const copy = useDataViewsCopy();\n const list: string[] = [];\n if (view.isDefault) list.push(copy.manageViews.defaultTag);\n if (view.pinned) list.push(\"Fixada\");\n if (view.shared) list.push(\"Compartilhada\");\n if (!view.isOwner) list.push(copy.manageViews.otherUserTag);\n return list;\n}\n\n/**\n * \"Gerenciar visões\" dialog (FUT-89): lists every view the user can see with its\n * flags, and owner-only edit/delete. Non-owned shared views are listed read-only.\n */\n/** One saved view: its name/description/tags, and the owner-only actions. */\nfunction ManageViewRow({\n view,\n onEdit,\n onDelete,\n testIdPrefix,\n confirmCopy,\n}: {\n view: SavedViewSummary;\n onEdit: (view: SavedViewSummary) => void;\n onDelete: (view: SavedViewSummary) => void;\n testIdPrefix: string;\n confirmCopy: ConfirmActionCopy;\n}): React.JSX.Element {\n const ConfirmButton = useMemo(\n () => createConfirmButton(confirmCopy, confirmCopy.defaultError),\n [confirmCopy],\n );\n const copy = useDataViewsCopy();\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: \"center\", justifyContent: \"space-between\" }}\n data-testid={`${testIdPrefix}-manage-row-${view.id}`}\n >\n <Box sx={{ minWidth: 0 }}>\n <Text variant=\"body\" size=\"sm\" as=\"span\" weight=\"semibold\">\n {view.name}\n </Text>\n {view.description && (\n <Text variant=\"caption\" as=\"p\" color=\"secondary\">\n {view.description}\n </Text>\n )}\n {tags(view).length > 0 && (\n <Text variant=\"caption\" as=\"p\" color=\"secondary\">\n {tags(view).join(\" · \")}\n </Text>\n )}\n </Box>\n {view.isOwner && (\n <Stack direction=\"row\" spacing={1} sx={{ flex: \"0 0 auto\" }}>\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() => onEdit(view)}\n dataTestId={`${testIdPrefix}-manage-edit-${view.id}`}\n >\n {copy.manageViews.edit}\n </Button>\n {/* Confirm-gated (FUT-546): a saved view is a filter set somebody\n built by hand, and there is no undo behind this. */}\n <ConfirmButton\n variant=\"text\"\n size=\"sm\"\n color=\"danger\"\n onClick={() => onDelete(view)}\n confirm={{\n title: copy.manageViews.deleteTitle,\n entityName: view.name,\n description:\n copy.manageViews.deleteBody,\n confirmText: copy.manageViews.deleteConfirm,\n }}\n dataTestId={`${testIdPrefix}-manage-delete-${view.id}`}\n >\n {copy.manageViews.deleteConfirm}\n </ConfirmButton>\n </Stack>\n )}\n </Stack>\n );\n}\n\nexport function ManageViewsDialog({\n open,\n onClose,\n views,\n onEdit,\n onDelete,\n testIdPrefix = \"views\",\n confirmCopy,\n}: ManageViewsDialogProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={copy.manageViews.title}\n size=\"md\"\n showCloseButton\n dataTestId={`${testIdPrefix}-manage-dialog`}\n >\n <DialogContent>\n <Stack spacing={1.5} data-testid={`${testIdPrefix}-manage-list`}>\n {views.length === 0 ? (\n <Text variant=\"body\" as=\"p\">\n {copy.manageViews.empty}\n </Text>\n ) : (\n views.map((view) => (\n <ManageViewRow confirmCopy={confirmCopy}\n key={view.id}\n view={view}\n onEdit={onEdit}\n onDelete={onDelete}\n testIdPrefix={testIdPrefix}\n />\n ))\n )}\n </Stack>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\";\n\nimport GroupOutlinedIcon from \"@mui/icons-material/GroupOutlined\";\nimport PushPinOutlinedIcon from \"@mui/icons-material/PushPinOutlined\";\nimport StarOutlineRoundedIcon from \"@mui/icons-material/StarOutlineRounded\";\nimport { useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Dialog, DialogContent } from \"../../feedback/Dialog\";\nimport { Button } from \"../../form/Button\";\nimport { Input } from \"../../form/Input\";\nimport { Switch } from \"../../form/Switch\";\nimport { Box } from \"../../../mui/Box\";\nimport { Stack } from \"../../../mui/Stack\";\nimport { Text } from \"../../typography/Text\";\n\nimport { describeViewState } from \"./data-views-preview\";\nimport { PreviewBox } from \"./save-view-preview\";\nimport type {\n DataViewColumn,\n DataViewState,\n FilterFieldConfig,\n SavedViewSummary,\n} from \"./data-views-types\";\n\n/** The values the modal collects (the current view state is captured by the parent). */\nexport interface SaveViewPayload {\n name: string;\n description: string;\n shared: boolean;\n pinned: boolean;\n isDefault: boolean;\n}\n\ninterface SaveViewModalProps<T extends Record<string, unknown>> {\n open: boolean;\n onClose: () => void;\n /** The state being saved (drives the preview). */\n currentState: DataViewState;\n fields: FilterFieldConfig<T>[];\n columns: DataViewColumn<T>[];\n /** When set, the modal edits this view (seeds the form + becomes \"Salvar alterações\"). */\n editing?: SavedViewSummary | null;\n onSave: (payload: SaveViewPayload) => Promise<void> | void;\n testIdPrefix?: string;\n}\n\ninterface FlagsSwitchesProps {\n pinned: boolean;\n shared: boolean;\n isDefault: boolean;\n setPinned: (value: boolean) => void;\n setShared: (value: boolean) => void;\n setIsDefault: (value: boolean) => void;\n testIdPrefix: string;\n}\n\n/**\n * One flag: what it is, and what it DOES. A bare \"Fixar na barra lateral\"\n * beside a switch asks the operator to guess where it appears and to whom —\n * the sentence is the difference between a labelled toggle and an explained one.\n */\nfunction FlagRow({\n icon,\n title,\n description,\n checked,\n onChange,\n testId,\n}: {\n icon: React.ReactNode;\n title: string;\n description: string;\n checked: boolean;\n onChange: (value: boolean) => void;\n testId: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"label\"\n sx={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 1.5,\n px: 1,\n py: 1,\n borderRadius: 1,\n cursor: \"pointer\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n }}\n >\n <Box sx={{ mt: 0.25, color: \"text.disabled\", display: \"flex\" }}>{icon}</Box>\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Text variant=\"body\" as=\"span\">\n <Box component=\"span\" sx={{ display: \"block\", fontSize: \"0.875rem\" }}>\n {title}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ display: \"block\", color: \"text.secondary\", lineHeight: 1.5 }}>\n {description}\n </Box>\n </Text>\n </Box>\n <Switch\n size=\"sm\"\n checked={checked}\n onChange={(_event, value) => onChange(value)}\n dataTestId={testId}\n />\n </Box>\n );\n}\n\nfunction FlagsSwitches({\n pinned,\n shared,\n isDefault,\n setPinned,\n setShared,\n setIsDefault,\n testIdPrefix,\n}: FlagsSwitchesProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Stack spacing={0}>\n <FlagRow\n icon={<PushPinOutlinedIcon fontSize=\"small\" />}\n title={copy.saveView.pinnedTitle}\n description={copy.saveView.pinnedDescription}\n checked={pinned}\n onChange={setPinned}\n testId={`${testIdPrefix}-save-pinned`}\n />\n <FlagRow\n icon={<GroupOutlinedIcon fontSize=\"small\" />}\n title={copy.saveView.sharedTitle}\n description={copy.saveView.sharedDescription}\n checked={shared}\n onChange={setShared}\n testId={`${testIdPrefix}-save-shared`}\n />\n <FlagRow\n icon={<StarOutlineRoundedIcon fontSize=\"small\" />}\n title={copy.saveView.setDefaultTitle}\n description={copy.saveView.setDefaultDescription}\n checked={isDefault}\n onChange={setIsDefault}\n testId={`${testIdPrefix}-save-default`}\n />\n </Stack>\n );\n}\n\ninterface SaveViewFormState {\n name: string;\n description: string;\n pinned: boolean;\n shared: boolean;\n isDefault: boolean;\n canSave: boolean;\n error: string | null;\n setName: (value: string) => void;\n setDescription: (value: string) => void;\n setPinned: (value: boolean) => void;\n setShared: (value: boolean) => void;\n setIsDefault: (value: boolean) => void;\n submit: () => Promise<void>;\n}\n\n/** The initial form values, seeded from an edited view (or blank for create). */\nfunction seedForm(editing: SavedViewSummary | null | undefined): SaveViewPayload {\n if (!editing) {\n return { name: \"\", description: \"\", pinned: false, shared: false, isDefault: false };\n }\n return {\n name: editing.name,\n description: editing.description ?? \"\",\n pinned: editing.pinned,\n shared: editing.shared,\n isDefault: editing.isDefault,\n };\n}\n\n/** Local form state + submit for {@link SaveViewModal}, seeded from an edited view. */\nfunction useSaveViewForm(\n editing: SavedViewSummary | null | undefined,\n onSave: (payload: SaveViewPayload) => Promise<void> | void,\n): SaveViewFormState {\n const copy = useDataViewsCopy();\n const initial = seedForm(editing);\n const [name, setName] = useState(initial.name);\n const [description, setDescription] = useState(initial.description);\n const [pinned, setPinned] = useState(initial.pinned);\n const [shared, setShared] = useState(initial.shared);\n const [isDefault, setIsDefault] = useState(initial.isDefault);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const canSave = name.trim().length > 0 && !saving;\n\n async function submit(): Promise<void> {\n setSaving(true);\n setError(null);\n // A rejected save (e.g. duplicate name) is caught here so the modal stays\n // open and shows the reason; the finally always re-enables the button.\n try {\n await onSave({ name: name.trim(), description: description.trim(), shared, pinned, isDefault });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : copy.saveView.saveFailed);\n } finally {\n setSaving(false);\n }\n }\n\n return {\n name,\n description,\n pinned,\n shared,\n isDefault,\n canSave,\n error,\n setName,\n setDescription,\n setPinned,\n setShared,\n setIsDefault,\n submit,\n };\n}\n\n/**\n * The \"Salvar visão\" modal (FUT-89): captures a name + description and the pin /\n * share / default flags, and previews the filters, visible columns, and sort the\n * view will store. Used for both create and edit.\n */\n/**\n * The dialog's two buttons.\n *\n * Cancel first, primary last: the confirming action sits where the eye lands\n * at the end of the dialog, not before the way out.\n */\nfunction FormFooter({\n editing,\n canSave,\n onSubmit,\n onClose,\n testIdPrefix,\n}: {\n editing: SaveViewModalProps<never>[\"editing\"];\n canSave: boolean;\n onSubmit: () => void;\n onClose: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Stack direction=\"row\" spacing={1.5} sx={{ justifyContent: \"flex-end\" }}>\n <Button variant=\"text\" color=\"neutral\" onClick={onClose} dataTestId={`${testIdPrefix}-save-cancel`}>\n {copy.saveView.cancel}\n </Button>\n <Button onClick={onSubmit} disabled={!canSave} dataTestId={`${testIdPrefix}-save-submit`}>\n {editing ? copy.saveView.submitEditing : copy.saveView.submitCreating}\n </Button>\n </Stack>\n );\n}\n\nexport function SaveViewModal<T extends Record<string, unknown>>({\n open,\n onClose,\n currentState,\n fields,\n columns,\n editing,\n onSave,\n testIdPrefix = \"view\",\n}: SaveViewModalProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const form = useSaveViewForm(editing, onSave);\n const preview = describeViewState(currentState, fields, columns);\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={editing ? copy.saveView.titleEditing : copy.saveView.titleCreating}\n size=\"sm\"\n showCloseButton\n dataTestId={`${testIdPrefix}-save-modal`}\n >\n <DialogContent>\n <Stack spacing={2} data-testid={`${testIdPrefix}-save-form`}>\n <Input\n size=\"sm\"\n fullWidth\n label={copy.saveView.nameLabel}\n placeholder={copy.saveView.namePlaceholder}\n value={form.name}\n onChange={(event) => form.setName(event.target.value)}\n data-testid={`${testIdPrefix}-save-name`}\n />\n <Input\n size=\"sm\"\n fullWidth\n label={copy.saveView.descriptionLabel}\n placeholder={copy.saveView.descriptionPlaceholder}\n value={form.description}\n onChange={(event) => form.setDescription(event.target.value)}\n data-testid={`${testIdPrefix}-save-description`}\n />\n\n <FlagsSwitches\n pinned={form.pinned}\n shared={form.shared}\n isDefault={form.isDefault}\n setPinned={form.setPinned}\n setShared={form.setShared}\n setIsDefault={form.setIsDefault}\n testIdPrefix={testIdPrefix}\n />\n\n <PreviewBox preview={preview} testIdPrefix={testIdPrefix} />\n\n {form.error && (\n <Text variant=\"caption\" color=\"danger\" as=\"p\" data-testid={`${testIdPrefix}-save-error`}>\n {form.error}\n </Text>\n )}\n\n <FormFooter\n editing={editing}\n canSave={form.canSave}\n onSubmit={() => void form.submit()}\n onClose={onClose}\n testIdPrefix={testIdPrefix}\n />\n </Stack>\n </DialogContent>\n </Dialog>\n );\n}\n","import type {\n DataViewColumn,\n DataViewState,\n FilterFieldConfig,\n} from \"./data-views-types\";\n\n/**\n * Human-readable summary of a view state (FUT-89), used by the save-view modal's\n * preview and the manage dialog. Pure + label-driven so it is unit-testable and\n * shared. Returns empty arrays for sections with nothing set.\n */\ninterface ViewStateDescription {\n filters: string[];\n /**\n * The columns this view HIDES, not the ones it shows.\n *\n * A view that hides three of eleven columns listed eight names, which is a\n * wall of text stating the default. What the operator needs to check before\n * saving is what this view CHANGES — and for columns, the change is the\n * hiding.\n */\n columns: string[];\n sort: string[];\n}\n\nfunction columnLabel<T extends Record<string, unknown>>(\n columns: DataViewColumn<T>[],\n id: string,\n): string {\n const col = columns.find((c) => c.id === id);\n if (col && typeof col.header === \"string\" && col.header) return col.header;\n return id;\n}\n\nexport function describeViewState<T extends Record<string, unknown>>(\n state: DataViewState,\n fields: FilterFieldConfig<T>[],\n columns: DataViewColumn<T>[],\n): ViewStateDescription {\n const filters: string[] = [];\n if (state.search.trim()) filters.push(`Busca: \"${state.search.trim()}\"`);\n for (const field of fields) {\n const selected = state.pills[field.id];\n if (!selected || selected.length === 0) continue;\n const labels = selected.map(\n (value) => field.options.find((option) => option.value === value)?.label ?? value,\n );\n filters.push(`${field.label}: ${labels.join(\", \")}`);\n }\n\n const hideable = columns.filter((col) => col.hideable !== false);\n const columnsHidden = hideable\n .filter((col) => !state.visibleColumns.includes(col.id))\n .map((col) => columnLabel(columns, col.id));\n\n const sort = state.sortBy\n .filter((entry) => entry.dir)\n .map((entry) => `${columnLabel(columns, entry.id)} (${entry.dir === \"asc\" ? \"crescente\" : \"decrescente\"})`);\n\n return { filters, columns: columnsHidden, sort };\n}\n","\"use client\";\n\n/**\n * What a saved view actually GUARDS, listed before it is saved.\n *\n * Split out of `SaveViewModal.tsx` when that file crossed the size gate: this\n * is the one self-contained piece of it — a read-only summary of the view\n * state, with no form and no dialog around it.\n */\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Box } from \"../../../mui/Box\";\nimport { Stack } from \"../../../mui/Stack\";\nimport { Text } from \"../../typography/Text\";\n\nexport interface PreviewBoxProps {\n preview: { filters: string[]; columns: string[]; sort: string[] };\n testIdPrefix: string;\n}\n\n/** One \"label — value\" line of the summary. */\nfunction SummaryRow({\n label,\n items,\n testId,\n}: {\n label: string;\n items: string[];\n testId: string;\n}): React.JSX.Element | null {\n if (items.length === 0) return null;\n return (\n <Box sx={{ display: \"flex\", gap: 1.5 }} data-testid={testId}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ width: 116, flexShrink: 0, color: \"text.secondary\" }}>\n {label}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ minWidth: 0, flex: 1 }}>\n {items.join(\", \")}\n </Box>\n </Text>\n </Box>\n );\n}\n\nexport function PreviewBox({ preview, testIdPrefix }: PreviewBoxProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n const empty =\n preview.filters.length === 0 && preview.columns.length === 0 && preview.sort.length === 0;\n return (\n <Box sx={{ p: 1.5, borderRadius: 1.5, bgcolor: \"action.hover\", border: (theme) => `1px solid ${theme.palette.divider}` }}>\n <Text variant=\"caption\" as=\"p\">\n <Box\n component=\"span\"\n sx={{ display: \"block\", mb: 1, textTransform: \"uppercase\", letterSpacing: 0.6, fontWeight: 600, color: \"text.disabled\" }}\n >\n {copy.saveView.previewHeading}\n </Box>\n </Text>\n {empty ? (\n // Saving is still allowed — an operator may be naming the default on\n // purpose — but it should not be a surprise afterwards.\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ color: \"warning.main\", lineHeight: 1.6 }} data-testid={`${testIdPrefix}-preview-empty`}>\n {copy.saveView.previewUnchanged}\n </Box>\n </Text>\n ) : (\n <Stack spacing={0.75}>\n <SummaryRow label={copy.saveView.previewFilters} items={preview.filters} testId={`${testIdPrefix}-preview-filters`} />\n <SummaryRow label={copy.saveView.previewHiddenColumns} items={preview.columns} testId={`${testIdPrefix}-preview-columns`} />\n <SummaryRow label={copy.saveView.sortRowLabel} items={preview.sort} testId={`${testIdPrefix}-preview-sort`} />\n </Stack>\n )}\n </Box>\n );\n}\n","\"use client\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Alert } from \"../Alert\";\nimport { SavedViewsMenu } from \"../../layout/ContentToolbar\";\n\nimport {\n type DataViewColumn,\n type DataViewState,\n type FilterFieldConfig,\n type SavedViewSummary,\n} from \"./data-views-types\";\nimport { ManageViewsDialog } from \"./ManageViewsDialog\";\nimport { SaveViewModal, type SaveViewPayload } from \"./SaveViewModal\";\n\n/**\n * A rejected pin/share/default/delete surfaced inline (FUT-100) — the menus\n * close on click, so this Alert is the only signal that survives the action.\n */\nexport function ViewMutationErrorAlert({\n error,\n onClose,\n testIdPrefix,\n}: {\n error: string | null;\n onClose: () => void;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (!error) {\n return null;\n }\n return (\n <Alert\n variant=\"danger\"\n title={copy.nav.updateFailed}\n description={error}\n closable\n closeLabel={copy.nav.dismissError}\n onClose={onClose}\n data-testid={`${testIdPrefix}-views-mutation-error`}\n />\n );\n}\n\ninterface ViewsMenuSlotProps {\n views: SavedViewSummary[];\n /** Name of the currently-applied view, shown in the trigger instead of \"Visões\". */\n activeViewName?: string;\n applyView: (view: SavedViewSummary) => void;\n /** Reset to the built-in no-filter \"Main vision\" default. */\n selectMain: () => void;\n openCreate: () => void;\n openEdit: (view: SavedViewSummary) => void;\n handleDelete: (view: SavedViewSummary) => void;\n patchView: (\n view: SavedViewSummary,\n changes: Partial<Pick<SavedViewSummary, \"isDefault\" | \"pinned\" | \"shared\">>,\n ) => Promise<void>;\n onManageAll: () => void;\n testIdPrefix: string;\n}\n\n/**\n * The saved-views Connector (FUT-89): binds the backend-backed SavedView state +\n * mutations to the stateless `@12-apps/ui` SavedViewsMenu. All persistence lives here\n * (via the passed handlers); the UI component itself stays data-free.\n */\nexport function ViewsMenuSlot({\n views,\n activeViewName,\n applyView,\n selectMain,\n openCreate,\n openEdit,\n handleDelete,\n patchView,\n onManageAll,\n testIdPrefix,\n}: ViewsMenuSlotProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <SavedViewsMenu<SavedViewSummary>\n labels={copy.savedViewsMenu}\n views={views}\n activeViewName={activeViewName}\n onApply={applyView}\n onSelectMain={selectMain}\n onSaveCurrent={openCreate}\n onEdit={openEdit}\n onDelete={(view) => void handleDelete(view)}\n onSetDefault={(view) => void patchView(view, { isDefault: true })}\n onTogglePin={(view) => void patchView(view, { pinned: !view.pinned })}\n onToggleShare={(view) => void patchView(view, { shared: !view.shared })}\n onManageAll={onManageAll}\n testIdPrefix={`${testIdPrefix}-views`}\n />\n );\n}\n\ninterface ViewDialogsProps<T extends Record<string, unknown>> {\n saveOpen: boolean;\n onCloseSave: () => void;\n currentState: DataViewState;\n fields: FilterFieldConfig<T>[];\n columns: DataViewColumn<T>[];\n editing: SavedViewSummary | null;\n onSave: (payload: SaveViewPayload) => Promise<void>;\n manageOpen: boolean;\n onCloseManage: () => void;\n views: SavedViewSummary[];\n onEditFromManage: (view: SavedViewSummary) => void;\n onDelete: (view: SavedViewSummary) => void;\n testIdPrefix: string;\n}\n\n/** The save-view modal + the manage-views dialog (FUT-89). */\nexport function ViewDialogs<T extends Record<string, unknown>>({\n saveOpen,\n onCloseSave,\n currentState,\n fields,\n columns,\n editing,\n onSave,\n manageOpen,\n onCloseManage,\n views,\n onEditFromManage,\n onDelete,\n testIdPrefix,\n}: ViewDialogsProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <>\n {/* Keyed by the view being edited: the form seeds its fields with\n `useState`, which only runs on MOUNT, so a modal that stayed mounted\n from a previous open reused those values — \"Renomear e editar\" opened\n with an empty Nome once \"Salvar visão\" had been opened first. */}\n <SaveViewModal<T>\n key={editing ? `edit-${editing.id}` : \"create\"}\n open={saveOpen}\n onClose={onCloseSave}\n currentState={currentState}\n fields={fields}\n columns={columns}\n editing={editing}\n onSave={onSave}\n testIdPrefix={`${testIdPrefix}-views`}\n />\n <ManageViewsDialog confirmCopy={copy.confirmAction}\n open={manageOpen}\n onClose={onCloseManage}\n views={views}\n onEdit={onEditFromManage}\n onDelete={onDelete}\n testIdPrefix={`${testIdPrefix}-views`}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { useViewMutations, type ViewMutations } from \"./data-views-view-mutations\";\nimport {\n coerceViewState,\n emptyViewState,\n type DataViewPersistence,\n type DataViewRouter,\n type DataViewState,\n type SavedViewSummary,\n} from \"./data-views-types\";\nimport { type SaveViewPayload } from \"./SaveViewModal\";\n\nexport interface SavedViewsController {\n applied: DataViewState;\n /** Name of the currently-applied saved view, if any (drives the trigger label). */\n activeViewName?: string;\n /** Reset to the built-in no-filter \"Main vision\" default (clears the URL param). */\n selectMain: () => void;\n currentRef: React.MutableRefObject<DataViewState>;\n saveOpen: boolean;\n editing: SavedViewSummary | null;\n manageOpen: boolean;\n setSaveOpen: (open: boolean) => void;\n setEditing: (view: SavedViewSummary | null) => void;\n setManageOpen: (open: boolean) => void;\n applyView: (view: SavedViewSummary) => void;\n openCreate: () => void;\n openEdit: (view: SavedViewSummary) => void;\n /** Close the save modal and clear the editing target. */\n closeSave: () => void;\n /** Close the manage dialog and open the edit modal for `view`. */\n editFromManage: (view: SavedViewSummary) => void;\n patchView: ViewMutations[\"patchView\"];\n handleDelete: ViewMutations[\"handleDelete\"];\n handleSave: (payload: SaveViewPayload) => Promise<void>;\n /** Last pin/share/default/delete failure — shown as an Alert, never silent. */\n mutationError: string | null;\n clearMutationError: () => void;\n}\n\ninterface AppliedView {\n applied: DataViewState;\n currentRef: React.MutableRefObject<DataViewState>;\n activeViewName?: string;\n applyView: (view: SavedViewSummary) => void;\n selectMain: () => void;\n}\n\n/**\n * The applied grid state + which saved view it came from, kept in sync with the\n * URL (`?view=<id>`) so a refresh restores it. \"Main vision\" resets + clears it.\n */\nfunction useAppliedView(\n router: DataViewRouter,\n columnIds: string[],\n views: SavedViewSummary[],\n initialView: SavedViewSummary | undefined,\n initialState: DataViewState | undefined,\n): AppliedView {\n // A saved view wins; otherwise seed from the host-supplied initial state (e.g.\n // filters/sort read off the URL, FUT-180) so a bookmarked filtered URL is\n // reflected in the grid — column visibility isn't URL-carried, so show all.\n const seed = initialView\n ? coerceViewState(initialView.state, columnIds)\n : initialState\n ? { ...initialState, visibleColumns: columnIds }\n : emptyViewState(columnIds);\n const [applied, setApplied] = useState<DataViewState>(seed);\n const [appliedViewId, setAppliedViewId] = useState<string | null>(initialView?.id ?? null);\n const currentRef = useRef<DataViewState>(seed);\n\n const applyView = (view: SavedViewSummary): void => {\n setApplied(coerceViewState(view.state, columnIds));\n setAppliedViewId(view.id);\n router.syncViewParam(view.id);\n };\n const selectMain = (): void => {\n setApplied(emptyViewState(columnIds));\n setAppliedViewId(null);\n router.syncViewParam(null);\n };\n const activeViewName = views.find((view) => view.id === appliedViewId)?.name;\n return { applied, currentRef, activeViewName, applyView, selectMain };\n}\n\n/**\n * Owns the saved-views state + persistence for {@link DataViewsTable}: the applied\n * grid state, the live-state ref, the modal/dialog flags, and the create/edit/\n * delete/patch handlers. Extracted so the component render stays within budget.\n */\nexport function useSavedViewsController(\n persistence: DataViewPersistence,\n router: DataViewRouter,\n columnIds: string[],\n views: SavedViewSummary[],\n initialView: SavedViewSummary | undefined,\n initialState: DataViewState | undefined,\n): SavedViewsController {\n const copy = useDataViewsCopy();\n const { applied, currentRef, activeViewName, applyView, selectMain } =\n useAppliedView(router, columnIds, views, initialView, initialState);\n const [saveOpen, setSaveOpen] = useState(false);\n const [editing, setEditing] = useState<SavedViewSummary | null>(null);\n const [manageOpen, setManageOpen] = useState(false);\n\n const openCreate = (): void => {\n setEditing(null);\n setSaveOpen(true);\n };\n const openEdit = (view: SavedViewSummary): void => {\n setEditing(view);\n setSaveOpen(true);\n };\n\n const [mutationError, setMutationError] = useState<string | null>(null);\n const refreshAfter = (ok: boolean, error?: string): void => {\n if (ok) {\n setMutationError(null);\n router.refresh();\n } else {\n // A rejected pin/share/default/delete must be visible (FUT-100) — the\n // menus close on click, so an inline Alert is the only surviving signal.\n setMutationError(error ?? copy.nav.saveFailed);\n }\n };\n\n const { handleSave: saveView, patchView, handleDelete } = useViewMutations(\n persistence,\n editing,\n currentRef,\n refreshAfter,\n );\n\n const handleSave = async (payload: SaveViewPayload): Promise<void> => {\n await saveView(payload);\n setSaveOpen(false);\n setEditing(null);\n };\n\n return {\n applied,\n activeViewName,\n selectMain,\n currentRef,\n saveOpen,\n editing,\n manageOpen,\n setSaveOpen,\n setEditing,\n setManageOpen,\n applyView,\n openCreate,\n openEdit,\n closeSave: () => {\n setSaveOpen(false);\n setEditing(null);\n },\n editFromManage: (view: SavedViewSummary) => {\n setManageOpen(false);\n openEdit(view);\n },\n patchView,\n handleDelete,\n handleSave,\n mutationError,\n clearMutationError: () => setMutationError(null),\n };\n}\n\n","\"use client\";\n\nimport type { MutableRefObject } from \"react\";\n\nimport type {\n DataViewPersistence,\n DataViewSaveInput,\n DataViewState,\n SavedViewSummary,\n} from \"./data-views-types\";\nimport { type SaveViewPayload } from \"./SaveViewModal\";\n\nexport interface ViewMutations {\n handleSave: (payload: SaveViewPayload) => Promise<void>;\n patchView: (\n view: SavedViewSummary,\n changes: Partial<Pick<SavedViewSummary, \"isDefault\" | \"pinned\" | \"shared\">>,\n ) => Promise<void>;\n handleDelete: (view: SavedViewSummary) => Promise<void>;\n}\n\n/** The SavedView persistence handlers (create/update/delete), via injected `persistence`. */\nexport function useViewMutations(\n persistence: DataViewPersistence,\n editing: SavedViewSummary | null,\n currentRef: MutableRefObject<DataViewState>,\n onDone: (ok: boolean, error?: string) => void,\n): ViewMutations {\n async function handleSave(payload: SaveViewPayload): Promise<void> {\n const state = editing ? editing.state : currentRef.current;\n const input: DataViewSaveInput = {\n name: payload.name,\n description: payload.description,\n state,\n shared: payload.shared,\n pinned: payload.pinned,\n isDefault: payload.isDefault,\n };\n const result = editing ? await persistence.update(editing.id, input) : await persistence.create(input);\n // Fail loudly on a rejected save (e.g. duplicate name) so the modal stays\n // open and shows the error instead of closing as if it succeeded.\n if (!result.ok) throw new Error(result.error);\n onDone(true);\n }\n\n async function patchView(\n view: SavedViewSummary,\n changes: Partial<Pick<SavedViewSummary, \"isDefault\" | \"pinned\" | \"shared\">>,\n ): Promise<void> {\n const next = { ...view, ...changes };\n const result = await persistence.update(view.id, {\n name: next.name,\n description: next.description ?? \"\",\n state: next.state,\n shared: next.shared,\n pinned: next.pinned,\n isDefault: next.isDefault,\n });\n onDone(result.ok, result.ok ? undefined : result.error);\n }\n\n async function handleDelete(view: SavedViewSummary): Promise<void> {\n const result = await persistence.remove(view.id);\n onDone(result.ok, result.ok ? undefined : result.error);\n }\n\n return { handleSave, patchView, handleDelete };\n}\n"],"mappings":"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","names":["createContext","useContext","jsx","jsx","useTheme","createContext","useContext","useState","jsx","jsxs","createContext","isLayout","useState","useContext","createContext","useContext","createContext","useContext","Fragment","jsx","jsxs","createContext","useContext","jsx","createContext","useContext","Fragment","Fragment","jsx","jsxs","useTheme","jsx","Fragment","jsx","jsxs","useEffect","useRef","useEffect","useState","Box","jsx","Box","Button","useState","Box","useEffect","useState","jsx","Box","jsx","Box","Fragment","jsx","jsxs","Box","Button","useState","Fragment","jsx","jsxs","Box","React","jsx","jsxs","jsx","jsxs","Checkbox","jsx","jsxs","Checkbox","Fragment","jsx","jsxs","React","Box","useState","jsx","jsxs","Popover","useState","Checkbox","jsx","jsxs","Checkbox","Fragment","jsx","jsxs","useState","Popover","CloseIcon","IconButton","TextField","useEffect","useState","jsx","jsxs","useState","useEffect","TextField","IconButton","CloseIcon","Fragment","jsx","jsxs","useState","Box","useRef","isRangeSet","isRangeSet","useRef","KeyboardArrowDownRoundedIcon","Popover","useState","Checkbox","useState","jsx","jsxs","useState","Checkbox","IconButton","KeyboardArrowDownRoundedIcon","Fragment","jsx","jsxs","rowSx","IconButton","KeyboardArrowDownRoundedIcon","ArrowDownwardRoundedIcon","ArrowUpwardRoundedIcon","jsx","jsx","jsxs","ArrowUpwardRoundedIcon","ArrowDownwardRoundedIcon","Fragment","jsx","jsxs","KeyboardArrowDownRoundedIcon","useState","Popover","KeyboardArrowDownRoundedIcon","Popover","useState","Fragment","jsx","jsxs","KeyboardArrowDownRoundedIcon","useState","Popover","Fragment","jsx","jsxs","jsx","FilterAltOffRoundedIcon","Fragment","jsx","jsxs","FilterAltOffRoundedIcon","jsx","useEffect","useMemo","useRef","jsx","jsxs","useMemo","useRef","useEffect","jsx","jsx","jsxs","useEffect","useState","useEffect","useMemo","useRef","useState","useMemo","useMemo","useEffect","useRef","useMemo","useState","useMemo","useRef","useEffect","useState","jsx","useRef","useEffect","useEffect","useMemo","useRef","useState","jsx","jsxs","useMemo","jsx","jsxs","useMemo","GroupOutlinedIcon","PushPinOutlinedIcon","StarOutlineRoundedIcon","useState","jsx","jsxs","jsx","jsxs","PushPinOutlinedIcon","GroupOutlinedIcon","StarOutlineRoundedIcon","useState","Fragment","jsx","jsxs","jsxs","Fragment","jsx","useRef","useState","useState","useRef","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}