quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
111 lines (89 loc) • 2.63 kB
JavaScript
import { h, computed } from 'vue'
import useAlign, {
useAlignProps
} from '../../composables/private.use-align/use-align.js'
import { createComponent } from '../../utils/private.create/create.js'
import { hSlot } from '../../utils/private.render/render.js'
import { getNormalizedVNodes } from '../../utils/private.vm/vm.js'
const disabledValues = ['', true]
export default createComponent({
name: 'QBreadcrumbs',
props: {
...useAlignProps,
separator: {
type: String,
default: '/'
},
separatorColor: String,
activeColor: {
type: String,
default: 'primary'
},
gutter: {
type: String,
validator: v => ['none', 'xs', 'sm', 'md', 'lg', 'xl'].includes(v),
default: 'sm'
}
},
setup(props, { slots }) {
const alignClass = useAlign(props)
const classes = computed(
() =>
`flex items-center ${alignClass.value}${props.gutter === 'none' ? '' : ` q-gutter-${props.gutter}`}`
)
const sepClass = computed(() =>
props.separatorColor ? ` text-${props.separatorColor}` : ''
)
const activeClass = computed(() => ` text-${props.activeColor}`)
return () => {
if (slots.default === void 0) return
const vnodes = getNormalizedVNodes(hSlot(slots.default))
if (vnodes.length === 0) return
let els = 1
const child = [],
len = vnodes.filter(c => c.type?.name === 'QBreadcrumbsEl').length,
separator =
slots.separator !== void 0 ? slots.separator : () => props.separator
vnodes.forEach(comp => {
if (comp.type?.name === 'QBreadcrumbsEl') {
const middle = els < len
const disabled =
comp.props !== null && disabledValues.includes(comp.props.disable)
const cls =
(middle === true ? '' : ' q-breadcrumbs--last') +
(disabled !== true && middle === true ? activeClass.value : '')
els++
child.push(
h(
'div',
{
class: `flex items-center${cls}`
},
[comp]
)
)
if (middle === true) {
child.push(
h(
'div',
{
class: 'q-breadcrumbs__separator' + sepClass.value
},
separator()
)
)
}
} else {
child.push(comp)
}
})
return h(
'div',
{
class: 'q-breadcrumbs'
},
[h('div', { class: classes.value }, child)]
)
}
}
})