@12-apps/ui 6.60.0 → 6.62.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.
- package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
- package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
- package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -7
- package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +25 -23
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -24
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +6 -4
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +7 -5
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +11 -6
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +14 -10
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +5 -3
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +20 -18
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
- package/dist/_internal/components/data-display/DataViews/list-card-breaks.js +12 -0
- package/dist/_internal/components/data-display/DataViews/list-card-breaks.js.map +1 -0
- package/dist/_internal/components/data-display/DataViews/list-card-cells.js +3 -1
- package/dist/_internal/components/data-display/DataViews/list-card-group-tracks.js +14 -0
- package/dist/_internal/components/data-display/DataViews/list-card-group-tracks.js.map +1 -0
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +4 -2
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +1 -1
- package/dist/_internal/components/data-display/index.js +15 -15
- package/dist/_internal/components/index.js +22 -22
- package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +6 -6
- package/dist/_internal/components/navigation/SectionNav/SectionNav.js +9 -9
- package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +3 -3
- package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +4 -4
- package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +5 -5
- package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js +4 -4
- package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +4 -4
- package/dist/_internal/components/navigation/index.js +9 -9
- package/dist/_internal/en-US.data-display.js +1 -1
- package/dist/_internal/pt-BR.data-display.js +1 -1
- package/dist/_internal/user-avatar/user-avatar.js +4 -4
- package/dist/charts.js +10 -10
- package/dist/{chunk-V4V2N6YJ.js → chunk-36RYXV4R.js} +9 -6
- package/dist/chunk-36RYXV4R.js.map +1 -0
- package/dist/{chunk-W7N4ORCV.js → chunk-3JYCS7VO.js} +5 -5
- package/dist/{chunk-YIKFYWKD.js → chunk-46ZATLQV.js} +3 -3
- package/dist/{chunk-TF27Z27K.js → chunk-4JZ6XDVA.js} +2 -2
- package/dist/{chunk-EDBP62WG.js → chunk-53ACGKBW.js} +3 -3
- package/dist/{chunk-ZWBGQYVO.js → chunk-56PBNYXF.js} +8 -6
- package/dist/chunk-56PBNYXF.js.map +1 -0
- package/dist/{chunk-EWIKSTJV.js → chunk-5WJFCQFN.js} +7 -7
- package/dist/{chunk-WBDQSBLV.js → chunk-5XFJCWPY.js} +5 -5
- package/dist/{chunk-QKAYXAQE.js → chunk-6FAYTKXW.js} +24 -20
- package/dist/chunk-6FAYTKXW.js.map +1 -0
- package/dist/{chunk-HPO7PB4F.js → chunk-7AAJYWC3.js} +2 -2
- package/dist/{chunk-XW5SEW3H.js → chunk-AKC5GRJF.js} +2 -2
- package/dist/{chunk-NHVL2QPG.js → chunk-D7PVIC33.js} +2 -1
- package/dist/chunk-D7PVIC33.js.map +1 -0
- package/dist/{chunk-4QKS5Y35.js → chunk-EBSA4EYR.js} +2 -2
- package/dist/{chunk-2W2MWEP2.js → chunk-EFLRNSE6.js} +11 -11
- package/dist/{chunk-PC4H5LVB.js → chunk-EUPUEMFX.js} +7 -7
- package/dist/{chunk-COYGTEN5.js → chunk-F5S5UFGD.js} +8 -1
- package/dist/chunk-F5S5UFGD.js.map +1 -0
- package/dist/{chunk-4PPNCZWY.js → chunk-GS5EPYB4.js} +3 -3
- package/dist/{chunk-JVOEVTCZ.js → chunk-HQCZT6TO.js} +5 -5
- package/dist/{chunk-GK7JNSMK.js → chunk-IK2ZVV3M.js} +2 -2
- package/dist/{chunk-CMBZ3J6I.js → chunk-JA6GKU65.js} +2 -11
- package/dist/chunk-JA6GKU65.js.map +1 -0
- package/dist/{chunk-3FMWQQW6.js → chunk-L4Z7B7KL.js} +2 -2
- package/dist/{chunk-3K7WN2PO.js → chunk-NBM3YJ4P.js} +3 -3
- package/dist/{chunk-CTIMTEH7.js → chunk-NFCAXQ3F.js} +4 -4
- package/dist/{chunk-GYDUXL3D.js → chunk-NVXRV3PL.js} +7 -7
- package/dist/{chunk-6OSUK2C7.js → chunk-PJ5HXNBG.js} +11 -11
- package/dist/{chunk-6OSUK2C7.js.map → chunk-PJ5HXNBG.js.map} +1 -1
- package/dist/{chunk-ILNO4ZJ6.js → chunk-PKGBW7KS.js} +2 -2
- package/dist/{chunk-NTJUAPJM.js → chunk-PZPTTAO5.js} +7 -7
- package/dist/{chunk-HCYRCU4W.js → chunk-QJWIX4YZ.js} +2 -2
- package/dist/{chunk-IL4FCC54.js → chunk-RREWYOKS.js} +2 -2
- package/dist/{chunk-6D2PFC5C.js → chunk-SKOAJPOS.js} +2 -2
- package/dist/{chunk-PIIPEXRM.js → chunk-TVMSXL3R.js} +1 -1
- package/dist/chunk-TVMSXL3R.js.map +1 -0
- package/dist/chunk-U3HEYECF.js +68 -0
- package/dist/chunk-U3HEYECF.js.map +1 -0
- package/dist/{chunk-QHP5PZNC.js → chunk-U57NFQYE.js} +2 -1
- package/dist/chunk-U57NFQYE.js.map +1 -0
- package/dist/{chunk-6QBT5TPS.js → chunk-USZMUOI6.js} +3 -3
- package/dist/{chunk-ARJIKW56.js → chunk-UZCQHNXC.js} +2 -2
- package/dist/{chunk-ZYJZHXFU.js → chunk-VWW2EXH7.js} +4 -4
- package/dist/{chunk-PQ7RWH7L.js → chunk-VZCZAHMX.js} +5 -5
- package/dist/{chunk-I3CQBEKS.js → chunk-WF3P7GE5.js} +2 -2
- package/dist/{chunk-U47KRLEW.js → chunk-YP7SQ5DM.js} +22 -10
- package/dist/chunk-YP7SQ5DM.js.map +1 -0
- package/dist/chunk-ZMUXC3VB.js +11 -0
- package/dist/chunk-ZMUXC3VB.js.map +1 -0
- package/dist/{chunk-HH7PM5HT.js → chunk-ZUQX7XHJ.js} +2 -2
- package/dist/data-display/Avatar.js +3 -3
- package/dist/data-display/Badge.js +2 -2
- package/dist/data-display/CardKit.js +9 -9
- package/dist/data-display/Chart.js +10 -10
- package/dist/data-display/DataViews.js +38 -36
- package/dist/en-US.js +1 -1
- package/dist/locales.js +2 -2
- package/dist/navigation/SectionNav.js +9 -9
- package/dist/pt-BR.js +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts +9 -3
- package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-gutters.d.ts +2 -2
- package/dist/types/components/data-display/DataViews/base-list-card-gutters.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-layout.d.ts +1 -0
- package/dist/types/components/data-display/DataViews/base-list-card-layout.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts +1 -10
- package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card.d.ts +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +7 -0
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-export.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/list-card-breaks.d.ts +21 -0
- package/dist/types/components/data-display/DataViews/list-card-breaks.d.ts.map +1 -0
- package/dist/types/components/data-display/DataViews/list-card-cells.d.ts +8 -0
- package/dist/types/components/data-display/DataViews/list-card-cells.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/list-card-group-tracks.d.ts +51 -0
- package/dist/types/components/data-display/DataViews/list-card-group-tracks.d.ts.map +1 -0
- package/dist/types/components/data-display/DataViews/list-card-rails.d.ts +33 -13
- package/dist/types/components/data-display/DataViews/list-card-rails.d.ts.map +1 -1
- package/dist/types/en-US.data-display.d.ts.map +1 -1
- package/dist/types/pt-BR.data-display.d.ts.map +1 -1
- package/dist/user-avatar.js +4 -4
- package/package.json +1 -1
- package/src/components/data-display/DataViews/base-list-card-geometry.tsx +22 -8
- package/src/components/data-display/DataViews/base-list-card-gutters.tsx +2 -2
- package/src/components/data-display/DataViews/base-list-card-layout.tsx +6 -3
- package/src/components/data-display/DataViews/base-list-card-slots.tsx +5 -5
- package/src/components/data-display/DataViews/base-list-card.tsx +3 -3
- package/src/components/data-display/DataViews/data-views-copy.ts +7 -0
- package/src/components/data-display/DataViews/data-views-export.tsx +1 -9
- package/src/components/data-display/DataViews/list-card-breaks.ts +21 -0
- package/src/components/data-display/DataViews/list-card-cells.tsx +16 -0
- package/src/components/data-display/DataViews/list-card-group-tracks.tsx +127 -0
- package/src/components/data-display/DataViews/list-card-rails.tsx +58 -30
- package/src/en-US.data-display.ts +4 -0
- package/src/pt-BR.data-display.ts +4 -0
- package/dist/chunk-CMBZ3J6I.js.map +0 -1
- package/dist/chunk-COYGTEN5.js.map +0 -1
- package/dist/chunk-NHVL2QPG.js.map +0 -1
- package/dist/chunk-PIIPEXRM.js.map +0 -1
- package/dist/chunk-QHP5PZNC.js.map +0 -1
- package/dist/chunk-QKAYXAQE.js.map +0 -1
- package/dist/chunk-U47KRLEW.js.map +0 -1
- package/dist/chunk-V4V2N6YJ.js.map +0 -1
- package/dist/chunk-ZWBGQYVO.js.map +0 -1
- /package/dist/{chunk-W7N4ORCV.js.map → chunk-3JYCS7VO.js.map} +0 -0
- /package/dist/{chunk-YIKFYWKD.js.map → chunk-46ZATLQV.js.map} +0 -0
- /package/dist/{chunk-TF27Z27K.js.map → chunk-4JZ6XDVA.js.map} +0 -0
- /package/dist/{chunk-EDBP62WG.js.map → chunk-53ACGKBW.js.map} +0 -0
- /package/dist/{chunk-EWIKSTJV.js.map → chunk-5WJFCQFN.js.map} +0 -0
- /package/dist/{chunk-WBDQSBLV.js.map → chunk-5XFJCWPY.js.map} +0 -0
- /package/dist/{chunk-HPO7PB4F.js.map → chunk-7AAJYWC3.js.map} +0 -0
- /package/dist/{chunk-XW5SEW3H.js.map → chunk-AKC5GRJF.js.map} +0 -0
- /package/dist/{chunk-4QKS5Y35.js.map → chunk-EBSA4EYR.js.map} +0 -0
- /package/dist/{chunk-2W2MWEP2.js.map → chunk-EFLRNSE6.js.map} +0 -0
- /package/dist/{chunk-PC4H5LVB.js.map → chunk-EUPUEMFX.js.map} +0 -0
- /package/dist/{chunk-4PPNCZWY.js.map → chunk-GS5EPYB4.js.map} +0 -0
- /package/dist/{chunk-JVOEVTCZ.js.map → chunk-HQCZT6TO.js.map} +0 -0
- /package/dist/{chunk-GK7JNSMK.js.map → chunk-IK2ZVV3M.js.map} +0 -0
- /package/dist/{chunk-3FMWQQW6.js.map → chunk-L4Z7B7KL.js.map} +0 -0
- /package/dist/{chunk-3K7WN2PO.js.map → chunk-NBM3YJ4P.js.map} +0 -0
- /package/dist/{chunk-CTIMTEH7.js.map → chunk-NFCAXQ3F.js.map} +0 -0
- /package/dist/{chunk-GYDUXL3D.js.map → chunk-NVXRV3PL.js.map} +0 -0
- /package/dist/{chunk-ILNO4ZJ6.js.map → chunk-PKGBW7KS.js.map} +0 -0
- /package/dist/{chunk-NTJUAPJM.js.map → chunk-PZPTTAO5.js.map} +0 -0
- /package/dist/{chunk-HCYRCU4W.js.map → chunk-QJWIX4YZ.js.map} +0 -0
- /package/dist/{chunk-IL4FCC54.js.map → chunk-RREWYOKS.js.map} +0 -0
- /package/dist/{chunk-6D2PFC5C.js.map → chunk-SKOAJPOS.js.map} +0 -0
- /package/dist/{chunk-6QBT5TPS.js.map → chunk-USZMUOI6.js.map} +0 -0
- /package/dist/{chunk-ARJIKW56.js.map → chunk-UZCQHNXC.js.map} +0 -0
- /package/dist/{chunk-ZYJZHXFU.js.map → chunk-VWW2EXH7.js.map} +0 -0
- /package/dist/{chunk-PQ7RWH7L.js.map → chunk-VZCZAHMX.js.map} +0 -0
- /package/dist/{chunk-I3CQBEKS.js.map → chunk-WF3P7GE5.js.map} +0 -0
- /package/dist/{chunk-HH7PM5HT.js.map → chunk-ZUQX7XHJ.js.map} +0 -0
|
@@ -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
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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.
|
|
136
|
-
*
|
|
137
|
-
*
|
|
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.
|
|
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.
|
|
213
|
-
* three
|
|
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
|
|
266
|
-
*
|
|
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
|
|
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 ?
|
|
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
|
-
<
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
</
|
|
382
|
+
</GroupGrid>
|
|
355
383
|
</CellConfigProvider>
|
|
356
384
|
</ListRailsContext.Provider>
|
|
357
385
|
);
|
|
@@ -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",
|
|
@@ -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",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-export.tsx"],"sourcesContent":["\"use client\";\n\nimport DownloadRoundedIcon from \"@mui/icons-material/DownloadRounded\";\nimport KeyboardArrowDownRoundedIcon from \"@mui/icons-material/KeyboardArrowDownRounded\";\nimport CircularProgress from \"@mui/material/CircularProgress/index.js\";\nimport Popover from \"@mui/material/Popover/index.js\";\nimport { useTheme, type Theme } from \"@mui/material/styles/index.js\";\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\";\nimport { rem, sxRem } from \"../../../tokens/relative\";\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 const theme = useTheme();\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={rem(theme, 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: sxRem(13) }}>\n {copy.export.formats[format]?.label ?? format}\n </Box>\n <Box component=\"span\" sx={{ fontSize: sxRem(11), 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: sxRem(260), maxWidth: (theme: Theme) => `calc(100vw - ${rem(theme, 32)})` } } }}\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"],"mappings":"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","names":["default"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/list-card-cells.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { sxRem } from \"../../../tokens/relative\";\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: sxRem(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: sxRem(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"],"mappings":";;;;;;;;AAEA,SAAS,eAAe,kBAAkC;AAgFjD,SAwEL,UAxEK,KAkCL,YAlCK;AA3BT,IAAM,cAAc,EAAE,OAAO,cAAc,QAAQ,UAAU,KAAK,WAAW;AAC7E,IAAM,aAAa,EAAE,OAAO,QAAQ,QAAQ,UAAU,KAAK,QAAQ;AAG5D,IAAM,qBAAqB;AAG3B,SAAS,WAAW,OAAmE;AAC5F,UAAQ,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,kBAAkB;AACrE;AASA,IAAM,oBAAoB,cAA2D,IAAI;AAElF,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGsB;AACpB,SAAO,oBAAC,kBAAkB,UAAlB,EAA2B,OAAO,SAAS,MAAO,UAAS;AACrE;AAGO,SAAS,gBAA6D;AAC3E,SAAO,WAAW,iBAAiB;AACrC;AAUA,SAAS,KAAwC;AAAA,EAC/C;AAAA,EACA;AACF,GAGsB;AACpB,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,UAAU,UAAU,QAAQ,EAAE,oBAAoB,eAAe,IAAI,CAAC;AAC5E,QAAM,QAAQ;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AACA,QAAM,YAAY,OAAO,YAAY,GAAG;AACxC,SACE;AAAA,IAACA;AAAA,IAAA;AAAA,MACC,aAAW,QAAQ,OAAO,EAAE;AAAA,MAC5B,IAAI;AAAA,QACF,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY,YAAY,KAAK;AAAA,QAC7B,gBAAgB;AAAA,QAChB,WAAW,WAAW,KAAK;AAAA,MAC7B;AAAA,MAEA;AAAA;AAAA,UAACA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI,EAAE,GAAG,OAAO,UAAU,MAAM,EAAE,GAAG,YAAY,OAAO,SAAS,MAAM,KAAK,YAAY,MAAM,GAAG,QAAQ;AAAA,YAExG,iBAAO,QAAQ,GAAG;AAAA;AAAA,QACrB;AAAA,QACC,aAAa,QACZ;AAAA,UAACA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI,EAAE,GAAG,OAAO,UAAU,MAAM,IAAI,GAAG,YAAY,KAAK,OAAO,kBAAkB,GAAG,QAAQ;AAAA,YAE3F;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAGO,SAAS,cAAiD;AAAA,EAC/D;AAAA,EACA;AACF,GAGsB;AACpB,SACE,gCACG,gBAAM,IAAI,CAAC,WACV,oBAAC,QAAqB,QAAgB,OAA3B,OAAO,EAA8B,CACjD,GACH;AAEJ;","names":["default"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/en-US.data-display.ts"],"sourcesContent":["/**\n * The en-US pack for the data-display family. Split the same way\n * `pt-BR.data-display.ts` is — see `en-US.ts` for why.\n */\nimport type { DataViewsCopy } from \"./components/data-display/DataViews/data-views-copy\";\nimport type {\n CarouselCopy,\n DataGridCopy,\n DataStateCopy,\n LightboxCopy,\n MapPreviewCopy,\n TimingDiagramCopy,\n} from './copy';\nimport { EN_US_TABLE_FILTER_COPY } from './en-US.layout';\nimport {\n EN_US_CATEGORY_SELECT_COPY,\n EN_US_CONFIRM_ACTION_COPY,\n EN_US_SAVED_VIEWS_LABELS,\n} from './en-US.shared';\n\nexport const EN_US_LIGHTBOX_COPY: LightboxCopy = {\n close: \"Close\",\n previous: \"Previous\",\n next: \"Next\",\n zoomIn: \"Zoom in\",\n zoomOut: \"Zoom out\",\n resetZoom: \"Reset zoom\",\n play: \"Start the slideshow\",\n pause: \"Pause the slideshow\",\n dialogLabel: \"Lightbox\",\n itemPosition: (index, total) => `Item ${index} of ${total}`,\n videoFallback: (index, total) => `Video ${index} of ${total}`,\n imageFallback: (index, total) => `Image ${index} of ${total}`,\n thumbnailFallback: (index) => `Thumbnail ${index}`,\n};\n\nexport const EN_US_DATA_GRID_COPY: DataGridCopy = {\n sortBy: (header) => `Sort by ${header}`,\n selectRow: (rowNumber) => `Select row ${rowNumber}`,\n selectAllRows: \"Select all rows\",\n expandRow: \"Expand row\",\n collapseRow: \"Collapse row\",\n gridLabel: \"Data grid\",\n};\n\nexport const EN_US_MAP_PREVIEW_COPY: MapPreviewCopy = {\n zoomIn: \"Zoom in\",\n zoomOut: \"Zoom out\",\n center: \"Centre the map\",\n mapType: \"Change the map type\",\n fullscreen: \"Full screen\",\n search: \"Search for an address\",\n};\n\nexport const EN_US_CAROUSEL_COPY: CarouselCopy = {\n previous: \"Previous\",\n next: \"Next\",\n};\n\nexport const EN_US_TIMING_DIAGRAM_COPY: TimingDiagramCopy = {\n regionLabel: \"Timing diagram\",\n heading: \"Request timing\",\n dns: \"DNS Lookup\",\n connect: \"Connection\",\n ssl: \"SSL/TLS\",\n request: \"Request\",\n response: \"Response\",\n total: (formatted) => `Total: ${formatted}`,\n totalTime: (formatted) => `Total Time: ${formatted}`,\n};\n\nexport const EN_US_DATA_STATE_COPY: DataStateCopy = {\n empty: \"Nothing here\",\n loading: \"Loading…\",\n endOfList: \"No more items to load\",\n dismissAlert: \"Dismiss\",\n dismissBanner: \"Dismiss this banner\",\n};\n\nexport const EN_US_DATA_VIEWS_COPY: DataViewsCopy = {\n savedViewsMenu: EN_US_SAVED_VIEWS_LABELS,\n confirmAction: EN_US_CONFIRM_ACTION_COPY,\n categorySelect: EN_US_CATEGORY_SELECT_COPY,\n board: {\n countOnPage: (label, count) => `${label}: ${count} on this page`,\n onThisPage: (count) => `${count} on this page`,\n pageSum: (sum) => `This page totals ${sum}`,\n emptyColumn: \"Nothing at this stage\",\n pageScopeNote: \"The counts and totals below cover only the items on this page.\",\n },\n deleteView: {\n title: \"Delete view\",\n target: (viewName) => `Delete \"${viewName}\"?`,\n sharedWarning: \"This view is shared — the team will lose access to it.\",\n // `entityLabel` is the HOST's word for what the rows are, so the sentence is\n // built around it rather than naming a noun of its own.\n rowsUnaffected: (entityLabel) =>\n `${entityLabel} are not affected; only the saved slice is removed.`,\n confirm: \"Delete view\",\n cancel: \"Cancel\",\n },\n manageViews: {\n title: \"Manage views\",\n empty: \"No saved views.\",\n edit: \"Edit\",\n defaultTag: \"Default\",\n otherUserTag: \"Another user's\",\n deleteTitle: \"Delete this saved view?\",\n deleteBody: \"The filters and columns it holds are lost. This cannot be undone.\",\n deleteConfirm: \"Delete\",\n },\n saveView: {\n sharedDescription: \"Anyone in the store will be able to open and use this view.\",\n setDefaultTitle: \"Set as default\",\n setDefaultDescription: \"This screen opens on this view instead of the Main view.\",\n previewHeading: \"What this view holds\",\n previewUnchanged: \"Nothing has changed — this view will match the Main view.\",\n sortRowLabel: \"Sorting\",\n saveFailed: \"Could not save the view.\",\n titleEditing: \"Edit view\",\n titleCreating: \"Save view\",\n descriptionLabel: \"Description — optional\",\n descriptionPlaceholder: \"What this view is for\",\n submitEditing: \"Save changes\",\n submitCreating: \"Save view\",\n nameLabel: \"Name\",\n cancel: \"Cancel\",\n pinnedTitle: \"Pin to the sidebar\",\n pinnedDescription: \"Appears as a shortcut in the menu, under this screen.\",\n sharedTitle: \"Share with the team\",\n namePlaceholder: \"e.g. Declined card payments this week\",\n previewFilters: \"Filters\",\n previewHiddenColumns: \"Hidden columns\",\n },\n columns: {\n visibleCount: (visible, total) => `${visible} of ${total} visible`,\n reset: \"Default\",\n showAll: \"Show all\",\n dragHint: \"Drag to reorder the columns.\",\n moveUp: (columnLabel) => `Move ${columnLabel} up`,\n moveDown: (columnLabel) => `Move ${columnLabel} down`,\n },\n display: {\n sortTab: \"Sort\",\n columnsTab: \"Columns\",\n panelTab: \"Display\",\n direction: \"Direction\",\n layoutHints: {\n table: \"Comparable columns, good for scanning numbers.\",\n list: \"One row per item, with the key fields.\",\n cards: \"Larger blocks, good for a handful of items.\",\n board: \"A column per stage, for tracking what is where.\",\n },\n densityHeadings: {\n table: \"Row height\",\n list: \"Row height\",\n cards: \"Cards per row\",\n board: \"Column width\",\n },\n densityLabels: {\n table: { compact: \"Low\", cozy: \"Medium\", comfortable: \"High\" },\n list: { compact: \"Low\", cozy: \"Medium\", comfortable: \"High\" },\n cards: { compact: \"Many\", cozy: \"Some\", comfortable: \"Few\" },\n board: { compact: \"Narrow\", cozy: \"Medium\", comfortable: \"Wide\" },\n },\n boardUnavailable: \"This screen declares no stages, so it offers no board.\",\n densityUnavailableNarrow:\n \"One card per row at this width — density returns on larger screens.\",\n trigger: \"Display\",\n fieldHeading: \"Field\",\n formatHeading: \"Format\",\n cardZoom: \"Card size\",\n },\n export: {\n formats: {\n // The extension is the file's, not a word: it stays as it is written on\n // disk in every language.\n json: { label: \"JSON (.json)\", hint: \"For integrations\" },\n },\n visibleColumns: (columnCount) => `${columnCount} visible columns, in their current order`,\n trigger: \"Export\",\n triggerLabel: \"Export\",\n },\n tableFilter: EN_US_TABLE_FILTER_COPY,\n grid: {\n ...EN_US_DATA_GRID_COPY,\n rowActions: \"Actions\",\n bulkActions: (selectedCount) => `Actions (${selectedCount}) ▾`,\n emptyFilteredTitle: \"No results for these filters\",\n emptyFilteredHint: \"Adjust or remove the filters.\",\n emptyFilteredAction: \"Clear filters\",\n },\n filters: {\n moreFilters: (count) => `More filters: ${count} did not fit in the bar`,\n moreFiltersApplied: (count, appliedCount) =>\n `More filters: ${count} did not fit in the bar, ${appliedCount} applied`,\n moreTriggerLabel: \"More\",\n moreHeading: \"More filters\",\n overflowNote: \"did not fit in the bar\",\n rangeEnd: \"To\",\n rangeInvalid: \"The start must be earlier than the end.\",\n rangeInclusiveNote: \"Both dates are included in the result.\",\n rangeStart: \"From\",\n // The mask is what the reader TYPES, so it follows their own date order\n // rather than being carried over. A translated label above an unchanged\n // mask is the shape that gets a date entered backwards.\n dayMask: \"mm/dd/yyyy\",\n clearAllFilters: \"Clear all filters\",\n // The KEYS are the package's own preset ids and stay as they are — the\n // surface matches on them. Only the labels beside them are words.\n rangePresets: {\n hoje: \"Today\",\n ontem: \"Yesterday\",\n semana: \"This week\",\n mes: \"This month\",\n ano: \"This year\",\n },\n scopesLabel: \"Status\",\n panelTitle: \"Filters\",\n clear: \"Clear\",\n clearAll: \"Clear filters\",\n clearRange: (label) => `Clear ${label}`,\n allOption: \"All\",\n optionSearchPlaceholder: \"Search…\",\n optionsEmpty: \"No results\",\n optionsHeading: \"Options\",\n },\n selection: {\n selectAllOnPage: \"Select all on this page\",\n clearSelection: \"Clear selection\",\n selectAll: \"Select all\",\n onThisPage: (count) => `${count} on this page`,\n selectedCount: (count) => `${count} ${count === 1 ? \"item selected\" : \"items selected\"}`,\n selectRow: \"Select\",\n expandRow: \"Expand details\",\n collapseRow: \"Collapse details\",\n },\n nav: {\n mainView: \"Main view\",\n defaultTag: \"Default\",\n viewOptions: (viewName) => `${viewName} options`,\n emptyHint: \"No saved views. Adjust filters, columns or sorting and save below.\",\n setDefault: \"Set as default\",\n deleteView: \"Delete view\",\n unsavedChanges: \"Unsaved changes\",\n label: \"View\",\n update: \"Update view\",\n save: \"Save view\",\n saveAs: \"Save as new\",\n reset: \"Reset\",\n updateFailed: \"Could not update the view\",\n dismissError: \"Dismiss\",\n goBack: \"Back\",\n pageSize: \"Show:\",\n saveFailed: \"Could not save the change to the view.\",\n editView: \"Rename and edit\",\n pinToSidebar: \"Pin to the sidebar\",\n shareWithTeam: \"Share with the team\",\n },\n search: {\n placeholder: \"Search…\",\n allColumnsLabel: \"Search every column\",\n keywordPlaceholder: \"Press Enter to filter\",\n open: \"Search\",\n close: \"Close search\",\n clear: \"Clear search\",\n },\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/base-list-card-gutters.tsx"],"sourcesContent":["\"use client\";\n\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\nimport IconButton from \"@mui/material/IconButton/index.js\";\n\nimport { Checkbox } from \"../../form/Checkbox\";\nimport { Box } from \"../../../mui/Box\";\nimport { sxRem } from \"../../../tokens/relative\";\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 = sxRem(-9);\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"],"mappings":";;;;;;;;;;;;;;;;;AAEA,OAAO,4BAA4B;AACnC,OAAO,gBAAgB;AAwCiB;AAZxC,IAAM,eAAe,MAAM,EAAE;AAGtB,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,GAI6B;AAC3B,MAAI,CAAC,KAAK,UAAW,QAAO,UAAU,oBAACA,UAAA,EAAI,aAAU,QAAO,IAAK;AACjE;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE;AAAA,MAACA;AAAA,MAAA;AAAA,QACC,aAAU;AAAA,QACV,IAAI,EAAE,UAAU,YAAY,QAAQ,GAAG,SAAS,QAAQ,YAAY,SAAS;AAAA,QAE7E;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,KAAK;AAAA,YAClB,OAAO,KAAK,gBAAgB;AAAA,YAC5B;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA;AAEJ;AAGO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAM6B;AAC3B,QAAM,OAAO,iBAAiB;AAC9B,MAAI,CAAC,WAAY,QAAO,UAAU,oBAACA,UAAA,EAAI,aAAU,UAAS,IAAK;AAC/D;AAAA;AAAA,IAEE;AAAA,MAACA;AAAA,MAAA;AAAA,QACC,aAAU;AAAA,QACV,IAAI,EAAE,UAAU,YAAY,QAAQ,GAAG,IAAI,cAAc,SAAS,OAAO;AAAA,QAEzE;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,MAAM,iBAAiB;AAAA,YACjC,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,+BAAiB,KAAK;AAAA,YACxB;AAAA,YACA,MAAK;AAAA,YACL,eAAa;AAAA,YACb,cAAY,KAAK,UAAU;AAAA;AAAA,QAC7B;AAAA;AAAA,IACF;AAAA;AAEJ;AAsBO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQ6B;AAC3B,QAAM,OAAO,iBAAiB;AAC9B,MAAI,CAAC,WAAY,QAAO,UAAU,oBAACA,UAAA,EAAI,aAAU,YAAW,IAAK;AACjE;AAAA;AAAA;AAAA;AAAA,IAIE;AAAA,MAACA;AAAA,MAAA;AAAA,QACC,aAAU;AAAA,QACV,IAAI,EAAE,UAAU,YAAY,QAAQ,GAAG,SAAS,QAAQ,YAAY,SAAS;AAAA,QAE7E;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,iBAAe,WAAW,WAAW;AAAA,YACrC,cAAY,WAAW,KAAK,UAAU,cAAc,KAAK,UAAU;AAAA,YACnE,eAAa;AAAA,YACb,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,uBAAS;AAAA,YACX;AAAA,YAIA,WAAW,CAAC,UAAU,MAAM,gBAAgB;AAAA,YAC5C,IAAI;AAAA,cACF,GAAG;AAAA,cACH,WAAW,WAAW,kBAAkB;AAAA,cACxC,YAAY;AAAA;AAAA;AAAA,cAGZ,2CAA2C,EAAE,YAAY,OAAO;AAAA,YAClE;AAAA,YAEA,8BAAC,0BAAuB,UAAS,SAAQ;AAAA;AAAA,QAC3C;AAAA;AAAA,IACF;AAAA;AAEJ;","names":["default"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pt-BR.data-display.ts"],"sourcesContent":["/**\n * The pt-BR pack for the data-display family. Split out of `pt-BR.ts`, which is a\n * barrel over this folder — see that file for why.\n */\nimport type { DataViewsCopy } from \"./components/data-display/DataViews/data-views-copy\";\nimport type {\n CarouselCopy,\n DataGridCopy,\n DataStateCopy,\n LightboxCopy,\n MapPreviewCopy,\n TimingDiagramCopy,\n} from './copy';\nimport { PT_BR_TABLE_FILTER_COPY } from './pt-BR.layout';\nimport {\n PT_BR_CATEGORY_SELECT_COPY,\n PT_BR_CONFIRM_ACTION_COPY,\n PT_BR_SAVED_VIEWS_LABELS,\n} from './pt-BR.shared';\n\nexport const PT_BR_LIGHTBOX_COPY: LightboxCopy = {\n close: \"Fechar\",\n previous: \"Anterior\",\n next: \"Próximo\",\n zoomIn: \"Aproximar\",\n zoomOut: \"Afastar\",\n resetZoom: \"Restaurar o zoom\",\n play: \"Iniciar a apresentação\",\n pause: \"Pausar a apresentação\",\n dialogLabel: \"Galeria de imagens\",\n itemPosition: (index, total) => `Item ${index} de ${total}`,\n videoFallback: (index, total) => `Vídeo ${index} de ${total}`,\n imageFallback: (index, total) => `Imagem ${index} de ${total}`,\n thumbnailFallback: (index) => `Miniatura ${index}`,\n};\n\nexport const PT_BR_DATA_GRID_COPY: DataGridCopy = {\n sortBy: (header) => `Ordenar por ${header}`,\n selectRow: (rowNumber) => `Selecionar linha ${rowNumber}`,\n selectAllRows: \"Selecionar todas as linhas\",\n expandRow: \"Expandir linha\",\n collapseRow: \"Recolher linha\",\n gridLabel: \"Grade de dados\",\n};\n\nexport const PT_BR_MAP_PREVIEW_COPY: MapPreviewCopy = {\n zoomIn: \"Aproximar\",\n zoomOut: \"Afastar\",\n center: \"Centralizar o mapa\",\n mapType: \"Trocar o tipo de mapa\",\n fullscreen: \"Tela cheia\",\n search: \"Buscar endereço\",\n};\n\nexport const PT_BR_CAROUSEL_COPY: CarouselCopy = {\n previous: \"Anterior\",\n next: \"Próximo\",\n};\n\nexport const PT_BR_TIMING_DIAGRAM_COPY: TimingDiagramCopy = {\n regionLabel: \"Diagrama de tempos\",\n heading: \"Tempo da requisição\",\n dns: \"Busca de DNS\",\n connect: \"Conexão\",\n ssl: \"SSL/TLS\",\n request: \"Requisição\",\n response: \"Resposta\",\n total: (formatted) => `Total: ${formatted}`,\n totalTime: (formatted) => `Tempo total: ${formatted}`,\n};\n\nexport const PT_BR_DATA_STATE_COPY: DataStateCopy = {\n empty: \"Nenhum dado por aqui\",\n loading: \"Carregando…\",\n endOfList: \"Não há mais itens para carregar\",\n dismissAlert: \"Fechar o aviso\",\n dismissBanner: \"Fechar a faixa\",\n};\n\nexport const PT_BR_DATA_VIEWS_COPY: DataViewsCopy = {\n savedViewsMenu: PT_BR_SAVED_VIEWS_LABELS,\n confirmAction: PT_BR_CONFIRM_ACTION_COPY,\n categorySelect: PT_BR_CATEGORY_SELECT_COPY,\n board: {\n countOnPage: (label, count) => `${label}: ${count} nesta página`,\n onThisPage: (count) => `${count} nesta página`,\n pageSum: (sum) => `Soma desta página: ${sum}`,\n emptyColumn: \"Nada nesta etapa\",\n pageScopeNote:\n \"As contagens e somas abaixo referem-se apenas aos itens desta página.\",\n },\n deleteView: {\n title: \"Excluir visão\",\n target: (viewName) => `Excluir \"${viewName}\"?`,\n sharedWarning: \"Esta visão está compartilhada — a equipe perderá o acesso a ela.\",\n rowsUnaffected: (entityLabel) =>\n `${entityLabel} não são afetados; apenas o recorte salvo é removido.`,\n confirm: \"Excluir visão\",\n cancel: \"Cancelar\",\n },\n manageViews: {\n title: \"Gerenciar visões\",\n empty: \"Nenhuma visão salva.\",\n edit: \"Editar\",\n defaultTag: \"Padrão\",\n otherUserTag: \"De outro usuário\",\n deleteTitle: \"Excluir a visão salva?\",\n deleteBody: \"Os filtros e colunas guardados nela são perdidos. Não é possível restaurar.\",\n deleteConfirm: \"Excluir\",\n },\n saveView: {\n sharedDescription: \"Qualquer pessoa da loja poderá abrir e usar esta visão.\",\n setDefaultTitle: \"Definir como padrão\",\n setDefaultDescription: \"Esta tela abre nesta visão em vez da Visão principal.\",\n previewHeading: \"O que esta visão guarda\",\n previewUnchanged: \"Nada foi alterado — esta visão ficará igual à Visão principal.\",\n sortRowLabel: \"Ordenação\",\n saveFailed: \"Não foi possível salvar a visão.\",\n titleEditing: \"Editar visão\",\n titleCreating: \"Salvar visão\",\n descriptionLabel: \"Descrição — opcional\",\n descriptionPlaceholder: \"Para que serve esta visão\",\n submitEditing: \"Salvar alterações\",\n submitCreating: \"Salvar visão\",\n nameLabel: \"Nome\",\n cancel: \"Cancelar\",\n pinnedTitle: \"Fixar na barra lateral\",\n pinnedDescription: \"Aparece como atalho no menu, abaixo desta tela.\",\n sharedTitle: \"Compartilhar com a equipe\",\n namePlaceholder: \"Ex.: Recusados no PIX desta semana\",\n previewFilters: \"Filtros\",\n previewHiddenColumns: \"Colunas ocultas\",\n },\n columns: {\n visibleCount: (visible, total) => `${visible} de ${total} visíveis`,\n reset: \"Padrão\",\n showAll: \"Mostrar todas\",\n dragHint: \"Arraste para reordenar as colunas.\",\n moveUp: (columnLabel) => `Mover ${columnLabel} para cima`,\n moveDown: (columnLabel) => `Mover ${columnLabel} para baixo`,\n },\n display: {\n sortTab: \"Ordenar\",\n columnsTab: \"Colunas\",\n panelTab: \"Exibição\",\n direction: \"Direção\",\n layoutHints: {\n table: \"Colunas comparáveis, boa para varrer números.\",\n list: \"Uma linha por item, com os dados principais.\",\n cards: \"Blocos maiores, bom para poucos itens.\",\n board: \"Colunas por etapa, para acompanhar o que está onde.\",\n },\n densityHeadings: {\n table: \"Altura das linhas\",\n list: \"Altura das linhas\",\n cards: \"Cards por linha\",\n board: \"Largura das colunas\",\n },\n densityLabels: {\n table: { compact: \"Baixa\", cozy: \"Média\", comfortable: \"Alta\" },\n list: { compact: \"Baixa\", cozy: \"Média\", comfortable: \"Alta\" },\n cards: { compact: \"Muitos\", cozy: \"Médio\", comfortable: \"Poucos\" },\n board: { compact: \"Estreita\", cozy: \"Média\", comfortable: \"Larga\" },\n },\n boardUnavailable: \"Esta tela não declara etapas, então não oferece quadro.\",\n densityUnavailableNarrow:\n \"Um card por linha nesta largura — a densidade volta em telas maiores.\",\n trigger: \"Exibir\",\n fieldHeading: \"Campo\",\n formatHeading: \"Formato\",\n cardZoom: \"Tamanho dos cards\",\n },\n export: {\n formats: {\n json: { label: \"JSON (.json)\", hint: \"Para integrações\" },\n },\n visibleColumns: (columnCount) => `${columnCount} colunas visíveis, na ordem atual`,\n trigger: \"Exportar\",\n triggerLabel: \"Exportar\",\n },\n tableFilter: PT_BR_TABLE_FILTER_COPY,\n grid: {\n ...PT_BR_DATA_GRID_COPY,\n rowActions: \"Ações\",\n bulkActions: (selectedCount) => `Ações (${selectedCount}) ▾`,\n emptyFilteredTitle: \"Nenhum resultado para esses filtros\",\n emptyFilteredHint: \"Ajuste ou remova os filtros.\",\n emptyFilteredAction: \"Limpar filtros\",\n },\n filters: {\n moreFilters: (count) => `Mais filtros: ${count} sem espaço na barra`,\n moreFiltersApplied: (count, appliedCount) =>\n `Mais filtros: ${count} sem espaço na barra, ${appliedCount} aplicado(s)`,\n moreTriggerLabel: \"Mais\",\n moreHeading: \"Mais filtros\",\n overflowNote: \"sem espaço na barra\",\n rangeEnd: \"Até\",\n rangeInvalid: \"O início precisa ser menor que o fim.\",\n rangeInclusiveNote: \"Ambas as datas entram no resultado.\",\n rangeStart: \"De\",\n dayMask: \"dd/mm/aaaa\",\n clearAllFilters: \"Limpar todos os filtros\",\n rangePresets: {\n hoje: \"Hoje\",\n ontem: \"Ontem\",\n semana: \"Esta semana\",\n mes: \"Este mês\",\n ano: \"Este ano\",\n },\n scopesLabel: \"Situação\",\n panelTitle: \"Filtros\",\n clear: \"Limpar\",\n clearAll: \"Limpar filtros\",\n clearRange: (label) => `Limpar ${label}`,\n allOption: \"Todas\",\n optionSearchPlaceholder: \"Buscar…\",\n optionsEmpty: \"Nenhum resultado\",\n optionsHeading: \"Opções\",\n },\n selection: {\n selectAllOnPage: \"Selecionar todos nesta página\",\n clearSelection: \"Limpar seleção\",\n selectAll: \"Selecionar tudo\",\n onThisPage: (count) => `${count} nesta página`,\n selectedCount: (count) => `${count} ${count === 1 ? \"selecionado\" : \"selecionados\"}`,\n selectRow: \"Selecionar\",\n expandRow: \"Expandir detalhes\",\n collapseRow: \"Recolher detalhes\",\n },\n nav: {\n mainView: \"Visão principal\",\n defaultTag: \"Padrão\",\n viewOptions: (viewName) => `Opções de ${viewName}`,\n emptyHint: \"Nenhuma visão salva. Ajuste filtros, colunas ou ordenação e salve abaixo.\",\n setDefault: \"Definir como padrão\",\n deleteView: \"Excluir visão\",\n unsavedChanges: \"Alterações não salvas\",\n label: \"Visão\",\n update: \"Atualizar visão\",\n save: \"Salvar visão\",\n saveAs: \"Salvar como nova\",\n reset: \"Redefinir\",\n updateFailed: \"Não foi possível atualizar a visão\",\n dismissError: \"Fechar o aviso\",\n goBack: \"Voltar\",\n pageSize: \"Mostrar:\",\n saveFailed: \"Não foi possível salvar a alteração da visão.\",\n editView: \"Renomear e editar\",\n pinToSidebar: \"Fixar na barra lateral\",\n shareWithTeam: \"Compartilhar com a equipe\",\n },\n search: {\n placeholder: \"Buscar…\",\n allColumnsLabel: \"Buscar em todas as colunas\",\n keywordPlaceholder: \"Pressione Enter para filtrar\",\n open: \"Buscar\",\n close: \"Fechar busca\",\n clear: \"Limpar busca\",\n },\n};\n"],"mappings":"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","names":[]}
|