# Composition URL: https://ark-ui.com/docs/guides/composition Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/guides/composition.mdx Learn how to compose default components with custom elements --- ## The asChild Prop In Ark UI, the `asChild` prop lets you integrate custom components, ensuring consistent styling and behavior while promoting flexibility and reusability. All Ark components that render a DOM element accept the `asChild` prop. Here's an example using `asChild` to integrate a custom `Button` component within a `Popover`: **Example: as-child** #### React ```tsx import { Popover } from '@ark-ui/react/popover' export const AsChild = () => ( ) ``` #### Solid ```tsx import { Popover } from '@ark-ui/solid/popover' export const Basic = () => ( {/snippet} ``` In this example, the `asChild` prop allows the `Button` to be used as the trigger for the `Popover`, inheriting its behaviors from Popover.Trigger. ## The Ark Factory You can use the `ark` factory to create your own elements that work just like Ark UI components. **Example: factory** #### React ```tsx import { ark } from '@ark-ui/react/factory' export const ArkFactory = () => ( Ark UI ) ``` #### Solid ```tsx import { ark } from '@ark-ui/solid/factory' export const ArkFactory = () => ( } > Ark UI ) ``` #### Vue ```vue ``` #### Svelte ```svelte {#snippet asChild(props)} Ark UI {/snippet} ``` This will produce the following HTML: ```html Ark UI ``` ## ID Composition When composing components that need to work together, share IDs between them using the `ids` prop for proper accessibility and interaction. ```tsx import { Avatar } from '@ark-ui/react/avatar' import { Tooltip } from '@ark-ui/react/tooltip' import { useId } from 'react' export const TooltipWithAvatar = () => { const id = useId() return ( SA Segun Adebayo is online ) } ``` Both components share the same `id` through their `ids` props, creating proper accessibility bindings, `aria-*` attributes and interaction behavior. ## Limitations When using the `asChild` prop, ensure you pass only a single child element. Passing multiple children may cause rendering issues. Certain components, such as `Checkbox.Root` or `RadioGroup.Item`, have specific requirements for their child elements. For instance, they may require a label element as a child. If you change the underlying element type, ensure it remains accessible and functional.