UIPackage
Menu

Framework

Change language

Boilerplate repo

Resizable

resizableui

Drag-to-resize panel layout — horizontal or vertical splits with persistent sizes. Use for IDE-style sidebars, split views, and any layout the user should be able to reshape.

Also available for React ->

Installation

$npx shadcn-vue@latest add https://uipkge.dev/r/vue/resizable.json
Named registry:npx shadcn-vue@latest add @uipkge/resizableInstalls to:app/components/ui/resizable/

Examples

Loading interactive previews…

Props

NameType / ValuesDefaultRequired
classHTMLAttributes['class']; withHandle?: booleanoptional

Files installed (4)

  • app/components/ui/resizable/ResizableHandle.vue1.7 kB
    <script setup lang="ts">
    import type { SplitterResizeHandleEmits, SplitterResizeHandleProps } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { reactiveOmit } from '@vueuse/core'
    import { GripVertical } from 'lucide-vue-next'
    import { SplitterResizeHandle, useForwardPropsEmits } from 'reka-ui'
    import { cn } from '@/lib/utils'
    
    const props = defineProps<SplitterResizeHandleProps & { class?: HTMLAttributes['class']; withHandle?: boolean }>()
    const emits = defineEmits<SplitterResizeHandleEmits>()
    
    const delegatedProps = reactiveOmit(props, 'class', 'withHandle')
    const forwarded = useForwardPropsEmits(delegatedProps, emits)
    </script>
    
    <template>
      <SplitterResizeHandle
        data-uipkge
        data-slot="resizable-handle"
        v-bind="forwarded"
        :class="
          cn(
            'bg-border focus-visible:ring-ring relative flex w-px items-center justify-center after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[orientation=vertical]:h-px data-[orientation=vertical]:w-full data-[orientation=vertical]:after:left-0 data-[orientation=vertical]:after:h-1 data-[orientation=vertical]:after:w-full data-[orientation=vertical]:after:translate-x-0 data-[orientation=vertical]:after:-translate-y-1/2 [&[data-orientation=vertical]>div]:rotate-90',
            props.class,
          )
        "
      >
        <template v-if="props.withHandle">
          <div class="bg-border z-10 flex h-4 w-3 items-center justify-center rounded-sm border">
            <slot>
              <GripVertical class="size-2.5" aria-hidden="true" />
            </slot>
          </div>
        </template>
      </SplitterResizeHandle>
    </template>
    
  • app/components/ui/resizable/ResizablePanel.vue0.6 kB
  • app/components/ui/resizable/ResizablePanelGroup.vue0.8 kB
  • app/components/ui/resizable/index.ts0.2 kB

Raw manifest:https://uipkge.dev/r/vue/resizable.json