Use the default slot with your content to create an infinite scrolling animation.
<template>
<PMarquee>
<PIcon name="i-simple-icons:github" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:discord" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:x" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:instagram" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:linkedin" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:facebook" class="size-10 shrink-0" />
</PMarquee>
</template>
Use the pause-on-hover prop to pause the animation when the user hovers over the content.
<template>
<PMarquee pause-on-hover>
<PIcon name="i-simple-icons:github" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:discord" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:x" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:instagram" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:linkedin" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:facebook" class="size-10 shrink-0" />
</PMarquee>
</template>
Use the reverse prop to reverse the direction of the animation.
<template>
<PMarquee reverse>
<PIcon name="i-simple-icons:github" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:discord" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:x" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:instagram" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:linkedin" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:facebook" class="size-10 shrink-0" />
</PMarquee>
</template>
Use the orientation prop to change the scrolling direction.
<template>
<PMarquee orientation="vertical">
<PIcon name="i-simple-icons:github" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:discord" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:x" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:instagram" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:linkedin" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:facebook" class="size-10 shrink-0" />
</PMarquee>
</template>
Use the repeat prop to specify how many times the content should be repeated in the animation.
<template>
<PMarquee :repeat="6">
<PIcon name="i-simple-icons:github" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:discord" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:x" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:instagram" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:linkedin" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:facebook" class="size-10 shrink-0" />
</PMarquee>
</template>
Use the overlay prop to remove the gradient overlays on the edges of the marquee.
<template>
<PMarquee>
<PIcon name="i-simple-icons:github" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:discord" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:x" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:instagram" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:linkedin" class="size-10 shrink-0" />
<PIcon name="i-simple-icons:facebook" class="size-10 shrink-0" />
</PMarquee>
</template>
Use the Marquee component to create an infinite scrolling animation for your testimonials.
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
Anthony Bettini
CEO and founder of VulnCheck
Yaz Jallad
Founder Ninjaparade Digital
Kevin Olson
Founder of Fume.app
Michael Hoffmann
Senior Frontend Developer
Harlan Wilton
Nuxt core team member
Thomas Sanlis
Freelance developer and designer
Benjamin Code
YouTuber and SaaS builder
Estéban Soubiran
Web developer and UnJS member
<script setup lang="ts">
const testimonials = [
{
user: {
name: 'Anthony Bettini',
description: 'CEO and founder of VulnCheck',
avatar: {
src: 'https://media.licdn.com/dms/image/v2/C4E03AQEY3pmXsH8hDg/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1519741249442?e=1746057600&v=beta&t=dvQfBT9ah03MPNy9cnly30ugreeCdxG4nrxV3lwKAC8',
loading: 'lazy'
}
},
quote:
'We were using a SaaS service for the docs site, but were left unfulfilled. We put in the effort to do it in house, with UI Pro and not only did we get complimented by a prospect on our site, but they wanted to know our platform.'
},
{
user: {
name: 'Yaz Jallad',
description: 'Founder Ninjaparade Digital',
avatar: {
src: 'https://pbs.twimg.com/profile_images/1824690890222485504/lQ7v1AGt_400x400.jpg',
loading: 'lazy'
}
},
quote:
"Wow, Pohon UI Pro is a total game-changer! I'm seriously impressed with the quality, attention to detail, and the insane variety of components you get. It's like hitting the jackpot for any developer. I've saved countless hours that I would've spent stressing over making my apps look good, with amazing accessible UX, and instead, I've been able to focus on the real deal – building the app itself. It's an instant buy for me, every single time. No second thoughts!"
},
{
user: {
name: 'Kevin Olson',
description: 'Founder of Fume.app',
avatar: {
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/acidjazz',
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/acidjazz 2x',
loading: 'lazy'
}
},
quote:
'Pohon UI Pro saves 100s of hours of dev and design time while delivering a clean professional look on any device.'
},
{
user: {
name: 'Michael Hoffmann',
description: 'Senior Frontend Developer',
avatar: {
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/mokkapps',
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/mokkapps 2x',
loading: 'lazy'
}
},
quote:
'I decided to replace my custom-built components with a component library and chose Pohon UI Pro. It only took me a few hours, and the new UI looks more professional. Integrating the library is easy; the components are well-documented and highly customizable. I can only recommend it; this library is my new choice for new SaaS products.'
},
{
user: {
name: 'Harlan Wilton',
description: 'Nuxt core team member',
avatar: {
src: 'https://ipx.nuxt.com/f_auto,s_40x40/gh_avatar/harlan-zw',
srcset: 'https://ipx.nuxt.com/f_auto,s_80x80/gh_avatar/harlan-zw 2x',
loading: 'lazy'
}
},
quote:
'Pohon UI Pro is my go to component library. Out-of-the-box it handles all of the UI demands I throw at it while looking great. The customisation is really worth thought out, allowing you to override components in a breeze. Always amazed at the improvements dropped in each update as well, the team is doing an amazing job.'
},
{
user: {
name: 'Thomas Sanlis',
description: 'Freelance developer and designer',
avatar: {
src: 'https://pbs.twimg.com/profile_images/1374040164180299791/ACw4G3nZ_400x400.jpg',
loading: 'lazy'
}
},
quote:
"I jumped at the chance to buy the Nuxt team's new UI kit as soon as I saw it. While I'm already a fan of Pohon UI, the pro version takes it to a whole new level and lets me paste entire blocks into all my projects, saving me a ton of time."
},
{
user: {
name: 'Benjamin Code',
description: 'YouTuber and SaaS builder',
avatar: {
src: 'https://pbs.twimg.com/profile_images/1607353032420769793/I8qQSUfQ_400x400.jpg',
loading: 'lazy'
}
},
quote:
'Pohon UI has allowed me to develop my SaaS without any prior mockups. The design quality of their components and the intelligence of the DX meant that I was able to try many different layouts for my application until I found the perfect UX for my users. Pohon UI is the ui-kit I would have dreamed of building myself, and Pohon UI Pro makes things even easier when you want to go further with your SaaS. Kudos to the team.'
},
{
user: {
name: 'Estéban Soubiran',
description: 'Web developer and UnJS member',
avatar: {
src: 'https://pbs.twimg.com/profile_images/1801649350319218689/aS_X_iTm_400x400.jpg',
loading: 'lazy'
}
},
quote:
"Pohon UI Pro is my preferred choice for everything, from a POC to a web platform. It's ready to use out-of-the-box and assists me in crafting pixel-perfect UIs. It saves me a significant amount of time while remaining highly customizable. Give it a try, and you won't be let down."
}
]
</script>
<template>
<div class="flex flex-col gap-4 w-full">
<PMarquee
pause-on-hover
:overlay="false"
:pohon="{ root: '[--gap:calc(var(--spacing)*4)]', content: 'w-auto py-1' }"
>
<div
v-for="(testimonial, index) in testimonials"
:key="index"
class="rounded-lg bg-background-elevated/50 flex shrink-0 w-64 ring ring-ring relative"
>
<div class="p-4 flex flex-1 flex-col gap-x-8 gap-y-4 relative sm:p-6 lg:grid">
<div class="flex flex-1 flex-col items-start">
<div class="flex-1">
<div
class="text-[15px] color-text-toned text-pretty line-clamp-3 after:content-[close-quote] before:content-[open-quote]"
>
{{ testimonial.quote }}
</div>
</div>
<div class="mt-auto pt-4">
<PUser v-bind="testimonial.user" size="xl" :pohon="{ description: 'line-clamp-1' }" />
</div>
</div>
</div>
</div>
</PMarquee>
<PMarquee
pause-on-hover
reverse
:overlay="false"
:pohon="{ root: '[--gap:calc(var(--spacing)*4)]', content: 'w-auto py-1' }"
>
<div
v-for="(testimonial, index) in testimonials"
:key="index"
variant="subtle"
:description="testimonial.quote"
:pohon="{
description: 'before:content-[open-quote] after:content-[close-quote] line-clamp-3'
}"
class="rounded-lg bg-background-elevated/50 flex shrink-0 w-64 ring ring-ring relative"
>
<div class="p-4 flex flex-1 flex-col gap-x-8 gap-y-4 relative sm:p-6 lg:grid">
<div class="flex flex-1 flex-col items-start">
<div class="flex-1">
<div
class="text-[15px] color-text-toned text-pretty line-clamp-3 after:content-[close-quote] before:content-[open-quote]"
>
{{ testimonial.quote }}
</div>
</div>
<div class="mt-auto pt-4">
<PUser v-bind="testimonial.user" size="xl" :pohon="{ description: 'line-clamp-1' }" />
</div>
</div>
</div>
</div>
</PMarquee>
</div>
</template>
| Prop | Default | Type |
|---|
| Slot | Type |
|---|
Below is the theme configuration skeleton for the PMarquee. Since the component is provided unstyled by default, you will need to fill in these values to apply your own custom look and feel. If you prefer to use our pre-built, opinionated styling, you can instead use our UnoCSS preset, this docs is using it as well.
export default defineAppConfig({
pohon: {
marquee: {
slots: {
root: '',
content: ''
},
variants: {
orientation: {
horizontal: {
content: ''
},
vertical: {
content: ''
}
},
pauseOnHover: {
true: {
content: ''
}
},
reverse: {
true: {
content: ''
}
},
overlay: {
true: {
root: ''
}
}
},
compoundVariants: []
}
}
};
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import pohon from 'pohon-ui/vite'
export default defineAppConfig({
pohon: {
marquee: {
slots: {
root: '',
content: ''
},
variants: {
orientation: {
horizontal: {
content: ''
},
vertical: {
content: ''
}
},
pauseOnHover: {
true: {
content: ''
}
},
reverse: {
true: {
content: ''
}
},
overlay: {
true: {
root: ''
}
}
},
compoundVariants: []
}
}
};