Scroll Area
scroll-area ui Custom scrollbar that always renders the same way across OSes (no flashing native scrollbars on Windows). Use for sidebars, dropdown content, and any overflow region you want to feel consistent.
Also available for React ->Installation
$ pnpm dlx shadcn-vue@latest add https://uipkge.dev/r/vue/scroll-area.json $ npx shadcn-vue@latest add https://uipkge.dev/r/vue/scroll-area.json $ yarn dlx shadcn-vue@latest add https://uipkge.dev/r/vue/scroll-area.json $ bunx shadcn-vue@latest add https://uipkge.dev/r/vue/scroll-area.json Named registry:
npx shadcn-vue@latest add @uipkge/scroll-area Installs to: app/components/ui/scroll-area/ Examples
Props
| Name | Type / Values | Default | Required |
|---|---|---|---|
class | HTMLAttributes['class'] | — | optional |
npm dependencies
Used by
Files installed (3)
-
app/components/ui/scroll-area/ScrollArea.vue 0.9 kB
<script setup lang="ts"> import type { ScrollAreaRootProps } from 'reka-ui' import type { HTMLAttributes } from 'vue' import { reactiveOmit } from '@vueuse/core' import { ScrollAreaCorner, ScrollAreaRoot, ScrollAreaViewport } from 'reka-ui' import { cn } from '@/lib/utils' import ScrollBar from './ScrollBar.vue' const props = defineProps<ScrollAreaRootProps & { class?: HTMLAttributes['class'] }>() const delegatedProps = reactiveOmit(props, 'class') </script> <template> <ScrollAreaRoot data-uipkge data-slot="scroll-area" v-bind="delegatedProps" :class="cn('relative', props.class)"> <ScrollAreaViewport data-uipkge data-slot="scroll-area-viewport" class="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1" > <slot /> </ScrollAreaViewport> <ScrollBar /> <ScrollAreaCorner /> </ScrollAreaRoot> </template> -
app/components/ui/scroll-area/ScrollBar.vue 1 kB
<script setup lang="ts"> import type { ScrollAreaScrollbarProps } from 'reka-ui' import type { HTMLAttributes } from 'vue' import { reactiveOmit } from '@vueuse/core' import { ScrollAreaScrollbar, ScrollAreaThumb } from 'reka-ui' import { cn } from '@/lib/utils' const props = withDefaults(defineProps<ScrollAreaScrollbarProps & { class?: HTMLAttributes['class'] }>(), { orientation: 'vertical', }) const delegatedProps = reactiveOmit(props, 'class') </script> <template> <ScrollAreaScrollbar data-uipkge data-slot="scroll-area-scrollbar" v-bind="delegatedProps" :class=" cn( 'flex touch-none p-px transition-colors select-none', orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent', orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent', props.class, ) " > <ScrollAreaThumb data-uipkge data-slot="scroll-area-thumb" class="bg-border relative flex-1 rounded-full" /> </ScrollAreaScrollbar> </template> -
app/components/ui/scroll-area/index.ts 0.1 kB
export { default as ScrollArea } from './ScrollArea.vue' export { default as ScrollBar } from './ScrollBar.vue'
Raw manifest: https://uipkge.dev/r/vue/scroll-area.json