PageList
A vertical list layout for displaying content in a stacked format.
Usage
The PageList component provides a flexible way to display content in a vertical list layout. It's perfect for creating stacked lists of PageCard components or any other elements, with optional dividers between items.
<script setup lang="ts">
const users = ref([
{
name: 'Benjamin Canac',
description: 'benjamincanac',
to: 'https://github.com/benjamincanac',
target: '_blank',
avatar: {
src: 'https://github.com/benjamincanac.png',
alt: 'benjamincanac',
loading: 'lazy' as const,
},
},
{
name: 'Hugo Richard',
description: 'HugoRCD',
to: 'https://github.com/HugoRCD',
target: '_blank',
avatar: {
src: 'https://github.com/HugoRCD.png',
alt: 'HugoRCD',
loading: 'lazy' as const,
},
},
{
name: 'Sébastien Chopin',
description: 'atinux',
to: 'https://github.com/atinux',
target: '_blank',
avatar: {
src: 'https://github.com/atinux.png',
alt: 'atinux',
loading: 'lazy' as const,
},
},
{
name: 'Romain Hamel',
description: 'romhml',
to: 'https://github.com/romhml',
target: '_blank',
avatar: {
src: 'https://github.com/romhml.png',
alt: 'romhml',
loading: 'lazy' as const,
},
},
{
name: 'Sandro Circi',
description: 'sandros94',
to: 'https://github.com/sandros94',
target: '_blank',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94',
loading: 'lazy' as const,
},
},
{
name: 'Jakub Michálek',
description: 'J-Michalek',
to: 'https://github.com/J-Michalek',
target: '_blank',
avatar: {
src: 'https://github.com/J-Michalek.png',
alt: 'J-Michalek',
loading: 'lazy' as const,
},
},
{
name: 'Alex',
description: 'hywax',
to: 'https://github.com/hywax',
target: '_blank',
avatar: {
src: 'https://github.com/hywax.png',
alt: 'hywax',
loading: 'lazy' as const,
},
},
{
name: 'Maxime Pauvert',
description: 'maximepvrt',
to: 'https://github.com/maximepvrt',
target: '_blank',
avatar: {
src: 'https://github.com/maximepvrt.png',
alt: 'maximepvrt',
loading: 'lazy' as const,
},
},
]);
</script>
<template>
<PPageList>
<PPageCard
v-for="(user, index) in users"
:key="index"
variant="ghost"
:to="user.to"
:target="user.target"
>
<template #body>
<PUser
:name="user.name"
:description="user.description"
:avatar="user.avatar"
size="xl"
class="relative"
/>
</template>
</PPageCard>
</PPageList>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const users = ref([
{
name: 'Benjamin Canac',
description: 'benjamincanac',
to: 'https://github.com/benjamincanac',
target: '_blank',
avatar: {
src: 'https://github.com/benjamincanac.png',
alt: 'benjamincanac',
loading: 'lazy' as const,
},
},
{
name: 'Hugo Richard',
description: 'HugoRCD',
to: 'https://github.com/HugoRCD',
target: '_blank',
avatar: {
src: 'https://github.com/HugoRCD.png',
alt: 'HugoRCD',
loading: 'lazy' as const,
},
},
{
name: 'Sébastien Chopin',
description: 'atinux',
to: 'https://github.com/atinux',
target: '_blank',
avatar: {
src: 'https://github.com/atinux.png',
alt: 'atinux',
loading: 'lazy' as const,
},
},
{
name: 'Romain Hamel',
description: 'romhml',
to: 'https://github.com/romhml',
target: '_blank',
avatar: {
src: 'https://github.com/romhml.png',
alt: 'romhml',
loading: 'lazy' as const,
},
},
{
name: 'Sandro Circi',
description: 'sandros94',
to: 'https://github.com/sandros94',
target: '_blank',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94',
loading: 'lazy' as const,
},
},
{
name: 'Jakub Michálek',
description: 'J-Michalek',
to: 'https://github.com/J-Michalek',
target: '_blank',
avatar: {
src: 'https://github.com/J-Michalek.png',
alt: 'J-Michalek',
loading: 'lazy' as const,
},
},
{
name: 'Alex',
description: 'hywax',
to: 'https://github.com/hywax',
target: '_blank',
avatar: {
src: 'https://github.com/hywax.png',
alt: 'hywax',
loading: 'lazy' as const,
},
},
{
name: 'Maxime Pauvert',
description: 'maximepvrt',
to: 'https://github.com/maximepvrt',
target: '_blank',
avatar: {
src: 'https://github.com/maximepvrt.png',
alt: 'maximepvrt',
loading: 'lazy' as const,
},
},
]);
</script>
<template>
<PPageList>
<PPageCard
v-for="(user, index) in users"
:key="index"
variant="ghost"
:to="user.to"
:target="user.target"
>
<template #body>
<PUser
:name="user.name"
:description="user.description"
:avatar="user.avatar"
size="xl"
class="relative"
/>
</template>
</PPageCard>
</PPageList>
</template>
Divide
Use the divide prop to add a divider between each child element.
<script setup lang="ts">
const users = ref([
{
name: 'Benjamin Canac',
description: 'benjamincanac',
to: 'https://github.com/benjamincanac',
target: '_blank',
avatar: {
src: 'https://github.com/benjamincanac.png',
alt: 'benjamincanac',
loading: 'lazy' as const,
},
},
{
name: 'Hugo Richard',
description: 'HugoRCD',
to: 'https://github.com/HugoRCD',
target: '_blank',
avatar: {
src: 'https://github.com/HugoRCD.png',
alt: 'HugoRCD',
loading: 'lazy' as const,
},
},
{
name: 'Sébastien Chopin',
description: 'atinux',
to: 'https://github.com/atinux',
target: '_blank',
avatar: {
src: 'https://github.com/atinux.png',
alt: 'atinux',
loading: 'lazy' as const,
},
},
{
name: 'Romain Hamel',
description: 'romhml',
to: 'https://github.com/romhml',
target: '_blank',
avatar: {
src: 'https://github.com/romhml.png',
alt: 'romhml',
loading: 'lazy' as const,
},
},
{
name: 'Sandro Circi',
description: 'sandros94',
to: 'https://github.com/sandros94',
target: '_blank',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94',
loading: 'lazy' as const,
},
},
{
name: 'Jakub Michálek',
description: 'J-Michalek',
to: 'https://github.com/J-Michalek',
target: '_blank',
avatar: {
src: 'https://github.com/J-Michalek.png',
alt: 'J-Michalek',
loading: 'lazy' as const,
},
},
{
name: 'Alex',
description: 'hywax',
to: 'https://github.com/hywax',
target: '_blank',
avatar: {
src: 'https://github.com/hywax.png',
alt: 'hywax',
loading: 'lazy' as const,
},
},
{
name: 'Maxime Pauvert',
description: 'maximepvrt',
to: 'https://github.com/maximepvrt',
target: '_blank',
avatar: {
src: 'https://github.com/maximepvrt.png',
alt: 'maximepvrt',
loading: 'lazy' as const,
},
},
]);
</script>
<template>
<PPageList divide>
<PPageCard
v-for="(user, index) in users"
:key="index"
variant="ghost"
:to="user.to"
:target="user.target"
>
<template #body>
<PUser
:name="user.name"
:description="user.description"
:avatar="user.avatar"
size="xl"
/>
</template>
</PPageCard>
</PPageList>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const users = ref([
{
name: 'Benjamin Canac',
description: 'benjamincanac',
to: 'https://github.com/benjamincanac',
target: '_blank',
avatar: {
src: 'https://github.com/benjamincanac.png',
alt: 'benjamincanac',
loading: 'lazy' as const,
},
},
{
name: 'Hugo Richard',
description: 'HugoRCD',
to: 'https://github.com/HugoRCD',
target: '_blank',
avatar: {
src: 'https://github.com/HugoRCD.png',
alt: 'HugoRCD',
loading: 'lazy' as const,
},
},
{
name: 'Sébastien Chopin',
description: 'atinux',
to: 'https://github.com/atinux',
target: '_blank',
avatar: {
src: 'https://github.com/atinux.png',
alt: 'atinux',
loading: 'lazy' as const,
},
},
{
name: 'Romain Hamel',
description: 'romhml',
to: 'https://github.com/romhml',
target: '_blank',
avatar: {
src: 'https://github.com/romhml.png',
alt: 'romhml',
loading: 'lazy' as const,
},
},
{
name: 'Sandro Circi',
description: 'sandros94',
to: 'https://github.com/sandros94',
target: '_blank',
avatar: {
src: 'https://github.com/sandros94.png',
alt: 'sandros94',
loading: 'lazy' as const,
},
},
{
name: 'Jakub Michálek',
description: 'J-Michalek',
to: 'https://github.com/J-Michalek',
target: '_blank',
avatar: {
src: 'https://github.com/J-Michalek.png',
alt: 'J-Michalek',
loading: 'lazy' as const,
},
},
{
name: 'Alex',
description: 'hywax',
to: 'https://github.com/hywax',
target: '_blank',
avatar: {
src: 'https://github.com/hywax.png',
alt: 'hywax',
loading: 'lazy' as const,
},
},
{
name: 'Maxime Pauvert',
description: 'maximepvrt',
to: 'https://github.com/maximepvrt',
target: '_blank',
avatar: {
src: 'https://github.com/maximepvrt.png',
alt: 'maximepvrt',
loading: 'lazy' as const,
},
},
]);
</script>
<template>
<PPageList divide>
<PPageCard
v-for="(user, index) in users"
:key="index"
variant="ghost"
:to="user.to"
:target="user.target"
>
<template #body>
<PUser
:name="user.name"
:description="user.description"
:avatar="user.avatar"
size="xl"
/>
</template>
</PPageCard>
</PPageList>
</template>
API
Props
| Prop | Default | Type |
|---|---|---|
as | 'div' | anyThe element or component this component should render as. |
divide | boolean | |
ui | { base?: any; } |
Slots
| Slot | Type |
|---|---|
default | {} |
Theme
app.config.ts
export default defineAppConfig({
ui: {
pageList: {
base: 'relative flex flex-col',
variants: {
divide: {
true: '*:not-last:after:absolute *:not-last:after:inset-x-1 *:not-last:after:bottom-0 *:not-last:after:bg-border *:not-last:after:h-px'
}
}
}
}
})vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from 'pohon-ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
pageList: {
base: 'relative flex flex-col',
variants: {
divide: {
true: '*:not-last:after:absolute *:not-last:after:inset-x-1 *:not-last:after:bottom-0 *:not-last:after:bg-border *:not-last:after:h-px'
}
}
}
}
})
]
})Changelog
No recent changes