@happyvertical/smrt-ui 0.55.22 → 0.55.24

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/AGENTS.md CHANGED
@@ -47,7 +47,7 @@ components are exempt — they *are* the primitives.
47
47
  | `./playground` | shared-host previews for the complete foundation catalog; rendered inside the active preset and color scheme |
48
48
  | `./ui` | `Button`, `Card`, `Badge`, `Avatar`, `Chip`, `Skeleton`, `Tooltip`, `Dropdown`/`Menu`, `Popover`, `Disclosure`, `Accordion`, `Tree`, `Pagination`, … |
49
49
  | `./feedback` | `Alert`, `ToastViewport`, `Modal`, `Drawer`/`Sheet`, `ConfirmDialog`, `LoadingOverlay`, `Progress`, `Meter`, `Spinner`, phone surfaces `PhoneSheet` / `WorkingStrip` and the `swipeDismiss` action |
50
- | `./data` | `CollectionToolbar`, `CollectionList`/`ContentList`, `DataTable` and their types — a **component barrel**: it re-exports `.svelte` files, so a plain Node `import()` of it throws `ERR_UNKNOWN_FILE_EXTENSION` |
50
+ | `./data` | `CollectionToolbar`, `CollectionList`/`ContentList`, `DataTable` (footer rows and column `summaries`: [agents/data-table.md](agents/data-table.md)) and their types — a **component barrel**: it re-exports `.svelte` files, so a plain Node `import()` of it throws `ERR_UNKNOWN_FILE_EXTENSION` |
51
51
  | `./data-surface` | **Svelte-free**: registry contracts and shared protocol limits (`DATA_SURFACE_MAX_REQUEST_BYTES`, `DATA_SURFACE_IDENTIFIER_MAX_LENGTH`, …). Server adapters must import these from here, not from `./data` — a server entry that reaches the barrel breaks the `smrt` CLI's plain-Node `.smrt/register.js` load (issue #2924) |
52
52
  | `./layout` | `Container`, `Grid`, `Header`, `Footer`, `PageHeader`, `EmptyState`, … |
53
53
  | `./calendar` | `CalendarView` (time-zone-aware month/week grids + phone agenda) and its Svelte-free date model (`toEntries`, `layoutMonth`, `layoutWeek`, `dateKeyInZone`, …); deprecated `Calendar`, `DayView` |
package/README.md CHANGED
@@ -1192,8 +1192,10 @@ pnpm verify:pack
1192
1192
 
1193
1193
  Set `<ThemeProvider density="touch">` for floor tablets and phones, or set
1194
1194
  `density="touch"` on Input, Select, Textarea, Checkbox, Switch, RadioGroup,
1195
- Button (including links), FilterChips, SegmentedControl, or DataTable. DataTable
1196
- applies density to its sort buttons. Density is independent of existing `size`
1195
+ Button (including links), FilterChips, SegmentedControl, Pagination, or
1196
+ DataTable. DataTable applies density to its sort buttons and passes it to its
1197
+ pager; Pagination raises every page and First/Previous/Next/Last control (links
1198
+ or buttons) to the target size. Density is independent of existing `size`
1197
1199
  props, including native Input/Select sizes. Omitted density inherits; explicitly
1198
1200
  setting `density="comfortable"` opts that control out and keeps its usual size.
1199
1201
  RadioGroup expands each option's clickable label, and Checkbox/Switch expand
@@ -36,6 +36,10 @@ import {
36
36
  resolveDataTableLayout,
37
37
  } from './DataTableLayout.js';
38
38
  import { responsiveColumns } from './DataTableResponsive.js';
39
+ import {
40
+ buildDataTableSummaryRow,
41
+ isNumericSummary,
42
+ } from './DataTableSummaries.js';
39
43
  import {
40
44
  maximumDataTableVirtualScrollTop,
41
45
  resolveDataTableVirtualWindow,
@@ -56,7 +60,8 @@ import type {
56
60
  } from './types.js';
57
61
  import { defaultSort, getNestedValue } from './types.js';
58
62
 
59
- const { t } = useI18n();
63
+ const i18n = useI18n();
64
+ const { t } = i18n;
60
65
 
61
66
  interface ExtendedProps<T> extends DataTableProps<T> {
62
67
  /** Global cell renderer - takes precedence over column.cell */
@@ -67,7 +72,7 @@ interface ExtendedProps<T> extends DataTableProps<T> {
67
72
 
68
73
  let {
69
74
  data = [],
70
- columns = [],
75
+ columns: declaredColumns = [],
71
76
  rowKey,
72
77
  agentAddressable = false,
73
78
  selectable = false,
@@ -94,6 +99,8 @@ let {
94
99
  toolbar,
95
100
  footer,
96
101
  structuralRows = [],
102
+ summaries,
103
+ summaryLabel,
97
104
  visibleColumnIds,
98
105
  loading = false,
99
106
  refreshing = false,
@@ -125,6 +132,18 @@ let {
125
132
 
126
133
  const dataTableId = $props.id();
127
134
 
135
+ // A `sum` / `avg` summary marks a numeric column: right-aligned unless the
136
+ // column says otherwise, so figures and their total line up.
137
+ const columns = $derived(
138
+ summaries
139
+ ? declaredColumns.map((column) =>
140
+ column.align === undefined && isNumericSummary(summaries[column.id])
141
+ ? { ...column, align: 'right' as const }
142
+ : column,
143
+ )
144
+ : declaredColumns,
145
+ );
146
+
128
147
  function legacyModes(): DataTableModes {
129
148
  return {
130
149
  filtering: modes?.filtering ?? 'local',
@@ -870,9 +889,22 @@ const visibleColumns = $derived(dataTableLayout.columns);
870
889
  const dataBodyStructuralRows = $derived(
871
890
  structuralRows.filter((row) => row.kind !== 'footer'),
872
891
  );
873
- const footerStructuralRows = $derived(
874
- structuralRows.filter((row) => row.kind === 'footer'),
892
+ const summaryRow = $derived.by(() =>
893
+ buildDataTableSummaryRow(
894
+ filteredRows.map(({ row }) => row),
895
+ visibleColumns.map((entry) => entry.column),
896
+ summaries,
897
+ {
898
+ id: `${dataTableId}-summary`,
899
+ label: summaryLabel ?? t(M['ui.data_table.total']),
900
+ locale: i18n.locale,
901
+ },
902
+ ),
875
903
  );
904
+ const footerStructuralRows = $derived([
905
+ ...structuralRows.filter((row) => row.kind === 'footer'),
906
+ ...(summaryRow ? [summaryRow] : []),
907
+ ]);
876
908
  const structuralRowCount = $derived(
877
909
  dataBodyStructuralRows.length +
878
910
  footerStructuralRows.length +
@@ -1918,7 +1950,7 @@ $effect(() => {
1918
1950
  {#if canScrollRight}<span>{t(M['ui.data_table.more_columns'])} →</span>{/if}
1919
1951
  </div>
1920
1952
  {/if}
1921
- {#if tableState.pageSize && totalPages && totalPages > 1}<Pagination currentPage={tableState.page} {totalPages} onPageChange={handlePageChange} aria-label={t(M['ui.data_table.pagination'])} />{/if}
1953
+ {#if tableState.pageSize && totalPages && totalPages > 1}<Pagination currentPage={tableState.page} {totalPages} {density} onPageChange={handlePageChange} aria-label={t(M['ui.data_table.pagination'])} />{/if}
1922
1954
 
1923
1955
  <style>
1924
1956
  @layer smrt.reset, smrt.structure, smrt.theme;
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAoChE,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClD,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CACZ;QAAC;YAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YAAC,GAAG,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE;KAAC,CACxE,CAAC;CACH;AAYC,iBAAS,QAAQ,CAAC,CAAC;WA6oDQ,aAAa,CAAC,CAAC,CAAC;;;;;EAAgH;AAC7J,cAAM,iBAAiB,CAAC,CAAC;IACrB,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,QAAQ;IACR,OAAO;CACV;AAED,UAAU,qBAAqB;IAC3B,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5X,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3H,YAAY,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CACjE;AACD,QAAA,MAAM,SAAS,EAAE,qBAAmC,CAAC;AACnC,KAAK,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"DataTable.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAwChE,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAClD,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CACZ;QAAC;YAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YAAC,GAAG,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE;KAAC,CACxE,CAAC;CACH;AAYC,iBAAS,QAAQ,CAAC,CAAC;WA0qDQ,aAAa,CAAC,CAAC,CAAC;;;;;EAAgH;AAC7J,cAAM,iBAAiB,CAAC,CAAC;IACrB,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,QAAQ;IACR,OAAO;CACV;AAED,UAAU,qBAAqB;IAC3B,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5X,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3H,YAAY,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CACjE;AACD,QAAA,MAAM,SAAS,EAAE,qBAAmC,CAAC;AACnC,KAAK,SAAS,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,eAAe,SAAS,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Column summaries for `DataTable` (`summaries` prop): a footer row with a
3
+ * count, sum or average per column, or a caller-computed string.
4
+ *
5
+ * Pure and Svelte-free so the arithmetic is Node-tested. Sums never leave
6
+ * integers while every summed value is a safe integer: money in integer minor
7
+ * units stays in minor units until the column's `summaryFormat` turns it into
8
+ * text, so a footer never adds floating-point cents. A sum that would leave
9
+ * the safe-integer range is refused (`null`, an empty cell) rather than
10
+ * rounded.
11
+ */
12
+ import type { DataTableColumn, DataTableStructuralRow } from './types.js';
13
+ /** A built-in aggregate. */
14
+ export type DataTableSummaryKind = 'sum' | 'count' | 'avg';
15
+ /** A built-in aggregate, or a function that renders the cell from the rows. */
16
+ export type DataTableSummary<T> = DataTableSummaryKind | ((rows: readonly T[]) => string);
17
+ /** Summary per column id. Columns without an entry get an empty footer cell. */
18
+ export type DataTableSummaries<T> = Readonly<Record<string, DataTableSummary<T>>>;
19
+ /** What a column's `summaryFormat` is told about the value it formats. */
20
+ export interface DataTableSummaryFormatContext {
21
+ kind: DataTableSummaryKind;
22
+ columnId: string;
23
+ /** The table's active locale. */
24
+ locale?: string;
25
+ }
26
+ /** True for the aggregates whose cells are numbers (right-aligned by default). */
27
+ export declare function isNumericSummary(summary: unknown): boolean;
28
+ /**
29
+ * Sum of the finite numeric values of `column` (numeric strings count too).
30
+ * Integer-only input stays exact and returns `null` past
31
+ * `Number.MAX_SAFE_INTEGER`; `null` too when no row has a number.
32
+ */
33
+ export declare function sumDataTableColumn<T>(rows: readonly T[], column: DataTableColumn<T>): number | null;
34
+ /** Mean of the finite numeric values of `column`; `null` when there are none. */
35
+ export declare function averageDataTableColumn<T>(rows: readonly T[], column: DataTableColumn<T>): number | null;
36
+ /** The raw value of one summary: a number for the aggregates, text for a function. */
37
+ export declare function summarizeDataTableColumn<T>(rows: readonly T[], column: DataTableColumn<T>, summary: DataTableSummary<T>): number | string | null;
38
+ /** Default text of an aggregate: `Intl.NumberFormat` in the table's locale. */
39
+ export declare function formatDataTableSummary(value: number, context: DataTableSummaryFormatContext): string;
40
+ export interface DataTableSummaryRowOptions {
41
+ /** Structural row id (default `summary`). */
42
+ id?: string;
43
+ /** Row label, announced and shown in the first column when it has no summary. */
44
+ label: string;
45
+ locale?: string;
46
+ }
47
+ /**
48
+ * The footer row for `summaries` over `rows`, as a `footer` structural row
49
+ * (`DataTable` renders it in `<tfoot>`). `null` when no visible column has a
50
+ * summary. Each aggregate goes through the column's `summaryFormat`, else
51
+ * {@link formatDataTableSummary}; a function summary's text is used as is.
52
+ */
53
+ export declare function buildDataTableSummaryRow<T>(rows: readonly T[], columns: readonly DataTableColumn<T>[], summaries: DataTableSummaries<T> | undefined, options: DataTableSummaryRowOptions): DataTableStructuralRow<T> | null;
54
+ //# sourceMappingURL=DataTableSummaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableSummaries.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTableSummaries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG1E,4BAA4B;AAC5B,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAE3D,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B,oBAAoB,GACpB,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AAErC,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,QAAQ,CAC1C,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CACpC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE1D;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,MAAM,GAAG,IAAI,CAef;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,MAAM,GAAG,IAAI,CAUf;AAeD,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxB;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,6BAA6B,GACrC,MAAM,CAQR;AAED,MAAM,WAAW,0BAA0B;IACzC,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,OAAO,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,EACtC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,SAAS,EAC5C,OAAO,EAAE,0BAA0B,GAClC,sBAAsB,CAAC,CAAC,CAAC,GAAG,IAAI,CAgClC"}
@@ -0,0 +1,124 @@
1
+ import { getNestedValue } from './types.js';
2
+ /** True for the aggregates whose cells are numbers (right-aligned by default). */
3
+ export function isNumericSummary(summary) {
4
+ return summary === 'sum' || summary === 'avg';
5
+ }
6
+ function cellValue(row, column) {
7
+ return getNestedValue(row, String(column.accessor ?? column.id));
8
+ }
9
+ /**
10
+ * Sum of the finite numeric values of `column` (numeric strings count too).
11
+ * Integer-only input stays exact and returns `null` past
12
+ * `Number.MAX_SAFE_INTEGER`; `null` too when no row has a number.
13
+ */
14
+ export function sumDataTableColumn(rows, column) {
15
+ let total = 0;
16
+ let seen = false;
17
+ let integers = true;
18
+ for (const row of rows) {
19
+ const value = toNumber(cellValue(row, column));
20
+ if (value === null)
21
+ continue;
22
+ seen = true;
23
+ integers &&= Number.isInteger(value);
24
+ total += value;
25
+ if (integers ? !Number.isSafeInteger(total) : !Number.isFinite(total)) {
26
+ return null;
27
+ }
28
+ }
29
+ return seen ? total : null;
30
+ }
31
+ /** Mean of the finite numeric values of `column`; `null` when there are none. */
32
+ export function averageDataTableColumn(rows, column) {
33
+ let total = 0;
34
+ let count = 0;
35
+ for (const row of rows) {
36
+ const value = toNumber(cellValue(row, column));
37
+ if (value === null)
38
+ continue;
39
+ total += value;
40
+ count += 1;
41
+ }
42
+ return count === 0 ? null : total / count;
43
+ }
44
+ function toNumber(value) {
45
+ if (typeof value === 'number')
46
+ return Number.isFinite(value) ? value : null;
47
+ if (typeof value === 'bigint') {
48
+ const n = Number(value);
49
+ return Number.isSafeInteger(n) ? n : null;
50
+ }
51
+ if (typeof value === 'string' && value.trim() !== '') {
52
+ const n = Number(value);
53
+ return Number.isFinite(n) ? n : null;
54
+ }
55
+ return null;
56
+ }
57
+ /** The raw value of one summary: a number for the aggregates, text for a function. */
58
+ export function summarizeDataTableColumn(rows, column, summary) {
59
+ if (typeof summary === 'function')
60
+ return summary(rows);
61
+ if (summary === 'count')
62
+ return rows.length;
63
+ if (summary === 'sum')
64
+ return sumDataTableColumn(rows, column);
65
+ if (summary === 'avg')
66
+ return averageDataTableColumn(rows, column);
67
+ return null;
68
+ }
69
+ /** Default text of an aggregate: `Intl.NumberFormat` in the table's locale. */
70
+ export function formatDataTableSummary(value, context) {
71
+ try {
72
+ return new Intl.NumberFormat(context.locale, {
73
+ maximumFractionDigits: context.kind === 'avg' ? 2 : 6,
74
+ }).format(value);
75
+ }
76
+ catch {
77
+ return String(value);
78
+ }
79
+ }
80
+ /**
81
+ * The footer row for `summaries` over `rows`, as a `footer` structural row
82
+ * (`DataTable` renders it in `<tfoot>`). `null` when no visible column has a
83
+ * summary. Each aggregate goes through the column's `summaryFormat`, else
84
+ * {@link formatDataTableSummary}; a function summary's text is used as is.
85
+ */
86
+ export function buildDataTableSummaryRow(rows, columns, summaries, options) {
87
+ if (!summaries)
88
+ return null;
89
+ const values = {};
90
+ let any = false;
91
+ for (const column of columns) {
92
+ if (column.hidden)
93
+ continue;
94
+ const summary = summaries[column.id];
95
+ if (summary === undefined)
96
+ continue;
97
+ any = true;
98
+ const raw = summarizeDataTableColumn(rows, column, summary);
99
+ if (raw === null) {
100
+ values[column.id] = '';
101
+ }
102
+ else if (typeof raw === 'string') {
103
+ values[column.id] = raw;
104
+ }
105
+ else {
106
+ const context = {
107
+ kind: summary,
108
+ columnId: column.id,
109
+ locale: options.locale,
110
+ };
111
+ values[column.id] = column.summaryFormat
112
+ ? column.summaryFormat(raw, context)
113
+ : formatDataTableSummary(raw, context);
114
+ }
115
+ }
116
+ if (!any)
117
+ return null;
118
+ return {
119
+ id: options.id ?? 'summary',
120
+ kind: 'footer',
121
+ label: options.label,
122
+ values,
123
+ };
124
+ }
@@ -7,6 +7,7 @@ export { default as DataTable } from './DataTable.svelte';
7
7
  export * from './DataTableController.js';
8
8
  export * from './DataTableIdentity.js';
9
9
  export * from './DataTablePerformance.js';
10
+ export * from './DataTableSummaries.js';
10
11
  export * from './DataTableVirtualization.js';
11
12
  export * from './data-surface.js';
12
13
  export * from './data-table-surface.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/data/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,IAAI,cAAc,EACzB,OAAO,IAAI,WAAW,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/data/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,IAAI,cAAc,EACzB,OAAO,IAAI,WAAW,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
@@ -7,6 +7,7 @@ export { default as DataTable } from './DataTable.svelte';
7
7
  export * from './DataTableController.js';
8
8
  export * from './DataTableIdentity.js';
9
9
  export * from './DataTablePerformance.js';
10
+ export * from './DataTableSummaries.js';
10
11
  export * from './DataTableVirtualization.js';
11
12
  export * from './data-surface.js';
12
13
  export * from './data-table-surface.js';
@@ -4,6 +4,7 @@
4
4
  import type { Snippet } from 'svelte';
5
5
  import type { DataTableCommand, DataTableController, DataTableFilter, DataTableModes, DataTableViewState, DataTableViewStateInput } from './DataTableController.js';
6
6
  import type { DataTableRowKey } from './DataTableIdentity.js';
7
+ import type { DataTableSummaries, DataTableSummaryFormatContext } from './DataTableSummaries.js';
7
8
  import type { DataTableVirtualizationOptions } from './DataTableVirtualization.js';
8
9
  import type { DataSurfaceDescriptor, DataSurfaceRegistry } from './data-surface.js';
9
10
  /** Opt-in mounted-surface wiring for a DataTable instance. */
@@ -127,6 +128,12 @@ export interface DataTableColumn<T> {
127
128
  filterFn?: (row: T, value: unknown, filter: DataTableFilter) => boolean;
128
129
  /** Column class name */
129
130
  className?: string;
131
+ /**
132
+ * Text of this column's `sum` / `count` / `avg` footer cell (the table's
133
+ * `summaries`). A money column keeps integer minor units in `value` and
134
+ * formats them here; without it the number is `Intl.NumberFormat`ted.
135
+ */
136
+ summaryFormat?: (value: number, context: DataTableSummaryFormatContext) => string;
130
137
  }
131
138
  /**
132
139
  * Sort direction
@@ -145,7 +152,7 @@ export interface SortState {
145
152
  * DataTable props
146
153
  */
147
154
  export interface DataTableProps<T> {
148
- /** Sort-control target density; omit to inherit ThemeProvider. */
155
+ /** Sort-control and pager target density; omit to inherit ThemeProvider. */
149
156
  density?: 'comfortable' | 'touch';
150
157
  /** Opt-in container-width column collapse; default keeps horizontal scrolling. */
151
158
  responsiveMode?: 'scroll' | 'hide-columns';
@@ -227,6 +234,16 @@ export interface DataTableProps<T> {
227
234
  }]>;
228
235
  /** Generic report-like rows rendered independently from data row interactions. */
229
236
  structuralRows?: readonly DataTableStructuralRow<T>[];
237
+ /**
238
+ * Column summaries: a `<tfoot>` row with a `count`, `sum` or `avg` per
239
+ * column id, or a function of the rows returning the cell text. Computed
240
+ * over every filtered row (all pages; only the given rows under manual
241
+ * pagination). A `sum` / `avg` column without an explicit `align` is
242
+ * right-aligned. Rendered after any `footer` structural rows.
243
+ */
244
+ summaries?: DataTableSummaries<T>;
245
+ /** Label of the summaries row (default "Total", localized). */
246
+ summaryLabel?: string;
230
247
  /** Controlled visible column ids. Column.hidden is still respected. */
231
248
  visibleColumnIds?: Set<string>;
232
249
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/data/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/data/types.ts"],"names":[],"mappings":"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"}
@@ -280,6 +280,9 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
280
280
  .smrt-tabs__nav {
281
281
  display: flex;
282
282
  width: 100%;
283
+ /* Tabs keep their minimum width; a row wider than a phone scrolls. */
284
+ overflow-x: auto;
285
+ scrollbar-width: thin;
283
286
  }
284
287
  .smrt-tabs__tab-button {
285
288
  flex: 1;
@@ -32,6 +32,12 @@ export interface Props {
32
32
  showFirstLast?: boolean;
33
33
  /** Maximum number of visible page numbers */
34
34
  maxVisible?: number;
35
+ /**
36
+ * Control target density. `touch` raises every page and nav control to
37
+ * `--smrt-touch-target-min`; omit to inherit the ThemeProvider setting
38
+ * (`--smrt-control-target-min`).
39
+ */
40
+ density?: 'comfortable' | 'touch';
35
41
  }
36
42
 
37
43
  const {
@@ -42,6 +48,7 @@ const {
42
48
  'aria-label': ariaLabel = 'Pagination',
43
49
  showFirstLast = true,
44
50
  maxVisible = 5,
51
+ density,
45
52
  }: Props = $props();
46
53
 
47
54
  function getPageUrl(page: number): string {
@@ -106,7 +113,7 @@ const isLastPage = $derived(currentPage === totalPages);
106
113
  </script>
107
114
 
108
115
  {#if totalPages > 1}
109
- <nav class="pagination" aria-label={ariaLabel} data-smrt-component="Pagination">
116
+ <nav class="pagination" data-density={density} aria-label={ariaLabel} data-smrt-component="Pagination">
110
117
  <!-- First page -->
111
118
  {#if showFirstLast}
112
119
  {#if onPageChange}
@@ -202,11 +209,16 @@ const isLastPage = $derived(currentPage === totalPages);
202
209
  flex-wrap: wrap;
203
210
  }
204
211
 
212
+ .pagination[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min); }
213
+ .pagination[data-density='comfortable'] { --smrt-control-target-min: 0px; }
214
+
205
215
  .page-numbers {
206
216
  list-style: none;
207
217
  display: flex;
208
218
  align-items: center;
209
219
  gap: var(--smrt-spacing-1, 0.25rem);
220
+ flex-wrap: wrap;
221
+ justify-content: center;
210
222
  margin: 0;
211
223
  padding: 0;
212
224
  }
@@ -220,8 +232,9 @@ const isLastPage = $derived(currentPage === totalPages);
220
232
  display: inline-flex;
221
233
  align-items: center;
222
234
  justify-content: center;
223
- min-width: 2.25rem;
235
+ min-width: max(2.25rem, var(--smrt-control-target-min));
224
236
  height: 2.25rem;
237
+ min-height: var(--smrt-control-target-min);
225
238
  padding: 0 var(--smrt-spacing-2, 0.5rem);
226
239
  border-radius: var(--smrt-radius-small, 0.25rem);
227
240
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
@@ -286,7 +299,7 @@ const isLastPage = $derived(currentPage === totalPages);
286
299
 
287
300
  @media (max-width: 480px) {
288
301
  .page-link {
289
- min-width: 2rem;
302
+ min-width: max(2rem, var(--smrt-control-target-min));
290
303
  height: 2rem;
291
304
  font-size: var(--smrt-typography-body-medium-size, 0.8125rem);
292
305
  }
@@ -14,6 +14,12 @@ export interface Props {
14
14
  showFirstLast?: boolean;
15
15
  /** Maximum number of visible page numbers */
16
16
  maxVisible?: number;
17
+ /**
18
+ * Control target density. `touch` raises every page and nav control to
19
+ * `--smrt-touch-target-min`; omit to inherit the ThemeProvider setting
20
+ * (`--smrt-control-target-min`).
21
+ */
22
+ density?: 'comfortable' | 'touch';
17
23
  }
18
24
  declare const Pagination: import("svelte").Component<Props, {}, "">;
19
25
  type Pagination = ReturnType<typeof Pagination>;
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Pagination.svelte.ts"],"names":[],"mappings":"AAkBA,qCAAqC;AACrC,MAAM,WAAW,KAAK;IACpB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwKD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"Pagination.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Pagination.svelte.ts"],"names":[],"mappings":"AAkBA,qCAAqC;AACrC,MAAM,WAAW,KAAK;IACpB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;CACnC;AAyKD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -32,5 +32,6 @@ export declare const M: {
32
32
  readonly 'ui.data_table.subtotal': "ui.data_table.subtotal";
33
33
  readonly 'ui.data_table.aggregate': "ui.data_table.aggregate";
34
34
  readonly 'ui.data_table.footer_row': "ui.data_table.footer_row";
35
+ readonly 'ui.data_table.total': "ui.data_table.total";
35
36
  };
36
37
  //# sourceMappingURL=strings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCZ,CAAC"}
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCZ,CAAC"}
@@ -45,4 +45,5 @@ export const M = defineMessages({
45
45
  'ui.data_table.subtotal': 'Subtotal',
46
46
  'ui.data_table.aggregate': 'Aggregate',
47
47
  'ui.data_table.footer_row': 'Footer',
48
+ 'ui.data_table.total': 'Total',
48
49
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-ui",
3
- "version": "0.55.22",
3
+ "version": "0.55.24",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Domain-agnostic Svelte 5 UI runtime for SMRT: primitives, i18n client, theme system, and module UI registry",
6
6
  "type": "module",
@@ -155,7 +155,7 @@
155
155
  "access": "public"
156
156
  },
157
157
  "dependencies": {
158
- "@happyvertical/smrt-types": "0.55.22",
158
+ "@happyvertical/smrt-types": "0.55.24",
159
159
  "esm-env": "^1.2.2"
160
160
  },
161
161
  "peerDependencies": {
@@ -171,7 +171,7 @@
171
171
  }
172
172
  },
173
173
  "devDependencies": {
174
- "@happyvertical/speech": "^0.103.5",
174
+ "@happyvertical/speech": "^0.103.6",
175
175
  "@sveltejs/package": "^2.5.8",
176
176
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
177
177
  "@testing-library/jest-dom": "^7.0.1",