# UI SDK
A library of behaviors for agents to build the next generation of user interfaces.
Keyboard navigation, focus, selection, dismissal, popups, drag and drop and the ARIA they need live in `@ui-sdk/core`, with adapters for React, Vue, Svelte, Solid and Web Components.
**[Read the docs](https://ui-sdk.dev/docs)**
## Install
UI SDK is in beta. Install core and the adapter for your framework:
```bash
npm install @ui-sdk/react @ui-sdk/core
```
For other frameworks, swap `@ui-sdk/react` for `@ui-sdk/vue`, `@ui-sdk/svelte`, `@ui-sdk/solid` or `@ui-sdk/web`.
Then give your agent the UI SDK skill:
```bash
npx skills add vercel-labs/ui --skill ui-sdk
```
## Example
Every component in UI SDK is built from behaviors. You start by creating the primitive with behaviors.
Don't worry, you don't need to learn how to write this. Your agents will. And we made them really good at it.
```ts
import { createFocusRecovery, definePrimitive } from "@ui-sdk/core"
const searchField = definePrimitive({
name: "search-field",
state: () => ({ value: "" }),
api: (context) => ({
set: (value: string) => context.store.set({ value }),
recovery: createFocusRecovery({ fallback: () => context.element("input") }),
}),
slots: (slot) => ({
input: slot({
attrs: (state) => ({ value: state.value }),
on: {
input: (event, { api }) =>
api.set((event.target as HTMLInputElement).value),
},
}),
clear: slot({
present: (state) => state.value !== "",
attrs: () => ({ type: "button" }),
press: ({ api }) => api.set(""),
bind: (el, part) => part.api.recovery.bind(el, part),
}),
}),
})
export { searchField }
```
Then render it in your framework with `createParts`. The parts are the same in all five.
### React
```tsx
import { createParts } from "@ui-sdk/react/primitive"
import { searchField } from "./search-field"
const parts = createParts(searchField, { input: "input", clear: "button" })
const SearchField = parts.Root
const SearchFieldInput = parts.Input
const SearchFieldClear = parts.Clear
function Search() {
return (
Clear
)
}
export { Search }
```
### Vue
```vue
Clear
```
### Svelte
```svelte
Clear
```
### Solid
```tsx
import { createParts } from "@ui-sdk/solid/primitive"
import { searchField } from "./search-field"
const parts = createParts(searchField, { input: "input", clear: "button" })
const SearchField = parts.Root
const SearchFieldInput = parts.Input
const SearchFieldClear = parts.Clear
function Search() {
return (
Clear
)
}
export { Search }
```
### Web Components
Register a custom element for each part:
```ts
import { createParts, wrappedButton, wrappedChild } from "@ui-sdk/web"
import { searchField } from "./search-field"
createParts(searchField, {
root: "search-field",
input: { tag: "search-field-input", target: wrappedChild("input") },
clear: { tag: "search-field-clear", target: wrappedButton },
})
```
Then use them in your HTML:
```html
```
## Contributing
Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) to get the repo
running locally and land a change, and use
[issues](https://github.com/vercel-labs/ui/issues) to report bugs. By
participating, you agree to our [Code of Conduct](CODE_OF_CONDUCT.md).
## Security
Please do not open public issues for security vulnerabilities. Instead, follow
[SECURITY.md](SECURITY.md) and report responsibly to
[responsible.disclosure@vercel.com](mailto:responsible.disclosure@vercel.com).
## Beta terms
UI SDK is currently in beta and subject to the [Vercel beta terms](https://vercel.com/docs/release-phases/public-beta-agreement);
the framework, APIs, documentation, and behavior may change before general availability.