Nuxt Content 3 and docus elements
I would like to replace List.vue to make it work with NuxtContent 3. unwrap() no longer exists, and ContentSlot is also gone. How can I update this code to work with NuxtContent 3?
<script lang="ts">
const iconTypeMap = {
primary: 'heroicons-outline:check',
info: 'heroicons-outline:information-circle',
success: 'heroicons-outline:check-circle',
warning: 'heroicons-outline:exclamation',
danger: 'heroicons-outline:exclamation-circle'
}
export default defineComponent({
props: {
/**
* Used to override the default <code>type</code> icon, check out the
* <a href="https://github.com/nuxt/content/tree/dev/packages/theme-docs/src/components/global/icons">icons available</a>
*/
icon: {
type: String,
default: null
},
/**
* Type of list
*/
type: {
type: String,
default: 'primary',
validator: (value: string) => ['primary', 'info', 'success', 'warning', 'danger'].includes(value)
}
},
setup (props) {
const slots = useSlots()
const { flatUnwrap, unwrap } = useUnwrap()
const iconName = computed(() => props.icon || (iconTypeMap as any)[props.type])
// Usage of render function is mandatory to access default slot
// Otherwise Vue warns that slot "default" was invoked outside of the render function
return () => {
const items = flatUnwrap((slots.default && slots.default()) ?? [], ['ul']).map(li => unwrap(li, ['li']))
return h(
'ul',
items.map(item =>
h('li', [
h('span', { class: `list-icon ${props.type}` }, h(resolveComponent('icon'), { name: iconName.value, class: 'icon' })),
h('span', h(resolveComponent('ContentSlot'), { use: () => item }))
])
)
)
}
}
})
</script><script lang="ts">
const iconTypeMap = {
primary: 'heroicons-outline:check',
info: 'heroicons-outline:information-circle',
success: 'heroicons-outline:check-circle',
warning: 'heroicons-outline:exclamation',
danger: 'heroicons-outline:exclamation-circle'
}
export default defineComponent({
props: {
/**
* Used to override the default <code>type</code> icon, check out the
* <a href="https://github.com/nuxt/content/tree/dev/packages/theme-docs/src/components/global/icons">icons available</a>
*/
icon: {
type: String,
default: null
},
/**
* Type of list
*/
type: {
type: String,
default: 'primary',
validator: (value: string) => ['primary', 'info', 'success', 'warning', 'danger'].includes(value)
}
},
setup (props) {
const slots = useSlots()
const { flatUnwrap, unwrap } = useUnwrap()
const iconName = computed(() => props.icon || (iconTypeMap as any)[props.type])
// Usage of render function is mandatory to access default slot
// Otherwise Vue warns that slot "default" was invoked outside of the render function
return () => {
const items = flatUnwrap((slots.default && slots.default()) ?? [], ['ul']).map(li => unwrap(li, ['li']))
return h(
'ul',
items.map(item =>
h('li', [
h('span', { class: `list-icon ${props.type}` }, h(resolveComponent('icon'), { name: iconName.value, class: 'icon' })),
h('span', h(resolveComponent('ContentSlot'), { use: () => item }))
])
)
)
}
}
})
</script>