@12-apps/ui 6.59.0 → 6.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
  2. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  3. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  4. package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
  5. package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -7
  6. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  7. package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
  8. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  9. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +25 -23
  10. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -24
  11. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +6 -4
  12. package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +1 -1
  13. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +7 -5
  14. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +11 -6
  15. package/dist/_internal/components/data-display/DataViews/base-list-card.js +14 -10
  16. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
  17. package/dist/_internal/components/data-display/DataViews/data-views-export.js +1 -1
  18. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +4 -4
  19. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +5 -3
  20. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +20 -18
  21. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +4 -4
  23. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +5 -5
  24. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +3 -3
  25. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
  26. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
  27. package/dist/_internal/components/data-display/DataViews/list-card-breaks.js +12 -0
  28. package/dist/_internal/components/data-display/DataViews/list-card-breaks.js.map +1 -0
  29. package/dist/_internal/components/data-display/DataViews/list-card-cells.js +3 -1
  30. package/dist/_internal/components/data-display/DataViews/list-card-group-tracks.js +14 -0
  31. package/dist/_internal/components/data-display/DataViews/list-card-group-tracks.js.map +1 -0
  32. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +4 -2
  33. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
  34. package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +1 -1
  35. package/dist/_internal/components/data-display/Popover/Popover.js +1 -1
  36. package/dist/_internal/components/data-display/index.js +16 -16
  37. package/dist/_internal/components/index.js +23 -23
  38. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +6 -6
  39. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +9 -9
  40. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +3 -3
  41. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +4 -4
  42. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +5 -5
  43. package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js +4 -4
  44. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +4 -4
  45. package/dist/_internal/components/navigation/index.js +9 -9
  46. package/dist/_internal/en-US.data-display.js +1 -1
  47. package/dist/_internal/pt-BR.data-display.js +1 -1
  48. package/dist/_internal/user-avatar/user-avatar.js +4 -4
  49. package/dist/charts.js +10 -10
  50. package/dist/{chunk-V4V2N6YJ.js → chunk-36RYXV4R.js} +9 -6
  51. package/dist/chunk-36RYXV4R.js.map +1 -0
  52. package/dist/{chunk-W7N4ORCV.js → chunk-3JYCS7VO.js} +5 -5
  53. package/dist/{chunk-YIKFYWKD.js → chunk-46ZATLQV.js} +3 -3
  54. package/dist/{chunk-TF27Z27K.js → chunk-4JZ6XDVA.js} +2 -2
  55. package/dist/{chunk-EDBP62WG.js → chunk-53ACGKBW.js} +3 -3
  56. package/dist/{chunk-ZWBGQYVO.js → chunk-56PBNYXF.js} +8 -6
  57. package/dist/chunk-56PBNYXF.js.map +1 -0
  58. package/dist/{chunk-EWIKSTJV.js → chunk-5WJFCQFN.js} +7 -7
  59. package/dist/{chunk-WBDQSBLV.js → chunk-5XFJCWPY.js} +5 -5
  60. package/dist/{chunk-QKAYXAQE.js → chunk-6FAYTKXW.js} +24 -20
  61. package/dist/chunk-6FAYTKXW.js.map +1 -0
  62. package/dist/{chunk-62E2X66R.js → chunk-72BVL6VF.js} +8 -4
  63. package/dist/{chunk-62E2X66R.js.map → chunk-72BVL6VF.js.map} +1 -1
  64. package/dist/{chunk-HPO7PB4F.js → chunk-7AAJYWC3.js} +2 -2
  65. package/dist/{chunk-XW5SEW3H.js → chunk-AKC5GRJF.js} +2 -2
  66. package/dist/{chunk-NHVL2QPG.js → chunk-D7PVIC33.js} +2 -1
  67. package/dist/chunk-D7PVIC33.js.map +1 -0
  68. package/dist/{chunk-4QKS5Y35.js → chunk-EBSA4EYR.js} +2 -2
  69. package/dist/{chunk-2W2MWEP2.js → chunk-EFLRNSE6.js} +11 -11
  70. package/dist/{chunk-PC4H5LVB.js → chunk-EUPUEMFX.js} +7 -7
  71. package/dist/{chunk-COYGTEN5.js → chunk-F5S5UFGD.js} +8 -1
  72. package/dist/chunk-F5S5UFGD.js.map +1 -0
  73. package/dist/{chunk-4PPNCZWY.js → chunk-GS5EPYB4.js} +3 -3
  74. package/dist/{chunk-JVOEVTCZ.js → chunk-HQCZT6TO.js} +5 -5
  75. package/dist/{chunk-GK7JNSMK.js → chunk-IK2ZVV3M.js} +2 -2
  76. package/dist/{chunk-CMBZ3J6I.js → chunk-JA6GKU65.js} +2 -11
  77. package/dist/chunk-JA6GKU65.js.map +1 -0
  78. package/dist/{chunk-3FMWQQW6.js → chunk-L4Z7B7KL.js} +2 -2
  79. package/dist/{chunk-3K7WN2PO.js → chunk-NBM3YJ4P.js} +3 -3
  80. package/dist/{chunk-CTIMTEH7.js → chunk-NFCAXQ3F.js} +4 -4
  81. package/dist/{chunk-GYDUXL3D.js → chunk-NVXRV3PL.js} +7 -7
  82. package/dist/{chunk-6OSUK2C7.js → chunk-PJ5HXNBG.js} +11 -11
  83. package/dist/{chunk-6OSUK2C7.js.map → chunk-PJ5HXNBG.js.map} +1 -1
  84. package/dist/{chunk-ILNO4ZJ6.js → chunk-PKGBW7KS.js} +2 -2
  85. package/dist/{chunk-NTJUAPJM.js → chunk-PZPTTAO5.js} +7 -7
  86. package/dist/{chunk-HCYRCU4W.js → chunk-QJWIX4YZ.js} +2 -2
  87. package/dist/{chunk-IL4FCC54.js → chunk-RREWYOKS.js} +2 -2
  88. package/dist/{chunk-6D2PFC5C.js → chunk-SKOAJPOS.js} +2 -2
  89. package/dist/{chunk-PIIPEXRM.js → chunk-TVMSXL3R.js} +1 -1
  90. package/dist/chunk-TVMSXL3R.js.map +1 -0
  91. package/dist/chunk-U3HEYECF.js +68 -0
  92. package/dist/chunk-U3HEYECF.js.map +1 -0
  93. package/dist/{chunk-QHP5PZNC.js → chunk-U57NFQYE.js} +2 -1
  94. package/dist/chunk-U57NFQYE.js.map +1 -0
  95. package/dist/{chunk-6QBT5TPS.js → chunk-USZMUOI6.js} +3 -3
  96. package/dist/{chunk-ARJIKW56.js → chunk-UZCQHNXC.js} +2 -2
  97. package/dist/{chunk-ZYJZHXFU.js → chunk-VWW2EXH7.js} +4 -4
  98. package/dist/{chunk-PQ7RWH7L.js → chunk-VZCZAHMX.js} +5 -5
  99. package/dist/{chunk-I3CQBEKS.js → chunk-WF3P7GE5.js} +2 -2
  100. package/dist/{chunk-U47KRLEW.js → chunk-YP7SQ5DM.js} +22 -10
  101. package/dist/chunk-YP7SQ5DM.js.map +1 -0
  102. package/dist/chunk-ZMUXC3VB.js +11 -0
  103. package/dist/chunk-ZMUXC3VB.js.map +1 -0
  104. package/dist/{chunk-HH7PM5HT.js → chunk-ZUQX7XHJ.js} +2 -2
  105. package/dist/data-display/Avatar.js +3 -3
  106. package/dist/data-display/Badge.js +2 -2
  107. package/dist/data-display/CardKit.js +9 -9
  108. package/dist/data-display/Chart.js +10 -10
  109. package/dist/data-display/DataViews.js +38 -36
  110. package/dist/data-display/Popover.js +1 -1
  111. package/dist/en-US.js +1 -1
  112. package/dist/locales.js +2 -2
  113. package/dist/mui/styles.js +2 -1
  114. package/dist/mui/styles.js.map +1 -1
  115. package/dist/navigation/SectionNav.js +9 -9
  116. package/dist/pt-BR.js +1 -1
  117. package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts +9 -3
  118. package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts.map +1 -1
  119. package/dist/types/components/data-display/DataViews/base-list-card-gutters.d.ts +2 -2
  120. package/dist/types/components/data-display/DataViews/base-list-card-gutters.d.ts.map +1 -1
  121. package/dist/types/components/data-display/DataViews/base-list-card-layout.d.ts +1 -0
  122. package/dist/types/components/data-display/DataViews/base-list-card-layout.d.ts.map +1 -1
  123. package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts +1 -10
  124. package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts.map +1 -1
  125. package/dist/types/components/data-display/DataViews/base-list-card.d.ts +1 -1
  126. package/dist/types/components/data-display/DataViews/base-list-card.d.ts.map +1 -1
  127. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +7 -0
  128. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  129. package/dist/types/components/data-display/DataViews/data-views-export.d.ts.map +1 -1
  130. package/dist/types/components/data-display/DataViews/list-card-breaks.d.ts +21 -0
  131. package/dist/types/components/data-display/DataViews/list-card-breaks.d.ts.map +1 -0
  132. package/dist/types/components/data-display/DataViews/list-card-cells.d.ts +8 -0
  133. package/dist/types/components/data-display/DataViews/list-card-cells.d.ts.map +1 -1
  134. package/dist/types/components/data-display/DataViews/list-card-group-tracks.d.ts +51 -0
  135. package/dist/types/components/data-display/DataViews/list-card-group-tracks.d.ts.map +1 -0
  136. package/dist/types/components/data-display/DataViews/list-card-rails.d.ts +33 -13
  137. package/dist/types/components/data-display/DataViews/list-card-rails.d.ts.map +1 -1
  138. package/dist/types/components/data-display/Popover/Popover.d.ts.map +1 -1
  139. package/dist/types/en-US.data-display.d.ts.map +1 -1
  140. package/dist/types/mui/styles.d.ts +1 -1
  141. package/dist/types/mui/styles.d.ts.map +1 -1
  142. package/dist/types/pt-BR.data-display.d.ts.map +1 -1
  143. package/dist/user-avatar.js +4 -4
  144. package/package.json +1 -1
  145. package/src/components/data-display/DataViews/base-list-card-geometry.tsx +22 -8
  146. package/src/components/data-display/DataViews/base-list-card-gutters.tsx +2 -2
  147. package/src/components/data-display/DataViews/base-list-card-layout.tsx +6 -3
  148. package/src/components/data-display/DataViews/base-list-card-slots.tsx +5 -5
  149. package/src/components/data-display/DataViews/base-list-card.tsx +3 -3
  150. package/src/components/data-display/DataViews/data-views-copy.ts +7 -0
  151. package/src/components/data-display/DataViews/data-views-export.tsx +1 -9
  152. package/src/components/data-display/DataViews/list-card-breaks.ts +21 -0
  153. package/src/components/data-display/DataViews/list-card-cells.tsx +16 -0
  154. package/src/components/data-display/DataViews/list-card-group-tracks.tsx +127 -0
  155. package/src/components/data-display/DataViews/list-card-rails.tsx +58 -30
  156. package/src/components/data-display/Popover/Popover.tsx +10 -3
  157. package/src/en-US.data-display.ts +4 -0
  158. package/src/mui/styles.ts +1 -1
  159. package/src/pt-BR.data-display.ts +4 -0
  160. package/dist/chunk-CMBZ3J6I.js.map +0 -1
  161. package/dist/chunk-COYGTEN5.js.map +0 -1
  162. package/dist/chunk-NHVL2QPG.js.map +0 -1
  163. package/dist/chunk-PIIPEXRM.js.map +0 -1
  164. package/dist/chunk-QHP5PZNC.js.map +0 -1
  165. package/dist/chunk-QKAYXAQE.js.map +0 -1
  166. package/dist/chunk-U47KRLEW.js.map +0 -1
  167. package/dist/chunk-V4V2N6YJ.js.map +0 -1
  168. package/dist/chunk-ZWBGQYVO.js.map +0 -1
  169. /package/dist/{chunk-W7N4ORCV.js.map → chunk-3JYCS7VO.js.map} +0 -0
  170. /package/dist/{chunk-YIKFYWKD.js.map → chunk-46ZATLQV.js.map} +0 -0
  171. /package/dist/{chunk-TF27Z27K.js.map → chunk-4JZ6XDVA.js.map} +0 -0
  172. /package/dist/{chunk-EDBP62WG.js.map → chunk-53ACGKBW.js.map} +0 -0
  173. /package/dist/{chunk-EWIKSTJV.js.map → chunk-5WJFCQFN.js.map} +0 -0
  174. /package/dist/{chunk-WBDQSBLV.js.map → chunk-5XFJCWPY.js.map} +0 -0
  175. /package/dist/{chunk-HPO7PB4F.js.map → chunk-7AAJYWC3.js.map} +0 -0
  176. /package/dist/{chunk-XW5SEW3H.js.map → chunk-AKC5GRJF.js.map} +0 -0
  177. /package/dist/{chunk-4QKS5Y35.js.map → chunk-EBSA4EYR.js.map} +0 -0
  178. /package/dist/{chunk-2W2MWEP2.js.map → chunk-EFLRNSE6.js.map} +0 -0
  179. /package/dist/{chunk-PC4H5LVB.js.map → chunk-EUPUEMFX.js.map} +0 -0
  180. /package/dist/{chunk-4PPNCZWY.js.map → chunk-GS5EPYB4.js.map} +0 -0
  181. /package/dist/{chunk-JVOEVTCZ.js.map → chunk-HQCZT6TO.js.map} +0 -0
  182. /package/dist/{chunk-GK7JNSMK.js.map → chunk-IK2ZVV3M.js.map} +0 -0
  183. /package/dist/{chunk-3FMWQQW6.js.map → chunk-L4Z7B7KL.js.map} +0 -0
  184. /package/dist/{chunk-3K7WN2PO.js.map → chunk-NBM3YJ4P.js.map} +0 -0
  185. /package/dist/{chunk-CTIMTEH7.js.map → chunk-NFCAXQ3F.js.map} +0 -0
  186. /package/dist/{chunk-GYDUXL3D.js.map → chunk-NVXRV3PL.js.map} +0 -0
  187. /package/dist/{chunk-ILNO4ZJ6.js.map → chunk-PKGBW7KS.js.map} +0 -0
  188. /package/dist/{chunk-NTJUAPJM.js.map → chunk-PZPTTAO5.js.map} +0 -0
  189. /package/dist/{chunk-HCYRCU4W.js.map → chunk-QJWIX4YZ.js.map} +0 -0
  190. /package/dist/{chunk-IL4FCC54.js.map → chunk-RREWYOKS.js.map} +0 -0
  191. /package/dist/{chunk-6D2PFC5C.js.map → chunk-SKOAJPOS.js.map} +0 -0
  192. /package/dist/{chunk-6QBT5TPS.js.map → chunk-USZMUOI6.js.map} +0 -0
  193. /package/dist/{chunk-ARJIKW56.js.map → chunk-UZCQHNXC.js.map} +0 -0
  194. /package/dist/{chunk-ZYJZHXFU.js.map → chunk-VWW2EXH7.js.map} +0 -0
  195. /package/dist/{chunk-PQ7RWH7L.js.map → chunk-VZCZAHMX.js.map} +0 -0
  196. /package/dist/{chunk-I3CQBEKS.js.map → chunk-WF3P7GE5.js.map} +0 -0
  197. /package/dist/{chunk-HH7PM5HT.js.map → chunk-ZUQX7XHJ.js.map} +0 -0
@@ -12,7 +12,7 @@ import {
12
12
  import { useDragItem } from "./data-views-drag";
13
13
  import { DENSITY_ROW_PADDING } from "./data-views-layout-context";
14
14
  import { RAIL_COUNT, RAIL_GAP, railsTemplateFor, useListRails } from "./list-card-rails";
15
- import { STACK_BREAK } from "./base-list-card-slots";
15
+ import { COMPACT_BREAK, STACK_BREAK } from "./base-list-card-slots";
16
16
  import type { BaseListCardProps } from "./base-list-card";
17
17
  import { rem } from "../../../tokens/relative";
18
18
 
@@ -66,6 +66,8 @@ interface RowSxOptions {
66
66
  inGroup: boolean;
67
67
  railCount: number;
68
68
  cellTemplate: string | null;
69
+ /** A standalone configured row's template in the compact band. */
70
+ compactTemplate: string | null;
69
71
  gutters: { disclose: boolean; drag: boolean; select: boolean };
70
72
  metaColumns: number;
71
73
  pad: number;
@@ -173,7 +175,7 @@ const stackedRowSx = (inGroup: boolean, railCount: number, stack: StackPlacement
173
175
  * {@link rowStyles}.
174
176
  */
175
177
  export const rowSx = (theme: Theme, opts: RowSxOptions): Record<string, unknown> => {
176
- const { inGroup, railCount, cellTemplate, gutters, metaColumns, pad, padY, scale, divider, interactive, draggable, stack } = opts;
178
+ const { inGroup, railCount, cellTemplate, compactTemplate, gutters, metaColumns, pad, padY, scale, divider, interactive, draggable, stack } = opts;
177
179
  return {
178
180
  position: "relative",
179
181
  borderRadius: CARD_RADIUS,
@@ -211,6 +213,15 @@ export const rowSx = (theme: Theme, opts: RowSxOptions): Record<string, unknown>
211
213
  outlineColor: "primary.main",
212
214
  outlineOffset: rem(theme, 2),
213
215
  },
216
+ // COMPACT below COMPACT_BREAK: half the rail gap and, standalone, the
217
+ // first cell's double share. In a group the GROUP's template answers the
218
+ // width (`list-card-group-tracks`); the gap is the row's, since a subgrid
219
+ // sets its own. BEFORE the stacked rule, which overrides it below
220
+ // STACK_BREAK by coming later.
221
+ [`@container (max-width: ${rem(theme, COMPACT_BREAK)})`]: {
222
+ columnGap: RAIL_GAP / 2,
223
+ ...(compactTemplate == null ? {} : { gridTemplateColumns: compactTemplate }),
224
+ },
214
225
  // TWO-LINE below STACK_BREAK: see {@link stackedRowSx}.
215
226
  [`@container (max-width: ${rem(theme, STACK_BREAK)})`]: stackedRowSx(inGroup, railCount, stack),
216
227
  ...(divider
@@ -267,8 +278,10 @@ export function useRowShell(props: BaseListCardProps) {
267
278
  slot: slotTestIds(props.testId),
268
279
  drag: useDragItem(dragIdFor(props, actionable)),
269
280
  // Standalone holds no gutter open: there is no list beside it to line up
270
- // with, so a reserved-but-empty rail is pure inset.
271
- reserve: group?.reserveGutters ?? false,
281
+ // with, so a reserved-but-empty rail is pure inset. In a group every gutter
282
+ // renders, empty when unused, and the GROUP decides whether its track
283
+ // stays (`list-card-group-tracks`): the rows cannot agree among themselves.
284
+ reserve: group != null,
272
285
  // 1, not 1.5. The row's contents still have to line up with the toolbar
273
286
  // above them, but 12px of card padding stacked on the checkbox's own 9px
274
287
  // and an empty drag gutter's 24px read as a row indented for no reason.
@@ -320,8 +333,9 @@ function rowSurface(
320
333
  }
321
334
 
322
335
  /**
323
- * Which head gutters this row renders: the ones it uses, or all three when its
324
- * group reserves them. The template is built from this; the three gutter slots
336
+ * Which head gutters this row renders: the ones it uses, or all three inside a
337
+ * group (empty when unused; the group decides which keep a track). The template
338
+ * is built from this; the three gutter slots
325
339
  * (`base-list-card-gutters.tsx`) apply the SAME conditions on their own — keep
326
340
  * the two in step, because a template that disagrees with the slots is exactly
327
341
  * how cells slid two tracks.
@@ -341,7 +355,7 @@ export function rowGutters(
341
355
  export function rowStyles(
342
356
  props: BaseListCardProps,
343
357
  shell: ReturnType<typeof useRowShell>,
344
- cellTemplate: string | null,
358
+ templates: { cellTemplate: string | null; compactTemplate: string | null },
345
359
  stack: StackPlacement,
346
360
  ): Record<string, unknown> {
347
361
  const { theme, group, drag, pad, padY, scale, acts } = shell;
@@ -350,7 +364,7 @@ export function rowStyles(
350
364
  ...rowSx(theme, {
351
365
  inGroup: group !== null,
352
366
  railCount: group?.railCount ?? RAIL_COUNT,
353
- cellTemplate,
367
+ ...templates,
354
368
  gutters: rowGutters(props, shell),
355
369
  metaColumns: metaShape(props).columns,
356
370
  pad,
@@ -31,7 +31,7 @@ import { useDataViewsCopy } from "./data-views-copy-context";
31
31
  */
32
32
  const CHECKBOX_PAD = sxRem(-9);
33
33
 
34
- /** The grip. Its gutter is reserved only when the list says to reserve it. */
34
+ /** The grip. Inside a group its slot always renders, empty when unused. */
35
35
  export function DragSlot({
36
36
  drag,
37
37
  reserve,
@@ -60,7 +60,7 @@ export function DragSlot({
60
60
  );
61
61
  }
62
62
 
63
- /** The select checkbox. Its gutter is reserved only when the list says to. */
63
+ /** The select checkbox. Inside a group its slot always renders, empty when unused. */
64
64
  export function SelectSlot({
65
65
  selectable,
66
66
  selected,
@@ -6,7 +6,7 @@ import { Box } from "../../../mui/Box";
6
6
  import type { BaseListCardProps } from "./base-list-card";
7
7
  import { rowGutters, type StackPlacement, type useRowShell } from "./base-list-card-geometry";
8
8
  import { cellRailsTemplate } from "./list-card-rails";
9
- import { cellTracks, useCellConfig, type ListCardCellConfig } from "./list-card-cells";
9
+ import { cellTracks, compactCellTracks, useCellConfig, type ListCardCellConfig } from "./list-card-cells";
10
10
 
11
11
  /**
12
12
  * WHAT SHAPE A ROW TAKES, resolved once: its cells and their template, whether
@@ -33,12 +33,15 @@ function useResolvedCells(
33
33
  cells: readonly ListCardCellConfig<never>[] | null;
34
34
  configured: boolean;
35
35
  cellTemplate: string | null;
36
+ compactTemplate: string | null;
36
37
  } {
37
38
  const groupCells = useCellConfig();
38
39
  const cells = groupCells ?? props.cells ?? null;
39
40
  const configured = cells != null && cells.length > 0 && props.row != null;
40
- const cellTemplate = configured && !inGroup ? cellRailsTemplate(cellTracks(cells), gutters) : null;
41
- return { cells, configured, cellTemplate };
41
+ const own = configured && !inGroup;
42
+ const cellTemplate = own ? cellRailsTemplate(cellTracks(cells), gutters) : null;
43
+ const compactTemplate = own ? cellRailsTemplate(compactCellTracks(cells), gutters) : null;
44
+ return { cells, configured, cellTemplate, compactTemplate };
42
45
  }
43
46
 
44
47
  /**
@@ -10,6 +10,9 @@ import { Text } from "../../typography/Text";
10
10
  import type { Theme } from "@mui/material/styles/index.js";
11
11
 
12
12
  import { rem, sxRem } from "../../../tokens/relative";
13
+ import { COMPACT_BREAK, META_BREAK } from "./list-card-breaks";
14
+
15
+ export { COMPACT_BREAK, META_BREAK, STACK_BREAK } from "./list-card-breaks";
13
16
 
14
17
  /**
15
18
  * WHAT SITS IN EACH RAIL.
@@ -18,11 +21,6 @@ import { rem, sxRem } from "../../../tokens/relative";
18
21
  * rails and the states; this is the content of each column.
19
22
  */
20
23
 
21
- /** Below this the row drops its middle columns. */
22
- export const META_BREAK = 520;
23
- /** …and below this it leaves the shared rails and goes two-line. */
24
- export const STACK_BREAK = 360;
25
-
26
24
  /** Money and dates line up only if their digits are the same width. */
27
25
  const TABULAR = { fontVariantNumeric: "tabular-nums" } as const;
28
26
 
@@ -214,6 +212,8 @@ export function ListCardMeta({
214
212
  */
215
213
  const valueFlush = (theme: Theme) => ({
216
214
  marginLeft: rem(theme, -RAIL_GAP_PX),
215
+ // The gap it cancels is half as wide in the compact band.
216
+ [`@container (max-width: ${rem(theme, COMPACT_BREAK)})`]: { marginLeft: rem(theme, -RAIL_GAP_PX / 2) },
217
217
  [`@container (max-width: ${rem(theme, META_BREAK)})`]: { marginLeft: 0 },
218
218
  });
219
219
 
@@ -281,7 +281,7 @@ export function BaseListCard(props: BaseListCardProps): React.JSX.Element {
281
281
  const { actionable, selectable, slot, drag, reserve, pad, padY, acts } = shell;
282
282
  const meta = metaShape(props);
283
283
  const disclosure = useDisclosure(props);
284
- const { cells, configured, cellTemplate, opens, stack } = useRowLayout(props, shell, disclosure.expandable);
284
+ const { cells, configured, cellTemplate, compactTemplate, opens, stack } = useRowLayout(props, shell, disclosure.expandable);
285
285
 
286
286
  return (
287
287
  <StandaloneContainer inGroup={shell.group != null}>
@@ -295,7 +295,7 @@ export function BaseListCard(props: BaseListCardProps): React.JSX.Element {
295
295
  {...(acts ? actionProps(onClick) : {})}
296
296
  {...drag.itemProps}
297
297
  // A PLAIN OBJECT: `Card` merges by spreading, so a function sx vanishes.
298
- sx={rowStyles(props, shell, cellTemplate, stack)}
298
+ sx={rowStyles(props, shell, { cellTemplate, compactTemplate }, stack)}
299
299
  >
300
300
  {drag.dropEdge != null && <DropIndicator edge={drag.dropEdge} />}
301
301
  <DiscloseSlot
@@ -334,4 +334,4 @@ export function BaseListCard(props: BaseListCardProps): React.JSX.Element {
334
334
  );
335
335
  }
336
336
 
337
- export { META_BREAK, STACK_BREAK } from "./base-list-card-slots";
337
+ export { COMPACT_BREAK, META_BREAK, STACK_BREAK } from "./base-list-card-slots";
@@ -132,6 +132,13 @@ export interface DataViewsDisplayCopy {
132
132
  export interface DataViewsExportCopy {
133
133
  /** Format labels and hints, keyed by format id. */
134
134
  formats: Readonly<Record<string, { label: string; hint: string }>>;
135
+ /**
136
+ * The panel's first line: what the export will contain. The selection when
137
+ * there is one (`selectedCount > 0`), otherwise every row the filters leave
138
+ * (`totalCount`). The whole line, verb included — it was a pt-BR literal, so
139
+ * an en-US host read "Exportando 3 itens selecionados".
140
+ */
141
+ scopeLine(selectedCount: number, totalCount: number): string;
135
142
  visibleColumns(columnCount: number): string;
136
143
  /** The control that opens the menu. */
137
144
  trigger: string;
@@ -75,14 +75,6 @@ interface ExportMenuProps {
75
75
  compact?: boolean;
76
76
  }
77
77
 
78
- /** "Exportando 214 itens filtrados" / "3 itens selecionados" — never a guess. */
79
- function scopeLabel(selected: number, total: number): string {
80
- if (selected > 0) {
81
- return `${selected} ${selected === 1 ? "item selecionado" : "itens selecionados"}`;
82
- }
83
- return `${total} ${total === 1 ? "item filtrado" : "itens filtrados"}`;
84
- }
85
-
86
78
  /** The trigger. Shows a spinner while the host's export is still running. */
87
79
  function ExportTrigger({
88
80
  busy,
@@ -188,7 +180,7 @@ function ExportPanel({
188
180
  <Box sx={{ px: 1.5, pt: 1, pb: 1, borderBottom: 1, borderColor: "divider" }}>
189
181
  <Text variant="caption" as="p">
190
182
  <Box component="span" data-testid={`${testIdPrefix}-export-scope`}>
191
- Exportando {scopeLabel(selectedCount, totalCount)}
183
+ {copy.export.scopeLine(selectedCount, totalCount)}
192
184
  </Box>
193
185
  </Text>
194
186
  <Text variant="caption" as="p">
@@ -0,0 +1,21 @@
1
+ /**
2
+ * THE WIDTHS A LIST ROW ANSWERS, measured on its query container (the group, or
3
+ * a standalone card's wrapper) — never the viewport.
4
+ *
5
+ * Their own module because both the row (`base-list-card-*`) and the group
6
+ * (`list-card-group-tracks`) ask the question, and the group's rails module is
7
+ * already a dependency of the row's slots.
8
+ */
9
+
10
+ /**
11
+ * Below this the row COMPACTS: the rail gap halves, a reserved drag track no row
12
+ * fills leaves the template, and a configured list's first cell takes a double
13
+ * share. Between `STACK_BREAK` and here the row is still one line of columns,
14
+ * and at 24px a gap four columns wide was spending a third of a phone-sized row
15
+ * on air while every name ellipsised.
16
+ */
17
+ export const COMPACT_BREAK = 600;
18
+ /** Below this the row drops its middle columns. */
19
+ export const META_BREAK = 520;
20
+ /** …and below this it leaves the shared rails and goes two-line. */
21
+ export const STACK_BREAK = 360;
@@ -64,6 +64,22 @@ export function cellTracks(cells: readonly ListCardCellConfig<never>[] | undefin
64
64
  return (cells ?? []).map((cell) => cell.width ?? DEFAULT_CELL_WIDTH);
65
65
  }
66
66
 
67
+ /** The first cell's track in the compact band, when it left its width to us. */
68
+ const COMPACT_FIRST_CELL_WIDTH = "minmax(0, 2fr)";
69
+
70
+ /**
71
+ * The tracks in the COMPACT band (`COMPACT_BREAK`): the same, except that the
72
+ * first cell — the one that names the record — takes a double share of the
73
+ * spare width. Narrow, an even share left every name at "Sab…" beside a date
74
+ * column with room to spare. A first cell that declared its own `width` keeps
75
+ * it: the list asked for that track, and only the default is ours to change.
76
+ */
77
+ export function compactCellTracks(cells: readonly ListCardCellConfig<never>[] | undefined): string[] {
78
+ return cellTracks(cells).map((track, index) =>
79
+ index === 0 && cells?.[0]?.width == null ? COMPACT_FIRST_CELL_WIDTH : track,
80
+ );
81
+ }
82
+
67
83
  /**
68
84
  * The config handed down by the list.
69
85
  *
@@ -0,0 +1,127 @@
1
+ "use client";
2
+
3
+ import type { Theme } from "@mui/material/styles/index.js";
4
+ import type { ReactNode } from "react";
5
+
6
+ import { Box } from "../../../mui/Box";
7
+ import { rem } from "../../../tokens/relative";
8
+ import { COMPACT_BREAK } from "./list-card-breaks";
9
+
10
+ /**
11
+ * A GROUP'S TRACKS, AND WHICH OF ITS HEAD GUTTERS GET ONE.
12
+ *
13
+ * Every row of a group is subgrid over one template, so the tracks cannot vary
14
+ * per row — but the group does not render its rows' gutters and cannot count
15
+ * which of them are in use. The rows answer that for it: inside a group every
16
+ * gutter slot renders, as an EMPTY element when the row does not use it, and
17
+ * the group asks with `:has()` whether any row's slot has content. A gutter no
18
+ * row fills loses its track (and its rail gap) and its placeholders are hidden,
19
+ * so auto-placement has nothing to put in the wrong column; one any row fills
20
+ * is a track for every row, so the list still lines up.
21
+ *
22
+ * WHICH GUTTERS MAY LEAVE:
23
+ * - `reserveGutters={false}`: any of the three, at every width.
24
+ * - reserved (the default): only the drag gutter, and only in the compact
25
+ * band. Held open it keeps a selectable list and a read-only one aligned
26
+ * and stops drag mode shifting every row; on a phone-sized row, with no
27
+ * row dragging, it is a rail gap spent on nothing.
28
+ *
29
+ * Each rule names every candidate gutter, empty or filled, so exactly one rule
30
+ * matches a given list and none depends on another's specificity to lose.
31
+ */
32
+
33
+ export type Gutter = "disclose" | "drag" | "select";
34
+
35
+ const GUTTERS: readonly Gutter[] = ["disclose", "drag", "select"];
36
+
37
+ /** A `:has()` argument true when some row's `gutter` slot has content. */
38
+ const filled = (gutter: Gutter): string => `> * > [data-slot="${gutter}"] > *`;
39
+
40
+ /** Every non-empty subset of `gutters`, in a stable order. */
41
+ function subsets(gutters: readonly Gutter[]): Gutter[][] {
42
+ const out: Gutter[][] = [];
43
+ for (let mask = 1; mask < 1 << gutters.length; mask += 1) {
44
+ out.push(gutters.filter((_, index) => (mask & (1 << index)) !== 0));
45
+ }
46
+ return out;
47
+ }
48
+
49
+ /** The template for a list with `dropped` gutters, plain or compact. */
50
+ export type GroupTemplate = (dropped: ReadonlySet<Gutter>, compact: boolean) => string;
51
+
52
+ /**
53
+ * The rules for one width: the template with no gutter dropped, then one rule
54
+ * per combination of empty candidate gutters.
55
+ */
56
+ function trackRules(
57
+ template: GroupTemplate,
58
+ railCount: number,
59
+ candidates: readonly Gutter[],
60
+ compact: boolean,
61
+ ): Record<string, unknown> {
62
+ const rules: Record<string, unknown> = { gridTemplateColumns: template(new Set(), compact) };
63
+ for (const empty of subsets(candidates)) {
64
+ const selector = candidates
65
+ .map((gutter) => (empty.includes(gutter) ? `:not(:has(${filled(gutter)}))` : `:has(${filled(gutter)})`))
66
+ .join("");
67
+ rules[`&${selector}`] = {
68
+ gridTemplateColumns: template(new Set(empty), compact),
69
+ // Every row spans what is left, or it adds an implicit track at the end.
70
+ // `> *`: every direct child of a group's grid is a row (DataViews renders
71
+ // them through fragments for exactly this reason).
72
+ "& > *": { gridColumn: `span ${railCount - empty.length}` },
73
+ ...Object.fromEntries(empty.map((gutter) => [`& > * > [data-slot="${gutter}"]`, { display: "none" }])),
74
+ };
75
+ }
76
+ return rules;
77
+ }
78
+
79
+ /** The group grid's `grid-template-columns`, at every width it answers. */
80
+ export function groupTracksSx(
81
+ theme: Theme,
82
+ { template, railCount, reserveGutters }: { template: GroupTemplate; railCount: number; reserveGutters: boolean },
83
+ ): Record<string, unknown> {
84
+ return {
85
+ ...trackRules(template, railCount, reserveGutters ? [] : GUTTERS, false),
86
+ [`@container (max-width: ${rem(theme, COMPACT_BREAK)})`]: trackRules(
87
+ template,
88
+ railCount,
89
+ reserveGutters ? ["drag"] : GUTTERS,
90
+ true,
91
+ ),
92
+ };
93
+ }
94
+
95
+ /**
96
+ * The group's grid, inside its query container — the container for every row
97
+ * in it: a row cannot be one itself and a subgrid at the same time
98
+ * (containment drops subgrid), and every row in a list is the same width
99
+ * anyway, so the group is the honest place to ask the question.
100
+ *
101
+ * A WRAPPER, not the grid: a container query matches an ancestor, never the
102
+ * element itself, and the grid's own template has to answer the width (the
103
+ * compact band, `list-card-group-tracks`). The rows stay the GRID's direct
104
+ * children, which subgrid needs.
105
+ */
106
+ export function GroupGrid({
107
+ dataTestId,
108
+ tracks,
109
+ rowGap,
110
+ children,
111
+ }: {
112
+ dataTestId?: string;
113
+ tracks: Parameters<typeof groupTracksSx>[1];
114
+ rowGap: number;
115
+ children: ReactNode;
116
+ }): React.JSX.Element {
117
+ return (
118
+ <Box sx={{ containerType: "inline-size", width: "100%", minWidth: 0 }}>
119
+ <Box
120
+ data-testid={dataTestId}
121
+ sx={(theme) => ({ display: "grid", ...groupTracksSx(theme, tracks), alignItems: "center", rowGap })}
122
+ >
123
+ {children}
124
+ </Box>
125
+ </Box>
126
+ );
127
+ }
@@ -2,9 +2,9 @@
2
2
 
3
3
  import { createContext, useContext, type ReactNode } from "react";
4
4
 
5
- import { Box } from "../../../mui/Box";
6
5
  import { DENSITY_ROW_PADDING, type DataViewsDensity } from "./data-views-layout-context";
7
- import { CellConfigProvider, cellTracks, type ListCardCellConfig } from "./list-card-cells";
6
+ import { CellConfigProvider, cellTracks, compactCellTracks, type ListCardCellConfig } from "./list-card-cells";
7
+ import { GroupGrid, type GroupTemplate } from "./list-card-group-tracks";
8
8
 
9
9
  /**
10
10
  * THE LIST OWNS THE COLUMNS, NOT THE ROW.
@@ -37,7 +37,11 @@ export interface ListRails {
37
37
  * as a rendering fault rather than as a row you can open.
38
38
  */
39
39
  disclose: string;
40
- /** Reserved even when nothing drags: toggling drag mode must not shift the list. */
40
+ /**
41
+ * Reserved even when nothing drags: toggling drag mode must not shift the
42
+ * list. The one exception is the compact band (`COMPACT_BREAK`), where a drag
43
+ * track no row fills leaves the template (`list-card-group-tracks`).
44
+ */
41
45
  drag: string;
42
46
  /** Reserved even when nothing is selectable, for the same reason. */
43
47
  select: string;
@@ -108,7 +112,11 @@ export const DEFAULT_RAILS: ListRails = {
108
112
 
109
113
  export interface ListRailsValue {
110
114
  density: DataViewsDensity;
111
- /** Whether the gutters are held open even when empty. */
115
+ /**
116
+ * Whether the group holds its gutters open even when empty. The GROUP's grid
117
+ * acts on it (`list-card-group-tracks`); a row inside a group renders every
118
+ * gutter regardless, empty when unused, so the group can ask.
119
+ */
112
120
  reserveGutters: boolean;
113
121
  /**
114
122
  * How many tracks a row spans.
@@ -132,9 +140,10 @@ export function useListRails(): ListRailsValue | null {
132
140
  *
133
141
  * A rail set to `null` is DROPPED rather than sized to zero. The two are not the
134
142
  * same: a zero-width track still takes a `column-gap` beside it, so a gutter
135
- * nobody is using still pushes the row's contents inward. Only a standalone card
136
- * may drop one — inside a group the rails are subgrid over a shared template and
137
- * every row must span the same count.
143
+ * nobody is using still pushes the row's contents inward. A standalone card drops
144
+ * the ones it does not render; a group drops one only when NO row fills it
145
+ * (`list-card-group-tracks`), since its rows are subgrid over one template and
146
+ * must all span the same count.
138
147
  */
139
148
  export function railsTemplate(rails: RailOverrides): string {
140
149
  return [
@@ -172,11 +181,12 @@ export const RAIL_GAP_PX = RAIL_GAP * 8;
172
181
  *
173
182
  * The only way out is for the track NOT TO EXIST: the slot renders nothing and
174
183
  * the rail leaves the template, which is safe because grid auto-placement fills
175
- * the remaining tracks in DOM order. Standalone only — inside a
184
+ * the remaining tracks in DOM order. This is the standalone rule — inside a
176
185
  * {@link ListCardGroup} the rails are subgrid across a shared template and the
177
186
  * count cannot vary per row, which is also where `reserveGutters` earns its
178
187
  * keep: a selectable list and a read-only one still line up, and turning drag
179
- * mode on does not shift every row sideways.
188
+ * mode on does not shift every row sideways. (A group drops a gutter only when
189
+ * no row fills it: `list-card-group-tracks`.)
180
190
  */
181
191
  export function railsTemplateFor(
182
192
  gutters: { disclose: boolean; drag: boolean; select: boolean },
@@ -209,8 +219,9 @@ const CELL_FIXED_RAILS = 4;
209
219
  /**
210
220
  * Tracks for a cell-configured row: gutters, leading, the cells, then the menu.
211
221
  *
212
- * `gutters` says which of the three head gutters RENDER. A group reserves all
213
- * three (the default), so every row spans the same tracks. A standalone row
222
+ * `gutters` says which of the three head gutters RENDER. The group passes all
223
+ * three and drops, in CSS, any no row fills (`list-card-group-tracks`), so every
224
+ * row spans the same tracks. A standalone row
214
225
  * renders a gutter only when it uses it, and a track whose slot renders nothing
215
226
  * is not a reserved gap: grid auto-placement fills it with the NEXT slot. So the
216
227
  * checkbox landed in the disclosure track, the glyph in the drag track, and
@@ -262,12 +273,30 @@ export interface ListGroupConfig<T extends Record<string, unknown>> {
262
273
  /** Override individual rails; anything omitted keeps its default. */
263
274
  rails?: Partial<ListRails>;
264
275
  /**
265
- * Hold the drag and select gutters open even when nothing uses them. On by
266
- * default, so a selectable list and a read-only one still line up.
276
+ * Hold the head gutters open even when nothing uses them. On by default, so a
277
+ * selectable list and a read-only one still line up. Off, a gutter no row in
278
+ * the list uses takes no track (see `list-card-group-tracks`).
267
279
  */
268
280
  reserveGutters?: boolean;
269
281
  }
270
282
 
283
+ /**
284
+ * The group's template for a given set of dropped gutters, plain or compact —
285
+ * from its cells when it has them, from its named-slot rails otherwise.
286
+ */
287
+ function groupTemplate(cells: readonly ListCardCellConfig<never>[] | null, resolved: ListRails): GroupTemplate {
288
+ return (dropped, compact) => {
289
+ const gutters = { disclose: !dropped.has("disclose"), drag: !dropped.has("drag"), select: !dropped.has("select") };
290
+ if (cells != null) return cellRailsTemplate(compact ? compactCellTracks(cells) : cellTracks(cells), gutters);
291
+ return railsTemplate({
292
+ ...resolved,
293
+ ...(gutters.disclose ? {} : { disclose: null }),
294
+ ...(gutters.drag ? {} : { drag: null }),
295
+ ...(gutters.select ? {} : { select: null }),
296
+ });
297
+ };
298
+ }
299
+
271
300
  /**
272
301
  * A list of {@link BaseListCard}s that share one set of columns.
273
302
  *
@@ -315,10 +344,18 @@ export function ListCardGroup({
315
344
  /** Override individual rails; anything omitted keeps its default. */
316
345
  rails?: Partial<ListRails>;
317
346
  /**
318
- * Hold the drag and select gutters open even when nothing uses them.
347
+ * Hold the head gutters (disclosure, drag, select) open even when nothing
348
+ * uses them.
319
349
  *
320
350
  * On by default: a selectable list and a read-only one should line up, and
321
- * turning drag mode on should not shift every row sideways.
351
+ * turning drag mode on should not shift every row sideways. The one
352
+ * exception is the compact band, where an empty drag track leaves.
353
+ *
354
+ * Off, a gutter that NO row in the list uses takes no track, and one that any
355
+ * row uses is a track for every row — the list still lines up, it just stops
356
+ * paying for columns nobody needs. (It used to keep all three tracks while
357
+ * the rows rendered nothing in the empty ones, so every cell auto-flowed into
358
+ * the track before its own.)
322
359
  */
323
360
  reserveGutters?: boolean;
324
361
  /** Row gap. Defaults to the density's own spacing. */
@@ -331,27 +368,18 @@ export function ListCardGroup({
331
368
  ...rails,
332
369
  };
333
370
  const configured = cells != null && cells.length > 0;
334
- const template = configured ? cellRailsTemplate(cellTracks(cells)) : railsTemplate(resolved);
371
+ const template = groupTemplate(configured ? cells : null, resolved);
335
372
  const railCount = configured ? cellRailCount(cells.length) : RAIL_COUNT;
336
373
  return (
337
374
  <ListRailsContext.Provider value={{ density, reserveGutters, railCount }}>
338
375
  <CellConfigProvider cells={cells}>
339
- <Box
340
- data-testid={dataTestId}
341
- sx={{
342
- // The query container for every row inside it — a row cannot be one
343
- // itself and a subgrid at the same time (containment drops subgrid).
344
- // Every row in a list is the same width anyway, so the group is the
345
- // honest place to ask the question.
346
- containerType: "inline-size",
347
- display: "grid",
348
- gridTemplateColumns: template,
349
- alignItems: "center",
350
- rowGap: gap ?? DENSITY_ROW_PADDING[density],
351
- }}
376
+ <GroupGrid
377
+ dataTestId={dataTestId}
378
+ tracks={{ template, railCount, reserveGutters }}
379
+ rowGap={gap ?? DENSITY_ROW_PADDING[density]}
352
380
  >
353
381
  {children}
354
- </Box>
382
+ </GroupGrid>
355
383
  </CellConfigProvider>
356
384
  </ListRailsContext.Provider>
357
385
  );
@@ -123,20 +123,27 @@ export const Popover = React.forwardRef<HTMLDivElement, PopoverProps>(
123
123
  maxWidth,
124
124
  dataTestId,
125
125
  children,
126
+ PaperProps: callerPaper,
126
127
  ...props
127
128
  }, ref) => (
128
129
  <MuiPopover
129
130
  ref={ref}
130
131
  data-testid={dataTestId || 'popover-content'}
132
+ {...props}
133
+ // After the spread, and merged rather than replaced: a caller's
134
+ // `PaperProps` used to land last and drop the styled paper, its variant
135
+ // and the width cap; and its `sx` now adds to the cap instead.
131
136
  PaperProps={{
137
+ ...callerPaper,
132
138
  component: StyledPaper as React.ComponentType<PaperProps>,
133
139
  customVariant: variant,
134
140
  glow,
135
141
  pulse,
136
- sx: { maxWidth: popoverCap(maxWidth) },
137
- ...props.PaperProps,
142
+ sx: [
143
+ { maxWidth: popoverCap(maxWidth) },
144
+ ...(Array.isArray(callerPaper?.sx) ? callerPaper.sx : [callerPaper?.sx ?? {}]),
145
+ ],
138
146
  } as PaperProps & { customVariant?: string; glow?: boolean; pulse?: boolean }}
139
- {...props}
140
147
  >
141
148
  {children}
142
149
  </MuiPopover>
@@ -177,6 +177,10 @@ export const EN_US_DATA_VIEWS_COPY: DataViewsCopy = {
177
177
  // disk in every language.
178
178
  json: { label: "JSON (.json)", hint: "For integrations" },
179
179
  },
180
+ scopeLine: (selectedCount, totalCount) =>
181
+ selectedCount > 0
182
+ ? `Exporting ${selectedCount} selected ${selectedCount === 1 ? "item" : "items"}`
183
+ : `Exporting ${totalCount} filtered ${totalCount === 1 ? "item" : "items"}`,
180
184
  visibleColumns: (columnCount) => `${columnCount} visible columns, in their current order`,
181
185
  trigger: "Export",
182
186
  triggerLabel: "Export",
package/src/mui/styles.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export type { SxProps, Theme } from '@mui/material/styles/index.js';
2
- export { alpha, styled, useTheme, createTheme, ThemeProvider } from '@mui/material/styles/index.js';
2
+ export { alpha, keyframes, styled, useTheme, createTheme, ThemeProvider } from '@mui/material/styles/index.js';
@@ -174,6 +174,10 @@ export const PT_BR_DATA_VIEWS_COPY: DataViewsCopy = {
174
174
  formats: {
175
175
  json: { label: "JSON (.json)", hint: "Para integrações" },
176
176
  },
177
+ scopeLine: (selectedCount, totalCount) =>
178
+ selectedCount > 0
179
+ ? `Exportando ${selectedCount} ${selectedCount === 1 ? "item selecionado" : "itens selecionados"}`
180
+ : `Exportando ${totalCount} ${totalCount === 1 ? "item filtrado" : "itens filtrados"}`,
177
181
  visibleColumns: (columnCount) => `${columnCount} colunas visíveis, na ordem atual`,
178
182
  trigger: "Exportar",
179
183
  triggerLabel: "Exportar",