@eifi1/ui-kit 0.8.1 → 0.10.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/README.md +25 -11
- package/dist/components/alert-banner.d.ts +32 -5
- package/dist/components/alert-banner.js +57 -14
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.d.ts +6 -0
- package/dist/components/breadcrumbs.d.ts +60 -0
- package/dist/components/breadcrumbs.js +88 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/bulk-action-bar.d.ts +66 -0
- package/dist/components/bulk-action-bar.js +149 -0
- package/dist/components/bulk-action-bar.js.map +1 -0
- package/dist/components/calculator.d.ts +6 -0
- package/dist/components/chip.d.ts +58 -10
- package/dist/components/chip.js +91 -7
- package/dist/components/chip.js.map +1 -1
- package/dist/components/copy-button.d.ts +13 -4
- package/dist/components/copy-button.js +17 -4
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/data-table-filter-popover.d.ts +1 -1
- package/dist/components/data-table-filters.d.ts +1 -1
- package/dist/components/data-table.d.ts +1 -1
- package/dist/components/data-table.js +122 -91
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.d.ts +89 -3
- package/dist/components/date-picker.js +163 -68
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/description-list.d.ts +43 -6
- package/dist/components/description-list.js +91 -11
- package/dist/components/description-list.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +7 -0
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/disclosure.d.ts +68 -4
- package/dist/components/disclosure.js +33 -15
- package/dist/components/disclosure.js.map +1 -1
- package/dist/components/file-dropzone.d.ts +3 -4
- package/dist/components/file-dropzone.js +2 -1
- package/dist/components/file-dropzone.js.map +1 -1
- package/dist/components/floating-panel.d.ts +29 -2
- package/dist/components/floating-panel.js +16 -2
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/full-bleed-dialog.d.ts +23 -4
- package/dist/components/full-bleed-dialog.js +11 -2
- package/dist/components/full-bleed-dialog.js.map +1 -1
- package/dist/components/list.d.ts +174 -0
- package/dist/components/list.js +215 -0
- package/dist/components/list.js.map +1 -0
- package/dist/components/menu-item.d.ts +99 -0
- package/dist/components/menu-item.js +83 -0
- package/dist/components/menu-item.js.map +1 -0
- package/dist/components/modal.d.ts +23 -1
- package/dist/components/modal.js +36 -10
- package/dist/components/modal.js.map +1 -1
- package/dist/components/number-field.d.ts +6 -0
- package/dist/components/number-input.d.ts +6 -0
- package/dist/components/numpad-sheet.d.ts +6 -0
- package/dist/components/page-contents.js +1 -2
- package/dist/components/page-contents.js.map +1 -1
- package/dist/components/page-header.d.ts +37 -0
- package/dist/components/page-header.js +36 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/progress-bar.d.ts +16 -2
- package/dist/components/progress-bar.js +4 -2
- package/dist/components/progress-bar.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +3 -0
- package/dist/components/series-chart-labels.js +2 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +16 -0
- package/dist/components/series-chart.js +137 -3
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/status-dot.d.ts +49 -0
- package/dist/components/status-dot.js +52 -0
- package/dist/components/status-dot.js.map +1 -0
- package/dist/components/table.d.ts +39 -6
- package/dist/components/table.js +43 -4
- package/dist/components/table.js.map +1 -1
- package/dist/components/text.d.ts +63 -0
- package/dist/components/text.js +23 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/toast.d.ts +167 -0
- package/dist/components/toast.js +226 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toggle-group.d.ts +29 -1
- package/dist/components/toggle-group.js +52 -3
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/tooltip.d.ts +38 -15
- package/dist/components/tooltip.js +85 -47
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/ui.d.ts +139 -16
- package/dist/components/ui.js +136 -26
- package/dist/components/ui.js.map +1 -1
- package/dist/components/use-table-state.d.ts +1 -1
- package/dist/{data-table-filters-CF1PXqjQ.d.ts → data-table-filters-Dh9uF_S-.d.ts} +33 -2
- package/dist/data-table.d.ts +1 -1
- package/dist/hooks/use-close-transition.d.ts +7 -1
- package/dist/hooks/use-close-transition.js +5 -2
- package/dist/hooks/use-close-transition.js.map +1 -1
- package/dist/hooks/use-copy-to-clipboard.js +1 -1
- package/dist/hooks/use-copy-to-clipboard.js.map +1 -1
- package/dist/hooks/use-overlay-history.js +84 -4
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.d.ts +6 -0
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +11 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/de-CH-informal.d.ts +6 -0
- package/dist/i18n/locales/de-CH.d.ts +6 -0
- package/dist/i18n/locales/de-informal.d.ts +6 -0
- package/dist/i18n/locales/de.d.ts +6 -0
- package/dist/i18n/locales/de.js +31 -1
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +6 -0
- package/dist/i18n/locales/es.js +31 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +6 -0
- package/dist/i18n/locales/fr.js +31 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +6 -0
- package/dist/i18n/locales/hu.js +31 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +6 -0
- package/dist/i18n/locales/it.js +31 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +6 -0
- package/dist/i18n/locales/zh.js +31 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.d.ts +18 -8
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/clipping.d.ts +9 -0
- package/dist/lib/clipping.js +14 -0
- package/dist/lib/clipping.js.map +1 -0
- package/dist/search/command-palette.d.ts +67 -2
- package/dist/search/command-palette.js +147 -33
- package/dist/search/command-palette.js.map +1 -1
- package/dist/search/global-search.d.ts +166 -0
- package/dist/search/global-search.js +293 -0
- package/dist/search/global-search.js.map +1 -0
- package/dist/search/search-index.d.ts +105 -0
- package/dist/search/search-index.js +142 -0
- package/dist/search/search-index.js.map +1 -0
- package/dist/search.d.ts +3 -1
- package/dist/search.js +2 -0
- package/dist/search.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +10 -1
- package/dist/wizard/stepper-nav.js +3 -2
- package/dist/wizard/stepper-nav.js.map +1 -1
- package/dist/wizard/types.d.ts +2 -2
- package/dist/wizard/types.js.map +1 -1
- package/dist/wizard/use-wizard.js +1 -1
- package/dist/wizard/use-wizard.js.map +1 -1
- package/dist/wizard/wizard-summary.js +3 -3
- package/dist/wizard/wizard-summary.js.map +1 -1
- package/package.json +25 -12
- package/src/components/alert-banner.tsx +117 -18
- package/src/components/breadcrumbs.tsx +168 -0
- package/src/components/bulk-action-bar.tsx +256 -0
- package/src/components/chip.tsx +164 -13
- package/src/components/copy-button.tsx +29 -7
- package/src/components/data-table.tsx +81 -5
- package/src/components/date-picker.tsx +377 -118
- package/src/components/description-list.tsx +168 -15
- package/src/components/dialog-frame.tsx +7 -0
- package/src/components/disclosure.tsx +116 -28
- package/src/components/file-dropzone.tsx +9 -10
- package/src/components/floating-panel.tsx +46 -2
- package/src/components/full-bleed-dialog.tsx +42 -5
- package/src/components/list.tsx +417 -0
- package/src/components/menu-item.tsx +214 -0
- package/src/components/modal.tsx +80 -17
- package/src/components/page-contents.tsx +4 -4
- package/src/components/page-header.tsx +68 -0
- package/src/components/progress-bar.tsx +27 -3
- package/src/components/series-chart-labels.ts +4 -0
- package/src/components/series-chart.tsx +253 -3
- package/src/components/status-dot.tsx +99 -0
- package/src/components/table.tsx +91 -6
- package/src/components/text.tsx +89 -0
- package/src/components/toast.tsx +441 -0
- package/src/components/toggle-group.tsx +82 -3
- package/src/components/tooltip.tsx +186 -100
- package/src/components/ui.tsx +321 -41
- package/src/hooks/use-close-transition.ts +14 -5
- package/src/hooks/use-copy-to-clipboard.ts +1 -1
- package/src/hooks/use-overlay-history.ts +181 -4
- package/src/i18n/defaults.ts +10 -0
- package/src/i18n/kit-labels.tsx +10 -0
- package/src/i18n/locales/de.ts +30 -0
- package/src/i18n/locales/es.ts +30 -0
- package/src/i18n/locales/fr.ts +30 -0
- package/src/i18n/locales/hu.ts +30 -0
- package/src/i18n/locales/it.ts +30 -0
- package/src/i18n/locales/zh.ts +30 -0
- package/src/index.ts +30 -0
- package/src/lib/clipping.ts +16 -0
- package/src/search/command-palette.tsx +241 -31
- package/src/search/global-search.tsx +525 -0
- package/src/search/search-index.ts +295 -0
- package/src/search.ts +2 -0
- package/src/wizard/stepper-nav.tsx +13 -2
- package/src/wizard/types.ts +2 -2
- package/src/wizard/use-wizard.ts +3 -3
- package/src/wizard/wizard-summary.tsx +14 -10
- package/tokens.css +97 -0
|
@@ -81,9 +81,48 @@ interface PushedEntry {
|
|
|
81
81
|
href: string;
|
|
82
82
|
/** Its overlay is gone but the entry is not — someone above owes this pop. */
|
|
83
83
|
dead: boolean;
|
|
84
|
+
/** The router's `idx` on this entry when the marker went on — see {@link locate}. */
|
|
85
|
+
idx: number | undefined;
|
|
86
|
+
/** The router's `key` copied from the page entry beneath ours. */
|
|
87
|
+
key: string | undefined;
|
|
88
|
+
/** {@link routeOf} the address the marker was placed at. */
|
|
89
|
+
route: string;
|
|
84
90
|
}
|
|
85
91
|
const pushed: PushedEntry[] = [];
|
|
86
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Entries of ours that a ROUTER NAVIGATION made from inside the overlay has left
|
|
95
|
+
* behind — ours, still in the history, but no longer on top and no longer anyone's.
|
|
96
|
+
*
|
|
97
|
+
* Nothing can take an entry out from under a newer one, so they cannot be unwound;
|
|
98
|
+
* what can be done is to not let the user land on one. A traversal that comes to
|
|
99
|
+
* rest on a buried entry is carried straight on over the whole run of them, in the
|
|
100
|
+
* direction it was going (see `skipBuried`): Back from the new page lands on the page
|
|
101
|
+
* the overlay was opened from, Forward from there lands on the new page, and no press
|
|
102
|
+
* is spent on an entry with nothing on screen for it.
|
|
103
|
+
*
|
|
104
|
+
* `below` / `above` count the buried entries of the same run on either side. The
|
|
105
|
+
* router's `idx` tells the direction apart — except after a REPLACE navigation, when
|
|
106
|
+
* the page above the run shares the run's `idx`; the two keys decide there.
|
|
107
|
+
*/
|
|
108
|
+
interface BuriedEntry {
|
|
109
|
+
idx: number;
|
|
110
|
+
/** The `idx` of the router entry that buried the run: higher after a push, the
|
|
111
|
+
* same after a replace. */
|
|
112
|
+
aboveIdx: number;
|
|
113
|
+
/** The key of the page entry directly beneath the run. */
|
|
114
|
+
belowKey: string | undefined;
|
|
115
|
+
/** The key of the router entry that buried the run, when it did. */
|
|
116
|
+
aboveKey: string | undefined;
|
|
117
|
+
below: number;
|
|
118
|
+
above: number;
|
|
119
|
+
}
|
|
120
|
+
const buried = new Map<string, BuriedEntry>();
|
|
121
|
+
|
|
122
|
+
/** The router `{idx, key}` of the entry the last traversal (or burial) left us on —
|
|
123
|
+
* what `skipBuried` compares against to know which way the user was going. */
|
|
124
|
+
let lastSeen: { idx: number | undefined; key: string | undefined } | null = null;
|
|
125
|
+
|
|
87
126
|
/** Entries a real Back press already consumed. Their overlay's cleanup still has to
|
|
88
127
|
* run, and it must not mistake "my entry is not current" for "my entry is buried"
|
|
89
128
|
* — it has no entry left at all. */
|
|
@@ -140,7 +179,12 @@ function runUnwind(): void {
|
|
|
140
179
|
const job = unwind;
|
|
141
180
|
unwind = null;
|
|
142
181
|
if (!job) return;
|
|
143
|
-
if (currentSentinel() !== job.id || currentHref() !== job.href)
|
|
182
|
+
if (currentSentinel() !== job.id || currentHref() !== job.href) {
|
|
183
|
+
// A router navigation landed between the cleanup and this task: the entries
|
|
184
|
+
// are under it (or were replaced by it) rather than simply forgotten.
|
|
185
|
+
if (taggedSentinel() === null) buryUnder(job.entries);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
144
188
|
pendingProgrammatic += 1;
|
|
145
189
|
window.history.go(-job.entries.length);
|
|
146
190
|
}
|
|
@@ -149,6 +193,120 @@ function currentHref(): string {
|
|
|
149
193
|
return typeof window === "undefined" ? "" : window.location.href;
|
|
150
194
|
}
|
|
151
195
|
|
|
196
|
+
/** The router's own `{idx, key}` on the current entry, where a router has put them. */
|
|
197
|
+
function routerMark(): { idx: number | undefined; key: string | undefined } {
|
|
198
|
+
const state = typeof window !== "undefined" ? (window.history.state as unknown) : null;
|
|
199
|
+
if (!state || typeof state !== "object") return { idx: undefined, key: undefined };
|
|
200
|
+
const { idx, key } = state as Record<string, unknown>;
|
|
201
|
+
return { idx: typeof idx === "number" ? idx : undefined, key: typeof key === "string" ? key : undefined };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* The part of an address that names the PAGE — the query string left out.
|
|
206
|
+
*
|
|
207
|
+
* A `setSearchParams(…, { replace: true })` rewrites the query on the entry the
|
|
208
|
+
* overlay is standing on; that is a wipe to repair, not a move. Anything else changing
|
|
209
|
+
* is a navigation. Under a hash router the page lives in the hash (`#/table?f.q=x`), so
|
|
210
|
+
* a hash that starts with `#/` counts up to its own `?`; an ordinary `#fragment` does
|
|
211
|
+
* not name a page and is left out.
|
|
212
|
+
*/
|
|
213
|
+
function routeOf(href: string): string {
|
|
214
|
+
try {
|
|
215
|
+
const url = new URL(href);
|
|
216
|
+
const hashRoute = url.hash.startsWith("#/") ? url.hash.split("?")[0] : "";
|
|
217
|
+
return url.origin + url.pathname + hashRoute;
|
|
218
|
+
} catch {
|
|
219
|
+
return href;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Is the untagged entry we are standing on still `p`'s — merely wiped by the router —
|
|
225
|
+
* or an entry the router NAVIGATED to from inside the overlay?
|
|
226
|
+
*
|
|
227
|
+
* The router's `idx` is the one per-entry fact that separates the two, because it is
|
|
228
|
+
* the one the router itself keeps straight: a replace leaves it as it was, a push adds
|
|
229
|
+
* one. Our own push copies the page's state, so our entry carries the page's `idx` and
|
|
230
|
+
* a router push on top of it carries one more. The key would not do — every replace
|
|
231
|
+
* mints a new one, so the wipe this repair exists for would already fail it. Neither
|
|
232
|
+
* would the address alone: a push to the address we are already at is still a push.
|
|
233
|
+
*
|
|
234
|
+
* `idx` does not see one move, the router REPLACING our entry with a different page
|
|
235
|
+
* (same `idx`), so the page named by the address must also be unchanged. Where there is
|
|
236
|
+
* no `idx` to compare (no router, or one that keeps none) the address is all there is.
|
|
237
|
+
*/
|
|
238
|
+
function isStillOn(p: PushedEntry): boolean {
|
|
239
|
+
if (routeOf(currentHref()) !== p.route) return false;
|
|
240
|
+
const { idx } = routerMark();
|
|
241
|
+
return idx === undefined || p.idx === undefined || idx === p.idx;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* The router has navigated while our entries were on top: record which of `records`
|
|
246
|
+
* (ours, oldest first, ending with the top one) it buried and which it replaced, and
|
|
247
|
+
* drop them from `pushed` — none of them can be unwound any more. Returns whether it
|
|
248
|
+
* recognised a navigation at all; when it cannot tell (no router `idx` to go by), it
|
|
249
|
+
* leaves everything as it was and the caller falls back to marking the entry dead.
|
|
250
|
+
*/
|
|
251
|
+
function buryUnder(records: PushedEntry[]): boolean {
|
|
252
|
+
const top = records[records.length - 1];
|
|
253
|
+
const here = routerMark();
|
|
254
|
+
if (!top || top.idx === undefined || here.idx === undefined) return false;
|
|
255
|
+
let run: PushedEntry[];
|
|
256
|
+
if (here.idx > top.idx) {
|
|
257
|
+
run = [];
|
|
258
|
+
for (let i = records.length - 1; i >= 0 && records[i].idx === top.idx; i -= 1) run.unshift(records[i]);
|
|
259
|
+
} else if (here.idx === top.idx && !isStillOn(top)) {
|
|
260
|
+
// Replaced: the top entry IS the new page now, and gone as ours. Those beneath it
|
|
261
|
+
// are buried under it.
|
|
262
|
+
run = [];
|
|
263
|
+
for (let i = records.length - 2; i >= 0 && records[i].idx === top.idx; i -= 1) run.unshift(records[i]);
|
|
264
|
+
} else {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
run.forEach((r, i) => {
|
|
268
|
+
buried.set(r.id, {
|
|
269
|
+
idx: top.idx as number,
|
|
270
|
+
aboveIdx: here.idx as number,
|
|
271
|
+
belowKey: run[0].key,
|
|
272
|
+
aboveKey: here.key,
|
|
273
|
+
below: i,
|
|
274
|
+
above: run.length - 1 - i,
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
for (const r of records) forgetPushed(r.id);
|
|
278
|
+
lastSeen = here;
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* A traversal came to rest on one of our buried entries: carry it on over the run, the
|
|
284
|
+
* way it was going. Back from above (a higher `idx`, or the very entry that buried us)
|
|
285
|
+
* continues down to the page beneath; Forward from that page continues up. A landing
|
|
286
|
+
* from anywhere this cannot place is left alone — one idle press is the price of not
|
|
287
|
+
* guessing, and a wrong guess would move the user somewhere they did not ask to go.
|
|
288
|
+
*/
|
|
289
|
+
function skipBuried(from: typeof lastSeen): void {
|
|
290
|
+
const tag = taggedSentinel();
|
|
291
|
+
const rec = tag !== null ? buried.get(tag) : undefined;
|
|
292
|
+
if (!rec || !from || stack.some((e) => e.id === tag)) return;
|
|
293
|
+
let steps = 0;
|
|
294
|
+
if ((from.idx !== undefined && from.idx > rec.idx) || (from.key !== undefined && from.key === rec.aboveKey)) {
|
|
295
|
+
steps = -(rec.below + 1);
|
|
296
|
+
} else if (
|
|
297
|
+
from.idx !== undefined &&
|
|
298
|
+
// Below the run, or level with it when nothing above it is (a push buried it),
|
|
299
|
+
// or level with it and provably the page beneath (a replace buried it). The
|
|
300
|
+
// router's first entry has no key at all, so an absent key is a key here.
|
|
301
|
+
(from.idx < rec.idx || (from.idx === rec.idx && (rec.aboveIdx > rec.idx || from.key === rec.belowKey)))
|
|
302
|
+
) {
|
|
303
|
+
steps = rec.above + 1;
|
|
304
|
+
}
|
|
305
|
+
if (steps === 0) return;
|
|
306
|
+
pendingProgrammatic += 1;
|
|
307
|
+
window.history.go(steps);
|
|
308
|
+
}
|
|
309
|
+
|
|
152
310
|
function forgetPushed(id: string): void {
|
|
153
311
|
const at = pushed.findIndex((p) => p.id === id);
|
|
154
312
|
if (at >= 0) pushed.splice(at, 1);
|
|
@@ -210,7 +368,14 @@ function currentSentinel(): string | null {
|
|
|
210
368
|
// belief left over from an overlay that is long gone — a tab that has since
|
|
211
369
|
// navigated, a test file that ran another case — would be stamped onto a
|
|
212
370
|
// stranger's entry, and the next cleanup would traverse off it.
|
|
213
|
-
|
|
371
|
+
//
|
|
372
|
+
// And only an entry that is still the one the marker was placed on. A row that
|
|
373
|
+
// NAVIGATES (a palette result, a dialog's link) has the router push the new page
|
|
374
|
+
// before the overlay's cleanup runs; that entry carries no tag either, and
|
|
375
|
+
// re-stamping it made the cleanup "unwind" the navigation itself — the page
|
|
376
|
+
// changed and changed straight back. See `isStillOn` for how the two are told apart.
|
|
377
|
+
const record = pushed.find((p) => p.id === standing);
|
|
378
|
+
if (!record || !isStillOn(record)) {
|
|
214
379
|
standing = null;
|
|
215
380
|
return null;
|
|
216
381
|
}
|
|
@@ -223,10 +388,17 @@ function handlePop() {
|
|
|
223
388
|
// entry we have landed on before anything below consults it, or the repair in
|
|
224
389
|
// `currentSentinel` would stamp the entry we just left onto the one we are on.
|
|
225
390
|
standing = taggedSentinel();
|
|
391
|
+
const from = lastSeen;
|
|
392
|
+
lastSeen = routerMark();
|
|
226
393
|
if (pendingProgrammatic > 0) {
|
|
227
394
|
pendingProgrammatic -= 1;
|
|
228
395
|
return;
|
|
229
396
|
}
|
|
397
|
+
closeOnPop();
|
|
398
|
+
skipBuried(from);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function closeOnPop() {
|
|
230
402
|
// Nothing open → an ordinary navigation, which is none of our business.
|
|
231
403
|
const top = stack[stack.length - 1];
|
|
232
404
|
if (!top) return;
|
|
@@ -290,7 +462,8 @@ export function useOverlayHistory(open: boolean, onClose: () => void): void {
|
|
|
290
462
|
window.history.replaceState(marked, "");
|
|
291
463
|
// The abandoned ones beneath come back owed; ours takes the top slot.
|
|
292
464
|
for (const owed of inherited.slice(0, -1)) pushed.push({ ...owed, dead: true });
|
|
293
|
-
|
|
465
|
+
const was = inherited[inherited.length - 1];
|
|
466
|
+
pushed.push({ id, href: currentHref(), dead: false, idx: was.idx, key: was.key, route: was.route });
|
|
294
467
|
standing = id;
|
|
295
468
|
} else {
|
|
296
469
|
// A push DESTROYS every entry ahead of the one we are on, so anything we
|
|
@@ -304,7 +477,8 @@ export function useOverlayHistory(open: boolean, onClose: () => void): void {
|
|
|
304
477
|
// Preserve react-router's own `{usr,key,idx}` — we only tack a marker on, and
|
|
305
478
|
// the URL is unchanged, so the router treats popping this as a no-op re-render.
|
|
306
479
|
window.history.pushState(marked, "");
|
|
307
|
-
|
|
480
|
+
const page = routerMark();
|
|
481
|
+
pushed.push({ id, href: currentHref(), dead: false, idx: page.idx, key: page.key, route: routeOf(currentHref()) });
|
|
308
482
|
standing = id;
|
|
309
483
|
}
|
|
310
484
|
return () => {
|
|
@@ -320,6 +494,9 @@ export function useOverlayHistory(open: boolean, onClose: () => void): void {
|
|
|
320
494
|
// a SIBLING overlay's sentinel landed on top, that overlay is about to unwind
|
|
321
495
|
// and is the one that can take ours with it.
|
|
322
496
|
if (currentSentinel() !== id) {
|
|
497
|
+
// A router navigation from inside the overlay: nothing to unwind — the
|
|
498
|
+
// entries it left beneath the new page are skipped over instead.
|
|
499
|
+
if (mine >= 0 && taggedSentinel() === null && buryUnder(pushed.slice(0, pushed.length))) return;
|
|
323
500
|
if (mine >= 0) pushed[mine].dead = true;
|
|
324
501
|
return;
|
|
325
502
|
}
|
package/src/i18n/defaults.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { DEFAULT_PASSWORD_REVEAL_LABELS, DEFAULT_TABS_LABELS } from "../componen
|
|
|
9
9
|
import { DEFAULT_WIZARD_LABELS } from "../wizard/types";
|
|
10
10
|
import { DEFAULT_TOUR_LABELS } from "../tour/tour";
|
|
11
11
|
import { DEFAULT_COMMAND_PALETTE_LABELS } from "../search/command-palette";
|
|
12
|
+
import { DEFAULT_GLOBAL_SEARCH_LABELS } from "../search/global-search";
|
|
12
13
|
import { DEFAULT_SERIES_CHART_LABELS } from "../components/series-chart-labels";
|
|
13
14
|
import { DEFAULT_SPARKLINE_LABELS } from "../components/sparkline";
|
|
14
15
|
import { DEFAULT_STAT_TILE_LABELS } from "../components/stat-tile";
|
|
@@ -24,6 +25,10 @@ import { DEFAULT_CONFIRM_DIALOG_LABELS } from "../components/confirm-dialog";
|
|
|
24
25
|
import { DEFAULT_FLOATING_PANEL_LABELS } from "../components/floating-panel";
|
|
25
26
|
import { DEFAULT_FEEDBACK_ATTACHMENT_LABELS } from "../feedback/feedback-attachment";
|
|
26
27
|
import { DEFAULT_COPY_BUTTON_LABELS } from "../components/copy-button";
|
|
28
|
+
import { DEFAULT_BULK_ACTION_BAR_LABELS } from "../components/bulk-action-bar";
|
|
29
|
+
import { DEFAULT_LIST_LABELS } from "../components/list";
|
|
30
|
+
import { DEFAULT_BREADCRUMBS_LABELS } from "../components/breadcrumbs";
|
|
31
|
+
import { DEFAULT_TOAST_LABELS } from "../components/toast";
|
|
27
32
|
import {
|
|
28
33
|
DEFAULT_APP_SHELL_LABELS,
|
|
29
34
|
DEFAULT_CALCULATOR_LABELS,
|
|
@@ -71,6 +76,7 @@ export const DEFAULT_UI_KIT_LABELS: UiKitLabels = {
|
|
|
71
76
|
wizard: DEFAULT_WIZARD_LABELS,
|
|
72
77
|
tour: DEFAULT_TOUR_LABELS,
|
|
73
78
|
commandPalette: DEFAULT_COMMAND_PALETTE_LABELS,
|
|
79
|
+
globalSearch: DEFAULT_GLOBAL_SEARCH_LABELS,
|
|
74
80
|
seriesChart: DEFAULT_SERIES_CHART_LABELS,
|
|
75
81
|
sparkline: DEFAULT_SPARKLINE_LABELS,
|
|
76
82
|
statTile: DEFAULT_STAT_TILE_LABELS,
|
|
@@ -86,4 +92,8 @@ export const DEFAULT_UI_KIT_LABELS: UiKitLabels = {
|
|
|
86
92
|
confirmDialog: DEFAULT_CONFIRM_DIALOG_LABELS,
|
|
87
93
|
floatingPanel: DEFAULT_FLOATING_PANEL_LABELS,
|
|
88
94
|
copyButton: DEFAULT_COPY_BUTTON_LABELS,
|
|
95
|
+
bulkActionBar: DEFAULT_BULK_ACTION_BAR_LABELS,
|
|
96
|
+
list: DEFAULT_LIST_LABELS,
|
|
97
|
+
breadcrumbs: DEFAULT_BREADCRUMBS_LABELS,
|
|
98
|
+
toast: DEFAULT_TOAST_LABELS,
|
|
89
99
|
};
|
package/src/i18n/kit-labels.tsx
CHANGED
|
@@ -9,6 +9,7 @@ import type { PasswordRevealLabels, TabsLabels } from "../components/ui";
|
|
|
9
9
|
import type { WizardLabels } from "../wizard/types";
|
|
10
10
|
import type { TourLabels } from "../tour/tour";
|
|
11
11
|
import type { CommandPaletteLabels } from "../search/command-palette";
|
|
12
|
+
import type { GlobalSearchLabels } from "../search/global-search";
|
|
12
13
|
import type { MonthPickerLabels } from "../components/month-picker";
|
|
13
14
|
import type { PageContentsLabels } from "../components/page-contents";
|
|
14
15
|
import type { SeriesChartLabels } from "../components/series-chart-labels";
|
|
@@ -26,6 +27,10 @@ import type { FeedbackAttachmentFieldLabels } from "../feedback/feedback-attachm
|
|
|
26
27
|
import type { ConfirmDialogLabels } from "../components/confirm-dialog";
|
|
27
28
|
import type { FloatingPanelLabels } from "../components/floating-panel";
|
|
28
29
|
import type { CopyButtonLabels } from "../components/copy-button";
|
|
30
|
+
import type { BulkActionBarLabels } from "../components/bulk-action-bar";
|
|
31
|
+
import type { ListLabels } from "../components/list";
|
|
32
|
+
import type { BreadcrumbsLabels } from "../components/breadcrumbs";
|
|
33
|
+
import type { ToastLabels } from "../components/toast";
|
|
29
34
|
|
|
30
35
|
/**
|
|
31
36
|
* EVERY string the kit renders, as one typed tree — and an optional provider that
|
|
@@ -212,6 +217,7 @@ export interface UiKitLabels {
|
|
|
212
217
|
wizard: WizardLabels;
|
|
213
218
|
tour: TourLabels;
|
|
214
219
|
commandPalette: CommandPaletteLabels;
|
|
220
|
+
globalSearch: GlobalSearchLabels;
|
|
215
221
|
seriesChart: SeriesChartLabels;
|
|
216
222
|
sparkline: SparklineLabels;
|
|
217
223
|
statTile: StatTileLabels;
|
|
@@ -227,6 +233,10 @@ export interface UiKitLabels {
|
|
|
227
233
|
confirmDialog: ConfirmDialogLabels;
|
|
228
234
|
floatingPanel: FloatingPanelLabels;
|
|
229
235
|
copyButton: CopyButtonLabels;
|
|
236
|
+
bulkActionBar: BulkActionBarLabels;
|
|
237
|
+
list: ListLabels;
|
|
238
|
+
breadcrumbs: BreadcrumbsLabels;
|
|
239
|
+
toast: ToastLabels;
|
|
230
240
|
}
|
|
231
241
|
|
|
232
242
|
/** Any subset of the tree, one level deep — each namespace may be partial, and a
|
package/src/i18n/locales/de.ts
CHANGED
|
@@ -239,6 +239,11 @@ export function uiKitLabelsDe(numberLocale = "de-DE"): UiKitLabels {
|
|
|
239
239
|
dialogFrame: {
|
|
240
240
|
close: "Schließen",
|
|
241
241
|
},
|
|
242
|
+
bulkActionBar: {
|
|
243
|
+
selected: (count) => `${n(count)} ausgewählt`,
|
|
244
|
+
clear: "Auswahl aufheben",
|
|
245
|
+
cleared: "Auswahl aufgehoben",
|
|
246
|
+
},
|
|
242
247
|
swipeableRow: {
|
|
243
248
|
actions: "Zeilenaktionen",
|
|
244
249
|
},
|
|
@@ -302,12 +307,22 @@ export function uiKitLabelsDe(numberLocale = "de-DE"): UiKitLabels {
|
|
|
302
307
|
step: (current, total) => `${n(current)} / ${n(total)}`,
|
|
303
308
|
},
|
|
304
309
|
commandPalette: {
|
|
310
|
+
clear: "Suche löschen",
|
|
311
|
+
submit: "Suchen",
|
|
312
|
+
close: "Schließen",
|
|
305
313
|
placeholder: "Suchen…",
|
|
306
314
|
empty: "Keine Ergebnisse",
|
|
307
315
|
loading: "Wird gesucht…",
|
|
308
316
|
dialog: "Suche",
|
|
309
317
|
error: "Die Suche ist fehlgeschlagen. Bitte erneut versuchen.",
|
|
310
318
|
},
|
|
319
|
+
globalSearch: {
|
|
320
|
+
trigger: "Suche",
|
|
321
|
+
placeholder: "Suchen oder springen zu…",
|
|
322
|
+
shortcut: (keys) => `Suche (${keys})`,
|
|
323
|
+
suggestions: "Vorschläge",
|
|
324
|
+
results: "Ergebnisse",
|
|
325
|
+
},
|
|
311
326
|
sparkline: {
|
|
312
327
|
rising: (first, last) => `Steigend von ${first} auf ${last}`,
|
|
313
328
|
falling: (first, last) => `Fallend von ${first} auf ${last}`,
|
|
@@ -369,6 +384,7 @@ export function uiKitLabelsDe(numberLocale = "de-DE"): UiKitLabels {
|
|
|
369
384
|
"Zum Zoomen ziehen: Eine annähernd quadratische Auswahl zoomt beide Achsen, eine lange, schmale nur ihre eigene. Doppelklick setzt zurück.",
|
|
370
385
|
empty: "Keine Daten",
|
|
371
386
|
legend: "Datenreihen",
|
|
387
|
+
points: "Diagrammwerte",
|
|
372
388
|
},
|
|
373
389
|
confirmDialog: {
|
|
374
390
|
confirm: "Bestätigen",
|
|
@@ -384,6 +400,20 @@ export function uiKitLabelsDe(numberLocale = "de-DE"): UiKitLabels {
|
|
|
384
400
|
copiedAnnouncement: "In die Zwischenablage kopiert",
|
|
385
401
|
failedAnnouncement: "Kopieren in die Zwischenablage fehlgeschlagen",
|
|
386
402
|
},
|
|
403
|
+
list: {
|
|
404
|
+
unread: "Ungelesen",
|
|
405
|
+
opensInNewTab: "öffnet in einem neuen Tab",
|
|
406
|
+
},
|
|
407
|
+
breadcrumbs: {
|
|
408
|
+
label: "Brotkrümelnavigation",
|
|
409
|
+
showAll: "Vollständigen Pfad anzeigen",
|
|
410
|
+
},
|
|
411
|
+
toast: {
|
|
412
|
+
close: "Benachrichtigung schließen",
|
|
413
|
+
notifications: "Benachrichtigungen",
|
|
414
|
+
undo: "Rückgängig",
|
|
415
|
+
redo: "Wiederholen",
|
|
416
|
+
},
|
|
387
417
|
};
|
|
388
418
|
}
|
|
389
419
|
|
package/src/i18n/locales/es.ts
CHANGED
|
@@ -236,6 +236,11 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
236
236
|
dialogFrame: {
|
|
237
237
|
close: "Cerrar",
|
|
238
238
|
},
|
|
239
|
+
bulkActionBar: {
|
|
240
|
+
selected: (count) => `${n(count)} ${count === 1 ? "seleccionado" : "seleccionados"}`,
|
|
241
|
+
clear: "Borrar selección",
|
|
242
|
+
cleared: "Selección borrada",
|
|
243
|
+
},
|
|
239
244
|
swipeableRow: {
|
|
240
245
|
actions: "Acciones de la fila",
|
|
241
246
|
},
|
|
@@ -295,12 +300,22 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
295
300
|
step: (current, total) => `${n(current)} / ${n(total)}`,
|
|
296
301
|
},
|
|
297
302
|
commandPalette: {
|
|
303
|
+
clear: "Borrar búsqueda",
|
|
304
|
+
submit: "Buscar",
|
|
305
|
+
close: "Cerrar",
|
|
298
306
|
placeholder: "Buscar…",
|
|
299
307
|
empty: "Sin resultados",
|
|
300
308
|
loading: "Buscando…",
|
|
301
309
|
dialog: "Búsqueda",
|
|
302
310
|
error: "La búsqueda ha fallado. Inténtelo de nuevo.",
|
|
303
311
|
},
|
|
312
|
+
globalSearch: {
|
|
313
|
+
trigger: "Buscar",
|
|
314
|
+
placeholder: "Buscar o ir a…",
|
|
315
|
+
shortcut: (keys) => `Buscar (${keys})`,
|
|
316
|
+
suggestions: "Pruebe",
|
|
317
|
+
results: "Resultados",
|
|
318
|
+
},
|
|
304
319
|
sparkline: {
|
|
305
320
|
rising: (first, last) => `Sube de ${first} a ${last}`,
|
|
306
321
|
falling: (first, last) => `Baja de ${first} a ${last}`,
|
|
@@ -362,6 +377,7 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
362
377
|
"Arrastra para ampliar: una selección más o menos cuadrada amplía ambos ejes; una larga y estrecha, solo el suyo. Haz doble clic para restablecer.",
|
|
363
378
|
empty: "Sin datos",
|
|
364
379
|
legend: "Series",
|
|
380
|
+
points: "Valores del gráfico",
|
|
365
381
|
},
|
|
366
382
|
confirmDialog: {
|
|
367
383
|
confirm: "Confirmar",
|
|
@@ -377,6 +393,20 @@ export function uiKitLabelsEs(numberLocale = "es-ES"): UiKitLabels {
|
|
|
377
393
|
copiedAnnouncement: "Copiado al portapapeles",
|
|
378
394
|
failedAnnouncement: "No se pudo copiar al portapapeles",
|
|
379
395
|
},
|
|
396
|
+
list: {
|
|
397
|
+
unread: "No leído",
|
|
398
|
+
opensInNewTab: "se abre en una pestaña nueva",
|
|
399
|
+
},
|
|
400
|
+
breadcrumbs: {
|
|
401
|
+
label: "Ruta de navegación",
|
|
402
|
+
showAll: "Mostrar la ruta completa",
|
|
403
|
+
},
|
|
404
|
+
toast: {
|
|
405
|
+
close: "Cerrar notificación",
|
|
406
|
+
notifications: "Notificaciones",
|
|
407
|
+
undo: "Deshacer",
|
|
408
|
+
redo: "Rehacer",
|
|
409
|
+
},
|
|
380
410
|
};
|
|
381
411
|
}
|
|
382
412
|
|
package/src/i18n/locales/fr.ts
CHANGED
|
@@ -241,6 +241,11 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
241
241
|
dialogFrame: {
|
|
242
242
|
close: "Fermer",
|
|
243
243
|
},
|
|
244
|
+
bulkActionBar: {
|
|
245
|
+
selected: (count) => `${n(count)} ${count === 1 ? "sélectionné" : "sélectionnés"}`,
|
|
246
|
+
clear: "Effacer la sélection",
|
|
247
|
+
cleared: "Sélection effacée",
|
|
248
|
+
},
|
|
244
249
|
swipeableRow: {
|
|
245
250
|
actions: "Actions de la ligne",
|
|
246
251
|
},
|
|
@@ -307,12 +312,22 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
307
312
|
step: (current, total) => `${n(current)} / ${n(total)}`,
|
|
308
313
|
},
|
|
309
314
|
commandPalette: {
|
|
315
|
+
clear: "Effacer la recherche",
|
|
316
|
+
submit: "Rechercher",
|
|
317
|
+
close: "Fermer",
|
|
310
318
|
placeholder: "Rechercher…",
|
|
311
319
|
empty: "Aucun résultat",
|
|
312
320
|
loading: "Recherche…",
|
|
313
321
|
dialog: "Recherche",
|
|
314
322
|
error: "La recherche a échoué. Réessayez.",
|
|
315
323
|
},
|
|
324
|
+
globalSearch: {
|
|
325
|
+
trigger: "Rechercher",
|
|
326
|
+
placeholder: "Rechercher ou aller à…",
|
|
327
|
+
shortcut: (keys) => `Rechercher (${keys})`,
|
|
328
|
+
suggestions: "Essayez",
|
|
329
|
+
results: "Résultats",
|
|
330
|
+
},
|
|
316
331
|
sparkline: {
|
|
317
332
|
// "En hausse de 12 à 40" would read as "up BY 12", hence the colon.
|
|
318
333
|
rising: (first, last) => `En hausse\u00a0: de ${first} à ${last}`,
|
|
@@ -375,6 +390,7 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
375
390
|
"Faites glisser pour zoomer\u00a0: une sélection à peu près carrée zoome sur les deux axes, une sélection longue et étroite sur son seul axe. Double-cliquez pour réinitialiser.",
|
|
376
391
|
empty: "Aucune donnée",
|
|
377
392
|
legend: "Séries",
|
|
393
|
+
points: "Valeurs du graphique",
|
|
378
394
|
},
|
|
379
395
|
confirmDialog: {
|
|
380
396
|
confirm: "Confirmer",
|
|
@@ -390,6 +406,20 @@ export function uiKitLabelsFr(numberLocale = "fr-FR"): UiKitLabels {
|
|
|
390
406
|
copiedAnnouncement: "Copié dans le presse-papiers",
|
|
391
407
|
failedAnnouncement: "Impossible de copier dans le presse-papiers",
|
|
392
408
|
},
|
|
409
|
+
list: {
|
|
410
|
+
unread: "Non lu",
|
|
411
|
+
opensInNewTab: "s’ouvre dans un nouvel onglet",
|
|
412
|
+
},
|
|
413
|
+
breadcrumbs: {
|
|
414
|
+
label: "Fil d’Ariane",
|
|
415
|
+
showAll: "Afficher le chemin complet",
|
|
416
|
+
},
|
|
417
|
+
toast: {
|
|
418
|
+
close: "Fermer la notification",
|
|
419
|
+
notifications: "Notifications",
|
|
420
|
+
undo: "Annuler",
|
|
421
|
+
redo: "Rétablir",
|
|
422
|
+
},
|
|
393
423
|
};
|
|
394
424
|
}
|
|
395
425
|
|
package/src/i18n/locales/hu.ts
CHANGED
|
@@ -234,6 +234,11 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
234
234
|
dialogFrame: {
|
|
235
235
|
close: "Bezárás",
|
|
236
236
|
},
|
|
237
|
+
bulkActionBar: {
|
|
238
|
+
selected: (count) => `${n(count)} kijelölve`,
|
|
239
|
+
clear: "Kijelölés törlése",
|
|
240
|
+
cleared: "Kijelölés törölve",
|
|
241
|
+
},
|
|
237
242
|
swipeableRow: {
|
|
238
243
|
actions: "Sorműveletek",
|
|
239
244
|
},
|
|
@@ -297,12 +302,22 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
297
302
|
step: (current, total) => `${n(current)} / ${n(total)}`,
|
|
298
303
|
},
|
|
299
304
|
commandPalette: {
|
|
305
|
+
clear: "Keresés törlése",
|
|
306
|
+
submit: "Keresés",
|
|
307
|
+
close: "Bezárás",
|
|
300
308
|
placeholder: "Keresés…",
|
|
301
309
|
empty: "Nincs találat",
|
|
302
310
|
loading: "Keresés folyamatban…",
|
|
303
311
|
dialog: "Keresés",
|
|
304
312
|
error: "A keresés nem sikerült. Próbálja újra.",
|
|
305
313
|
},
|
|
314
|
+
globalSearch: {
|
|
315
|
+
trigger: "Keresés",
|
|
316
|
+
placeholder: "Keresés vagy ugrás…",
|
|
317
|
+
shortcut: (keys) => `Keresés (${keys})`,
|
|
318
|
+
suggestions: "Próbálja ki",
|
|
319
|
+
results: "Találatok",
|
|
320
|
+
},
|
|
306
321
|
sparkline: {
|
|
307
322
|
// Numerals stay bare (see 3. above): "12-ről 40-re" would need vowel harmony.
|
|
308
323
|
rising: (first, last) => `Emelkedik (első érték: ${first}, utolsó: ${last})`,
|
|
@@ -363,6 +378,7 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
363
378
|
"Húzással nagyíthat: a nagyjából négyzetes kijelölés mindkét tengelyt nagyítja, a hosszú, keskeny csak a saját tengelyét. Dupla kattintással visszaállíthatja.",
|
|
364
379
|
empty: "Nincs adat",
|
|
365
380
|
legend: "Adatsorok",
|
|
381
|
+
points: "Diagramértékek",
|
|
366
382
|
},
|
|
367
383
|
confirmDialog: {
|
|
368
384
|
confirm: "Megerősítés",
|
|
@@ -378,6 +394,20 @@ export function uiKitLabelsHu(numberLocale = "hu-HU"): UiKitLabels {
|
|
|
378
394
|
copiedAnnouncement: "Vágólapra másolva",
|
|
379
395
|
failedAnnouncement: "Nem sikerült a vágólapra másolni",
|
|
380
396
|
},
|
|
397
|
+
list: {
|
|
398
|
+
unread: "Olvasatlan",
|
|
399
|
+
opensInNewTab: "új lapon nyílik meg",
|
|
400
|
+
},
|
|
401
|
+
breadcrumbs: {
|
|
402
|
+
label: "Morzsamenü",
|
|
403
|
+
showAll: "Teljes útvonal megjelenítése",
|
|
404
|
+
},
|
|
405
|
+
toast: {
|
|
406
|
+
close: "Értesítés bezárása",
|
|
407
|
+
notifications: "Értesítések",
|
|
408
|
+
undo: "Visszavonás",
|
|
409
|
+
redo: "Újra",
|
|
410
|
+
},
|
|
381
411
|
};
|
|
382
412
|
}
|
|
383
413
|
|
package/src/i18n/locales/it.ts
CHANGED
|
@@ -237,6 +237,11 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
237
237
|
dialogFrame: {
|
|
238
238
|
close: "Chiudi",
|
|
239
239
|
},
|
|
240
|
+
bulkActionBar: {
|
|
241
|
+
selected: (count) => `${n(count)} ${count === 1 ? "selezionato" : "selezionati"}`,
|
|
242
|
+
clear: "Annulla selezione",
|
|
243
|
+
cleared: "Selezione annullata",
|
|
244
|
+
},
|
|
240
245
|
swipeableRow: {
|
|
241
246
|
actions: "Azioni della riga",
|
|
242
247
|
},
|
|
@@ -297,12 +302,22 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
297
302
|
step: (current, total) => `${n(current)} / ${n(total)}`,
|
|
298
303
|
},
|
|
299
304
|
commandPalette: {
|
|
305
|
+
clear: "Cancella ricerca",
|
|
306
|
+
submit: "Cerca",
|
|
307
|
+
close: "Chiudi",
|
|
300
308
|
placeholder: "Cerca…",
|
|
301
309
|
empty: "Nessun risultato",
|
|
302
310
|
loading: "Ricerca in corso…",
|
|
303
311
|
dialog: "Ricerca",
|
|
304
312
|
error: "Ricerca non riuscita. Riprova.",
|
|
305
313
|
},
|
|
314
|
+
globalSearch: {
|
|
315
|
+
trigger: "Cerca",
|
|
316
|
+
placeholder: "Cerca o vai a…",
|
|
317
|
+
shortcut: (keys) => `Cerca (${keys})`,
|
|
318
|
+
suggestions: "Prova",
|
|
319
|
+
results: "Risultati",
|
|
320
|
+
},
|
|
306
321
|
sparkline: {
|
|
307
322
|
rising: (first, last) => `In aumento da ${first} a ${last}`,
|
|
308
323
|
falling: (first, last) => `In calo da ${first} a ${last}`,
|
|
@@ -364,6 +379,7 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
364
379
|
"Trascina per ingrandire: una selezione più o meno quadrata ingrandisce entrambi gli assi, una lunga e sottile solo il proprio. Fai doppio clic per ripristinare.",
|
|
365
380
|
empty: "Nessun dato",
|
|
366
381
|
legend: "Serie",
|
|
382
|
+
points: "Valori del grafico",
|
|
367
383
|
},
|
|
368
384
|
confirmDialog: {
|
|
369
385
|
confirm: "Conferma",
|
|
@@ -379,6 +395,20 @@ export function uiKitLabelsIt(numberLocale = "it-IT"): UiKitLabels {
|
|
|
379
395
|
copiedAnnouncement: "Copiato negli appunti",
|
|
380
396
|
failedAnnouncement: "Impossibile copiare negli appunti",
|
|
381
397
|
},
|
|
398
|
+
list: {
|
|
399
|
+
unread: "Non letto",
|
|
400
|
+
opensInNewTab: "si apre in una nuova scheda",
|
|
401
|
+
},
|
|
402
|
+
breadcrumbs: {
|
|
403
|
+
label: "Percorso di navigazione",
|
|
404
|
+
showAll: "Mostra percorso completo",
|
|
405
|
+
},
|
|
406
|
+
toast: {
|
|
407
|
+
close: "Chiudi notifica",
|
|
408
|
+
notifications: "Notifiche",
|
|
409
|
+
undo: "Annulla",
|
|
410
|
+
redo: "Ripeti",
|
|
411
|
+
},
|
|
382
412
|
};
|
|
383
413
|
}
|
|
384
414
|
|