PageAside
A sticky aside to display your page navigation.
Usage
The PageAside component is a sticky <aside>
element that is only displayed starting from the lg
breakpoint.
The PageAside component uses the
--ui-header-height
CSS variable to position itself correctly below the Header. You can customize its height by overriding the variable in your CSS::root {
--ui-header-height: calc(var(--spacing) * 16);
}
Use it inside the left or right slot of the Page component:
<template>
<UPage>
<template #left>
<UPageAside />
</template>
</UPage>
</template>
Examples
While these examples use Nuxt Content v3, the components can be integrated with any content management system.
Within a layout
Use the PageAside component in a layout to display the navigation:
layouts/docs.vue
<script setup lang="ts">
import type { ContentNavigationItem } from '@nuxt/content'
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
</script>
<template>
<UPage>
<template #left>
<UPageAside>
<UContentNavigation :navigation="navigation" />
</UPageAside>
</template>
<slot />
</UPage>
</template>
In this example, we use the
ContentNavigation
component to display the navigation injected in app.vue
.API
Props
Prop | Default | Type |
---|---|---|
as |
|
The element or component this component should render as. |
ui |
|
Slots
Slot | Type |
---|---|
top |
|
default |
|
bottom |
|
Theme
app.config.ts
export default defineAppConfig({
uiPro: {
pageAside: {
slots: {
root: 'hidden overflow-y-auto lg:block lg:max-h-[calc(100vh-var(--ui-header-height))] lg:sticky lg:top-[var(--ui-header-height)] py-8 lg:ps-4 lg:-ms-4 lg:pe-6.5',
container: 'relative',
top: 'sticky -top-8 -mt-8 pointer-events-none z-[1]',
topHeader: 'h-8 bg-[var(--ui-bg)] -mx-4 px-4',
topBody: 'bg-[var(--ui-bg)] relative pointer-events-auto flex -mx-4 px-4',
topFooter: 'h-8 bg-gradient-to-b from-[var(--ui-bg)] -mx-4 px-4'
}
}
}
})
vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
uiPro: {
pageAside: {
slots: {
root: 'hidden overflow-y-auto lg:block lg:max-h-[calc(100vh-var(--ui-header-height))] lg:sticky lg:top-[var(--ui-header-height)] py-8 lg:ps-4 lg:-ms-4 lg:pe-6.5',
container: 'relative',
top: 'sticky -top-8 -mt-8 pointer-events-none z-[1]',
topHeader: 'h-8 bg-[var(--ui-bg)] -mx-4 px-4',
topBody: 'bg-[var(--ui-bg)] relative pointer-events-auto flex -mx-4 px-4',
topFooter: 'h-8 bg-gradient-to-b from-[var(--ui-bg)] -mx-4 px-4'
}
}
}
})
]
})