@wssto2/vue-core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +20 -9
  2. package/dist/{AdaptivePageShell.vue_vue_type_script_setup_true_lang-CKghARkW.js → AdaptivePageShell.vue_vue_type_script_setup_true_lang-CeKK8_g5.js} +2 -2
  3. package/dist/{AlertDialog.vue_vue_type_script_setup_true_lang-BZb4qKXo.js → AlertDialog.vue_vue_type_script_setup_true_lang-e4hzkzg3.js} +1 -1
  4. package/dist/{AsyncSection.vue_vue_type_script_setup_true_lang-B82bl36A.js → AsyncSection.vue_vue_type_script_setup_true_lang-CWLB3xsR.js} +1 -1
  5. package/dist/Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js +51 -0
  6. package/dist/Button.vue_vue_type_script_setup_true_lang-B1eZgLae.js +182 -0
  7. package/dist/CountryFlag.vue_vue_type_script_setup_true_lang-Kry_vPPZ.js +299 -0
  8. package/dist/{DiscardChangesModal.vue_vue_type_script_setup_true_lang-Bx5O1RZJ.js → DiscardChangesModal.vue_vue_type_script_setup_true_lang-DyhYHRyz.js} +1 -1
  9. package/dist/{LeaveGuardRoot.vue_vue_type_script_setup_true_lang-DH6EB8br.js → LeaveGuardRoot.vue_vue_type_script_setup_true_lang-CvwoT1JF.js} +1 -1
  10. package/dist/{Menu.vue_vue_type_script_setup_true_lang-D44EHXQZ.js → Menu.vue_vue_type_script_setup_true_lang-CrMj6KPD.js} +1 -1
  11. package/dist/{Modal.vue_vue_type_script_setup_true_lang-DYQgaUtj.js → Modal.vue_vue_type_script_setup_true_lang-BQZM49gC.js} +138 -128
  12. package/dist/{PhotoViewer.vue_vue_type_script_setup_true_lang-DDVQXJRB.js → PhotoViewer.vue_vue_type_script_setup_true_lang-ElDizaW2.js} +1 -1
  13. package/dist/{SectionList.vue_vue_type_script_setup_true_lang-DGcKX_OJ.js → SectionList.vue_vue_type_script_setup_true_lang-L9ita_Kx.js} +2 -2
  14. package/dist/SelectField.vue_vue_type_script_setup_true_lang-DZTrU8NJ.js +661 -0
  15. package/dist/{Sheet.vue_vue_type_script_setup_true_lang-BLBD5ps8.js → Sheet.vue_vue_type_script_setup_true_lang-CtkJ-4e3.js} +1 -1
  16. package/dist/{Tooltip.vue_vue_type_script_setup_true_lang-BJWPVyfT.js → Tooltip.vue_vue_type_script_setup_true_lang-OOD_XNWx.js} +1 -1
  17. package/dist/app/application.d.ts +5 -0
  18. package/dist/app/environment.d.ts +2 -0
  19. package/dist/app/index.js +75 -72
  20. package/dist/button/index.d.ts +1 -1
  21. package/dist/button/index.js +5 -3
  22. package/dist/button/shortcut.d.ts +28 -2
  23. package/dist/collection/CollectionPage.vue.d.ts +1 -0
  24. package/dist/collection/CollectionRows.vue.d.ts +59 -0
  25. package/dist/collection/CollectionTable.vue.d.ts +1 -1
  26. package/dist/collection/DataTable.vue.d.ts +47 -0
  27. package/dist/collection/RowActions.vue.d.ts +19 -0
  28. package/dist/collection/columns.d.ts +2 -0
  29. package/dist/collection/index.d.ts +4 -2
  30. package/dist/collection/index.js +1752 -1610
  31. package/dist/collection/rowLayout.d.ts +10 -0
  32. package/dist/collection/slots.d.ts +6 -3
  33. package/dist/describeError-l5T9b8Uv.js +41 -0
  34. package/dist/dialogStack-DZZg55w0.js +31 -0
  35. package/dist/form/CommandDialog.vue.d.ts +12 -1
  36. package/dist/form/FormGroup.vue.d.ts +1 -1
  37. package/dist/form/MultiSelectField.vue.d.ts +4 -1
  38. package/dist/form/NumberField.vue.d.ts +6 -0
  39. package/dist/form/OptionList.vue.d.ts +6 -2
  40. package/dist/form/SelectField.vue.d.ts +4 -1
  41. package/dist/form/index.d.ts +2 -0
  42. package/dist/form/index.js +1940 -2008
  43. package/dist/form/suggestions.d.ts +11 -0
  44. package/dist/form/useOptions.d.ts +60 -0
  45. package/dist/i18n/describeError.d.ts +31 -0
  46. package/dist/i18n/index.d.ts +26 -0
  47. package/dist/i18n/index.js +22 -20
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.js +1 -1
  50. package/dist/internal/CountryFlag.vue.d.ts +10 -0
  51. package/dist/modal/Modal.vue.d.ts +4 -0
  52. package/dist/modal/ShortcutHelp.vue.d.ts +2 -0
  53. package/dist/modal/index.d.ts +2 -0
  54. package/dist/modal/index.js +64 -6
  55. package/dist/modal/placement.d.ts +22 -0
  56. package/dist/{options-CjSz2dQK.js → options-DAkBtYkI.js} +3 -3
  57. package/dist/overlay/Popover.vue.d.ts +3 -0
  58. package/dist/overlay/dialogStack.d.ts +9 -0
  59. package/dist/overlay/index.d.ts +1 -1
  60. package/dist/overlay/index.js +18 -17
  61. package/dist/page/index.js +4 -4
  62. package/dist/phone/index.js +247 -540
  63. package/dist/platform/AccessGate.vue.d.ts +50 -0
  64. package/dist/platform/index.d.ts +2 -0
  65. package/dist/platform/index.js +86 -66
  66. package/dist/resource/index.js +42 -42
  67. package/dist/shell/AccountMenuItem.vue.d.ts +3 -0
  68. package/dist/shell/NavigationList.vue.d.ts +1 -1
  69. package/dist/shell/index.js +406 -394
  70. package/dist/state/Badge.vue.d.ts +17 -10
  71. package/dist/state/hue.d.ts +8 -0
  72. package/dist/state/index.d.ts +2 -0
  73. package/dist/state/index.js +92 -56
  74. package/dist/state/useLoad.d.ts +41 -0
  75. package/dist/styles.css +1 -1
  76. package/dist/testing/app.d.ts +61 -0
  77. package/dist/testing/async.d.ts +12 -0
  78. package/dist/testing/collection.d.ts +18 -0
  79. package/dist/testing/format.d.ts +9 -0
  80. package/dist/testing/i18n.d.ts +16 -0
  81. package/dist/testing/index.d.ts +14 -0
  82. package/dist/testing/index.js +178 -0
  83. package/dist/testing/media.d.ts +23 -0
  84. package/dist/testing/platform.d.ts +40 -0
  85. package/dist/testing/transport.d.ts +40 -0
  86. package/dist/{toast-BTeX0r66.js → toast-DvrHQ6Ag.js} +45 -43
  87. package/dist/{useDialog-wmyNx2j_.js → useDialog-CXR3hN0G.js} +1 -1
  88. package/package.json +5 -1
  89. package/src/styles/theme.css +60 -0
  90. package/dist/Badge.vue_vue_type_script_setup_true_lang-DKc6ugmr.js +0 -31
  91. package/dist/Button.vue_vue_type_script_setup_true_lang-3f0emVNU.js +0 -141
  92. package/dist/SelectField.vue_vue_type_script_setup_true_lang-SyFWE33A.js +0 -422
  93. package/dist/dialogStack-DiTG1rZc.js +0 -26
  94. package/dist/phone/CountryFlag.vue.d.ts +0 -10
  95. /package/dist/{phone → internal}/flagLoaders.d.ts +0 -0
@@ -32,6 +32,17 @@ export declare function matchParts(label: string, query: string): {
32
32
  export declare function completionOf(typed: string, label: string): string;
33
33
  /** Whether the list has anything to say: rows, a loading or failed line, or (a pick list) that nothing matched. */
34
34
  export declare function listShows(open: boolean, count: number, status: SuggestionStatus, emptyMessage: boolean): boolean;
35
+ /**
36
+ * One load at a time, the latest wins: asking again aborts the older request and its late answer (or late failure) is dropped.
37
+ * The status is the discriminated state of the wait (`idle` until something is asked). Shared by the suggestions engine and by
38
+ * `useOptions`, so a typed search and a dependent select race the same way.
39
+ */
40
+ export declare function useLatestLoad<Item>(): {
41
+ items: import("vue").ShallowRef<readonly Item[], readonly Item[]>;
42
+ status: import("vue").Ref<SuggestionStatus, SuggestionStatus>;
43
+ run: (load: (signal: AbortSignal) => Promise<readonly Item[]>, settle?: (found: readonly Item[]) => readonly Item[]) => Promise<void>;
44
+ cancel: () => void;
45
+ };
35
46
  export interface SuggestionsOptions<Value extends string | number> {
36
47
  source: () => SuggestionSource<Value> | undefined;
37
48
  /** The fewest characters before a function source is asked. */
@@ -0,0 +1,60 @@
1
+ import type { SelectOption } from "./options";
2
+ import { type SuggestionStatus } from "./suggestions";
3
+ /**
4
+ * The options of a select that arrive from the server. `status` is the state of the wait, `options` the last answer that
5
+ * landed (kept while the next is loading, so the chosen option keeps its label). Pass it where a list goes:
6
+ * `<SelectField :options="models" />`, `<MultiSelectField :options="models" />`.
7
+ */
8
+ export interface AsyncOptions<Value extends string | number = string | number> {
9
+ /** `idle`: nothing to ask yet (the input this depends on is empty). */
10
+ readonly status: SuggestionStatus;
11
+ readonly options: readonly SelectOption<Value>[];
12
+ /**
13
+ * Counts how often the input these options depend on moved away from a value (the user picked another make). A field clears
14
+ * a value the options lack only when options land for a newer generation: never on the first load (a saved value the list no
15
+ * longer offers stays), never on a `reload()` of the same input.
16
+ */
17
+ readonly generation: number;
18
+ /** Asks again for the current input (the "Try again" row of a failed load). */
19
+ reload(): void;
20
+ }
21
+ /** What a select takes as its options: a list, or one that loads. */
22
+ export type OptionsSource<Value extends string | number> = readonly SelectOption<Value>[] | AsyncOptions<Value>;
23
+ export interface OptionsContext {
24
+ /** Aborted when a newer ask replaced this one or the scope ended: pass it on to the request. */
25
+ readonly signal: AbortSignal;
26
+ }
27
+ /**
28
+ * Options loaded from the server, with the race rules built in: the latest input wins, an answer for an older input is dropped
29
+ * (and its request aborted), nothing lands after the scope ended. A select given these shows a spinner while it loads, a
30
+ * "Loading…" row when opened, a "Try again" row when it failed, and clears a value the new options do not contain.
31
+ *
32
+ * const makes = useOptions({ load: (context) => api.makes(context) });
33
+ * const models = useOptions({ for: () => form.values.make, load: (make, context) => api.models(make, context) });
34
+ * <SelectField v-bind="form.bind('make')" :label="t('make')" :options="makes" />
35
+ * <SelectField v-bind="form.bind('model')" :label="t('model')" :options="models" :disabled="!form.values.make" />
36
+ *
37
+ * `for` is a getter of the input the options depend on (reactive); `null` or `undefined` asks nothing (the list is empty, `idle`), anything
38
+ * else asks, again whenever it changes. Without `for` the options load once.
39
+ */
40
+ export declare function useOptions<Input, Value extends string | number>(options: {
41
+ readonly for: () => Input | null | undefined;
42
+ readonly load: (input: Input, context: OptionsContext) => Promise<readonly SelectOption<Value>[]>;
43
+ }): AsyncOptions<Value>;
44
+ export declare function useOptions<Value extends string | number>(options: {
45
+ readonly load: (context: OptionsContext) => Promise<readonly SelectOption<Value>[]>;
46
+ }): AsyncOptions<Value>;
47
+ /**
48
+ * What a select makes of its `options` prop, a list or a loader: the options known (also the stale ones while loading, so the
49
+ * chosen label stays), the rows to list (none while loading or failed), the status for the control and the list, and `arrived`,
50
+ * called with the new options when a load lands for a different input than the one the value belongs to (the user picked
51
+ * another make, or emptied it), so the field can drop a value they do not contain. The first load and a reload of the same
52
+ * input never call it.
53
+ */
54
+ export declare function useOptionSource<Value extends string | number>(source: () => OptionsSource<Value>, arrived: (options: readonly SelectOption<Value>[]) => void): {
55
+ known: import("vue").ComputedRef<readonly SelectOption<Value>[]>;
56
+ rows: import("vue").ComputedRef<readonly SelectOption<Value>[]>;
57
+ status: import("vue").ComputedRef<SuggestionStatus>;
58
+ loading: import("vue").ComputedRef<boolean>;
59
+ reload: () => void;
60
+ };
@@ -0,0 +1,31 @@
1
+ export interface DescribeErrorOptions {
2
+ /**
3
+ * What to say when nothing more specific is known: a server fault, an unreadable answer, an error that
4
+ * is not a failed request, a rejection without a reason of its own. Say what failed ("The changes could not be saved.").
5
+ */
6
+ readonly fallback?: string;
7
+ }
8
+ /** The sentence to show a person for a failure; see `useDescribeError`. */
9
+ export type DescribeError = (error: unknown, options?: DescribeErrorOptions) => string;
10
+ /** The part of a vue-i18n composer the sentences are read with. */
11
+ interface Translator {
12
+ t(key: string, params?: Record<string, unknown>): string;
13
+ te(key: string): boolean;
14
+ }
15
+ /** `describeError` over a translator; exported for the composable and tests. */
16
+ export declare function describeErrorWith({ t, te }: Translator): DescribeError;
17
+ /**
18
+ * The sentence for a failed request, in the app's language, for toasts and inline messages.
19
+ * Call it in `setup` (it reads the composer), use the result anywhere later:
20
+ *
21
+ * const describeError = useDescribeError();
22
+ * try { await save(); } catch (error) { toast.error(describeError(error, { fallback: t("tickets.save_failed") })); }
23
+ *
24
+ * In order: a go-core `code` the app or the library has a text for (`errors.<code>`, then
25
+ * `core.errors.<code>`, with the error's `params`); the server's own text when it sent a code (it is
26
+ * already translated); then by kind: 401, 403, 404, 409, no answer, cancelled, 429, "check the marked
27
+ * fields" for a validation answer with fields; server faults and anything unreadable give `fallback`;
28
+ * any other 4xx gives `fallback` too, or the server's text.
29
+ */
30
+ export declare function useDescribeError(): DescribeError;
31
+ export {};
@@ -56,6 +56,30 @@ export type CoreMessages = {
56
56
  title: string;
57
57
  body: string;
58
58
  };
59
+ shortcuts: {
60
+ title: string;
61
+ or: string;
62
+ hint: string;
63
+ show_help: string;
64
+ focus_search: string;
65
+ open_filters: string;
66
+ groups: {
67
+ general: string;
68
+ list: string;
69
+ record: string;
70
+ };
71
+ };
72
+ errors: {
73
+ unauthenticated: string;
74
+ forbidden: string;
75
+ not_found: string;
76
+ conflict: string;
77
+ rate_limited: string;
78
+ check_fields: string;
79
+ offline: string;
80
+ cancelled: string;
81
+ unexpected: string;
82
+ };
59
83
  startup: {
60
84
  title: string;
61
85
  session: string;
@@ -80,3 +104,5 @@ export { localeMessages } from "./messages";
80
104
  export type { LocaleMessagesOptions, MessageLoader, MessageNamespace, Messages } from "./messages";
81
105
  export { createMessageRuntime } from "./runtime";
82
106
  export type { MessageFailure, MessageRuntime, MessageRuntimeOptions, MessageTarget } from "./runtime";
107
+ export { useDescribeError } from "./describeError";
108
+ export type { DescribeError, DescribeErrorOptions } from "./describeError";
@@ -1,10 +1,11 @@
1
- const y = { actions: { cancel: "Odustani", close: "Zatvori", confirm: "Potvrdi", retry: "Pokušaj ponovo", save: "Spremi", saving: "Spremam…", saved: "Spremljeno", more: "Više", edit: "Uredi", clear: "Očisti", done: "Gotovo" }, collection: { search: { label: "Pretraži", placeholder: "Upišite za pretragu..." }, clear: "Poništi", no_data: "Nema podataka", no_results: "Prema traženom upitu nisu pronađeni podaci.", failed: { title: "Popis nije moguće učitati" }, open_record: "Pogledaj detalje", views_label: "Prikazi", page: { label: "Stranice", previous: "Prethodna stranica", next: "Sljedeća stranica", page_of: "Stranica {current} od {total}", total: "Prikaz {from} do {to} od ukupno {total} zapisa", per_page: "Zapisa po stranici" }, filters: { show_all: "Prikaži sve", apply: "Primijeni", clear: "Očisti", type_to_filter: "Upišite za filtriranje...", panel_title: "Filteri", panel_button: "Filteri", reset_all: "Poništi sve", range_from: "Od", range_until: "Do" }, date_presets: { label: "Uneseno", options: { today: "Danas", yesterday: "Jučer", this_week: "Ovaj tjedan", last_week: "Prošli tjedan", this_month: "Ovaj mjesec", last_month: "Prošli mjesec", this_year: "Ova godina", last_year: "Prošla godina" } }, saved: { title: "Spremljeni filteri", menu: "Spremljeni filteri", save: "Spremi", name_placeholder: "Naziv, npr. Novi Renault", saved_toast: "Filteri „{name}” spremljeni i primijenjeni.", deleted_toast: "Filteri „{name}” obrisani.", delete: "Obriši „{name}”", save_button: "Spremi filtere", name_label: "Naziv filtera", replace: "Zamijeni", replace_hint: "Postojeći filter „{name}” bit će zamijenjen.", nothing_to_save: "Odaberite barem jedan filter za spremanje.", save_failed: "Filtere nije moguće spremiti.", delete_failed: "Filtere nije moguće obrisati.", undo: "Poništi" }, empty: { title: "Nema rezultata za odabrane filtere", description: "Uklonite neki od filtera ili poništite sve.", remove_last: "Ukloni: {filter}", clear_all: "Poništi sve filtere", search: "Pretraga" } }, state: { loading: "Učitavanje sadržaja", stale: "Prikazani su prethodni podaci. Možda nisu ažurni.", refreshing: "Osvježavanje. Prikazani su prethodni podaci.", empty: "Nema podataka", no_value: "Nije uneseno" }, page: { breadcrumbs: "Navigacijska putanja", more_actions: "Više radnji" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Nespremljene promjene", body: "Uneseni podaci nisu spremljeni. Ako nastavite, izmjene će biti izgubljene.", confirm: "Odbaci promjene", cancel: "Nastavi s uređivanjem" }, toast: { notifications: "Obavijesti" }, shell: { menu: "Meni", home: "Početna", account: { open: "Otvori korisnički meni", language: "Jezik", sign_out: "Odjava", sign_out_failed: "Server nije završio vašu sesiju. Pokušajte ponovo." }, update: { available: "Dostupna je nova verzija aplikacije", reload: "Osvježi" } }, no_access: { title: "Nemate pristup", body: "Vaše privilegije ne uključuju ovu stranicu. Ako mislite da je došlo do greške, obratite se administratoru." }, startup: { title: "Aplikacija se nije mogla pokrenuti", session: "Server nije dostupan pa se sesija nije mogla provjeriti. Provjerite vezu i pokušajte ponovo.", messages: "Tekstovi aplikacije nisu se mogli učitati. Provjerite vezu i pokušajte ponovo.", other: "Nešto je pošlo naopako prilikom pokretanja. Pokušajte ponovo." }, resource: { not_found: { title: "Nije pronađeno", body: "Traženi zapis nije pronađen." }, unavailable: "Dogodila se greška prilikom učitavanja podataka. Molimo pokušajte ponovo.", offline: "Server nije dostupan. Provjerite vezu i pokušajte ponovo.", pager: { previous: "Prethodni zapis", next: "Sljedeći zapis", records: "Zapisi" } }, sections: { label: "Sekcije" }, steps: { label: "Napredak", position: "Korak {current} od {total}", next_named: "Dalje: {step}", done: "završeno", draft_saved: "nacrt sačuvan", restored: "Nastavljate sa sačuvanim nacrtom.", start_over: "Počni ispočetka" }, viewer: { label: "Pregled fotografija", open: "Pogledaj fotografiju", counter: "{current} / {total}", zoom_in: "Uvećaj", zoom_out: "Umanji", zoom_percent: "{percent} %", rotate: "Rotiraj", download: "Preuzmi", previous: "Prethodna fotografija", next: "Sljedeća fotografija" }, form: { unsaved_changes: "Nespremljene promjene", failure: { invalid: "Provjerite označena polja i pokušajte ponovo.", conflict: "Zapis se promijenio dok ste ga uređivali.", forbidden: "Nemate ovlaštenje za ovu radnju.", unauthorized: "Vaša sesija je istekla. Prijavite se ponovo.", offline: "Server nije dostupan. Provjerite vezu i pokušajte ponovo.", failed: "Promjene nisu spremljene. Pokušajte ponovo.", refresh: "Promjene su spremljene, ali se ažurirani zapis nije mogao učitati. Osvježite stranicu." }, errors: { hidden_title: "Greške u poljima koja trenutno nisu prikazana:", request: "Zahtjev {id}" }, sections: { errors: "Greške: {count}", done: "završeno" }, required: { label: "Obavezna polja", count: "{filled} od {total}", marker: "obavezno" }, group: { edit: "Uredi", foreign: "Spremanje traži i podatke iz grupe: {groups}. Prvo dopunite tu grupu." }, select: { choose: "Odaberite…", search: "Pretraži", no_matches: "Nema rezultata", loading: "Učitavanje…", clear: "Očisti", done: "Gotovo", failed: "Pretraga nije uspjela. Pokušajte ponovo." }, number: { invalid: "Unesite broj." }, file: { choose: "Odaberi datoteku", drop: "ili prevucite datoteku ovdje", remove: "Ukloni", allowed: "Dozvoljeni formati: {formats}", max_size: "Najveća veličina: {size}", invalid_type: "Format datoteke nije podržan.", too_large: "Datoteka je veća od {size}." }, yes: "Da", no: "Ne", otp: { label: "Kod za potvrdu, {length} cifara" }, months: { long: { 1: "januar", 2: "februar", 3: "mart", 4: "april", 5: "maj", 6: "juni", 7: "juli", 8: "august", 9: "septembar", 10: "oktobar", 11: "novembar", 12: "decembar" }, short: { 1: "jan", 2: "feb", 3: "mar", 4: "apr", 5: "maj", 6: "jun", 7: "jul", 8: "aug", 9: "sep", 10: "okt", 11: "nov", 12: "dec" }, with_year: "{month} {year}." }, suggestions: { recent: "Nedavno", keys_complete: "Tab prihvata · ↑↓ bira · Esc zatvara", keys_pick: "↑↓ bira · Enter odabira · Esc zatvara" }, i18n: { languages: "Jezik", tab_written: "{language}, popunjeno", tab_empty: "{language}, prazno", missing: "Još nije napisano: {languages}.", required: "Obavezno za: {languages}.", copy: "Kopiraj {language} u prazne", more: "Još jezika: {count} · popunjeno: {filled}" }, phone: { country: "Država: {country}", countries: "Države", search: "Upišite državu ili pozivni broj…", common: "Često", all: "Sve države", no_match: "Nema države koja odgovara.", too_short: "Broj je prekratak za: {country}.", too_long: "Broj je predug za: {country}.", invalid: "Ovo nije ispravan broj za: {country}.", invalid_any: "Ovo nije ispravan telefonski broj.", kind_mobile: "Mobilni broj", kind_landline: "Fiksni broj", kind_toll_free: "Besplatni broj", kind_premium_rate: "Broj s posebnom tarifom", kind_voip: "Internetski (VoIP) broj", call: "Nazovi", message: "Poruka", copy: "Kopiraj", copied: "Kopirano" }, date: { calendar: "Kalendar", previous_month: "Prethodni mjesec", next_month: "Sljedeći mjesec", previous_year: "Prethodna godina", next_year: "Sljedeća godina", choose_month: "Odaberi mjesec i godinu", open: "Otvori kalendar", invalid: "Unesite datum, na primjer {example}.", unavailable: "Taj datum nije dostupan.", placeholder: "npr. {example} ili +7", keys: "Strelice mijenjaju dan, PgUp/PgDn mjesec, Enter bira.", quick: "Brzi odabir", today: "Danas", tomorrow: "Sutra", week: "Za 7 dana", month_end: "Kraj mjeseca", next_working_day: "Sljedeći radni dan", years: "Godine", previous_years: "Prethodne godine", next_years: "Sljedeće godine", words: { today: "danas", tomorrow: "sutra", yesterday: "jučer" } }, time: { label: "Vrijeme", hour: "Sat", minute: "Minute", now: "Sada", invalid: "Unesite vrijeme, na primjer 14:35.", step: "Minute su u koracima od {step}.", open: "Odaberi vrijeme", placeholder: "npr. 14:35", at: "{date} u {time}", words: { now: "sada" } } } }, z = {
2
- core: y
3
- }, P = { actions: { cancel: "Cancel", close: "Close", confirm: "Confirm", retry: "Try again", save: "Save", saving: "Saving…", saved: "Saved", more: "More", edit: "Edit", clear: "Clear", done: "Done" }, collection: { search: { label: "Search", placeholder: "Type to search..." }, clear: "Reset", no_data: "No data", no_results: "No results found for your search.", failed: { title: "The list could not be loaded" }, open_record: "View details", views_label: "Views", page: { label: "Pages", previous: "Previous page", next: "Next page", page_of: "Page {current} of {total}", total: "Showing {from} to {to} of {total} entries", per_page: "Records per page" }, filters: { show_all: "Show all", apply: "Apply", clear: "Clear", type_to_filter: "Type to filter...", panel_title: "Filters", panel_button: "Filters", reset_all: "Reset all", range_from: "From", range_until: "Until" }, date_presets: { label: "Created", options: { today: "Today", yesterday: "Yesterday", this_week: "This week", last_week: "Last week", this_month: "This month", last_month: "Last month", this_year: "This year", last_year: "Last year" } }, saved: { title: "Saved filters", menu: "Saved filters", save: "Save", name_placeholder: "Name, e.g. New Renault", saved_toast: "Filters “{name}” saved and applied.", deleted_toast: "Filters “{name}” deleted.", delete: "Delete “{name}”", save_button: "Save filters", name_label: "Filter name", replace: "Replace", replace_hint: "The existing filter “{name}” will be replaced.", nothing_to_save: "Select at least one filter to save.", save_failed: "The filters could not be saved.", delete_failed: "The filters could not be deleted.", undo: "Undo" }, empty: { title: "No results for the selected filters", description: "Remove one of the filters or clear them all.", remove_last: "Remove: {filter}", clear_all: "Clear all filters", search: "Search" } }, state: { loading: "Loading content", stale: "Showing previous data. It may be out of date.", refreshing: "Refreshing. Showing previous data.", empty: "No data", no_value: "Not entered" }, page: { breadcrumbs: "Breadcrumbs", more_actions: "More actions" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Unsaved changes", body: "The entered data has not been saved. If you continue, your changes will be lost.", confirm: "Discard changes", cancel: "Continue editing" }, toast: { notifications: "Notifications" }, shell: { menu: "Menu", home: "Home", account: { open: "Open user menu", language: "Language", sign_out: "Sign out", sign_out_failed: "The server could not end your session. Try again." }, update: { available: "A new version of the app is available", reload: "Reload" } }, no_access: { title: "No access", body: "Your access does not include this page. If you believe this is a mistake, contact your administrator." }, startup: { title: "The application could not start", session: "The server could not be reached, so your session could not be checked. Check your connection and try again.", messages: "The application texts could not be loaded. Check your connection and try again.", other: "Something went wrong while starting. Try again." }, resource: { not_found: { title: "Not found", body: "The record could not be found." }, unavailable: "An error occurred while loading data. Please try again.", offline: "The server could not be reached. Check your connection and try again.", pager: { previous: "Previous record", next: "Next record", records: "Records" } }, sections: { label: "Sections" }, steps: { label: "Progress", position: "Step {current} of {total}", next_named: "Next: {step}", done: "done", draft_saved: "draft saved", restored: "Continuing your saved draft.", start_over: "Start over" }, viewer: { label: "Photo viewer", open: "View photo", counter: "{current} / {total}", zoom_in: "Zoom in", zoom_out: "Zoom out", zoom_percent: "{percent}%", rotate: "Rotate", download: "Download", previous: "Previous photo", next: "Next photo" }, form: { unsaved_changes: "Unsaved changes", failure: { invalid: "Check the marked fields and try again.", conflict: "The record changed while you were editing it.", forbidden: "You do not have permission to do this.", unauthorized: "Your session has expired. Sign in again.", offline: "The server could not be reached. Check your connection and try again.", failed: "The changes could not be saved. Try again.", refresh: "Your changes were saved, but the updated record could not be loaded. Reload the page." }, errors: { hidden_title: "Errors in fields that are not shown:", request: "Request {id}" }, sections: { errors: "Errors: {count}", done: "done" }, required: { label: "Required fields", count: "{filled} of {total}", marker: "required" }, group: { edit: "Edit", foreign: "Saving also needs data from: {groups}. Complete that group first." }, select: { choose: "Choose…", search: "Search", no_matches: "No matches", loading: "Loading…", clear: "Clear", done: "Done", failed: "The search failed. Try again." }, number: { invalid: "Enter a number." }, file: { choose: "Choose file", drop: "or drop a file here", remove: "Remove", allowed: "Allowed formats: {formats}", max_size: "Maximum size: {size}", invalid_type: "The file format is not supported.", too_large: "The file is larger than {size}." }, yes: "Yes", no: "No", otp: { label: "Verification code, {length} digits" }, months: { long: { 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" }, short: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }, with_year: "{month} {year}" }, suggestions: { recent: "Recent", keys_complete: "Tab accepts · ↑↓ chooses · Esc closes", keys_pick: "↑↓ chooses · Enter picks · Esc closes" }, i18n: { languages: "Language", tab_written: "{language}, written", tab_empty: "{language}, empty", missing: "Not written yet: {languages}.", required: "Required in {languages}.", copy: "Copy {language} into empty ones", more: "{count} more languages · {filled} written" }, phone: { country: "Country: {country}", countries: "Countries", search: "Type a country or dial code…", common: "Common", all: "All countries", no_match: "No country matches.", too_short: "The number is too short for {country}.", too_long: "The number is too long for {country}.", invalid: "This is not a valid number for {country}.", invalid_any: "This is not a valid phone number.", kind_mobile: "Mobile number", kind_landline: "Landline number", kind_toll_free: "Toll-free number", kind_premium_rate: "Premium-rate number", kind_voip: "Internet (VoIP) number", call: "Call", message: "Message", copy: "Copy", copied: "Copied" }, date: { calendar: "Calendar", previous_month: "Previous month", next_month: "Next month", previous_year: "Previous year", next_year: "Next year", choose_month: "Choose month and year", open: "Open calendar", invalid: "Enter a date, for example {example}.", unavailable: "This date is not available.", placeholder: "e.g. {example} or +7", keys: "Arrow keys change the day, Page Up and Page Down the month, Enter picks.", quick: "Quick picks", today: "Today", tomorrow: "Tomorrow", week: "In 7 days", month_end: "End of month", next_working_day: "Next working day", years: "Years", previous_years: "Previous years", next_years: "Next years", words: { today: "today", tomorrow: "tomorrow", yesterday: "yesterday" } }, time: { label: "Time", hour: "Hour", minute: "Minute", now: "Now", invalid: "Enter a time, for example 14:35.", step: "Use minutes in steps of {step}.", open: "Choose time", placeholder: "e.g. 14:35", at: "{date} at {time}", words: { now: "now" } } } }, w = {
1
+ import { u as C } from "../describeError-l5T9b8Uv.js";
2
+ const z = { actions: { cancel: "Odustani", close: "Zatvori", confirm: "Potvrdi", retry: "Pokušaj ponovo", save: "Spremi", saving: "Spremam…", saved: "Spremljeno", more: "Više", edit: "Uredi", clear: "Očisti", done: "Gotovo" }, collection: { search: { label: "Pretraži", placeholder: "Upišite za pretragu..." }, clear: "Poništi", no_data: "Nema podataka", no_results: "Prema traženom upitu nisu pronađeni podaci.", failed: { title: "Popis nije moguće učitati" }, open_record: "Pogledaj detalje", views_label: "Prikazi", page: { label: "Stranice", previous: "Prethodna stranica", next: "Sljedeća stranica", page_of: "Stranica {current} od {total}", total: "Prikaz {from} do {to} od ukupno {total} zapisa", per_page: "Zapisa po stranici" }, filters: { show_all: "Prikaži sve", apply: "Primijeni", clear: "Očisti", type_to_filter: "Upišite za filtriranje...", panel_title: "Filteri", panel_button: "Filteri", reset_all: "Poništi sve", range_from: "Od", range_until: "Do" }, date_presets: { label: "Uneseno", options: { today: "Danas", yesterday: "Jučer", this_week: "Ovaj tjedan", last_week: "Prošli tjedan", this_month: "Ovaj mjesec", last_month: "Prošli mjesec", this_year: "Ova godina", last_year: "Prošla godina" } }, saved: { title: "Spremljeni filteri", menu: "Spremljeni filteri", save: "Spremi", name_placeholder: "Naziv, npr. Novi Renault", saved_toast: "Filteri „{name}” spremljeni i primijenjeni.", deleted_toast: "Filteri „{name}” obrisani.", delete: "Obriši „{name}”", save_button: "Spremi filtere", name_label: "Naziv filtera", replace: "Zamijeni", replace_hint: "Postojeći filter „{name}” bit će zamijenjen.", nothing_to_save: "Odaberite barem jedan filter za spremanje.", save_failed: "Filtere nije moguće spremiti.", delete_failed: "Filtere nije moguće obrisati.", undo: "Poništi" }, empty: { title: "Nema rezultata za odabrane filtere", description: "Uklonite neki od filtera ili poništite sve.", remove_last: "Ukloni: {filter}", clear_all: "Poništi sve filtere", search: "Pretraga" } }, state: { loading: "Učitavanje sadržaja", stale: "Prikazani su prethodni podaci. Možda nisu ažurni.", refreshing: "Osvježavanje. Prikazani su prethodni podaci.", empty: "Nema podataka", no_value: "Nije uneseno" }, page: { breadcrumbs: "Navigacijska putanja", more_actions: "Više radnji" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Nespremljene promjene", body: "Uneseni podaci nisu spremljeni. Ako nastavite, izmjene će biti izgubljene.", confirm: "Odbaci promjene", cancel: "Nastavi s uređivanjem" }, toast: { notifications: "Obavijesti" }, shell: { menu: "Meni", home: "Početna", account: { open: "Otvori korisnički meni", language: "Jezik", sign_out: "Odjava", sign_out_failed: "Server nije završio vašu sesiju. Pokušajte ponovo." }, update: { available: "Dostupna je nova verzija aplikacije", reload: "Osvježi" } }, no_access: { title: "Nemate pristup", body: "Vaše privilegije ne uključuju ovu stranicu. Ako mislite da je došlo do greške, obratite se administratoru." }, startup: { title: "Aplikacija se nije mogla pokrenuti", session: "Server nije dostupan pa se sesija nije mogla provjeriti. Provjerite vezu i pokušajte ponovo.", messages: "Tekstovi aplikacije nisu se mogli učitati. Provjerite vezu i pokušajte ponovo.", other: "Nešto je pošlo naopako prilikom pokretanja. Pokušajte ponovo." }, resource: { not_found: { title: "Nije pronađeno", body: "Traženi zapis nije pronađen." }, unavailable: "Dogodila se greška prilikom učitavanja podataka. Molimo pokušajte ponovo.", offline: "Server nije dostupan. Provjerite vezu i pokušajte ponovo.", pager: { previous: "Prethodni zapis", next: "Sljedeći zapis", records: "Zapisi" } }, sections: { label: "Sekcije" }, steps: { label: "Napredak", position: "Korak {current} od {total}", next_named: "Dalje: {step}", done: "završeno", draft_saved: "nacrt sačuvan", restored: "Nastavljate sa sačuvanim nacrtom.", start_over: "Počni ispočetka" }, viewer: { label: "Pregled fotografija", open: "Pogledaj fotografiju", counter: "{current} / {total}", zoom_in: "Uvećaj", zoom_out: "Umanji", zoom_percent: "{percent} %", rotate: "Rotiraj", download: "Preuzmi", previous: "Prethodna fotografija", next: "Sljedeća fotografija" }, form: { unsaved_changes: "Nespremljene promjene", failure: { invalid: "Provjerite označena polja i pokušajte ponovo.", conflict: "Zapis se promijenio dok ste ga uređivali.", forbidden: "Nemate ovlaštenje za ovu radnju.", unauthorized: "Vaša sesija je istekla. Prijavite se ponovo.", offline: "Server nije dostupan. Provjerite vezu i pokušajte ponovo.", failed: "Promjene nisu spremljene. Pokušajte ponovo.", refresh: "Promjene su spremljene, ali se ažurirani zapis nije mogao učitati. Osvježite stranicu." }, errors: { hidden_title: "Greške u poljima koja trenutno nisu prikazana:", request: "Zahtjev {id}" }, sections: { errors: "Greške: {count}", done: "završeno" }, required: { label: "Obavezna polja", count: "{filled} od {total}", marker: "obavezno" }, group: { edit: "Uredi", foreign: "Spremanje traži i podatke iz grupe: {groups}. Prvo dopunite tu grupu." }, select: { choose: "Odaberite…", search: "Pretraži", no_matches: "Nema rezultata", loading: "Učitavanje…", clear: "Očisti", done: "Gotovo", failed: "Pretraga nije uspjela. Pokušajte ponovo.", load_failed: "Opcije nisu učitane." }, number: { invalid: "Unesite broj." }, file: { choose: "Odaberi datoteku", drop: "ili prevucite datoteku ovdje", remove: "Ukloni", allowed: "Dozvoljeni formati: {formats}", max_size: "Najveća veličina: {size}", invalid_type: "Format datoteke nije podržan.", too_large: "Datoteka je veća od {size}." }, yes: "Da", no: "Ne", otp: { label: "Kod za potvrdu, {length} cifara" }, months: { long: { 1: "januar", 2: "februar", 3: "mart", 4: "april", 5: "maj", 6: "juni", 7: "juli", 8: "august", 9: "septembar", 10: "oktobar", 11: "novembar", 12: "decembar" }, short: { 1: "jan", 2: "feb", 3: "mar", 4: "apr", 5: "maj", 6: "jun", 7: "jul", 8: "aug", 9: "sep", 10: "okt", 11: "nov", 12: "dec" }, with_year: "{month} {year}." }, suggestions: { recent: "Nedavno", keys_complete: "Tab prihvata · ↑↓ bira · Esc zatvara", keys_pick: "↑↓ bira · Enter odabira · Esc zatvara" }, i18n: { languages: "Jezik", tab_written: "{language}, popunjeno", tab_empty: "{language}, prazno", missing: "Još nije napisano: {languages}.", required: "Obavezno za: {languages}.", copy: "Kopiraj {language} u prazne", more: "Još jezika: {count} · popunjeno: {filled}" }, phone: { country: "Država: {country}", countries: "Države", search: "Upišite državu ili pozivni broj…", common: "Često", all: "Sve države", no_match: "Nema države koja odgovara.", too_short: "Broj je prekratak za: {country}.", too_long: "Broj je predug za: {country}.", invalid: "Ovo nije ispravan broj za: {country}.", invalid_any: "Ovo nije ispravan telefonski broj.", kind_mobile: "Mobilni broj", kind_landline: "Fiksni broj", kind_toll_free: "Besplatni broj", kind_premium_rate: "Broj s posebnom tarifom", kind_voip: "Internetski (VoIP) broj", call: "Nazovi", message: "Poruka", copy: "Kopiraj", copied: "Kopirano" }, date: { calendar: "Kalendar", previous_month: "Prethodni mjesec", next_month: "Sljedeći mjesec", previous_year: "Prethodna godina", next_year: "Sljedeća godina", choose_month: "Odaberi mjesec i godinu", open: "Otvori kalendar", invalid: "Unesite datum, na primjer {example}.", unavailable: "Taj datum nije dostupan.", placeholder: "npr. {example} ili +7", keys: "Strelice mijenjaju dan, PgUp/PgDn mjesec, Enter bira.", quick: "Brzi odabir", today: "Danas", tomorrow: "Sutra", week: "Za 7 dana", month_end: "Kraj mjeseca", next_working_day: "Sljedeći radni dan", years: "Godine", previous_years: "Prethodne godine", next_years: "Sljedeće godine", words: { today: "danas", tomorrow: "sutra", yesterday: "jučer" } }, time: { label: "Vrijeme", hour: "Sat", minute: "Minute", now: "Sada", invalid: "Unesite vrijeme, na primjer 14:35.", step: "Minute su u koracima od {step}.", open: "Odaberi vrijeme", placeholder: "npr. 14:35", at: "{date} u {time}", words: { now: "sada" } } }, errors: { unauthenticated: "Niste prijavljeni. Molimo prijavite se.", forbidden: "Nemate ovlasti za ovu radnju.", not_found: "Traženi zapis nije pronađen.", conflict: "Zapis je promijenjen ili već postoji. Osvježite stranicu i pokušajte ponovo.", rate_limited: "Previše zahtjeva u kratkom vremenu. Pričekajte minutu pa pokušajte ponovo.", check_fields: "Provjerite označena polja.", offline: "Server nije dostupan. Provjerite vezu i pokušajte ponovo.", cancelled: "Zahtjev je otkazan.", unexpected: "Došlo je do neočekivane greške. Molimo pokušajte ponovo." }, shortcuts: { title: "Prečice na tastaturi", or: "ili", hint: "Prečice ne rade dok pišete u polje ili je otvoren prozor.", show_help: "Prikaži prečice", focus_search: "Pretraži popis", open_filters: "Otvori filtere", groups: { general: "Općenito", list: "Popis", record: "Zapis" } } }, y = {
3
+ core: z
4
+ }, P = { actions: { cancel: "Cancel", close: "Close", confirm: "Confirm", retry: "Try again", save: "Save", saving: "Saving…", saved: "Saved", more: "More", edit: "Edit", clear: "Clear", done: "Done" }, collection: { search: { label: "Search", placeholder: "Type to search..." }, clear: "Reset", no_data: "No data", no_results: "No results found for your search.", failed: { title: "The list could not be loaded" }, open_record: "View details", views_label: "Views", page: { label: "Pages", previous: "Previous page", next: "Next page", page_of: "Page {current} of {total}", total: "Showing {from} to {to} of {total} entries", per_page: "Records per page" }, filters: { show_all: "Show all", apply: "Apply", clear: "Clear", type_to_filter: "Type to filter...", panel_title: "Filters", panel_button: "Filters", reset_all: "Reset all", range_from: "From", range_until: "Until" }, date_presets: { label: "Created", options: { today: "Today", yesterday: "Yesterday", this_week: "This week", last_week: "Last week", this_month: "This month", last_month: "Last month", this_year: "This year", last_year: "Last year" } }, saved: { title: "Saved filters", menu: "Saved filters", save: "Save", name_placeholder: "Name, e.g. New Renault", saved_toast: "Filters “{name}” saved and applied.", deleted_toast: "Filters “{name}” deleted.", delete: "Delete “{name}”", save_button: "Save filters", name_label: "Filter name", replace: "Replace", replace_hint: "The existing filter “{name}” will be replaced.", nothing_to_save: "Select at least one filter to save.", save_failed: "The filters could not be saved.", delete_failed: "The filters could not be deleted.", undo: "Undo" }, empty: { title: "No results for the selected filters", description: "Remove one of the filters or clear them all.", remove_last: "Remove: {filter}", clear_all: "Clear all filters", search: "Search" } }, state: { loading: "Loading content", stale: "Showing previous data. It may be out of date.", refreshing: "Refreshing. Showing previous data.", empty: "No data", no_value: "Not entered" }, page: { breadcrumbs: "Breadcrumbs", more_actions: "More actions" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Unsaved changes", body: "The entered data has not been saved. If you continue, your changes will be lost.", confirm: "Discard changes", cancel: "Continue editing" }, toast: { notifications: "Notifications" }, shell: { menu: "Menu", home: "Home", account: { open: "Open user menu", language: "Language", sign_out: "Sign out", sign_out_failed: "The server could not end your session. Try again." }, update: { available: "A new version of the app is available", reload: "Reload" } }, no_access: { title: "No access", body: "Your access does not include this page. If you believe this is a mistake, contact your administrator." }, startup: { title: "The application could not start", session: "The server could not be reached, so your session could not be checked. Check your connection and try again.", messages: "The application texts could not be loaded. Check your connection and try again.", other: "Something went wrong while starting. Try again." }, resource: { not_found: { title: "Not found", body: "The record could not be found." }, unavailable: "An error occurred while loading data. Please try again.", offline: "The server could not be reached. Check your connection and try again.", pager: { previous: "Previous record", next: "Next record", records: "Records" } }, sections: { label: "Sections" }, steps: { label: "Progress", position: "Step {current} of {total}", next_named: "Next: {step}", done: "done", draft_saved: "draft saved", restored: "Continuing your saved draft.", start_over: "Start over" }, viewer: { label: "Photo viewer", open: "View photo", counter: "{current} / {total}", zoom_in: "Zoom in", zoom_out: "Zoom out", zoom_percent: "{percent}%", rotate: "Rotate", download: "Download", previous: "Previous photo", next: "Next photo" }, form: { unsaved_changes: "Unsaved changes", failure: { invalid: "Check the marked fields and try again.", conflict: "The record changed while you were editing it.", forbidden: "You do not have permission to do this.", unauthorized: "Your session has expired. Sign in again.", offline: "The server could not be reached. Check your connection and try again.", failed: "The changes could not be saved. Try again.", refresh: "Your changes were saved, but the updated record could not be loaded. Reload the page." }, errors: { hidden_title: "Errors in fields that are not shown:", request: "Request {id}" }, sections: { errors: "Errors: {count}", done: "done" }, required: { label: "Required fields", count: "{filled} of {total}", marker: "required" }, group: { edit: "Edit", foreign: "Saving also needs data from: {groups}. Complete that group first." }, select: { choose: "Choose…", search: "Search", no_matches: "No matches", loading: "Loading…", clear: "Clear", done: "Done", failed: "The search failed. Try again.", load_failed: "The options could not be loaded." }, number: { invalid: "Enter a number." }, file: { choose: "Choose file", drop: "or drop a file here", remove: "Remove", allowed: "Allowed formats: {formats}", max_size: "Maximum size: {size}", invalid_type: "The file format is not supported.", too_large: "The file is larger than {size}." }, yes: "Yes", no: "No", otp: { label: "Verification code, {length} digits" }, months: { long: { 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" }, short: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }, with_year: "{month} {year}" }, suggestions: { recent: "Recent", keys_complete: "Tab accepts · ↑↓ chooses · Esc closes", keys_pick: "↑↓ chooses · Enter picks · Esc closes" }, i18n: { languages: "Language", tab_written: "{language}, written", tab_empty: "{language}, empty", missing: "Not written yet: {languages}.", required: "Required in {languages}.", copy: "Copy {language} into empty ones", more: "{count} more languages · {filled} written" }, phone: { country: "Country: {country}", countries: "Countries", search: "Type a country or dial code…", common: "Common", all: "All countries", no_match: "No country matches.", too_short: "The number is too short for {country}.", too_long: "The number is too long for {country}.", invalid: "This is not a valid number for {country}.", invalid_any: "This is not a valid phone number.", kind_mobile: "Mobile number", kind_landline: "Landline number", kind_toll_free: "Toll-free number", kind_premium_rate: "Premium-rate number", kind_voip: "Internet (VoIP) number", call: "Call", message: "Message", copy: "Copy", copied: "Copied" }, date: { calendar: "Calendar", previous_month: "Previous month", next_month: "Next month", previous_year: "Previous year", next_year: "Next year", choose_month: "Choose month and year", open: "Open calendar", invalid: "Enter a date, for example {example}.", unavailable: "This date is not available.", placeholder: "e.g. {example} or +7", keys: "Arrow keys change the day, Page Up and Page Down the month, Enter picks.", quick: "Quick picks", today: "Today", tomorrow: "Tomorrow", week: "In 7 days", month_end: "End of month", next_working_day: "Next working day", years: "Years", previous_years: "Previous years", next_years: "Next years", words: { today: "today", tomorrow: "tomorrow", yesterday: "yesterday" } }, time: { label: "Time", hour: "Hour", minute: "Minute", now: "Now", invalid: "Enter a time, for example 14:35.", step: "Use minutes in steps of {step}.", open: "Choose time", placeholder: "e.g. 14:35", at: "{date} at {time}", words: { now: "now" } } }, errors: { unauthenticated: "You are not signed in. Please sign in.", forbidden: "You are not authorized to perform this action.", not_found: "The record could not be found.", conflict: "The record changed or already exists. Reload and try again.", rate_limited: "Too many requests in a short time. Wait a minute and try again.", check_fields: "Check the marked fields.", offline: "The server could not be reached. Check your connection and try again.", cancelled: "The request was cancelled.", unexpected: "An unexpected error occurred. Please try again." }, shortcuts: { title: "Keyboard shortcuts", or: "or", hint: "Shortcuts are off while you type in a field or a dialog is open.", show_help: "Show shortcuts", focus_search: "Search the list", open_filters: "Open filters", groups: { general: "General", list: "List", record: "Record" } } }, w = {
4
5
  core: P
5
- }, N = { actions: { cancel: "Odustani", close: "Zatvori", confirm: "Potvrdi", retry: "Pokušaj ponovno", save: "Spremi", saving: "Spremam…", saved: "Spremljeno", more: "Više", edit: "Uredi", clear: "Očisti", done: "Gotovo" }, collection: { search: { label: "Pretraži", placeholder: "Upišite za pretragu..." }, clear: "Poništi", no_data: "Nema podataka", no_results: "Prema traženom upitu nisu pronađeni podaci.", failed: { title: "Popis nije moguće učitati" }, open_record: "Pogledaj detalje", views_label: "Prikazi", page: { label: "Stranice", previous: "Prethodna stranica", next: "Sljedeća stranica", page_of: "Stranica {current} od {total}", total: "Prikaz {from} do {to} od ukupno {total} zapisa", per_page: "Zapisa po stranici" }, filters: { show_all: "Prikaži sve", apply: "Primijeni", clear: "Očisti", type_to_filter: "Upišite za filtriranje...", panel_title: "Filteri", panel_button: "Filteri", reset_all: "Poništi sve", range_from: "Od", range_until: "Do" }, date_presets: { label: "Uneseno", options: { today: "Danas", yesterday: "Jučer", this_week: "Ovaj tjedan", last_week: "Prošli tjedan", this_month: "Ovaj mjesec", last_month: "Prošli mjesec", this_year: "Ova godina", last_year: "Prošla godina" } }, saved: { title: "Spremljeni filteri", menu: "Spremljeni filteri", save: "Spremi", name_placeholder: "Naziv, npr. Novi Renault", saved_toast: "Filteri „{name}” spremljeni i primijenjeni.", deleted_toast: "Filteri „{name}” obrisani.", delete: "Obriši „{name}”", save_button: "Spremi filtere", name_label: "Naziv filtera", replace: "Zamijeni", replace_hint: "Postojeći filter „{name}” bit će zamijenjen.", nothing_to_save: "Odaberite barem jedan filter za spremanje.", save_failed: "Filtere nije moguće spremiti.", delete_failed: "Filtere nije moguće obrisati.", undo: "Poništi" }, empty: { title: "Nema rezultata za odabrane filtere", description: "Uklonite neki od filtera ili poništite sve.", remove_last: "Ukloni: {filter}", clear_all: "Poništi sve filtere", search: "Pretraga" } }, state: { loading: "Učitavanje sadržaja", stale: "Prikazani su prethodni podaci. Možda nisu ažurni.", refreshing: "Osvježavanje. Prikazani su prethodni podaci.", empty: "Nema podataka", no_value: "Nije uneseno" }, page: { breadcrumbs: "Navigacijska putanja", more_actions: "Više radnji" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Nespremljene promjene", body: "Uneseni podaci nisu spremljeni. Ako nastavite, izmjene će biti izgubljene.", confirm: "Odbaci promjene", cancel: "Nastavi s uređivanjem" }, toast: { notifications: "Obavijesti" }, shell: { menu: "Izbornik", home: "Početna", account: { open: "Otvori korisnički izbornik", language: "Jezik", sign_out: "Odjava", sign_out_failed: "Poslužitelj nije završio vašu sesiju. Pokušajte ponovno." }, update: { available: "Dostupna je nova verzija aplikacije", reload: "Osvježi" } }, no_access: { title: "Nemate pristup", body: "Vaše ovlasti ne uključuju ovu stranicu. Ako mislite da je došlo do pogreške, obratite se administratoru." }, startup: { title: "Aplikacija se nije mogla pokrenuti", session: "Poslužitelj nije dostupan pa se sesija nije mogla provjeriti. Provjerite vezu i pokušajte ponovno.", messages: "Tekstovi aplikacije nisu se mogli učitati. Provjerite vezu i pokušajte ponovno.", other: "Nešto je pošlo po zlu prilikom pokretanja. Pokušajte ponovno." }, resource: { not_found: { title: "Nije pronađeno", body: "Traženi zapis nije pronađen." }, unavailable: "Dogodila se greška prilikom učitavanja podataka. Molimo pokušajte ponovno.", offline: "Poslužitelj nije dostupan. Provjerite vezu i pokušajte ponovno.", pager: { previous: "Prethodni zapis", next: "Sljedeći zapis", records: "Zapisi" } }, sections: { label: "Sekcije" }, steps: { label: "Napredak", position: "Korak {current} od {total}", next_named: "Dalje: {step}", done: "dovršeno", draft_saved: "nacrt spremljen", restored: "Nastavljate sa spremljenim nacrtom.", start_over: "Počni ispočetka" }, viewer: { label: "Pregled fotografija", open: "Pogledaj fotografiju", counter: "{current} / {total}", zoom_in: "Uvećaj", zoom_out: "Umanji", zoom_percent: "{percent} %", rotate: "Zakreni", download: "Preuzmi", previous: "Prethodna fotografija", next: "Sljedeća fotografija" }, form: { unsaved_changes: "Nespremljene promjene", failure: { invalid: "Provjerite označena polja i pokušajte ponovno.", conflict: "Zapis se promijenio dok ste ga uređivali.", forbidden: "Nemate ovlast za ovu radnju.", unauthorized: "Vaša je sesija istekla. Prijavite se ponovno.", offline: "Poslužitelj nije dostupan. Provjerite vezu i pokušajte ponovno.", failed: "Promjene nisu spremljene. Pokušajte ponovno.", refresh: "Promjene su spremljene, ali se ažurirani zapis nije mogao učitati. Osvježite stranicu." }, errors: { hidden_title: "Greške u poljima koja trenutno nisu prikazana:", request: "Zahtjev {id}" }, sections: { errors: "Greške: {count}", done: "dovršeno" }, required: { label: "Obavezna polja", count: "{filled} od {total}", marker: "obavezno" }, group: { edit: "Uredi", foreign: "Spremanje traži i podatke iz grupe: {groups}. Najprije dopunite tu grupu." }, select: { choose: "Odaberite…", search: "Pretraži", no_matches: "Nema rezultata", loading: "Učitavanje…", clear: "Očisti", done: "Gotovo", failed: "Pretraga nije uspjela. Pokušajte ponovno." }, number: { invalid: "Unesite broj." }, file: { choose: "Odaberi datoteku", drop: "ili povucite datoteku ovdje", remove: "Ukloni", allowed: "Dozvoljeni formati: {formats}", max_size: "Najveća veličina: {size}", invalid_type: "Format datoteke nije podržan.", too_large: "Datoteka je veća od {size}." }, yes: "Da", no: "Ne", otp: { label: "Kod za potvrdu, {length} znamenki" }, months: { long: { 1: "siječanj", 2: "veljača", 3: "ožujak", 4: "travanj", 5: "svibanj", 6: "lipanj", 7: "srpanj", 8: "kolovoz", 9: "rujan", 10: "listopad", 11: "studeni", 12: "prosinac" }, short: { 1: "sij", 2: "velj", 3: "ožu", 4: "tra", 5: "svi", 6: "lip", 7: "srp", 8: "kol", 9: "ruj", 10: "lis", 11: "stu", 12: "pro" }, with_year: "{month} {year}." }, suggestions: { recent: "Nedavno", keys_complete: "Tab prihvaća · ↑↓ bira · Esc zatvara", keys_pick: "↑↓ bira · Enter odabire · Esc zatvara" }, i18n: { languages: "Jezik", tab_written: "{language}, popunjeno", tab_empty: "{language}, prazno", missing: "Još nije napisano: {languages}.", required: "Obavezno za: {languages}.", copy: "Kopiraj {language} u prazne", more: "Još jezika: {count} · popunjeno: {filled}" }, phone: { country: "Država: {country}", countries: "Države", search: "Upišite državu ili pozivni broj…", common: "Često", all: "Sve države", no_match: "Nema države koja odgovara.", too_short: "Broj je prekratak za: {country}.", too_long: "Broj je predug za: {country}.", invalid: "Ovo nije ispravan broj za: {country}.", invalid_any: "Ovo nije ispravan telefonski broj.", kind_mobile: "Mobilni broj", kind_landline: "Fiksni broj", kind_toll_free: "Besplatni broj", kind_premium_rate: "Broj s posebnom tarifom", kind_voip: "Internetski (VoIP) broj", call: "Nazovi", message: "Poruka", copy: "Kopiraj", copied: "Kopirano" }, date: { calendar: "Kalendar", previous_month: "Prethodni mjesec", next_month: "Sljedeći mjesec", previous_year: "Prethodna godina", next_year: "Sljedeća godina", choose_month: "Odaberi mjesec i godinu", open: "Otvori kalendar", invalid: "Unesite datum, na primjer {example}.", unavailable: "Taj datum nije dostupan.", placeholder: "npr. {example} ili +7", keys: "Strelice mijenjaju dan, PgUp/PgDn mjesec, Enter bira.", quick: "Brzi odabir", today: "Danas", tomorrow: "Sutra", week: "Za 7 dana", month_end: "Kraj mjeseca", next_working_day: "Sljedeći radni dan", years: "Godine", previous_years: "Prethodne godine", next_years: "Sljedeće godine", words: { today: "danas", tomorrow: "sutra", yesterday: "jučer" } }, time: { label: "Vrijeme", hour: "Sat", minute: "Minute", now: "Sada", invalid: "Unesite vrijeme, na primjer 14:35.", step: "Minute su u koracima od {step}.", open: "Odaberi vrijeme", placeholder: "npr. 14:35", at: "{date} u {time}", words: { now: "sada" } } } }, S = {
6
+ }, N = { actions: { cancel: "Odustani", close: "Zatvori", confirm: "Potvrdi", retry: "Pokušaj ponovno", save: "Spremi", saving: "Spremam…", saved: "Spremljeno", more: "Više", edit: "Uredi", clear: "Očisti", done: "Gotovo" }, collection: { search: { label: "Pretraži", placeholder: "Upišite za pretragu..." }, clear: "Poništi", no_data: "Nema podataka", no_results: "Prema traženom upitu nisu pronađeni podaci.", failed: { title: "Popis nije moguće učitati" }, open_record: "Pogledaj detalje", views_label: "Prikazi", page: { label: "Stranice", previous: "Prethodna stranica", next: "Sljedeća stranica", page_of: "Stranica {current} od {total}", total: "Prikaz {from} do {to} od ukupno {total} zapisa", per_page: "Zapisa po stranici" }, filters: { show_all: "Prikaži sve", apply: "Primijeni", clear: "Očisti", type_to_filter: "Upišite za filtriranje...", panel_title: "Filteri", panel_button: "Filteri", reset_all: "Poništi sve", range_from: "Od", range_until: "Do" }, date_presets: { label: "Uneseno", options: { today: "Danas", yesterday: "Jučer", this_week: "Ovaj tjedan", last_week: "Prošli tjedan", this_month: "Ovaj mjesec", last_month: "Prošli mjesec", this_year: "Ova godina", last_year: "Prošla godina" } }, saved: { title: "Spremljeni filteri", menu: "Spremljeni filteri", save: "Spremi", name_placeholder: "Naziv, npr. Novi Renault", saved_toast: "Filteri „{name}” spremljeni i primijenjeni.", deleted_toast: "Filteri „{name}” obrisani.", delete: "Obriši „{name}”", save_button: "Spremi filtere", name_label: "Naziv filtera", replace: "Zamijeni", replace_hint: "Postojeći filter „{name}” bit će zamijenjen.", nothing_to_save: "Odaberite barem jedan filter za spremanje.", save_failed: "Filtere nije moguće spremiti.", delete_failed: "Filtere nije moguće obrisati.", undo: "Poništi" }, empty: { title: "Nema rezultata za odabrane filtere", description: "Uklonite neki od filtera ili poništite sve.", remove_last: "Ukloni: {filter}", clear_all: "Poništi sve filtere", search: "Pretraga" } }, state: { loading: "Učitavanje sadržaja", stale: "Prikazani su prethodni podaci. Možda nisu ažurni.", refreshing: "Osvježavanje. Prikazani su prethodni podaci.", empty: "Nema podataka", no_value: "Nije uneseno" }, page: { breadcrumbs: "Navigacijska putanja", more_actions: "Više radnji" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Nespremljene promjene", body: "Uneseni podaci nisu spremljeni. Ako nastavite, izmjene će biti izgubljene.", confirm: "Odbaci promjene", cancel: "Nastavi s uređivanjem" }, toast: { notifications: "Obavijesti" }, shell: { menu: "Izbornik", home: "Početna", account: { open: "Otvori korisnički izbornik", language: "Jezik", sign_out: "Odjava", sign_out_failed: "Poslužitelj nije završio vašu sesiju. Pokušajte ponovno." }, update: { available: "Dostupna je nova verzija aplikacije", reload: "Osvježi" } }, no_access: { title: "Nemate pristup", body: "Vaše ovlasti ne uključuju ovu stranicu. Ako mislite da je došlo do pogreške, obratite se administratoru." }, startup: { title: "Aplikacija se nije mogla pokrenuti", session: "Poslužitelj nije dostupan pa se sesija nije mogla provjeriti. Provjerite vezu i pokušajte ponovno.", messages: "Tekstovi aplikacije nisu se mogli učitati. Provjerite vezu i pokušajte ponovno.", other: "Nešto je pošlo po zlu prilikom pokretanja. Pokušajte ponovno." }, resource: { not_found: { title: "Nije pronađeno", body: "Traženi zapis nije pronađen." }, unavailable: "Dogodila se greška prilikom učitavanja podataka. Molimo pokušajte ponovno.", offline: "Poslužitelj nije dostupan. Provjerite vezu i pokušajte ponovno.", pager: { previous: "Prethodni zapis", next: "Sljedeći zapis", records: "Zapisi" } }, sections: { label: "Sekcije" }, steps: { label: "Napredak", position: "Korak {current} od {total}", next_named: "Dalje: {step}", done: "dovršeno", draft_saved: "nacrt spremljen", restored: "Nastavljate sa spremljenim nacrtom.", start_over: "Počni ispočetka" }, viewer: { label: "Pregled fotografija", open: "Pogledaj fotografiju", counter: "{current} / {total}", zoom_in: "Uvećaj", zoom_out: "Umanji", zoom_percent: "{percent} %", rotate: "Zakreni", download: "Preuzmi", previous: "Prethodna fotografija", next: "Sljedeća fotografija" }, form: { unsaved_changes: "Nespremljene promjene", failure: { invalid: "Provjerite označena polja i pokušajte ponovno.", conflict: "Zapis se promijenio dok ste ga uređivali.", forbidden: "Nemate ovlast za ovu radnju.", unauthorized: "Vaša je sesija istekla. Prijavite se ponovno.", offline: "Poslužitelj nije dostupan. Provjerite vezu i pokušajte ponovno.", failed: "Promjene nisu spremljene. Pokušajte ponovno.", refresh: "Promjene su spremljene, ali se ažurirani zapis nije mogao učitati. Osvježite stranicu." }, errors: { hidden_title: "Greške u poljima koja trenutno nisu prikazana:", request: "Zahtjev {id}" }, sections: { errors: "Greške: {count}", done: "dovršeno" }, required: { label: "Obavezna polja", count: "{filled} od {total}", marker: "obavezno" }, group: { edit: "Uredi", foreign: "Spremanje traži i podatke iz grupe: {groups}. Najprije dopunite tu grupu." }, select: { choose: "Odaberite…", search: "Pretraži", no_matches: "Nema rezultata", loading: "Učitavanje…", clear: "Očisti", done: "Gotovo", failed: "Pretraga nije uspjela. Pokušajte ponovno.", load_failed: "Opcije nisu učitane." }, number: { invalid: "Unesite broj." }, file: { choose: "Odaberi datoteku", drop: "ili povucite datoteku ovdje", remove: "Ukloni", allowed: "Dozvoljeni formati: {formats}", max_size: "Najveća veličina: {size}", invalid_type: "Format datoteke nije podržan.", too_large: "Datoteka je veća od {size}." }, yes: "Da", no: "Ne", otp: { label: "Kod za potvrdu, {length} znamenki" }, months: { long: { 1: "siječanj", 2: "veljača", 3: "ožujak", 4: "travanj", 5: "svibanj", 6: "lipanj", 7: "srpanj", 8: "kolovoz", 9: "rujan", 10: "listopad", 11: "studeni", 12: "prosinac" }, short: { 1: "sij", 2: "velj", 3: "ožu", 4: "tra", 5: "svi", 6: "lip", 7: "srp", 8: "kol", 9: "ruj", 10: "lis", 11: "stu", 12: "pro" }, with_year: "{month} {year}." }, suggestions: { recent: "Nedavno", keys_complete: "Tab prihvaća · ↑↓ bira · Esc zatvara", keys_pick: "↑↓ bira · Enter odabire · Esc zatvara" }, i18n: { languages: "Jezik", tab_written: "{language}, popunjeno", tab_empty: "{language}, prazno", missing: "Još nije napisano: {languages}.", required: "Obavezno za: {languages}.", copy: "Kopiraj {language} u prazne", more: "Još jezika: {count} · popunjeno: {filled}" }, phone: { country: "Država: {country}", countries: "Države", search: "Upišite državu ili pozivni broj…", common: "Često", all: "Sve države", no_match: "Nema države koja odgovara.", too_short: "Broj je prekratak za: {country}.", too_long: "Broj je predug za: {country}.", invalid: "Ovo nije ispravan broj za: {country}.", invalid_any: "Ovo nije ispravan telefonski broj.", kind_mobile: "Mobilni broj", kind_landline: "Fiksni broj", kind_toll_free: "Besplatni broj", kind_premium_rate: "Broj s posebnom tarifom", kind_voip: "Internetski (VoIP) broj", call: "Nazovi", message: "Poruka", copy: "Kopiraj", copied: "Kopirano" }, date: { calendar: "Kalendar", previous_month: "Prethodni mjesec", next_month: "Sljedeći mjesec", previous_year: "Prethodna godina", next_year: "Sljedeća godina", choose_month: "Odaberi mjesec i godinu", open: "Otvori kalendar", invalid: "Unesite datum, na primjer {example}.", unavailable: "Taj datum nije dostupan.", placeholder: "npr. {example} ili +7", keys: "Strelice mijenjaju dan, PgUp/PgDn mjesec, Enter bira.", quick: "Brzi odabir", today: "Danas", tomorrow: "Sutra", week: "Za 7 dana", month_end: "Kraj mjeseca", next_working_day: "Sljedeći radni dan", years: "Godine", previous_years: "Prethodne godine", next_years: "Sljedeće godine", words: { today: "danas", tomorrow: "sutra", yesterday: "jučer" } }, time: { label: "Vrijeme", hour: "Sat", minute: "Minute", now: "Sada", invalid: "Unesite vrijeme, na primjer 14:35.", step: "Minute su u koracima od {step}.", open: "Odaberi vrijeme", placeholder: "npr. 14:35", at: "{date} u {time}", words: { now: "sada" } } }, errors: { unauthenticated: "Niste prijavljeni. Molimo prijavite se.", forbidden: "Nemate ovlasti za ovu radnju.", not_found: "Traženi zapis nije pronađen.", conflict: "Zapis je promijenjen ili već postoji. Osvježite stranicu i pokušajte ponovno.", rate_limited: "Previše zahtjeva u kratkom vremenu. Pričekajte minutu pa pokušajte ponovno.", check_fields: "Provjerite označena polja.", offline: "Poslužitelj nije dostupan. Provjerite vezu i pokušajte ponovno.", cancelled: "Zahtjev je otkazan.", unexpected: "Došlo je do neočekivane greške. Molimo pokušajte ponovno." }, shortcuts: { title: "Tipkovni prečaci", or: "ili", hint: "Prečaci ne rade dok pišete u polje ili je otvoren prozor.", show_help: "Prikaži prečace", focus_search: "Pretraži popis", open_filters: "Otvori filtere", groups: { general: "Općenito", list: "Popis", record: "Zapis" } } }, S = {
6
7
  core: N
7
- }, O = { actions: { cancel: "Prekliči", close: "Zapri", confirm: "Potrdi", retry: "Poskusi znova", save: "Shrani", saving: "Shranjujem…", saved: "Shranjeno", more: "Več", edit: "Uredi", clear: "Počisti", done: "Končano" }, collection: { search: { label: "Išči", placeholder: "Vpišite za iskanje..." }, clear: "Ponastavi", no_data: "Ni podatkov", no_results: "Za vaše iskanje ni najdenih podatkov.", failed: { title: "Seznama ni mogoče naložiti" }, open_record: "Poglej podrobnosti", views_label: "Pogledi", page: { label: "Strani", previous: "Prejšnja stran", next: "Naslednja stran", page_of: "Stran {current} od {total}", total: "Prikaz {from} do {to} od skupaj {total} zapisov", per_page: "Zapisov na stran" }, filters: { show_all: "Prikaži vse", apply: "Uporabi", clear: "Počisti", type_to_filter: "Vpišite za filtriranje...", panel_title: "Filtri", panel_button: "Filtri", reset_all: "Ponastavi vse", range_from: "Od", range_until: "Do" }, date_presets: { label: "Vneseno", options: { today: "Danes", yesterday: "Včeraj", this_week: "Ta teden", last_week: "Prejšnji teden", this_month: "Ta mesec", last_month: "Prejšnji mesec", this_year: "To leto", last_year: "Prejšnje leto" } }, saved: { title: "Shranjeni filtri", menu: "Shranjeni filtri", save: "Shrani", name_placeholder: "Ime, npr. Nov Renault", saved_toast: "Filtri „{name}” shranjeni in uporabljeni.", deleted_toast: "Filtri „{name}” izbrisani.", delete: "Izbriši „{name}”", save_button: "Shrani filtre", name_label: "Ime filtra", replace: "Zamenjaj", replace_hint: "Obstoječi filter „{name}” bo zamenjan.", nothing_to_save: "Za shranjevanje izberite vsaj en filter.", save_failed: "Filtrov ni mogoče shraniti.", delete_failed: "Filtrov ni mogoče izbrisati.", undo: "Razveljavi" }, empty: { title: "Za izbrane filtre ni rezultatov", description: "Odstranite katerega od filtrov ali ponastavite vse.", remove_last: "Odstrani: {filter}", clear_all: "Ponastavi vse filtre", search: "Iskanje" } }, state: { loading: "Nalaganje vsebine", stale: "Prikazani so prejšnji podatki. Morda niso posodobljeni.", refreshing: "Osveževanje. Prikazani so prejšnji podatki.", empty: "Ni podatkov", no_value: "Ni vneseno" }, page: { breadcrumbs: "Navigacijska pot", more_actions: "Več dejanj" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Neshranjene spremembe", body: "Vneseni podatki niso shranjeni. Če nadaljujete, bodo spremembe izgubljene.", confirm: "Zavrzi spremembe", cancel: "Nadaljuj z urejanjem" }, toast: { notifications: "Obvestila" }, shell: { menu: "Meni", home: "Domov", account: { open: "Odpri uporabniški meni", language: "Jezik", sign_out: "Odjava", sign_out_failed: "Strežnik ni končal vaše seje. Poskusite znova." }, update: { available: "Na voljo je nova različica aplikacije", reload: "Osveži" } }, no_access: { title: "Ni dostopa", body: "Vaše pravice ne vključujejo te strani. Če menite, da je prišlo do napake, se obrnite na skrbnika." }, startup: { title: "Aplikacije ni bilo mogoče zagnati", session: "Strežnik ni dosegljiv, zato seje ni bilo mogoče preveriti. Preverite povezavo in poskusite znova.", messages: "Besedil aplikacije ni bilo mogoče naložiti. Preverite povezavo in poskusite znova.", other: "Pri zagonu je prišlo do napake. Poskusite znova." }, resource: { not_found: { title: "Ni najdeno", body: "Zahtevanega zapisa ni mogoče najti." }, unavailable: "Pri nalaganju podatkov je prišlo do napake. Poskusite znova.", offline: "Strežnika ni mogoče doseči. Preverite povezavo in poskusite znova.", pager: { previous: "Prejšnji zapis", next: "Naslednji zapis", records: "Zapisi" } }, sections: { label: "Razdelki" }, steps: { label: "Napredek", position: "Korak {current} od {total}", next_named: "Naprej: {step}", done: "končano", draft_saved: "osnutek shranjen", restored: "Nadaljujete s shranjenim osnutkom.", start_over: "Začni znova" }, viewer: { label: "Pregled fotografij", open: "Poglej fotografijo", counter: "{current} / {total}", zoom_in: "Povečaj", zoom_out: "Pomanjšaj", zoom_percent: "{percent} %", rotate: "Zasukaj", download: "Prenesi", previous: "Prejšnja fotografija", next: "Naslednja fotografija" }, form: { unsaved_changes: "Neshranjene spremembe", failure: { invalid: "Preverite označena polja in poskusite znova.", conflict: "Zapis se je spremenil, medtem ko ste ga urejali.", forbidden: "Za to dejanje nimate pooblastila.", unauthorized: "Vaša seja je potekla. Prijavite se znova.", offline: "Strežnik ni dosegljiv. Preverite povezavo in poskusite znova.", failed: "Sprememb ni bilo mogoče shraniti. Poskusite znova.", refresh: "Spremembe so shranjene, vendar posodobljenega zapisa ni bilo mogoče naložiti. Osvežite stran." }, errors: { hidden_title: "Napake v poljih, ki trenutno niso prikazana:", request: "Zahteva {id}" }, sections: { errors: "Napake: {count}", done: "končano" }, required: { label: "Obvezna polja", count: "{filled} od {total}", marker: "obvezno" }, group: { edit: "Uredi", foreign: "Shranjevanje zahteva tudi podatke iz skupine: {groups}. Najprej dopolnite to skupino." }, select: { choose: "Izberite…", search: "Išči", no_matches: "Ni zadetkov", loading: "Nalaganje…", clear: "Počisti", done: "Končano", failed: "Iskanje ni uspelo. Poskusite znova." }, number: { invalid: "Vnesite število." }, file: { choose: "Izberi datoteko", drop: "ali povlecite datoteko sem", remove: "Odstrani", allowed: "Dovoljene oblike: {formats}", max_size: "Največja velikost: {size}", invalid_type: "Oblika datoteke ni podprta.", too_large: "Datoteka je večja od {size}." }, yes: "Da", no: "Ne", otp: { label: "Koda za potrditev, {length} števk" }, months: { long: { 1: "januar", 2: "februar", 3: "marec", 4: "april", 5: "maj", 6: "junij", 7: "julij", 8: "avgust", 9: "september", 10: "oktober", 11: "november", 12: "december" }, short: { 1: "jan", 2: "feb", 3: "mar", 4: "apr", 5: "maj", 6: "jun", 7: "jul", 8: "avg", 9: "sep", 10: "okt", 11: "nov", 12: "dec" }, with_year: "{month} {year}" }, suggestions: { recent: "Nedavno", keys_complete: "Tab sprejme · ↑↓ izbira · Esc zapre", keys_pick: "↑↓ izbira · Enter potrdi · Esc zapre" }, i18n: { languages: "Jezik", tab_written: "{language}, izpolnjeno", tab_empty: "{language}, prazno", missing: "Še ni napisano: {languages}.", required: "Obvezno za: {languages}.", copy: "Kopiraj {language} v prazna polja", more: "Še jezikov: {count} · izpolnjenih: {filled}" }, phone: { country: "Država: {country}", countries: "Države", search: "Vnesite državo ali klicno kodo…", common: "Pogosto", all: "Vse države", no_match: "Nobena država ne ustreza.", too_short: "Številka je prekratka za: {country}.", too_long: "Številka je predolga za: {country}.", invalid: "To ni veljavna številka za: {country}.", invalid_any: "To ni veljavna telefonska številka.", kind_mobile: "Mobilna številka", kind_landline: "Stacionarna številka", kind_toll_free: "Brezplačna številka", kind_premium_rate: "Številka s posebno tarifo", kind_voip: "Internetna (VoIP) številka", call: "Pokliči", message: "Sporočilo", copy: "Kopiraj", copied: "Kopirano" }, date: { calendar: "Koledar", previous_month: "Prejšnji mesec", next_month: "Naslednji mesec", previous_year: "Prejšnje leto", next_year: "Naslednje leto", choose_month: "Izberi mesec in leto", open: "Odpri koledar", invalid: "Vnesite datum, na primer {example}.", unavailable: "Ta datum ni na voljo.", placeholder: "npr. {example} ali +7", keys: "Puščice spreminjajo dan, PgUp/PgDn mesec, Enter izbere.", quick: "Hitra izbira", today: "Danes", tomorrow: "Jutri", week: "Čez 7 dni", month_end: "Konec meseca", next_working_day: "Naslednji delovni dan", years: "Leta", previous_years: "Prejšnja leta", next_years: "Naslednja leta", words: { today: "danes", tomorrow: "jutri", yesterday: "včeraj" } }, time: { label: "Čas", hour: "Ura", minute: "Minute", now: "Zdaj", invalid: "Vnesite čas, na primer 14:35.", step: "Minute so v korakih po {step}.", open: "Izberi čas", placeholder: "npr. 14:35", at: "{date} ob {time}", words: { now: "zdaj" } } } }, x = {
8
+ }, O = { actions: { cancel: "Prekliči", close: "Zapri", confirm: "Potrdi", retry: "Poskusi znova", save: "Shrani", saving: "Shranjujem…", saved: "Shranjeno", more: "Več", edit: "Uredi", clear: "Počisti", done: "Končano" }, collection: { search: { label: "Išči", placeholder: "Vpišite za iskanje..." }, clear: "Ponastavi", no_data: "Ni podatkov", no_results: "Za vaše iskanje ni najdenih podatkov.", failed: { title: "Seznama ni mogoče naložiti" }, open_record: "Poglej podrobnosti", views_label: "Pogledi", page: { label: "Strani", previous: "Prejšnja stran", next: "Naslednja stran", page_of: "Stran {current} od {total}", total: "Prikaz {from} do {to} od skupaj {total} zapisov", per_page: "Zapisov na stran" }, filters: { show_all: "Prikaži vse", apply: "Uporabi", clear: "Počisti", type_to_filter: "Vpišite za filtriranje...", panel_title: "Filtri", panel_button: "Filtri", reset_all: "Ponastavi vse", range_from: "Od", range_until: "Do" }, date_presets: { label: "Vneseno", options: { today: "Danes", yesterday: "Včeraj", this_week: "Ta teden", last_week: "Prejšnji teden", this_month: "Ta mesec", last_month: "Prejšnji mesec", this_year: "To leto", last_year: "Prejšnje leto" } }, saved: { title: "Shranjeni filtri", menu: "Shranjeni filtri", save: "Shrani", name_placeholder: "Ime, npr. Nov Renault", saved_toast: "Filtri „{name}” shranjeni in uporabljeni.", deleted_toast: "Filtri „{name}” izbrisani.", delete: "Izbriši „{name}”", save_button: "Shrani filtre", name_label: "Ime filtra", replace: "Zamenjaj", replace_hint: "Obstoječi filter „{name}” bo zamenjan.", nothing_to_save: "Za shranjevanje izberite vsaj en filter.", save_failed: "Filtrov ni mogoče shraniti.", delete_failed: "Filtrov ni mogoče izbrisati.", undo: "Razveljavi" }, empty: { title: "Za izbrane filtre ni rezultatov", description: "Odstranite katerega od filtrov ali ponastavite vse.", remove_last: "Odstrani: {filter}", clear_all: "Ponastavi vse filtre", search: "Iskanje" } }, state: { loading: "Nalaganje vsebine", stale: "Prikazani so prejšnji podatki. Morda niso posodobljeni.", refreshing: "Osveževanje. Prikazani so prejšnji podatki.", empty: "Ni podatkov", no_value: "Ni vneseno" }, page: { breadcrumbs: "Navigacijska pot", more_actions: "Več dejanj" }, wait: { seconds: "{count} s" }, discard_changes: { title: "Neshranjene spremembe", body: "Vneseni podatki niso shranjeni. Če nadaljujete, bodo spremembe izgubljene.", confirm: "Zavrzi spremembe", cancel: "Nadaljuj z urejanjem" }, toast: { notifications: "Obvestila" }, shell: { menu: "Meni", home: "Domov", account: { open: "Odpri uporabniški meni", language: "Jezik", sign_out: "Odjava", sign_out_failed: "Strežnik ni končal vaše seje. Poskusite znova." }, update: { available: "Na voljo je nova različica aplikacije", reload: "Osveži" } }, no_access: { title: "Ni dostopa", body: "Vaše pravice ne vključujejo te strani. Če menite, da je prišlo do napake, se obrnite na skrbnika." }, startup: { title: "Aplikacije ni bilo mogoče zagnati", session: "Strežnik ni dosegljiv, zato seje ni bilo mogoče preveriti. Preverite povezavo in poskusite znova.", messages: "Besedil aplikacije ni bilo mogoče naložiti. Preverite povezavo in poskusite znova.", other: "Pri zagonu je prišlo do napake. Poskusite znova." }, resource: { not_found: { title: "Ni najdeno", body: "Zahtevanega zapisa ni mogoče najti." }, unavailable: "Pri nalaganju podatkov je prišlo do napake. Poskusite znova.", offline: "Strežnika ni mogoče doseči. Preverite povezavo in poskusite znova.", pager: { previous: "Prejšnji zapis", next: "Naslednji zapis", records: "Zapisi" } }, sections: { label: "Razdelki" }, steps: { label: "Napredek", position: "Korak {current} od {total}", next_named: "Naprej: {step}", done: "končano", draft_saved: "osnutek shranjen", restored: "Nadaljujete s shranjenim osnutkom.", start_over: "Začni znova" }, viewer: { label: "Pregled fotografij", open: "Poglej fotografijo", counter: "{current} / {total}", zoom_in: "Povečaj", zoom_out: "Pomanjšaj", zoom_percent: "{percent} %", rotate: "Zasukaj", download: "Prenesi", previous: "Prejšnja fotografija", next: "Naslednja fotografija" }, form: { unsaved_changes: "Neshranjene spremembe", failure: { invalid: "Preverite označena polja in poskusite znova.", conflict: "Zapis se je spremenil, medtem ko ste ga urejali.", forbidden: "Za to dejanje nimate pooblastila.", unauthorized: "Vaša seja je potekla. Prijavite se znova.", offline: "Strežnik ni dosegljiv. Preverite povezavo in poskusite znova.", failed: "Sprememb ni bilo mogoče shraniti. Poskusite znova.", refresh: "Spremembe so shranjene, vendar posodobljenega zapisa ni bilo mogoče naložiti. Osvežite stran." }, errors: { hidden_title: "Napake v poljih, ki trenutno niso prikazana:", request: "Zahteva {id}" }, sections: { errors: "Napake: {count}", done: "končano" }, required: { label: "Obvezna polja", count: "{filled} od {total}", marker: "obvezno" }, group: { edit: "Uredi", foreign: "Shranjevanje zahteva tudi podatke iz skupine: {groups}. Najprej dopolnite to skupino." }, select: { choose: "Izberite…", search: "Išči", no_matches: "Ni zadetkov", loading: "Nalaganje…", clear: "Počisti", done: "Končano", failed: "Iskanje ni uspelo. Poskusite znova.", load_failed: "Možnosti niso bile naložene." }, number: { invalid: "Vnesite število." }, file: { choose: "Izberi datoteko", drop: "ali povlecite datoteko sem", remove: "Odstrani", allowed: "Dovoljene oblike: {formats}", max_size: "Največja velikost: {size}", invalid_type: "Oblika datoteke ni podprta.", too_large: "Datoteka je večja od {size}." }, yes: "Da", no: "Ne", otp: { label: "Koda za potrditev, {length} števk" }, months: { long: { 1: "januar", 2: "februar", 3: "marec", 4: "april", 5: "maj", 6: "junij", 7: "julij", 8: "avgust", 9: "september", 10: "oktober", 11: "november", 12: "december" }, short: { 1: "jan", 2: "feb", 3: "mar", 4: "apr", 5: "maj", 6: "jun", 7: "jul", 8: "avg", 9: "sep", 10: "okt", 11: "nov", 12: "dec" }, with_year: "{month} {year}" }, suggestions: { recent: "Nedavno", keys_complete: "Tab sprejme · ↑↓ izbira · Esc zapre", keys_pick: "↑↓ izbira · Enter potrdi · Esc zapre" }, i18n: { languages: "Jezik", tab_written: "{language}, izpolnjeno", tab_empty: "{language}, prazno", missing: "Še ni napisano: {languages}.", required: "Obvezno za: {languages}.", copy: "Kopiraj {language} v prazna polja", more: "Še jezikov: {count} · izpolnjenih: {filled}" }, phone: { country: "Država: {country}", countries: "Države", search: "Vnesite državo ali klicno kodo…", common: "Pogosto", all: "Vse države", no_match: "Nobena država ne ustreza.", too_short: "Številka je prekratka za: {country}.", too_long: "Številka je predolga za: {country}.", invalid: "To ni veljavna številka za: {country}.", invalid_any: "To ni veljavna telefonska številka.", kind_mobile: "Mobilna številka", kind_landline: "Stacionarna številka", kind_toll_free: "Brezplačna številka", kind_premium_rate: "Številka s posebno tarifo", kind_voip: "Internetna (VoIP) številka", call: "Pokliči", message: "Sporočilo", copy: "Kopiraj", copied: "Kopirano" }, date: { calendar: "Koledar", previous_month: "Prejšnji mesec", next_month: "Naslednji mesec", previous_year: "Prejšnje leto", next_year: "Naslednje leto", choose_month: "Izberi mesec in leto", open: "Odpri koledar", invalid: "Vnesite datum, na primer {example}.", unavailable: "Ta datum ni na voljo.", placeholder: "npr. {example} ali +7", keys: "Puščice spreminjajo dan, PgUp/PgDn mesec, Enter izbere.", quick: "Hitra izbira", today: "Danes", tomorrow: "Jutri", week: "Čez 7 dni", month_end: "Konec meseca", next_working_day: "Naslednji delovni dan", years: "Leta", previous_years: "Prejšnja leta", next_years: "Naslednja leta", words: { today: "danes", tomorrow: "jutri", yesterday: "včeraj" } }, time: { label: "Čas", hour: "Ura", minute: "Minute", now: "Zdaj", invalid: "Vnesite čas, na primer 14:35.", step: "Minute so v korakih po {step}.", open: "Izberi čas", placeholder: "npr. 14:35", at: "{date} ob {time}", words: { now: "zdaj" } } }, errors: { unauthenticated: "Niste prijavljeni. Prijavite se.", forbidden: "Za to dejanje nimate pooblastil.", not_found: "Zahtevanega zapisa ni mogoče najti.", conflict: "Zapis je bil spremenjen ali že obstaja. Osvežite stran in poskusite znova.", rate_limited: "Preveč zahtev v kratkem času. Počakajte minuto in poskusite znova.", check_fields: "Preverite označena polja.", offline: "Strežnik ni dosegljiv. Preverite povezavo in poskusite znova.", cancelled: "Zahteva je bila preklicana.", unexpected: "Prišlo je do nepričakovane napake. Poskusite znova." }, shortcuts: { title: "Bližnjice na tipkovnici", or: "ali", hint: "Bližnjice ne delujejo med vnosom v polje ali ko je odprto okno.", show_help: "Prikaži bližnjice", focus_search: "Išči po seznamu", open_filters: "Odpri filtre", groups: { general: "Splošno", list: "Seznam", record: "Zapis" } } }, x = {
8
9
  core: O
9
10
  }, T = /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/i;
10
11
  function D(o, t, s = {}) {
@@ -14,7 +15,7 @@ function D(o, t, s = {}) {
14
15
  }
15
16
  const U = (o, t) => o.split(".").reduceRight((s, u) => ({ [u]: s }), t);
16
17
  function M(o) {
17
- const { target: t, fallback: s } = o, u = new Map(o.namespaces.map((e) => [e.namespace, e])), g = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Set();
18
+ const { target: t, fallback: s } = o, u = new Map(o.namespaces.map((e) => [e.namespace, e])), g = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), j = /* @__PURE__ */ new Set();
18
19
  let p = 0, d = !1;
19
20
  const f = (e, a) => `${e}\0${a}`;
20
21
  function h(e, a) {
@@ -26,36 +27,36 @@ function M(o) {
26
27
  if (!r) return Promise.resolve(!0);
27
28
  l.delete(i);
28
29
  const k = r().then(
29
- (v) => d ? !1 : (t.mergeLocaleMessage(e, U(a, v.default)), g.add(i), !0),
30
- (v) => {
31
- const _ = { namespace: a, locale: e, error: v };
30
+ (m) => d ? !1 : (t.mergeLocaleMessage(e, U(a, m.default)), g.add(i), !0),
31
+ (m) => {
32
+ const _ = { namespace: a, locale: e, error: m };
32
33
  return l.set(i, _), d || o.onFailure?.(_), !1;
33
34
  }
34
35
  ).finally(() => c.delete(i));
35
36
  return c.set(i, k), k;
36
37
  }
37
38
  const b = (e) => e === s ? [e] : [e, s];
38
- async function j(e, a) {
39
+ async function v(e, a) {
39
40
  return (await Promise.all([...a].flatMap((n) => b(e).map((r) => h(r, n))))).every(Boolean);
40
41
  }
41
42
  return {
42
43
  async load(e) {
43
- for (const a of e) m.add(a);
44
- await j(t.locale.value, e);
44
+ for (const a of e) j.add(a);
45
+ await v(t.locale.value, e);
45
46
  },
46
47
  async loadEssential() {
47
48
  const e = o.namespaces.filter((a) => a.essential).map((a) => a.namespace);
48
- for (const a of e) m.add(a);
49
- return await j(t.locale.value, e), [...l.values()].filter((a) => e.includes(a.namespace));
49
+ for (const a of e) j.add(a);
50
+ return await v(t.locale.value, e), [...l.values()].filter((a) => e.includes(a.namespace));
50
51
  },
51
52
  async setLocale(e) {
52
53
  if (!o.supported.includes(e)) throw new RangeError(`Unsupported locale "${e}"; this application supports ${o.supported.join(", ")}.`);
53
54
  const a = ++p, i = /* @__PURE__ */ new Set();
54
55
  for (; ; ) {
55
- const n = [...m].filter((r) => !i.has(r));
56
+ const n = [...j].filter((r) => !i.has(r));
56
57
  if (n.length === 0) break;
57
58
  for (const r of n) i.add(r);
58
- if (await j(e, n), p !== a || d) return !1;
59
+ if (await v(e, n), p !== a || d) return !1;
59
60
  }
60
61
  return p !== a || d ? !1 : (t.locale.value = e, !0);
61
62
  },
@@ -68,14 +69,15 @@ function M(o) {
68
69
  }
69
70
  };
70
71
  }
71
- const F = {
72
+ const Z = {
72
73
  en: w,
73
74
  hr: S,
74
- bs: z,
75
+ bs: y,
75
76
  sl: x
76
77
  };
77
78
  export {
78
- F as coreMessages,
79
+ Z as coreMessages,
79
80
  M as createMessageRuntime,
80
- D as localeMessages
81
+ D as localeMessages,
82
+ C as useDescribeError
81
83
  };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** The version of @wssto2/vue-core (kept equal to package.json by index.test.ts). */
2
- export declare const version = "0.1.0";
2
+ export declare const version = "0.2.0";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- const o = "0.1.0";
1
+ const o = "0.2.0";
2
2
  export {
3
3
  o as version
4
4
  };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The flag of a country (ISO 3166-1 alpha-2, upper case) as an SVG (Windows draws the emoji flags as two letters). Each flag is
3
+ * its own lazy module, loaded when the flag first scrolls into view, so an app downloads the flags a screen shows and not the 250
4
+ * of the package. Shared by the phone field and the shell's language menu; knows nothing of phone numbers.
5
+ */
6
+ type __VLS_Props = {
7
+ country: string;
8
+ };
9
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ export default _default;
@@ -1,4 +1,5 @@
1
1
  import { type IconName } from "../icon";
2
+ import { type ModalPlacement } from "./placement";
2
3
  /**
3
4
  * The adaptive dialog.
4
5
  *
@@ -57,6 +58,8 @@ type __VLS_Props = {
57
58
  value: number;
58
59
  complete?: boolean;
59
60
  } | null;
61
+ /** Wide screens: where the dialog stands, over the application's `modalPlacementKey` default. */
62
+ placement?: ModalPlacement;
60
63
  };
61
64
  type __VLS_Slots = {
62
65
  default?: () => unknown;
@@ -90,6 +93,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
90
93
  title: string;
91
94
  size: "sm" | "md" | "lg" | "xl";
92
95
  status: "idle" | "processing" | "done";
96
+ placement: ModalPlacement;
93
97
  subtitle: string;
94
98
  grouped: boolean;
95
99
  withoutFooter: boolean;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -1,3 +1,5 @@
1
1
  export { default as DiscardChangesModal } from "./DiscardChangesModal.vue";
2
2
  export { default as Modal } from "./Modal.vue";
3
3
  export { default as Sheet } from "./Sheet.vue";
4
+ export { default as ShortcutHelp } from "./ShortcutHelp.vue";
5
+ export { modalPlacementKey, type ModalPlacement } from "./placement";
@@ -1,8 +1,66 @@
1
- import { _ as r } from "../DiscardChangesModal.vue_vue_type_script_setup_true_lang-Bx5O1RZJ.js";
2
- import { _ as s } from "../Modal.vue_vue_type_script_setup_true_lang-DYQgaUtj.js";
3
- import { _ as d } from "../Sheet.vue_vue_type_script_setup_true_lang-BLBD5ps8.js";
1
+ import { _ as G } from "../DiscardChangesModal.vue_vue_type_script_setup_true_lang-DyhYHRyz.js";
2
+ import { _ as y } from "../Modal.vue_vue_type_script_setup_true_lang-BQZM49gC.js";
3
+ import { m as O } from "../Modal.vue_vue_type_script_setup_true_lang-BQZM49gC.js";
4
+ import { _ as T } from "../Sheet.vue_vue_type_script_setup_true_lang-CtkJ-4e3.js";
5
+ import { defineComponent as b, ref as k, computed as v, openBlock as t, createBlock as w, unref as i, withCtx as S, createElementVNode as r, createElementBlock as o, Fragment as c, renderList as u, toDisplayString as l, createCommentVNode as C } from "vue";
6
+ import { useI18n as B } from "vue-i18n";
7
+ import { a as K, u as M } from "../Button.vue_vue_type_script_setup_true_lang-B1eZgLae.js";
8
+ const $ = {
9
+ class: "flex flex-col gap-5",
10
+ "data-test": "shortcut-help"
11
+ }, j = { class: "mb-1 text-footnote font-semibold text-content-muted uppercase" }, D = { class: "divide-y divide-border-separator" }, E = { class: "text-body" }, H = { class: "flex shrink-0 items-center gap-1 text-footnote text-content-muted" }, N = { key: 0 }, V = { class: "text-footnote text-content-muted" }, R = /* @__PURE__ */ b({
12
+ __name: "ShortcutHelp",
13
+ setup(z) {
14
+ const { t: s, te: f } = B(), p = k(null), h = K();
15
+ M({ key: "?", shiftKey: !0, group: "general", label: () => s("core.shortcuts.show_help") }, () => p.value?.present());
16
+ const x = v(() => {
17
+ const a = /* @__PURE__ */ new Map();
18
+ for (const e of h.value) a.set(e.group ?? "general", [...a.get(e.group ?? "general") ?? [], e]);
19
+ return [...a].map(([e, n]) => ({ group: e, title: f(`core.shortcuts.groups.${e}`) ? s(`core.shortcuts.groups.${e}`) : e, rows: n }));
20
+ });
21
+ return (a, e) => (t(), w(y, {
22
+ ref_key: "modal",
23
+ ref: p,
24
+ title: i(s)("core.shortcuts.title"),
25
+ size: "sm"
26
+ }, {
27
+ default: S(() => [
28
+ r("div", $, [
29
+ (t(!0), o(c, null, u(x.value, (n) => (t(), o("section", {
30
+ key: n.group
31
+ }, [
32
+ r("h3", j, l(n.title), 1),
33
+ r("dl", D, [
34
+ (t(!0), o(c, null, u(n.rows, (d) => (t(), o("div", {
35
+ key: d.label,
36
+ class: "flex items-center justify-between gap-4 py-1.5"
37
+ }, [
38
+ r("dt", E, l(d.label), 1),
39
+ r("dd", H, [
40
+ (t(!0), o(c, null, u(d.keys, (m, g) => (t(), o(c, {
41
+ key: m.join("+")
42
+ }, [
43
+ g > 0 ? (t(), o("span", N, l(i(s)("core.shortcuts.or")), 1)) : C("", !0),
44
+ (t(!0), o(c, null, u(m, (_) => (t(), o("kbd", {
45
+ key: _,
46
+ class: "min-w-6 rounded-control border border-border-separator bg-fill px-1.5 py-0.5 text-center font-mono text-content-strong"
47
+ }, l(_), 1))), 128))
48
+ ], 64))), 128))
49
+ ])
50
+ ]))), 128))
51
+ ])
52
+ ]))), 128)),
53
+ r("p", V, l(i(s)("core.shortcuts.hint")), 1)
54
+ ])
55
+ ]),
56
+ _: 1
57
+ }, 8, ["title"]));
58
+ }
59
+ });
4
60
  export {
5
- r as DiscardChangesModal,
6
- s as Modal,
7
- d as Sheet
61
+ G as DiscardChangesModal,
62
+ y as Modal,
63
+ T as Sheet,
64
+ R as ShortcutHelp,
65
+ O as modalPlacementKey
8
66
  };
@@ -0,0 +1,22 @@
1
+ import { type InjectionKey, type MaybeRefOrGetter } from "vue";
2
+ /**
3
+ * Where a `Modal` stands on wide screens (phones always get the page sheet). The default is the
4
+ * centre of the viewport. An application shown inside a frame that has chrome of its own (the page
5
+ * around it covers part of the viewport) aligns dialogs to the top and shifts them away from it.
6
+ */
7
+ export interface ModalPlacement {
8
+ /** `"center"` (default) or `"top"`: near the top edge, where a tall dialog does not push its header out of sight. */
9
+ readonly align?: "center" | "top";
10
+ /** A horizontal shift in pixels; negative moves the dialog left. Default 0. */
11
+ readonly offsetX?: number;
12
+ }
13
+ /**
14
+ * The placement of every modal of the application, once, reactive when given as a ref or getter:
15
+ *
16
+ * app.provide(modalPlacementKey, () => ({ align: "top", offsetX: -hostSidebarWidth.value / 2 }));
17
+ *
18
+ * A modal's own `placement` prop wins, field by field.
19
+ */
20
+ export declare const modalPlacementKey: InjectionKey<MaybeRefOrGetter<ModalPlacement>>;
21
+ /** The placement to apply: the app's, with the modal's own fields on top. */
22
+ export declare function resolvePlacement(app: MaybeRefOrGetter<ModalPlacement> | undefined, own: ModalPlacement | undefined): Required<ModalPlacement>;
@@ -315,11 +315,11 @@ const I = (r) => r.normalize("NFD").replace(/[̀-ͯ]/g, "").toLocaleLowerCase();
315
315
  export {
316
316
  Be as _,
317
317
  Ee as a,
318
- X as b,
319
- I as c,
318
+ Re as b,
319
+ X as c,
320
320
  le as d,
321
321
  te as e,
322
- Re as f,
322
+ I as f,
323
323
  je as g,
324
324
  Z as h,
325
325
  fe as i,
@@ -26,6 +26,8 @@ type __VLS_Props = {
26
26
  /** Panel width on wide screens; `auto` is as wide as the content (a date and time picker). */
27
27
  width?: "sm" | "md" | "lg" | "auto";
28
28
  arrow?: boolean;
29
+ /** On wide screens the panel is at least as wide as its trigger (a select's list is never narrower than the field); `width` stays its minimum. */
30
+ matchTriggerWidth?: boolean;
29
31
  /** The trigger fills its container (a full-width sidebar row). */
30
32
  block?: boolean;
31
33
  /** Focus moves into the panel when it opens. `false` where the trigger is a field that keeps being typed into (a date). */
@@ -62,6 +64,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
62
64
  block: boolean;
63
65
  placement: Placement;
64
66
  arrow: boolean;
67
+ matchTriggerWidth: boolean;
65
68
  autofocus: boolean;
66
69
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
67
70
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;