@happyvertical/smrt-ui 0.55.23 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/AGENTS.md +2 -1
  2. package/README.md +4 -2
  3. package/dist/charts/Chart.svelte +285 -0
  4. package/dist/charts/Chart.svelte.d.ts +15 -0
  5. package/dist/charts/Chart.svelte.d.ts.map +1 -0
  6. package/dist/charts/format.d.ts +13 -0
  7. package/dist/charts/format.d.ts.map +1 -0
  8. package/dist/charts/format.js +48 -0
  9. package/dist/charts/index.d.ts +5 -0
  10. package/dist/charts/index.d.ts.map +1 -0
  11. package/dist/charts/index.js +2 -0
  12. package/dist/charts/strings.d.ts +10 -0
  13. package/dist/charts/strings.d.ts.map +1 -0
  14. package/dist/charts/strings.js +10 -0
  15. package/dist/charts/types.d.ts +13 -0
  16. package/dist/charts/types.d.ts.map +1 -0
  17. package/dist/charts/types.js +1 -0
  18. package/dist/components/data/DataTable.svelte +38 -6
  19. package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
  20. package/dist/components/data/DataTableSummaries.d.ts +54 -0
  21. package/dist/components/data/DataTableSummaries.d.ts.map +1 -0
  22. package/dist/components/data/DataTableSummaries.js +124 -0
  23. package/dist/components/data/index.d.ts +1 -0
  24. package/dist/components/data/index.d.ts.map +1 -1
  25. package/dist/components/data/index.js +1 -0
  26. package/dist/components/data/types.d.ts +18 -1
  27. package/dist/components/data/types.d.ts.map +1 -1
  28. package/dist/components/feedback/ConfirmDialog.svelte +1 -1
  29. package/dist/components/forms/Radio.svelte +1 -1
  30. package/dist/components/forms/SegmentedControl.svelte +1 -1
  31. package/dist/components/forms/Textarea.svelte +1 -1
  32. package/dist/components/layout/EmptyState.svelte +2 -2
  33. package/dist/components/nav/FilterChips.svelte +1 -1
  34. package/dist/components/nav/Tabs.svelte +3 -0
  35. package/dist/components/ui/Pagination.svelte +16 -3
  36. package/dist/components/ui/Pagination.svelte.d.ts +6 -0
  37. package/dist/components/ui/Pagination.svelte.d.ts.map +1 -1
  38. package/dist/i18n/strings.d.ts +1 -0
  39. package/dist/i18n/strings.d.ts.map +1 -1
  40. package/dist/i18n/strings.js +1 -0
  41. package/dist/themes/CUSTOM_THEME_GUIDE.md +6 -6
  42. package/dist/themes/required-tokens.generated.json +12 -0
  43. package/package.json +12 -3
package/AGENTS.md CHANGED
@@ -47,9 +47,10 @@ 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
+ | `./charts` | Pure `Chart` renderer (`bar`, `line`, `table`, `pie`, `stat`), structural `ChartData`, and minor-unit number formatting; `./charts/format` is Svelte-free |
53
54
  | `./calendar` | `CalendarView` (time-zone-aware month/week grids + phone agenda) and its Svelte-free date model (`toEntries`, `layoutMonth`, `layoutWeek`, `dateKeyInZone`, …); deprecated `Calendar`, `DayView` |
54
55
  | `./chat` | `MessageBubble`, `ReactionPicker`, `TypingIndicator` |
55
56
  | `./forms` | Provider-free fields, choice controls, sliders/ranges, combobox/listbox/multiselect/tags, date/time/file controls, `CameraCapture`/`SignaturePad` capture, plus the transport-neutral control interaction registry |
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
@@ -0,0 +1,285 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Chart widget (#3727, #3888): bars, a line, a plain table, a donut or a single
4
+ * headline value over labelled values, drawn from the loaded data. Every chart
5
+ * carries its numbers as text (bar values inline, a visible table for `table`,
6
+ * a visually hidden table for the line and the donut, the value itself for
7
+ * `stat`) so it is readable without sight.
8
+ */
9
+ import { useI18n } from '../i18n/index.js';
10
+ import { formatWidgetValue } from './format.js';
11
+ import { M } from './strings.js';
12
+ import type { ChartData } from './types.js';
13
+
14
+ export interface Props {
15
+ /** Validated chart data to render, or null for the empty state. */
16
+ data: ChartData | null;
17
+ /** Requested chart presentation; unsupported values fall back to bars. */
18
+ style?: string;
19
+ /** Accessible heading shown above the chart. */
20
+ title?: string;
21
+ /** Locale used to format displayed numeric values. */
22
+ locale?: string;
23
+ }
24
+ let {
25
+ data,
26
+ style: requestedStyle = 'bar',
27
+ title = '',
28
+ locale = 'en',
29
+ }: Props = $props();
30
+
31
+ function isRecord(value: unknown): value is Record<string, unknown> {
32
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
33
+ }
34
+
35
+ const { t } = useI18n();
36
+ const MAX_POINTS = 60;
37
+
38
+ const chart = $derived(isRecord(data) ? data : null);
39
+ const points = $derived.by(() => {
40
+ if (!chart || !Array.isArray(chart.points)) return [];
41
+ const out: { label: string; value: number }[] = [];
42
+ for (const point of chart.points.slice(0, MAX_POINTS)) {
43
+ if (
44
+ isRecord(point) &&
45
+ typeof point.label === 'string' &&
46
+ typeof point.value === 'number' &&
47
+ Number.isFinite(point.value)
48
+ ) {
49
+ out.push({ label: point.label, value: point.value });
50
+ }
51
+ }
52
+ return out;
53
+ });
54
+ const STYLES = ['bar', 'line', 'table', 'pie', 'stat'] as const;
55
+ const style = $derived(
56
+ STYLES.find((candidate) => candidate === requestedStyle) ?? 'bar',
57
+ );
58
+ const fmt = (value: number): string =>
59
+ formatWidgetValue(value, {
60
+ format: chart?.format ?? 'integer',
61
+ currency: chart?.currency,
62
+ locale,
63
+ });
64
+ const max = $derived(Math.max(0, ...points.map((point) => point.value)));
65
+ const min = $derived(Math.min(0, ...points.map((point) => point.value)));
66
+ const span = $derived(max - min || 1);
67
+ const polyline = $derived(
68
+ points
69
+ .map((point, index) => {
70
+ const x = points.length === 1 ? 50 : (index / (points.length - 1)) * 100;
71
+ const y = 36 - ((point.value - min) / span) * 32;
72
+ return `${x.toFixed(2)},${y.toFixed(2)}`;
73
+ })
74
+ .join(' '),
75
+ );
76
+
77
+ // Donut: slices are percentages of the positive total on a circle whose
78
+ // path length is 100, so a segment's dash length is its share.
79
+ const total = $derived(
80
+ points.reduce((sum, point) => sum + Math.max(0, point.value), 0),
81
+ );
82
+ const slices = $derived.by(() => {
83
+ let offset = 0;
84
+ return points.map((point, index) => {
85
+ const share = total > 0 ? (Math.max(0, point.value) / total) * 100 : 0;
86
+ const slice = { ...point, index, share, offset };
87
+ offset += share;
88
+ return slice;
89
+ });
90
+ });
91
+ const percent = (share: number): string =>
92
+ formatWidgetValue(share / 100, { format: 'percent', locale });
93
+
94
+ // Stat: the latest value, and its change against the one before.
95
+ const latest = $derived(points.at(-1));
96
+ const delta = $derived.by((): number | null => {
97
+ if (
98
+ chart &&
99
+ typeof chart.delta === 'number' &&
100
+ Number.isFinite(chart.delta)
101
+ ) {
102
+ return chart.delta;
103
+ }
104
+ const previous = points.at(-2);
105
+ if (!latest || !previous || previous.value === 0) return null;
106
+ return ((latest.value - previous.value) / Math.abs(previous.value)) * 100;
107
+ });
108
+ const deltaText = $derived(
109
+ delta === null || delta === 0
110
+ ? ''
111
+ : t(
112
+ M[
113
+ delta > 0
114
+ ? 'ui.overview.metric.change_up'
115
+ : 'ui.overview.metric.change_down'
116
+ ],
117
+ {
118
+ value: formatWidgetValue(Math.abs(delta) / 100, {
119
+ format: 'percent',
120
+ locale,
121
+ }),
122
+ },
123
+ ),
124
+ );
125
+ const summary = $derived(
126
+ `${title}. ${t(M['ui.overview.chart.summary'], { count: points.length })}`,
127
+ );
128
+ </script>
129
+
130
+ {#snippet dataTable(hidden: boolean)}
131
+ <table class={hidden ? 'smrt-chart__table' : 'smrt-chart__data'}>
132
+ <caption>{t(M['ui.overview.chart.table'])}</caption>
133
+ <thead>
134
+ <tr>
135
+ <th scope="col">{t(M['ui.overview.chart.label_column'])}</th>
136
+ <th scope="col">{t(M['ui.overview.chart.value_column'])}</th>
137
+ </tr>
138
+ </thead>
139
+ <tbody>
140
+ {#each points as point, index (index)}
141
+ <tr><th scope="row">{point.label}</th><td>{fmt(point.value)}</td></tr>
142
+ {/each}
143
+ </tbody>
144
+ </table>
145
+ {/snippet}
146
+
147
+ {#if points.length === 0}
148
+ <p class="smrt-chart__empty" data-smrt-component="Chart">{t(M['ui.overview.no_data'])}</p>
149
+ {:else if style === 'table'}
150
+ <div class="smrt-chart smrt-chart--table" data-smrt-component="Chart">
151
+ {@render dataTable(false)}
152
+ </div>
153
+ {:else if style === 'stat'}
154
+ {#if latest}
155
+ <div class="smrt-chart smrt-chart--stat" data-smrt-component="Chart">
156
+ <p class="smrt-chart__headline">{fmt(latest.value)}</p>
157
+ <p class="smrt-chart__caption">{latest.label}</p>
158
+ {#if deltaText}
159
+ <p class="smrt-chart__delta" data-direction={(delta ?? 0) > 0 ? 'up' : 'down'}>
160
+ <span aria-hidden="true">{(delta ?? 0) > 0 ? '▲' : '▼'}</span>
161
+ {deltaText}
162
+ </p>
163
+ {/if}
164
+ </div>
165
+ {/if}
166
+ {:else if style === 'pie'}
167
+ {#if total > 0}
168
+ <div class="smrt-chart smrt-chart--pie" data-smrt-component="Chart">
169
+ <svg class="smrt-chart__donut" viewBox="0 0 42 42" role="img" aria-label={summary}>
170
+ {#each slices as slice (slice.index)}
171
+ {#if slice.share > 0}
172
+ <circle
173
+ class="smrt-chart__slice"
174
+ data-slot={slice.index % 8}
175
+ cx="21"
176
+ cy="21"
177
+ r="15.9155"
178
+ fill="none"
179
+ stroke-width="6"
180
+ pathLength="100"
181
+ stroke-dasharray="{slice.share} {100 - slice.share}"
182
+ stroke-dashoffset={-slice.offset}
183
+ transform="rotate(-90 21 21)"
184
+ />
185
+ {/if}
186
+ {/each}
187
+ </svg>
188
+ <ul class="smrt-chart__legend" aria-hidden="true">
189
+ {#each slices as slice (slice.index)}
190
+ <li class="smrt-chart__legend-item">
191
+ <span class="smrt-chart__swatch" data-slot={slice.index % 8}></span>
192
+ <span class="smrt-chart__label">{slice.label}</span>
193
+ <span class="smrt-chart__value">{fmt(slice.value)} · {percent(slice.share)}</span>
194
+ </li>
195
+ {/each}
196
+ </ul>
197
+ {@render dataTable(true)}
198
+ </div>
199
+ {:else}
200
+ <p class="smrt-chart__empty" data-smrt-component="Chart">{t(M['ui.overview.no_data'])}</p>
201
+ {/if}
202
+ {:else if style === 'line'}
203
+ <div class="smrt-chart" data-smrt-component="Chart">
204
+ <svg class="smrt-chart__line" viewBox="0 0 100 40" preserveAspectRatio="none" role="img" aria-label={summary}>
205
+ <polyline points={polyline} fill="none" stroke="currentColor" stroke-width="2" vector-effect="non-scaling-stroke" />
206
+ </svg>
207
+ <p class="smrt-chart__axis" aria-hidden="true">
208
+ <span>{points[0].label}</span>
209
+ <span>{points[points.length - 1].label}</span>
210
+ </p>
211
+ {@render dataTable(true)}
212
+ </div>
213
+ {:else}
214
+ <ul class="smrt-chart__bars" aria-label={summary} data-smrt-component="Chart">
215
+ {#each points as point, index (index)}
216
+ <li class="smrt-chart__row">
217
+ <span class="smrt-chart__label">{point.label}</span>
218
+ <span class="smrt-chart__track" aria-hidden="true">
219
+ <span class="smrt-chart__bar" style:inline-size="{max > 0 ? (Math.max(0, point.value) / max) * 100 : 0}%"></span>
220
+ </span>
221
+ <span class="smrt-chart__value">{fmt(point.value)}</span>
222
+ </li>
223
+ {/each}
224
+ </ul>
225
+ {/if}
226
+
227
+ <style>
228
+ @layer smrt.reset, smrt.structure, smrt.theme;
229
+ @layer smrt.theme {
230
+ .smrt-chart { display: grid; gap: var(--smrt-spacing-1); color: var(--smrt-color-primary); }
231
+ .smrt-chart__line { inline-size: 100%; block-size: 7rem; overflow: visible; }
232
+ .smrt-chart__axis { display: flex; justify-content: space-between; margin: 0; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-label-large-size, 0.75rem); }
233
+ .smrt-chart__bars { display: grid; gap: var(--smrt-spacing-2); margin: 0; padding: 0; list-style: none; }
234
+ .smrt-chart__row { display: grid; grid-template-columns: minmax(4rem, 30%) minmax(0, 1fr) auto; align-items: center; gap: var(--smrt-spacing-2); font-size: var(--smrt-typography-body-medium-size, 0.875rem); color: var(--smrt-color-on-surface); }
235
+ .smrt-chart__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
236
+ .smrt-chart__track { display: block; block-size: 0.625rem; border-radius: var(--smrt-radius-full); background: var(--smrt-color-surface-container-high); overflow: hidden; }
237
+ .smrt-chart__bar { display: block; block-size: 100%; border-radius: inherit; background: var(--smrt-color-primary); }
238
+ .smrt-chart__value { font-variant-numeric: tabular-nums; color: var(--smrt-color-on-surface-variant); }
239
+ .smrt-chart__empty { margin: 0; color: var(--smrt-color-on-surface-variant); }
240
+ .smrt-chart--table { color: var(--smrt-color-on-surface); }
241
+ .smrt-chart__data { inline-size: 100%; border-collapse: collapse; font-size: var(--smrt-typography-body-medium-size, 0.875rem); }
242
+ .smrt-chart__data caption { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
243
+ .smrt-chart__data th, .smrt-chart__data td { padding: var(--smrt-spacing-1) var(--smrt-spacing-2); border-block-end: var(--smrt-hairline); text-align: start; }
244
+ .smrt-chart__data thead th { background: var(--smrt-surface-sunken); color: var(--smrt-color-on-surface-variant); font-weight: var(--smrt-typography-weight-medium, 500); }
245
+ .smrt-chart__data tbody th { font-weight: inherit; overflow-wrap: anywhere; }
246
+ .smrt-chart__data td, .smrt-chart__data thead th:last-child { text-align: end; font-variant-numeric: tabular-nums; }
247
+ .smrt-chart--stat { gap: var(--smrt-spacing-1); color: var(--smrt-color-on-surface); }
248
+ .smrt-chart__headline { margin: 0; font-size: var(--smrt-typography-display-small-size, 2rem); font-weight: var(--smrt-typography-weight-medium, 500); line-height: 1.1; font-variant-numeric: tabular-nums; }
249
+ .smrt-chart__caption { margin: 0; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-body-medium-size, 0.875rem); }
250
+ .smrt-chart__delta { margin: 0; color: var(--smrt-color-on-surface-variant); font-size: var(--smrt-typography-label-large-size, 0.875rem); }
251
+ .smrt-chart--pie { grid-template-columns: minmax(6rem, 10rem) minmax(0, 1fr); align-items: center; gap: var(--smrt-spacing-4); }
252
+ .smrt-chart__donut { inline-size: 100%; block-size: auto; }
253
+ .smrt-chart__slice[data-slot='0'], .smrt-chart__swatch[data-slot='0'] { stroke: var(--smrt-color-primary); background: var(--smrt-color-primary); }
254
+ .smrt-chart__slice[data-slot='1'], .smrt-chart__swatch[data-slot='1'] { stroke: var(--smrt-color-secondary); background: var(--smrt-color-secondary); }
255
+ .smrt-chart__slice[data-slot='2'], .smrt-chart__swatch[data-slot='2'] { stroke: var(--smrt-color-tertiary); background: var(--smrt-color-tertiary); }
256
+ .smrt-chart__slice[data-slot='3'], .smrt-chart__swatch[data-slot='3'] { stroke: var(--smrt-color-info); background: var(--smrt-color-info); }
257
+ .smrt-chart__slice[data-slot='4'], .smrt-chart__swatch[data-slot='4'] { stroke: var(--smrt-color-primary-container); background: var(--smrt-color-primary-container); }
258
+ .smrt-chart__slice[data-slot='5'], .smrt-chart__swatch[data-slot='5'] { stroke: var(--smrt-color-secondary-container); background: var(--smrt-color-secondary-container); }
259
+ .smrt-chart__slice[data-slot='6'], .smrt-chart__swatch[data-slot='6'] { stroke: var(--smrt-color-tertiary-container); background: var(--smrt-color-tertiary-container); }
260
+ .smrt-chart__slice[data-slot='7'], .smrt-chart__swatch[data-slot='7'] { stroke: var(--smrt-color-info-container); background: var(--smrt-color-info-container); }
261
+ .smrt-chart__legend { display: grid; gap: var(--smrt-spacing-1); margin: 0; padding: 0; list-style: none; color: var(--smrt-color-on-surface); font-size: var(--smrt-typography-body-medium-size, 0.875rem); }
262
+ .smrt-chart__legend-item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--smrt-spacing-2); }
263
+ .smrt-chart__swatch { inline-size: 0.75rem; block-size: 0.75rem; border-radius: var(--smrt-radius-small); }
264
+ .smrt-chart__legend .smrt-chart__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
265
+ @media (prefers-reduced-motion: no-preference) {
266
+ .smrt-chart__slice { transition: stroke-dasharray var(--smrt-duration-normal) var(--smrt-easing-standard), stroke-dashoffset var(--smrt-duration-normal) var(--smrt-easing-standard); }
267
+ .smrt-chart__bar { transition: inline-size var(--smrt-duration-normal) var(--smrt-easing-standard); }
268
+ }
269
+ .smrt-chart__table { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
270
+ @media (forced-colors: active) {
271
+ .smrt-chart__slice[data-slot='0'], .smrt-chart__swatch[data-slot='0'] { stroke: CanvasText; background: CanvasText; }
272
+ .smrt-chart__slice[data-slot='1'], .smrt-chart__swatch[data-slot='1'] { stroke: Highlight; background: Highlight; }
273
+ .smrt-chart__slice[data-slot='2'], .smrt-chart__swatch[data-slot='2'] { stroke: LinkText; background: LinkText; }
274
+ .smrt-chart__slice[data-slot='3'], .smrt-chart__swatch[data-slot='3'] { stroke: VisitedText; background: VisitedText; }
275
+ .smrt-chart__slice[data-slot='4'], .smrt-chart__swatch[data-slot='4'] { stroke: ActiveText; background: ActiveText; }
276
+ .smrt-chart__slice[data-slot='5'], .smrt-chart__swatch[data-slot='5'] { stroke: GrayText; background: GrayText; }
277
+ .smrt-chart__slice[data-slot='6'], .smrt-chart__swatch[data-slot='6'] { stroke: ButtonText; background: ButtonText; }
278
+ .smrt-chart__slice[data-slot='7'], .smrt-chart__swatch[data-slot='7'] { stroke: MarkText; background: MarkText; }
279
+ .smrt-chart__swatch { border: var(--smrt-hairline-strong); }
280
+ .smrt-chart__slice { stroke-linecap: butt; }
281
+ .smrt-chart__track { background: Canvas; border: var(--smrt-hairline-strong); }
282
+ .smrt-chart__bar { background: Highlight; }
283
+ }
284
+ }
285
+ </style>
@@ -0,0 +1,15 @@
1
+ import type { ChartData } from './types.js';
2
+ export interface Props {
3
+ /** Validated chart data to render, or null for the empty state. */
4
+ data: ChartData | null;
5
+ /** Requested chart presentation; unsupported values fall back to bars. */
6
+ style?: string;
7
+ /** Accessible heading shown above the chart. */
8
+ title?: string;
9
+ /** Locale used to format displayed numeric values. */
10
+ locale?: string;
11
+ }
12
+ declare const Chart: import("svelte").Component<Props, {}, "">;
13
+ type Chart = ReturnType<typeof Chart>;
14
+ export default Chart;
15
+ //# sourceMappingURL=Chart.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chart.svelte.d.ts","sourceRoot":"","sources":["../../src/charts/Chart.svelte.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,KAAK;IACpB,mEAAmE;IACnE,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA2MD,QAAA,MAAM,KAAK,2CAAwC,CAAC;AACpD,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AACtC,eAAe,KAAK,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type WidgetValueFormat = 'integer' | 'decimal' | 'percent' | 'money';
2
+ export interface FormatWidgetValueOptions {
3
+ format?: WidgetValueFormat;
4
+ /** ISO 4217 code for `money` (default USD). */
5
+ currency?: string;
6
+ locale: string;
7
+ }
8
+ /**
9
+ * Format a metric value. `money` takes integer minor units, `percent` takes a
10
+ * fraction (0.25 is 25%). Non-finite input renders as an en dash.
11
+ */
12
+ export declare function formatWidgetValue(value: unknown, { format, currency, locale }: FormatWidgetValueOptions): string;
13
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/charts/format.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAYD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,EAAE,MAAkB,EAAE,QAAgB,EAAE,MAAM,EAAE,EAAE,wBAAwB,GACzE,MAAM,CA4BR"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Number formatting for overview widgets (#3727). Deterministic for a given
3
+ * locale so a server render and the client hydrate to the same text. Money is
4
+ * integer minor units end to end (never a decimal in data).
5
+ */
6
+ import { ISO_4217_MINOR_UNITS } from '../currency.js';
7
+ function currencyMinorDigits(currency) {
8
+ return ISO_4217_MINOR_UNITS.get(currency.trim().toUpperCase()) ?? 2;
9
+ }
10
+ const EN_DASH = '–';
11
+ function safeLocale(locale) {
12
+ try {
13
+ return Intl.getCanonicalLocales(locale)[0] ?? 'en';
14
+ }
15
+ catch {
16
+ return 'en';
17
+ }
18
+ }
19
+ /**
20
+ * Format a metric value. `money` takes integer minor units, `percent` takes a
21
+ * fraction (0.25 is 25%). Non-finite input renders as an en dash.
22
+ */
23
+ export function formatWidgetValue(value, { format = 'integer', currency = 'USD', locale }) {
24
+ if (typeof value !== 'number' || !Number.isFinite(value))
25
+ return EN_DASH;
26
+ const tag = safeLocale(locale);
27
+ switch (format) {
28
+ case 'money': {
29
+ const code = /^[A-Za-z]{3}$/.test(currency)
30
+ ? currency.toUpperCase()
31
+ : 'USD';
32
+ const digits = currencyMinorDigits(code);
33
+ return new Intl.NumberFormat(tag, {
34
+ style: 'currency',
35
+ currency: code,
36
+ }).format(value / 10 ** digits);
37
+ }
38
+ case 'percent':
39
+ return new Intl.NumberFormat(tag, {
40
+ style: 'percent',
41
+ maximumFractionDigits: 1,
42
+ }).format(value);
43
+ case 'decimal':
44
+ return new Intl.NumberFormat(tag, { maximumFractionDigits: 2 }).format(value);
45
+ default:
46
+ return new Intl.NumberFormat(tag, { maximumFractionDigits: 0 }).format(value);
47
+ }
48
+ }
@@ -0,0 +1,5 @@
1
+ export { default as Chart } from './Chart.svelte';
2
+ export type { FormatWidgetValueOptions, WidgetValueFormat } from './format.js';
3
+ export { formatWidgetValue } from './format.js';
4
+ export type { ChartData } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as Chart } from './Chart.svelte';
2
+ export { formatWidgetValue } from './format.js';
@@ -0,0 +1,10 @@
1
+ export declare const M: {
2
+ readonly 'ui.overview.no_data': "ui.overview.no_data";
3
+ readonly 'ui.overview.metric.change_up': "ui.overview.metric.change_up";
4
+ readonly 'ui.overview.metric.change_down': "ui.overview.metric.change_down";
5
+ readonly 'ui.overview.chart.summary': "ui.overview.chart.summary";
6
+ readonly 'ui.overview.chart.table': "ui.overview.chart.table";
7
+ readonly 'ui.overview.chart.label_column': "ui.overview.chart.label_column";
8
+ readonly 'ui.overview.chart.value_column': "ui.overview.chart.value_column";
9
+ };
10
+ //# sourceMappingURL=strings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/charts/strings.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,CAAC;;;;;;;;CAQZ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { defineMessages } from '../i18n/registry.js';
2
+ export const M = defineMessages({
3
+ 'ui.overview.no_data': 'Nothing to show yet.',
4
+ 'ui.overview.metric.change_up': 'Up {value} from the previous period',
5
+ 'ui.overview.metric.change_down': 'Down {value} from the previous period',
6
+ 'ui.overview.chart.summary': 'Chart with {count} values',
7
+ 'ui.overview.chart.table': 'Chart data',
8
+ 'ui.overview.chart.label_column': 'Label',
9
+ 'ui.overview.chart.value_column': 'Value',
10
+ });
@@ -0,0 +1,13 @@
1
+ import type { WidgetValueFormat } from './format.js';
2
+ /** Transport-neutral chart data. Money values use integer minor units. */
3
+ export interface ChartData {
4
+ points: {
5
+ label: string;
6
+ value: number;
7
+ }[];
8
+ format?: WidgetValueFormat;
9
+ currency?: string;
10
+ /** Explicit percentage change for a stat; otherwise derived from its last two points. */
11
+ delta?: number | null;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/charts/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,0EAA0E;AAC1E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -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;
@@ -2347,7 +2379,7 @@ $effect(() => {
2347
2379
  }
2348
2380
  .data-table-container[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min); }
2349
2381
  .data-table-container[data-density='comfortable'] { --smrt-control-target-min: 0px; }
2350
- .data-table__sort-button { min-height: var(--smrt-control-target-min, 0px); min-width: var(--smrt-control-target-min, 0px); }
2382
+ .data-table__sort-button { min-height: var(--smrt-control-target-min); min-width: var(--smrt-control-target-min); }
2351
2383
  .data-table-container--narrow .data-table { table-layout: fixed; }
2352
2384
  .data-table-container--narrow .data-table__cell { white-space: normal; overflow-wrap: anywhere; }
2353
2385
  .data-table-container--narrow .data-table__sort-button { max-width: 100%; text-align: left; white-space: normal; overflow-wrap: anywhere; }
@@ -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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"}
@@ -202,7 +202,7 @@ function handleKeydown(e: KeyboardEvent) {
202
202
 
203
203
  .dialog-content {
204
204
  background-color: var(--smrt-color-surface-container-high);
205
- border-radius: var(--smrt-radius-3xl, 32px);
205
+ border-radius: var(--smrt-radius-3xl);
206
206
  padding: var(--smrt-spacing-6);
207
207
  max-width: 400px;
208
208
  width: 100%;
@@ -44,7 +44,7 @@ function handleChange(event: Event & { currentTarget: HTMLInputElement }) {
44
44
  input:checked + .radio__mark { border-color: var(--smrt-color-primary); }
45
45
  input:checked + .radio__mark::after { transform: scale(1); }
46
46
  input:focus-visible + .radio__mark { outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color); outline-offset: var(--smrt-focus-ring-offset); }
47
- .radio { min-height: var(--smrt-control-target-min, 0px); min-width: var(--smrt-control-target-min, 0px); }
47
+ .radio { min-height: var(--smrt-control-target-min); min-width: var(--smrt-control-target-min); }
48
48
 
49
49
  /* Table cells: grow vertically only, never into a neighbouring cell. */
50
50
  :global(:is(td, th)) .radio::before { inline-size: var(--smrt-radio-box); margin-inline-start: calc(var(--smrt-radio-box) / -2); }
@@ -261,7 +261,7 @@ useControlRegistration(() => {
261
261
 
262
262
  .segmented[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min); }
263
263
  .segmented[data-density='comfortable'] { --smrt-control-target-min: 0px; }
264
- label { min-height: max(2.5rem, var(--smrt-control-target-min, 0px)); min-width: var(--smrt-control-target-min, 0px); }
264
+ label { min-height: max(2.5rem, var(--smrt-control-target-min)); min-width: var(--smrt-control-target-min); }
265
265
  input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: inherit; }
266
266
  /* Forced colors (#3908): system colours where colour alone carries meaning. */
267
267
  @media (forced-colors: active) {
@@ -206,6 +206,6 @@ export function getElement(): HTMLTextAreaElement | null {
206
206
 
207
207
  .textarea[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min); }
208
208
  .textarea[data-density='comfortable'] { --smrt-control-target-min: 0px; }
209
- .textarea { min-height: max(80px, var(--smrt-control-target-min, 0px)); }
209
+ .textarea { min-height: max(80px, var(--smrt-control-target-min)); }
210
210
  }
211
211
  </style>
@@ -118,7 +118,7 @@ const icons = {
118
118
  margin-bottom: 2rem;
119
119
  background-color: var(--smrt-color-secondary-container);
120
120
  color: var(--smrt-color-on-secondary-container);
121
- border-radius: var(--smrt-radius-3xl, 32px); /* M3 extra large shape */
121
+ border-radius: var(--smrt-radius-3xl); /* M3 extra large shape */
122
122
  padding: var(--smrt-spacing-6);
123
123
  }
124
124
 
@@ -134,7 +134,7 @@ const icons = {
134
134
  width: 120px;
135
135
  height: 120px;
136
136
  margin-bottom: 2.5rem;
137
- border-radius: var(--smrt-radius-3xl, 32px);
137
+ border-radius: var(--smrt-radius-3xl);
138
138
  padding: var(--smrt-spacing-8);
139
139
  }
140
140
 
@@ -157,7 +157,7 @@ function handleClick(value: string) {
157
157
 
158
158
  .filter-chips[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min); }
159
159
  .filter-chips[data-density='comfortable'] { --smrt-control-target-min: 0px; }
160
- .filter-chip { min-height: var(--smrt-control-target-min, 0px); min-width: var(--smrt-control-target-min, 0px); }
160
+ .filter-chip { min-height: var(--smrt-control-target-min); min-width: var(--smrt-control-target-min); }
161
161
  /* Forced colors (#3908): system colours where colour alone carries meaning. */
162
162
  @media (forced-colors: active) {
163
163
  .filter-chip.active { background-color: Highlight; color: HighlightText; border-color: Highlight; }
@@ -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
  });
@@ -331,8 +331,8 @@ Every theme (presets and `createTheme()` output) must define these names. Genera
331
331
  `--smrt-<component>-*` knobs are excluded.
332
332
 
333
333
  - **color** (42): `--smrt-color-background`, `--smrt-color-error`, `--smrt-color-error-container`, `--smrt-color-info`, `--smrt-color-info-container`, `--smrt-color-inverse-on-surface`, `--smrt-color-inverse-surface`, `--smrt-color-on-background`, `--smrt-color-on-error`, `--smrt-color-on-error-container`, `--smrt-color-on-primary`, `--smrt-color-on-primary-container`, `--smrt-color-on-secondary`, `--smrt-color-on-secondary-container`, `--smrt-color-on-success-container`, `--smrt-color-on-surface`, `--smrt-color-on-surface-variant`, `--smrt-color-on-tertiary`, `--smrt-color-on-tertiary-container`, `--smrt-color-on-warning-container`, `--smrt-color-outline`, `--smrt-color-outline-variant`, `--smrt-color-primary`, `--smrt-color-primary-container`, `--smrt-color-scrim`, `--smrt-color-secondary`, `--smrt-color-secondary-container`, `--smrt-color-shadow`, `--smrt-color-success`, `--smrt-color-success-container`, `--smrt-color-surface`, `--smrt-color-surface-container`, `--smrt-color-surface-container-high`, `--smrt-color-surface-container-highest`, `--smrt-color-surface-container-low`, `--smrt-color-surface-container-lowest`, `--smrt-color-surface-dim`, `--smrt-color-surface-variant`, `--smrt-color-tertiary`, `--smrt-color-tertiary-container`, `--smrt-color-warning`, `--smrt-color-warning-container`
334
- - **control** (4): `--smrt-control-height`, `--smrt-control-height-small`, `--smrt-control-radius`, `--smrt-control-radius-small`
335
- - **duration** (6): `--smrt-duration-fast`, `--smrt-duration-medium1`, `--smrt-duration-normal`, `--smrt-duration-short2`, `--smrt-duration-short3`, `--smrt-duration-short4`
334
+ - **control** (6): `--smrt-control-height`, `--smrt-control-height-small`, `--smrt-control-radius`, `--smrt-control-radius-small`, `--smrt-control-target-min`, `--smrt-control-weight`
335
+ - **duration** (7): `--smrt-duration-fast`, `--smrt-duration-medium1`, `--smrt-duration-medium2`, `--smrt-duration-normal`, `--smrt-duration-short2`, `--smrt-duration-short3`, `--smrt-duration-short4`
336
336
  - **easing** (3): `--smrt-easing-emphasized`, `--smrt-easing-emphasized-decelerate`, `--smrt-easing-standard`
337
337
  - **elevation** (5): `--smrt-elevation-1`, `--smrt-elevation-2`, `--smrt-elevation-3`, `--smrt-elevation-4`, `--smrt-elevation-5`
338
338
  - **focus** (3): `--smrt-focus-ring-color`, `--smrt-focus-ring-offset`, `--smrt-focus-ring-width`
@@ -340,14 +340,14 @@ Every theme (presets and `createTheme()` output) must define these names. Genera
340
340
  - **glass** (4): `--smrt-glass-blur`, `--smrt-glass-saturation`, `--smrt-glass-surface`, `--smrt-glass-surface-strong`
341
341
  - **hairline** (4): `--smrt-hairline`, `--smrt-hairline-color`, `--smrt-hairline-strong`, `--smrt-hairline-strong-color`
342
342
  - **inset** (1): `--smrt-inset-highlight`
343
- - **radius** (11): `--smrt-radius-2xl`, `--smrt-radius-extra-large`, `--smrt-radius-extra-small`, `--smrt-radius-full`, `--smrt-radius-large`, `--smrt-radius-lg`, `--smrt-radius-md`, `--smrt-radius-medium`, `--smrt-radius-sm`, `--smrt-radius-small`, `--smrt-radius-xl`
343
+ - **radius** (13): `--smrt-radius-2xl`, `--smrt-radius-3xl`, `--smrt-radius-extra-large`, `--smrt-radius-extra-small`, `--smrt-radius-full`, `--smrt-radius-large`, `--smrt-radius-lg`, `--smrt-radius-md`, `--smrt-radius-medium`, `--smrt-radius-none`, `--smrt-radius-sm`, `--smrt-radius-small`, `--smrt-radius-xl`
344
344
  - **scrollbar** (2): `--smrt-scrollbar-thumb`, `--smrt-scrollbar-track`
345
- - **spacing** (19): `--smrt-spacing-0_5`, `--smrt-spacing-1`, `--smrt-spacing-10`, `--smrt-spacing-11`, `--smrt-spacing-12`, `--smrt-spacing-1_5`, `--smrt-spacing-2`, `--smrt-spacing-2xl`, `--smrt-spacing-3`, `--smrt-spacing-3xl`, `--smrt-spacing-4`, `--smrt-spacing-5`, `--smrt-spacing-6`, `--smrt-spacing-8`, `--smrt-spacing-lg`, `--smrt-spacing-md`, `--smrt-spacing-sm`, `--smrt-spacing-xl`, `--smrt-spacing-xs`
345
+ - **spacing** (20): `--smrt-spacing-0`, `--smrt-spacing-0_5`, `--smrt-spacing-1`, `--smrt-spacing-10`, `--smrt-spacing-11`, `--smrt-spacing-12`, `--smrt-spacing-1_5`, `--smrt-spacing-2`, `--smrt-spacing-2xl`, `--smrt-spacing-3`, `--smrt-spacing-3xl`, `--smrt-spacing-4`, `--smrt-spacing-5`, `--smrt-spacing-6`, `--smrt-spacing-8`, `--smrt-spacing-lg`, `--smrt-spacing-md`, `--smrt-spacing-sm`, `--smrt-spacing-xl`, `--smrt-spacing-xs`
346
346
  - **state** (5): `--smrt-state-disabled`, `--smrt-state-dragged`, `--smrt-state-hover`, `--smrt-state-pressed`, `--smrt-state-selected`
347
347
  - **surface** (6): `--smrt-surface-control`, `--smrt-surface-ground`, `--smrt-surface-overlay`, `--smrt-surface-panel`, `--smrt-surface-raised`, `--smrt-surface-sunken`
348
348
  - **touch** (1): `--smrt-touch-target-min`
349
- - **typography** (56): `--smrt-typography-body-large-font`, `--smrt-typography-body-large-line-height`, `--smrt-typography-body-large-size`, `--smrt-typography-body-large-tracking`, `--smrt-typography-body-medium-font`, `--smrt-typography-body-medium-line-height`, `--smrt-typography-body-medium-size`, `--smrt-typography-body-medium-tracking`, `--smrt-typography-body-medium-weight`, `--smrt-typography-body-small-font`, `--smrt-typography-body-small-line-height`, `--smrt-typography-body-small-size`, `--smrt-typography-body-small-weight`, `--smrt-typography-display-medium-line-height`, `--smrt-typography-display-medium-size`, `--smrt-typography-display-small-size`, `--smrt-typography-headline-large-line-height`, `--smrt-typography-headline-large-size`, `--smrt-typography-headline-large-weight`, `--smrt-typography-headline-medium-line-height`, `--smrt-typography-headline-medium-size`, `--smrt-typography-headline-medium-weight`, `--smrt-typography-headline-small-font`, `--smrt-typography-headline-small-line-height`, `--smrt-typography-headline-small-size`, `--smrt-typography-headline-small-weight`, `--smrt-typography-label-large-font`, `--smrt-typography-label-large-size`, `--smrt-typography-label-large-tracking`, `--smrt-typography-label-large-weight`, `--smrt-typography-label-medium-font`, `--smrt-typography-label-medium-size`, `--smrt-typography-label-medium-tracking`, `--smrt-typography-label-medium-weight`, `--smrt-typography-label-small-font`, `--smrt-typography-label-small-line-height`, `--smrt-typography-label-small-size`, `--smrt-typography-label-small-tracking`, `--smrt-typography-label-small-weight`, `--smrt-typography-title-large-font`, `--smrt-typography-title-large-line-height`, `--smrt-typography-title-large-size`, `--smrt-typography-title-medium-font`, `--smrt-typography-title-medium-font-family`, `--smrt-typography-title-medium-line-height`, `--smrt-typography-title-medium-size`, `--smrt-typography-title-medium-tracking`, `--smrt-typography-title-medium-weight`, `--smrt-typography-title-small-font`, `--smrt-typography-title-small-size`, `--smrt-typography-title-small-tracking`, `--smrt-typography-title-small-weight`, `--smrt-typography-weight-bold`, `--smrt-typography-weight-medium`, `--smrt-typography-weight-normal`, `--smrt-typography-weight-semibold`
350
- - **z** (7): `--smrt-z-index-dialog`, `--smrt-z-index-dropdown`, `--smrt-z-index-modal`, `--smrt-z-index-overlay`, `--smrt-z-index-sticky`, `--smrt-z-index-toast`, `--smrt-z-index-tooltip`
349
+ - **typography** (60): `--smrt-typography-body-large-font`, `--smrt-typography-body-large-line-height`, `--smrt-typography-body-large-size`, `--smrt-typography-body-large-tracking`, `--smrt-typography-body-medium-font`, `--smrt-typography-body-medium-line-height`, `--smrt-typography-body-medium-size`, `--smrt-typography-body-medium-tracking`, `--smrt-typography-body-medium-weight`, `--smrt-typography-body-small-font`, `--smrt-typography-body-small-line-height`, `--smrt-typography-body-small-size`, `--smrt-typography-body-small-weight`, `--smrt-typography-display-medium-line-height`, `--smrt-typography-display-medium-size`, `--smrt-typography-display-small-size`, `--smrt-typography-display-small-weight`, `--smrt-typography-headline-large-line-height`, `--smrt-typography-headline-large-size`, `--smrt-typography-headline-large-weight`, `--smrt-typography-headline-medium-font`, `--smrt-typography-headline-medium-line-height`, `--smrt-typography-headline-medium-size`, `--smrt-typography-headline-medium-weight`, `--smrt-typography-headline-small-font`, `--smrt-typography-headline-small-line-height`, `--smrt-typography-headline-small-size`, `--smrt-typography-headline-small-weight`, `--smrt-typography-label-large-font`, `--smrt-typography-label-large-line-height`, `--smrt-typography-label-large-size`, `--smrt-typography-label-large-tracking`, `--smrt-typography-label-large-weight`, `--smrt-typography-label-medium-font`, `--smrt-typography-label-medium-size`, `--smrt-typography-label-medium-tracking`, `--smrt-typography-label-medium-weight`, `--smrt-typography-label-small-font`, `--smrt-typography-label-small-line-height`, `--smrt-typography-label-small-size`, `--smrt-typography-label-small-tracking`, `--smrt-typography-label-small-weight`, `--smrt-typography-title-large-font`, `--smrt-typography-title-large-line-height`, `--smrt-typography-title-large-size`, `--smrt-typography-title-large-weight`, `--smrt-typography-title-medium-font`, `--smrt-typography-title-medium-font-family`, `--smrt-typography-title-medium-line-height`, `--smrt-typography-title-medium-size`, `--smrt-typography-title-medium-tracking`, `--smrt-typography-title-medium-weight`, `--smrt-typography-title-small-font`, `--smrt-typography-title-small-size`, `--smrt-typography-title-small-tracking`, `--smrt-typography-title-small-weight`, `--smrt-typography-weight-bold`, `--smrt-typography-weight-medium`, `--smrt-typography-weight-normal`, `--smrt-typography-weight-semibold`
350
+ - **z** (9): `--smrt-z-index-dialog`, `--smrt-z-index-dropdown`, `--smrt-z-index-loading`, `--smrt-z-index-modal`, `--smrt-z-index-overlay`, `--smrt-z-index-popover`, `--smrt-z-index-sticky`, `--smrt-z-index-toast`, `--smrt-z-index-tooltip`
351
351
 
352
352
  <!-- smrt-required-tokens:end -->
353
353
 
@@ -47,8 +47,11 @@
47
47
  "--smrt-control-height-small",
48
48
  "--smrt-control-radius",
49
49
  "--smrt-control-radius-small",
50
+ "--smrt-control-target-min",
51
+ "--smrt-control-weight",
50
52
  "--smrt-duration-fast",
51
53
  "--smrt-duration-medium1",
54
+ "--smrt-duration-medium2",
52
55
  "--smrt-duration-normal",
53
56
  "--smrt-duration-short2",
54
57
  "--smrt-duration-short3",
@@ -76,6 +79,7 @@
76
79
  "--smrt-hairline-strong-color",
77
80
  "--smrt-inset-highlight",
78
81
  "--smrt-radius-2xl",
82
+ "--smrt-radius-3xl",
79
83
  "--smrt-radius-extra-large",
80
84
  "--smrt-radius-extra-small",
81
85
  "--smrt-radius-full",
@@ -83,11 +87,13 @@
83
87
  "--smrt-radius-lg",
84
88
  "--smrt-radius-md",
85
89
  "--smrt-radius-medium",
90
+ "--smrt-radius-none",
86
91
  "--smrt-radius-sm",
87
92
  "--smrt-radius-small",
88
93
  "--smrt-radius-xl",
89
94
  "--smrt-scrollbar-thumb",
90
95
  "--smrt-scrollbar-track",
96
+ "--smrt-spacing-0",
91
97
  "--smrt-spacing-0_5",
92
98
  "--smrt-spacing-1",
93
99
  "--smrt-spacing-10",
@@ -135,9 +141,11 @@
135
141
  "--smrt-typography-display-medium-line-height",
136
142
  "--smrt-typography-display-medium-size",
137
143
  "--smrt-typography-display-small-size",
144
+ "--smrt-typography-display-small-weight",
138
145
  "--smrt-typography-headline-large-line-height",
139
146
  "--smrt-typography-headline-large-size",
140
147
  "--smrt-typography-headline-large-weight",
148
+ "--smrt-typography-headline-medium-font",
141
149
  "--smrt-typography-headline-medium-line-height",
142
150
  "--smrt-typography-headline-medium-size",
143
151
  "--smrt-typography-headline-medium-weight",
@@ -146,6 +154,7 @@
146
154
  "--smrt-typography-headline-small-size",
147
155
  "--smrt-typography-headline-small-weight",
148
156
  "--smrt-typography-label-large-font",
157
+ "--smrt-typography-label-large-line-height",
149
158
  "--smrt-typography-label-large-size",
150
159
  "--smrt-typography-label-large-tracking",
151
160
  "--smrt-typography-label-large-weight",
@@ -161,6 +170,7 @@
161
170
  "--smrt-typography-title-large-font",
162
171
  "--smrt-typography-title-large-line-height",
163
172
  "--smrt-typography-title-large-size",
173
+ "--smrt-typography-title-large-weight",
164
174
  "--smrt-typography-title-medium-font",
165
175
  "--smrt-typography-title-medium-font-family",
166
176
  "--smrt-typography-title-medium-line-height",
@@ -177,8 +187,10 @@
177
187
  "--smrt-typography-weight-semibold",
178
188
  "--smrt-z-index-dialog",
179
189
  "--smrt-z-index-dropdown",
190
+ "--smrt-z-index-loading",
180
191
  "--smrt-z-index-modal",
181
192
  "--smrt-z-index-overlay",
193
+ "--smrt-z-index-popover",
182
194
  "--smrt-z-index-sticky",
183
195
  "--smrt-z-index-toast",
184
196
  "--smrt-z-index-tooltip"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-ui",
3
- "version": "0.55.23",
3
+ "version": "0.56.0",
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",
@@ -127,6 +127,15 @@
127
127
  "./test-support/*": {
128
128
  "types": "./dist/test-support/*.d.ts",
129
129
  "default": "./dist/test-support/*.js"
130
+ },
131
+ "./charts": {
132
+ "types": "./dist/charts/index.d.ts",
133
+ "svelte": "./dist/charts/index.js",
134
+ "import": "./dist/charts/index.js"
135
+ },
136
+ "./charts/format": {
137
+ "types": "./dist/charts/format.d.ts",
138
+ "import": "./dist/charts/format.js"
130
139
  }
131
140
  },
132
141
  "files": [
@@ -155,7 +164,7 @@
155
164
  "access": "public"
156
165
  },
157
166
  "dependencies": {
158
- "@happyvertical/smrt-types": "0.55.23",
167
+ "@happyvertical/smrt-types": "0.56.0",
159
168
  "esm-env": "^1.2.2"
160
169
  },
161
170
  "peerDependencies": {
@@ -171,7 +180,7 @@
171
180
  }
172
181
  },
173
182
  "devDependencies": {
174
- "@happyvertical/speech": "^0.103.5",
183
+ "@happyvertical/speech": "^0.103.6",
175
184
  "@sveltejs/package": "^2.5.8",
176
185
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
177
186
  "@testing-library/jest-dom": "^7.0.1",