@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.
- package/AGENTS.md +2 -1
- package/README.md +4 -2
- package/dist/charts/Chart.svelte +285 -0
- package/dist/charts/Chart.svelte.d.ts +15 -0
- package/dist/charts/Chart.svelte.d.ts.map +1 -0
- package/dist/charts/format.d.ts +13 -0
- package/dist/charts/format.d.ts.map +1 -0
- package/dist/charts/format.js +48 -0
- package/dist/charts/index.d.ts +5 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +2 -0
- package/dist/charts/strings.d.ts +10 -0
- package/dist/charts/strings.d.ts.map +1 -0
- package/dist/charts/strings.js +10 -0
- package/dist/charts/types.d.ts +13 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +1 -0
- package/dist/components/data/DataTable.svelte +38 -6
- 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/feedback/ConfirmDialog.svelte +1 -1
- package/dist/components/forms/Radio.svelte +1 -1
- package/dist/components/forms/SegmentedControl.svelte +1 -1
- package/dist/components/forms/Textarea.svelte +1 -1
- package/dist/components/layout/EmptyState.svelte +2 -2
- package/dist/components/nav/FilterChips.svelte +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/dist/themes/CUSTOM_THEME_GUIDE.md +6 -6
- package/dist/themes/required-tokens.generated.json +12 -0
- 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
|
|
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
|
|
@@ -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 @@
|
|
|
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,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
|
|
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;
|
|
@@ -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
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
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
|
@@ -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** (
|
|
335
|
-
- **duration** (
|
|
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** (
|
|
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** (
|
|
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** (
|
|
350
|
-
- **z** (
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|