@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.
- package/README.md +20 -9
- 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
- package/dist/{AlertDialog.vue_vue_type_script_setup_true_lang-BZb4qKXo.js → AlertDialog.vue_vue_type_script_setup_true_lang-e4hzkzg3.js} +1 -1
- package/dist/{AsyncSection.vue_vue_type_script_setup_true_lang-B82bl36A.js → AsyncSection.vue_vue_type_script_setup_true_lang-CWLB3xsR.js} +1 -1
- package/dist/Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js +51 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-B1eZgLae.js +182 -0
- package/dist/CountryFlag.vue_vue_type_script_setup_true_lang-Kry_vPPZ.js +299 -0
- package/dist/{DiscardChangesModal.vue_vue_type_script_setup_true_lang-Bx5O1RZJ.js → DiscardChangesModal.vue_vue_type_script_setup_true_lang-DyhYHRyz.js} +1 -1
- package/dist/{LeaveGuardRoot.vue_vue_type_script_setup_true_lang-DH6EB8br.js → LeaveGuardRoot.vue_vue_type_script_setup_true_lang-CvwoT1JF.js} +1 -1
- package/dist/{Menu.vue_vue_type_script_setup_true_lang-D44EHXQZ.js → Menu.vue_vue_type_script_setup_true_lang-CrMj6KPD.js} +1 -1
- package/dist/{Modal.vue_vue_type_script_setup_true_lang-DYQgaUtj.js → Modal.vue_vue_type_script_setup_true_lang-BQZM49gC.js} +138 -128
- package/dist/{PhotoViewer.vue_vue_type_script_setup_true_lang-DDVQXJRB.js → PhotoViewer.vue_vue_type_script_setup_true_lang-ElDizaW2.js} +1 -1
- 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
- package/dist/SelectField.vue_vue_type_script_setup_true_lang-DZTrU8NJ.js +661 -0
- 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
- 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
- package/dist/app/application.d.ts +5 -0
- package/dist/app/environment.d.ts +2 -0
- package/dist/app/index.js +75 -72
- package/dist/button/index.d.ts +1 -1
- package/dist/button/index.js +5 -3
- package/dist/button/shortcut.d.ts +28 -2
- package/dist/collection/CollectionPage.vue.d.ts +1 -0
- package/dist/collection/CollectionRows.vue.d.ts +59 -0
- package/dist/collection/CollectionTable.vue.d.ts +1 -1
- package/dist/collection/DataTable.vue.d.ts +47 -0
- package/dist/collection/RowActions.vue.d.ts +19 -0
- package/dist/collection/columns.d.ts +2 -0
- package/dist/collection/index.d.ts +4 -2
- package/dist/collection/index.js +1752 -1610
- package/dist/collection/rowLayout.d.ts +10 -0
- package/dist/collection/slots.d.ts +6 -3
- package/dist/describeError-l5T9b8Uv.js +41 -0
- package/dist/dialogStack-DZZg55w0.js +31 -0
- package/dist/form/CommandDialog.vue.d.ts +12 -1
- package/dist/form/FormGroup.vue.d.ts +1 -1
- package/dist/form/MultiSelectField.vue.d.ts +4 -1
- package/dist/form/NumberField.vue.d.ts +6 -0
- package/dist/form/OptionList.vue.d.ts +6 -2
- package/dist/form/SelectField.vue.d.ts +4 -1
- package/dist/form/index.d.ts +2 -0
- package/dist/form/index.js +1940 -2008
- package/dist/form/suggestions.d.ts +11 -0
- package/dist/form/useOptions.d.ts +60 -0
- package/dist/i18n/describeError.d.ts +31 -0
- package/dist/i18n/index.d.ts +26 -0
- package/dist/i18n/index.js +22 -20
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/CountryFlag.vue.d.ts +10 -0
- package/dist/modal/Modal.vue.d.ts +4 -0
- package/dist/modal/ShortcutHelp.vue.d.ts +2 -0
- package/dist/modal/index.d.ts +2 -0
- package/dist/modal/index.js +64 -6
- package/dist/modal/placement.d.ts +22 -0
- package/dist/{options-CjSz2dQK.js → options-DAkBtYkI.js} +3 -3
- package/dist/overlay/Popover.vue.d.ts +3 -0
- package/dist/overlay/dialogStack.d.ts +9 -0
- package/dist/overlay/index.d.ts +1 -1
- package/dist/overlay/index.js +18 -17
- package/dist/page/index.js +4 -4
- package/dist/phone/index.js +247 -540
- package/dist/platform/AccessGate.vue.d.ts +50 -0
- package/dist/platform/index.d.ts +2 -0
- package/dist/platform/index.js +86 -66
- package/dist/resource/index.js +42 -42
- package/dist/shell/AccountMenuItem.vue.d.ts +3 -0
- package/dist/shell/NavigationList.vue.d.ts +1 -1
- package/dist/shell/index.js +406 -394
- package/dist/state/Badge.vue.d.ts +17 -10
- package/dist/state/hue.d.ts +8 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.js +92 -56
- package/dist/state/useLoad.d.ts +41 -0
- package/dist/styles.css +1 -1
- package/dist/testing/app.d.ts +61 -0
- package/dist/testing/async.d.ts +12 -0
- package/dist/testing/collection.d.ts +18 -0
- package/dist/testing/format.d.ts +9 -0
- package/dist/testing/i18n.d.ts +16 -0
- package/dist/testing/index.d.ts +14 -0
- package/dist/testing/index.js +178 -0
- package/dist/testing/media.d.ts +23 -0
- package/dist/testing/platform.d.ts +40 -0
- package/dist/testing/transport.d.ts +40 -0
- package/dist/{toast-BTeX0r66.js → toast-DvrHQ6Ag.js} +45 -43
- package/dist/{useDialog-wmyNx2j_.js → useDialog-CXR3hN0G.js} +1 -1
- package/package.json +5 -1
- package/src/styles/theme.css +60 -0
- package/dist/Badge.vue_vue_type_script_setup_true_lang-DKc6ugmr.js +0 -31
- package/dist/Button.vue_vue_type_script_setup_true_lang-3f0emVNU.js +0 -141
- package/dist/SelectField.vue_vue_type_script_setup_true_lang-SyFWE33A.js +0 -422
- package/dist/dialogStack-DiTG1rZc.js +0 -26
- package/dist/phone/CountryFlag.vue.d.ts +0 -10
- /package/dist/{phone → internal}/flagLoaders.d.ts +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComputedRef } from "vue";
|
|
2
|
+
import type { Column } from "./columns";
|
|
3
|
+
/**
|
|
4
|
+
* How a list lays out its rows: below 1024 px (`narrow`), and when any column has a `mobile` role
|
|
5
|
+
* other than `hidden`, the rows are phone rows (`phone`); otherwise it stays a table at every width.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useRowLayout(columns: () => readonly Pick<Column<never>, "mobile">[]): {
|
|
8
|
+
narrow: ComputedRef<boolean>;
|
|
9
|
+
phone: ComputedRef<boolean>;
|
|
10
|
+
};
|
|
@@ -11,17 +11,20 @@ export type CellSlots<Row, Col extends Column<Row>> = {
|
|
|
11
11
|
to: RouteLocationRaw | null;
|
|
12
12
|
}) => unknown;
|
|
13
13
|
};
|
|
14
|
-
/**
|
|
15
|
-
export type
|
|
14
|
+
/** The slots of the rows themselves: what `DataTable` and, with the page's own, `CollectionTable` offer. */
|
|
15
|
+
export type RowsSlots<Row, Col extends Column<Row>> = CellSlots<Row, Col> & {
|
|
16
16
|
/** A mark that leads the record's identity (an avatar, a tile). Phone rows show it across both lines. */
|
|
17
17
|
leading?: (scope: {
|
|
18
18
|
item: Row;
|
|
19
19
|
compact: boolean;
|
|
20
20
|
}) => unknown;
|
|
21
|
-
/** Replaces the desktop actions cell (the link to the record and the More button). */
|
|
21
|
+
/** Replaces the desktop actions cell (the link to the record and the More button): a `RowActions` row of buttons. */
|
|
22
22
|
actions?: (scope: {
|
|
23
23
|
item: Row;
|
|
24
24
|
}) => unknown;
|
|
25
|
+
};
|
|
26
|
+
/** Every slot of a collection table, and so of `ListPage`, which forwards them. */
|
|
27
|
+
export type CollectionSlots<Row, Col extends Column<Row>> = RowsSlots<Row, Col> & {
|
|
25
28
|
/** Page controls in the toolbar, after the filters. */
|
|
26
29
|
toolbar?: () => unknown;
|
|
27
30
|
/** What an empty list shows when nothing exists yet (no search or filter applies): a first use that teaches. */
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useI18n as t } from "vue-i18n";
|
|
2
|
+
import { i } from "./error-Bb_dr_Ay.js";
|
|
3
|
+
function u({ t: r, te: s }) {
|
|
4
|
+
return (e, { fallback: o } = {}) => {
|
|
5
|
+
const c = o ?? r("core.errors.unexpected");
|
|
6
|
+
if (!i(e)) return c;
|
|
7
|
+
if (e.code) {
|
|
8
|
+
for (const n of [`errors.${e.code}`, `core.errors.${e.code}`])
|
|
9
|
+
if (s(n)) return r(n, { ...e.params });
|
|
10
|
+
if (e.message) return e.message;
|
|
11
|
+
}
|
|
12
|
+
switch (e.kind) {
|
|
13
|
+
case "unauthorized":
|
|
14
|
+
return r("core.errors.unauthenticated");
|
|
15
|
+
case "forbidden":
|
|
16
|
+
return r("core.errors.forbidden");
|
|
17
|
+
case "notFound":
|
|
18
|
+
return r("core.errors.not_found");
|
|
19
|
+
case "conflict":
|
|
20
|
+
return r("core.errors.conflict");
|
|
21
|
+
case "network":
|
|
22
|
+
return r("core.errors.offline");
|
|
23
|
+
case "aborted":
|
|
24
|
+
return r("core.errors.cancelled");
|
|
25
|
+
case "server":
|
|
26
|
+
case "malformed":
|
|
27
|
+
return c;
|
|
28
|
+
case "validation":
|
|
29
|
+
if (Object.keys(e.fields).length > 0) return r("core.errors.check_fields");
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
return e.status === 429 ? r("core.errors.rate_limited") : o ?? (e.message || r("core.errors.unexpected"));
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function f() {
|
|
36
|
+
const { t: r, te: s } = t();
|
|
37
|
+
return u({ t: (e, o) => r(e, o ?? {}), te: (e) => s(e) });
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
f as u
|
|
41
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { computed as c, onUnmounted as d, shallowRef as f } from "vue";
|
|
2
|
+
import { p as v } from "./perDocument-DUuFrdGU.js";
|
|
3
|
+
const y = "data-dialog-inert-skip", i = "overflow-hidden", m = Symbol("vue-core:dialog-stack"), a = () => v(m, () => ({ entries: f([]), inertedByUs: /* @__PURE__ */ new Set(), lockedByUs: !1 }));
|
|
4
|
+
function r(e) {
|
|
5
|
+
const n = e.entries.value[e.entries.value.length - 1]?.root() ?? null;
|
|
6
|
+
for (const t of Array.from(document.body.children)) {
|
|
7
|
+
if (!(t instanceof HTMLElement)) continue;
|
|
8
|
+
const s = n !== null && !t.hasAttribute(y) && !t.contains(n);
|
|
9
|
+
s && !t.inert ? (t.inert = !0, e.inertedByUs.add(t)) : !s && e.inertedByUs.has(t) && (t.inert = !1, e.inertedByUs.delete(t));
|
|
10
|
+
}
|
|
11
|
+
const o = e.entries.value.length > 0;
|
|
12
|
+
o && !document.body.classList.contains(i) ? (document.body.classList.add(i), e.lockedByUs = !0) : !o && e.lockedByUs && (document.body.classList.remove(i), e.lockedByUs = !1);
|
|
13
|
+
}
|
|
14
|
+
function B(e) {
|
|
15
|
+
const n = a(), o = { root: () => e.value }, t = c(() => n.entries.value[n.entries.value.length - 1] === o), s = () => {
|
|
16
|
+
n.entries.value.includes(o) || (n.entries.value = [...n.entries.value, o]), r(n);
|
|
17
|
+
}, l = () => {
|
|
18
|
+
n.entries.value.includes(o) && (n.entries.value = n.entries.value.filter((u) => u !== o), r(n));
|
|
19
|
+
};
|
|
20
|
+
return d(l), { isTop: t, activate: s, deactivate: l };
|
|
21
|
+
}
|
|
22
|
+
function S() {
|
|
23
|
+
const e = a();
|
|
24
|
+
return c(() => e.entries.value.length);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
y as I,
|
|
28
|
+
i as S,
|
|
29
|
+
B as a,
|
|
30
|
+
S as u
|
|
31
|
+
};
|
|
@@ -8,9 +8,13 @@ import type { Form } from "./useForm";
|
|
|
8
8
|
* <CommandDialog :command="assign" :title="t('assign')" :confirm-label="t('assign')" :done-label="t('assigned')">
|
|
9
9
|
* <FormGroup><ComboField v-bind="assign.form.bind('assignee')" :label="t('assignee')" :search="findUsers" /></FormGroup>
|
|
10
10
|
* </CommandDialog>
|
|
11
|
+
*
|
|
12
|
+
* Another action beside the primary one goes in `#actions`; `run({ addAnother: true })` saves like the primary action and then,
|
|
13
|
+
* instead of closing, opens the dialog again with fresh inputs (the command's defaults), so the next record can be entered
|
|
14
|
+
* (the add-a-record recipe, `docs/recipes/forms.md`).
|
|
11
15
|
*/
|
|
12
16
|
type __VLS_Props = {
|
|
13
|
-
command: Pick<Command<object, unknown, unknown>, "open" | "run" | "dismiss"> & {
|
|
17
|
+
command: Pick<Command<object, unknown, unknown>, "open" | "run" | "dismiss" | "present"> & {
|
|
14
18
|
readonly form: Pick<Form<object>, "dirty" | "submitting" | "failure" | "errors">;
|
|
15
19
|
};
|
|
16
20
|
title: string;
|
|
@@ -29,6 +33,13 @@ type __VLS_Props = {
|
|
|
29
33
|
};
|
|
30
34
|
type __VLS_Slots = {
|
|
31
35
|
default?: () => unknown;
|
|
36
|
+
/** More actions in the footer, beside Cancel and the primary one. */
|
|
37
|
+
actions?: (scope: {
|
|
38
|
+
run: (options?: {
|
|
39
|
+
addAnother?: boolean;
|
|
40
|
+
}) => Promise<void>;
|
|
41
|
+
busy: boolean;
|
|
42
|
+
}) => unknown;
|
|
32
43
|
};
|
|
33
44
|
declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
34
45
|
done: () => any;
|
|
@@ -44,8 +44,8 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}
|
|
|
44
44
|
footer: string;
|
|
45
45
|
header: string;
|
|
46
46
|
section: boolean;
|
|
47
|
-
anchor: string;
|
|
48
47
|
group: string;
|
|
48
|
+
anchor: string;
|
|
49
49
|
editable: boolean;
|
|
50
50
|
hideEmpty: boolean;
|
|
51
51
|
labelWidth: string;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { type FieldProps } from "./field";
|
|
2
2
|
import type { SelectOption } from "./options";
|
|
3
|
+
import { type OptionsSource } from "./useOptions";
|
|
3
4
|
declare const _default: <Value extends string | number>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
4
5
|
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
5
6
|
readonly "onUpdate:modelValue"?: ((value: Value[]) => any) | undefined;
|
|
6
7
|
} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onUpdate:modelValue"> & (FieldProps & {
|
|
7
|
-
options:
|
|
8
|
+
options: OptionsSource<Value>;
|
|
9
|
+
/** The options of the current values when the caller already has them (a saved record's equipment): their labels show before the options arrive, or when they do not contain them. */
|
|
10
|
+
selected?: readonly SelectOption<Value>[];
|
|
8
11
|
placeholder?: string;
|
|
9
12
|
searchFrom?: number;
|
|
10
13
|
} & {
|
|
@@ -7,6 +7,9 @@ import { type FieldProps } from "./field";
|
|
|
7
7
|
* <NumberField v-bind="form.bind('quantity')" :label="t('quantity')" suffix="pcs" />
|
|
8
8
|
* <NumberField v-bind="form.bind('weight')" :decimals="2" suffix="kg" />
|
|
9
9
|
*
|
|
10
|
+
* `:grouping="false"` writes no thousands separator, shown or typed (a year 2024, a coordinate 45.815123), and then a "."
|
|
11
|
+
* is always a decimal mark, never a group mark.
|
|
12
|
+
*
|
|
10
13
|
* Typing "1,5" mid-edit is never rewritten under the cursor: the text is the user's until the field loses focus.
|
|
11
14
|
* Limits (`min`, `max`) are the validator's job; the field only keeps what cannot be a number out.
|
|
12
15
|
*/
|
|
@@ -14,6 +17,8 @@ type __VLS_Props = FieldProps & {
|
|
|
14
17
|
decimals?: number;
|
|
15
18
|
/** Allows a leading minus sign. */
|
|
16
19
|
negative?: boolean;
|
|
20
|
+
/** Separates thousands ("1.234.567"); off for years, coordinates and codes. */
|
|
21
|
+
grouping?: boolean;
|
|
17
22
|
placeholder?: string;
|
|
18
23
|
prefix?: string;
|
|
19
24
|
suffix?: string;
|
|
@@ -45,5 +50,6 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
|
45
50
|
suffix: string;
|
|
46
51
|
decimals: number;
|
|
47
52
|
negative: boolean;
|
|
53
|
+
grouping: boolean;
|
|
48
54
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
49
55
|
export default _default;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type SelectOption } from "./options";
|
|
2
|
+
import type { SuggestionStatus } from "./suggestions";
|
|
2
3
|
declare const _default: <Value extends string | number>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
3
4
|
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
4
5
|
readonly onSelect?: ((value: Value | null) => any) | undefined;
|
|
5
|
-
|
|
6
|
+
readonly onRetry?: (() => any) | undefined;
|
|
7
|
+
} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onSelect" | "onRetry"> & {
|
|
6
8
|
options: readonly SelectOption<Value>[];
|
|
7
9
|
/** The chosen value, or the chosen values when `multiple`. */
|
|
8
10
|
modelValue?: Value | null | readonly Value[];
|
|
@@ -13,11 +15,13 @@ declare const _default: <Value extends string | number>(__VLS_props: NonNullable
|
|
|
13
15
|
noneLabel?: string;
|
|
14
16
|
/** `grouped` lists sit on the canvas of a sheet; `plain` in a popover. */
|
|
15
17
|
presentation?: "grouped" | "plain";
|
|
18
|
+
/** Where the options are in loading; anything but `loaded` and `idle` replaces the rows with a line saying so. */
|
|
19
|
+
status?: SuggestionStatus;
|
|
16
20
|
} & Partial<{}>> & import("vue").PublicProps;
|
|
17
21
|
expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
|
|
18
22
|
attrs: any;
|
|
19
23
|
slots: {};
|
|
20
|
-
emit: (evt: "select", value: Value | null) => void;
|
|
24
|
+
emit: ((evt: "select", value: Value | null) => void) & ((evt: "retry") => void);
|
|
21
25
|
}>) => import("vue").VNode & {
|
|
22
26
|
__ctx?: Awaited<typeof __VLS_setup>;
|
|
23
27
|
};
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { type FieldProps } from "./field";
|
|
2
2
|
import type { SelectOption } from "./options";
|
|
3
|
+
import { type OptionsSource } from "./useOptions";
|
|
3
4
|
declare const _default: <Value extends string | number>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
4
5
|
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
5
6
|
readonly "onUpdate:modelValue"?: ((value: Value | null) => any) | undefined;
|
|
6
7
|
} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onUpdate:modelValue"> & (FieldProps & {
|
|
7
|
-
options:
|
|
8
|
+
options: OptionsSource<Value>;
|
|
9
|
+
/** The option of the current value when the caller already has it (a saved record's model): its label shows before the options arrive, or when they do not contain it. */
|
|
10
|
+
selected?: SelectOption<Value> | null;
|
|
8
11
|
placeholder?: string;
|
|
9
12
|
clearable?: boolean;
|
|
10
13
|
/** Shows the search box from this many options. */
|
package/dist/form/index.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ export { groupOptions, matchOptions } from "./options";
|
|
|
42
42
|
export { recentChoicesKey } from "./suggestions";
|
|
43
43
|
export type { RecentChoices, SuggestionSource, TextSuggestion } from "./suggestions";
|
|
44
44
|
export type { OptionGroup, SelectOption } from "./options";
|
|
45
|
+
export { useOptions } from "./useOptions";
|
|
46
|
+
export type { AsyncOptions, OptionsContext, OptionsSource } from "./useOptions";
|
|
45
47
|
export { default as OtpInput } from "./OtpInput.vue";
|
|
46
48
|
export { default as PhotoField } from "./PhotoField.vue";
|
|
47
49
|
export { default as SegmentedField } from "./SegmentedField.vue";
|