@@ -153,56 +153,84 @@ const defaultExpanded = computed(() =>
153153<!-- eslint-disable vue/no-template-shadow -->
154154<template >
155155 <DefineTreeTemplate v-slot =" { items, level }" >
156- <li
156+ <TreeItem
157157 v-for =" (item, index) in items"
158158 :key =" `${level}-${index}`"
159- :class =" level > 0 ? ui.itemWithChildren({ class: [props.ui?.itemWithChildren, item.ui?.itemWithChildren] }) : ui.item({ class: [props.ui?.item, item.ui?.item] })"
159+ v-slot =" { isExpanded, isSelected }"
160+ :level =" level"
161+ :value =" item"
162+ :class =" level > 1 ? ui.itemWithChildren({ class: [props.ui?.itemWithChildren, item.ui?.itemWithChildren] }) : ui.item({ class: [props.ui?.item, item.ui?.item] })"
163+ @toggle =" item.onToggle"
164+ @select =" item.onSelect"
160165 >
161- <TreeItem
162- v-slot =" { isExpanded, isSelected }"
163- as-child
164- :level =" level"
165- :value =" item"
166- @toggle =" item.onToggle"
167- @select =" item.onSelect"
166+ <slot
167+ :name =" ((item.slot ? `${item.slot}-wrapper` : 'item-wrapper') as keyof TreeSlots<T>)"
168+ v-bind =" { item, index, level, expanded: isExpanded, selected: isSelected }"
168169 >
169- <slot :name =" ((item.slot ? `${item.slot}-wrapper` : 'item-wrapper') as keyof TreeSlots<T>)" v-bind =" { item, index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
170- <button type =" button" :disabled =" item.disabled || disabled" :class =" ui.link({ class: [props.ui?.link, item.ui?.link, item.class], selected: isSelected, disabled: item.disabled || disabled })" >
171- <slot :name =" ((item.slot || 'item') as keyof TreeSlots<T>)" v-bind =" { index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
172- <slot :name =" ((item.slot ? `${item.slot}-leading`: 'item-leading') as keyof TreeSlots<T>)" v-bind =" { index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
170+ <button
171+ type =" button"
172+ :disabled =" item.disabled || disabled"
173+ :data-expanded =" isExpanded"
174+ :class =" ui.link({ class: [props.ui?.link, item.ui?.link, item.class], selected: isSelected, disabled: item.disabled || disabled })"
175+ >
176+ <slot :name =" ((item.slot || 'item') as keyof TreeSlots<T>)" v-bind =" { index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
177+ <slot :name =" ((item.slot ? `${item.slot}-leading`: 'item-leading') as keyof TreeSlots<T>)" v-bind =" { index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
178+ <UIcon
179+ v-if =" item.icon"
180+ :name =" item.icon"
181+ :class =" ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, item.ui?.linkLeadingIcon] })"
182+ />
183+ <UIcon
184+ v-else-if =" item.children?.length"
185+ :name =" isExpanded ? (expandedIcon ?? appConfig.ui.icons.folderOpen) : (collapsedIcon ?? appConfig.ui.icons.folder)"
186+ :class =" ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, item.ui?.linkLeadingIcon] })"
187+ />
188+ </slot >
189+
190+ <span
191+ v-if =" getItemLabel(item) || !!slots[(item.slot ? `${item.slot}-label`: 'item-label') as keyof TreeSlots<T>]"
192+ :class =" ui.linkLabel({ class: [props.ui?.linkLabel, item.ui?.linkLabel] })"
193+ >
194+ <slot
195+ :name =" ((item.slot ? `${item.slot}-label`: 'item-label') as keyof TreeSlots<T>)"
196+ v-bind =" { item, index, level, expanded: isExpanded, selected: isSelected }"
197+ >
198+ {{ getItemLabel(item) }}
199+ </slot >
200+ </span >
201+
202+ <span
203+ v-if =" item.trailingIcon || item.children?.length || !!slots[(item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof TreeSlots<T>]"
204+ :class =" ui.linkTrailing({ class: [props.ui?.linkTrailing, item.ui?.linkTrailing] })"
205+ >
206+ <slot
207+ :name =" ((item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof TreeSlots<T>)"
208+ v-bind =" { item, index, level, expanded: isExpanded, selected: isSelected }"
209+ >
173210 <UIcon
174- v-if =" item.icon "
175- :name =" item.icon "
176- :class =" ui.linkLeadingIcon ({ class: [props.ui?.linkLeadingIcon , item.ui?.linkLeadingIcon ] })"
211+ v-if =" item.trailingIcon "
212+ :name =" item.trailingIcon "
213+ :class =" ui.linkTrailingIcon ({ class: [props.ui?.linkTrailingIcon , item.ui?.linkTrailingIcon ] })"
177214 />
178215 <UIcon
179216 v-else-if =" item.children?.length"
180- :name =" isExpanded ? (expandedIcon ?? appConfig.ui.icons.folderOpen) : (collapsedIcon ?? appConfig.ui.icons.folder) "
181- :class =" ui.linkLeadingIcon ({ class: [props.ui?.linkLeadingIcon , item.ui?.linkLeadingIcon ] })"
217+ :name =" trailingIcon ?? appConfig.ui.icons.chevronDown "
218+ :class =" ui.linkTrailingIcon ({ class: [props.ui?.linkTrailingIcon , item.ui?.linkTrailingIcon ] })"
182219 />
183220 </slot >
184-
185- <span v-if =" getItemLabel(item) || !!slots[(item.slot ? `${item.slot}-label`: 'item-label') as keyof TreeSlots<T>]" :class =" ui.linkLabel({ class: [props.ui?.linkLabel, item.ui?.linkLabel] })" >
186- <slot :name =" ((item.slot ? `${item.slot}-label`: 'item-label') as keyof TreeSlots<T>)" v-bind =" { item, index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
187- {{ getItemLabel(item) }}
188- </slot >
189- </span >
190-
191- <span v-if =" item.trailingIcon || item.children?.length || !!slots[(item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof TreeSlots<T>]" :class =" ui.linkTrailing({ class: [props.ui?.linkTrailing, item.ui?.linkTrailing] })" >
192- <slot :name =" ((item.slot ? `${item.slot}-trailing`: 'item-trailing') as keyof TreeSlots<T>)" v-bind =" { item, index, level, expanded: isExpanded, selected: isSelected }" :item =" (item as Extract<NestedItem<T>, { slot: string; }>)" >
193- <UIcon v-if =" item.trailingIcon" :name =" item.trailingIcon" :class =" ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, item.ui?.linkTrailingIcon] })" />
194- <UIcon v-else-if =" item.children?.length" :name =" trailingIcon ?? appConfig.ui.icons.chevronDown" :class =" ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, item.ui?.linkTrailingIcon] })" />
195- </slot >
196- </span >
197- </slot >
198- </button >
199- </slot >
200-
201- <ul v-if =" item.children?.length && isExpanded" :class =" ui.listWithChildren({ class: [props.ui?.listWithChildren, item.ui?.listWithChildren] })" >
202- <ReuseTreeTemplate :items =" item.children" :level =" level + 1" />
203- </ul >
204- </TreeItem >
205- </li >
221+ </span >
222+ </slot >
223+ </button >
224+ </slot >
225+
226+ <ul
227+ v-if =" item.children?.length && isExpanded"
228+ role =" group"
229+ :class =" ui.listWithChildren({ class: [props.ui?.listWithChildren, item.ui?.listWithChildren] })"
230+ >
231+ <ReuseTreeTemplate :items =" item.children" :level =" level + 1" />
232+ </ul >
233+ </TreeItem >
206234 </DefineTreeTemplate >
207235
208236 <TreeRoot
@@ -212,6 +240,6 @@ const defaultExpanded = computed(() =>
212240 :default-expanded =" defaultExpanded"
213241 :selection-behavior =" selectionBehavior"
214242 >
215- <ReuseTreeTemplate :items =" items" :level =" 0 " />
243+ <ReuseTreeTemplate :items =" items" :level =" 1 " />
216244 </TreeRoot >
217245</template >
0 commit comments