ChangelogVersion
Usage
The ChangelogVersion component provides a flexible way to display an <article> element with customizable content including title, description, image, etc.
ChangelogVersions component to display multiple changelog versions in a timeline with an indicator bar on the left.Title Soon
Use the title prop to display the title of the ChangelogVersion.
Introducing Pohon UI v3
<template>
<PChangelogVersion title="Introducing Pohon UI v3" />
</template>h2 by default. Use the as prop with an object to change it, for example :as="{ title: 'h3' }". You can also set the root element this way: :as="{ root: 'div', title: 'h3' }".Description
Use the description prop to display the description of the ChangelogVersion.
Introducing Pohon UI v3
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
/>
</template>Date
Use the date prop to display the date of the ChangelogVersion.
Date object or a string.Introducing Pohon UI v3
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
/>
</template>Badge
Use the badge prop to display a Badge on the ChangelogVersion.
Introducing Pohon UI v3
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
badge="Release"
/>
</template>You can pass any property from the Badge component to customize it.
Introducing Pohon UI v3
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
:badge="{
label: 'Release',
color: 'primary',
variant: 'outline'
}"
/>
</template>Image
Use the image prop to display an image in the BlogPost.
Introducing Pohon UI v3

<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
image="https://nuxt.com/assets/blog/pohon-ui-v3.png"
/>
</template>Authors
Use the authors prop to display a list of User in the ChangelogVersion as an array of objects with the following properties:
name?: stringdescription?: stringavatar?: Omit<AvatarProps, 'size'>chip?: boolean | Omit<ChipProps, 'size' | 'inset'>size?: UserProps['size']orientation?: UserProps['orientation']
You can pass any property from the Link component such as to, target, etc.
<script setup lang="ts">
import type { UserProps } from 'pohon-ui'
const authors = ref<UserProps[]>([
{
name: 'Benjamin Canac',
description: '@benjamincanac',
avatar: {
src: 'https://github.com/benjamincanac.png',
loading: 'lazy'
},
to: 'https://x.com/benjamincanac',
target: '_blank'
},
{
name: 'Sebastien Chopin',
description: '@atinux',
avatar: {
src: 'https://github.com/atinux.png',
loading: 'lazy'
},
to: 'https://x.com/atinux',
target: '_blank'
},
{
name: 'Hugo Richard',
description: '@hugorcd',
avatar: {
src: 'https://github.com/hugorcd.png',
loading: 'lazy'
},
to: 'https://x.com/hugorcd',
target: '_blank'
}
])
</script>
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
image="https://nuxt.com/assets/blog/pohon-ui-v3.png"
:authors="authors"
/>
</template><script setup lang="ts">
import { ref } from 'vue'
import type { UserProps } from 'pohon-ui'
const authors = ref<UserProps[]>([
{
name: 'Benjamin Canac',
description: '@benjamincanac',
avatar: {
src: 'https://github.com/benjamincanac.png',
loading: 'lazy'
},
to: 'https://x.com/benjamincanac',
target: '_blank'
},
{
name: 'Sebastien Chopin',
description: '@atinux',
avatar: {
src: 'https://github.com/atinux.png',
loading: 'lazy'
},
to: 'https://x.com/atinux',
target: '_blank'
},
{
name: 'Hugo Richard',
description: '@hugorcd',
avatar: {
src: 'https://github.com/hugorcd.png',
loading: 'lazy'
},
to: 'https://x.com/hugorcd',
target: '_blank'
}
])
</script>
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
image="https://nuxt.com/assets/blog/pohon-ui-v3.png"
:authors="authors"
/>
</template>Link
You can pass any property from the <NuxtLink> component such as to, target, rel, etc.
<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
image="https://nuxt.com/assets/blog/pohon-ui-v3.png"
to="https://nuxt.com/blog/pohon-ui-v3"
target="_blank"
/>
</template>Indicator
Use the indicator prop to hide the indicator dot on the left. Defaults to true.
Introducing Pohon UI v3

<template>
<PChangelogVersion
title="Introducing Pohon UI v3"
description="Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility."
date="2025-03-12"
image="https://nuxt.com/assets/blog/pohon-ui-v3.png"
:indicator="false"
/>
</template>indicator prop is false, the date will be displayed over the title.Examples
With body slot
You can use the body slot to display custom content between the image and the authors with:
- the Markdown component from
@comark/vueto display some markdown. - the ContentRenderer component from
@nuxt/contentto render the content of the page or list. - or use the
:p-changelog-versioncomponent directly in your content with markdown inside thebodyslot as Pohon UI provides pre-styled prose components.
Introducing Pohon UI v3

We are thrilled to introduce Pohon UI v3, a comprehensive redesign of our UI library that delivers significant improvements in accessibility, performance, and developer experience. This major update represents over 1,500 commits of dedicated work, collaboration, and innovation from our team and the community.
Read the blog post announcement: https://nuxt.com/blog/pohon-ui-v3
Get started with Pohon UI v3 →
🧩 Akar: A New Foundation
We've transitioned from Headless UI to Akar as our core component foundation, bringing:
- Expanded Component Library: Access to 55+ primitives, significantly expanding our component offerings
- Future-Proof Development: Benefit from Akar's growing popularity and continuous improvements
- First-Class Accessibility: Built-in accessibility features aligned with our commitment to inclusive design
🚀 UnoCSS Integration
Pohon UI now leverages the latest UnoCSS, delivering:
- Exceptional Performance: Full builds up to 5× faster, with incremental builds over 100× faster
- Streamlined Toolchain: Built-in import handling, vendor prefixing, and syntax transforms with zero additional tooling
- CSS-First Configuration: Customize and extend the framework directly in CSS instead of JavaScript configuration
🎨 UnoCSS Variants
We've adopted UnoCSS Variants to power our design system, offering:
- Dynamic Styling: Create flexible component variants with a powerful, intuitive API
- Type Safety: Full TypeScript support with intelligent auto-completion
- Smart Conflict Resolution: Efficiently merge conflicting styles with predictable results
Migration from v2
We want to be transparent: migrating from Pohon UI v2 to v3 requires significant effort. While we've maintained core concepts and components, Pohon UI v3 has been rebuilt from the ground up to provide enhanced capabilities.
To upgrade your project:
- Read our detailed migration guide
- Review the new documentation and components before attempting to upgrade
- Report any issues on our GitHub repository
🙏 Acknowledgements
This release represents thousands of hours of work from our team and the community. We'd like to thank everyone who contributed to making Pohon UI v3 a reality, especially @romhml, @sandros94, and @hywax for their tremendous work.
<script setup lang="ts">
import { Markdown } from '@comark/vue'
const content = `

We are thrilled to introduce Pohon UI v3, a comprehensive redesign of our UI library that delivers significant improvements in accessibility, performance, and developer experience. This major update represents over 1,500 commits of dedicated work, collaboration, and innovation from our team and the community.
Read the blog post announcement: https://nuxt.com/blog/pohon-ui-v3
**[Get started with Pohon UI v3 →](/pohon/getting-started/installation/nuxt)**
### 🧩 Akar: A New Foundation
We've transitioned from [Headless UI](https://headlessui.com/) to [Akar](https://akar.vinicunca.dev/) as our core component foundation, bringing:
- **Expanded Component Library**: Access to 55+ primitives, significantly expanding our component offerings
- **Future-Proof Development**: Benefit from Akar's growing popularity and continuous improvements
- **First-Class Accessibility**: Built-in accessibility features aligned with our commitment to inclusive design
### 🚀 UnoCSS Integration
Pohon UI now leverages the latest [UnoCSS](https://unocss.com), delivering:
- **Exceptional Performance**: Full builds up to 5× faster, with incremental builds over 100× faster
- **Streamlined Toolchain**: Built-in import handling, vendor prefixing, and syntax transforms with zero additional tooling
- **CSS-First Configuration**: Customize and extend the framework directly in CSS instead of JavaScript configuration
### 🎨 UnoCSS Variants
We've adopted [UnoCSS Variants](https://vinicunca.dev/unocss-variants/) to power our design system, offering:
- **Dynamic Styling**: Create flexible component variants with a powerful, intuitive API
- **Type Safety**: Full TypeScript support with intelligent auto-completion
- **Smart Conflict Resolution**: Efficiently merge conflicting styles with predictable results
## Migration from v2
We want to be transparent: migrating from Pohon UI v2 to v3 requires significant effort. While we've maintained core concepts and components, Pohon UI v3 has been rebuilt from the ground up to provide enhanced capabilities.
To upgrade your project:
1. Read our detailed [migration guide](/pohon/getting-started/installation/nuxt)
2. Review the new documentation and components before attempting to upgrade
3. Report any issues on our [GitHub repository](https://github.com/vinicunca/pohon/issues)
## 🙏 Acknowledgements
This release represents thousands of hours of work from our team and the community. We'd like to thank everyone who contributed to making Pohon UI v3 a reality, especially @romhml, @sandros94, and @hywax for their tremendous work.
`
const version = {
title: 'Introducing Pohon UI v3',
description:
'Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility.',
date: '2025-03-12T00:00:00.000Z',
badge: 'Release',
to: 'https://nuxt.com/blog/pohon-ui-v3',
target: '_blank',
content,
authors: [
{
name: 'Benjamin Canac',
avatar: {
src: 'https://github.com/benjamincanac.png',
alt: 'Benjamin Canac',
loading: 'lazy' as const
},
to: 'https://github.com/benjamincanac',
target: '_blank'
}
]
}
</script>
<template>
<PChangelogVersion v-bind="version" :ui="{ container: 'max-w-lg' }" class="w-full">
<template #body>
<Markdown :value="version.content" />
</template>
</PChangelogVersion>
</template><script setup lang="ts">
import { provide } from 'vue'
import { Markdown } from '@comark/vue'
const content = `

We are thrilled to introduce Pohon UI v3, a comprehensive redesign of our UI library that delivers significant improvements in accessibility, performance, and developer experience. This major update represents over 1,500 commits of dedicated work, collaboration, and innovation from our team and the community.
Read the blog post announcement: https://nuxt.com/blog/pohon-ui-v3
**[Get started with Pohon UI v3 →](/pohon/getting-started/installation/nuxt)**
### 🧩 Akar: A New Foundation
We've transitioned from [Headless UI](https://headlessui.com/) to [Akar](https://akar.vinicunca.dev/) as our core component foundation, bringing:
- **Expanded Component Library**: Access to 55+ primitives, significantly expanding our component offerings
- **Future-Proof Development**: Benefit from Akar's growing popularity and continuous improvements
- **First-Class Accessibility**: Built-in accessibility features aligned with our commitment to inclusive design
### 🚀 UnoCSS Integration
Pohon UI now leverages the latest [UnoCSS](https://unocss.com), delivering:
- **Exceptional Performance**: Full builds up to 5× faster, with incremental builds over 100× faster
- **Streamlined Toolchain**: Built-in import handling, vendor prefixing, and syntax transforms with zero additional tooling
- **CSS-First Configuration**: Customize and extend the framework directly in CSS instead of JavaScript configuration
### 🎨 UnoCSS Variants
We've adopted [UnoCSS Variants](https://vinicunca.dev/unocss-variants/) to power our design system, offering:
- **Dynamic Styling**: Create flexible component variants with a powerful, intuitive API
- **Type Safety**: Full TypeScript support with intelligent auto-completion
- **Smart Conflict Resolution**: Efficiently merge conflicting styles with predictable results
## Migration from v2
We want to be transparent: migrating from Pohon UI v2 to v3 requires significant effort. While we've maintained core concepts and components, Pohon UI v3 has been rebuilt from the ground up to provide enhanced capabilities.
To upgrade your project:
1. Read our detailed [migration guide](/pohon/getting-started/installation/nuxt)
2. Review the new documentation and components before attempting to upgrade
3. Report any issues on our [GitHub repository](https://github.com/vinicunca/pohon/issues)
## 🙏 Acknowledgements
This release represents thousands of hours of work from our team and the community. We'd like to thank everyone who contributed to making Pohon UI v3 a reality, especially @romhml, @sandros94, and @hywax for their tremendous work.
`
const version = {
title: 'Introducing Pohon UI v3',
description:
'Pohon UI v3 is out! After 1500+ commits, this major redesign brings improved accessibility, UnoCSS support, and full Vue compatibility.',
date: '2025-03-12T00:00:00.000Z',
badge: 'Release',
to: 'https://nuxt.com/blog/pohon-ui-v3',
target: '_blank',
content,
authors: [
{
name: 'Benjamin Canac',
avatar: {
src: 'https://github.com/benjamincanac.png',
alt: 'Benjamin Canac',
loading: 'lazy' as const
},
to: 'https://github.com/benjamincanac',
target: '_blank'
}
]
}
</script>
<template>
<PChangelogVersion v-bind="version" :ui="{ container: 'max-w-lg' }" class="w-full">
<template #body>
<Markdown :value="version.content" />
</template>
</PChangelogVersion>
</template>API
Props
| Prop | Default | Type |
|---|---|---|
as | 'article' | anyThe element or component this component should render as. |
title | string | |
description | string | |
date | string | DateThe date of the changelog version. Can be a string or a Date object. | |
badge | string | BadgePropsDisplay a badge on the changelog version.
Can be a string or an object.
| |
authors | UserProps[]The authors of the changelog version. | |
image | string | Partial<ImgHTMLAttributes> & { [key: string]: any; }The image of the changelog version. Can be a string or an object. | |
indicator | true | boolean Display an indicator dot on the left. |
to | string | et | X | |
target | null | "_blank" | "_parent" | "_self" | "_top" | string | |
ui | { root?: SlotClass; container?: SlotClass; header?: SlotClass; meta?: SlotClass; date?: SlotClass; badge?: SlotClass; title?: SlotClass; description?: SlotClass; imageWrapper?: SlotClass; image?: SlotClass; authors?: SlotClass; footer?: SlotClass; indicator?: SlotClass; dot?: SlotClass; dotInner?: SlotClass; } |
Slots
| Slot | Type |
|---|---|
header | {} |
badge | { ui: object; } |
date | {} |
title | {} |
description | {} |
image | { ui: object; } |
body | {} |
footer | {} |
authors | {} |
actions | {} |
indicator | { ui: object; } |
Theme
export default defineAppConfig({
ui: {
changelogVersion: {
slots: {
root: 'relative',
container: 'flex flex-col mx-auto max-w-2xl',
header: '',
meta: 'flex items-center gap-3 mb-2',
date: 'text-sm/6 color-text-toned truncate',
badge: '',
title: 'relative text-xl text-pretty font-600 color-text-highlighted',
description: 'text-base text-pretty color-text-muted mt-1',
imageWrapper: 'relative overflow-hidden rounded-lg aspect-[16/9] mt-5 group/changelog-version-image',
image: 'object-cover object-top w-full h-full',
authors: 'flex flex-wrap gap-x-4 gap-y-1.5',
footer: 'border-t border-border pt-5 flex items-center justify-between',
indicator: 'absolute start-0 top-0 w-32 hidden lg:flex items-center justify-end gap-3 min-w-0',
dot: 'size-4 rounded-full bg-background ring ring-border flex items-center justify-center my-1',
dotInner: 'size-2 rounded-full bg-primary'
},
variants: {
body: {
false: {
footer: 'mt-5'
}
},
badge: {
false: {
meta: 'lg:hidden'
}
},
to: {
true: {
title: [
'outline-primary/25 has-focus-visible:outline-3 rounded-xs',
'transition'
],
image: 'transform transition-transform ease-out group-has-focus-visible/changelog-version-image:scale-105 group-hover/changelog-version-image:scale-105 motion-reduce:transition-none'
}
},
hidden: {
true: {
date: 'lg:hidden'
}
}
}
}
}
})import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from 'pohon-ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
changelogVersion: {
slots: {
root: 'relative',
container: 'flex flex-col mx-auto max-w-2xl',
header: '',
meta: 'flex items-center gap-3 mb-2',
date: 'text-sm/6 color-text-toned truncate',
badge: '',
title: 'relative text-xl text-pretty font-600 color-text-highlighted',
description: 'text-base text-pretty color-text-muted mt-1',
imageWrapper: 'relative overflow-hidden rounded-lg aspect-[16/9] mt-5 group/changelog-version-image',
image: 'object-cover object-top w-full h-full',
authors: 'flex flex-wrap gap-x-4 gap-y-1.5',
footer: 'border-t border-border pt-5 flex items-center justify-between',
indicator: 'absolute start-0 top-0 w-32 hidden lg:flex items-center justify-end gap-3 min-w-0',
dot: 'size-4 rounded-full bg-background ring ring-border flex items-center justify-center my-1',
dotInner: 'size-2 rounded-full bg-primary'
},
variants: {
body: {
false: {
footer: 'mt-5'
}
},
badge: {
false: {
meta: 'lg:hidden'
}
},
to: {
true: {
title: [
'outline-primary/25 has-focus-visible:outline-3 rounded-xs',
'transition'
],
image: 'transform transition-transform ease-out group-has-focus-visible/changelog-version-image:scale-105 group-hover/changelog-version-image:scale-105 motion-reduce:transition-none'
}
},
hidden: {
true: {
date: 'lg:hidden'
}
}
}
}
}
})
]
})