# 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 = () => (
}>Open
)
```
#### Vue
```vue
```
#### Svelte
```svelte
{#snippet asChild(props)}
{/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
Ark UI
```
#### 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 (
SASegun 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.