From a0693d6950f226f2c5c34ae546b88b6569011867 Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sat, 8 Apr 2023 21:37:06 +0800 Subject: [PATCH 01/43] feat: add dependency on @floating-ui/vue for the positioning engine of dropdown and other components. --- packages/ui/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index 806a4d1374..c632581128 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -42,6 +42,7 @@ "server:webapp": "npx http-server dist --push-state" }, "dependencies": { + "@floating-ui/vue": "^0.2.1", "@types/lodash": "^4.14.161", "cleave.js": "^1.6.0", "colortranslator": "^1.9.2", @@ -170,4 +171,4 @@ ] } } -} \ No newline at end of file +} From 9210eccd59daec6634d37aebe2a41d08e41bd40d Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sat, 8 Apr 2023 21:38:48 +0800 Subject: [PATCH 02/43] feat: using useFloating hooks instead of useDropdown --- .../src/components/va-dropdown/VaDropdown.vue | 68 +++++++++++++++---- 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/packages/ui/src/components/va-dropdown/VaDropdown.vue b/packages/ui/src/components/va-dropdown/VaDropdown.vue index 64fc0c1df2..4ed1515c4d 100644 --- a/packages/ui/src/components/va-dropdown/VaDropdown.vue +++ b/packages/ui/src/components/va-dropdown/VaDropdown.vue @@ -18,7 +18,6 @@ import { useComponentPresetProp, useStateful, useStatefulEmits, createStatefulProps, useDebounceFn, - useDropdown, usePlacementAliasesProps, useClickOutside, useBem, @@ -28,6 +27,7 @@ import { useHTMLElement, MaybeHTMLElementOrSelector, useTranslation, + useDomRect, } from '../../composables' import { useAnchorSelector } from './hooks/useAnchorSelector' import { useCursorAnchor } from './hooks/useCursorAnchor' @@ -37,6 +37,15 @@ import { renderSlotNode } from '../../utils/headless' import { warn } from '../../utils/console' import type { DropdownOffsetProp } from './types' +import { + type Middleware, + type Placement, + useFloating, + offset as offsetFn, + autoUpdate, + flip, + autoPlacement, +} from '@floating-ui/vue' export default defineComponent({ name: 'VaDropdown', @@ -212,19 +221,48 @@ export default defineComponent({ return props.disabled || !isPopoverFloating.value }) - useDropdown( - computed(() => props.cursor ? cursorAnchor.value : computedAnchorRef.value), - contentRef, - computed(() => ({ - keepAnchorWidth: props.keepAnchorWidth, - offset: props.offset, - stickToEdges: props.stickToEdges, - autoPlacement: props.autoPlacement, - root: teleportTargetComputed.value, - viewport: targetComputed.value, - })), - props, - ) + const anchorRef = computed(() => props.cursor ? cursorAnchor.value : computedAnchorRef.value) + const { x, y, strategy } = useFloating(anchorRef, contentRef, { + placement: props.placement as Placement, + whileElementsMounted: autoUpdate, + middleware: computed(() => { + let middleware: Middleware[] = [] + const offset = props.offset + console.log(offset, 'offset') + if (offset) { + middleware = [ + offsetFn({ + mainAxis: 100, + crossAxis: 100, + }), + ] + } + + middleware.push(props.autoPlacement ? autoPlacement() : flip()) + return middleware + }), + }) + + const { domRect: anchorDomRect } = useDomRect(anchorRef) + + const contentStyle = computed(() => { + if (props.keepAnchorWidth) { + const { width } = anchorDomRect.value || {} + return { + position: strategy.value, + top: `${y.value}px`, + left: `${x.value}px`, + width: `${width}px`, + maxWidth: `${width}px`, + } + } + + return { + position: strategy.value, + top: `${y.value}px`, + left: `${x.value}px`, + } + }) const isMounted = useIsMounted() @@ -240,6 +278,7 @@ export default defineComponent({ onMouseLeave, emitAndClose, contentRef, + contentStyle, } }, @@ -253,6 +292,7 @@ export default defineComponent({ const defaultSlotVNode = renderSlotNode(this.$slots.default, slotBinds, { ref: 'contentRef', class: 'va-dropdown__content-wrapper', + style: this.contentStyle, onMouseOver: () => this.$props.isContentHoverable && this.onMouseEnter(), onMouseOut: () => this.onMouseLeave(), onClick: () => this.emitAndClose('content-click', this.$props.closeOnContentClick), From d796c2c0fc376ef6839017caea7406b0f26f0ab3 Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sat, 8 Apr 2023 22:21:45 +0800 Subject: [PATCH 03/43] feat: add dependency on @floating-ui/vue for the positioning engine of dropdown and other components. --- yarn.lock | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/yarn.lock b/yarn.lock index 08fec50ee4..50cd356251 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1825,6 +1825,26 @@ unique-filename "^1.1.1" which "^1.3.1" +"@floating-ui/core@^1.2.4": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.5.tgz#612f0d203e6f647490d572c7b798eebac9e3cf54" + integrity sha512-qrcbyfnRVziRlB6IYwjCopYhO7Vud750JlJyuljruIXcPxr22y8zdckcJGsuOdnQ639uVD1tTXddrcH3t3QYIQ== + +"@floating-ui/dom@^1.2.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.5.tgz#c9ec259a24ce0958b1ea29674df4eee4455361a9" + integrity sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ== + dependencies: + "@floating-ui/core" "^1.2.4" + +"@floating-ui/vue@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/vue/-/vue-0.2.1.tgz#a52b66e020897ad0535d0d0d3b09932446fc6231" + integrity sha512-HE+EIeakID7wI6vUwF0yMpaW48bNaPj8QtnQaRMkaQFhQReVBA4bY6fmJ3J7X+dqVgDbMhyfCG0fBJfdQMdWxQ== + dependencies: + "@floating-ui/dom" "^1.2.1" + vue-demi "^0.13.11" + "@fortawesome/fontawesome-common-types@^0.2.36": version "0.2.36" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" From 8af2111ed268302767150f2abe5cdb459d8802ed Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sat, 8 Apr 2023 23:13:19 +0800 Subject: [PATCH 04/43] fix: fix overlay when dropdown placement property is 'auto' --- .../src/components/va-dropdown/VaDropdown.vue | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/components/va-dropdown/VaDropdown.vue b/packages/ui/src/components/va-dropdown/VaDropdown.vue index 4ed1515c4d..c9bae141ab 100644 --- a/packages/ui/src/components/va-dropdown/VaDropdown.vue +++ b/packages/ui/src/components/va-dropdown/VaDropdown.vue @@ -45,6 +45,7 @@ import { autoUpdate, flip, autoPlacement, + shift, } from '@floating-ui/vue' export default defineComponent({ @@ -221,24 +222,45 @@ export default defineComponent({ return props.disabled || !isPopoverFloating.value }) + const computedPlacement = computed(() => props.placement === 'auto' ? 'bottom' : props.placement as Placement) const anchorRef = computed(() => props.cursor ? cursorAnchor.value : computedAnchorRef.value) const { x, y, strategy } = useFloating(anchorRef, contentRef, { - placement: props.placement as Placement, + placement: computedPlacement.value, whileElementsMounted: autoUpdate, middleware: computed(() => { - let middleware: Middleware[] = [] + const middleware: Middleware[] = [] const offset = props.offset - console.log(offset, 'offset') if (offset) { - middleware = [ - offsetFn({ - mainAxis: 100, - crossAxis: 100, - }), - ] + middleware.push(offsetFn(Array.isArray(offset) + ? { + mainAxis: offset[0], + crossAxis: offset[1], + } + : { + mainAxis: offset, + crossAxis: 0, + })) } - middleware.push(props.autoPlacement ? autoPlacement() : flip()) + // TODO: I found the original autoPlacement eq flip + // middleware.push(props.autoPlacement + // ? autoPlacement() + // : flip({ + // crossAxis: !isPopoverFloating.value, + // })) + + if (props.autoPlacement) { + middleware.push(flip({ + crossAxis: !isPopoverFloating.value, + })) + } + + if (isPopoverFloating.value) { + // preventOverflow renamed to flip now + middleware.push(shift({ + padding: 5, + })) + } return middleware }), }) From 626bb17cbc461742e3751366bea5764a536b4f05 Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sat, 8 Apr 2023 23:21:29 +0800 Subject: [PATCH 05/43] refactor: comment unused import --- packages/ui/src/components/va-dropdown/VaDropdown.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/components/va-dropdown/VaDropdown.vue b/packages/ui/src/components/va-dropdown/VaDropdown.vue index c9bae141ab..d1305a9496 100644 --- a/packages/ui/src/components/va-dropdown/VaDropdown.vue +++ b/packages/ui/src/components/va-dropdown/VaDropdown.vue @@ -44,7 +44,7 @@ import { offset as offsetFn, autoUpdate, flip, - autoPlacement, + // autoPlacement, shift, } from '@floating-ui/vue' From 12cf2561d8b1d7b84991f32558cf944632e03ace Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sun, 9 Apr 2023 11:18:57 +0800 Subject: [PATCH 06/43] refactor: migrate logic of position calculating from dropdown component to useDropdown --- .../src/components/va-dropdown/VaDropdown.vue | 91 +++------------- packages/ui/src/composables/useDropdown.ts | 100 ++++++++++-------- 2 files changed, 70 insertions(+), 121 deletions(-) diff --git a/packages/ui/src/components/va-dropdown/VaDropdown.vue b/packages/ui/src/components/va-dropdown/VaDropdown.vue index d1305a9496..c6284654bd 100644 --- a/packages/ui/src/components/va-dropdown/VaDropdown.vue +++ b/packages/ui/src/components/va-dropdown/VaDropdown.vue @@ -27,7 +27,7 @@ import { useHTMLElement, MaybeHTMLElementOrSelector, useTranslation, - useDomRect, + useDropdown, } from '../../composables' import { useAnchorSelector } from './hooks/useAnchorSelector' import { useCursorAnchor } from './hooks/useCursorAnchor' @@ -37,16 +37,6 @@ import { renderSlotNode } from '../../utils/headless' import { warn } from '../../utils/console' import type { DropdownOffsetProp } from './types' -import { - type Middleware, - type Placement, - useFloating, - offset as offsetFn, - autoUpdate, - flip, - // autoPlacement, - shift, -} from '@floating-ui/vue' export default defineComponent({ name: 'VaDropdown', @@ -222,69 +212,20 @@ export default defineComponent({ return props.disabled || !isPopoverFloating.value }) - const computedPlacement = computed(() => props.placement === 'auto' ? 'bottom' : props.placement as Placement) - const anchorRef = computed(() => props.cursor ? cursorAnchor.value : computedAnchorRef.value) - const { x, y, strategy } = useFloating(anchorRef, contentRef, { - placement: computedPlacement.value, - whileElementsMounted: autoUpdate, - middleware: computed(() => { - const middleware: Middleware[] = [] - const offset = props.offset - if (offset) { - middleware.push(offsetFn(Array.isArray(offset) - ? { - mainAxis: offset[0], - crossAxis: offset[1], - } - : { - mainAxis: offset, - crossAxis: 0, - })) - } - - // TODO: I found the original autoPlacement eq flip - // middleware.push(props.autoPlacement - // ? autoPlacement() - // : flip({ - // crossAxis: !isPopoverFloating.value, - // })) - - if (props.autoPlacement) { - middleware.push(flip({ - crossAxis: !isPopoverFloating.value, - })) - } - - if (isPopoverFloating.value) { - // preventOverflow renamed to flip now - middleware.push(shift({ - padding: 5, - })) - } - return middleware - }), - }) - - const { domRect: anchorDomRect } = useDomRect(anchorRef) - - const contentStyle = computed(() => { - if (props.keepAnchorWidth) { - const { width } = anchorDomRect.value || {} - return { - position: strategy.value, - top: `${y.value}px`, - left: `${x.value}px`, - width: `${width}px`, - maxWidth: `${width}px`, - } - } - - return { - position: strategy.value, - top: `${y.value}px`, - left: `${x.value}px`, - } - }) + useDropdown( + computed(() => props.cursor ? cursorAnchor.value : computedAnchorRef.value), + contentRef, + computed(() => ({ + keepAnchorWidth: props.keepAnchorWidth, + offset: props.offset, + stickToEdges: props.stickToEdges, + autoPlacement: props.autoPlacement, + root: teleportTargetComputed.value, + viewport: targetComputed.value, + shift: props.preventOverflow, + })), + props, + ) const isMounted = useIsMounted() @@ -300,7 +241,6 @@ export default defineComponent({ onMouseLeave, emitAndClose, contentRef, - contentStyle, } }, @@ -314,7 +254,6 @@ export default defineComponent({ const defaultSlotVNode = renderSlotNode(this.$slots.default, slotBinds, { ref: 'contentRef', class: 'va-dropdown__content-wrapper', - style: this.contentStyle, onMouseOver: () => this.$props.isContentHoverable && this.onMouseEnter(), onMouseOut: () => this.onMouseLeave(), onClick: () => this.emitAndClose('content-click', this.$props.closeOnContentClick), diff --git a/packages/ui/src/composables/useDropdown.ts b/packages/ui/src/composables/useDropdown.ts index ec4c9e5e19..924e660d91 100644 --- a/packages/ui/src/composables/useDropdown.ts +++ b/packages/ui/src/composables/useDropdown.ts @@ -2,10 +2,8 @@ import { computed, unref, watchPostEffect, type Ref } from 'vue' import { useDomRect } from './useDomRect' import { useDocument } from './useDocument' -import { usePlacementAliases } from './usePlacementAliases' import { unwrapEl } from '../utils/unwrapEl' -import { mapObject } from '../utils/map-object' import type { PlacementAlignment, @@ -14,6 +12,17 @@ import type { ParsedPlacement, } from './usePlacementAliases' +import { + type Middleware, + type Placement, + useFloating, + offset as offsetFn, + autoPlacement as autoPlacementFn, + shift as shiftFn, + autoUpdate, + flip, +} from '@floating-ui/vue' + export type Offset = number | [number, number] type Coords = { x: number, y: number } @@ -156,6 +165,7 @@ export type usePopoverOptions = { /** Root element selector */ root?: string | HTMLElement, viewport?: HTMLElement, + shift?: boolean, } /** @@ -191,60 +201,57 @@ export const useDropdown = ( return documentRef.value.body }) const { domRect: anchorDomRect } = useDomRect(anchorRef) - const { domRect: contentDomRect } = useDomRect(contentRef) - - const css = { - position: 'absolute', - } - - const { position, align } = usePlacementAliases(props) - watchPostEffect(() => { - if (!rootRef.value || !anchorDomRect.value || !contentDomRect.value) { return } - - const { offset, keepAnchorWidth, autoPlacement, stickToEdges } = unref(options) - - // calculate coords (x and y) of content left-top corner - let coords = calculateContentCoords(position.value, align.value, anchorDomRect.value, contentDomRect.value) - - let offsetCoords: Coords = { x: 0, y: 0 } - if (offset) { - offsetCoords = calculateOffsetCoords(position.value, offset) - coords = mapObject(coords, (c, key) => c + offsetCoords[key]) - } - const rootRect = rootRef.value.getBoundingClientRect() - const viewportRect = unref(options).viewport?.getBoundingClientRect() ?? rootRect - - if (autoPlacement) { - const { position: newPosition, align: newAlign } = getAutoPlacement(position.value, align.value, coords, contentDomRect.value, viewportRect) - - if (newPosition !== position.value || newAlign !== align.value) { - coords = calculateContentCoords(newPosition, newAlign, anchorDomRect.value, contentDomRect.value) - - if (offset) { - offsetCoords = calculateOffsetCoords(newPosition, offset) - coords = mapObject(coords, (c, key) => c + offsetCoords[key]) - } + const computedPlacement = computed(() => props.placement === 'auto' ? 'bottom' : props.placement as Placement) + + const { x, y, strategy, update } = useFloating(anchorRef, contentRef, { + placement: computedPlacement.value, + whileElementsMounted: autoUpdate, + middleware: computed(() => { + const middleware: Middleware[] = [] + const { offset, autoPlacement, shift } = unref(options) + if (offset) { + middleware.push(offsetFn(Array.isArray(offset) + ? { + mainAxis: offset[0], + crossAxis: offset[1], + } + : { + mainAxis: offset, + crossAxis: 0, + })) } - } - if (stickToEdges) { - coords = calculateClipToEdge(coords, offsetCoords, contentDomRect.value, anchorDomRect.value, viewportRect) - } + middleware.push(autoPlacement + ? autoPlacementFn() + : flip({ + crossAxis: !shift, + })) + + if (shift) { + // preventOverflow renamed to flip now + middleware.push(shiftFn({ + padding: 5, + })) + } + return middleware + }), + }) - coords.x -= rootRect.x + rootRef.value.clientLeft - coords.y -= rootRect.y + rootRef.value.clientTop + watchPostEffect(() => { + if (!rootRef.value || !anchorDomRect.value || x.value === null || y.value === null) { return } if (unwrapEl(contentRef.value)) { let widthCss = {} + const { keepAnchorWidth } = unref(options) if (keepAnchorWidth) { - const { width } = anchorDomRect.value + const { width } = anchorDomRect.value || {} widthCss = { width: `${width}px`, maxWidth: `${width}px` } } Object.assign(unwrapEl(contentRef.value)!.style, { - ...css, - ...coordsToCss(coords), + position: strategy.value, + ...coordsToCss({ x: x.value, y: y.value }), ...widthCss, }) } @@ -252,6 +259,9 @@ export const useDropdown = ( return { anchorDomRect, - contentDomRect, + x, + y, + strategy, + update, } } From d57e3740b2a5f19ef1da78f5000a50b512a0ccd8 Mon Sep 17 00:00:00 2001 From: chenguixin <591764955@qq.com> Date: Sat, 15 Apr 2023 17:14:41 +0800 Subject: [PATCH 07/43] fix: fix "Ref Target" demo broken --- .../src/components/va-dropdown/VaDropdown.vue | 9 ++++++- packages/ui/src/composables/useDomRect.ts | 2 +- packages/ui/src/composables/useDropdown.ts | 24 ++++++++++++------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/components/va-dropdown/VaDropdown.vue b/packages/ui/src/components/va-dropdown/VaDropdown.vue index c6284654bd..93e9284934 100644 --- a/packages/ui/src/components/va-dropdown/VaDropdown.vue +++ b/packages/ui/src/components/va-dropdown/VaDropdown.vue @@ -212,8 +212,15 @@ export default defineComponent({ return props.disabled || !isPopoverFloating.value }) + const anchorRef = computed(() => { + if (props.target) { + return target.value + } + + return props.cursor ? cursorAnchor.value : computedAnchorRef.value + }) useDropdown( - computed(() => props.cursor ? cursorAnchor.value : computedAnchorRef.value), + anchorRef, contentRef, computed(() => ({ keepAnchorWidth: props.keepAnchorWidth, diff --git a/packages/ui/src/composables/useDomRect.ts b/packages/ui/src/composables/useDomRect.ts index 8283119e51..f60b0ef190 100644 --- a/packages/ui/src/composables/useDomRect.ts +++ b/packages/ui/src/composables/useDomRect.ts @@ -12,7 +12,7 @@ const isDomRectEqual = (a: any, b: any) => { return true } -export const useDomRect = (target: Ref) => { +export const useDomRect = (target: Ref) => { const domRect = ref(null) let prev = {} diff --git a/packages/ui/src/composables/useDropdown.ts b/packages/ui/src/composables/useDropdown.ts index 924e660d91..91724946f6 100644 --- a/packages/ui/src/composables/useDropdown.ts +++ b/packages/ui/src/composables/useDropdown.ts @@ -210,6 +210,7 @@ export const useDropdown = ( middleware: computed(() => { const middleware: Middleware[] = [] const { offset, autoPlacement, shift } = unref(options) + if (offset) { middleware.push(offsetFn(Array.isArray(offset) ? { @@ -222,16 +223,23 @@ export const useDropdown = ( })) } - middleware.push(autoPlacement - ? autoPlacementFn() - : flip({ - crossAxis: !shift, - })) + if (autoPlacement) { + middleware.push(flip({ crossAxis: !shift })) + } + // if (autoPlacement) { + // middleware.push(autoPlacementFn()) + // } else { + // middleware.push(flip({ + // crossAxis: !shift, + // })) + // } if (shift) { - // preventOverflow renamed to flip now + // preventOverflow renamed to shift now middleware.push(shiftFn({ padding: 5, + // TODO: the rootBoundary should be the rootRef, but it doesn't work + // rootBoundary: anchorRef.value ? useDomRect(anchorRef).domRect.value as Rect : 'viewport', })) } return middleware @@ -239,7 +247,7 @@ export const useDropdown = ( }) watchPostEffect(() => { - if (!rootRef.value || !anchorDomRect.value || x.value === null || y.value === null) { return } + if (!rootRef.value || !contentRef.value) { return } if (unwrapEl(contentRef.value)) { let widthCss = {} @@ -251,7 +259,7 @@ export const useDropdown = ( Object.assign(unwrapEl(contentRef.value)!.style, { position: strategy.value, - ...coordsToCss({ x: x.value, y: y.value }), + ...coordsToCss({ x: x.value || 0, y: y.value || 0 }), ...widthCss, }) } From 926134bd3f615729d3a447b612e48fa4833e432b Mon Sep 17 00:00:00 2001 From: Maksim Nedoshev Date: Tue, 18 Apr 2023 12:42:01 +0300 Subject: [PATCH 08/43] fix(dropdown): cursorAnchor --- .../va-dropdown/VaDropdown.demo.vue | 24 ++++++++++++++++++- .../va-dropdown/hooks/useCursorAnchor.ts | 17 +++++++------ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/components/va-dropdown/VaDropdown.demo.vue b/packages/ui/src/components/va-dropdown/VaDropdown.demo.vue index 9f4f65220b..dccbb5b8de 100644 --- a/packages/ui/src/components/va-dropdown/VaDropdown.demo.vue +++ b/packages/ui/src/components/va-dropdown/VaDropdown.demo.vue @@ -490,6 +490,27 @@ + + + + Contextual popover! + + + + @@ -499,9 +520,10 @@ import { VaDropdown, VaDropdownContent } from './' import DropdownCloseButton from './__demo__/DropdownCloseButton' import { VaInput } from '../va-input' import { VaBadge } from '../va-badge' +import { VaImage } from '../va-image' export default { - components: { DropdownCloseButton, VaDropdown, VaInput, VaDropdownContent, VaBadge }, + components: { DropdownCloseButton, VaDropdown, VaInput, VaDropdownContent, VaBadge, VaImage }, data () { return { possiblePositions: [ diff --git a/packages/ui/src/components/va-dropdown/hooks/useCursorAnchor.ts b/packages/ui/src/components/va-dropdown/hooks/useCursorAnchor.ts index 51d62f4b14..00a43a5fdb 100644 --- a/packages/ui/src/components/va-dropdown/hooks/useCursorAnchor.ts +++ b/packages/ui/src/components/va-dropdown/hooks/useCursorAnchor.ts @@ -1,6 +1,7 @@ -import { computed, reactive, Ref, watch, watchEffect } from 'vue' +import { computed, reactive, Ref, watchEffect } from 'vue' import { useEvent } from '../../../composables/useEvent' +/** Returns fake HTML Element which `getBoundingClientRect` method returns mouse position */ export const useCursorAnchor = (anchorRef: Ref, noUpdate: Ref) => { const mouse = reactive({ x: 0, y: 0 }) @@ -33,6 +34,8 @@ export const useCursorAnchor = (anchorRef: Ref, noUpdat return { ...rect, + width: 1, + height: 1, x: x, y: y, bottom: y + 1, @@ -42,14 +45,10 @@ export const useCursorAnchor = (anchorRef: Ref, noUpdat } } - return new Proxy(target, { - get (target, key: keyof typeof target) { - if (key === 'getBoundingClientRect') { - return getBoundingClientRect - } - - return target[key] + return { + getBoundingClientRect () { + return getBoundingClientRect() }, - }) + } as unknown as HTMLElement // TODO: Change to DOMRectable instead of HTMLElement }) } From a3ac794c18ed41b5a31fea95778c9983adfdbc65 Mon Sep 17 00:00:00 2001 From: Maksim Nedoshev Date: Tue, 23 May 2023 20:18:41 +0300 Subject: [PATCH 09/43] chore: update floating-ui to 1.0.0 --- packages/ui/package.json | 2 +- yarn.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index d66ee3d8b1..b354bb143d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -42,7 +42,7 @@ "server:webapp": "npx http-server dist --push-state" }, "dependencies": { - "@floating-ui/vue": "^0.2.1", + "@floating-ui/vue": "^1.0.0", "@types/lodash": "^4.14.161", "cleave.js": "^1.6.0", "colortranslator": "^1.9.2", diff --git a/yarn.lock b/yarn.lock index 42f5bcb039..fd6baf72b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1452,24 +1452,24 @@ unique-filename "^1.1.1" which "^1.3.1" -"@floating-ui/core@^1.2.4": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.5.tgz#612f0d203e6f647490d572c7b798eebac9e3cf54" - integrity sha512-qrcbyfnRVziRlB6IYwjCopYhO7Vud750JlJyuljruIXcPxr22y8zdckcJGsuOdnQ639uVD1tTXddrcH3t3QYIQ== +"@floating-ui/core@^1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0" + integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== -"@floating-ui/dom@^1.2.1": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.5.tgz#c9ec259a24ce0958b1ea29674df4eee4455361a9" - integrity sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ== +"@floating-ui/dom@^1.2.7": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.8.tgz#aee0f6ccc0787ab8fe741487a6e5e95b7b125375" + integrity sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg== dependencies: - "@floating-ui/core" "^1.2.4" + "@floating-ui/core" "^1.2.6" -"@floating-ui/vue@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/vue/-/vue-0.2.1.tgz#a52b66e020897ad0535d0d0d3b09932446fc6231" - integrity sha512-HE+EIeakID7wI6vUwF0yMpaW48bNaPj8QtnQaRMkaQFhQReVBA4bY6fmJ3J7X+dqVgDbMhyfCG0fBJfdQMdWxQ== +"@floating-ui/vue@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@floating-ui/vue/-/vue-1.0.0.tgz#95abef6c977249ad76126b8f14137c5dfe12cec5" + integrity sha512-vwznPUCobUscJG6zpYLWfOgDRxE0+fCvnbO0bxn9nh0ILrXabqDLsvnaYy1hLTVa+vaHZhIS9UxQX4B6NwSnFA== dependencies: - "@floating-ui/dom" "^1.2.1" + "@floating-ui/dom" "^1.2.7" vue-demi "^0.13.11" "@fortawesome/fontawesome-common-types@^0.2.36": From ae7eb34b276ebba2e17defbfd172f3b284b52bd0 Mon Sep 17 00:00:00 2001 From: ilearnjs <20753143+ilearnjs@users.noreply.github.com> Date: Fri, 2 Jun 2023 00:23:59 +0200 Subject: [PATCH 10/43] Init version of new dropdown --- packages/ui/package.json | 1 + packages/ui/src/components/index.ts | 1 + .../va-dropdown-new/VaDropdownNew.demo.vue | 81 +++++++++++++++++++ .../va-dropdown-new/VaDropdownNew.vue | 61 ++++++++++++++ .../src/components/va-dropdown-new/index.ts | 4 + yarn.lock | 25 ++++++ 6 files changed, 173 insertions(+) create mode 100644 packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue create mode 100644 packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue create mode 100644 packages/ui/src/components/va-dropdown-new/index.ts diff --git a/packages/ui/package.json b/packages/ui/package.json index 41f718f05d..b0a33a3a87 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -42,6 +42,7 @@ "server:webapp": "npx http-server dist --push-state" }, "dependencies": { + "@floating-ui/vue": "^1.0.1", "@types/lodash": "^4.14.161", "cleave.js": "^1.6.0", "colortranslator": "^1.9.2", diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index 0b5b94091f..ba26f5ed50 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -40,6 +40,7 @@ export * from './va-date-input' export * from './va-date-picker' export * from './va-divider' export * from './va-dropdown' +export * from './va-dropdown-new' export * from './va-form' export * from './va-hover' export * from './va-icon' diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue new file mode 100644 index 0000000000..bae19f31c3 --- /dev/null +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue new file mode 100644 index 0000000000..87b8d8d4f2 --- /dev/null +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue @@ -0,0 +1,61 @@ + + + diff --git a/packages/ui/src/components/va-dropdown-new/index.ts b/packages/ui/src/components/va-dropdown-new/index.ts new file mode 100644 index 0000000000..6b7f70bdc6 --- /dev/null +++ b/packages/ui/src/components/va-dropdown-new/index.ts @@ -0,0 +1,4 @@ +import withConfigTransport from '../../services/config-transport/withConfigTransport' +import _VaDropdownNew from './VaDropdownNew.vue' + +export const VaDropdownNew = withConfigTransport(_VaDropdownNew) diff --git a/yarn.lock b/yarn.lock index 74c88ee8eb..619f7c5d18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1452,6 +1452,26 @@ unique-filename "^1.1.1" which "^1.3.1" +"@floating-ui/core@^1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0" + integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== + +"@floating-ui/dom@^1.2.9": + version "1.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.9.tgz#b9ed1c15d30963419a6736f1b7feb350dd49c603" + integrity sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ== + dependencies: + "@floating-ui/core" "^1.2.6" + +"@floating-ui/vue@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@floating-ui/vue/-/vue-1.0.1.tgz#b20ea07f0cf3fb1374cdb04aeba9c06d886d2261" + integrity sha512-HZmmNWaztKYKOQxXvMzJYCYtfgG07cL/bPQvZ92AFG3Ktw71bvvLKXsZDAyIxGpqRo9WiTPsYknnSuLV2H/riA== + dependencies: + "@floating-ui/dom" "^1.2.9" + vue-demi ">=0.13.0" + "@fortawesome/fontawesome-common-types@^0.2.36": version "0.2.36" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" @@ -17982,6 +18002,11 @@ vue-component-type-helpers@1.6.1: resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-1.6.1.tgz#3c1636e3b900807dab71cce0bfa1b7ec0aa42b46" integrity sha512-3UoSEAU2pGcmO4Ir36YkFm6OosyMhwXRtt+7+XjqUnCgGzjT256nHViYhJT692DSW1V1/v4Zd4z1GoZJNhF3GQ== +vue-demi@>=0.13.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.5.tgz#676d0463d1a1266d5ab5cba932e043d8f5f2fbd9" + integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA== + vue-demi@^0.13.11, vue-demi@^0.13.5: version "0.13.11" resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99" From eb691e1e4f2088991c93b6c6f243592f6bcc0a30 Mon Sep 17 00:00:00 2001 From: ilearnjs <20753143+ilearnjs@users.noreply.github.com> Date: Fri, 2 Jun 2023 12:54:22 +0200 Subject: [PATCH 11/43] Update new dropdown --- .../va-dropdown-new/VaDropdownNew.demo.vue | 127 ++++++++++++-- .../va-dropdown-new/VaDropdownNew.vue | 162 ++++++++++++++++-- 2 files changed, 260 insertions(+), 29 deletions(-) diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue index bae19f31c3..9786961bae 100644 --- a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue @@ -1,27 +1,81 @@ @@ -43,9 +125,24 @@ export default { }, setup () { return { - targetBig: ref(null), + targetFlip: ref(null), + targetFlipShift: ref(null), } }, + directives: { + scrollToMiddleY: { + mounted: (el) => { + const { scrollHeight, clientHeight } = el + el.scrollTop = (scrollHeight - clientHeight) / 2 + }, + }, + scrollToMiddleX: { + mounted: (el) => { + const { scrollWidth, clientWidth } = el + el.scrollLeft = (scrollWidth - clientWidth) / 2 + }, + }, + }, } @@ -63,19 +160,15 @@ export default { } .content-container { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; + display: grid; + place-items: center; } .vertical-space { height: 400px; } -.scrollable { - width: 80px; - height: 80px; - border: 1px dashed black; +.horizontal-space { + width: 1000px; } diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue index 87b8d8d4f2..97ceeb1dc8 100644 --- a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue @@ -1,6 +1,7 @@ + + diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue new file mode 100644 index 0000000000..36729dd297 --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue @@ -0,0 +1,10 @@ + diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue new file mode 100644 index 0000000000..0624a68ab1 --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue @@ -0,0 +1,116 @@ + + + diff --git a/packages/docs/page-config/ui-elements/dropdown-new/index.ts b/packages/docs/page-config/ui-elements/dropdown-new/index.ts new file mode 100644 index 0000000000..4435eb0cec --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/index.ts @@ -0,0 +1,25 @@ +import apiOptions from "./api-options"; + +import specs from "./specs.md?raw"; + +export default definePageConfig({ + blocks: [ + block.title("dropdown-new.title"), + block.paragraph("dropdown-new.text"), + + // examples/ + block.example("Default"), + + block.example("PlacementAndOffset"), + + // block.example("Trigger"), + // + // block.example("Cursor"), + // + // block.example("PreventOverflow"), + // + // block.api("VaDropdown", apiOptions), + // + // block.collapse("useDropdown hook specs", [block.markdown(specs)]), + ], +}); diff --git a/packages/docs/page-config/ui-elements/dropdown-new/translation/en.json b/packages/docs/page-config/ui-elements/dropdown-new/translation/en.json new file mode 100644 index 0000000000..b999b02cbb --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/translation/en.json @@ -0,0 +1,26 @@ +{ + "title": "Dropdown", + "text": "Dropdown component is a **headless** component that allow you to show some content near anchor. It is more utility component. You can use it with `VaDropdownContent` or `VaCard` component. This component looks like popover, but without any additional styling as `VaPopover` has.", + "examples": { + "default": { + "title": "Default usage", + "text": "" + }, + "placementAndOffset": { + "title": "Placement and Offset", + "text": "You can place dropdown any direction you want. Offset is calculated relative to `placement` prop. We use `main` and `cross` offset. Means `main` will be relative to `placement` direction while `cross` is perpendicular. `auto` placement will be `bottom` by default, but will change to `top` if it is not possible to display on bottom." + }, + "trigger": { + "title": "Trigger", + "text": "You can use `click`, `hover` or `none` trigger which will open dropdown. If you want dropdown to be opened only programmatically use `none` trigger" + }, + "cursor": { + "title": "Place on cursor", + "text": "You can render dropdown content on cursor position. It is useful to use `cursor` props with `auto-placement` so if content do not fit target it will be placed somewhere else." + }, + "preventOverflow": { + "title": "Prevent overflow", + "text": "By default dropdown content is rendered as body child. This way we prevent any overflow. In example below `overflow: hidden` of green box is ignored. But we still able to respec overflow by changing `target` prop. In example below `overflow: hidden` of red box is hiding dropdown content." + } + } +} \ No newline at end of file diff --git a/packages/docs/translations/en.json b/packages/docs/translations/en.json index 088cf50882..4affa58975 100644 --- a/packages/docs/translations/en.json +++ b/packages/docs/translations/en.json @@ -1465,6 +1465,34 @@ "methods": {}, "slots": {} }, + "VaDropdownNew": { + "props": { + "anchorSelector": "Anchor CSS selector instead of passing slot", + "innerAnchorSelector": "Anchor CSS selector inside passed slot", + "autoPlacement": "If dropdown doesn't fit viewport, it will be placed automatically to fit viewport", + "closeOnAnchorClick": "Dropdown will be closed when anchor is clicked", + "closeOnClickOutside": "Dropdown will be closed when clicked outside dropdown content and anchor", + "closeOnContentClick": "Dropdown will be closed when clicked inside dropdown content", + "cursor": "Dropdown will be rendered relative to cursor position", + "hoverOutTimeout": "Time in `ms` after mouse leave dropdown before it will be closed", + "hoverOverTimeout": "Time in `ms` after mouse enter dropdown before it will be opened", + "isContentHoverable": "If true, dropdown content will be hoverable", + "keepAnchorWidth": "If true, dropdown content will have exact same width as anchor", + "offset": "Dropdown content will be moved by main and cross axis according to current `placement`", + "placement": "Dropdown content will be placed on `placement` side of anchor", + "stickToEdges": "Dropdown will not be rendered outside of viewport. It will be moved in opposite direction", + "trigger": "Action which will open and close dropdown", + "target": "Dropdown content parent. Dropdown content will be attached to `target` to prevent overflow", + "preventOverflow": "If true, dropdown will be teleported to `target` ignoring `overflow: hidden` on relative position elements" + }, + "events": { + "anchorClick": "The event is triggered when anchor is clicked", + "clickOutside": "The event is triggered when clicked outside dropdown content and anchor", + "contentClick": "The event is triggered when clicked inside dropdown content" + }, + "methods": {}, + "slots": {} + }, "VaScrollContainer": { "props": { "horizontal": "Enables horizontal scrolling.", diff --git a/packages/nuxt/src/config/components.ts b/packages/nuxt/src/config/components.ts index afbb1b11d8..841f2988bc 100644 --- a/packages/nuxt/src/config/components.ts +++ b/packages/nuxt/src/config/components.ts @@ -35,6 +35,7 @@ export default [ 'VaDivider', 'VaDropdown', 'VaDropdownContent', + 'VaDropdownNew', 'VaFileUpload', 'VaForm', 'VaHover', diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue index ef0c17b803..723bff52d4 100644 --- a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue @@ -29,7 +29,9 @@ import { useFloating, autoUpdate, flip, shift, Placement, offset, size } from '@ import kebabCase from 'lodash/kebabCase' import { createStatefulProps, - MaybeHTMLElementOrSelector, useClickOutside, useDomRect, useHTMLElement, + MaybeHTMLElementOrSelector, + useClickOutside, + useHTMLElement, useHTMLElementSelector, useIsMounted, useStateful, } from '../../composables' @@ -95,7 +97,7 @@ export default defineComponent({ }) const teleportDisabled = computed(() => !teleport.value) - const showFloating = computed(() => valueComputed.value && isMounted.value) + const showFloating = computed(() => isMounted.value && valueComputed.value) const onClick = (e: MouseEvent) => { if ((props.trigger !== 'click' && kebabCase(props.trigger) !== 'right-click')) { return } // || props.disabled) { return } @@ -183,7 +185,7 @@ export default defineComponent({ offset(offsetComputed.value), // flip element, works for -start, -end flip({ - boundary: target.value, + boundary: isMounted.value ? target.value : undefined, }), // shift the element into the view shift(), @@ -215,6 +217,8 @@ export default defineComponent({ middleware: middlewareComputed, }) + // const floatingStyles = ref({}) + return { anchor, floating, From 6f992038040673e0cb5ab29ae48312eeb9808e31 Mon Sep 17 00:00:00 2001 From: ilearnjs <20753143+ilearnjs@users.noreply.github.com> Date: Tue, 6 Jun 2023 21:07:52 +0200 Subject: [PATCH 16/43] DropdownNew docs. Add dropdown styles --- .../dropdown-new/examples/Cursor.vue | 20 +++++++ .../dropdown-new/examples/Default.vue | 3 +- .../examples/PlacementAndOffset.vue | 4 +- .../dropdown-new/examples/PreventOverflow.vue | 48 ++++++++++++++++ .../dropdown-new/examples/Trigger.vue | 56 +++++++++++++++++++ .../ui-elements/dropdown-new/index.ts | 12 ++-- .../va-dropdown-new/VaDropdownNew.vue | 38 ++++++++++++- .../va-dropdown-new/_variables.scss | 6 ++ 8 files changed, 174 insertions(+), 13 deletions(-) create mode 100644 packages/docs/page-config/ui-elements/dropdown-new/examples/Cursor.vue create mode 100644 packages/docs/page-config/ui-elements/dropdown-new/examples/PreventOverflow.vue create mode 100644 packages/docs/page-config/ui-elements/dropdown-new/examples/Trigger.vue create mode 100644 packages/ui/src/components/va-dropdown-new/_variables.scss diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/Cursor.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/Cursor.vue new file mode 100644 index 0000000000..3ea49990ab --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/Cursor.vue @@ -0,0 +1,20 @@ + diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue index 36729dd297..1c4adb66bc 100644 --- a/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/Default.vue @@ -3,8 +3,7 @@ - Dropped down! - + Dropped down! diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue index 0624a68ab1..12047f263e 100644 --- a/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/PlacementAndOffset.vue @@ -13,7 +13,7 @@ style="padding: 4rem;" >
- Dropdown - +
diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/PreventOverflow.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/PreventOverflow.vue new file mode 100644 index 0000000000..67644f4396 --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/PreventOverflow.vue @@ -0,0 +1,48 @@ + + + diff --git a/packages/docs/page-config/ui-elements/dropdown-new/examples/Trigger.vue b/packages/docs/page-config/ui-elements/dropdown-new/examples/Trigger.vue new file mode 100644 index 0000000000..7bde6776c0 --- /dev/null +++ b/packages/docs/page-config/ui-elements/dropdown-new/examples/Trigger.vue @@ -0,0 +1,56 @@ + + + diff --git a/packages/docs/page-config/ui-elements/dropdown-new/index.ts b/packages/docs/page-config/ui-elements/dropdown-new/index.ts index 4435eb0cec..c038c22134 100644 --- a/packages/docs/page-config/ui-elements/dropdown-new/index.ts +++ b/packages/docs/page-config/ui-elements/dropdown-new/index.ts @@ -12,12 +12,12 @@ export default definePageConfig({ block.example("PlacementAndOffset"), - // block.example("Trigger"), - // - // block.example("Cursor"), - // - // block.example("PreventOverflow"), - // + block.example("Trigger"), + + block.example("Cursor"), + + block.example("PreventOverflow"), + // block.api("VaDropdown", apiOptions), // // block.collapse("useDropdown hook specs", [block.markdown(specs)]), diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue index 723bff52d4..f0149f7093 100644 --- a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.vue @@ -2,6 +2,8 @@
@@ -52,7 +55,7 @@ export default defineComponent({ validator: (value: string) => ['click', 'right-click', 'hover', 'dblclick', 'none'].includes(value), }, closeOnClickOutside: { type: Boolean, default: true }, - placement: { type: String as PropType, default: 'bottom' }, + placement: { type: String as PropType, default: 'bottom' }, offset: { type: [Array, Number] as PropType, default: 0 }, keepAnchorWidth: { type: Boolean, default: false }, target: { type: [String, Object] as PropType, default: undefined }, @@ -165,6 +168,10 @@ export default defineComponent({ }) const placementComputed = computed(() => { + if (props.placement === 'auto') { + return 'bottom' + } + return props.placement }) @@ -217,8 +224,6 @@ export default defineComponent({ middleware: middlewareComputed, }) - // const floatingStyles = ref({}) - return { anchor, floating, @@ -230,3 +235,30 @@ export default defineComponent({ }, }) + + diff --git a/packages/ui/src/components/va-dropdown-new/_variables.scss b/packages/ui/src/components/va-dropdown-new/_variables.scss new file mode 100644 index 0000000000..bbb3693fd1 --- /dev/null +++ b/packages/ui/src/components/va-dropdown-new/_variables.scss @@ -0,0 +1,6 @@ +:root, +:host { + --va-dropdown-line-height: 1; + --va-dropdown-content-wrapper-z-index: var(--va-z-index-teleport-overlay, 9); + --va-dropdown-display: inline-flex; +} From 683652c2682cbce8029a8be16a0fac0778a8ee86 Mon Sep 17 00:00:00 2001 From: ilearnjs <20753143+ilearnjs@users.noreply.github.com> Date: Tue, 6 Jun 2023 21:21:58 +0200 Subject: [PATCH 17/43] Update NewDropdown docs --- .../ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue index 267e00b4a0..a375ab75ec 100644 --- a/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue +++ b/packages/ui/src/components/va-dropdown-new/VaDropdownNew.demo.vue @@ -101,8 +101,8 @@