@xleddyl/443-components-vue 0.2.3 → 0.4.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 +106 -19
- package/dist/chart/BarChart.vue.d.ts +2 -2
- package/dist/chart/ChartLegend.vue.d.ts +4 -4
- package/dist/chart/ChartPanel.vue.d.ts +2 -2
- package/dist/chart/ChartSummary.vue.d.ts +2 -2
- package/dist/chart/DoughnutChart.vue.d.ts +2 -2
- package/dist/chart/LineChart.vue.d.ts +2 -2
- package/dist/components/core/Button.vue.d.ts +2 -2
- package/dist/components/core/FieldBoundary.vue +14 -0
- package/dist/components/core/FieldBoundary.vue.d.ts +15 -0
- package/dist/components/core/FieldMessage.vue +28 -0
- package/dist/components/core/FieldMessage.vue.d.ts +409 -0
- package/dist/components/core/Form.vue +109 -11
- package/dist/components/core/Form.vue.d.ts +45 -6
- package/dist/components/core/FormAlerts.vue +30 -0
- package/dist/components/core/FormAlerts.vue.d.ts +393 -0
- package/dist/components/core/FormField.vue +54 -17
- package/dist/components/core/FormField.vue.d.ts +5 -4
- package/dist/components/core/Icon.vue.d.ts +2 -2
- package/dist/components/core/Input.vue.d.ts +4 -4
- package/dist/components/core/Kbd.vue.d.ts +2 -2
- package/dist/components/core/Root.vue.d.ts +6 -6
- package/dist/components/core/Spinner.vue +13 -1
- package/dist/components/core/Spinner.vue.d.ts +4 -2
- package/dist/components/core/Textarea.vue.d.ts +4 -4
- package/dist/components/core/VisuallyHidden.vue.d.ts +6 -6
- package/dist/components/core/index.d.ts +3 -0
- package/dist/components/core/index.mjs +3 -0
- package/dist/components/data/Avatar.vue.d.ts +2 -2
- package/dist/components/data/AvatarGroup.vue.d.ts +2 -2
- package/dist/components/data/Badge.vue.d.ts +2 -2
- package/dist/components/data/DescriptionList.vue.d.ts +2 -2
- package/dist/components/data/FilterPill.vue +35 -0
- package/dist/components/data/FilterPill.vue.d.ts +445 -0
- package/dist/components/data/FilterPills.vue +100 -27
- package/dist/components/data/FilterPills.vue.d.ts +47 -411
- package/dist/components/data/Pagination.vue.d.ts +4 -4
- package/dist/components/data/SelectionBar.vue +81 -0
- package/dist/components/data/SelectionBar.vue.d.ts +427 -0
- package/dist/components/data/Stat.vue.d.ts +8 -8
- package/dist/components/data/Tag.vue.d.ts +4 -4
- package/dist/components/data/Timeline.vue.d.ts +2 -2
- package/dist/components/data/Tree.vue +245 -21
- package/dist/components/data/Tree.vue.d.ts +40 -10
- package/dist/components/data/index.d.ts +3 -0
- package/dist/components/data/index.mjs +3 -0
- package/dist/components/data/types.d.ts +26 -2
- package/dist/components/feedback/Alert.vue.d.ts +18 -18
- package/dist/components/feedback/EmptyState.vue.d.ts +2 -2
- package/dist/components/feedback/LoadingOverlay.vue.d.ts +2 -2
- package/dist/components/feedback/Meter.vue.d.ts +2 -2
- package/dist/components/feedback/Progress.vue.d.ts +2 -2
- package/dist/components/feedback/ProgressRing.vue.d.ts +2 -2
- package/dist/components/feedback/Skeleton.vue.d.ts +3 -3
- package/dist/components/forms/Calendar.vue.d.ts +4 -4
- package/dist/components/forms/CheckboxGroup.vue +2 -1
- package/dist/components/forms/ColorInput.vue.d.ts +6 -6
- package/dist/components/forms/DateInput.vue.d.ts +14 -14
- package/dist/components/forms/DatePicker.vue.d.ts +6 -6
- package/dist/components/forms/FileInput.vue +160 -34
- package/dist/components/forms/FileInput.vue.d.ts +43 -15
- package/dist/components/forms/InputAddon.vue.d.ts +2 -2
- package/dist/components/forms/InputGroup.vue.d.ts +2 -2
- package/dist/components/forms/NumberInput.vue.d.ts +6 -6
- package/dist/components/forms/PasswordInput.vue.d.ts +16 -16
- package/dist/components/forms/PinInput.vue.d.ts +6 -6
- package/dist/components/forms/Radio.vue.d.ts +2 -2
- package/dist/components/forms/RadioGroup.vue +2 -1
- package/dist/components/forms/SegmentedControl.vue +33 -8
- package/dist/components/forms/SegmentedControl.vue.d.ts +15 -7
- package/dist/components/forms/Slider.vue.d.ts +6 -6
- package/dist/components/forms/Switch.vue.d.ts +6 -6
- package/dist/components/forms/TimeInput.vue.d.ts +16 -16
- package/dist/components/forms/types.d.ts +17 -0
- package/dist/components/layout/Accordion.vue +25 -5
- package/dist/components/layout/Accordion.vue.d.ts +11 -8
- package/dist/components/layout/AppShell.vue +1 -1
- package/dist/components/layout/AppShell.vue.d.ts +7 -7
- package/dist/components/layout/Breadcrumbs.vue +28 -20
- package/dist/components/layout/Breadcrumbs.vue.d.ts +18 -3
- package/dist/components/layout/Card.vue +22 -3
- package/dist/components/layout/Card.vue.d.ts +10 -4
- package/dist/components/layout/CopyButton.vue.d.ts +4 -4
- package/dist/components/layout/Grid.vue.d.ts +2 -2
- package/dist/components/layout/NavLink.vue.d.ts +8 -8
- package/dist/components/layout/PageHeader.vue +10 -1
- package/dist/components/layout/PageHeader.vue.d.ts +17 -9
- package/dist/components/layout/Separator.vue.d.ts +2 -2
- package/dist/components/layout/Sidebar.vue.d.ts +2 -2
- package/dist/components/layout/SidebarSection.vue.d.ts +2 -2
- package/dist/components/layout/Stack.vue.d.ts +6 -6
- package/dist/components/layout/Tabs.vue +37 -7
- package/dist/components/layout/Tabs.vue.d.ts +11 -4
- package/dist/components/layout/ThemeSwitch.vue.d.ts +2 -2
- package/dist/components/layout/Toolbar.vue.d.ts +2 -2
- package/dist/components/layout/types.d.ts +8 -1
- package/dist/components/overlays/CommandPalette.vue +35 -8
- package/dist/components/overlays/CommandPalette.vue.d.ts +273 -497
- package/dist/components/overlays/ConfirmDialog.vue.d.ts +8 -6
- package/dist/components/overlays/ConfirmHost.vue +5 -1
- package/dist/components/overlays/ConfirmHost.vue.d.ts +10 -8
- package/dist/components/overlays/ContextMenu.vue.d.ts +4 -4
- package/dist/components/overlays/Drawer.vue +4 -2
- package/dist/components/overlays/Drawer.vue.d.ts +8 -6
- package/dist/components/overlays/DropdownMenu.vue.d.ts +2 -2
- package/dist/components/overlays/HoverCard.vue +2 -1
- package/dist/components/overlays/HoverCard.vue.d.ts +8 -8
- package/dist/components/overlays/Modal.vue +5 -3
- package/dist/components/overlays/Modal.vue.d.ts +8 -6
- package/dist/components/overlays/Popover.vue +2 -1
- package/dist/components/overlays/Popover.vue.d.ts +8 -8
- package/dist/components/overlays/Toaster.vue.d.ts +4 -4
- package/dist/components/overlays/Tooltip.vue.d.ts +2 -2
- package/dist/components/overlays/types.d.ts +11 -5
- package/dist/components/templates/AccountMenu.vue.d.ts +6 -6
- package/dist/components/templates/AppearanceSettings.vue.d.ts +2 -2
- package/dist/components/templates/AuthLayout.vue.d.ts +2 -2
- package/dist/components/templates/Brand.vue +34 -5
- package/dist/components/templates/Brand.vue.d.ts +20 -15
- package/dist/components/templates/DashboardLayout.vue +49 -10
- package/dist/components/templates/DashboardLayout.vue.d.ts +332 -553
- package/dist/components/templates/DashboardPage.vue.d.ts +2 -2
- package/dist/components/templates/DetailPage.vue.d.ts +4 -4
- package/dist/components/templates/EmptyPage.vue.d.ts +2 -2
- package/dist/components/templates/ErrorPage.vue.d.ts +2 -2
- package/dist/components/templates/ListPage.vue +17 -11
- package/dist/components/templates/ListPage.vue.d.ts +3 -3
- package/dist/components/templates/NotFoundPage.vue.d.ts +1 -1
- package/dist/components/templates/SaveBar.vue.d.ts +4 -4
- package/dist/components/templates/SettingsGroup.vue.d.ts +2 -2
- package/dist/components/templates/SettingsModal.vue +5 -2
- package/dist/components/templates/SettingsModal.vue.d.ts +13 -8
- package/dist/components/templates/SettingsPage.vue.d.ts +4 -4
- package/dist/components/templates/SettingsSection.vue.d.ts +12 -8
- package/dist/components/templates/types.d.ts +25 -2
- package/dist/composables/core.d.ts +1 -0
- package/dist/composables/core.mjs +1 -0
- package/dist/composables/useField.d.ts +8 -1
- package/dist/composables/useField.mjs +41 -10
- package/dist/composables/useFieldBoundary.d.ts +2 -0
- package/dist/composables/useFieldBoundary.mjs +9 -0
- package/dist/composables/useFileDrop.d.ts +20 -0
- package/dist/composables/useFileDrop.mjs +115 -7
- package/dist/composables/useForm.d.ts +36 -19
- package/dist/composables/useForm.mjs +258 -51
- package/dist/editor/RichTextEditor.vue +32 -4
- package/dist/editor/RichTextEditor.vue.d.ts +11 -6
- package/dist/editor/rich-text-editor.css +1 -1
- package/dist/editor/types.d.ts +3 -0
- package/dist/grid/GridToolbar.vue.d.ts +4 -4
- package/dist/grid/cells/BadgeCell.vue.d.ts +2 -2
- package/dist/grid/cells/BooleanCell.vue.d.ts +2 -2
- package/dist/grid/cells/DateCell.vue.d.ts +2 -2
- package/dist/grid/cells/ImageCell.vue.d.ts +2 -2
- package/dist/grid/cells/LinkCell.vue.d.ts +2 -2
- package/dist/internal/core/ButtonElement.d.ts +2 -0
- package/dist/internal/core/ButtonElement.mjs +8 -0
- package/dist/internal/data/tree.d.ts +8 -0
- package/dist/internal/data/tree.mjs +41 -0
- package/dist/internal/forms/files.d.ts +9 -0
- package/dist/internal/forms/files.mjs +32 -1
- package/dist/internal/forms/standard-schema.d.ts +17 -0
- package/dist/internal/forms/standard-schema.mjs +40 -0
- package/dist/internal/keys.d.ts +2 -1
- package/dist/internal/keys.mjs +1 -0
- package/dist/internal/overlays/DialogFrame.vue +17 -7
- package/dist/internal/overlays/DialogFrame.vue.d.ts +9 -5
- package/dist/internal/overlays/MenuList.vue +2 -0
- package/dist/internal/overlays/MenuList.vue.d.ts +5 -5
- package/dist/internal/overlays/OverlayView.vue +2 -0
- package/dist/internal/overlays/OverlayView.vue.d.ts +14 -12
- package/dist/internal/overlays/dialog.d.ts +4 -1
- package/dist/internal/overlays/dialog.mjs +39 -5
- package/dist/internal/overlays/stack.d.ts +2 -1
- package/dist/locale/en.mjs +19 -2
- package/dist/locale/it.mjs +19 -2
- package/dist/locale/types.d.ts +17 -0
- package/dist/nuxt/module.d.ts +1 -0
- package/dist/nuxt/module.mjs +6 -3
- package/dist/nuxt/runtime/layouts/auth.vue.d.ts +8 -8
- package/dist/nuxt/runtime/layouts/dashboard.vue.d.ts +8 -8
- package/dist/styles/base.css +2 -0
- package/dist/styles/core/button.css +1 -13
- package/dist/styles/core/field-message.css +34 -0
- package/dist/styles/core/form-field.css +0 -23
- package/dist/styles/core/form.css +11 -0
- package/dist/styles/core/kbd.css +2 -2
- package/dist/styles/core/spinner.css +19 -0
- package/dist/styles/core.css +1 -0
- package/dist/styles/data/avatar.css +1 -1
- package/dist/styles/data/badge.css +1 -1
- package/dist/styles/data/filter-pills.css +40 -4
- package/dist/styles/data/pagination.css +0 -1
- package/dist/styles/data/selection-bar.css +89 -0
- package/dist/styles/data/stat.css +1 -6
- package/dist/styles/data/table.css +1 -3
- package/dist/styles/data/tag.css +1 -4
- package/dist/styles/data/tree.css +163 -2
- package/dist/styles/data.css +1 -0
- package/dist/styles/feedback/alert.css +0 -1
- package/dist/styles/feedback/empty-state.css +0 -1
- package/dist/styles/forms/calendar.css +1 -1
- package/dist/styles/forms/color-input.css +1 -1
- package/dist/styles/forms/combobox.css +0 -1
- package/dist/styles/forms/date-picker.css +1 -1
- package/dist/styles/forms/file-input.css +17 -1
- package/dist/styles/forms/number-input.css +1 -1
- package/dist/styles/forms/password-input.css +1 -5
- package/dist/styles/forms/segmented.css +8 -0
- package/dist/styles/forms/select.css +1 -1
- package/dist/styles/forms/slider.css +2 -2
- package/dist/styles/forms/switch.css +0 -1
- package/dist/styles/layout/accordion.css +22 -1
- package/dist/styles/layout/app-shell.css +4 -0
- package/dist/styles/layout/breadcrumbs.css +16 -1
- package/dist/styles/layout/card.css +20 -6
- package/dist/styles/layout/copy-button.css +2 -2
- package/dist/styles/layout/nav-link.css +2 -3
- package/dist/styles/layout/sidebar-nav.css +1 -1
- package/dist/styles/layout/sidebar.css +2 -2
- package/dist/styles/layout/tabs.css +65 -3
- package/dist/styles/layout/theme-switch.css +1 -3
- package/dist/styles/overlays/command.css +21 -3
- package/dist/styles/overlays/confirm.css +0 -1
- package/dist/styles/overlays/menu.css +3 -5
- package/dist/styles/overlays/modal.css +38 -0
- package/dist/styles/overlays/toast.css +0 -1
- package/dist/styles/templates/auth-layout.css +0 -1
- package/dist/styles/templates/brand.css +15 -0
- package/dist/styles/templates/empty-page.css +4 -4
- package/dist/styles/templates/form-page.css +1 -1
- package/dist/styles/templates/list-page.css +2 -6
- package/dist/styles/templates/page.css +1 -1
- package/dist/styles/templates/settings-modal.css +2 -3
- package/dist/styles/tokens.css +1 -1
- package/package.json +1 -1
|
@@ -1,25 +1,56 @@
|
|
|
1
|
-
import { computed, inject, toValue } from "vue";
|
|
2
|
-
import { FIELD_KEY } from "../internal/keys.mjs";
|
|
1
|
+
import { computed, getCurrentScope, inject, onScopeDispose, toValue, watch } from "vue";
|
|
2
|
+
import { FIELD_KEY, FIELD_ROLE_KEY } from "../internal/keys.mjs";
|
|
3
3
|
export function useField() {
|
|
4
4
|
return inject(FIELD_KEY, null);
|
|
5
5
|
}
|
|
6
6
|
export function useFieldControl(options = {}) {
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
7
|
+
const parent = useField();
|
|
8
|
+
const inheritedRole = inject(FIELD_ROLE_KEY, "primary");
|
|
9
|
+
const auxiliary = computed(() => (toValue(options.role) ?? inheritedRole) === "auxiliary");
|
|
10
|
+
const field = computed(() => auxiliary.value ? null : parent);
|
|
11
|
+
const id = computed(() => toValue(options.id) ?? field.value?.id);
|
|
12
|
+
const invalid = computed(() => Boolean(toValue(options.invalid) ?? field.value?.invalid.value));
|
|
13
|
+
const required = computed(
|
|
14
|
+
() => Boolean(toValue(options.required) || field.value?.required.value)
|
|
15
|
+
);
|
|
16
|
+
const disabled = computed(() => Boolean(toValue(options.disabled) || parent?.disabled.value));
|
|
12
17
|
const describedBy = computed(() => {
|
|
13
|
-
const ids = [toValue(options.describedBy), field?.describedBy.value].filter(Boolean);
|
|
18
|
+
const ids = [toValue(options.describedBy), field.value?.describedBy.value].filter(Boolean);
|
|
14
19
|
return ids.length ? ids.join(" ") : void 0;
|
|
15
20
|
});
|
|
16
21
|
const attrs = computed(() => ({
|
|
17
22
|
id: id.value,
|
|
18
|
-
name: field?.name.value,
|
|
23
|
+
name: field.value?.name.value,
|
|
19
24
|
"aria-invalid": invalid.value ? "true" : void 0,
|
|
20
25
|
"aria-describedby": describedBy.value,
|
|
21
26
|
"aria-required": required.value ? "true" : void 0,
|
|
22
27
|
disabled: disabled.value || void 0
|
|
23
28
|
}));
|
|
24
|
-
|
|
29
|
+
const source = {};
|
|
30
|
+
const setControlError = (message) => parent?.setControlError(message || void 0, source);
|
|
31
|
+
if (parent && getCurrentScope()) {
|
|
32
|
+
if (parent.setLabelable && options.labelable !== void 0)
|
|
33
|
+
watch(
|
|
34
|
+
() => auxiliary.value ? void 0 : toValue(options.labelable),
|
|
35
|
+
(labelable) => parent.setLabelable?.(labelable, source),
|
|
36
|
+
{ immediate: true }
|
|
37
|
+
);
|
|
38
|
+
onScopeDispose(() => {
|
|
39
|
+
parent.setControlError(void 0, source);
|
|
40
|
+
parent.setLabelable?.(void 0, source);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
get field() {
|
|
45
|
+
return field.value;
|
|
46
|
+
},
|
|
47
|
+
id,
|
|
48
|
+
invalid,
|
|
49
|
+
required,
|
|
50
|
+
disabled,
|
|
51
|
+
describedBy,
|
|
52
|
+
attrs,
|
|
53
|
+
auxiliary,
|
|
54
|
+
setControlError
|
|
55
|
+
};
|
|
25
56
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { provide } from "vue";
|
|
2
|
+
import { FIELD_KEY, FIELD_ROLE_KEY } from "../internal/keys.mjs";
|
|
3
|
+
export function provideFieldBoundary() {
|
|
4
|
+
provide(FIELD_KEY, null);
|
|
5
|
+
provide(FIELD_ROLE_KEY, "primary");
|
|
6
|
+
}
|
|
7
|
+
export function provideAuxiliaryControls() {
|
|
8
|
+
provide(FIELD_ROLE_KEY, "auxiliary");
|
|
9
|
+
}
|
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
import type { MaybeRefOrGetter } from 'vue';
|
|
2
2
|
export interface UseFileDropOptions {
|
|
3
3
|
disabled?: MaybeRefOrGetter<boolean | undefined>;
|
|
4
|
+
ignore?: (event: DragEvent) => boolean;
|
|
4
5
|
onDrop: (files: File[], event: DragEvent) => void;
|
|
5
6
|
}
|
|
7
|
+
export interface DroppedFile {
|
|
8
|
+
file: File;
|
|
9
|
+
path: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DroppedTree {
|
|
12
|
+
files: DroppedFile[];
|
|
13
|
+
directories: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface ReadDroppedFilesOptions {
|
|
16
|
+
directories?: boolean;
|
|
17
|
+
skipHidden?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function readDroppedFiles(transfer: DataTransfer | null | undefined, options: ReadDroppedFilesOptions & {
|
|
20
|
+
directories: true;
|
|
21
|
+
}): Promise<DroppedTree>;
|
|
22
|
+
export declare function readDroppedFiles(transfer: DataTransfer | null | undefined, options?: ReadDroppedFilesOptions & {
|
|
23
|
+
directories?: false;
|
|
24
|
+
}): Promise<DroppedFile[]>;
|
|
6
25
|
export declare function useFileDrop(target: MaybeRefOrGetter<HTMLElement | null | undefined>, options: UseFileDropOptions): {
|
|
7
26
|
over: import("vue").Ref<boolean, boolean>;
|
|
27
|
+
reset: () => void;
|
|
8
28
|
};
|
|
@@ -1,35 +1,142 @@
|
|
|
1
1
|
import { onScopeDispose, ref, toValue, watch } from "vue";
|
|
2
|
+
import { filesTree, isHiddenName } from "../internal/forms/files.mjs";
|
|
3
|
+
const claimedEvents = /* @__PURE__ */ new WeakSet();
|
|
2
4
|
function carriesFiles(event) {
|
|
3
5
|
return Array.from(event.dataTransfer?.types ?? []).includes("Files");
|
|
4
6
|
}
|
|
7
|
+
function readFileEntry(entry) {
|
|
8
|
+
return new Promise((resolve, reject) => entry.file(resolve, reject));
|
|
9
|
+
}
|
|
10
|
+
function readDirectoryBatch(reader) {
|
|
11
|
+
return new Promise((resolve, reject) => reader.readEntries(resolve, reject));
|
|
12
|
+
}
|
|
13
|
+
async function walkEntry(entry, prefix, tree, skipHidden) {
|
|
14
|
+
if (skipHidden && isHiddenName(entry.name)) return;
|
|
15
|
+
const path = `${prefix}${entry.name}`;
|
|
16
|
+
if (entry.isFile) {
|
|
17
|
+
try {
|
|
18
|
+
const file = await readFileEntry(entry);
|
|
19
|
+
tree.files.push({ file, path });
|
|
20
|
+
} catch {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!entry.isDirectory) return;
|
|
26
|
+
tree.directories.push(path);
|
|
27
|
+
const reader = entry.createReader();
|
|
28
|
+
const children = [];
|
|
29
|
+
for (; ; ) {
|
|
30
|
+
let batch;
|
|
31
|
+
try {
|
|
32
|
+
batch = await readDirectoryBatch(reader);
|
|
33
|
+
} catch {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
if (!batch.length) break;
|
|
37
|
+
children.push(...batch);
|
|
38
|
+
}
|
|
39
|
+
for (const child of children) await walkEntry(child, `${path}/`, tree, skipHidden);
|
|
40
|
+
}
|
|
41
|
+
async function readDroppedTree(transfer, skipHidden) {
|
|
42
|
+
if (!transfer) return { files: [], directories: [] };
|
|
43
|
+
const pending = [];
|
|
44
|
+
for (const item of Array.from(transfer.items ?? [])) {
|
|
45
|
+
if (item.kind !== "file") continue;
|
|
46
|
+
const entry = typeof item.webkitGetAsEntry === "function" ? item.webkitGetAsEntry() : null;
|
|
47
|
+
const fallback = entry ? null : item.getAsFile();
|
|
48
|
+
if (entry) pending.push(entry);
|
|
49
|
+
else if (fallback) pending.push(fallback);
|
|
50
|
+
}
|
|
51
|
+
if (!pending.length) return filesTree(Array.from(transfer.files ?? []), { skipHidden });
|
|
52
|
+
const tree = { files: [], directories: [] };
|
|
53
|
+
for (const entry of pending) {
|
|
54
|
+
if (!(entry instanceof File)) await walkEntry(entry, "", tree, skipHidden);
|
|
55
|
+
else if (!skipHidden || !isHiddenName(entry.name))
|
|
56
|
+
tree.files.push({ file: entry, path: entry.name });
|
|
57
|
+
}
|
|
58
|
+
return tree;
|
|
59
|
+
}
|
|
60
|
+
export async function readDroppedFiles(transfer, options = {}) {
|
|
61
|
+
const tree = await readDroppedTree(transfer, Boolean(options.skipHidden));
|
|
62
|
+
return options.directories ? tree : tree.files;
|
|
63
|
+
}
|
|
5
64
|
export function useFileDrop(target, options) {
|
|
6
65
|
const over = ref(false);
|
|
7
66
|
let depth = 0;
|
|
67
|
+
let covered = false;
|
|
68
|
+
let watching = false;
|
|
8
69
|
function isDisabled() {
|
|
9
70
|
return Boolean(toValue(options.disabled));
|
|
10
71
|
}
|
|
72
|
+
function isIgnored(event) {
|
|
73
|
+
return claimedEvents.has(event) || Boolean(options.ignore?.(event));
|
|
74
|
+
}
|
|
75
|
+
function sync() {
|
|
76
|
+
over.value = depth > 0 && !covered;
|
|
77
|
+
}
|
|
78
|
+
function watchWindow(enable) {
|
|
79
|
+
if (typeof window === "undefined" || watching === enable) return;
|
|
80
|
+
watching = enable;
|
|
81
|
+
const method = enable ? "addEventListener" : "removeEventListener";
|
|
82
|
+
window[method]("drop", reset, true);
|
|
83
|
+
window[method]("dragend", reset, true);
|
|
84
|
+
}
|
|
85
|
+
function reset() {
|
|
86
|
+
depth = 0;
|
|
87
|
+
covered = false;
|
|
88
|
+
over.value = false;
|
|
89
|
+
watchWindow(false);
|
|
90
|
+
}
|
|
91
|
+
function track(event) {
|
|
92
|
+
covered = isIgnored(event);
|
|
93
|
+
if (!covered) claimedEvents.add(event);
|
|
94
|
+
sync();
|
|
95
|
+
}
|
|
11
96
|
function onDragEnter(event) {
|
|
12
97
|
if (!carriesFiles(event) || isDisabled()) return;
|
|
13
|
-
event.preventDefault();
|
|
14
98
|
depth++;
|
|
15
|
-
|
|
99
|
+
watchWindow(true);
|
|
100
|
+
if (isIgnored(event)) {
|
|
101
|
+
covered = true;
|
|
102
|
+
sync();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
track(event);
|
|
16
107
|
}
|
|
17
108
|
function onDragOver(event) {
|
|
18
109
|
if (!carriesFiles(event)) return;
|
|
110
|
+
if (isDisabled()) {
|
|
111
|
+
if (!isIgnored(event)) {
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
if (event.dataTransfer) event.dataTransfer.dropEffect = "none";
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (isIgnored(event)) {
|
|
118
|
+
covered = true;
|
|
119
|
+
sync();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
19
122
|
event.preventDefault();
|
|
20
|
-
if (event.dataTransfer) event.dataTransfer.dropEffect =
|
|
123
|
+
if (event.dataTransfer) event.dataTransfer.dropEffect = "copy";
|
|
124
|
+
track(event);
|
|
21
125
|
}
|
|
22
126
|
function onDragLeave(event) {
|
|
23
127
|
if (!carriesFiles(event)) return;
|
|
24
128
|
depth = Math.max(0, depth - 1);
|
|
25
|
-
if (depth === 0)
|
|
129
|
+
if (depth === 0) reset();
|
|
130
|
+
else sync();
|
|
26
131
|
}
|
|
27
132
|
function onDropEvent(event) {
|
|
28
133
|
if (!carriesFiles(event)) return;
|
|
134
|
+
const ignored = isIgnored(event);
|
|
135
|
+
reset();
|
|
136
|
+
if (ignored) return;
|
|
29
137
|
event.preventDefault();
|
|
30
|
-
depth = 0;
|
|
31
|
-
over.value = false;
|
|
32
138
|
if (isDisabled()) return;
|
|
139
|
+
claimedEvents.add(event);
|
|
33
140
|
options.onDrop(Array.from(event.dataTransfer?.files ?? []), event);
|
|
34
141
|
}
|
|
35
142
|
const handlers = {
|
|
@@ -57,6 +164,7 @@ export function useFileDrop(target, options) {
|
|
|
57
164
|
onScopeDispose(() => {
|
|
58
165
|
stop();
|
|
59
166
|
bind(toValue(target), false);
|
|
167
|
+
watchWindow(false);
|
|
60
168
|
}, true);
|
|
61
|
-
return { over };
|
|
169
|
+
return { over, reset };
|
|
62
170
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { ComputedRef, Ref, UnwrapRef } from 'vue';
|
|
2
|
-
import type { StandardSchemaV1 } from '../internal/forms/standard-schema';
|
|
3
|
-
export type { StandardSchemaIssue, StandardSchemaResult, StandardSchemaV1, } from '../internal/forms/standard-schema';
|
|
1
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, UnwrapRef } from 'vue';
|
|
2
|
+
import type { IssueKeyResolver, StandardSchemaIssue, StandardSchemaV1 } from '../internal/forms/standard-schema';
|
|
3
|
+
export type { IssuePath as FormIssuePath, StandardSchemaIssue, StandardSchemaResult, StandardSchemaV1, } from '../internal/forms/standard-schema';
|
|
4
4
|
export type FieldValidationResult = string | undefined | null | boolean;
|
|
5
5
|
export interface FieldDefinition<T = unknown> {
|
|
6
|
-
initial
|
|
6
|
+
initial?: T | (() => T);
|
|
7
7
|
label?: string;
|
|
8
8
|
required?: boolean;
|
|
9
9
|
min?: number;
|
|
@@ -37,17 +37,29 @@ export interface FormMessages {
|
|
|
37
37
|
invalid: (context: FormMessageContext) => string;
|
|
38
38
|
}
|
|
39
39
|
export type FormValidationTrigger = 'submit' | 'blur' | 'input';
|
|
40
|
-
export
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
export type FormIssueKey = IssueKeyResolver;
|
|
41
|
+
export type FormMessageMap = Record<string, string | undefined>;
|
|
42
|
+
export type FormWarningsResult = Record<string, string | undefined> | ReadonlyArray<StandardSchemaIssue> | null | undefined;
|
|
43
|
+
export type FormWarningsFunction<V> = (values: V) => FormWarningsResult | Promise<FormWarningsResult>;
|
|
44
|
+
export type FormWarnings<V> = StandardSchemaV1 | Readonly<Ref<StandardSchemaV1 | undefined>> | FormWarningsFunction<V>;
|
|
45
|
+
export type FormPath<V> = (keyof V & string) | (string & {});
|
|
46
|
+
export interface UseFormOptions<S extends FormSchema = FormSchema, V extends object = FormValues<S>> {
|
|
47
|
+
schema?: S;
|
|
48
|
+
values?: MaybeRefOrGetter<V>;
|
|
49
|
+
validator?: MaybeRefOrGetter<StandardSchemaV1 | undefined>;
|
|
50
|
+
warnings?: FormWarnings<V>;
|
|
51
|
+
issueKey?: FormIssueKey;
|
|
43
52
|
messages?: Partial<FormMessages>;
|
|
44
53
|
validateOn?: FormValidationTrigger;
|
|
45
|
-
onSubmit?: (values:
|
|
54
|
+
onSubmit?: (values: V) => unknown;
|
|
46
55
|
onInvalid?: (errors: FormErrors<S>) => unknown;
|
|
47
56
|
}
|
|
48
|
-
export type FormErrors<S extends FormSchema> = Partial<Record<keyof S & string, string
|
|
57
|
+
export type FormErrors<S extends FormSchema = FormSchema> = Partial<Record<keyof S & string, string>> & FormMessageMap;
|
|
49
58
|
export interface FormContext {
|
|
50
|
-
errors: Readonly<
|
|
59
|
+
errors: Readonly<FormMessageMap>;
|
|
60
|
+
warnings?: Readonly<FormMessageMap>;
|
|
61
|
+
rootErrors?: Readonly<Ref<readonly string[]>>;
|
|
62
|
+
rootWarnings?: Readonly<Ref<readonly string[]>>;
|
|
51
63
|
submitCount: Readonly<Ref<number>>;
|
|
52
64
|
submitting: Readonly<Ref<boolean>>;
|
|
53
65
|
touch: (name: string) => void;
|
|
@@ -55,26 +67,31 @@ export interface FormContext {
|
|
|
55
67
|
submit: () => Promise<boolean>;
|
|
56
68
|
reset: () => void;
|
|
57
69
|
}
|
|
58
|
-
export interface UseFormReturn<S extends FormSchema
|
|
70
|
+
export interface UseFormReturn<S extends FormSchema = FormSchema, V extends object = FormValues<S>> extends FormContext {
|
|
59
71
|
schema: S;
|
|
60
|
-
values: UnwrapRef<
|
|
72
|
+
values: UnwrapRef<V>;
|
|
61
73
|
errors: FormErrors<S>;
|
|
62
|
-
|
|
74
|
+
warnings: Readonly<FormMessageMap>;
|
|
75
|
+
rootErrors: Readonly<Ref<readonly string[]>>;
|
|
76
|
+
rootWarnings: Readonly<Ref<readonly string[]>>;
|
|
77
|
+
touched: Partial<Record<keyof V & string, boolean>> & Record<string, boolean | undefined>;
|
|
63
78
|
dirty: ComputedRef<boolean>;
|
|
64
|
-
dirtyFields: ComputedRef<(keyof
|
|
79
|
+
dirtyFields: ComputedRef<(keyof V & string)[]>;
|
|
65
80
|
valid: ComputedRef<boolean>;
|
|
66
81
|
submitCount: Ref<number>;
|
|
67
82
|
submitting: Ref<boolean>;
|
|
68
|
-
isDirty: (name: keyof
|
|
83
|
+
isDirty: (name: keyof V & string) => boolean;
|
|
69
84
|
validate: () => Promise<boolean>;
|
|
70
|
-
|
|
71
|
-
|
|
85
|
+
validateSync: () => boolean;
|
|
86
|
+
validateField: (name: keyof V & string) => Promise<boolean>;
|
|
87
|
+
setError: (name: FormPath<V>, message: string | undefined) => void;
|
|
72
88
|
setErrors: (errors: FormErrors<S>) => void;
|
|
73
89
|
clearErrors: () => void;
|
|
74
90
|
touch: (name: string) => void;
|
|
75
|
-
reset: (values?: Partial<
|
|
91
|
+
reset: (values?: Partial<V>) => void;
|
|
76
92
|
submit: () => Promise<boolean>;
|
|
77
93
|
}
|
|
78
94
|
export declare function isEmptyValue(value: unknown): boolean;
|
|
79
|
-
export declare function useForm<S extends FormSchema
|
|
95
|
+
export declare function useForm<S extends FormSchema = FormSchema, V extends object = FormValues<S>>(options: UseFormOptions<S, V>): UseFormReturn<S, V>;
|
|
80
96
|
export declare function useFormContext(): FormContext | null;
|
|
97
|
+
export declare function provideForm(form: FormContext): FormContext;
|