@teammodlr/ui-kit 2.1.41 → 2.1.43

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.
Files changed (268) hide show
  1. package/env.d.ts +1 -1
  2. package/lib/components/checkbox/Checkbox.vue.d.ts +1 -0
  3. package/lib/components/checkbox/style/Checkbox.css.d.ts +1 -0
  4. package/lib/index.cjs.js +8 -8
  5. package/lib/index.es.js +1352 -1342
  6. package/lib/nuxt.js +35 -35
  7. package/lib/nuxt.plugin.js +8 -8
  8. package/lib/style.css +1 -1
  9. package/package.json +89 -89
  10. package/src/__storybook__/argTypes.ts +53 -53
  11. package/src/__storybook__/createStory.ts +15 -15
  12. package/src/__storybook__/index.ts +2 -2
  13. package/src/call.ts +34 -34
  14. package/src/components/avatar/Avatar.vue +110 -110
  15. package/src/components/avatar/examples/basic.vue +6 -6
  16. package/src/components/avatar/examples/custom-size.vue +7 -7
  17. package/src/components/avatar/examples/index.ts +5 -5
  18. package/src/components/avatar/examples/sizes.vue +33 -33
  19. package/src/components/avatar/examples/slots.vue +8 -8
  20. package/src/components/avatar/examples/variants.vue +18 -18
  21. package/src/components/avatar/style/Avatar.css.ts +92 -92
  22. package/src/components/avatar/style/index.ts +1 -1
  23. package/src/components/avatargroup/AvatarGroup.vue +72 -72
  24. package/src/components/avatargroup/examples/basic.vue +37 -37
  25. package/src/components/avatargroup/examples/index.ts +1 -1
  26. package/src/components/avatargroup/style/AvatarGroup.css.ts +26 -26
  27. package/src/components/avatargroup/style/index.ts +1 -1
  28. package/src/components/avatargroup/symbol.ts +17 -17
  29. package/src/components/badge/Badge.vue +43 -43
  30. package/src/components/badge/examples/basic.vue +10 -10
  31. package/src/components/badge/examples/index.ts +1 -1
  32. package/src/components/badge/style/Badge.css.ts +135 -135
  33. package/src/components/badge/style/index.ts +1 -1
  34. package/src/components/breadcrumb/Breadcrumb.vue +54 -54
  35. package/src/components/breadcrumb/BreadcrumbItem.vue +72 -72
  36. package/src/components/breadcrumb/examples/basic.vue +7 -7
  37. package/src/components/breadcrumb/examples/index.ts +1 -1
  38. package/src/components/breadcrumb/style/Breadcrumb.css.ts +40 -40
  39. package/src/components/breadcrumb/style/index.ts +1 -1
  40. package/src/components/breadcrumb/symbol.ts +18 -18
  41. package/src/components/button/Button.vue +203 -203
  42. package/src/components/button/examples/basic.vue +3 -3
  43. package/src/components/button/examples/disabled.vue +3 -3
  44. package/src/components/button/examples/icon-left.vue +12 -12
  45. package/src/components/button/examples/icon.vue +9 -9
  46. package/src/components/button/examples/index.ts +9 -9
  47. package/src/components/button/examples/link.vue +3 -3
  48. package/src/components/button/examples/rounded.vue +7 -7
  49. package/src/components/button/examples/size.vue +7 -7
  50. package/src/components/button/examples/variants-secondary.vue +10 -10
  51. package/src/components/button/examples/variants.vue +10 -10
  52. package/src/components/button/style/Button.css.ts +695 -695
  53. package/src/components/button/style/index.ts +1 -1
  54. package/src/components/buttongroup/ButtonGroup.vue +36 -36
  55. package/src/components/buttongroup/examples/basic.vue +9 -9
  56. package/src/components/buttongroup/examples/icon-group.vue +21 -21
  57. package/src/components/buttongroup/examples/index.ts +2 -2
  58. package/src/components/buttongroup/style/ButtonGroup.css.ts +42 -42
  59. package/src/components/buttongroup/style/index.ts +1 -1
  60. package/src/components/buttongroup/symbol.ts +9 -9
  61. package/src/components/checkbox/Checkbox.vue +149 -145
  62. package/src/components/checkbox/examples/basic.vue +9 -9
  63. package/src/components/checkbox/examples/index.ts +2 -2
  64. package/src/components/checkbox/examples/slot.vue +14 -11
  65. package/src/components/checkbox/style/Checkbox.css.ts +178 -161
  66. package/src/components/checkbox/style/index.ts +1 -1
  67. package/src/components/colorpicker/ColorPicker.vue +333 -333
  68. package/src/components/colorpicker/examples/basic.vue +2 -2
  69. package/src/components/colorpicker/examples/index.ts +1 -1
  70. package/src/components/colorpicker/style/ColorPicker.css.ts +127 -127
  71. package/src/components/colorpicker/style/index.ts +1 -1
  72. package/src/components/colorpicker/utils.ts +206 -206
  73. package/src/components/confirm/Confirm.vue +65 -65
  74. package/src/components/confirm/ConfirmProvider.vue +83 -83
  75. package/src/components/confirm/examples/basic.vue +48 -48
  76. package/src/components/confirm/examples/index.ts +1 -1
  77. package/src/components/confirm/examples/wrapper.vue +9 -9
  78. package/src/components/confirm/props.ts +24 -24
  79. package/src/components/confirm/providerProps.ts +10 -10
  80. package/src/components/confirm/types.ts +33 -33
  81. package/src/components/confirm/useConfirm.ts +14 -14
  82. package/src/components/dialog/Dialog.vue +118 -118
  83. package/src/components/dialog/examples/basic.vue +16 -16
  84. package/src/components/dialog/examples/index.ts +1 -1
  85. package/src/components/dialog/style/Dialog.css.ts +100 -100
  86. package/src/components/dialog/style/index.ts +1 -1
  87. package/src/components/dropdown/Dropdown.vue +308 -308
  88. package/src/components/dropdown/DropdownHeading.vue +23 -23
  89. package/src/components/dropdown/DropdownItem.vue +151 -151
  90. package/src/components/dropdown/DropdownList.vue +20 -20
  91. package/src/components/dropdown/DropdownSeperator.vue +22 -22
  92. package/src/components/dropdown/DropdownWrapper.vue +18 -18
  93. package/src/components/dropdown/examples/basic.vue +119 -119
  94. package/src/components/dropdown/examples/context.vue +71 -71
  95. package/src/components/dropdown/examples/index.ts +3 -3
  96. package/src/components/dropdown/hooks.ts +30 -30
  97. package/src/components/dropdown/style/Dropdown.css.ts +158 -158
  98. package/src/components/dropdown/style/index.ts +1 -1
  99. package/src/components/dropdown/symbol.ts +9 -9
  100. package/src/components/form/Form.vue +153 -153
  101. package/src/components/form/examples/basic.vue +75 -75
  102. package/src/components/form/examples/index.ts +1 -1
  103. package/src/components/form/style/Form.css.ts +28 -28
  104. package/src/components/form/style/index.ts +2 -2
  105. package/src/components/form/symbol.ts +16 -16
  106. package/src/components/image/Image.vue +71 -71
  107. package/src/components/image/examples/basic.vue +5 -5
  108. package/src/components/image/examples/index.ts +1 -1
  109. package/src/components/index.ts +47 -47
  110. package/src/components/input/Input.vue +233 -233
  111. package/src/components/input/examples/basic.vue +21 -21
  112. package/src/components/input/examples/index.ts +6 -6
  113. package/src/components/input/examples/left-icon.vue +9 -9
  114. package/src/components/input/examples/prefix.vue +5 -5
  115. package/src/components/input/examples/right-icon.vue +9 -9
  116. package/src/components/input/examples/sizes.vue +9 -9
  117. package/src/components/input/examples/suffix.vue +7 -7
  118. package/src/components/input/style/Input.css.ts +294 -294
  119. package/src/components/input/style/index.ts +1 -1
  120. package/src/components/link/Link.vue +53 -53
  121. package/src/components/link/examples/basic.vue +3 -3
  122. package/src/components/link/examples/index.ts +1 -1
  123. package/src/components/messageprovider/Message.vue +135 -135
  124. package/src/components/messageprovider/MessageProvider.vue +156 -156
  125. package/src/components/messageprovider/examples/basic.vue +70 -70
  126. package/src/components/messageprovider/examples/index.ts +2 -2
  127. package/src/components/messageprovider/examples/update.vue +34 -34
  128. package/src/components/messageprovider/examples/wrapper.vue +9 -9
  129. package/src/components/messageprovider/style/Message.css.ts +111 -111
  130. package/src/components/messageprovider/style/index.ts +1 -1
  131. package/src/components/messageprovider/types.ts +56 -56
  132. package/src/components/messageprovider/useMessage.ts +14 -14
  133. package/src/components/modal/Modal.vue +310 -310
  134. package/src/components/modal/examples/basic.vue +80 -80
  135. package/src/components/modal/examples/index.ts +3 -3
  136. package/src/components/modal/examples/modal-form.vue +99 -99
  137. package/src/components/modal/examples/sidebar.vue +79 -79
  138. package/src/components/modal/style/Modal.css.ts +318 -318
  139. package/src/components/modal/style/index.ts +1 -1
  140. package/src/components/pagination/Pagination.vue +296 -296
  141. package/src/components/pagination/examples/basic.vue +17 -17
  142. package/src/components/pagination/examples/index.ts +1 -1
  143. package/src/components/pagination/style/Pagination.css.ts +93 -93
  144. package/src/components/pagination/style/index.ts +1 -1
  145. package/src/components/radio/Radio.vue +136 -136
  146. package/src/components/radio/examples/basic.vue +8 -8
  147. package/src/components/radio/examples/group.vue +15 -15
  148. package/src/components/radio/examples/index.ts +2 -2
  149. package/src/components/radio/style/Checkbox.css.ts +130 -130
  150. package/src/components/radio/style/index.ts +1 -1
  151. package/src/components/radiobutton/RadioButton.vue +131 -131
  152. package/src/components/radiobutton/style/RadioButton.css.ts +189 -189
  153. package/src/components/radiobutton/style/index.ts +1 -1
  154. package/src/components/radiobuttongroup/RadioButtonGroup.vue +74 -74
  155. package/src/components/radiobuttongroup/examples/basic.vue +16 -16
  156. package/src/components/radiobuttongroup/examples/index.ts +1 -1
  157. package/src/components/radiobuttongroup/style/RadioButtonGroup.css.ts +37 -37
  158. package/src/components/radiobuttongroup/style/index.ts +1 -1
  159. package/src/components/radiobuttongroup/symbol.ts +12 -12
  160. package/src/components/renderer/examlpes/basic.vue +23 -23
  161. package/src/components/renderer/examlpes/index.ts +1 -1
  162. package/src/components/renderer/props.ts +14 -14
  163. package/src/components/renderer/renderer.ts +16 -16
  164. package/src/components/select/Select.vue +781 -781
  165. package/src/components/select/examples/basic.vue +21 -21
  166. package/src/components/select/examples/index.ts +3 -3
  167. package/src/components/select/examples/multiple.vue +21 -21
  168. package/src/components/select/examples/searchable.vue +20 -20
  169. package/src/components/select/style/Select.css.ts +368 -368
  170. package/src/components/select/style/index.ts +1 -1
  171. package/src/components/skeleton/Skeleton.vue +55 -55
  172. package/src/components/skeleton/examples/basic.vue +3 -3
  173. package/src/components/skeleton/examples/index.ts +2 -2
  174. package/src/components/skeleton/examples/post.vue +8 -8
  175. package/src/components/skeleton/style/Skeleton.css.ts +72 -72
  176. package/src/components/skeleton/style/index.ts +2 -2
  177. package/src/components/slider/Slider.vue +76 -76
  178. package/src/components/slider/style/Slider.css.ts +50 -50
  179. package/src/components/slider/style/index.ts +1 -1
  180. package/src/components/switch/Switch.vue +132 -132
  181. package/src/components/switch/examples/basic.vue +9 -9
  182. package/src/components/switch/examples/index.ts +2 -2
  183. package/src/components/switch/examples/slot.vue +11 -11
  184. package/src/components/switch/style/Switch.css.ts +135 -135
  185. package/src/components/switch/style/index.ts +1 -1
  186. package/src/components/tab/Tab.css +113 -113
  187. package/src/components/tab/Tab.vue +98 -98
  188. package/src/components/tab/TabGroup.vue +90 -90
  189. package/src/components/tab/examples/basic.vue +19 -19
  190. package/src/components/tab/examples/index.ts +2 -2
  191. package/src/components/tab/examples/vertical.vue +19 -19
  192. package/src/components/table/Table.vue +198 -198
  193. package/src/components/table/TableBody.vue +13 -13
  194. package/src/components/table/TableCell.vue +13 -13
  195. package/src/components/table/TableHead.vue +46 -46
  196. package/src/components/table/TableHeadRow.vue +15 -15
  197. package/src/components/table/TableRow.vue +19 -19
  198. package/src/components/table/examples/basic.vue +61 -61
  199. package/src/components/table/examples/empty.vue +44 -44
  200. package/src/components/table/examples/index.ts +3 -3
  201. package/src/components/table/examples/selected.vue +68 -68
  202. package/src/components/table/style/Table.css.ts +62 -62
  203. package/src/components/table/style/index.ts +1 -1
  204. package/src/components/table/types/index.ts +6 -6
  205. package/src/components/tag/Tag.vue +72 -72
  206. package/src/components/tag/examples/basic.vue +5 -5
  207. package/src/components/tag/examples/index.ts +1 -1
  208. package/src/components/tag/style/Tag.css.ts +83 -83
  209. package/src/components/tag/style/index.ts +1 -1
  210. package/src/components/textarea/Textarea.vue +180 -180
  211. package/src/components/textarea/examples/basic.vue +8 -8
  212. package/src/components/textarea/examples/index.ts +1 -1
  213. package/src/components/textarea/style/Textarea.css.ts +191 -191
  214. package/src/components/textarea/style/index.ts +1 -1
  215. package/src/components/tooltip/Tooltip.vue +196 -196
  216. package/src/components/tooltip/examples/basic.vue +5 -5
  217. package/src/components/tooltip/examples/index.ts +2 -2
  218. package/src/components/tooltip/examples/placement.vue +9 -9
  219. package/src/components/tooltip/style/Tooltip.css.ts +90 -90
  220. package/src/components/tooltip/style/index.ts +1 -1
  221. package/src/components/transfer/Transfer.vue +145 -145
  222. package/src/components/transfer/examples/basic.vue +21 -21
  223. package/src/components/transfer/examples/index.ts +1 -1
  224. package/src/components/transfer/style/Transfer.css.ts +81 -81
  225. package/src/components/transfer/style/index.ts +1 -1
  226. package/src/components/tree/Tree.vue +138 -138
  227. package/src/components/tree/TreeNode.vue +109 -109
  228. package/src/components/tree/TreeNodeToggle.vue +48 -48
  229. package/src/components/tree/examples/basic.vue +458 -458
  230. package/src/components/tree/examples/index.ts +1 -1
  231. package/src/components/tree/props.ts +97 -97
  232. package/src/components/tree/style/Tree.css.ts +75 -75
  233. package/src/components/tree/style/index.ts +1 -1
  234. package/src/components/tree/types.ts +103 -103
  235. package/src/components/virtualscroll/VirtualScroll.css +13 -13
  236. package/src/components/virtualscroll/VirtualScroll.vue +166 -166
  237. package/src/components/virtualscroll/examples/basic.vue +31 -31
  238. package/src/components/virtualscroll/examples/index.ts +1 -1
  239. package/src/components/virtualscroll/style/VirtualScroll.css.ts +17 -17
  240. package/src/components/virtualscroll/style/index.ts +1 -1
  241. package/src/composables/element.ts +13 -13
  242. package/src/composables/index.ts +4 -4
  243. package/src/composables/useCachedUid.ts +49 -49
  244. package/src/composables/useEventListener.ts +19 -19
  245. package/src/composables/useInput.ts +151 -151
  246. package/src/composables/useInteractive.ts +19 -19
  247. package/src/composables/useIsServer.ts +7 -7
  248. package/src/composables/useMergedState.ts +18 -18
  249. package/src/composables/useMount.ts +43 -43
  250. package/src/composables/usePopper.ts +215 -215
  251. package/src/composables/useZIndex.ts +33 -33
  252. package/src/create.ts +38 -38
  253. package/src/css/components.css +16 -16
  254. package/src/css/index.css +4 -4
  255. package/src/css/transitions.css +40 -40
  256. package/src/css/variables.css +80 -80
  257. package/src/examples/cards/sidebar.vue +262 -262
  258. package/src/examples/modal/modal.vue +52 -52
  259. package/src/exports/nuxt.js +35 -35
  260. package/src/exports/nuxt.plugin.js +8 -8
  261. package/src/index.ts +5 -5
  262. package/src/install.ts +8 -8
  263. package/src/shims-vue.d.ts +6 -6
  264. package/src/styles/theme.css.ts +181 -181
  265. package/src/styles/transitions.css.ts +97 -97
  266. package/src/types/props.ts +19 -19
  267. package/src/utils/injection.ts +5 -5
  268. package/volar.d.ts +16 -16
@@ -1,308 +1,308 @@
1
- <template>
2
- <span ref="wrapper" :class="computedWrapperClasses">
3
- <span
4
- ref="referenceRef"
5
- :class="computedReferenceClasses"
6
- @click="toggleDropdown">
7
- <slot />
8
- </span>
9
-
10
- <DropdownWrapper>
11
- <Teleport :disabled="isNested" to="body">
12
- <transition
13
- :enter-active-class="scale.enterActive"
14
- :leave-active-class="scale.leaveActive"
15
- :enter-from-class="scale.enterFrom"
16
- :leave-to-class="scale.leaveTo">
17
- <div
18
- v-if="isOpen"
19
- ref="popper"
20
- :class="menuClasses"
21
- :style="{ zIndex: zIndex, maxHeight: maxHeight }">
22
- <slot name="menu" />
23
- </div>
24
- </transition>
25
- </Teleport>
26
- </DropdownWrapper>
27
- </span>
28
- </template>
29
-
30
- <script lang="ts">
31
- import { usePopper } from '../../composables/usePopper';
32
- import type { Placement, VirtualElement } from '@popperjs/core';
33
- import { scale } from '../../styles/transitions.css';
34
- import {
35
- defineComponent,
36
- inject,
37
- ref,
38
- type PropType,
39
- provide,
40
- watch,
41
- onMounted,
42
- nextTick,
43
- computed,
44
- toRef,
45
- reactive,
46
- watchEffect
47
- } from 'vue';
48
- import { onClickOutside, useEventListener } from '@vueuse/core';
49
- import DropdownWrapper from './DropdownWrapper.vue';
50
- import { useLabel } from './hooks';
51
- import { useZIndex } from '../../composables/useZIndex';
52
- import type { DropdownState } from './symbol';
53
- import { DROPDOWN_STATE } from './symbol';
54
- import * as style from './style';
55
-
56
- export default defineComponent({
57
- name: 'Dropdown',
58
- components: {
59
- DropdownWrapper
60
- },
61
- props: {
62
- open: {
63
- type: Boolean,
64
- default: false
65
- },
66
- placement: {
67
- type: String as PropType<Placement>,
68
- default: 'bottom-start'
69
- },
70
- transfer: {
71
- type: Boolean,
72
- default: false
73
- },
74
- trigger: {
75
- type: String as PropType<'click' | 'hover'>,
76
- default: 'click'
77
- },
78
- virtual: {
79
- type: [Object],
80
- default: null
81
- },
82
- x: {
83
- type: Number,
84
- default: 0
85
- },
86
- y: {
87
- type: Number,
88
- default: 0
89
- },
90
- label: {
91
- default: null,
92
- static: true
93
- },
94
- transitionName: {
95
- type: String,
96
- default: 'fade'
97
- },
98
- onSelect: {
99
- type: Function as PropType<(labels: any) => void>,
100
- default: () => {}
101
- },
102
- zIndex: {
103
- type: Number
104
- }
105
- },
106
- emits: ['update:open'],
107
- setup(props, { emit }) {
108
- const parentState = inject(DROPDOWN_STATE, null);
109
- const { nextZIndex } = useZIndex();
110
- const isNested = !!parentState;
111
- const label = toRef(props, 'label');
112
- const isOpen = ref(props.open);
113
- const placement = ref(props.placement);
114
- const transfer = toRef(props, 'transfer');
115
- const wrapper = ref(null);
116
- const referenceRef = ref(null);
117
- const zIndex = ref(props.zIndex ?? nextZIndex());
118
- const reference = computed(() => {
119
- if (props.virtual !== null) {
120
- const virtual = (props.virtual as any).$el ?? props.virtual;
121
- if (virtual) {
122
- if ('getBoundingClientRect' in virtual) {
123
- return virtual as VirtualElement;
124
- }
125
-
126
- if ('x' in virtual && 'y' in virtual) {
127
- return {
128
- getBoundingClientRect: () => ({
129
- x: virtual.x,
130
- y: virtual.y,
131
- left: virtual.x,
132
- top: virtual.y,
133
- width: 0,
134
- height: 0
135
- })
136
- } as VirtualElement;
137
- }
138
- }
139
- }
140
-
141
- return referenceRef.value;
142
- });
143
-
144
- const { popper, transferTo, updatePopper } = usePopper({
145
- reference: reference,
146
- placement,
147
- transfer,
148
- wrapper,
149
- isDrop: true,
150
- offset: isNested ? [-2, 2] : [0, 14]
151
- });
152
-
153
- const currentLabel = useLabel(label, referenceRef);
154
-
155
- provide('dropdown-select', null);
156
-
157
- const startState: DropdownState = reactive({
158
- handleSelect: handleSelect,
159
- isOpen: isOpen
160
- });
161
-
162
- provide(DROPDOWN_STATE, startState);
163
-
164
- watch(
165
- () => props.open,
166
- value => {
167
- isOpen.value = value;
168
- }
169
- );
170
-
171
- watch(
172
- () => props.placement,
173
- value => {
174
- setPlacement(value);
175
- }
176
- );
177
-
178
- watch(isOpen, value => {
179
- if (value) {
180
- updatePopper();
181
- }
182
-
183
- emit('update:open', value);
184
- });
185
-
186
- onMounted(() => {
187
- nextTick(() => {
188
- setPlacement(props.placement);
189
- });
190
- });
191
-
192
- useEventListener('resize', () => {
193
- updatePopper();
194
- });
195
-
196
- onClickOutside(wrapper, e => {
197
- let parent = e.target as HTMLElement;
198
-
199
- let i = 0;
200
- while (parent) {
201
- if (parent.classList.contains('m-dropdown-menu')) {
202
- return;
203
- }
204
- parent = parent.parentElement as HTMLElement;
205
-
206
- if (i > 10) {
207
- break;
208
- }
209
- i++;
210
- }
211
-
212
- isOpen.value = false;
213
- });
214
-
215
- function setPlacement(value: Placement) {
216
- const [xPlacement] = value.split('-');
217
-
218
- if (isNested && xPlacement !== 'right' && xPlacement !== 'left') {
219
- placement.value = 'right-start';
220
- } else {
221
- placement.value = value;
222
- }
223
- }
224
-
225
- function toggleDropdown() {
226
- isOpen.value = !isOpen.value;
227
- }
228
-
229
- function handleSelect(labels: string[]) {
230
- isOpen.value = false;
231
- props.onSelect(labels);
232
- if (typeof parentState?.handleSelect === 'function') {
233
- // @ts-ignore
234
- parentState.handleSelect([currentLabel.value!, ...labels]);
235
- }
236
- }
237
-
238
- const computedWrapperClasses = computed(() => {
239
- return [
240
- 'm-dropdown',
241
- {
242
- 'm-dropdown--open': isOpen.value,
243
- 'm-dropdown--nested': isNested
244
- }
245
- ];
246
- });
247
-
248
- const computedReferenceClasses = computed(() => {});
249
-
250
- const menuClasses = computed(() => {
251
- return ['m-dropdown-menu', style.menu];
252
- });
253
-
254
- const transitionName = computed(() => {
255
- return `m-transition__${props.transitionName}`;
256
- });
257
-
258
- const maxHeight = ref('auto');
259
- useEventListener(window, 'resize', () => {
260
- if (isOpen.value) {
261
- resize();
262
- updatePopper();
263
- }
264
- });
265
-
266
- watchEffect(() => {
267
- resize();
268
- });
269
-
270
- function resize() {
271
- if (!isOpen.value) {
272
- maxHeight.value = 'auto';
273
- return;
274
- }
275
- let referenceHeight =
276
- reference.value?.getBoundingClientRect().height;
277
-
278
- let referenceTop = reference.value?.getBoundingClientRect().top;
279
- if (!referenceHeight || !referenceTop) {
280
- return;
281
- }
282
- let windowHeight = window.innerHeight;
283
-
284
- maxHeight.value = `${
285
- windowHeight - referenceHeight - referenceTop - 30
286
- }px`;
287
- }
288
-
289
- return {
290
- wrapper,
291
- referenceRef,
292
- popper,
293
- transferTo,
294
- isOpen,
295
- isNested,
296
- placement,
297
- menuClasses,
298
- computedWrapperClasses,
299
- computedReferenceClasses,
300
- transitionName,
301
- toggleDropdown,
302
- zIndex,
303
- scale,
304
- maxHeight
305
- };
306
- }
307
- });
308
- </script>
1
+ <template>
2
+ <span ref="wrapper" :class="computedWrapperClasses">
3
+ <span
4
+ ref="referenceRef"
5
+ :class="computedReferenceClasses"
6
+ @click="toggleDropdown">
7
+ <slot />
8
+ </span>
9
+
10
+ <DropdownWrapper>
11
+ <Teleport :disabled="isNested" to="body">
12
+ <transition
13
+ :enter-active-class="scale.enterActive"
14
+ :leave-active-class="scale.leaveActive"
15
+ :enter-from-class="scale.enterFrom"
16
+ :leave-to-class="scale.leaveTo">
17
+ <div
18
+ v-if="isOpen"
19
+ ref="popper"
20
+ :class="menuClasses"
21
+ :style="{ zIndex: zIndex, maxHeight: maxHeight }">
22
+ <slot name="menu" />
23
+ </div>
24
+ </transition>
25
+ </Teleport>
26
+ </DropdownWrapper>
27
+ </span>
28
+ </template>
29
+
30
+ <script lang="ts">
31
+ import { usePopper } from '../../composables/usePopper';
32
+ import type { Placement, VirtualElement } from '@popperjs/core';
33
+ import { scale } from '../../styles/transitions.css';
34
+ import {
35
+ defineComponent,
36
+ inject,
37
+ ref,
38
+ type PropType,
39
+ provide,
40
+ watch,
41
+ onMounted,
42
+ nextTick,
43
+ computed,
44
+ toRef,
45
+ reactive,
46
+ watchEffect
47
+ } from 'vue';
48
+ import { onClickOutside, useEventListener } from '@vueuse/core';
49
+ import DropdownWrapper from './DropdownWrapper.vue';
50
+ import { useLabel } from './hooks';
51
+ import { useZIndex } from '../../composables/useZIndex';
52
+ import type { DropdownState } from './symbol';
53
+ import { DROPDOWN_STATE } from './symbol';
54
+ import * as style from './style';
55
+
56
+ export default defineComponent({
57
+ name: 'Dropdown',
58
+ components: {
59
+ DropdownWrapper
60
+ },
61
+ props: {
62
+ open: {
63
+ type: Boolean,
64
+ default: false
65
+ },
66
+ placement: {
67
+ type: String as PropType<Placement>,
68
+ default: 'bottom-start'
69
+ },
70
+ transfer: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+ trigger: {
75
+ type: String as PropType<'click' | 'hover'>,
76
+ default: 'click'
77
+ },
78
+ virtual: {
79
+ type: [Object],
80
+ default: null
81
+ },
82
+ x: {
83
+ type: Number,
84
+ default: 0
85
+ },
86
+ y: {
87
+ type: Number,
88
+ default: 0
89
+ },
90
+ label: {
91
+ default: null,
92
+ static: true
93
+ },
94
+ transitionName: {
95
+ type: String,
96
+ default: 'fade'
97
+ },
98
+ onSelect: {
99
+ type: Function as PropType<(labels: any) => void>,
100
+ default: () => {}
101
+ },
102
+ zIndex: {
103
+ type: Number
104
+ }
105
+ },
106
+ emits: ['update:open'],
107
+ setup(props, { emit }) {
108
+ const parentState = inject(DROPDOWN_STATE, null);
109
+ const { nextZIndex } = useZIndex();
110
+ const isNested = !!parentState;
111
+ const label = toRef(props, 'label');
112
+ const isOpen = ref(props.open);
113
+ const placement = ref(props.placement);
114
+ const transfer = toRef(props, 'transfer');
115
+ const wrapper = ref(null);
116
+ const referenceRef = ref(null);
117
+ const zIndex = ref(props.zIndex ?? nextZIndex());
118
+ const reference = computed(() => {
119
+ if (props.virtual !== null) {
120
+ const virtual = (props.virtual as any).$el ?? props.virtual;
121
+ if (virtual) {
122
+ if ('getBoundingClientRect' in virtual) {
123
+ return virtual as VirtualElement;
124
+ }
125
+
126
+ if ('x' in virtual && 'y' in virtual) {
127
+ return {
128
+ getBoundingClientRect: () => ({
129
+ x: virtual.x,
130
+ y: virtual.y,
131
+ left: virtual.x,
132
+ top: virtual.y,
133
+ width: 0,
134
+ height: 0
135
+ })
136
+ } as VirtualElement;
137
+ }
138
+ }
139
+ }
140
+
141
+ return referenceRef.value;
142
+ });
143
+
144
+ const { popper, transferTo, updatePopper } = usePopper({
145
+ reference: reference,
146
+ placement,
147
+ transfer,
148
+ wrapper,
149
+ isDrop: true,
150
+ offset: isNested ? [-2, 2] : [0, 14]
151
+ });
152
+
153
+ const currentLabel = useLabel(label, referenceRef);
154
+
155
+ provide('dropdown-select', null);
156
+
157
+ const startState: DropdownState = reactive({
158
+ handleSelect: handleSelect,
159
+ isOpen: isOpen
160
+ });
161
+
162
+ provide(DROPDOWN_STATE, startState);
163
+
164
+ watch(
165
+ () => props.open,
166
+ value => {
167
+ isOpen.value = value;
168
+ }
169
+ );
170
+
171
+ watch(
172
+ () => props.placement,
173
+ value => {
174
+ setPlacement(value);
175
+ }
176
+ );
177
+
178
+ watch(isOpen, value => {
179
+ if (value) {
180
+ updatePopper();
181
+ }
182
+
183
+ emit('update:open', value);
184
+ });
185
+
186
+ onMounted(() => {
187
+ nextTick(() => {
188
+ setPlacement(props.placement);
189
+ });
190
+ });
191
+
192
+ useEventListener('resize', () => {
193
+ updatePopper();
194
+ });
195
+
196
+ onClickOutside(wrapper, e => {
197
+ let parent = e.target as HTMLElement;
198
+
199
+ let i = 0;
200
+ while (parent) {
201
+ if (parent.classList.contains('m-dropdown-menu')) {
202
+ return;
203
+ }
204
+ parent = parent.parentElement as HTMLElement;
205
+
206
+ if (i > 10) {
207
+ break;
208
+ }
209
+ i++;
210
+ }
211
+
212
+ isOpen.value = false;
213
+ });
214
+
215
+ function setPlacement(value: Placement) {
216
+ const [xPlacement] = value.split('-');
217
+
218
+ if (isNested && xPlacement !== 'right' && xPlacement !== 'left') {
219
+ placement.value = 'right-start';
220
+ } else {
221
+ placement.value = value;
222
+ }
223
+ }
224
+
225
+ function toggleDropdown() {
226
+ isOpen.value = !isOpen.value;
227
+ }
228
+
229
+ function handleSelect(labels: string[]) {
230
+ isOpen.value = false;
231
+ props.onSelect(labels);
232
+ if (typeof parentState?.handleSelect === 'function') {
233
+ // @ts-ignore
234
+ parentState.handleSelect([currentLabel.value!, ...labels]);
235
+ }
236
+ }
237
+
238
+ const computedWrapperClasses = computed(() => {
239
+ return [
240
+ 'm-dropdown',
241
+ {
242
+ 'm-dropdown--open': isOpen.value,
243
+ 'm-dropdown--nested': isNested
244
+ }
245
+ ];
246
+ });
247
+
248
+ const computedReferenceClasses = computed(() => {});
249
+
250
+ const menuClasses = computed(() => {
251
+ return ['m-dropdown-menu', style.menu];
252
+ });
253
+
254
+ const transitionName = computed(() => {
255
+ return `m-transition__${props.transitionName}`;
256
+ });
257
+
258
+ const maxHeight = ref('auto');
259
+ useEventListener(window, 'resize', () => {
260
+ if (isOpen.value) {
261
+ resize();
262
+ updatePopper();
263
+ }
264
+ });
265
+
266
+ watchEffect(() => {
267
+ resize();
268
+ });
269
+
270
+ function resize() {
271
+ if (!isOpen.value) {
272
+ maxHeight.value = 'auto';
273
+ return;
274
+ }
275
+ let referenceHeight =
276
+ reference.value?.getBoundingClientRect().height;
277
+
278
+ let referenceTop = reference.value?.getBoundingClientRect().top;
279
+ if (!referenceHeight || !referenceTop) {
280
+ return;
281
+ }
282
+ let windowHeight = window.innerHeight;
283
+
284
+ maxHeight.value = `${
285
+ windowHeight - referenceHeight - referenceTop - 30
286
+ }px`;
287
+ }
288
+
289
+ return {
290
+ wrapper,
291
+ referenceRef,
292
+ popper,
293
+ transferTo,
294
+ isOpen,
295
+ isNested,
296
+ placement,
297
+ menuClasses,
298
+ computedWrapperClasses,
299
+ computedReferenceClasses,
300
+ transitionName,
301
+ toggleDropdown,
302
+ zIndex,
303
+ scale,
304
+ maxHeight
305
+ };
306
+ }
307
+ });
308
+ </script>
@@ -1,23 +1,23 @@
1
- <template>
2
- <li :class="computedClasses">
3
- <slot />
4
- </li>
5
- </template>
6
-
7
- <script lang="ts">
8
- import { computed, defineComponent } from 'vue';
9
- import * as style from './style';
10
-
11
- export default defineComponent({
12
- name: 'DropdownHeading',
13
- setup() {
14
- const computedClasses = computed(() => {
15
- return [style.heading];
16
- });
17
-
18
- return {
19
- computedClasses
20
- };
21
- }
22
- });
23
- </script>
1
+ <template>
2
+ <li :class="computedClasses">
3
+ <slot />
4
+ </li>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import { computed, defineComponent } from 'vue';
9
+ import * as style from './style';
10
+
11
+ export default defineComponent({
12
+ name: 'DropdownHeading',
13
+ setup() {
14
+ const computedClasses = computed(() => {
15
+ return [style.heading];
16
+ });
17
+
18
+ return {
19
+ computedClasses
20
+ };
21
+ }
22
+ });
23
+ </script>