import type { AllowedComponentProps, Component, IntrinsicElementAttributes, SetupContext, VNodeProps } from 'vue'; import { h } from 'vue'; import { renderSlotChild } from './Slot'; type FunctionalComponentContext = Omit; export interface PrimitiveProps { as?: keyof IntrinsicElementAttributes | Component; } export function Primitive(props: PrimitiveProps & VNodeProps & AllowedComponentProps & Record, ctx: FunctionalComponentContext) { const as = props.as; return as === 'template' ? renderSlotChild(ctx.slots, ctx.attrs) : h(as!, ctx.attrs, ctx.slots); } Primitive.inheritAttrs = false; Primitive.props = { as: { type: [String, Object], default: 'div' as const, }, };