@byyuurin/ui 0.0.10 → 0.0.11
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 +2 -2
- package/dist/module.json +3 -3
- package/dist/module.mjs +1 -1
- package/dist/module.mjs.map +1 -1
- package/dist/runtime/app/injections.d.ts +388 -364
- package/dist/runtime/components/Accordion.vue +38 -67
- package/dist/runtime/components/Accordion.vue.d.ts +52 -0
- package/dist/runtime/components/Alert.vue +37 -75
- package/dist/runtime/components/Alert.vue.d.ts +59 -0
- package/dist/runtime/components/App.vue +25 -40
- package/dist/runtime/components/App.vue.d.ts +24 -0
- package/dist/runtime/components/Avatar.vue +31 -51
- package/dist/runtime/components/Avatar.vue.d.ts +25 -0
- package/dist/runtime/components/AvatarGroup.vue +38 -69
- package/dist/runtime/components/AvatarGroup.vue.d.ts +27 -0
- package/dist/runtime/components/Badge.vue +25 -51
- package/dist/runtime/components/Badge.vue.d.ts +44 -0
- package/dist/runtime/components/Breadcrumb.vue +36 -74
- package/dist/runtime/components/Breadcrumb.vue.d.ts +52 -0
- package/dist/runtime/components/Button.vue +62 -51
- package/dist/runtime/components/Button.vue.d.ts +29 -0
- package/dist/runtime/components/ButtonGroup.vue +17 -37
- package/dist/runtime/components/ButtonGroup.vue.d.ts +26 -0
- package/dist/runtime/components/Calendar.vue +75 -110
- package/dist/runtime/components/Calendar.vue.d.ts +75 -0
- package/dist/runtime/components/Card.vue +25 -42
- package/dist/runtime/components/Card.vue.d.ts +30 -0
- package/dist/runtime/components/Carousel.vue +118 -225
- package/dist/runtime/components/Carousel.vue.d.ts +104 -0
- package/dist/runtime/components/Checkbox.vue +46 -73
- package/dist/runtime/components/Checkbox.vue.d.ts +56 -0
- package/dist/runtime/components/Chip.vue +31 -48
- package/dist/runtime/components/Chip.vue.d.ts +30 -0
- package/dist/runtime/components/Collapsible.vue +22 -30
- package/dist/runtime/components/Collapsible.vue.d.ts +26 -0
- package/dist/runtime/components/Drawer.vue +51 -101
- package/dist/runtime/components/Drawer.vue.d.ts +80 -0
- package/dist/runtime/components/DropdownMenu.vue +37 -115
- package/dist/runtime/components/DropdownMenu.vue.d.ts +99 -0
- package/dist/runtime/components/DropdownMenuContent.vue +81 -77
- package/dist/runtime/components/DropdownMenuContent.vue.d.ts +39 -0
- package/dist/runtime/components/Form.vue +140 -254
- package/dist/runtime/components/Form.vue.d.ts +78 -0
- package/dist/runtime/components/FormItem.vue +50 -89
- package/dist/runtime/components/FormItem.vue.d.ts +60 -0
- package/dist/runtime/components/Input.vue +79 -115
- package/dist/runtime/components/Input.vue.d.ts +64 -0
- package/dist/runtime/components/InputNumber.vue +74 -117
- package/dist/runtime/components/InputNumber.vue.d.ts +245 -0
- package/dist/runtime/components/Kbd.vue +18 -39
- package/dist/runtime/components/Kbd.vue.d.ts +28 -0
- package/dist/runtime/components/Link.vue +168 -257
- package/dist/runtime/components/Link.vue.d.ts +95 -0
- package/dist/runtime/components/LinkBase.vue +36 -54
- package/dist/runtime/components/LinkBase.vue.d.ts +28 -0
- package/dist/runtime/components/Modal.vue +49 -84
- package/dist/runtime/components/Modal.vue.d.ts +66 -0
- package/dist/runtime/components/OverlayProvider.vue +10 -14
- package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -0
- package/dist/runtime/components/Pagination.vue +55 -121
- package/dist/runtime/components/Pagination.vue.d.ts +93 -0
- package/dist/runtime/components/PinInput.vue +49 -58
- package/dist/runtime/components/PinInput.vue.d.ts +35 -0
- package/dist/runtime/components/Popover.vue +39 -68
- package/dist/runtime/components/Popover.vue.d.ts +45 -0
- package/dist/runtime/components/Progress.vue +68 -120
- package/dist/runtime/components/Progress.vue.d.ts +54 -0
- package/dist/runtime/components/RadioGroup.vue +67 -125
- package/dist/runtime/components/RadioGroup.vue.d.ts +74 -0
- package/dist/runtime/components/ScrollArea.vue +31 -31
- package/dist/runtime/components/ScrollArea.vue.d.ts +17 -0
- package/dist/runtime/components/Select.vue +114 -204
- package/dist/runtime/components/Select.vue.d.ts +119 -0
- package/dist/runtime/components/Separator.vue +26 -44
- package/dist/runtime/components/Separator.vue.d.ts +27 -0
- package/dist/runtime/components/Skeleton.vue +12 -21
- package/dist/runtime/components/Skeleton.vue.d.ts +19 -0
- package/dist/runtime/components/Slider.vue +52 -74
- package/dist/runtime/components/Slider.vue.d.ts +36 -0
- package/dist/runtime/components/Switch.vue +51 -71
- package/dist/runtime/components/Switch.vue.d.ts +49 -0
- package/dist/runtime/components/Table.vue +108 -194
- package/dist/runtime/components/Table.vue.d.ts +148 -0
- package/dist/runtime/components/Tabs.vue +36 -81
- package/dist/runtime/components/Tabs.vue.d.ts +65 -0
- package/dist/runtime/components/Textarea.vue +77 -124
- package/dist/runtime/components/Textarea.vue.d.ts +60 -0
- package/dist/runtime/components/Toast.vue +47 -75
- package/dist/runtime/components/Toast.vue.d.ts +131 -0
- package/dist/runtime/components/ToastProvider.vue +65 -101
- package/dist/runtime/components/ToastProvider.vue.d.ts +38 -0
- package/dist/runtime/components/Tooltip.vue +36 -47
- package/dist/runtime/components/Tooltip.vue.d.ts +31 -0
- package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
- package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
- package/dist/runtime/composables/useFormItem.d.ts +2 -2
- package/dist/runtime/composables/useKbd.d.ts +1 -1
- package/dist/runtime/composables/useLocale.d.ts +3 -3
- package/dist/runtime/composables/useTheme.d.ts +1 -1
- package/dist/runtime/composables/useToast.d.ts +1 -1
- package/dist/runtime/locale/en.d.ts +1 -1
- package/dist/runtime/locale/zh-tw.d.ts +1 -1
- package/dist/runtime/theme/accordion.d.ts +45 -51
- package/dist/runtime/theme/accordion.js +1 -1
- package/dist/runtime/theme/alert.d.ts +115 -121
- package/dist/runtime/theme/alert.js +1 -1
- package/dist/runtime/theme/avatar-group.d.ts +42 -48
- package/dist/runtime/theme/avatar-group.js +1 -1
- package/dist/runtime/theme/avatar.d.ts +46 -52
- package/dist/runtime/theme/avatar.js +1 -1
- package/dist/runtime/theme/badge.d.ts +60 -66
- package/dist/runtime/theme/badge.js +1 -1
- package/dist/runtime/theme/breadcrumb.d.ts +52 -58
- package/dist/runtime/theme/breadcrumb.js +1 -1
- package/dist/runtime/theme/button-group.d.ts +36 -42
- package/dist/runtime/theme/button.d.ts +162 -168
- package/dist/runtime/theme/button.js +1 -1
- package/dist/runtime/theme/calendar.d.ts +52 -50
- package/dist/runtime/theme/calendar.js +20 -3
- package/dist/runtime/theme/card.d.ts +52 -58
- package/dist/runtime/theme/card.js +1 -1
- package/dist/runtime/theme/carousel.d.ts +98 -104
- package/dist/runtime/theme/carousel.js +1 -1
- package/dist/runtime/theme/checkbox.d.ts +77 -83
- package/dist/runtime/theme/checkbox.js +1 -1
- package/dist/runtime/theme/chip.d.ts +50 -56
- package/dist/runtime/theme/chip.js +1 -1
- package/dist/runtime/theme/collapsible.d.ts +29 -35
- package/dist/runtime/theme/collapsible.js +1 -1
- package/dist/runtime/theme/drawer.d.ts +120 -126
- package/dist/runtime/theme/drawer.js +1 -1
- package/dist/runtime/theme/dropdown-menu.d.ts +55 -61
- package/dist/runtime/theme/dropdown-menu.js +1 -1
- package/dist/runtime/theme/form-item.d.ts +63 -69
- package/dist/runtime/theme/form-item.js +1 -1
- package/dist/runtime/theme/form.d.ts +1 -7
- package/dist/runtime/theme/input-number.d.ts +98 -104
- package/dist/runtime/theme/input-number.js +1 -1
- package/dist/runtime/theme/input.d.ts +153 -159
- package/dist/runtime/theme/input.js +1 -1
- package/dist/runtime/theme/kbd.d.ts +30 -36
- package/dist/runtime/theme/link.d.ts +37 -43
- package/dist/runtime/theme/modal.d.ts +36 -42
- package/dist/runtime/theme/modal.js +1 -1
- package/dist/runtime/theme/pagination.d.ts +71 -77
- package/dist/runtime/theme/pagination.js +1 -1
- package/dist/runtime/theme/pinInput.d.ts +80 -86
- package/dist/runtime/theme/pinInput.js +1 -1
- package/dist/runtime/theme/popover.d.ts +29 -35
- package/dist/runtime/theme/popover.js +1 -1
- package/dist/runtime/theme/progress.d.ts +163 -169
- package/dist/runtime/theme/progress.js +1 -1
- package/dist/runtime/theme/radio-group.d.ts +99 -105
- package/dist/runtime/theme/radio-group.js +1 -1
- package/dist/runtime/theme/scroll-area.d.ts +62 -68
- package/dist/runtime/theme/scroll-area.js +1 -1
- package/dist/runtime/theme/select.d.ts +165 -171
- package/dist/runtime/theme/select.js +1 -1
- package/dist/runtime/theme/separator.d.ts +62 -68
- package/dist/runtime/theme/separator.js +1 -1
- package/dist/runtime/theme/skeleton.d.ts +1 -7
- package/dist/runtime/theme/slider.d.ts +62 -68
- package/dist/runtime/theme/slider.js +1 -1
- package/dist/runtime/theme/switch.d.ts +111 -117
- package/dist/runtime/theme/switch.js +1 -1
- package/dist/runtime/theme/table.d.ts +75 -81
- package/dist/runtime/theme/table.js +1 -1
- package/dist/runtime/theme/tabs.d.ts +114 -120
- package/dist/runtime/theme/tabs.js +1 -1
- package/dist/runtime/theme/textarea.d.ts +76 -82
- package/dist/runtime/theme/textarea.js +1 -1
- package/dist/runtime/theme/toast-provider.d.ts +106 -112
- package/dist/runtime/theme/toast-provider.js +1 -1
- package/dist/runtime/theme/toast.d.ts +74 -80
- package/dist/runtime/theme/toast.js +1 -1
- package/dist/runtime/theme/tooltip.d.ts +35 -41
- package/dist/runtime/theme/tooltip.js +1 -1
- package/dist/runtime/types/utils.d.ts +5 -5
- package/dist/runtime/utils/link.d.ts +3 -5
- package/dist/runtime/utils/styler.d.ts +2 -2
- package/dist/runtime/utils/styler.js +2 -2
- package/dist/shared/ui.D1BTWZFB.mjs +5 -0
- package/dist/shared/ui.D1BTWZFB.mjs.map +1 -0
- package/dist/types.d.mts +1 -1
- package/dist/unocss.mjs +5 -4
- package/dist/unocss.mjs.map +1 -1
- package/dist/unplugin.mjs +1 -1
- package/dist/unplugin.mjs.map +1 -1
- package/dist/vite.mjs +1 -1
- package/package.json +77 -75
- package/dist/module.cjs +0 -5
- package/dist/shared/ui.3e7fad19.mjs +0 -5
- package/dist/shared/ui.3e7fad19.mjs.map +0 -1
- package/dist/types.d.ts +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { VariantProps } from '@byyuurin/ui-kit';
|
|
2
|
+
import type { DialogContentEmits, DialogContentProps, DialogRootEmits, DialogRootProps } from 'reka-ui';
|
|
3
|
+
import type { drawer } from '../theme/index.js';
|
|
4
|
+
import type { ButtonProps, ComponentAttrs, EmitsToProps } from '../types/index.js';
|
|
5
|
+
export interface DrawerEmits extends DialogRootEmits {
|
|
6
|
+
'after-leave': [];
|
|
7
|
+
}
|
|
8
|
+
export interface DrawerSlots {
|
|
9
|
+
default?: any;
|
|
10
|
+
content?: any;
|
|
11
|
+
header?: any;
|
|
12
|
+
title?: any;
|
|
13
|
+
description?: any;
|
|
14
|
+
close?: (props: {
|
|
15
|
+
ui: ComponentAttrs<typeof drawer>['ui'];
|
|
16
|
+
}) => any;
|
|
17
|
+
body?: any;
|
|
18
|
+
footer?: any;
|
|
19
|
+
}
|
|
20
|
+
type DrawerVariants = VariantProps<typeof drawer>;
|
|
21
|
+
export interface DrawerProps extends ComponentAttrs<typeof drawer>, DialogRootProps {
|
|
22
|
+
title?: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
/** The content of the drawer. */
|
|
25
|
+
content?: Omit<DialogContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DialogContentEmits>>;
|
|
26
|
+
/**
|
|
27
|
+
* Render an overlay behind the drawer.
|
|
28
|
+
* @default true
|
|
29
|
+
*/
|
|
30
|
+
overlay?: boolean;
|
|
31
|
+
/** @default true */
|
|
32
|
+
transition?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* The direction of the drawer.
|
|
35
|
+
* @default "bottom"
|
|
36
|
+
*/
|
|
37
|
+
direction?: DrawerVariants['direction'];
|
|
38
|
+
/**
|
|
39
|
+
* Whether to inset the drawer from the edges.
|
|
40
|
+
*/
|
|
41
|
+
inset?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Render the drawer in a portal.
|
|
44
|
+
* @default true
|
|
45
|
+
*/
|
|
46
|
+
portal?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Display a close button to dismiss the drawer.
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
close?: ButtonProps | boolean;
|
|
52
|
+
/** @default app.icons.close */
|
|
53
|
+
closeIcon?: string;
|
|
54
|
+
/**
|
|
55
|
+
* When `false`, the drawer will not close when clicking outside or pressing escape.
|
|
56
|
+
* @default true
|
|
57
|
+
*/
|
|
58
|
+
dismissible?: boolean;
|
|
59
|
+
}
|
|
60
|
+
declare const _default: __VLS_WithSlots<import("vue").DefineComponent<DrawerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
61
|
+
"update:open": (value: boolean) => any;
|
|
62
|
+
"after-leave": () => any;
|
|
63
|
+
}, string, import("vue").PublicProps, Readonly<DrawerProps> & Readonly<{
|
|
64
|
+
"onUpdate:open"?: ((value: boolean) => any) | undefined;
|
|
65
|
+
"onAfter-leave"?: (() => any) | undefined;
|
|
66
|
+
}>, {
|
|
67
|
+
close: ButtonProps | boolean;
|
|
68
|
+
overlay: boolean;
|
|
69
|
+
direction: "top" | "bottom" | "left" | "right";
|
|
70
|
+
transition: boolean;
|
|
71
|
+
modal: boolean;
|
|
72
|
+
portal: boolean;
|
|
73
|
+
dismissible: boolean;
|
|
74
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, DrawerSlots>;
|
|
75
|
+
export default _default;
|
|
76
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
77
|
+
new (): {
|
|
78
|
+
$slots: S;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
@@ -1,118 +1,39 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import type { VariantProps } from '@byyuurin/ui-kit'
|
|
3
|
-
import type { DropdownMenuArrowProps, DropdownMenuContentEmits, DropdownMenuContentProps, DropdownMenuRootEmits, DropdownMenuRootProps } from 'reka-ui'
|
|
4
|
-
import type { dropdownMenu } from '../theme'
|
|
5
|
-
import type { ArrayOrNested, AvatarProps, ComponentAttrs, DynamicSlots, EmitsToProps, KbdProps, LinkProps, MergeTypes, NestedItem } from '../types'
|
|
1
|
+
<script>
|
|
6
2
|
|
|
7
|
-
export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom' | 'underline'> {
|
|
8
|
-
icon?: string
|
|
9
|
-
avatar?: AvatarProps
|
|
10
|
-
content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>
|
|
11
|
-
kbds?: Array<string | KbdProps['value']>
|
|
12
|
-
/**
|
|
13
|
-
* The item type.
|
|
14
|
-
* @default 'link'
|
|
15
|
-
*/
|
|
16
|
-
type?: 'label' | 'separator' | 'link' | 'checkbox'
|
|
17
|
-
slot?: string
|
|
18
|
-
loading?: boolean
|
|
19
|
-
disabled?: boolean
|
|
20
|
-
checked?: boolean
|
|
21
|
-
open?: boolean
|
|
22
|
-
defaultOpen?: boolean
|
|
23
|
-
children?: ArrayOrNested<DropdownMenuItem>
|
|
24
|
-
onSelect?: (e: Event) => void
|
|
25
|
-
onUpdateChecked?: (checked: boolean) => void
|
|
26
|
-
[key: string]: any
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
type SlotProps<T extends DropdownMenuItem> = (props: { item: T, active?: boolean, index: number }) => any
|
|
30
|
-
|
|
31
|
-
export type DropdownMenuSlots<
|
|
32
|
-
T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>,
|
|
33
|
-
I extends NestedItem<T> = NestedItem<T>,
|
|
34
|
-
> = {
|
|
35
|
-
'default'?: (props: { open: boolean }) => any
|
|
36
|
-
'item'?: SlotProps<I>
|
|
37
|
-
'item-leading'?: SlotProps<I>
|
|
38
|
-
'item-label'?: SlotProps<I>
|
|
39
|
-
'item-trailing'?: SlotProps<I>
|
|
40
|
-
} & DynamicSlots<MergeTypes<I>, 'leading' | 'label' | 'trailing', SlotProps<I>>
|
|
41
|
-
|
|
42
|
-
export interface DropdownMenuEmits extends DropdownMenuRootEmits {}
|
|
43
|
-
|
|
44
|
-
type DropdownMenuVariants = VariantProps<typeof dropdownMenu>
|
|
45
|
-
|
|
46
|
-
export interface DropdownMenuProps<
|
|
47
|
-
T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>,
|
|
48
|
-
> extends ComponentAttrs<typeof dropdownMenu>, Omit<DropdownMenuRootProps, 'dir'> {
|
|
49
|
-
/** @default "md" */
|
|
50
|
-
size?: DropdownMenuVariants['size']
|
|
51
|
-
items?: T
|
|
52
|
-
/**
|
|
53
|
-
* The icon displayed when an item is checked.
|
|
54
|
-
* @default app.icons.check
|
|
55
|
-
*/
|
|
56
|
-
checkedIcon?: string
|
|
57
|
-
/**
|
|
58
|
-
* The icon displayed when an item is loading.
|
|
59
|
-
* @default app.icons.loading
|
|
60
|
-
*/
|
|
61
|
-
loadingIcon?: string
|
|
62
|
-
/**
|
|
63
|
-
* The icon displayed when the item is an external link.
|
|
64
|
-
* Set to `false` to hide the external icon.
|
|
65
|
-
* @default app.icons.external
|
|
66
|
-
*/
|
|
67
|
-
externalIcon?: boolean | string
|
|
68
|
-
/**
|
|
69
|
-
* The content of the menu.
|
|
70
|
-
* @default { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
|
|
71
|
-
*/
|
|
72
|
-
content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>
|
|
73
|
-
/**
|
|
74
|
-
* Display an arrow alongside the menu.
|
|
75
|
-
* @default false
|
|
76
|
-
*/
|
|
77
|
-
arrow?: boolean | Omit<DropdownMenuArrowProps, 'as' | 'asChild'>
|
|
78
|
-
/**
|
|
79
|
-
* Render the menu in a portal.
|
|
80
|
-
* @default true
|
|
81
|
-
*/
|
|
82
|
-
portal?: boolean
|
|
83
|
-
/**
|
|
84
|
-
* The key used to get the label from the item.
|
|
85
|
-
* @default "label"
|
|
86
|
-
*/
|
|
87
|
-
labelKey?: keyof NestedItem<T>
|
|
88
|
-
disabled?: boolean
|
|
89
|
-
}
|
|
90
3
|
</script>
|
|
91
4
|
|
|
92
|
-
<script setup
|
|
93
|
-
import { reactivePick } from
|
|
94
|
-
import { DropdownMenuArrow, DropdownMenuRoot, DropdownMenuTrigger, useForwardPropsEmits } from
|
|
95
|
-
import { computed, toRef } from
|
|
96
|
-
import { useTheme } from
|
|
97
|
-
import { omit } from
|
|
98
|
-
import DropdownMenuContent from
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
5
|
+
<script setup>
|
|
6
|
+
import { reactivePick } from "@vueuse/core";
|
|
7
|
+
import { DropdownMenuArrow, DropdownMenuRoot, DropdownMenuTrigger, useForwardPropsEmits } from "reka-ui";
|
|
8
|
+
import { computed, toRef } from "vue";
|
|
9
|
+
import { useTheme } from "../composables/useTheme";
|
|
10
|
+
import { omit } from "../utils";
|
|
11
|
+
import DropdownMenuContent from "./DropdownMenuContent.vue";
|
|
12
|
+
const props = defineProps({
|
|
13
|
+
size: { type: null, required: false },
|
|
14
|
+
items: { type: null, required: false },
|
|
15
|
+
checkedIcon: { type: String, required: false },
|
|
16
|
+
loadingIcon: { type: String, required: false },
|
|
17
|
+
externalIcon: { type: [Boolean, String], required: false, default: true },
|
|
18
|
+
content: { type: Object, required: false },
|
|
19
|
+
arrow: { type: [Boolean, Object], required: false },
|
|
20
|
+
portal: { type: Boolean, required: false, default: true },
|
|
21
|
+
labelKey: { type: null, required: false, default: "label" },
|
|
22
|
+
disabled: { type: Boolean, required: false },
|
|
23
|
+
class: { type: null, required: false },
|
|
24
|
+
ui: { type: null, required: false },
|
|
25
|
+
defaultOpen: { type: Boolean, required: false },
|
|
26
|
+
open: { type: Boolean, required: false },
|
|
27
|
+
modal: { type: Boolean, required: false, default: true }
|
|
28
|
+
});
|
|
29
|
+
const emit = defineEmits(["update:open"]);
|
|
30
|
+
const slots = defineSlots();
|
|
31
|
+
const rootProps = useForwardPropsEmits(reactivePick(props, "defaultOpen", "open", "modal"), emit);
|
|
32
|
+
const contentProps = toRef(() => ({ side: "bottom", sideOffset: 8, collisionPadding: 8, ...props.content }));
|
|
33
|
+
const arrowProps = toRef(() => props.arrow);
|
|
34
|
+
const proxySlots = omit(slots, ["default"]);
|
|
35
|
+
const { generateStyle } = useTheme();
|
|
36
|
+
const style = computed(() => generateStyle("dropdownMenu", props));
|
|
116
37
|
</script>
|
|
117
38
|
|
|
118
39
|
<template>
|
|
@@ -123,21 +44,22 @@ const style = computed(() => generateStyle('dropdownMenu', props))
|
|
|
123
44
|
|
|
124
45
|
<DropdownMenuContent
|
|
125
46
|
:class="style.content({ class: [!slots.default && props.class, props.ui?.content] })"
|
|
47
|
+
data-part="content"
|
|
126
48
|
:ui="props.ui"
|
|
127
49
|
v-bind="contentProps"
|
|
128
50
|
:size="props.size"
|
|
129
51
|
:items="props.items"
|
|
130
52
|
:portal="props.portal"
|
|
131
|
-
:label-key="
|
|
53
|
+
:label-key="props.labelKey"
|
|
132
54
|
:checked-icon="props.checkedIcon"
|
|
133
55
|
:loading-icon="props.loadingIcon"
|
|
134
56
|
:external-icon="props.externalIcon"
|
|
135
57
|
>
|
|
136
58
|
<template v-for="(_, name) in proxySlots" #[name]="slotProps">
|
|
137
|
-
<slot :name="
|
|
59
|
+
<slot :name="name" v-bind="slotProps"></slot>
|
|
138
60
|
</template>
|
|
139
61
|
|
|
140
|
-
<DropdownMenuArrow v-if="props.arrow" v-bind="arrowProps" :class="style.arrow({ class: props.ui?.arrow })" />
|
|
62
|
+
<DropdownMenuArrow v-if="props.arrow" v-bind="arrowProps" :class="style.arrow({ class: props.ui?.arrow })" data-part="arrow" />
|
|
141
63
|
</DropdownMenuContent>
|
|
142
64
|
</DropdownMenuRoot>
|
|
143
65
|
</template>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { VariantProps } from '@byyuurin/ui-kit';
|
|
2
|
+
import type { DropdownMenuArrowProps, DropdownMenuContentEmits, DropdownMenuContentProps, DropdownMenuRootEmits, DropdownMenuRootProps } from 'reka-ui';
|
|
3
|
+
import type { dropdownMenu } from '../theme/index.js';
|
|
4
|
+
import type { ArrayOrNested, AvatarProps, ComponentAttrs, DynamicSlots, EmitsToProps, KbdProps, LinkProps, MergeTypes, NestedItem } from '../types/index.js';
|
|
5
|
+
export interface DropdownMenuItem extends Omit<LinkProps, 'type' | 'raw' | 'custom' | 'underline'> {
|
|
6
|
+
icon?: string;
|
|
7
|
+
avatar?: AvatarProps;
|
|
8
|
+
content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
|
|
9
|
+
kbds?: Array<string | KbdProps['value']>;
|
|
10
|
+
/**
|
|
11
|
+
* The item type.
|
|
12
|
+
* @default 'link'
|
|
13
|
+
*/
|
|
14
|
+
type?: 'label' | 'separator' | 'link' | 'checkbox';
|
|
15
|
+
slot?: string;
|
|
16
|
+
loading?: boolean;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
checked?: boolean;
|
|
19
|
+
open?: boolean;
|
|
20
|
+
defaultOpen?: boolean;
|
|
21
|
+
children?: ArrayOrNested<DropdownMenuItem>;
|
|
22
|
+
onSelect?: (e: Event) => void;
|
|
23
|
+
onUpdateChecked?: (checked: boolean) => void;
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
}
|
|
26
|
+
type SlotProps<T extends DropdownMenuItem> = (props: {
|
|
27
|
+
item: T;
|
|
28
|
+
active?: boolean;
|
|
29
|
+
index: number;
|
|
30
|
+
}) => any;
|
|
31
|
+
export type DropdownMenuSlots<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>, I extends NestedItem<T> = NestedItem<T>> = {
|
|
32
|
+
'default'?: (props: {
|
|
33
|
+
open: boolean;
|
|
34
|
+
}) => any;
|
|
35
|
+
'item'?: SlotProps<I>;
|
|
36
|
+
'item-leading'?: SlotProps<I>;
|
|
37
|
+
'item-label'?: SlotProps<I>;
|
|
38
|
+
'item-trailing'?: SlotProps<I>;
|
|
39
|
+
} & DynamicSlots<MergeTypes<I>, 'leading' | 'label' | 'trailing', SlotProps<I>>;
|
|
40
|
+
export interface DropdownMenuEmits extends DropdownMenuRootEmits {
|
|
41
|
+
}
|
|
42
|
+
type DropdownMenuVariants = VariantProps<typeof dropdownMenu>;
|
|
43
|
+
export interface DropdownMenuProps<T extends ArrayOrNested<DropdownMenuItem> = ArrayOrNested<DropdownMenuItem>> extends ComponentAttrs<typeof dropdownMenu>, Omit<DropdownMenuRootProps, 'dir'> {
|
|
44
|
+
/** @default "md" */
|
|
45
|
+
size?: DropdownMenuVariants['size'];
|
|
46
|
+
items?: T;
|
|
47
|
+
/**
|
|
48
|
+
* The icon displayed when an item is checked.
|
|
49
|
+
* @default app.icons.check
|
|
50
|
+
*/
|
|
51
|
+
checkedIcon?: string;
|
|
52
|
+
/**
|
|
53
|
+
* The icon displayed when an item is loading.
|
|
54
|
+
* @default app.icons.loading
|
|
55
|
+
*/
|
|
56
|
+
loadingIcon?: string;
|
|
57
|
+
/**
|
|
58
|
+
* The icon displayed when the item is an external link.
|
|
59
|
+
* Set to `false` to hide the external icon.
|
|
60
|
+
* @default app.icons.external
|
|
61
|
+
*/
|
|
62
|
+
externalIcon?: boolean | string;
|
|
63
|
+
/**
|
|
64
|
+
* The content of the menu.
|
|
65
|
+
* @default { side: 'bottom', sideOffset: 8, collisionPadding: 8 }
|
|
66
|
+
*/
|
|
67
|
+
content?: Omit<DropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> & Partial<EmitsToProps<DropdownMenuContentEmits>>;
|
|
68
|
+
/**
|
|
69
|
+
* Display an arrow alongside the menu.
|
|
70
|
+
* @default false
|
|
71
|
+
*/
|
|
72
|
+
arrow?: boolean | Omit<DropdownMenuArrowProps, 'as' | 'asChild'>;
|
|
73
|
+
/**
|
|
74
|
+
* Render the menu in a portal.
|
|
75
|
+
* @default true
|
|
76
|
+
*/
|
|
77
|
+
portal?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* The key used to get the label from the item.
|
|
80
|
+
* @default "label"
|
|
81
|
+
*/
|
|
82
|
+
labelKey?: keyof NestedItem<T>;
|
|
83
|
+
disabled?: boolean;
|
|
84
|
+
}
|
|
85
|
+
declare const _default: <T extends ArrayOrNested<DropdownMenuItem>>(__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<{
|
|
86
|
+
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
87
|
+
readonly "onUpdate:open"?: ((payload: boolean) => any) | undefined;
|
|
88
|
+
} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onUpdate:open"> & DropdownMenuProps<T> & Partial<{}>> & import("vue").PublicProps;
|
|
89
|
+
expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
|
|
90
|
+
attrs: any;
|
|
91
|
+
slots: DropdownMenuSlots<T, NestedItem<T>>;
|
|
92
|
+
emit: (evt: "update:open", payload: boolean) => void;
|
|
93
|
+
}>) => import("vue").VNode & {
|
|
94
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
95
|
+
};
|
|
96
|
+
export default _default;
|
|
97
|
+
type __VLS_PrettifyLocal<T> = {
|
|
98
|
+
[K in keyof T]: T[K];
|
|
99
|
+
} & {};
|
|
@@ -1,104 +1,106 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import type { VariantProps } from '@byyuurin/ui-kit'
|
|
3
|
-
import type { DropdownMenuContentEmits as RekaDropdownMenuContentEmits, DropdownMenuContentProps as RekaDropdownMenuContentProps } from 'reka-ui'
|
|
4
|
-
import type { dropdownMenu } from '../theme'
|
|
5
|
-
import type { ArrayOrNested, ComponentAttrs, DropdownMenuItem, DropdownMenuSlots, NestedItem } from '../types'
|
|
1
|
+
<script>
|
|
6
2
|
|
|
7
|
-
type ExtractItem<T extends ArrayOrNested<any>> = Extract<NestedItem<T>, { slot: string }>
|
|
8
|
-
|
|
9
|
-
export type DropdownMenuContentSlots<T extends ArrayOrNested<DropdownMenuItem>> = Omit<DropdownMenuSlots<T>, 'default'> & {
|
|
10
|
-
default?: any
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface DropdownMenuContentEmits extends RekaDropdownMenuContentEmits {}
|
|
14
|
-
|
|
15
|
-
type DropdownMenuVariants = VariantProps<typeof dropdownMenu>
|
|
16
|
-
|
|
17
|
-
export interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> extends ComponentAttrs<typeof dropdownMenu>, Omit<RekaDropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> {
|
|
18
|
-
size?: DropdownMenuVariants['size']
|
|
19
|
-
items?: T
|
|
20
|
-
portal?: boolean
|
|
21
|
-
sub?: boolean
|
|
22
|
-
labelKey: keyof NestedItem<T>
|
|
23
|
-
checkedIcon?: string
|
|
24
|
-
loadingIcon?: string
|
|
25
|
-
externalIcon?: boolean | string
|
|
26
|
-
}
|
|
27
3
|
</script>
|
|
28
4
|
|
|
29
|
-
<script setup
|
|
30
|
-
import { createReusableTemplate, reactiveOmit } from
|
|
31
|
-
import { useForwardPropsEmits } from
|
|
32
|
-
import { DropdownMenu } from
|
|
33
|
-
import { computed } from
|
|
34
|
-
import { useTheme } from
|
|
35
|
-
import { get, isArrayOfArray, omit } from
|
|
36
|
-
import { pickLinkProps } from
|
|
37
|
-
import Avatar from
|
|
38
|
-
|
|
39
|
-
import
|
|
40
|
-
import
|
|
41
|
-
import
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
5
|
+
<script setup>
|
|
6
|
+
import { createReusableTemplate, reactiveOmit } from "@vueuse/core";
|
|
7
|
+
import { useForwardPropsEmits } from "reka-ui";
|
|
8
|
+
import { DropdownMenu } from "reka-ui/namespaced";
|
|
9
|
+
import { computed } from "vue";
|
|
10
|
+
import { useTheme } from "../composables/useTheme";
|
|
11
|
+
import { get, isArrayOfArray, omit } from "../utils";
|
|
12
|
+
import { pickLinkProps } from "../utils/link";
|
|
13
|
+
import Avatar from "./Avatar.vue";
|
|
14
|
+
import DropdownMenuContent from "./DropdownMenuContent.vue";
|
|
15
|
+
import Kbd from "./Kbd.vue";
|
|
16
|
+
import Link from "./Link.vue";
|
|
17
|
+
import LinkBase from "./LinkBase.vue";
|
|
18
|
+
defineOptions({
|
|
19
|
+
inheritAttrs: false
|
|
20
|
+
});
|
|
21
|
+
const props = defineProps({
|
|
22
|
+
size: { type: null, required: false },
|
|
23
|
+
items: { type: null, required: false },
|
|
24
|
+
portal: { type: Boolean, required: false },
|
|
25
|
+
sub: { type: Boolean, required: false },
|
|
26
|
+
labelKey: { type: null, required: true },
|
|
27
|
+
checkedIcon: { type: String, required: false },
|
|
28
|
+
loadingIcon: { type: String, required: false },
|
|
29
|
+
externalIcon: { type: [Boolean, String], required: false },
|
|
30
|
+
class: { type: null, required: false },
|
|
31
|
+
ui: { type: null, required: false },
|
|
32
|
+
loop: { type: Boolean, required: false },
|
|
33
|
+
side: { type: null, required: false },
|
|
34
|
+
sideOffset: { type: Number, required: false },
|
|
35
|
+
align: { type: null, required: false },
|
|
36
|
+
alignOffset: { type: Number, required: false },
|
|
37
|
+
avoidCollisions: { type: Boolean, required: false },
|
|
38
|
+
collisionBoundary: { type: null, required: false },
|
|
39
|
+
collisionPadding: { type: [Number, Object], required: false },
|
|
40
|
+
arrowPadding: { type: Number, required: false },
|
|
41
|
+
sticky: { type: String, required: false },
|
|
42
|
+
hideWhenDetached: { type: Boolean, required: false },
|
|
43
|
+
positionStrategy: { type: String, required: false },
|
|
44
|
+
updatePositionStrategy: { type: String, required: false },
|
|
45
|
+
disableUpdateOnLayoutShift: { type: Boolean, required: false },
|
|
46
|
+
prioritizePosition: { type: Boolean, required: false },
|
|
47
|
+
reference: { type: null, required: false }
|
|
48
|
+
});
|
|
49
|
+
const emit = defineEmits(["escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "closeAutoFocus"]);
|
|
50
|
+
const slots = defineSlots();
|
|
51
|
+
const contentProps = useForwardPropsEmits(reactiveOmit(props, "sub", "items", "portal", "labelKey", "checkedIcon", "loadingIcon", "externalIcon", "class", "ui"), emit);
|
|
52
|
+
const proxySlots = omit(slots, ["default"]);
|
|
53
|
+
const [DefineItemTemplate, ReuseItemTemplate] = createReusableTemplate();
|
|
54
54
|
const groups = computed(
|
|
55
|
-
() => props.items?.length
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
const { theme, generateStyle } = useTheme()
|
|
61
|
-
const style = computed(() => generateStyle('dropdownMenu', props))
|
|
55
|
+
() => props.items?.length ? isArrayOfArray(props.items) ? props.items : [props.items] : []
|
|
56
|
+
);
|
|
57
|
+
const { theme, generateStyle } = useTheme();
|
|
58
|
+
const style = computed(() => generateStyle("dropdownMenu", props));
|
|
62
59
|
</script>
|
|
63
60
|
|
|
64
61
|
<template>
|
|
65
62
|
<DefineItemTemplate v-slot="{ item, active, index }">
|
|
66
|
-
<slot :name="
|
|
67
|
-
<slot :name="
|
|
63
|
+
<slot :name="item.slot || 'item'" :item="item" :index="index">
|
|
64
|
+
<slot :name="`${item.slot || 'item'}-leading`" :item="item" :active="active" :index="index">
|
|
68
65
|
<span
|
|
69
66
|
v-if="item.loading"
|
|
70
67
|
:class="style.itemLeadingIcon({ class: [loadingIcon || theme.app.icons.loading, props.ui?.itemLeadingIcon], loading: true })"
|
|
68
|
+
data-part="item-leading-icon"
|
|
71
69
|
></span>
|
|
72
70
|
<span
|
|
73
71
|
v-else-if="item.icon"
|
|
74
72
|
:class="style.itemLeadingIcon({ class: [item.icon, props.ui?.itemLeadingIcon], active })"
|
|
73
|
+
data-part="item-leading-icon"
|
|
75
74
|
></span>
|
|
76
75
|
<Avatar
|
|
77
76
|
v-else-if="item.avatar"
|
|
78
77
|
v-bind="item.avatar"
|
|
79
78
|
:size="item.avatar.size || props.size"
|
|
80
79
|
:class="style.itemLeadingAvatar({ class: props.ui?.itemLeadingAvatar, active })"
|
|
80
|
+
data-part="item-leading-avatar"
|
|
81
81
|
/>
|
|
82
82
|
</slot>
|
|
83
83
|
|
|
84
84
|
<span
|
|
85
|
-
v-if="get(item, props.labelKey
|
|
85
|
+
v-if="get(item, props.labelKey) || !!slots[`${item.slot || 'item'}-label`]"
|
|
86
86
|
:class="style.itemLabel({ class: props.ui?.itemLabel, active })"
|
|
87
|
+
data-part="item-label"
|
|
87
88
|
>
|
|
88
|
-
<slot :name="
|
|
89
|
-
{{ get(item, props.labelKey
|
|
89
|
+
<slot :name="`${item.slot || 'item'}-label`" :item="item" :active="active" :index="index">
|
|
90
|
+
{{ get(item, props.labelKey) }}
|
|
90
91
|
</slot>
|
|
91
92
|
|
|
92
93
|
<span
|
|
93
94
|
v-if="item.target === '_blank' && externalIcon !== false"
|
|
94
95
|
:class="style.itemLabelExternalIcon({ class: [typeof externalIcon === 'string' ? externalIcon : theme.app.icons.external, props.ui?.itemLabelExternalIcon], active })"
|
|
96
|
+
data-part="item-label-external-icon"
|
|
95
97
|
></span>
|
|
96
98
|
</span>
|
|
97
99
|
|
|
98
|
-
<span :class="style.itemTrailing({ class: props.ui?.itemTrailing })">
|
|
99
|
-
<slot :name="
|
|
100
|
-
<span v-if="item.children?.length" :class="style.itemTrailingIcon({ class: [theme.app.icons.chevronRight, props.ui?.itemTrailingIcon], active })"></span>
|
|
101
|
-
<span v-else-if="item.kbds?.length" :class="style.itemTrailingKbds({ class: props.ui?.itemTrailingKbds })">
|
|
100
|
+
<span :class="style.itemTrailing({ class: props.ui?.itemTrailing })" data-part="item-trailing">
|
|
101
|
+
<slot :name="`${item.slot || 'item'}-trailing`" :item="item" :active="active" :index="index">
|
|
102
|
+
<span v-if="item.children?.length" :class="style.itemTrailingIcon({ class: [theme.app.icons.chevronRight, props.ui?.itemTrailingIcon], active })" data-part="item-trailing-icon"></span>
|
|
103
|
+
<span v-else-if="item.kbds?.length" :class="style.itemTrailingKbds({ class: props.ui?.itemTrailingKbds })" data-part="item-trailing-kbds">
|
|
102
104
|
<Kbd
|
|
103
105
|
v-for="(kbd, kbdIndex) in item.kbds"
|
|
104
106
|
:key="kbdIndex"
|
|
@@ -109,27 +111,28 @@ const style = computed(() => generateStyle('dropdownMenu', props))
|
|
|
109
111
|
</slot>
|
|
110
112
|
|
|
111
113
|
<DropdownMenu.ItemIndicator as-child>
|
|
112
|
-
<span :class="style.itemTrailingIcon({ class: [checkedIcon || theme.app.icons.check, props.ui?.itemTrailingIcon] })"></span>
|
|
114
|
+
<span :class="style.itemTrailingIcon({ class: [checkedIcon || theme.app.icons.check, props.ui?.itemTrailingIcon] })" data-part="item-trailing-icon"></span>
|
|
113
115
|
</DropdownMenu.ItemIndicator>
|
|
114
116
|
</span>
|
|
115
117
|
</slot>
|
|
116
118
|
</DefineItemTemplate>
|
|
117
119
|
|
|
118
120
|
<DropdownMenu.Portal :disabled="!portal">
|
|
119
|
-
<component :is="sub ? DropdownMenu.SubContent : DropdownMenu.Content" :class="props.class" v-bind="contentProps">
|
|
120
|
-
<DropdownMenu.Group v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="style.group({ class: props.ui?.group })">
|
|
121
|
+
<component :is="sub ? DropdownMenu.SubContent : DropdownMenu.Content" :class="props.class" :data-part="$attrs['data-part']" v-bind="contentProps">
|
|
122
|
+
<DropdownMenu.Group v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="style.group({ class: props.ui?.group })" data-part="group">
|
|
121
123
|
<template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
|
|
122
|
-
<DropdownMenu.Label v-if="item.type === 'label'" :class="style.label({ class: props.ui?.label })">
|
|
124
|
+
<DropdownMenu.Label v-if="item.type === 'label'" :class="style.label({ class: props.ui?.label })" data-part="label">
|
|
123
125
|
<ReuseItemTemplate :item="item" :index="index" />
|
|
124
126
|
</DropdownMenu.Label>
|
|
125
|
-
<DropdownMenu.Separator v-else-if="item.type === 'separator'" :class="style.separator({ class: props.ui?.separator })" />
|
|
127
|
+
<DropdownMenu.Separator v-else-if="item.type === 'separator'" :class="style.separator({ class: props.ui?.separator })" data-part="separator" />
|
|
126
128
|
<DropdownMenu.Sub v-else-if="item?.children?.length" :open="item.open" :default-open="item.defaultOpen">
|
|
127
129
|
<DropdownMenu.SubTrigger
|
|
128
130
|
as="button"
|
|
129
131
|
type="button"
|
|
130
132
|
:disabled="item.disabled"
|
|
131
|
-
:text-value="get(item, props.labelKey
|
|
133
|
+
:text-value="get(item, props.labelKey)"
|
|
132
134
|
:class="style.item({ class: props.ui?.item })"
|
|
135
|
+
data-part="item"
|
|
133
136
|
>
|
|
134
137
|
<ReuseItemTemplate :item="item" :index="index" />
|
|
135
138
|
</DropdownMenu.SubTrigger>
|
|
@@ -151,7 +154,7 @@ const style = computed(() => generateStyle('dropdownMenu', props))
|
|
|
151
154
|
v-bind="item.content"
|
|
152
155
|
>
|
|
153
156
|
<template v-for="(_, name) in proxySlots" #[name]="slotProps">
|
|
154
|
-
<slot :name="
|
|
157
|
+
<slot :name="name" v-bind="slotProps"></slot>
|
|
155
158
|
</template>
|
|
156
159
|
</DropdownMenuContent>
|
|
157
160
|
</DropdownMenu.Sub>
|
|
@@ -159,8 +162,9 @@ const style = computed(() => generateStyle('dropdownMenu', props))
|
|
|
159
162
|
v-else-if="item.type === 'checkbox'"
|
|
160
163
|
:model-value="item.checked"
|
|
161
164
|
:disabled="item.disabled"
|
|
162
|
-
:text-value="get(item, props.labelKey
|
|
165
|
+
:text-value="get(item, props.labelKey)"
|
|
163
166
|
:class="style.item({ class: [props.ui?.item, item.class] })"
|
|
167
|
+
data-part="item"
|
|
164
168
|
@update:model-value="item.onUpdateChecked"
|
|
165
169
|
@select="item.onSelect"
|
|
166
170
|
>
|
|
@@ -170,11 +174,11 @@ const style = computed(() => generateStyle('dropdownMenu', props))
|
|
|
170
174
|
v-else
|
|
171
175
|
as-child
|
|
172
176
|
:disabled="item.disabled"
|
|
173
|
-
:text-value="get(item, props.labelKey
|
|
177
|
+
:text-value="get(item, props.labelKey)"
|
|
174
178
|
@select="item.onSelect"
|
|
175
179
|
>
|
|
176
|
-
<Link v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item
|
|
177
|
-
<LinkBase v-bind="slotProps" :class="style.item({ class: [props.ui?.item, item.class], active })">
|
|
180
|
+
<Link v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(item)" custom>
|
|
181
|
+
<LinkBase v-bind="slotProps" :class="style.item({ class: [props.ui?.item, item.class], active })" data-part="item">
|
|
178
182
|
<ReuseItemTemplate :item="item" :active="active" :index="index" />
|
|
179
183
|
</LinkBase>
|
|
180
184
|
</Link>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { VariantProps } from '@byyuurin/ui-kit';
|
|
2
|
+
import type { DropdownMenuContentEmits as RekaDropdownMenuContentEmits, DropdownMenuContentProps as RekaDropdownMenuContentProps } from 'reka-ui';
|
|
3
|
+
import type { dropdownMenu } from '../theme/index.js';
|
|
4
|
+
import type { ArrayOrNested, ComponentAttrs, DropdownMenuItem, DropdownMenuSlots, NestedItem } from '../types/index.js';
|
|
5
|
+
export type DropdownMenuContentSlots<T extends ArrayOrNested<DropdownMenuItem>> = Omit<DropdownMenuSlots<T>, 'default'> & {
|
|
6
|
+
default?: any;
|
|
7
|
+
};
|
|
8
|
+
export interface DropdownMenuContentEmits extends RekaDropdownMenuContentEmits {
|
|
9
|
+
}
|
|
10
|
+
type DropdownMenuVariants = VariantProps<typeof dropdownMenu>;
|
|
11
|
+
export interface DropdownMenuContentProps<T extends ArrayOrNested<DropdownMenuItem>> extends ComponentAttrs<typeof dropdownMenu>, Omit<RekaDropdownMenuContentProps, 'as' | 'asChild' | 'forceMount'> {
|
|
12
|
+
size?: DropdownMenuVariants['size'];
|
|
13
|
+
items?: T;
|
|
14
|
+
portal?: boolean;
|
|
15
|
+
sub?: boolean;
|
|
16
|
+
labelKey: keyof NestedItem<T>;
|
|
17
|
+
checkedIcon?: string;
|
|
18
|
+
loadingIcon?: string;
|
|
19
|
+
externalIcon?: boolean | string;
|
|
20
|
+
}
|
|
21
|
+
declare const _default: <T extends ArrayOrNested<DropdownMenuItem>>(__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<{
|
|
22
|
+
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
23
|
+
readonly onEscapeKeyDown?: ((event: KeyboardEvent) => any) | undefined;
|
|
24
|
+
readonly onPointerDownOutside?: ((event: import("reka-ui").PointerDownOutsideEvent) => any) | undefined;
|
|
25
|
+
readonly onFocusOutside?: ((event: import("reka-ui").FocusOutsideEvent) => any) | undefined;
|
|
26
|
+
readonly onInteractOutside?: ((event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => any) | undefined;
|
|
27
|
+
readonly onCloseAutoFocus?: ((event: Event) => any) | undefined;
|
|
28
|
+
} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onEscapeKeyDown" | "onPointerDownOutside" | "onFocusOutside" | "onInteractOutside" | "onCloseAutoFocus"> & DropdownMenuContentProps<T> & Partial<{}>> & import("vue").PublicProps;
|
|
29
|
+
expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
|
|
30
|
+
attrs: any;
|
|
31
|
+
slots: DropdownMenuContentSlots<T>;
|
|
32
|
+
emit: ((evt: "escapeKeyDown", event: KeyboardEvent) => void) & ((evt: "pointerDownOutside", event: import("reka-ui").PointerDownOutsideEvent) => void) & ((evt: "focusOutside", event: import("reka-ui").FocusOutsideEvent) => void) & ((evt: "interactOutside", event: import("reka-ui").PointerDownOutsideEvent | import("reka-ui").FocusOutsideEvent) => void) & ((evt: "closeAutoFocus", event: Event) => void);
|
|
33
|
+
}>) => import("vue").VNode & {
|
|
34
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
35
|
+
};
|
|
36
|
+
export default _default;
|
|
37
|
+
type __VLS_PrettifyLocal<T> = {
|
|
38
|
+
[K in keyof T]: T[K];
|
|
39
|
+
} & {};
|