vael-ui v0.3.10

Selection

TreeSelect

A dropdown whose panel is a Tree, for picking one or more nodes from a hierarchy.

Install

import { TreeSelect } from 'vael-ui'

Playground

import { TreeSelect } from 'vael-ui'

<TreeSelect placeholder="" selectionMode="single" selectableFolders :disabled="false" :clearable="false" :invalid="false" size="md" filterable filterPlaceholder="Search..." emptyText="No results found" :expandOnRowClick="false" :stickyScroll="false" name="" side="bottom" align="start" :sideOffset="8" :alignOffset="0" closeOnEsc closeOnOutside :forceMount="false" motionCss query="" :items="items">TreeSelect</TreeSelect>

Props

NameTypeDefaultDescription
itemsreadonly T[]
placeholderstring | undefinedundefined
selectionMode"multiple" | "single" | "checkbox""single"`'single'`: clicking replaces selection and closes the panel. `'multiple'`: clicking toggles that node only. `'checkbox'`: checkboxes with cascading parent/child toggles.
selectableFoldersboolean | undefinedtrue`false` keeps a node with children out of the selection entirely — click, keyboard Enter/Space, and expandOnRowClick's own select-on-expand all skip it, only a leaf can become the value. Has no effect in `selectionMode="checkbox"`, which already only ever puts leaves in the model. Default: true (a folder can be selected like any other node).
disabledboolean | undefinedfalse
clearableboolean | undefinedfalse
invalidboolean | undefinedfalse
size"md" | "sm" | "lg""md"
filterableboolean | undefinedtrueShows the built-in label search box atop the panel, auto-expanding ancestors of any match. `false` removes it entirely.
filterPlaceholderstring | undefined"Search..."
emptyTextstring | undefined"No results found"
expandOnRowClickboolean | undefinedfalseWhen true, clicking anywhere on a folder row also toggles its expansion, not just the chevron — it still selects too (unless `selectableFolders` is off), so picking the folder itself (without opening it to reach a file inside) still works. Off by default since it changes what a plain row click does.
stickyScrollboolean | undefinedfalseWhen true, each expanded ancestor's row pins to the top of the panel as its own children scroll past, VS Code-style, so deeply nested content never loses its folder context.
namestring | undefinedundefinedRenders hidden `<input>`(s) mirroring the selection, for plain `<form>` posts — repeated `name` outside `single` mode.
side"top" | "right" | "bottom" | "left""bottom"
align"start" | "end" | "center""start"
sideOffsetnumber | undefined8
alignOffsetnumber | undefined0
closeOnEscboolean | undefinedtrue
closeOnOutsideboolean | undefinedtrue
beforeClose((done: () => void) => void) | undefinedundefined
forceMountboolean | undefinedfalse
teleportTostring | HTMLElement | undefined"body"
maxPanelHeightnumber | undefinedCaps the panel's height at this many pixels even when the viewport has room for more — the tree scrolls internally past it instead of the panel growing indefinitely. Omitted keeps today's behavior (only the viewport limits it).
motionCssboolean | undefinedtrue`false` skips all built-in motion (row transitions and chevron rotation).
uiPartial<{ trigger: UiPartValue; value: UiPartValue; positioner: UiPartValue; panel: UiPartValue; header: UiPartValue; filter: UiPartValue; list: UiPartValue; node: UiPartValue; empty: UiPartValue; footer: UiPartValue; }> | undefinedundefined
modelValuestring | number | (string | number)[] | null | undefinednull
openboolean | undefinedfalse
querystring | undefined""
nodeT | T[] | null | undefinednullMirrors `model`'s value(s) as the full node object(s) — see Tree.vue's own `node` model for the resolution details; TreeSelect just forwards it straight through from the inner Tree.

Slots

NameTypeDescription
value{ selected: T[]; }
headeranyAbove the filter input (if `filterable` is on) or the tree itself.
node{ node: T; depth: number; expanded: boolean; checked: boolean; indeterminate: boolean; disabled: boolean; toggleExpand: () => void; toggleSelect: () => void; findNode: (value: string | number) => T | undefined; findParent: (value: string | number) => T | null; removeNode: (value: string | number) => boolean; }Row content override (library owns wrapper & behavior).
emptyany
footeranyBelow the tree.

Events

NameTypeDescription
open-change[value: boolean, details: PopoverOpenChangeDetails]
select[node: T]
change[value: string | number | (string | number)[] | null]
expand-change[value: string | number, expanded: boolean]
update:open[value: boolean]
update:modelValue[value: string | number | (string | number)[] | null]
update:query[value: string]
update:node[value: T | T[] | null]

Exposed

NameTypeDescription
triggerElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
panelElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
positionerElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
listElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
placementunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
positionerStyleunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
isClosingunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
openunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
closeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
cancelCloseunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
expandAllunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
collapseAllunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
expandNodeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
collapseNodeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
findNodeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
findParentunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
removeNodeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.