@leavepulse/ui 0.31.1 → 0.32.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/dist/assets/{LpDropzone-DVDC-ABU.css → LpDropzone-BBoWvi-J.css} +12 -12
- package/dist/assets/{LpImageEditor-DqP5JKCy.css → LpImageEditor-BsSwej47.css} +6 -6
- package/dist/chunks/{LpAddressInput-BDkp3-Bp.js → LpAddressInput-C35TsJXt.js} +19 -14
- package/dist/chunks/{LpAppShell-Chz8Vbtu.js → LpAppShell-lVvpENMH.js} +18 -13
- package/dist/chunks/{LpBreadcrumbs-5uvViCXi.js → LpBreadcrumbs-p4jHe_V-.js} +9 -7
- package/dist/chunks/{LpCalendar-B7ZL0ty3.js → LpCalendar-B7Ko5RdR.js} +12 -7
- package/dist/chunks/{LpCard-D0M2ZCnB.js → LpCard-1SeUYPBT.js} +36 -9
- package/dist/chunks/{LpCheckbox-BO0zuuPh.js → LpCheckbox-CVccKYaH.js} +9 -4
- package/dist/chunks/{LpCodeBlock-BWX1KZwk.js → LpCodeBlock-Bo0B4TFR.js} +37 -32
- package/dist/chunks/{LpDatePicker-dY2q4dr4.js → LpDatePicker-6JFXllj5.js} +1 -1
- package/dist/chunks/{LpDisclosure-B4kVAWfg.js → LpDisclosure-y7wDBgLa.js} +11 -6
- package/dist/chunks/{LpEmptyState-BV3q7Qyi.js → LpEmptyState-Dsdqz1Wj.js} +13 -5
- package/dist/chunks/{LpFileTree-DfFqY__1.js → LpFileTree-C-NFRT0H.js} +19 -14
- package/dist/chunks/{LpFileTreeNode-COchUMNn.js → LpFileTreeNode-DNJUJiiB.js} +13 -6
- package/dist/chunks/{LpFormField-fV_2ZdCk.js → LpFormField-CazBc2-a.js} +14 -9
- package/dist/chunks/{LpInput-Bt4J71xn.js → LpInput-9EXWUM9B.js} +1 -1
- package/dist/chunks/{LpLightbox-Ci35Y_xP.js → LpLightbox-Cixfxezw.js} +29 -6
- package/dist/chunks/{LpLink-BHZ1CLlF.js → LpLink-DCND-zyu.js} +16 -9
- package/dist/chunks/{LpLogViewer-TSRyt3t9.js → LpLogViewer-y53ZqSVq.js} +20 -10
- package/dist/chunks/{LpMapPicker-CXvoTrAe.js → LpMapPicker-ul4oYno6.js} +14 -9
- package/dist/chunks/LpMediaGallery-t1z3bQcY.js +187 -0
- package/dist/chunks/{LpNotificationBell-gdvQY89m.js → LpNotificationBell-lHePf89W.js} +1 -1
- package/dist/chunks/{LpNumberField-NPE8Bumx.js → LpNumberField-CWuX08iX.js} +12 -5
- package/dist/chunks/{LpOtpInput-DqaT0Z75.js → LpOtpInput-y2v-pmiN.js} +11 -6
- package/dist/chunks/{LpPagination-CeGuNe_q.js → LpPagination-5FxjmmB5.js} +21 -19
- package/dist/chunks/{LpPasswordInput-BqMAc5HA.js → LpPasswordInput--sjYCkLS.js} +1 -1
- package/dist/chunks/{LpPhoneInput-NXXjciJJ.js → LpPhoneInput-BDSKVl_z.js} +16 -9
- package/dist/chunks/{LpPie-BL1vTDSM.js → LpPie-c2-q4DJu.js} +14 -8
- package/dist/chunks/{LpRadio-CL-pI0_O.js → LpRadio-B5AfqTpZ.js} +13 -5
- package/dist/chunks/{LpRadioGroup-B4yDTmi6.js → LpRadioGroup-xPIuVDO_.js} +12 -5
- package/dist/chunks/{LpSegmented-BmpanyAo.js → LpSegmented-fV0Sk92p.js} +16 -6
- package/dist/chunks/{LpSidebar-BiWM_lDB.js → LpSidebar-DcYavim2.js} +2 -2
- package/dist/chunks/{LpSidebarNav-CsgeuGAu.js → LpSidebarNav-CqwvT4H8.js} +21 -16
- package/dist/chunks/{LpSlider-B1SF3pRV.js → LpSlider-BwNIBkAK.js} +12 -5
- package/dist/chunks/{LpStat-CDanpzU0.js → LpStat-CQaW8R--.js} +23 -18
- package/dist/chunks/{LpStepper-Wtl-6nUh.js → LpStepper-Bk-XaQYU.js} +15 -10
- package/dist/chunks/{LpSwitch-v6fnccSM.js → LpSwitch-xgnRU2k0.js} +12 -5
- package/dist/chunks/{LpTextarea-BMIOfw5l.js → LpTextarea-t7F6gv8E.js} +1 -1
- package/dist/chunks/{LpUptimeBar-DcQ8HikG.js → LpUptimeBar-DvAMno0S.js} +26 -21
- package/dist/component-names.d.ts +1 -1
- package/dist/components/LpAddressInput.vue.d.ts +34 -17
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +65 -31
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.d.ts +12 -6
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpCalendar.vue.d.ts +15 -6
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.d.ts +26 -0
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.d.ts +54 -12
- package/dist/components/LpChart.vue.js +15 -9
- package/dist/components/LpCheckbox.vue.d.ts +16 -12
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.d.ts +25 -6
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.d.ts +24 -14
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDropzone.vue.d.ts +38 -14
- package/dist/components/LpDropzone.vue.js +17 -11
- package/dist/components/LpEmptyState.vue.d.ts +15 -10
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFileTree.vue.d.ts +51 -31
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.d.ts +31 -16
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.d.ts +14 -13
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.d.ts +33 -10
- package/dist/components/LpImageEditor.vue.js +13 -7
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLink.vue.d.ts +46 -11
- package/dist/components/LpLink.vue.js +1 -1
- package/dist/components/LpLogViewer.vue.d.ts +63 -6
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.d.ts +25 -10
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.d.ts +76 -0
- package/dist/components/LpMediaGallery.vue.js +4 -0
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.d.ts +12 -6
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.d.ts +18 -6
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.d.ts +16 -6
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.d.ts +18 -6
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +96 -34
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpRadio.vue.d.ts +10 -10
- package/dist/components/LpRadio.vue.js +1 -1
- package/dist/components/LpRadioGroup.vue.d.ts +12 -12
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpSegmented.vue.d.ts +12 -6
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.d.ts +28 -17
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSlider.vue.d.ts +13 -6
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpStat.vue.d.ts +35 -11
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStepper.vue.d.ts +17 -5
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwitch.vue.d.ts +8 -6
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTable.vue.js +1 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.d.ts +21 -5
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/composables/useMergedClass.d.ts +20 -0
- package/dist/composables/useMergedClass.js +11 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +95 -89
- package/package.json +1 -3
- package/src/component-names.ts +1 -0
- package/src/components/LpAddressInput.vue +16 -1
- package/src/components/LpAppShell.vue +16 -1
- package/src/components/LpBreadcrumbs.vue +16 -1
- package/src/components/LpCalendar.vue +15 -1
- package/src/components/LpCard.vue +50 -5
- package/src/components/LpChart.vue +16 -1
- package/src/components/LpCheckbox.vue +16 -1
- package/src/components/LpCodeBlock.vue +16 -1
- package/src/components/LpDisclosure.vue +15 -1
- package/src/components/LpDropzone.vue +21 -6
- package/src/components/LpEmptyState.vue +21 -3
- package/src/components/LpFileTree.vue +16 -1
- package/src/components/LpFileTreeNode.vue +15 -1
- package/src/components/LpFormField.vue +16 -1
- package/src/components/LpImageEditor.vue +16 -1
- package/src/components/LpLightbox.vue +54 -2
- package/src/components/LpLink.vue +25 -9
- package/src/components/LpLogViewer.vue +20 -2
- package/src/components/LpMapPicker.vue +15 -1
- package/src/components/LpMediaGallery.vue +280 -0
- package/src/components/LpNumberField.vue +15 -1
- package/src/components/LpOtpInput.vue +15 -1
- package/src/components/LpPagination.vue +16 -1
- package/src/components/LpPhoneInput.vue +23 -8
- package/src/components/LpPie.vue +16 -1
- package/src/components/LpRadio.vue +20 -3
- package/src/components/LpRadioGroup.vue +15 -1
- package/src/components/LpSegmented.vue +21 -2
- package/src/components/LpSidebarNav.vue +16 -1
- package/src/components/LpSlider.vue +15 -1
- package/src/components/LpStat.vue +16 -1
- package/src/components/LpStepper.vue +16 -1
- package/src/components/LpSwitch.vue +15 -1
- package/src/components/LpUptimeBar.vue +16 -1
- package/src/composables/useMergedClass.ts +30 -0
- package/src/index.ts +2 -0
- package/src/tokens/tokens.css +29 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: __VLS_WithSlots<import('vue').DefineComponent<{
|
|
2
4
|
/** Same syntax as the input's: "image/*", ".yaml,.yml". */
|
|
3
5
|
accept?: string;
|
|
4
6
|
/** Take more than one at a time. */
|
|
@@ -26,14 +28,7 @@ type __VLS_Props = {
|
|
|
26
28
|
tone?: "sunken" | "flush" | "soft";
|
|
27
29
|
/** Draw the entrance when the zone first comes into view. */
|
|
28
30
|
animate?: boolean;
|
|
29
|
-
}
|
|
30
|
-
declare var __VLS_1: {
|
|
31
|
-
over: boolean;
|
|
32
|
-
};
|
|
33
|
-
type __VLS_Slots = {} & {
|
|
34
|
-
default?: (props: typeof __VLS_1) => any;
|
|
35
|
-
};
|
|
36
|
-
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
31
|
+
}, {
|
|
37
32
|
browse: () => void | undefined;
|
|
38
33
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
39
34
|
files: (files: File[]) => any;
|
|
@@ -41,7 +36,35 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
41
36
|
file: File;
|
|
42
37
|
cause: "type" | "size";
|
|
43
38
|
}[]) => any;
|
|
44
|
-
}, string, import('vue').PublicProps, Readonly<
|
|
39
|
+
}, string, import('vue').PublicProps, Readonly<{
|
|
40
|
+
/** Same syntax as the input's: "image/*", ".yaml,.yml". */
|
|
41
|
+
accept?: string;
|
|
42
|
+
/** Take more than one at a time. */
|
|
43
|
+
multiple?: boolean;
|
|
44
|
+
disabled?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Also accept a paste anywhere on the page, not only while focused.
|
|
47
|
+
* Off by default: two zones both listening would each take the same
|
|
48
|
+
* screenshot, and a page with one obvious target is the case for it.
|
|
49
|
+
*/
|
|
50
|
+
pasteTarget?: boolean;
|
|
51
|
+
/** Largest file accepted, in bytes. Bigger ones are rejected, not silently
|
|
52
|
+
* dropped — a picture that vanishes reads as a broken uploader. */
|
|
53
|
+
maxBytes?: number;
|
|
54
|
+
icon?: string;
|
|
55
|
+
title?: string;
|
|
56
|
+
hint?: string;
|
|
57
|
+
/**
|
|
58
|
+
* How the well sits against what holds it. A drop target reads as a hole
|
|
59
|
+
* in the surface, not a tile on top of it, so the default is darker than
|
|
60
|
+
* the card — which is what a dashed border is already suggesting.
|
|
61
|
+
* `flush` for a zone that fills a panel of its own, `soft` when it sits
|
|
62
|
+
* directly on the page background and needs to lift off it instead.
|
|
63
|
+
*/
|
|
64
|
+
tone?: "sunken" | "flush" | "soft";
|
|
65
|
+
/** Draw the entrance when the zone first comes into view. */
|
|
66
|
+
animate?: boolean;
|
|
67
|
+
}> & Readonly<{
|
|
45
68
|
onFiles?: ((files: File[]) => any) | undefined;
|
|
46
69
|
onRejected?: ((reason: {
|
|
47
70
|
file: File;
|
|
@@ -55,10 +78,11 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
55
78
|
multiple: boolean;
|
|
56
79
|
hint: string;
|
|
57
80
|
tone: "sunken" | "flush" | "soft";
|
|
58
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
81
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>, {
|
|
82
|
+
default?: (props: {
|
|
83
|
+
over: boolean;
|
|
84
|
+
}) => any;
|
|
85
|
+
}>;
|
|
62
86
|
type __VLS_WithSlots<T, S> = T & {
|
|
63
87
|
new (): {
|
|
64
88
|
$slots: S;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { defineComponent, ref, onMounted, onBeforeUnmount, openBlock, createElementBlock,
|
|
1
|
+
import { defineComponent, ref, onMounted, onBeforeUnmount, openBlock, createElementBlock, mergeProps, unref, withModifiers, createElementVNode, renderSlot, createVNode, normalizeClass, toDisplayString, createCommentVNode } from "vue";
|
|
2
|
+
import { useMergedAttrs } from "../composables/useMergedClass.js";
|
|
2
3
|
import { useReveal } from "../composables/useReveal.js";
|
|
3
4
|
import { _ as _sfc_main$1 } from "../chunks/LpIcon-CCnX5_2j.js";
|
|
4
5
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
5
|
-
import '../assets/LpDropzone-
|
|
6
|
+
import '../assets/LpDropzone-BBoWvi-J.css';const _hoisted_1 = ["disabled"];
|
|
6
7
|
const _hoisted_2 = {
|
|
7
8
|
key: 0,
|
|
8
9
|
class: "text-sm font-medium text-ink"
|
|
@@ -12,7 +13,9 @@ const _hoisted_3 = {
|
|
|
12
13
|
class: "text-xs text-muted"
|
|
13
14
|
};
|
|
14
15
|
const _hoisted_4 = ["accept", "multiple", "disabled"];
|
|
16
|
+
const __default__ = { inheritAttrs: false };
|
|
15
17
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
18
|
+
...__default__,
|
|
16
19
|
__name: "LpDropzone",
|
|
17
20
|
props: {
|
|
18
21
|
accept: { default: "" },
|
|
@@ -99,24 +102,27 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
99
102
|
});
|
|
100
103
|
onBeforeUnmount(() => window.removeEventListener("paste", windowPaste));
|
|
101
104
|
__expose({ browse: () => input.value?.click() });
|
|
105
|
+
const { class: rootClass, attrs: rest } = useMergedAttrs(() => [
|
|
106
|
+
"lp-dropzone relative flex w-full flex-col items-center gap-2 rounded-card px-6 py-8 text-center transition-colors duration-[var(--duration-fast)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-55",
|
|
107
|
+
over.value ? "bg-brand-soft" : TONES[props.tone],
|
|
108
|
+
over.value ? "lp-dropzone--over" : "",
|
|
109
|
+
props.animate && !revealed.value ? "lp-dropzone--waiting" : ""
|
|
110
|
+
].join(" "));
|
|
102
111
|
return (_ctx, _cache) => {
|
|
103
|
-
return openBlock(), createElementBlock("button", {
|
|
112
|
+
return openBlock(), createElementBlock("button", mergeProps({
|
|
104
113
|
ref_key: "revealAnchor",
|
|
105
114
|
ref: revealAnchor,
|
|
106
115
|
type: "button",
|
|
107
116
|
disabled: __props.disabled,
|
|
108
|
-
class:
|
|
109
|
-
|
|
110
|
-
over.value ? "lp-dropzone--over" : "",
|
|
111
|
-
__props.animate && !unref(revealed) ? "lp-dropzone--waiting" : ""
|
|
112
|
-
]]),
|
|
117
|
+
class: unref(rootClass)
|
|
118
|
+
}, unref(rest), {
|
|
113
119
|
onClick: _cache[1] || (_cache[1] = ($event) => input.value?.click()),
|
|
114
120
|
onPaste,
|
|
115
121
|
onDragenter: withModifiers(onDragOver, ["prevent"]),
|
|
116
122
|
onDragover: withModifiers(onDragOver, ["prevent"]),
|
|
117
123
|
onDragleave: onDragLeave,
|
|
118
124
|
onDrop: withModifiers(onDrop, ["prevent"])
|
|
119
|
-
}, [
|
|
125
|
+
}), [
|
|
120
126
|
_cache[2] || (_cache[2] = createElementVNode("svg", {
|
|
121
127
|
"aria-hidden": "true",
|
|
122
128
|
class: "lp-dropzone__frame pointer-events-none absolute inset-0 size-full"
|
|
@@ -153,11 +159,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
153
159
|
onClick: _cache[0] || (_cache[0] = withModifiers(() => {
|
|
154
160
|
}, ["stop"]))
|
|
155
161
|
}, null, 40, _hoisted_4)
|
|
156
|
-
],
|
|
162
|
+
], 16, _hoisted_1);
|
|
157
163
|
};
|
|
158
164
|
}
|
|
159
165
|
});
|
|
160
|
-
const LpDropzone = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
166
|
+
const LpDropzone = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-5e560a6d"]]);
|
|
161
167
|
export {
|
|
162
168
|
LpDropzone as default
|
|
163
169
|
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: __VLS_WithSlots<import('vue').DefineComponent<{
|
|
2
4
|
icon?: string;
|
|
3
5
|
title: string;
|
|
4
6
|
description?: string;
|
|
@@ -7,15 +9,18 @@ type __VLS_Props = {
|
|
|
7
9
|
* where the full-page padding would dwarf its container.
|
|
8
10
|
*/
|
|
9
11
|
compact?: boolean;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
|
|
13
|
+
icon?: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Tightens the block for empty states nested inside a card or a panel,
|
|
18
|
+
* where the full-page padding would dwarf its container.
|
|
19
|
+
*/
|
|
20
|
+
compact?: boolean;
|
|
21
|
+
}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>, {
|
|
22
|
+
default?: (props: {}) => any;
|
|
23
|
+
}>;
|
|
19
24
|
type __VLS_WithSlots<T, S> = T & {
|
|
20
25
|
new (): {
|
|
21
26
|
$slots: S;
|
|
@@ -11,7 +11,9 @@ export interface FileTreeSummary {
|
|
|
11
11
|
/** `bytes` pre-formatted ("2.4 GB"), or "—". */
|
|
12
12
|
sizeLabel: string;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
declare const _default: typeof __VLS_export;
|
|
15
|
+
export default _default;
|
|
16
|
+
declare const __VLS_export: __VLS_WithSlots<import('vue').DefineComponent<{
|
|
15
17
|
nodes: FileNode[];
|
|
16
18
|
/** Selected node id (v-model:selected). */
|
|
17
19
|
selected?: string;
|
|
@@ -41,31 +43,12 @@ type __VLS_Props = {
|
|
|
41
43
|
/** Empty-state copy when `nodes` is empty. */
|
|
42
44
|
emptyLabel?: string;
|
|
43
45
|
emptyDescription?: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
expanded: boolean;
|
|
51
|
-
selected: boolean;
|
|
52
|
-
}): unknown;
|
|
53
|
-
/** Footer under the tree, handed the live selection stats. */
|
|
54
|
-
summary(props: FileTreeSummary): unknown;
|
|
55
|
-
};
|
|
56
|
-
/** Tick every node in the tree (skipping disabled ones). */
|
|
57
|
-
declare function checkAll(): void;
|
|
58
|
-
declare function clearChecked(): void;
|
|
59
|
-
/** Expand every ancestor of `id`, focus it and make it the selection. */
|
|
60
|
-
declare function reveal(id: string): void;
|
|
61
|
-
declare function expandAll(): void;
|
|
62
|
-
declare function collapseAll(): void;
|
|
63
|
-
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
64
|
-
reveal: typeof reveal;
|
|
65
|
-
expandAll: typeof expandAll;
|
|
66
|
-
collapseAll: typeof collapseAll;
|
|
67
|
-
checkAll: typeof checkAll;
|
|
68
|
-
clearChecked: typeof clearChecked;
|
|
46
|
+
}, {
|
|
47
|
+
reveal: (id: string) => void;
|
|
48
|
+
expandAll: () => void;
|
|
49
|
+
collapseAll: () => void;
|
|
50
|
+
checkAll: () => void;
|
|
51
|
+
clearChecked: () => void;
|
|
69
52
|
summary: import('vue').ComputedRef<FileTreeSummary>;
|
|
70
53
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
71
54
|
expand: (node: FileNode) => any;
|
|
@@ -76,7 +59,37 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
76
59
|
"update:selected": (id: string) => any;
|
|
77
60
|
"update:expanded": (ids: string[]) => any;
|
|
78
61
|
"update:checked": (ids: string[]) => any;
|
|
79
|
-
}, string, import('vue').PublicProps, Readonly<
|
|
62
|
+
}, string, import('vue').PublicProps, Readonly<{
|
|
63
|
+
nodes: FileNode[];
|
|
64
|
+
/** Selected node id (v-model:selected). */
|
|
65
|
+
selected?: string;
|
|
66
|
+
/** Expanded directory ids (v-model:expanded). Omit to let the tree own it. */
|
|
67
|
+
expanded?: string[];
|
|
68
|
+
/** Directory ids currently fetching children — shows a spinner on the row. */
|
|
69
|
+
loadingIds?: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Multi-select mode: every row gets a tri-state checkbox and ticking a
|
|
72
|
+
* directory cascades to its loaded subtree. This is the mode for "pick what
|
|
73
|
+
* to back up" — `selected` stays independent (it's the highlighted row).
|
|
74
|
+
*/
|
|
75
|
+
checkable?: boolean;
|
|
76
|
+
/** Ticked node ids (v-model:checked). */
|
|
77
|
+
checked?: string[];
|
|
78
|
+
/** Right-aligned size column (directories roll up their subtree). */
|
|
79
|
+
showSize?: boolean;
|
|
80
|
+
/** Right-aligned last-modified column. */
|
|
81
|
+
showModified?: boolean;
|
|
82
|
+
/** Directories first, then by name. Turn off to keep the caller's order. */
|
|
83
|
+
sort?: boolean;
|
|
84
|
+
/** Row icon size in px. */
|
|
85
|
+
iconSize?: number;
|
|
86
|
+
/** Skeleton rows while the initial listing loads. */
|
|
87
|
+
loading?: boolean;
|
|
88
|
+
skeletonRows?: number;
|
|
89
|
+
/** Empty-state copy when `nodes` is empty. */
|
|
90
|
+
emptyLabel?: string;
|
|
91
|
+
emptyDescription?: string;
|
|
92
|
+
}> & Readonly<{
|
|
80
93
|
onExpand?: ((node: FileNode) => any) | undefined;
|
|
81
94
|
onSelect?: ((node: FileNode) => any) | undefined;
|
|
82
95
|
onSummary?: ((summary: FileTreeSummary) => any) | undefined;
|
|
@@ -95,10 +108,17 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {
|
|
|
95
108
|
showSize: boolean;
|
|
96
109
|
showModified: boolean;
|
|
97
110
|
emptyDescription: string;
|
|
98
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
111
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>, {
|
|
112
|
+
/** Replace the row's label (icons, chevron and indent stay). */
|
|
113
|
+
row(props: {
|
|
114
|
+
node: FileNode;
|
|
115
|
+
depth: number;
|
|
116
|
+
expanded: boolean;
|
|
117
|
+
selected: boolean;
|
|
118
|
+
}): unknown;
|
|
119
|
+
/** Footer under the tree, handed the live selection stats. */
|
|
120
|
+
summary(props: FileTreeSummary): unknown;
|
|
121
|
+
}>;
|
|
102
122
|
type __VLS_WithSlots<T, S> = T & {
|
|
103
123
|
new (): {
|
|
104
124
|
$slots: S;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { FileNode, NodeStats } from './fileTree';
|
|
2
|
-
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
4
|
+
declare const __VLS_export: __VLS_WithSlots<import('vue').DefineComponent<{
|
|
3
5
|
node: FileNode;
|
|
4
6
|
/** Nesting depth, 0 at the root — drives the indent guide and aria-level. */
|
|
5
7
|
depth: number;
|
|
@@ -17,29 +19,42 @@ type __VLS_Props = {
|
|
|
17
19
|
stats: Map<string, NodeStats>;
|
|
18
20
|
showSize: boolean;
|
|
19
21
|
showModified: boolean;
|
|
20
|
-
}
|
|
21
|
-
type __VLS_Slots = {
|
|
22
|
-
row(props: {
|
|
23
|
-
node: FileNode;
|
|
24
|
-
depth: number;
|
|
25
|
-
expanded: boolean;
|
|
26
|
-
selected: boolean;
|
|
27
|
-
}): unknown;
|
|
28
|
-
};
|
|
29
|
-
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
22
|
+
}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
30
23
|
check: (node: FileNode, value: boolean) => any;
|
|
31
24
|
focus: (node: FileNode) => any;
|
|
32
25
|
select: (node: FileNode) => any;
|
|
33
26
|
toggle: (node: FileNode) => any;
|
|
34
|
-
}, string, import('vue').PublicProps, Readonly<
|
|
27
|
+
}, string, import('vue').PublicProps, Readonly<{
|
|
28
|
+
node: FileNode;
|
|
29
|
+
/** Nesting depth, 0 at the root — drives the indent guide and aria-level. */
|
|
30
|
+
depth: number;
|
|
31
|
+
expanded: Set<string>;
|
|
32
|
+
loading: Set<string>;
|
|
33
|
+
selectedId?: string;
|
|
34
|
+
focusedId?: string;
|
|
35
|
+
sort: boolean;
|
|
36
|
+
/** Rendered size of the row's icon, in px. */
|
|
37
|
+
iconSize: number;
|
|
38
|
+
/** Render a tri-state checkbox per row (multi-select mode). */
|
|
39
|
+
checkable: boolean;
|
|
40
|
+
checked: Set<string>;
|
|
41
|
+
/** Per-node state, derived once by the root for the whole tree. */
|
|
42
|
+
stats: Map<string, NodeStats>;
|
|
43
|
+
showSize: boolean;
|
|
44
|
+
showModified: boolean;
|
|
45
|
+
}> & Readonly<{
|
|
35
46
|
onCheck?: ((node: FileNode, value: boolean) => any) | undefined;
|
|
36
47
|
onFocus?: ((node: FileNode) => any) | undefined;
|
|
37
48
|
onSelect?: ((node: FileNode) => any) | undefined;
|
|
38
49
|
onToggle?: ((node: FileNode) => any) | undefined;
|
|
39
|
-
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>, {
|
|
51
|
+
row(props: {
|
|
52
|
+
node: FileNode;
|
|
53
|
+
depth: number;
|
|
54
|
+
expanded: boolean;
|
|
55
|
+
selected: boolean;
|
|
56
|
+
}): unknown;
|
|
57
|
+
}>;
|
|
43
58
|
type __VLS_WithSlots<T, S> = T & {
|
|
44
59
|
new (): {
|
|
45
60
|
$slots: S;
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: __VLS_WithSlots<import('vue').DefineComponent<{
|
|
2
4
|
label?: string;
|
|
3
5
|
hint?: string;
|
|
4
6
|
error?: string;
|
|
5
7
|
required?: boolean;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
|
|
9
|
+
label?: string;
|
|
10
|
+
hint?: string;
|
|
11
|
+
error?: string;
|
|
12
|
+
required?: boolean;
|
|
13
|
+
}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>, {
|
|
14
|
+
default?: (props: {
|
|
15
|
+
id: string;
|
|
16
|
+
}) => any;
|
|
12
17
|
} & {
|
|
13
|
-
hint?: (props:
|
|
14
|
-
}
|
|
15
|
-
declare const __VLS_base: 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>;
|
|
16
|
-
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
17
|
-
declare const _default: typeof __VLS_export;
|
|
18
|
-
export default _default;
|
|
18
|
+
hint?: (props: {}) => any;
|
|
19
|
+
}>;
|
|
19
20
|
type __VLS_WithSlots<T, S> = T & {
|
|
20
21
|
new (): {
|
|
21
22
|
$slots: S;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: import('vue').DefineComponent<{
|
|
2
4
|
/** The picture to work on. */
|
|
3
5
|
file: File | Blob;
|
|
4
6
|
/**
|
|
@@ -24,12 +26,9 @@ type __VLS_Props = {
|
|
|
24
26
|
labels?: Partial<Record<"rotateLeft" | "rotateRight" | "zoomIn" | "zoomOut" | "reset" | "canvas", string>>;
|
|
25
27
|
/** Fade the picture in when the editor first comes into view. */
|
|
26
28
|
animate?: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {
|
|
31
|
-
export: typeof exportImage;
|
|
32
|
-
reset: typeof reset;
|
|
29
|
+
}, {
|
|
30
|
+
export: () => Promise<Blob | null>;
|
|
31
|
+
reset: () => void;
|
|
33
32
|
edited: import('vue').ComputedRef<boolean>;
|
|
34
33
|
shortcuts: readonly [{
|
|
35
34
|
readonly keys: readonly ["←", "→", "↑", "↓"];
|
|
@@ -47,12 +46,36 @@ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {
|
|
|
47
46
|
readonly keys: readonly ["0"];
|
|
48
47
|
readonly label: "Reset";
|
|
49
48
|
}];
|
|
50
|
-
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<
|
|
49
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
|
|
50
|
+
/** The picture to work on. */
|
|
51
|
+
file: File | Blob;
|
|
52
|
+
/**
|
|
53
|
+
* Shape of the crop box.
|
|
54
|
+
*
|
|
55
|
+
* The named ones are shorthand for the common cases; a NUMBER is the real
|
|
56
|
+
* interface — `:aspect="2.35"` for anamorphic, `:aspect="0.8"` for a
|
|
57
|
+
* shelf label — so a consumer whose shape is not on the list is not stuck
|
|
58
|
+
* choosing the nearest wrong one. "free" keeps the source's own
|
|
59
|
+
* proportions and crops only what panning and zoom leave outside.
|
|
60
|
+
*/
|
|
61
|
+
aspect?: "free" | "square" | "4:3" | "3:4" | "16:9" | number;
|
|
62
|
+
/** Longest edge of the exported image. Larger sources are scaled down. */
|
|
63
|
+
maxEdge?: number;
|
|
64
|
+
/** JPEG quality of the export. */
|
|
65
|
+
quality?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Labels for the toolbar. Defaulted in English rather than left blank: an
|
|
68
|
+
* icon button with no accessible name is announced as "button", and the
|
|
69
|
+
* kit cannot reach the consumer's translations. Apps with i18n pass their
|
|
70
|
+
* own strings.
|
|
71
|
+
*/
|
|
72
|
+
labels?: Partial<Record<"rotateLeft" | "rotateRight" | "zoomIn" | "zoomOut" | "reset" | "canvas", string>>;
|
|
73
|
+
/** Fade the picture in when the editor first comes into view. */
|
|
74
|
+
animate?: boolean;
|
|
75
|
+
}> & Readonly<{}>, {
|
|
51
76
|
animate: boolean;
|
|
52
77
|
labels: Partial<Record<"rotateLeft" | "rotateRight" | "zoomIn" | "zoomOut" | "reset" | "canvas", string>>;
|
|
53
78
|
aspect: "free" | "square" | "4:3" | "3:4" | "16:9" | number;
|
|
54
79
|
maxEdge: number;
|
|
55
80
|
quality: number;
|
|
56
81
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
57
|
-
declare const _default: typeof __VLS_export;
|
|
58
|
-
export default _default;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { defineComponent, computed, shallowRef, ref, watch, onBeforeUnmount, openBlock, createElementBlock,
|
|
1
|
+
import { defineComponent, computed, shallowRef, ref, watch, onBeforeUnmount, openBlock, createElementBlock, mergeProps, unref, createElementVNode, withModifiers, normalizeStyle, normalizeClass, createCommentVNode, createVNode, Transition, withCtx, Fragment, renderList, toDisplayString, createBlock, createTextVNode } from "vue";
|
|
2
2
|
import { useHotkeys } from "../composables/useHotkeys.js";
|
|
3
3
|
import { useReveal } from "../composables/useReveal.js";
|
|
4
4
|
import { useZoomPan } from "../composables/useZoomPan.js";
|
|
5
5
|
import { _ as _sfc_main$1 } from "../chunks/LpButton-5VXXCjwF.js";
|
|
6
6
|
import "reka-ui";
|
|
7
7
|
import { _ as _sfc_main$2 } from "../chunks/LpIcon-CCnX5_2j.js";
|
|
8
|
+
import { useMergedAttrs } from "../composables/useMergedClass.js";
|
|
8
9
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
9
|
-
import '../assets/LpImageEditor-
|
|
10
|
+
import '../assets/LpImageEditor-BsSwej47.css';const _hoisted_1 = ["aria-label"];
|
|
10
11
|
const _hoisted_2 = ["src"];
|
|
11
12
|
const _hoisted_3 = {
|
|
12
13
|
key: 0,
|
|
@@ -16,7 +17,9 @@ const _hoisted_4 = { class: "flex items-center gap-1.5 text-muted" };
|
|
|
16
17
|
const _hoisted_5 = { class: "flex items-center rounded-control bg-surface-soft p-0.5" };
|
|
17
18
|
const _hoisted_6 = { class: "flex items-center rounded-control bg-surface-soft p-0.5" };
|
|
18
19
|
const _hoisted_7 = { class: "min-w-10 text-center text-xs tabular-nums" };
|
|
20
|
+
const __default__ = { inheritAttrs: false };
|
|
19
21
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
22
|
+
...__default__,
|
|
20
23
|
__name: "LpImageEditor",
|
|
21
24
|
props: {
|
|
22
25
|
file: {},
|
|
@@ -209,12 +212,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
209
212
|
{ keys: ["0"], label: "Reset" }
|
|
210
213
|
];
|
|
211
214
|
__expose({ export: exportImage, reset, edited, shortcuts: SHORTCUTS });
|
|
215
|
+
const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
216
|
+
"flex flex-col gap-3"
|
|
217
|
+
);
|
|
212
218
|
return (_ctx, _cache) => {
|
|
213
|
-
return openBlock(), createElementBlock("div", {
|
|
219
|
+
return openBlock(), createElementBlock("div", mergeProps({
|
|
214
220
|
ref_key: "revealAnchor",
|
|
215
221
|
ref: revealAnchor,
|
|
216
|
-
class:
|
|
217
|
-
}, [
|
|
222
|
+
class: unref(rootClass)
|
|
223
|
+
}, unref(rest)), [
|
|
218
224
|
createElementVNode("div", {
|
|
219
225
|
ref_key: "viewport",
|
|
220
226
|
ref: viewport,
|
|
@@ -347,11 +353,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
347
353
|
_: 1
|
|
348
354
|
})) : createCommentVNode("", true)
|
|
349
355
|
])
|
|
350
|
-
],
|
|
356
|
+
], 16);
|
|
351
357
|
};
|
|
352
358
|
}
|
|
353
359
|
});
|
|
354
|
-
const LpImageEditor = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
360
|
+
const LpImageEditor = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3587f639"]]);
|
|
355
361
|
export {
|
|
356
362
|
LpImageEditor as default
|
|
357
363
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Component } from 'vue';
|
|
2
|
-
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
4
|
+
declare const __VLS_export: __VLS_WithSlots<import('vue').DefineComponent<{
|
|
3
5
|
href?: string;
|
|
4
6
|
external?: boolean;
|
|
5
7
|
/** Shorthand for `tone="muted"`. */
|
|
@@ -38,19 +40,52 @@ type __VLS_Props = {
|
|
|
38
40
|
* cross the text exactly.
|
|
39
41
|
*/
|
|
40
42
|
revealOn?: "self" | "group";
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
|
|
44
|
+
href?: string;
|
|
45
|
+
external?: boolean;
|
|
46
|
+
/** Shorthand for `tone="muted"`. */
|
|
47
|
+
muted?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* "brand" — the accent link colour (default).
|
|
50
|
+
* "ink" — inherits body text colour; for links that sit inside prose or
|
|
51
|
+
* chrome where an accent would shout (breadcrumbs, footers, nav).
|
|
52
|
+
* "muted" / "soft" — progressively quieter, both resolving to ink on hover.
|
|
53
|
+
*/
|
|
54
|
+
tone?: "brand" | "ink" | "muted" | "soft";
|
|
55
|
+
/**
|
|
56
|
+
* Root element/component. Defaults to a native <a>. Pass a router link
|
|
57
|
+
* component (e.g. NuxtLink or RouterLink) to keep client-side navigation;
|
|
58
|
+
* the kit stays DOM-agnostic, the consumer supplies the link component.
|
|
59
|
+
* Router links take their destination through their own prop (`to`), which
|
|
60
|
+
* falls through as a plain attribute.
|
|
61
|
+
*/
|
|
62
|
+
as?: string | Component;
|
|
63
|
+
/**
|
|
64
|
+
* "default" — plain hover underline.
|
|
65
|
+
* "underline" — underlined at rest; for links inside running prose,
|
|
66
|
+
* where hover-only underlines leave the link invisible until pointed at.
|
|
67
|
+
* "reveal" — an underline bar that grows in from the left on hover
|
|
68
|
+
* (origin-left scale-x 0→1). The LeavePulse landing "monitoring" link feel;
|
|
69
|
+
* good for inline prose links and nav items that want a bit of motion.
|
|
70
|
+
*/
|
|
71
|
+
variant?: "default" | "underline" | "reveal";
|
|
72
|
+
/**
|
|
73
|
+
* Which hover draws the `reveal` bar.
|
|
74
|
+
*
|
|
75
|
+
* "self" — the link's own hover (default), for an inline prose link.
|
|
76
|
+
* "group" — the hover of an ancestor marked `group`, for a link inside a
|
|
77
|
+
* row or card that is itself the click target. The row lights up and the
|
|
78
|
+
* name sweeps with it, instead of the bar waiting for the pointer to
|
|
79
|
+
* cross the text exactly.
|
|
80
|
+
*/
|
|
81
|
+
revealOn?: "self" | "group";
|
|
82
|
+
}> & Readonly<{}>, {
|
|
47
83
|
as: string | Component;
|
|
48
84
|
variant: "default" | "underline" | "reveal";
|
|
49
85
|
revealOn: "self" | "group";
|
|
50
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
export default _default;
|
|
86
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>, {
|
|
87
|
+
default?: (props: {}) => any;
|
|
88
|
+
}>;
|
|
54
89
|
type __VLS_WithSlots<T, S> = T & {
|
|
55
90
|
new (): {
|
|
56
91
|
$slots: S;
|