diff --git a/packages/vuetify/src/components/VApp/VApp.tsx b/packages/vuetify/src/components/VApp/VApp.tsx index 063152fc1f7..fdbb9870bc9 100644 --- a/packages/vuetify/src/components/VApp/VApp.tsx +++ b/packages/vuetify/src/components/VApp/VApp.tsx @@ -8,7 +8,6 @@ import { useRtl } from '@/composables/locale' import { makeThemeProps, provideTheme } from '@/composables/theme' // Utilities -import { Suspense } from 'vue' import { genericComponent, propsFactory, useRender } from '@/util' export const makeVAppProps = propsFactory({ @@ -42,11 +41,7 @@ export const VApp = genericComponent()({ ]} >
- - <> - { slots.default?.() } - - + { slots.default?.() }
)) diff --git a/packages/vuetify/src/components/VAppBar/VAppBar.tsx b/packages/vuetify/src/components/VAppBar/VAppBar.tsx index 87eb94ddb1e..905e180c1e9 100644 --- a/packages/vuetify/src/components/VAppBar/VAppBar.tsx +++ b/packages/vuetify/src/components/VAppBar/VAppBar.tsx @@ -106,8 +106,10 @@ export const VAppBar = genericComponent()({ : undefined )) const height = computed(() => { - const height = Number(vToolbarRef.value?.contentHeight ?? props.height) - const extensionHeight = Number(vToolbarRef.value?.extensionHeight ?? 0) + if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0 + + const height = vToolbarRef.value?.contentHeight ?? 0 + const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0 if (!canHide.value) return (height + extensionHeight) @@ -131,7 +133,7 @@ export const VAppBar = genericComponent()({ }) const { ssrBootStyles } = useSsrBoot() - const { layoutItemStyles, layoutIsReady } = useLayoutItem({ + const { layoutItemStyles } = useLayoutItem({ id: props.name, order: computed(() => parseInt(props.order, 10)), position: toRef(props, 'location'), @@ -171,7 +173,7 @@ export const VAppBar = genericComponent()({ ) }) - return layoutIsReady + return {} }, }) diff --git a/packages/vuetify/src/components/VBottomNavigation/VBottomNavigation.tsx b/packages/vuetify/src/components/VBottomNavigation/VBottomNavigation.tsx index bb05f006109..d4b24a860f1 100644 --- a/packages/vuetify/src/components/VBottomNavigation/VBottomNavigation.tsx +++ b/packages/vuetify/src/components/VBottomNavigation/VBottomNavigation.tsx @@ -85,7 +85,7 @@ export const VBottomNavigation = genericComponent( (props.density === 'compact' ? 16 : 0) )) const isActive = useProxiedModel(props, 'active', props.active) - const { layoutItemStyles, layoutIsReady } = useLayoutItem({ + const { layoutItemStyles } = useLayoutItem({ id: props.name, order: computed(() => parseInt(props.order, 10)), position: computed(() => 'bottom'), @@ -144,7 +144,7 @@ export const VBottomNavigation = genericComponent( ) }) - return layoutIsReady + return {} }, }) diff --git a/packages/vuetify/src/components/VFooter/VFooter.tsx b/packages/vuetify/src/components/VFooter/VFooter.tsx index 3fdafd49a8f..2da403e1268 100644 --- a/packages/vuetify/src/components/VFooter/VFooter.tsx +++ b/packages/vuetify/src/components/VFooter/VFooter.tsx @@ -41,7 +41,6 @@ export const VFooter = genericComponent()({ setup (props, { slots }) { const layoutItemStyles = ref() - const layoutIsReady = shallowRef() const { themeClasses } = provideTheme(props) const { backgroundColorClasses, backgroundColorStyles } = useBackgroundColor(toRef(props, 'color')) @@ -69,7 +68,6 @@ export const VFooter = genericComponent()({ watchEffect(() => { layoutItemStyles.value = layout.layoutItemStyles.value - layoutIsReady.value = layout.layoutIsReady }) }) @@ -96,7 +94,7 @@ export const VFooter = genericComponent()({ /> )) - return props.app ? layoutIsReady.value : {} + return {} }, }) diff --git a/packages/vuetify/src/components/VLayout/VLayout.tsx b/packages/vuetify/src/components/VLayout/VLayout.tsx index 065882a3e30..3b2f6085ad8 100644 --- a/packages/vuetify/src/components/VLayout/VLayout.tsx +++ b/packages/vuetify/src/components/VLayout/VLayout.tsx @@ -7,7 +7,6 @@ import { makeDimensionProps, useDimension } from '@/composables/dimensions' import { createLayout, makeLayoutProps } from '@/composables/layout' // Utilities -import { Suspense } from 'vue' import { genericComponent, propsFactory, useRender } from '@/util' export const makeVLayoutProps = propsFactory({ @@ -38,11 +37,7 @@ export const VLayout = genericComponent()({ props.style, ]} > - - <> - { slots.default?.() } - - + { slots.default?.() } )) diff --git a/packages/vuetify/src/components/VLayout/VLayoutItem.tsx b/packages/vuetify/src/components/VLayout/VLayoutItem.tsx index f7f9af525b0..b42c9379dca 100644 --- a/packages/vuetify/src/components/VLayout/VLayoutItem.tsx +++ b/packages/vuetify/src/components/VLayout/VLayoutItem.tsx @@ -7,7 +7,7 @@ import { makeLayoutItemProps, useLayoutItem } from '@/composables/layout' // Utilities import { computed, toRef } from 'vue' -import { genericComponent, propsFactory, useRender } from '@/util' +import { genericComponent, propsFactory } from '@/util' // Types import type { PropType } from 'vue' @@ -33,7 +33,7 @@ export const VLayoutItem = genericComponent()({ props: makeVLayoutItemProps(), setup (props, { slots }) { - const { layoutItemStyles, layoutIsReady } = useLayoutItem({ + const { layoutItemStyles } = useLayoutItem({ id: props.name, order: computed(() => parseInt(props.order, 10)), position: toRef(props, 'position'), @@ -43,7 +43,7 @@ export const VLayoutItem = genericComponent()({ absolute: toRef(props, 'absolute'), }) - useRender(() => ( + return () => (
{ slots.default?.() }
- )) - - return layoutIsReady + ) }, }) diff --git a/packages/vuetify/src/components/VMain/VMain.tsx b/packages/vuetify/src/components/VMain/VMain.tsx index b365cc6b3fe..86a0a05ebd9 100644 --- a/packages/vuetify/src/components/VMain/VMain.tsx +++ b/packages/vuetify/src/components/VMain/VMain.tsx @@ -26,7 +26,7 @@ export const VMain = genericComponent()({ setup (props, { slots }) { const { dimensionStyles } = useDimension(props) - const { mainStyles, layoutIsReady } = useLayout() + const { mainStyles } = useLayout() const { ssrBootStyles } = useSsrBoot() useRender(() => ( @@ -54,7 +54,7 @@ export const VMain = genericComponent()({ )) - return layoutIsReady + return {} }, }) diff --git a/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx b/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx index ef077b7c8da..83207b87ec4 100644 --- a/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx +++ b/packages/vuetify/src/components/VNavigationDrawer/VNavigationDrawer.tsx @@ -178,7 +178,7 @@ export const VNavigationDrawer = genericComponent()({ return isDragging.value ? size * dragProgress.value : size }) const elementSize = computed(() => ['top', 'bottom'].includes(props.location) ? 0 : width.value) - const { layoutItemStyles, layoutItemScrimStyles, layoutIsReady } = useLayoutItem({ + const { layoutItemStyles, layoutItemScrimStyles } = useLayoutItem({ id: props.name, order: computed(() => parseInt(props.order, 10)), position: location, @@ -314,7 +314,9 @@ export const VNavigationDrawer = genericComponent()({ ) }) - return layoutIsReady.then(() => ({ isStuck })) + return { + isStuck, + } }, }) diff --git a/packages/vuetify/src/composables/layout.ts b/packages/vuetify/src/composables/layout.ts index b979daab7f6..e96b8e36fc8 100644 --- a/packages/vuetify/src/composables/layout.ts +++ b/packages/vuetify/src/composables/layout.ts @@ -5,16 +5,16 @@ import { useResizeObserver } from '@/composables/resizeObserver' import { computed, inject, - nextTick, onActivated, onBeforeUnmount, onDeactivated, + onMounted, provide, reactive, ref, shallowRef, } from 'vue' -import { convertToUnit, eagerComputed, findChildrenWithProvide, getCurrentInstance, getUid, propsFactory } from '@/util' +import { convertToUnit, findChildrenWithProvide, getCurrentInstance, getUid, propsFactory } from '@/util' // Types import type { ComponentInternalInstance, CSSProperties, InjectionKey, Prop, Ref } from 'vue' @@ -59,7 +59,6 @@ interface LayoutProvide { items: Ref layoutRect: Ref rootZIndex: Ref - layoutIsReady: Promise } export const VuetifyLayoutKey: InjectionKey = Symbol.for('vuetify:layout') @@ -92,10 +91,7 @@ export function useLayout () { if (!layout) throw new Error('[Vuetify] Could not find injected layout') - const layoutIsReady = nextTick() - return { - layoutIsReady, getLayoutItem: layout.getLayoutItem, mainRect: layout.mainRect, mainStyles: layout.mainStyles, @@ -126,8 +122,6 @@ export function useLayoutItem (options: { onDeactivated(() => isKeptAlive.value = true) onActivated(() => isKeptAlive.value = false) - const layoutIsReady = nextTick() - const { layoutItemStyles, layoutItemScrimStyles, @@ -139,7 +133,7 @@ export function useLayoutItem (options: { onBeforeUnmount(() => layout.unregister(id)) - return { layoutItemStyles, layoutRect: layout.layoutRect, layoutItemScrimStyles, layoutIsReady } + return { layoutItemStyles, layoutRect: layout.layoutRect, layoutItemScrimStyles } } const generateLayers = ( @@ -183,7 +177,28 @@ export function createLayout (props: { overlaps?: string[], fullHeight?: boolean const disabledTransitions = reactive(new Map>()) const { resizeRef, contentRect: layoutRect } = useResizeObserver() - const layers = eagerComputed(() => { + const computedOverlaps = computed(() => { + const map = new Map() + const overlaps = props.overlaps ?? [] + for (const overlap of overlaps.filter(item => item.includes(':'))) { + const [top, bottom] = overlap.split(':') + if (!registered.value.includes(top) || !registered.value.includes(bottom)) continue + + const topPosition = positions.get(top) + const bottomPosition = positions.get(bottom) + const topAmount = layoutSizes.get(top) + const bottomAmount = layoutSizes.get(bottom) + + if (!topPosition || !bottomPosition || !topAmount || !bottomAmount) continue + + map.set(bottom, { position: topPosition.value, amount: parseInt(topAmount.value, 10) }) + map.set(top, { position: bottomPosition.value, amount: -parseInt(bottomAmount.value, 10) }) + } + + return map + }) + + const layers = computed(() => { const uniquePriorities = [...new Set([...priorities.values()].map(p => p.value))].sort((a, b) => a - b) const layout = [] for (const p of uniquePriorities) { @@ -211,7 +226,7 @@ export function createLayout (props: { overlaps?: string[], fullHeight?: boolean } }) - const items = eagerComputed(() => { + const items = computed(() => { return layers.value.slice(1).map(({ id }, index) => { const { layer } = layers.value[index] const size = layoutSizes.get(id) @@ -232,7 +247,10 @@ export function createLayout (props: { overlaps?: string[], fullHeight?: boolean const rootVm = getCurrentInstance('createLayout') - const layoutIsReady = nextTick() + const isMounted = shallowRef(false) + onMounted(() => { + isMounted.value = true + }) provide(VuetifyLayoutKey, { register: ( @@ -278,12 +296,17 @@ export function createLayout (props: { overlaps?: string[], fullHeight?: boolean ...(transitionsEnabled.value ? undefined : { transition: 'none' }), } as const - if (index.value < 0) throw new Error(`Layout item "${id}" is missing`) + if (!isMounted.value) return styles const item = items.value[index.value] if (!item) throw new Error(`[Vuetify] Could not find layout item "${id}"`) + const overlap = computedOverlaps.value.get(id) + if (overlap) { + item[overlap.position] += overlap.amount + } + return { ...styles, height: @@ -321,7 +344,6 @@ export function createLayout (props: { overlaps?: string[], fullHeight?: boolean items, layoutRect, rootZIndex, - layoutIsReady, }) const layoutClasses = computed(() => [ @@ -341,7 +363,6 @@ export function createLayout (props: { overlaps?: string[], fullHeight?: boolean getLayoutItem, items, layoutRect, - layoutIsReady, layoutRef: resizeRef, } }