@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 +1 -1
- package/README.md +4 -2
- package/dist/components/data/DataTable.svelte +37 -5
- package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
- package/dist/components/data/DataTableSummaries.d.ts +54 -0
- package/dist/components/data/DataTableSummaries.d.ts.map +1 -0
- package/dist/components/data/DataTableSummaries.js +124 -0
- package/dist/components/data/index.d.ts +1 -0
- package/dist/components/data/index.d.ts.map +1 -1
- package/dist/components/data/index.js +1 -0
- package/dist/components/data/types.d.ts +18 -1
- package/dist/components/data/types.d.ts.map +1 -1
- package/dist/components/nav/Tabs.svelte +3 -0
- package/dist/components/ui/Pagination.svelte +16 -3
- package/dist/components/ui/Pagination.svelte.d.ts +6 -0
- package/dist/components/ui/Pagination.svelte.d.ts.map +1 -1
- package/dist/i18n/strings.d.ts +1 -0
- package/dist/i18n/strings.d.ts.map +1 -1
- package/dist/i18n/strings.js +1 -0
- package/package.json +3 -3
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
|
|
1196
|
-
applies density to its sort buttons
|
|
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
|
|
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
|
|
874
|
-
|
|
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;
|
|
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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,8DAA8D;AAC9D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,4EAA4E;IAC5E,UAAU,EAAE,qBAAqB,CAAC;IAClC,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,+BAA+B,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,+BAA+B,GAAG,CAC5C,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gBAAgB,KACtB,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;AAE9E,gEAAgE;AAChE,MAAM,WAAW,mCAAmC;IAClD,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,EAAE,qBAAqB,CAAC;IAClC,oBAAoB,CAAC,EAAE,+BAA+B,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,+EAA+E;AAC/E,MAAM,WAAW,0BAA0B;IACzC,qDAAqD;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qDAAqD;AACrD,MAAM,WAAW,yBAAyB;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,UAAU,GACV,WAAW,GACX,QAAQ,CAAC;AAEb,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,IAAI,EAAE,0BAA0B,CAAC;IACjC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CACZ;QACE;YACE,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;YAC3B,KAAK,EAAE,OAAO,CAAC;SAChB;KACF,CACF,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,GAAG,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5D,6BAA6B;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;IACnD,kFAAkF;IAClF,UAAU,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACnD;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACxC,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,aAAa,CAAC;IACnC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yDAAyD;IACzD,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,wEAAwE;IACxE,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,KAAK,MAAM,CAAC;IAC1D,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC;IACxE,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
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;
|
|
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"}
|
package/dist/i18n/strings.d.ts
CHANGED
|
@@ -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
|
|
1
|
+
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCZ,CAAC"}
|
package/dist/i18n/strings.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-ui",
|
|
3
|
-
"version": "0.55.
|
|
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.
|
|
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.
|
|
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",
|