@shwfed/nuxt 0.10.3 → 0.10.5
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/module.json +1 -1
- package/dist/runtime/components/button.d.vue.ts +95 -0
- package/dist/runtime/components/button.vue +39 -0
- package/dist/runtime/components/button.vue.d.ts +95 -0
- package/dist/runtime/components/fields.d.vue.ts +2 -2
- package/dist/runtime/components/fields.vue.d.ts +2 -2
- package/dist/runtime/components/ui/button-configurator/ButtonConfiguratorDialog.d.vue.ts +97 -0
- package/dist/runtime/components/ui/button-configurator/ButtonConfiguratorDialog.vue +1078 -0
- package/dist/runtime/components/ui/button-configurator/ButtonConfiguratorDialog.vue.d.ts +97 -0
- package/dist/runtime/components/ui/button-configurator/menu.d.ts +48 -0
- package/dist/runtime/components/ui/button-configurator/menu.js +381 -0
- package/dist/runtime/components/ui/buttons/Buttons.d.vue.ts +95 -0
- package/dist/runtime/components/ui/buttons/Buttons.vue +330 -0
- package/dist/runtime/components/ui/buttons/Buttons.vue.d.ts +95 -0
- package/dist/runtime/components/ui/buttons/schema.d.ts +374 -0
- package/dist/runtime/components/ui/buttons/schema.js +58 -0
- package/dist/runtime/components/ui/fields/Fields.d.vue.ts +4 -4
- package/dist/runtime/components/ui/fields/Fields.vue.d.ts +4 -4
- package/dist/runtime/components/ui/fields/schema.d.ts +3 -3
- package/dist/runtime/components/ui/fields-configurator/FieldsConfiguratorDialog.d.vue.ts +2 -2
- package/dist/runtime/components/ui/fields-configurator/FieldsConfiguratorDialog.vue.d.ts +2 -2
- package/dist/runtime/components/ui/table/Table.vue +11 -10
- package/package.json +1 -1
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { useNuxtApp } from "#app";
|
|
3
|
+
import { useAttrs, computed, ref, watch } from "vue";
|
|
4
|
+
import { computedAsync } from "@vueuse/core";
|
|
5
|
+
import { Icon } from "@iconify/vue";
|
|
6
|
+
import { Effect } from "effect";
|
|
7
|
+
import { useI18n } from "vue-i18n";
|
|
8
|
+
import { useCheating } from "#imports";
|
|
9
|
+
import { getLocalizedText, hasVisibleLocaleValue } from "../../../utils/coders";
|
|
10
|
+
import { cn } from "../../../utils/cn";
|
|
11
|
+
import ButtonConfiguratorDialog from "../button-configurator/ButtonConfiguratorDialog.vue";
|
|
12
|
+
import { Button } from "../button";
|
|
13
|
+
import { ButtonGroup } from "../button-group";
|
|
14
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../dropdown-menu";
|
|
15
|
+
import { Skeleton } from "../skeleton";
|
|
16
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "../tooltip";
|
|
17
|
+
import { ButtonConfigC, normalizeButtonConfigInput } from "./schema";
|
|
18
|
+
defineOptions({
|
|
19
|
+
inheritAttrs: false
|
|
20
|
+
});
|
|
21
|
+
const props = defineProps({
|
|
22
|
+
config: { type: null, required: true }
|
|
23
|
+
});
|
|
24
|
+
const emit = defineEmits(["update:config"]);
|
|
25
|
+
const defaultConfig = {
|
|
26
|
+
gap: 12,
|
|
27
|
+
groups: []
|
|
28
|
+
};
|
|
29
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
30
|
+
const attrs = useAttrs();
|
|
31
|
+
const { locale, t } = useI18n();
|
|
32
|
+
const { $dsl } = useNuxtApp();
|
|
33
|
+
const isCheating = useCheating();
|
|
34
|
+
const isConfiguratorOpen = ref(false);
|
|
35
|
+
const pendingIds = ref([]);
|
|
36
|
+
const currentConfig = computedAsync(
|
|
37
|
+
async () => ButtonConfigC.parse(normalizeButtonConfigInput(await props.config.pipe(Effect.runPromise)))
|
|
38
|
+
);
|
|
39
|
+
const displayConfig = ref(defaultConfig);
|
|
40
|
+
watch(currentConfig, (value) => {
|
|
41
|
+
if (value) {
|
|
42
|
+
displayConfig.value = value;
|
|
43
|
+
}
|
|
44
|
+
}, { immediate: true });
|
|
45
|
+
const actionIds = computed(() => displayConfig.value.groups.flatMap((group) => group.items.flatMap((item) => {
|
|
46
|
+
if ("items" in item) {
|
|
47
|
+
return item.items.map((child) => child.id);
|
|
48
|
+
}
|
|
49
|
+
return [item.id];
|
|
50
|
+
})));
|
|
51
|
+
const rootAttrs = computed(() => {
|
|
52
|
+
const ignoredKeys = new Set(actionIds.value);
|
|
53
|
+
const nextAttrs = {};
|
|
54
|
+
for (const [key, value] of Object.entries(attrs)) {
|
|
55
|
+
if (ignoredKeys.has(key) || key === "class" || uuidPattern.test(key)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
Reflect.set(nextAttrs, key, value);
|
|
59
|
+
}
|
|
60
|
+
return nextAttrs;
|
|
61
|
+
});
|
|
62
|
+
const rootClass = computed(() => {
|
|
63
|
+
const classValue = Reflect.get(attrs, "class");
|
|
64
|
+
return typeof classValue === "string" ? classValue : void 0;
|
|
65
|
+
});
|
|
66
|
+
function getConfigStyle(config) {
|
|
67
|
+
const style = {};
|
|
68
|
+
if (!config.style) {
|
|
69
|
+
return style;
|
|
70
|
+
}
|
|
71
|
+
const styleMap = $dsl.evaluate`${config.style}`();
|
|
72
|
+
if (!styleMap || typeof styleMap !== "object" || Array.isArray(styleMap)) {
|
|
73
|
+
return style;
|
|
74
|
+
}
|
|
75
|
+
for (const [key, value] of Object.entries(styleMap)) {
|
|
76
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
77
|
+
Reflect.set(style, key, value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return style;
|
|
81
|
+
}
|
|
82
|
+
const rootStyle = computed(() => ({
|
|
83
|
+
gap: `calc(${displayConfig.value.gap ?? defaultConfig.gap ?? 12} * 0.25rem)`,
|
|
84
|
+
...getConfigStyle(displayConfig.value)
|
|
85
|
+
}));
|
|
86
|
+
function getButtonLabel(button) {
|
|
87
|
+
return getLocalizedText(button.title, locale.value) ?? t("untitled-button");
|
|
88
|
+
}
|
|
89
|
+
function getDropdownLabel(dropdown) {
|
|
90
|
+
return getLocalizedText(dropdown.title, locale.value) ?? t("untitled-dropdown");
|
|
91
|
+
}
|
|
92
|
+
function getButtonTooltip(button) {
|
|
93
|
+
return getLocalizedText(button.tooltip, locale.value);
|
|
94
|
+
}
|
|
95
|
+
function getButtonEffect(buttonId) {
|
|
96
|
+
return Reflect.get(attrs, buttonId);
|
|
97
|
+
}
|
|
98
|
+
function isEffectValue(value) {
|
|
99
|
+
return typeof value === "object" && value !== null && "_op" in value;
|
|
100
|
+
}
|
|
101
|
+
function isPending(buttonId) {
|
|
102
|
+
return pendingIds.value.includes(buttonId);
|
|
103
|
+
}
|
|
104
|
+
function isButtonDisabled(buttonId) {
|
|
105
|
+
return isPending(buttonId) || !isEffectValue(getButtonEffect(buttonId));
|
|
106
|
+
}
|
|
107
|
+
function isDropdownPending(dropdown) {
|
|
108
|
+
return dropdown.items.some((item) => isPending(item.id));
|
|
109
|
+
}
|
|
110
|
+
function hasButtonTooltip(button) {
|
|
111
|
+
return hasVisibleLocaleValue(button.tooltip);
|
|
112
|
+
}
|
|
113
|
+
async function runButton(buttonId) {
|
|
114
|
+
if (isPending(buttonId)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const effect = getButtonEffect(buttonId);
|
|
118
|
+
if (!isEffectValue(effect)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
pendingIds.value = [...pendingIds.value, buttonId];
|
|
122
|
+
try {
|
|
123
|
+
await Effect.runPromise(Effect.scoped(effect));
|
|
124
|
+
} finally {
|
|
125
|
+
pendingIds.value = pendingIds.value.filter((id) => id !== buttonId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function handleConfiguratorConfirm(nextConfig) {
|
|
129
|
+
displayConfig.value = nextConfig;
|
|
130
|
+
emit("update:config", nextConfig);
|
|
131
|
+
}
|
|
132
|
+
function isDropdownItem(item) {
|
|
133
|
+
return "items" in item;
|
|
134
|
+
}
|
|
135
|
+
</script>
|
|
136
|
+
|
|
137
|
+
<script>
|
|
138
|
+
export { ButtonActionC, ButtonConfigC, ButtonConfigInputC, ButtonDropdownC, ButtonGroupC, ButtonsStyleC } from "./schema";
|
|
139
|
+
</script>
|
|
140
|
+
|
|
141
|
+
<template>
|
|
142
|
+
<div
|
|
143
|
+
v-bind="rootAttrs"
|
|
144
|
+
data-slot="buttons"
|
|
145
|
+
:class="cn('relative flex flex-wrap items-start', rootClass)"
|
|
146
|
+
:style="rootStyle"
|
|
147
|
+
>
|
|
148
|
+
<Button
|
|
149
|
+
v-if="isCheating"
|
|
150
|
+
data-slot="buttons-configurator-trigger"
|
|
151
|
+
variant="ghost"
|
|
152
|
+
size="sm"
|
|
153
|
+
type="button"
|
|
154
|
+
class="absolute right-0 top-0 z-20 bg-white/90 shadow-xs backdrop-blur-sm hover:bg-white"
|
|
155
|
+
@click="isConfiguratorOpen = true"
|
|
156
|
+
>
|
|
157
|
+
<Icon icon="fluent:settings-20-regular" />
|
|
158
|
+
</Button>
|
|
159
|
+
|
|
160
|
+
<ButtonConfiguratorDialog
|
|
161
|
+
v-if="currentConfig"
|
|
162
|
+
v-model:open="isConfiguratorOpen"
|
|
163
|
+
:config="displayConfig"
|
|
164
|
+
@confirm="handleConfiguratorConfirm"
|
|
165
|
+
/>
|
|
166
|
+
|
|
167
|
+
<Skeleton
|
|
168
|
+
v-if="currentConfig === void 0"
|
|
169
|
+
data-slot="buttons-skeleton"
|
|
170
|
+
class="absolute inset-0 z-10 h-full w-full"
|
|
171
|
+
/>
|
|
172
|
+
|
|
173
|
+
<ButtonGroup
|
|
174
|
+
v-for="group in displayConfig.groups"
|
|
175
|
+
:key="group.id"
|
|
176
|
+
data-slot="buttons-group"
|
|
177
|
+
orientation="horizontal"
|
|
178
|
+
>
|
|
179
|
+
<template
|
|
180
|
+
v-for="item in group.items"
|
|
181
|
+
:key="item.id"
|
|
182
|
+
>
|
|
183
|
+
<Button
|
|
184
|
+
v-if="!isDropdownItem(item) && !hasButtonTooltip(item)"
|
|
185
|
+
data-slot="buttons-item"
|
|
186
|
+
:variant="item.variant"
|
|
187
|
+
:disabled="isButtonDisabled(item.id)"
|
|
188
|
+
:title="item.hideTitle ? getButtonLabel(item) : void 0"
|
|
189
|
+
@click="void runButton(item.id)"
|
|
190
|
+
>
|
|
191
|
+
<Icon
|
|
192
|
+
v-if="isPending(item.id)"
|
|
193
|
+
icon="line-md:loading-twotone-loop"
|
|
194
|
+
/>
|
|
195
|
+
<Icon
|
|
196
|
+
v-else-if="item.icon"
|
|
197
|
+
:icon="item.icon"
|
|
198
|
+
/>
|
|
199
|
+
<span v-if="!item.hideTitle">{{ getButtonLabel(item) }}</span>
|
|
200
|
+
</Button>
|
|
201
|
+
|
|
202
|
+
<Tooltip
|
|
203
|
+
v-else-if="!isDropdownItem(item)"
|
|
204
|
+
:delay-duration="180"
|
|
205
|
+
>
|
|
206
|
+
<TooltipTrigger as-child>
|
|
207
|
+
<Button
|
|
208
|
+
data-slot="buttons-item"
|
|
209
|
+
:variant="item.variant"
|
|
210
|
+
:disabled="isButtonDisabled(item.id)"
|
|
211
|
+
:title="item.hideTitle ? getButtonLabel(item) : void 0"
|
|
212
|
+
@click="void runButton(item.id)"
|
|
213
|
+
>
|
|
214
|
+
<Icon
|
|
215
|
+
v-if="isPending(item.id)"
|
|
216
|
+
icon="line-md:loading-twotone-loop"
|
|
217
|
+
/>
|
|
218
|
+
<Icon
|
|
219
|
+
v-else-if="item.icon"
|
|
220
|
+
:icon="item.icon"
|
|
221
|
+
/>
|
|
222
|
+
<span v-if="!item.hideTitle">{{ getButtonLabel(item) }}</span>
|
|
223
|
+
</Button>
|
|
224
|
+
</TooltipTrigger>
|
|
225
|
+
<TooltipContent
|
|
226
|
+
data-slot="buttons-tooltip-content"
|
|
227
|
+
align="center"
|
|
228
|
+
side="top"
|
|
229
|
+
>
|
|
230
|
+
{{ getButtonTooltip(item) }}
|
|
231
|
+
</TooltipContent>
|
|
232
|
+
</Tooltip>
|
|
233
|
+
|
|
234
|
+
<DropdownMenu v-else>
|
|
235
|
+
<DropdownMenuTrigger as-child>
|
|
236
|
+
<Button
|
|
237
|
+
data-slot="buttons-dropdown-trigger"
|
|
238
|
+
:disabled="isDropdownPending(item)"
|
|
239
|
+
>
|
|
240
|
+
<Icon
|
|
241
|
+
v-if="isDropdownPending(item)"
|
|
242
|
+
icon="line-md:loading-twotone-loop"
|
|
243
|
+
/>
|
|
244
|
+
<Icon
|
|
245
|
+
v-else-if="item.icon"
|
|
246
|
+
:icon="item.icon"
|
|
247
|
+
/>
|
|
248
|
+
<span>{{ getDropdownLabel(item) }}</span>
|
|
249
|
+
</Button>
|
|
250
|
+
</DropdownMenuTrigger>
|
|
251
|
+
|
|
252
|
+
<DropdownMenuContent align="start">
|
|
253
|
+
<template
|
|
254
|
+
v-for="child in item.items"
|
|
255
|
+
:key="child.id"
|
|
256
|
+
>
|
|
257
|
+
<DropdownMenuItem
|
|
258
|
+
v-if="!hasButtonTooltip(child)"
|
|
259
|
+
data-slot="buttons-dropdown-item"
|
|
260
|
+
:disabled="isButtonDisabled(child.id)"
|
|
261
|
+
@select="void runButton(child.id)"
|
|
262
|
+
>
|
|
263
|
+
<Icon
|
|
264
|
+
v-if="isPending(child.id)"
|
|
265
|
+
icon="line-md:loading-twotone-loop"
|
|
266
|
+
/>
|
|
267
|
+
<Icon
|
|
268
|
+
v-else-if="child.icon"
|
|
269
|
+
:icon="child.icon"
|
|
270
|
+
/>
|
|
271
|
+
<span>{{ getButtonLabel(child) }}</span>
|
|
272
|
+
</DropdownMenuItem>
|
|
273
|
+
|
|
274
|
+
<Tooltip
|
|
275
|
+
v-else
|
|
276
|
+
:delay-duration="180"
|
|
277
|
+
>
|
|
278
|
+
<TooltipTrigger as-child>
|
|
279
|
+
<DropdownMenuItem
|
|
280
|
+
data-slot="buttons-dropdown-item"
|
|
281
|
+
:disabled="isButtonDisabled(child.id)"
|
|
282
|
+
@select="void runButton(child.id)"
|
|
283
|
+
>
|
|
284
|
+
<Icon
|
|
285
|
+
v-if="isPending(child.id)"
|
|
286
|
+
icon="line-md:loading-twotone-loop"
|
|
287
|
+
/>
|
|
288
|
+
<Icon
|
|
289
|
+
v-else-if="child.icon"
|
|
290
|
+
:icon="child.icon"
|
|
291
|
+
/>
|
|
292
|
+
<span>{{ getButtonLabel(child) }}</span>
|
|
293
|
+
</DropdownMenuItem>
|
|
294
|
+
</TooltipTrigger>
|
|
295
|
+
<TooltipContent
|
|
296
|
+
data-slot="buttons-tooltip-content"
|
|
297
|
+
align="center"
|
|
298
|
+
side="top"
|
|
299
|
+
>
|
|
300
|
+
{{ getButtonTooltip(child) }}
|
|
301
|
+
</TooltipContent>
|
|
302
|
+
</Tooltip>
|
|
303
|
+
</template>
|
|
304
|
+
</DropdownMenuContent>
|
|
305
|
+
</DropdownMenu>
|
|
306
|
+
</template>
|
|
307
|
+
</ButtonGroup>
|
|
308
|
+
</div>
|
|
309
|
+
</template>
|
|
310
|
+
|
|
311
|
+
<i18n lang="json">
|
|
312
|
+
{
|
|
313
|
+
"zh": {
|
|
314
|
+
"untitled-button": "未命名按钮",
|
|
315
|
+
"untitled-dropdown": "未命名下拉按钮"
|
|
316
|
+
},
|
|
317
|
+
"en": {
|
|
318
|
+
"untitled-button": "Untitled button",
|
|
319
|
+
"untitled-dropdown": "Untitled dropdown"
|
|
320
|
+
},
|
|
321
|
+
"ja": {
|
|
322
|
+
"untitled-button": "未命名ボタン",
|
|
323
|
+
"untitled-dropdown": "未命名ドロップダウン"
|
|
324
|
+
},
|
|
325
|
+
"ko": {
|
|
326
|
+
"untitled-button": "이름 없는 버튼",
|
|
327
|
+
"untitled-dropdown": "이름 없는 드롭다운"
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
</i18n>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { type ButtonConfig } from './schema.js';
|
|
3
|
+
export { ButtonActionC, ButtonConfigC, ButtonConfigInputC, ButtonDropdownC, ButtonGroupC, ButtonsStyleC } from './schema.js';
|
|
4
|
+
export type { ButtonAction, ButtonConfig, ButtonConfigInput, ButtonDropdown, ButtonGroup, ButtonGroupItem } from './schema.js';
|
|
5
|
+
declare const _default: typeof __VLS_export;
|
|
6
|
+
export default _default;
|
|
7
|
+
declare const __VLS_export: import("vue").DefineComponent<{
|
|
8
|
+
config: Effect.Effect<ButtonConfig | import("./schema.js").ButtonConfigInput | undefined>;
|
|
9
|
+
}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
10
|
+
"update:config": (args_0: Readonly<{
|
|
11
|
+
groups: readonly Readonly<{
|
|
12
|
+
id: string;
|
|
13
|
+
items: readonly (Readonly<{
|
|
14
|
+
id: string;
|
|
15
|
+
title: readonly {
|
|
16
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
17
|
+
message: string;
|
|
18
|
+
}[];
|
|
19
|
+
tooltip?: readonly {
|
|
20
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
21
|
+
message: string;
|
|
22
|
+
}[] | undefined;
|
|
23
|
+
icon?: string | undefined;
|
|
24
|
+
variant?: "default" | "destructive" | "primary" | "ghost" | undefined;
|
|
25
|
+
hideTitle?: boolean | undefined;
|
|
26
|
+
}> | Readonly<{
|
|
27
|
+
id: string;
|
|
28
|
+
title: readonly {
|
|
29
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
30
|
+
message: string;
|
|
31
|
+
}[];
|
|
32
|
+
items: readonly Readonly<{
|
|
33
|
+
id: string;
|
|
34
|
+
title: readonly {
|
|
35
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
36
|
+
message: string;
|
|
37
|
+
}[];
|
|
38
|
+
tooltip?: readonly {
|
|
39
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
40
|
+
message: string;
|
|
41
|
+
}[] | undefined;
|
|
42
|
+
icon?: string | undefined;
|
|
43
|
+
variant?: "default" | "destructive" | "primary" | "ghost" | undefined;
|
|
44
|
+
}>[];
|
|
45
|
+
icon?: string | undefined;
|
|
46
|
+
}>)[];
|
|
47
|
+
}>[];
|
|
48
|
+
gap?: number | undefined;
|
|
49
|
+
style?: string | undefined;
|
|
50
|
+
}>) => any;
|
|
51
|
+
}, string, import("vue").PublicProps, Readonly<{
|
|
52
|
+
config: Effect.Effect<ButtonConfig | import("./schema.js").ButtonConfigInput | undefined>;
|
|
53
|
+
}> & Readonly<{
|
|
54
|
+
"onUpdate:config"?: ((args_0: Readonly<{
|
|
55
|
+
groups: readonly Readonly<{
|
|
56
|
+
id: string;
|
|
57
|
+
items: readonly (Readonly<{
|
|
58
|
+
id: string;
|
|
59
|
+
title: readonly {
|
|
60
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
61
|
+
message: string;
|
|
62
|
+
}[];
|
|
63
|
+
tooltip?: readonly {
|
|
64
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
65
|
+
message: string;
|
|
66
|
+
}[] | undefined;
|
|
67
|
+
icon?: string | undefined;
|
|
68
|
+
variant?: "default" | "destructive" | "primary" | "ghost" | undefined;
|
|
69
|
+
hideTitle?: boolean | undefined;
|
|
70
|
+
}> | Readonly<{
|
|
71
|
+
id: string;
|
|
72
|
+
title: readonly {
|
|
73
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
74
|
+
message: string;
|
|
75
|
+
}[];
|
|
76
|
+
items: readonly Readonly<{
|
|
77
|
+
id: string;
|
|
78
|
+
title: readonly {
|
|
79
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
80
|
+
message: string;
|
|
81
|
+
}[];
|
|
82
|
+
tooltip?: readonly {
|
|
83
|
+
locale: "zh" | "ja" | "en" | "ko";
|
|
84
|
+
message: string;
|
|
85
|
+
}[] | undefined;
|
|
86
|
+
icon?: string | undefined;
|
|
87
|
+
variant?: "default" | "destructive" | "primary" | "ghost" | undefined;
|
|
88
|
+
}>[];
|
|
89
|
+
icon?: string | undefined;
|
|
90
|
+
}>)[];
|
|
91
|
+
}>[];
|
|
92
|
+
gap?: number | undefined;
|
|
93
|
+
style?: string | undefined;
|
|
94
|
+
}>) => any) | undefined;
|
|
95
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|