diff --git a/content/docs/components/accordion.mdx b/content/docs/components/accordion.mdx
index ec8b980..4e95de2 100644
--- a/content/docs/components/accordion.mdx
+++ b/content/docs/components/accordion.mdx
@@ -25,7 +25,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/accordion"
+npx shadcn@latest add "https://blode.co/ui/r/accordion.json"
```
diff --git a/content/docs/components/alert-dialog.mdx b/content/docs/components/alert-dialog.mdx
index e7437db..922262e 100644
--- a/content/docs/components/alert-dialog.mdx
+++ b/content/docs/components/alert-dialog.mdx
@@ -25,7 +25,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/alert-dialog"
+npx shadcn@latest add "https://blode.co/ui/r/alert-dialog.json"
```
diff --git a/content/docs/components/alert.mdx b/content/docs/components/alert.mdx
index 9e4246b..f5e9194 100644
--- a/content/docs/components/alert.mdx
+++ b/content/docs/components/alert.mdx
@@ -21,7 +21,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/alert"
+npx shadcn@latest add "https://blode.co/ui/r/alert.json"
```
diff --git a/content/docs/components/ask-user-questions.mdx b/content/docs/components/ask-user-questions.mdx
index 9e5a4df..6802f04 100644
--- a/content/docs/components/ask-user-questions.mdx
+++ b/content/docs/components/ask-user-questions.mdx
@@ -23,7 +23,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/ask-user-questions"
+npx shadcn@latest add "https://blode.co/ui/r/ask-user-questions.json"
```
diff --git a/content/docs/components/aspect-ratio.mdx b/content/docs/components/aspect-ratio.mdx
index 4e586c5..af0d2c3 100644
--- a/content/docs/components/aspect-ratio.mdx
+++ b/content/docs/components/aspect-ratio.mdx
@@ -24,7 +24,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/aspect-ratio"
+npx shadcn@latest add "https://blode.co/ui/r/aspect-ratio.json"
```
diff --git a/content/docs/components/attachment.mdx b/content/docs/components/attachment.mdx
index 4c5b8c4..dee6229 100644
--- a/content/docs/components/attachment.mdx
+++ b/content/docs/components/attachment.mdx
@@ -25,7 +25,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/attachment"
+npx shadcn@latest add "https://blode.co/ui/r/attachment.json"
```
diff --git a/content/docs/components/autocomplete.mdx b/content/docs/components/autocomplete.mdx
index 65251d3..8dec6fb 100644
--- a/content/docs/components/autocomplete.mdx
+++ b/content/docs/components/autocomplete.mdx
@@ -24,7 +24,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/autocomplete"
+npx shadcn@latest add "https://blode.co/ui/r/autocomplete.json"
```
diff --git a/content/docs/components/avatar.mdx b/content/docs/components/avatar.mdx
index db78a06..a810cb5 100644
--- a/content/docs/components/avatar.mdx
+++ b/content/docs/components/avatar.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/avatar"
+npx shadcn@latest add "https://blode.co/ui/r/avatar.json"
```
diff --git a/content/docs/components/badge.mdx b/content/docs/components/badge.mdx
index 4d35a71..d03f40e 100644
--- a/content/docs/components/badge.mdx
+++ b/content/docs/components/badge.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/badge"
+npx shadcn@latest add "https://blode.co/ui/r/badge.json"
```
diff --git a/content/docs/components/bar-list.mdx b/content/docs/components/bar-list.mdx
index 155f433..3717544 100644
--- a/content/docs/components/bar-list.mdx
+++ b/content/docs/components/bar-list.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/bar-list"
+npx shadcn@latest add "https://blode.co/ui/r/bar-list.json"
```
diff --git a/content/docs/components/breadcrumb.mdx b/content/docs/components/breadcrumb.mdx
index 9c4da05..83325a8 100644
--- a/content/docs/components/breadcrumb.mdx
+++ b/content/docs/components/breadcrumb.mdx
@@ -21,7 +21,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/breadcrumb"
+npx shadcn@latest add "https://blode.co/ui/r/breadcrumb.json"
```
diff --git a/content/docs/components/bubble.mdx b/content/docs/components/bubble.mdx
index ca07abc..a698267 100644
--- a/content/docs/components/bubble.mdx
+++ b/content/docs/components/bubble.mdx
@@ -25,7 +25,7 @@ transcript entry that styles user and assistant turns for you, see
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/bubble"
+npx shadcn@latest add "https://blode.co/ui/r/bubble.json"
```
diff --git a/content/docs/components/button-group.mdx b/content/docs/components/button-group.mdx
index 6cce5bf..d8e01df 100644
--- a/content/docs/components/button-group.mdx
+++ b/content/docs/components/button-group.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/button-group"
+npx shadcn@latest add "https://blode.co/ui/r/button-group.json"
```
diff --git a/content/docs/components/button.mdx b/content/docs/components/button.mdx
index 2b5f893..f56632a 100644
--- a/content/docs/components/button.mdx
+++ b/content/docs/components/button.mdx
@@ -18,7 +18,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/button"
+npx shadcn@latest add "https://blode.co/ui/r/button.json"
```
diff --git a/content/docs/components/calendar.mdx b/content/docs/components/calendar.mdx
index 745fdd8..c6589df 100644
--- a/content/docs/components/calendar.mdx
+++ b/content/docs/components/calendar.mdx
@@ -42,7 +42,7 @@ renders inside an `rtl` direction.
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/calendar"
+npx shadcn@latest add "https://blode.co/ui/r/calendar.json"
```
diff --git a/content/docs/components/card.mdx b/content/docs/components/card.mdx
index 9f2ea8c..050d83a 100644
--- a/content/docs/components/card.mdx
+++ b/content/docs/components/card.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/card"
+npx shadcn@latest add "https://blode.co/ui/r/card.json"
```
diff --git a/content/docs/components/carousel.mdx b/content/docs/components/carousel.mdx
index a9da181..33e06e4 100644
--- a/content/docs/components/carousel.mdx
+++ b/content/docs/components/carousel.mdx
@@ -29,7 +29,7 @@ The carousel component is built using the [Embla Carousel](https://www.embla-car
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/carousel"
+npx shadcn@latest add "https://blode.co/ui/r/carousel.json"
```
diff --git a/content/docs/components/chat-message.mdx b/content/docs/components/chat-message.mdx
index 7ac93fd..b03e6c1 100644
--- a/content/docs/components/chat-message.mdx
+++ b/content/docs/components/chat-message.mdx
@@ -21,7 +21,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/chat-message"
+npx shadcn@latest add "https://blode.co/ui/r/chat-message.json"
```
diff --git a/content/docs/components/checkbox-group.mdx b/content/docs/components/checkbox-group.mdx
index 37cf4ef..f4a15a5 100644
--- a/content/docs/components/checkbox-group.mdx
+++ b/content/docs/components/checkbox-group.mdx
@@ -23,7 +23,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/checkbox-group"
+npx shadcn@latest add "https://blode.co/ui/r/checkbox-group.json"
```
diff --git a/content/docs/components/checkbox.mdx b/content/docs/components/checkbox.mdx
index ddc7c51..bc23815 100644
--- a/content/docs/components/checkbox.mdx
+++ b/content/docs/components/checkbox.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/checkbox"
+npx shadcn@latest add "https://blode.co/ui/r/checkbox.json"
```
diff --git a/content/docs/components/circular-progress.mdx b/content/docs/components/circular-progress.mdx
index 7b950a7..5fe34b9 100644
--- a/content/docs/components/circular-progress.mdx
+++ b/content/docs/components/circular-progress.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/circular-progress"
+npx shadcn@latest add "https://blode.co/ui/r/circular-progress.json"
```
diff --git a/content/docs/components/collapsible.mdx b/content/docs/components/collapsible.mdx
index fd615b3..62c2c06 100644
--- a/content/docs/components/collapsible.mdx
+++ b/content/docs/components/collapsible.mdx
@@ -21,7 +21,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/collapsible"
+npx shadcn@latest add "https://blode.co/ui/r/collapsible.json"
```
diff --git a/content/docs/components/combobox.mdx b/content/docs/components/combobox.mdx
index 861f022..70bba9b 100644
--- a/content/docs/components/combobox.mdx
+++ b/content/docs/components/combobox.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/combobox"
+npx shadcn@latest add "https://blode.co/ui/r/combobox.json"
```
diff --git a/content/docs/components/command.mdx b/content/docs/components/command.mdx
index b49b59d..e3c02f9 100644
--- a/content/docs/components/command.mdx
+++ b/content/docs/components/command.mdx
@@ -28,7 +28,7 @@ The `` component uses the [`cmdk`](https://github.com/dip/cmdk) compo
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/command"
+npx shadcn@latest add "https://blode.co/ui/r/command.json"
```
diff --git a/content/docs/components/context-menu.mdx b/content/docs/components/context-menu.mdx
index 1092e46..5578142 100644
--- a/content/docs/components/context-menu.mdx
+++ b/content/docs/components/context-menu.mdx
@@ -23,7 +23,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/context-menu"
+npx shadcn@latest add "https://blode.co/ui/r/context-menu.json"
```
diff --git a/content/docs/components/copy-button.mdx b/content/docs/components/copy-button.mdx
index 24017fa..69e2a6a 100644
--- a/content/docs/components/copy-button.mdx
+++ b/content/docs/components/copy-button.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/copy-button"
+npx shadcn@latest add "https://blode.co/ui/r/copy-button.json"
```
diff --git a/content/docs/components/currency-input.mdx b/content/docs/components/currency-input.mdx
index 1dc9818..60d1280 100644
--- a/content/docs/components/currency-input.mdx
+++ b/content/docs/components/currency-input.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/currency-input"
+npx shadcn@latest add "https://blode.co/ui/r/currency-input.json"
```
diff --git a/content/docs/components/data-table.mdx b/content/docs/components/data-table.mdx
index 15df3ee..37138a7 100644
--- a/content/docs/components/data-table.mdx
+++ b/content/docs/components/data-table.mdx
@@ -42,7 +42,7 @@ This guide will show you how to use [TanStack Table](https://tanstack.com/table/
1. Add the `
` component to your project:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/table"
+npx shadcn@latest add "https://blode.co/ui/r/table.json"
```
2. Add `tanstack/react-table` dependency:
diff --git a/content/docs/components/dialog.mdx b/content/docs/components/dialog.mdx
index 707299b..3f98d6d 100644
--- a/content/docs/components/dialog.mdx
+++ b/content/docs/components/dialog.mdx
@@ -21,7 +21,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/dialog"
+npx shadcn@latest add "https://blode.co/ui/r/dialog.json"
```
diff --git a/content/docs/components/drawer.mdx b/content/docs/components/drawer.mdx
index a2760a3..ede8ecf 100644
--- a/content/docs/components/drawer.mdx
+++ b/content/docs/components/drawer.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/drawer"
+npx shadcn@latest add "https://blode.co/ui/r/drawer.json"
```
diff --git a/content/docs/components/dropdown-menu.mdx b/content/docs/components/dropdown-menu.mdx
index fc42058..6c4a53a 100644
--- a/content/docs/components/dropdown-menu.mdx
+++ b/content/docs/components/dropdown-menu.mdx
@@ -24,7 +24,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/dropdown-menu"
+npx shadcn@latest add "https://blode.co/ui/r/dropdown-menu.json"
```
diff --git a/content/docs/components/empty.mdx b/content/docs/components/empty.mdx
index ea5f2ff..e2c0196 100644
--- a/content/docs/components/empty.mdx
+++ b/content/docs/components/empty.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/empty"
+npx shadcn@latest add "https://blode.co/ui/r/empty.json"
```
diff --git a/content/docs/components/field.mdx b/content/docs/components/field.mdx
index 866b266..6b368cc 100644
--- a/content/docs/components/field.mdx
+++ b/content/docs/components/field.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/field"
+npx shadcn@latest add "https://blode.co/ui/r/field.json"
```
diff --git a/content/docs/components/hover-card.mdx b/content/docs/components/hover-card.mdx
index 4683ebd..6228e84 100644
--- a/content/docs/components/hover-card.mdx
+++ b/content/docs/components/hover-card.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/hover-card"
+npx shadcn@latest add "https://blode.co/ui/r/hover-card.json"
```
diff --git a/content/docs/components/input-group.mdx b/content/docs/components/input-group.mdx
index a82d9b1..707d6a0 100644
--- a/content/docs/components/input-group.mdx
+++ b/content/docs/components/input-group.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/input-group"
+npx shadcn@latest add "https://blode.co/ui/r/input-group.json"
```
diff --git a/content/docs/components/input-message.mdx b/content/docs/components/input-message.mdx
index 81136dd..69d1c42 100644
--- a/content/docs/components/input-message.mdx
+++ b/content/docs/components/input-message.mdx
@@ -18,7 +18,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/input-message"
+npx shadcn@latest add "https://blode.co/ui/r/input-message.json"
```
diff --git a/content/docs/components/input-otp.mdx b/content/docs/components/input-otp.mdx
index 15665f5..315b3d2 100644
--- a/content/docs/components/input-otp.mdx
+++ b/content/docs/components/input-otp.mdx
@@ -27,7 +27,7 @@ Input OTP is built on top of [input-otp](https://github.com/guilhermerodz/input-
Run the following command:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/input-otp"
+npx shadcn@latest add "https://blode.co/ui/r/input-otp.json"
```
Update `tailwind.config.js`
diff --git a/content/docs/components/input.mdx b/content/docs/components/input.mdx
index 136cd89..1a6a5e4 100644
--- a/content/docs/components/input.mdx
+++ b/content/docs/components/input.mdx
@@ -21,7 +21,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/input"
+npx shadcn@latest add "https://blode.co/ui/r/input.json"
```
diff --git a/content/docs/components/item.mdx b/content/docs/components/item.mdx
index d3ecfa0..88078b2 100644
--- a/content/docs/components/item.mdx
+++ b/content/docs/components/item.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/item"
+npx shadcn@latest add "https://blode.co/ui/r/item.json"
```
diff --git a/content/docs/components/kbd.mdx b/content/docs/components/kbd.mdx
index f332a2c..72ec6e2 100644
--- a/content/docs/components/kbd.mdx
+++ b/content/docs/components/kbd.mdx
@@ -19,7 +19,7 @@ published: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/kbd"
+npx shadcn@latest add "https://blode.co/ui/r/kbd.json"
```
diff --git a/content/docs/components/label.mdx b/content/docs/components/label.mdx
index 388f533..f8cf703 100644
--- a/content/docs/components/label.mdx
+++ b/content/docs/components/label.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/label"
+npx shadcn@latest add "https://blode.co/ui/r/label.json"
```
diff --git a/content/docs/components/marker.mdx b/content/docs/components/marker.mdx
index ecf3b71..b232308 100644
--- a/content/docs/components/marker.mdx
+++ b/content/docs/components/marker.mdx
@@ -27,7 +27,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/marker"
+npx shadcn@latest add "https://blode.co/ui/r/marker.json"
```
diff --git a/content/docs/components/menubar.mdx b/content/docs/components/menubar.mdx
index e7c476e..110d2ac 100644
--- a/content/docs/components/menubar.mdx
+++ b/content/docs/components/menubar.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/menubar"
+npx shadcn@latest add "https://blode.co/ui/r/menubar.json"
```
diff --git a/content/docs/components/message-scroller.mdx b/content/docs/components/message-scroller.mdx
index 12d5799..82403bf 100644
--- a/content/docs/components/message-scroller.mdx
+++ b/content/docs/components/message-scroller.mdx
@@ -45,7 +45,7 @@ focused on composing messages, markers, tools, attachments, and prompt inputs.
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/message-scroller"
+npx shadcn@latest add "https://blode.co/ui/r/message-scroller.json"
```
diff --git a/content/docs/components/message.mdx b/content/docs/components/message.mdx
index a02adf8..ace9ea6 100644
--- a/content/docs/components/message.mdx
+++ b/content/docs/components/message.mdx
@@ -18,7 +18,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/message"
+npx shadcn@latest add "https://blode.co/ui/r/message.json"
```
diff --git a/content/docs/components/meter.mdx b/content/docs/components/meter.mdx
index d97d73d..9429cc8 100644
--- a/content/docs/components/meter.mdx
+++ b/content/docs/components/meter.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/meter"
+npx shadcn@latest add "https://blode.co/ui/r/meter.json"
```
diff --git a/content/docs/components/multi-combobox.mdx b/content/docs/components/multi-combobox.mdx
index 6ea70c2..ad24e18 100644
--- a/content/docs/components/multi-combobox.mdx
+++ b/content/docs/components/multi-combobox.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/multi-combobox"
+npx shadcn@latest add "https://blode.co/ui/r/multi-combobox.json"
```
diff --git a/content/docs/components/native-select.mdx b/content/docs/components/native-select.mdx
index 5fdb9fc..7da4999 100644
--- a/content/docs/components/native-select.mdx
+++ b/content/docs/components/native-select.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/native-select"
+npx shadcn@latest add "https://blode.co/ui/r/native-select.json"
```
diff --git a/content/docs/components/navigation-menu.mdx b/content/docs/components/navigation-menu.mdx
index 5f36930..3abb64a 100644
--- a/content/docs/components/navigation-menu.mdx
+++ b/content/docs/components/navigation-menu.mdx
@@ -23,7 +23,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/navigation-menu"
+npx shadcn@latest add "https://blode.co/ui/r/navigation-menu.json"
```
diff --git a/content/docs/components/number-field.mdx b/content/docs/components/number-field.mdx
index 33789d8..a0524e1 100644
--- a/content/docs/components/number-field.mdx
+++ b/content/docs/components/number-field.mdx
@@ -24,7 +24,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/number-field"
+npx shadcn@latest add "https://blode.co/ui/r/number-field.json"
```
diff --git a/content/docs/components/pagination.mdx b/content/docs/components/pagination.mdx
index 38ebd10..c210894 100644
--- a/content/docs/components/pagination.mdx
+++ b/content/docs/components/pagination.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/pagination"
+npx shadcn@latest add "https://blode.co/ui/r/pagination.json"
```
diff --git a/content/docs/components/password-input.mdx b/content/docs/components/password-input.mdx
index 3679be0..d7b6955 100644
--- a/content/docs/components/password-input.mdx
+++ b/content/docs/components/password-input.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/password-input"
+npx shadcn@latest add "https://blode.co/ui/r/password-input.json"
```
diff --git a/content/docs/components/phone-input.mdx b/content/docs/components/phone-input.mdx
index 2a3f7de..265fb57 100644
--- a/content/docs/components/phone-input.mdx
+++ b/content/docs/components/phone-input.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/phone-input"
+npx shadcn@latest add "https://blode.co/ui/r/phone-input.json"
```
diff --git a/content/docs/components/popover.mdx b/content/docs/components/popover.mdx
index c42d953..be0143a 100644
--- a/content/docs/components/popover.mdx
+++ b/content/docs/components/popover.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/popover"
+npx shadcn@latest add "https://blode.co/ui/r/popover.json"
```
diff --git a/content/docs/components/progress-list.mdx b/content/docs/components/progress-list.mdx
index 6d1a40a..eaf9721 100644
--- a/content/docs/components/progress-list.mdx
+++ b/content/docs/components/progress-list.mdx
@@ -20,7 +20,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/progress-list"
+npx shadcn@latest add "https://blode.co/ui/r/progress-list.json"
```
diff --git a/content/docs/components/progress.mdx b/content/docs/components/progress.mdx
index b991098..12ce31e 100644
--- a/content/docs/components/progress.mdx
+++ b/content/docs/components/progress.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/progress"
+npx shadcn@latest add "https://blode.co/ui/r/progress.json"
```
diff --git a/content/docs/components/prompt.mdx b/content/docs/components/prompt.mdx
index 14b4c8f..42474cd 100644
--- a/content/docs/components/prompt.mdx
+++ b/content/docs/components/prompt.mdx
@@ -16,7 +16,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/prompt"
+npx shadcn@latest add "https://blode.co/ui/r/prompt.json"
```
diff --git a/content/docs/components/radio-group.mdx b/content/docs/components/radio-group.mdx
index 83d20a2..0b7b45d 100644
--- a/content/docs/components/radio-group.mdx
+++ b/content/docs/components/radio-group.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/radio-group"
+npx shadcn@latest add "https://blode.co/ui/r/radio-group.json"
```
diff --git a/content/docs/components/resizable.mdx b/content/docs/components/resizable.mdx
index 406220f..09869c0 100644
--- a/content/docs/components/resizable.mdx
+++ b/content/docs/components/resizable.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/resizable"
+npx shadcn@latest add "https://blode.co/ui/r/resizable.json"
```
diff --git a/content/docs/components/scroll-area.mdx b/content/docs/components/scroll-area.mdx
index 493fbb5..f233f2d 100644
--- a/content/docs/components/scroll-area.mdx
+++ b/content/docs/components/scroll-area.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/scroll-area"
+npx shadcn@latest add "https://blode.co/ui/r/scroll-area.json"
```
diff --git a/content/docs/components/select.mdx b/content/docs/components/select.mdx
index f130d30..fd60047 100644
--- a/content/docs/components/select.mdx
+++ b/content/docs/components/select.mdx
@@ -21,7 +21,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/select"
+npx shadcn@latest add "https://blode.co/ui/r/select.json"
```
diff --git a/content/docs/components/separator.mdx b/content/docs/components/separator.mdx
index 105f654..34d02b0 100644
--- a/content/docs/components/separator.mdx
+++ b/content/docs/components/separator.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/separator"
+npx shadcn@latest add "https://blode.co/ui/r/separator.json"
```
diff --git a/content/docs/components/sheet.mdx b/content/docs/components/sheet.mdx
index a43f22e..0221b85 100644
--- a/content/docs/components/sheet.mdx
+++ b/content/docs/components/sheet.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/sheet"
+npx shadcn@latest add "https://blode.co/ui/r/sheet.json"
```
diff --git a/content/docs/components/skeleton.mdx b/content/docs/components/skeleton.mdx
index e381ed3..edd24e4 100644
--- a/content/docs/components/skeleton.mdx
+++ b/content/docs/components/skeleton.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/skeleton"
+npx shadcn@latest add "https://blode.co/ui/r/skeleton.json"
```
diff --git a/content/docs/components/slider.mdx b/content/docs/components/slider.mdx
index 7100ef1..81df729 100644
--- a/content/docs/components/slider.mdx
+++ b/content/docs/components/slider.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/slider"
+npx shadcn@latest add "https://blode.co/ui/r/slider.json"
```
diff --git a/content/docs/components/sonner.mdx b/content/docs/components/sonner.mdx
index e569e42..a119cd3 100644
--- a/content/docs/components/sonner.mdx
+++ b/content/docs/components/sonner.mdx
@@ -27,7 +27,7 @@ Sonner is built and maintained by [emilkowalski\_](https://twitter.com/emilkowal
Run the following command:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/sonner"
+npx shadcn@latest add "https://blode.co/ui/r/sonner.json"
```
Add the Toaster component
diff --git a/content/docs/components/spinner.mdx b/content/docs/components/spinner.mdx
index 74d09ff..2601583 100644
--- a/content/docs/components/spinner.mdx
+++ b/content/docs/components/spinner.mdx
@@ -19,7 +19,7 @@ published: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/spinner"
+npx shadcn@latest add "https://blode.co/ui/r/spinner.json"
```
diff --git a/content/docs/components/stat.mdx b/content/docs/components/stat.mdx
index 3b4716f..e81748a 100644
--- a/content/docs/components/stat.mdx
+++ b/content/docs/components/stat.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/stat"
+npx shadcn@latest add "https://blode.co/ui/r/stat.json"
```
diff --git a/content/docs/components/switch.mdx b/content/docs/components/switch.mdx
index f56095b..2ed7ca6 100644
--- a/content/docs/components/switch.mdx
+++ b/content/docs/components/switch.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/switch"
+npx shadcn@latest add "https://blode.co/ui/r/switch.json"
```
diff --git a/content/docs/components/table.mdx b/content/docs/components/table.mdx
index ec95bfe..9007482 100644
--- a/content/docs/components/table.mdx
+++ b/content/docs/components/table.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/table"
+npx shadcn@latest add "https://blode.co/ui/r/table.json"
```
diff --git a/content/docs/components/tabs.mdx b/content/docs/components/tabs.mdx
index ff54eea..499b60c 100644
--- a/content/docs/components/tabs.mdx
+++ b/content/docs/components/tabs.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/tabs"
+npx shadcn@latest add "https://blode.co/ui/r/tabs.json"
```
diff --git a/content/docs/components/textarea.mdx b/content/docs/components/textarea.mdx
index 4ea0e07..f582136 100644
--- a/content/docs/components/textarea.mdx
+++ b/content/docs/components/textarea.mdx
@@ -17,7 +17,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/textarea"
+npx shadcn@latest add "https://blode.co/ui/r/textarea.json"
```
diff --git a/content/docs/components/thinking-indicator.mdx b/content/docs/components/thinking-indicator.mdx
index f452ecb..538bb01 100644
--- a/content/docs/components/thinking-indicator.mdx
+++ b/content/docs/components/thinking-indicator.mdx
@@ -21,7 +21,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/thinking-indicator"
+npx shadcn@latest add "https://blode.co/ui/r/thinking-indicator.json"
```
diff --git a/content/docs/components/thinking-steps.mdx b/content/docs/components/thinking-steps.mdx
index 7c9f0af..db0585e 100644
--- a/content/docs/components/thinking-steps.mdx
+++ b/content/docs/components/thinking-steps.mdx
@@ -18,7 +18,7 @@ component: true
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/thinking-steps"
+npx shadcn@latest add "https://blode.co/ui/r/thinking-steps.json"
```
diff --git a/content/docs/components/toggle-group.mdx b/content/docs/components/toggle-group.mdx
index 1307c3c..406e15d 100644
--- a/content/docs/components/toggle-group.mdx
+++ b/content/docs/components/toggle-group.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/toggle-group"
+npx shadcn@latest add "https://blode.co/ui/r/toggle-group.json"
```
diff --git a/content/docs/components/toggle.mdx b/content/docs/components/toggle.mdx
index ca0f254..2c09cd4 100644
--- a/content/docs/components/toggle.mdx
+++ b/content/docs/components/toggle.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/toggle"
+npx shadcn@latest add "https://blode.co/ui/r/toggle.json"
```
diff --git a/content/docs/components/tooltip.mdx b/content/docs/components/tooltip.mdx
index b407794..fc4ae1f 100644
--- a/content/docs/components/tooltip.mdx
+++ b/content/docs/components/tooltip.mdx
@@ -20,7 +20,7 @@ links:
```bash
-npx shadcn@latest add "https://blode.co/ui/r/styles/default/tooltip"
+npx shadcn@latest add "https://blode.co/ui/r/tooltip.json"
```
diff --git a/public/registry.json b/public/registry.json
index e094048..0e0dca1 100644
--- a/public/registry.json
+++ b/public/registry.json
@@ -1,1790 +1,1227 @@
{
"$schema": "https://ui.shadcn.com/schema/registry.json",
- "name": "blode/ui",
"homepage": "https://blode.co/ui",
"items": [
{
- "name": "index",
- "type": "registry:style",
- "dependencies": ["class-variance-authority", "blode-icons-react"],
+ "name": "ui",
+ "type": "registry:base",
+ "title": "Blode UI",
+ "description": "Blode UI design-system base built on Base UI.",
+ "dependencies": [
+ "@base-ui/react",
+ "tw-animate-css",
+ "class-variance-authority",
+ "blode-icons-react"
+ ],
"registryDependencies": ["utils"],
- "files": [],
- "cssVars": {}
+ "cssVars": {
+ "theme": {
+ "field-height": "48px",
+ "field-height-sm": "40px",
+ "field-padding-x": "1rem",
+ "field-padding-y": "12px",
+ "field-radius": "var(--radius-2xl)",
+ "radius-2xl": "calc(var(--radius) + 8px)",
+ "radius-3xl": "calc(var(--radius) + 12px)",
+ "radius-4xl": "calc(var(--radius) + 16px)",
+ "radius-md": "calc(var(--radius) - 2px)",
+ "radius-sm": "calc(var(--radius) - 4px)",
+ "radius-xl": "calc(var(--radius) + 4px)",
+ "shadow-input": "0 1px 2px 0 rgb(0 0 0 / 0.05)",
+ "shadow-lg": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 1px 1px 0.5px rgba(51, 51, 51, 0.04), 0 3px 3px -1.5px rgba(51, 51, 51, 0.02), 0 6px 6px -3px rgba(51, 51, 51, 0.04), 0 12px 12px -6px rgba(51, 51, 51, 0.04), 0 24px 24px -12px rgba(51, 51, 51, 0.04), 0 48px 48px -24px rgba(51, 51, 51, 0.04), 0 96px 96px -32px rgba(51, 51, 51, 0.06), inset 0 -1px 1px -0.5px rgba(51, 51, 51, 0.06)",
+ "shadow-md": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 1px 1px 0.5px rgba(51, 51, 51, 0.04), 0 3px 3px -1.5px rgba(51, 51, 51, 0.02), 0 6px 6px -3px rgba(51, 51, 51, 0.04), 0 12px 12px -6px rgba(51, 51, 51, 0.04), 0 24px 24px -12px rgba(51, 51, 51, 0.04), 0 48px 48px -24px rgba(51, 51, 51, 0.04), inset 0 -1px 1px -0.5px rgba(51, 51, 51, 0.06)",
+ "shadow-popover": "0 24px 40px -12px oklch(0.255 0.078 116.06 / 0.08), 0 16px 28px -8px oklch(0.255 0.078 116.06 / 0.04), 0 4px 6px -2px oklch(0.255 0.078 116.06 / 0.04), 0 0 2px 0 oklch(0.255 0.078 116.06 / 0.04), 0 0 0 1px oklch(0.255 0.078 116.06 / 0.04)",
+ "shadow-sm": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 16px 8px -8px rgba(51, 51, 51, 0.01), 0 12px 6px -6px rgba(51, 51, 51, 0.02), 0 5px 5px -2.5px rgba(51, 51, 51, 0.08), 0 1px 3px -1.5px rgba(51, 51, 51, 0.16), inset 0 -0.5px 0.5px rgba(51, 51, 51, 0.08)",
+ "shadow-soft": "0 15px 50px 0 rgba(27, 32, 50, 0.1)",
+ "shadow-xs": "0 0 0 1px rgba(51, 51, 51, 0.04), 0 4px 8px -2px rgba(51, 51, 51, 0.06), 0 2px 4px rgba(51, 51, 51, 0.04), 0 1px 2px rgba(51, 51, 51, 0.04), inset 0 -1px 1px -0.5px rgba(51, 51, 51, 0.06)",
+ "textarea-min-height": "70px"
+ },
+ "light": {
+ "code": "oklch(0.98 0 0)",
+ "code-foreground": "oklch(0.145 0 0)",
+ "input-hover": "oklch(0.87 0 0)",
+ "overlay": "oklch(0.832 0.015 251.2 / 0.7)",
+ "placeholder-foreground": "oklch(0.556 0 0)",
+ "success": "oklch(0.527 0.154 150.069)",
+ "success-foreground": "oklch(1 0 0)",
+ "surface": "oklch(0.98 0 0)",
+ "surface-foreground": "oklch(0.145 0 0)",
+ "warning": "oklch(0.681 0.162 75.834)",
+ "warning-foreground": "oklch(0.286 0.066 53.813)"
+ },
+ "dark": {
+ "code": "oklch(0.2 0 0)",
+ "code-foreground": "oklch(0.708 0 0)",
+ "input-hover": "oklch(1 0 0 / 25%)",
+ "overlay": "oklch(0.326 0.03 258.3 / 0.7)",
+ "placeholder-foreground": "oklch(0.708 0 0)",
+ "success": "oklch(0.723 0.219 149.579)",
+ "success-foreground": "oklch(0.266 0.065 152.934)",
+ "surface": "oklch(0.2 0 0)",
+ "surface-foreground": "oklch(0.708 0 0)",
+ "warning": "oklch(0.795 0.184 86.047)",
+ "warning-foreground": "oklch(0.286 0.066 53.813)"
+ }
+ },
+ "css": {
+ "@media (prefers-reduced-motion: reduce)": {
+ "*, *::before, *::after": {
+ "animation-duration": "0.01ms !important",
+ "animation-iteration-count": "1 !important",
+ "scroll-behavior": "auto !important",
+ "transition-duration": "0.01ms !important"
+ }
+ },
+ "@utility tabular-figures": {
+ "font-family": "var(--font-mono)",
+ "font-variant-numeric": "tabular-nums"
+ }
+ },
+ "config": {
+ "tailwind": {
+ "baseColor": "neutral",
+ "cssVariables": true
+ },
+ "iconLibrary": "blode-icons-react",
+ "registries": {
+ "@blode": "https://blode.co/ui/r/{name}.json"
+ }
+ }
},
{
"name": "accordion",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Accordion",
+ "description": "A vertically stacked set of interactive headings that reveal or hide associated content.",
+ "dependencies": ["@base-ui/react", "motion"],
"files": [
{
- "path": "registry/ui/accordion.tsx",
+ "path": "registry/default/ui/accordion.tsx",
"type": "registry:ui"
}
- ],
- "tailwind": {
- "config": {
- "theme": {
- "extend": {
- "keyframes": {
- "accordion-down": {
- "from": {
- "height": "0"
- },
- "to": {
- "height": "var(--radix-accordion-content-height)"
- }
- },
- "accordion-up": {
- "from": {
- "height": "var(--radix-accordion-content-height)"
- },
- "to": {
- "height": "0"
- }
- }
- },
- "animation": {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out"
- }
- }
- }
- }
- }
+ ]
},
{
"name": "alert",
"type": "registry:ui",
+ "title": "Alert",
+ "description": "A callout that displays a short, important message to attract attention.",
"files": [
{
- "path": "registry/ui/alert.tsx",
+ "path": "registry/default/ui/alert.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "avatar",
+ "name": "alert-dialog",
"type": "registry:ui",
+ "title": "Alert Dialog",
+ "description": "A modal dialog that interrupts the user with important content and expects a response.",
"dependencies": ["@base-ui/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "registry/ui/avatar.tsx",
+ "path": "registry/default/ui/alert-dialog.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "badge",
+ "name": "aspect-ratio",
"type": "registry:ui",
+ "title": "Aspect Ratio",
+ "description": "A component that maintains a consistent width-to-height ratio.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/badge.tsx",
+ "path": "registry/default/ui/aspect-ratio.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "button",
+ "name": "autocomplete",
"type": "registry:ui",
+ "title": "Autocomplete",
+ "description": "An input that suggests matching values while typing.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/button.tsx",
+ "path": "registry/default/ui/autocomplete.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "card",
+ "name": "avatar",
"type": "registry:ui",
+ "title": "Avatar",
+ "description": "An image element with a fallback for representing the user.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/card.tsx",
+ "path": "registry/default/ui/avatar.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "collapsible",
+ "name": "bar-list",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Bar List",
+ "description": "A compact comparison list that visualises values as horizontal bars.",
"files": [
{
- "path": "registry/ui/collapsible.tsx",
+ "path": "registry/default/ui/bar-list.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "command",
+ "name": "badge",
"type": "registry:ui",
- "dependencies": ["cmdk"],
- "registryDependencies": ["dialog"],
+ "title": "Badge",
+ "description": "A small status indicator for labelling and categorising items.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/command.tsx",
+ "path": "registry/default/ui/badge.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "dialog",
+ "name": "breadcrumb",
"type": "registry:ui",
+ "title": "Breadcrumb",
+ "description": "A navigation aid that shows the current page location within a hierarchy.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/dialog.tsx",
+ "path": "registry/default/ui/breadcrumb.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "dropdown-menu",
+ "name": "button",
"type": "registry:ui",
+ "title": "Button",
+ "description": "An interactive element that triggers an action when clicked.",
"dependencies": ["@base-ui/react"],
+ "registryDependencies": ["spinner"],
"files": [
{
- "path": "registry/ui/dropdown-menu.tsx",
+ "path": "registry/default/ui/button.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "input",
+ "name": "button-group",
"type": "registry:ui",
+ "title": "Button Group",
+ "description": "A container that groups related buttons together with shared styling.",
+ "registryDependencies": ["button", "separator"],
"files": [
{
- "path": "registry/ui/input.tsx",
+ "path": "registry/default/ui/button-group.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "label",
+ "name": "calendar",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Calendar",
+ "description": "A date field component that allows users to pick dates.",
+ "dependencies": ["react-day-picker@latest", "date-fns"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "registry/ui/label.tsx",
+ "path": "registry/default/ui/calendar.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "popover",
+ "name": "card",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Card",
+ "description": "A container for grouping related content and actions.",
"files": [
{
- "path": "registry/ui/popover.tsx",
+ "path": "registry/default/ui/card.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "scroll-area",
+ "name": "carousel",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Carousel",
+ "description": "A slideshow component for cycling through a set of content.",
+ "dependencies": ["embla-carousel-react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "registry/ui/scroll-area.tsx",
+ "path": "registry/default/ui/carousel.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "select",
+ "name": "circular-progress",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Circular Progress",
+ "description": "A circular indicator that shows the progress of a task.",
"files": [
{
- "path": "registry/ui/select.tsx",
+ "path": "registry/default/ui/circular-progress.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "separator",
+ "name": "checkbox",
"type": "registry:ui",
+ "title": "Checkbox",
+ "description": "A control that allows the user to toggle between checked and unchecked states.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/separator.tsx",
+ "path": "registry/default/ui/checkbox.tsx",
+ "type": "registry:ui"
+ },
+ {
+ "path": "registry/default/ui/checkbox.css",
"type": "registry:ui"
}
]
},
{
- "name": "sheet",
+ "name": "checkbox-group",
"type": "registry:ui",
+ "title": "Checkbox Group",
+ "description": "A grouped set of related checkboxes managed with shared state.",
"dependencies": ["@base-ui/react"],
+ "registryDependencies": ["checkbox"],
"files": [
{
- "path": "registry/ui/sheet.tsx",
+ "path": "registry/default/ui/checkbox-group.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "skeleton",
+ "name": "collapsible",
"type": "registry:ui",
+ "title": "Collapsible",
+ "description": "An interactive component that expands and collapses a panel of content.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/skeleton.tsx",
+ "path": "registry/default/ui/collapsible.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "sonner",
+ "name": "currency-input",
"type": "registry:ui",
- "dependencies": ["sonner", "next-themes"],
+ "title": "Currency Input",
+ "description": "A formatted input field for entering monetary values.",
+ "dependencies": ["blode-icons-react", "react-currency-input-field"],
"files": [
{
- "path": "registry/ui/sonner.tsx",
+ "path": "registry/default/ui/currency-input.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "switch",
+ "name": "combobox",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Combobox",
+ "description": "An autocomplete input that combines a text field with a filterable dropdown list.",
+ "dependencies": ["@base-ui/react", "blode-icons-react"],
+ "registryDependencies": ["button", "input-group"],
"files": [
{
- "path": "registry/ui/switch.tsx",
+ "path": "registry/default/ui/combobox.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "table",
+ "name": "multi-combobox",
"type": "registry:ui",
+ "title": "Multi Combobox",
+ "description": "A combobox that allows selecting multiple items with tag-style badges.",
+ "dependencies": ["@base-ui/react", "downshift", "lodash", "blode-icons-react"],
+ "registryDependencies": ["badge"],
"files": [
{
- "path": "registry/ui/table.tsx",
+ "path": "registry/default/ui/multi-combobox.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "tabs",
+ "name": "command",
"type": "registry:ui",
- "dependencies": ["@base-ui/react"],
+ "title": "Command",
+ "description": "A command palette for fast, keyboard-driven searching and navigation.",
+ "dependencies": ["cmdk"],
+ "registryDependencies": ["dialog"],
"files": [
{
- "path": "registry/ui/tabs.tsx",
+ "path": "registry/default/ui/command.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "tooltip",
+ "name": "context-menu",
"type": "registry:ui",
+ "title": "Context Menu",
+ "description": "A menu that appears on right-click, providing contextual actions.",
"dependencies": ["@base-ui/react"],
"files": [
{
- "path": "registry/ui/tooltip.tsx",
+ "path": "registry/default/ui/context-menu.tsx",
"type": "registry:ui"
}
]
},
{
- "name": "accordion-demo",
- "type": "registry:example",
- "registryDependencies": ["accordion"],
- "files": [
- {
- "path": "examples/accordion-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-demo",
- "type": "registry:example",
- "registryDependencies": ["alert"],
+ "name": "copy-button",
+ "type": "registry:ui",
+ "title": "Copy Button",
+ "description": "A button that copies text to the clipboard with animated feedback.",
+ "dependencies": ["blode-icons-react", "motion"],
+ "registryDependencies": ["button", "@blode/use-copy-to-clipboard"],
"files": [
{
- "path": "examples/alert-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/copy-button.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "alert-destructive",
- "type": "registry:example",
- "registryDependencies": ["alert"],
+ "name": "dialog",
+ "type": "registry:ui",
+ "title": "Dialog",
+ "description": "A modal window that overlays the main content and requires user interaction.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "examples/alert-destructive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/dialog.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "alert-dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["alert-dialog", "button"],
+ "name": "drawer",
+ "type": "registry:ui",
+ "title": "Drawer",
+ "description": "A panel that slides in from the edge of the screen.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/alert-dialog-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/drawer.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "aspect-ratio-demo",
- "type": "registry:example",
- "registryDependencies": ["aspect-ratio"],
+ "name": "dropdown-menu",
+ "type": "registry:ui",
+ "title": "Dropdown Menu",
+ "description": "A menu that opens from a trigger button, displaying a list of actions.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/aspect-ratio-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/dropdown-menu.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "avatar-demo",
- "type": "registry:example",
- "registryDependencies": ["avatar"],
+ "name": "empty",
+ "type": "registry:ui",
+ "title": "Empty",
+ "description": "A placeholder displayed when there is no content or data to show.",
"files": [
{
- "path": "examples/avatar-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/empty.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-demo",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "field",
+ "type": "registry:ui",
+ "title": "Field",
+ "description": "A form field wrapper that pairs a label, input, and helper text.",
+ "registryDependencies": ["label", "separator"],
"files": [
{
- "path": "examples/badge-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/field.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-destructive",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "form",
+ "type": "registry:ui",
+ "title": "Form",
+ "description": "A form component with validation powered by React Hook Form and Zod.",
+ "dependencies": ["@base-ui/react", "@hookform/resolvers", "zod", "react-hook-form"],
+ "registryDependencies": ["button", "label"],
"files": [
{
- "path": "examples/badge-destructive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/form.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-outline",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "hover-card",
+ "type": "registry:ui",
+ "title": "Hover Card",
+ "description": "A popup card that appears when hovering over a trigger element.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/badge-outline.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/hover-card.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "badge-green",
- "type": "registry:example",
- "registryDependencies": ["badge"],
+ "name": "input",
+ "type": "registry:ui",
+ "title": "Input",
+ "description": "A text input field for capturing user data.",
+ "dependencies": ["blode-icons-react"],
"files": [
{
- "path": "examples/badge-green.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-demo",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "input-group",
+ "type": "registry:ui",
+ "title": "Input Group",
+ "description": "A wrapper that combines an input with addons like icons or buttons.",
+ "registryDependencies": ["button", "input", "textarea"],
"files": [
{
- "path": "examples/breadcrumb-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input-group.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-separator",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "input-otp",
+ "type": "registry:ui",
+ "title": "Input OTP",
+ "description": "A one-time password input with individual character fields.",
+ "dependencies": ["input-otp"],
"files": [
{
- "path": "examples/breadcrumb-separator.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input-otp.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-dropdown",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "item",
+ "type": "registry:ui",
+ "title": "Item",
+ "description": "A flexible list item component for menus, settings, and data rows.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["separator"],
"files": [
{
- "path": "examples/breadcrumb-dropdown.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/item.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-ellipsis",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "label",
+ "type": "registry:ui",
+ "title": "Label",
+ "description": "An accessible label that associates text with a form control.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/breadcrumb-ellipsis.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/label.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-link",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "menubar",
+ "type": "registry:ui",
+ "title": "Menubar",
+ "description": "A horizontal menu bar with dropdown menus, commonly used for application navigation.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/breadcrumb-link.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/menubar.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "breadcrumb-responsive",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
+ "name": "meter",
+ "type": "registry:ui",
+ "title": "Meter",
+ "description": "A meter that shows a scalar value within a bounded range.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/breadcrumb-responsive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/meter.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-demo",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "navigation-menu",
+ "type": "registry:ui",
+ "title": "Navigation Menu",
+ "description": "A responsive navigation component with support for dropdown panels.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/navigation-menu.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-secondary",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "number-field",
+ "type": "registry:ui",
+ "title": "Number Field",
+ "description": "A numeric input with increment, decrement, and scrubbing interactions.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-secondary.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/number-field.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-destructive",
- "type": "registry:example",
+ "name": "pagination",
+ "type": "registry:ui",
+ "title": "Pagination",
+ "description": "A navigation component for paging through content across multiple pages.",
"registryDependencies": ["button"],
"files": [
{
- "path": "examples/button-destructive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/pagination.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-ghost",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "password-input",
+ "type": "registry:ui",
+ "title": "Password Input",
+ "description": "A password input with a toggle button to show or hide the password.",
+ "dependencies": ["blode-icons-react"],
+ "registryDependencies": ["input"],
"files": [
{
- "path": "examples/button-ghost.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/password-input.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-link",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "phone-input",
+ "type": "registry:ui",
+ "title": "Phone Input",
+ "description": "An international phone number input with country code selector.",
+ "dependencies": ["blode-icons-react", "react-phone-number-input"],
+ "registryDependencies": ["button", "command", "input", "popover", "scroll-area"],
"files": [
{
- "path": "examples/button-link.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/phone-input.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-with-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "popover",
+ "type": "registry:ui",
+ "title": "Popover",
+ "description": "A floating panel that appears next to a trigger element.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-with-icon.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/popover.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-loading",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "progress",
+ "type": "registry:ui",
+ "title": "Progress",
+ "description": "A horizontal bar that indicates the completion progress of a task.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/button-loading.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/progress.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
+ "name": "progress-list",
+ "type": "registry:ui",
+ "title": "Progress List",
+ "description": "A vertical list of progress items with completed and pending states.",
+ "dependencies": ["blode-icons-react"],
"files": [
{
- "path": "examples/button-icon.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/progress-list.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "button-as-child",
- "type": "registry:example",
+ "name": "prompt",
+ "type": "registry:ui",
+ "title": "Prompt",
+ "description": "A confirmation dialog that asks the user for input before proceeding.",
+ "dependencies": ["@base-ui/react"],
"registryDependencies": ["button"],
"files": [
{
- "path": "examples/button-as-child.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/prompt.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "calendar-demo",
- "type": "registry:example",
- "registryDependencies": ["calendar"],
+ "name": "radio-group",
+ "type": "registry:ui",
+ "title": "Radio Group",
+ "description": "A set of mutually exclusive options where only one can be selected.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/calendar-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/radio-group.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "calendar-form",
- "type": "registry:example",
- "registryDependencies": ["calendar", "form", "popover"],
+ "name": "resizable",
+ "type": "registry:ui",
+ "title": "Resizable",
+ "description": "A layout component with draggable handles for resizing panels.",
+ "dependencies": ["react-resizable-panels@^4"],
"files": [
{
- "path": "examples/calendar-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/resizable.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "card-demo",
- "type": "registry:example",
- "registryDependencies": ["card", "button", "switch"],
+ "name": "scroll-area",
+ "type": "registry:ui",
+ "title": "Scroll Area",
+ "description": "A scrollable container with custom styled scrollbars.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/card-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/scroll-area.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "card-with-form",
- "type": "registry:example",
- "registryDependencies": ["button", "card", "input", "label", "select"],
+ "name": "select",
+ "type": "registry:ui",
+ "title": "Select",
+ "description": "A dropdown control for choosing a single value from a list of options.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/card-with-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/select.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-demo",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "separator",
+ "type": "registry:ui",
+ "title": "Separator",
+ "description": "A visual divider that separates content into distinct sections.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/carousel-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/separator.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-size",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "sheet",
+ "type": "registry:ui",
+ "title": "Sheet",
+ "description": "A panel that slides in from the edge of the viewport with an overlay.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/carousel-size.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/sheet.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-spacing",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-spacing.tsx",
- "type": "registry:example"
+ "name": "sidebar",
+ "type": "registry:ui",
+ "title": "Sidebar",
+ "description": "A collapsible side navigation component with multiple layout variants.",
+ "dependencies": ["@base-ui/react", "class-variance-authority", "blode-icons-react"],
+ "registryDependencies": [
+ "button",
+ "separator",
+ "sheet",
+ "tooltip",
+ "input",
+ "@blode/use-mobile",
+ "skeleton"
+ ],
+ "cssVars": {
+ "light": {
+ "sidebar-accent": "240 4.8% 95.9%",
+ "sidebar-accent-foreground": "240 5.9% 10%",
+ "sidebar-background": "0 0% 98%",
+ "sidebar-border": "220 13% 91%",
+ "sidebar-foreground": "240 5.3% 26.1%",
+ "sidebar-primary": "240 5.9% 10%",
+ "sidebar-primary-foreground": "0 0% 98%",
+ "sidebar-ring": "217.2 91.2% 59.8%"
+ },
+ "dark": {
+ "sidebar-accent": "240 3.7% 15.9%",
+ "sidebar-accent-foreground": "240 4.8% 95.9%",
+ "sidebar-background": "240 5.9% 10%",
+ "sidebar-border": "240 3.7% 15.9%",
+ "sidebar-foreground": "240 4.8% 95.9%",
+ "sidebar-primary": "224.3 76.3% 48%",
+ "sidebar-primary-foreground": "0 0% 100%",
+ "sidebar-ring": "217.2 91.2% 59.8%"
+ }
+ },
+ "files": [
+ {
+ "path": "registry/default/ui/sidebar.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-orientation",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "skeleton",
+ "type": "registry:ui",
+ "title": "Skeleton",
+ "description": "A placeholder animation that indicates content is loading.",
"files": [
{
- "path": "examples/carousel-orientation.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/skeleton.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-api",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "slider",
+ "type": "registry:ui",
+ "title": "Slider",
+ "description": "A draggable control for selecting a numeric value within a range.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/carousel-api.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/slider.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "carousel-plugin",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
+ "name": "sonner",
+ "type": "registry:ui",
+ "title": "Sonner",
+ "description": "A toast notification component powered by Sonner.",
+ "dependencies": ["sonner", "next-themes"],
"files": [
{
- "path": "examples/carousel-plugin.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/sonner.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-demo",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
+ "name": "spinner",
+ "type": "registry:ui",
+ "title": "Spinner",
+ "description": "An animated loading indicator for asynchronous operations.",
"files": [
{
- "path": "examples/checkbox-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/spinner.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-disabled",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
+ "name": "stat",
+ "type": "registry:ui",
+ "title": "Stat",
+ "description": "A compact metric card for showing a headline value and label.",
"files": [
{
- "path": "examples/checkbox-disabled.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/stat.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-form-multiple",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
+ "name": "switch",
+ "type": "registry:ui",
+ "title": "Switch",
+ "description": "A toggle control for switching between on and off states.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/checkbox-form-multiple.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/switch.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-form-single",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
+ "name": "table",
+ "type": "registry:ui",
+ "title": "Table",
+ "description": "A responsive table for displaying structured data in rows and columns.",
"files": [
{
- "path": "examples/checkbox-form-single.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/table.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "checkbox-with-text",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
+ "name": "tabs",
+ "type": "registry:ui",
+ "title": "Tabs",
+ "description": "A tabbed interface that organises content into switchable panels.",
+ "dependencies": ["@base-ui/react", "class-variance-authority", "merge-refs"],
+ "registryDependencies": ["@blode/use-tab-observer"],
"files": [
{
- "path": "examples/checkbox-with-text.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/tabs.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "collapsible-demo",
- "type": "registry:example",
- "registryDependencies": ["collapsible"],
+ "name": "textarea",
+ "type": "registry:ui",
+ "title": "Textarea",
+ "description": "A multi-line text input field for longer form content.",
"files": [
{
- "path": "examples/collapsible-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/textarea.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
+ "name": "toggle",
+ "type": "registry:ui",
+ "title": "Toggle",
+ "description": "A two-state button that can be toggled on or off.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/combobox-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/toggle.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-dropdown-menu",
- "type": "registry:example",
- "registryDependencies": ["command", "dropdown-menu", "button"],
+ "name": "toggle-group",
+ "type": "registry:ui",
+ "title": "Toggle Group",
+ "description": "A set of toggle buttons where one or more can be active.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["toggle"],
"files": [
{
- "path": "examples/combobox-dropdown-menu.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/toggle-group.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-form",
- "type": "registry:example",
- "registryDependencies": ["command", "form"],
+ "name": "tooltip",
+ "type": "registry:ui",
+ "title": "Tooltip",
+ "description": "A popup that displays helpful information when hovering or focusing an element.",
+ "dependencies": ["@base-ui/react"],
+ "docs": "The `tooltip` component has been added. Remember to wrap your app with the `TooltipProvider` component.\n\n```tsx title=\"app/layout.tsx\"\nimport { TooltipProvider } from \"@/components/ui/tooltip\"\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n \n \n {children}\n \n \n )\n}\n```\n",
"files": [
{
- "path": "examples/combobox-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/tooltip.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-popover",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover"],
+ "name": "kbd",
+ "type": "registry:ui",
+ "title": "Kbd",
+ "description": "A styled keyboard key indicator for displaying shortcuts and key combinations.",
"files": [
{
- "path": "examples/combobox-popover.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/kbd.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "combobox-responsive",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover", "drawer"],
+ "name": "native-select",
+ "type": "registry:ui",
+ "title": "Native Select",
+ "description": "A styled wrapper around the native HTML select element.",
"files": [
{
- "path": "examples/combobox-responsive.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/native-select.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "command-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
+ "name": "direction",
+ "type": "registry:ui",
+ "title": "Direction",
+ "description": "A context provider for managing text direction (LTR/RTL) across components.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/command-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/direction.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "command-dialog",
- "type": "registry:example",
- "registryDependencies": ["command", "dialog"],
+ "name": "file-thumbnail",
+ "type": "registry:ui",
+ "title": "File Thumbnail",
+ "description": "A square preview tile for an attached file — an image thumbnail or a file icon with name.",
"files": [
{
- "path": "examples/command-dialog.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/file-thumbnail.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "context-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["context-menu"],
+ "name": "chat-message",
+ "type": "registry:ui",
+ "title": "Chat Message",
+ "description": "A chat transcript entry for user and assistant messages, with attachments and a hover meta row.",
+ "dependencies": ["motion"],
+ "registryDependencies": ["file-thumbnail"],
"files": [
{
- "path": "examples/context-menu-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/chat-message.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "data-table-demo",
- "type": "registry:example",
- "registryDependencies": ["data-table"],
+ "name": "input-message",
+ "type": "registry:ui",
+ "title": "Input Message",
+ "description": "A chat composer with an auto-resizing textarea, action slots, a send button, and drag-and-drop attachments.",
+ "dependencies": ["motion", "react-textarea-autosize"],
+ "registryDependencies": ["button", "file-thumbnail"],
"files": [
{
- "path": "examples/data-table-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/input-message.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-demo",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
+ "name": "thinking-indicator",
+ "type": "registry:ui",
+ "title": "Thinking Indicator",
+ "description": "An animated status indicator with a morphing glyph and cycling text for thinking states.",
+ "dependencies": ["motion"],
"files": [
{
- "path": "examples/date-picker-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/thinking-indicator.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-form",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "form", "popover"],
+ "name": "thinking-steps",
+ "type": "registry:ui",
+ "title": "Thinking Steps",
+ "description": "A collapsible chain-of-thought stepper with steps, sources, details, and images.",
+ "dependencies": ["motion"],
+ "registryDependencies": ["accordion", "badge"],
"files": [
{
- "path": "examples/date-picker-form.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/thinking-steps.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-with-presets",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover", "select"],
+ "name": "ask-user-questions",
+ "type": "registry:ui",
+ "title": "Ask User Questions",
+ "description": "A stepped questionnaire with single- or multi-select options, free-form answers, and skip.",
+ "dependencies": ["motion"],
+ "registryDependencies": ["button", "badge", "textarea"],
"files": [
{
- "path": "examples/date-picker-with-presets.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/ask-user-questions.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "date-picker-with-range",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
+ "name": "bubble",
+ "type": "registry:ui",
+ "title": "Bubble",
+ "description": "A message surface for chat interfaces, with variants, alignment, reactions, and composable content.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/date-picker-with-range.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/bubble.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["dialog"],
+ "name": "message",
+ "type": "registry:ui",
+ "title": "Message",
+ "description": "A row primitive for chat transcripts, pairing an avatar with content, header, and footer, aligned to the start or end.",
"files": [
{
- "path": "examples/dialog-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/message.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "dialog-close-button",
- "type": "registry:example",
- "registryDependencies": ["dialog", "button"],
+ "name": "message-scroller",
+ "type": "registry:ui",
+ "title": "Message Scroller",
+ "description": "A chat scroll container that anchors turns, opens saved transcripts, follows streamed responses, loads history without jumping, and jumps to any message.",
+ "dependencies": ["@shadcn/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "examples/dialog-close-button.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/message-scroller.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "drawer-demo",
- "type": "registry:example",
- "registryDependencies": ["drawer"],
+ "name": "attachment",
+ "type": "registry:ui",
+ "title": "Attachment",
+ "description": "A card for files and images with upload, processing, error, and done states, an optional full-card trigger, and a scrollable group.",
+ "dependencies": ["@base-ui/react"],
+ "registryDependencies": ["button"],
"files": [
{
- "path": "examples/drawer-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/attachment.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "drawer-dialog",
- "type": "registry:example",
- "registryDependencies": ["drawer", "dialog"],
+ "name": "marker",
+ "type": "registry:ui",
+ "title": "Marker",
+ "description": "A compact inline status line for activity feeds and transcripts, with optional icon, separator, and border variants.",
+ "dependencies": ["@base-ui/react"],
"files": [
{
- "path": "examples/drawer-dialog.tsx",
- "type": "registry:example"
+ "path": "registry/default/ui/marker.tsx",
+ "type": "registry:ui"
}
]
},
{
- "name": "dropdown-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu"],
+ "name": "utils",
+ "type": "registry:lib",
+ "title": "Utils",
+ "description": "Utility functions including cn() for merging Tailwind CSS classes.",
+ "dependencies": ["clsx", "tailwind-merge"],
"files": [
{
- "path": "examples/dropdown-menu-demo.tsx",
- "type": "registry:example"
+ "path": "registry/default/lib/utils.ts",
+ "type": "registry:lib"
}
]
},
{
- "name": "dropdown-menu-checkboxes",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "checkbox"],
+ "name": "use-copy-to-clipboard",
+ "type": "registry:lib",
+ "title": "Use Copy To Clipboard",
+ "description": "A hook that copies text to the clipboard and resets after a timeout.",
"files": [
{
- "path": "examples/dropdown-menu-checkboxes.tsx",
- "type": "registry:example"
+ "path": "registry/default/hooks/use-copy-to-clipboard.ts",
+ "type": "registry:lib"
}
]
},
{
- "name": "dropdown-menu-radio-group",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "radio-group"],
+ "name": "use-mobile",
+ "type": "registry:lib",
+ "title": "Use Mobile",
+ "description": "A hook that detects whether the viewport matches a mobile breakpoint.",
"files": [
{
- "path": "examples/dropdown-menu-radio-group.tsx",
- "type": "registry:example"
+ "path": "registry/default/hooks/use-mobile.ts",
+ "type": "registry:lib"
}
]
},
{
- "name": "hover-card-demo",
- "type": "registry:example",
- "registryDependencies": ["hover-card"],
- "files": [
- {
- "path": "examples/hover-card-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-demo",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-disabled",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-file",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-file.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-form",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "form"],
- "files": [
- {
- "path": "examples/input-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-button",
- "type": "registry:example",
- "registryDependencies": ["input", "button"],
- "files": [
- {
- "path": "examples/input-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-label",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-text",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-demo",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-pattern",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-pattern.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-separator",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-separator.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-controlled",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-controlled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-form",
- "type": "registry:example",
- "registryDependencies": ["input-otp", "form"],
- "files": [
- {
- "path": "examples/input-otp-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "label-demo",
- "type": "registry:example",
- "registryDependencies": ["label"],
- "files": [
- {
- "path": "examples/label-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "menubar-demo",
- "type": "registry:example",
- "registryDependencies": ["menubar"],
- "files": [
- {
- "path": "examples/menubar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "navigation-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["navigation-menu"],
- "files": [
- {
- "path": "examples/navigation-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "pagination-demo",
- "type": "registry:example",
- "registryDependencies": ["pagination"],
- "files": [
- {
- "path": "examples/pagination-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "popover-demo",
- "type": "registry:example",
- "registryDependencies": ["popover"],
- "files": [
- {
- "path": "examples/popover-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "progress-demo",
- "type": "registry:example",
- "registryDependencies": ["progress"],
- "files": [
- {
- "path": "examples/progress-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-demo",
- "type": "registry:example",
- "registryDependencies": ["radio-group"],
- "files": [
- {
- "path": "examples/radio-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-form",
- "type": "registry:example",
- "registryDependencies": ["radio-group", "form"],
- "files": [
- {
- "path": "examples/radio-group-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo-with-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo-with-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-vertical",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-vertical.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-horizontal-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-horizontal-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-demo",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-scrollable",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-scrollable.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-form",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "separator-demo",
- "type": "registry:example",
- "registryDependencies": ["separator"],
- "files": [
- {
- "path": "examples/separator-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-demo",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-side",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-side.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-demo",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-card",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-card.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "slider-demo",
- "type": "registry:example",
- "registryDependencies": ["slider"],
- "files": [
- {
- "path": "examples/slider-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sonner-demo",
- "type": "registry:example",
- "registryDependencies": ["sonner"],
- "files": [
- {
- "path": "examples/sonner-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-demo",
- "type": "registry:example",
- "registryDependencies": ["switch"],
- "files": [
- {
- "path": "examples/switch-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-form",
- "type": "registry:example",
- "registryDependencies": ["switch", "form"],
- "files": [
- {
- "path": "examples/switch-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "table-demo",
- "type": "registry:example",
- "registryDependencies": ["table"],
- "files": [
- {
- "path": "examples/table-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tabs-demo",
- "type": "registry:example",
- "registryDependencies": ["tabs"],
- "files": [
- {
- "path": "examples/tabs-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-demo",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-disabled",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-form",
- "type": "registry:example",
- "registryDependencies": ["textarea", "form"],
- "files": [
- {
- "path": "examples/textarea-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-button",
- "type": "registry:example",
- "registryDependencies": ["textarea", "button"],
- "files": [
- {
- "path": "examples/textarea-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-label",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-text",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-single",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-single.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-with-text",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tooltip-demo",
- "type": "registry:example",
- "registryDependencies": ["tooltip"],
- "files": [
- {
- "path": "examples/tooltip-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-blockquote",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-blockquote.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h1",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h1.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h2",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h2.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h3",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h3.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h4",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h4.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-inline-code",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-inline-code.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-large",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-large.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-lead",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-lead.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-list",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-list.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-muted",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-muted.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-p",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-p.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-small",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-small.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-table",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-table.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "mode-toggle",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/mode-toggle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "utils",
+ "name": "use-tab-observer",
"type": "registry:lib",
- "dependencies": ["clsx", "tailwind-merge"],
+ "title": "Use Tab Observer",
+ "description": "A hook that observes and tracks the active tab indicator position.",
"files": [
{
- "path": "registry/lib/utils.ts",
+ "path": "registry/default/hooks/use-tab-observer.ts",
"type": "registry:lib"
}
]
}
- ]
+ ],
+ "name": "blode"
}
diff --git a/registry.json b/registry.json
deleted file mode 100644
index 4a52e60..0000000
--- a/registry.json
+++ /dev/null
@@ -1,1860 +0,0 @@
-{
- "name": "blode/ui",
- "homepage": "https://blode.co/ui",
- "items": [
- {
- "name": "index",
- "type": "registry:style",
- "dependencies": ["class-variance-authority", "blode-icons-react"],
- "registryDependencies": ["utils"],
- "files": [],
- "cssVars": {}
- },
- {
- "name": "accordion",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/accordion.tsx",
- "type": "registry:ui"
- }
- ],
- "tailwind": {
- "config": {
- "theme": {
- "extend": {
- "keyframes": {
- "accordion-down": {
- "from": {
- "height": "0"
- },
- "to": {
- "height": "var(--radix-accordion-content-height)"
- }
- },
- "accordion-up": {
- "from": {
- "height": "var(--radix-accordion-content-height)"
- },
- "to": {
- "height": "0"
- }
- }
- },
- "animation": {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out"
- }
- }
- }
- }
- }
- },
- {
- "name": "alert",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/alert.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "avatar",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/avatar.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "badge",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/badge.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "button",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/button.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "card",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/card.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "collapsible",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/collapsible.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "command",
- "type": "registry:ui",
- "dependencies": ["cmdk"],
- "registryDependencies": ["dialog"],
- "files": [
- {
- "path": "registry/ui/command.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "dialog",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/dialog.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "dropdown-menu",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/dropdown-menu.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "input",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/input.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "label",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/label.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "popover",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/popover.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "scroll-area",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/scroll-area.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "select",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/select.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "separator",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/separator.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "sheet",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/sheet.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "skeleton",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/skeleton.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "sonner",
- "type": "registry:ui",
- "dependencies": ["sonner", "next-themes"],
- "files": [
- {
- "path": "registry/ui/sonner.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "switch",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/switch.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "table",
- "type": "registry:ui",
- "files": [
- {
- "path": "registry/ui/table.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "tabs",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/tabs.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "tooltip",
- "type": "registry:ui",
- "dependencies": ["@base-ui/react"],
- "files": [
- {
- "path": "registry/ui/tooltip.tsx",
- "type": "registry:ui"
- }
- ]
- },
- {
- "name": "accordion-demo",
- "type": "registry:example",
- "registryDependencies": ["accordion"],
- "files": [
- {
- "path": "examples/accordion-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-demo",
- "type": "registry:example",
- "registryDependencies": ["alert"],
- "files": [
- {
- "path": "examples/alert-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-destructive",
- "type": "registry:example",
- "registryDependencies": ["alert"],
- "files": [
- {
- "path": "examples/alert-destructive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "alert-dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["alert-dialog", "button"],
- "files": [
- {
- "path": "examples/alert-dialog-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "aspect-ratio-demo",
- "type": "registry:example",
- "registryDependencies": ["aspect-ratio"],
- "files": [
- {
- "path": "examples/aspect-ratio-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "avatar-demo",
- "type": "registry:example",
- "registryDependencies": ["avatar"],
- "files": [
- {
- "path": "examples/avatar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-demo",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-destructive",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-destructive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-outline",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "badge-green",
- "type": "registry:example",
- "registryDependencies": ["badge"],
- "files": [
- {
- "path": "examples/badge-green.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-demo",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-separator",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-separator.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-dropdown",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-dropdown.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-ellipsis",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-ellipsis.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-link",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-link.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "breadcrumb-responsive",
- "type": "registry:example",
- "registryDependencies": ["breadcrumb"],
- "files": [
- {
- "path": "examples/breadcrumb-responsive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-demo",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-secondary",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-secondary.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-destructive",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-destructive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-outline",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-ghost",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-ghost.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-link",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-link.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-with-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-with-icon.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-loading",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-loading.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-icon",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-icon.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "button-as-child",
- "type": "registry:example",
- "registryDependencies": ["button"],
- "files": [
- {
- "path": "examples/button-as-child.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "calendar-demo",
- "type": "registry:example",
- "registryDependencies": ["calendar"],
- "files": [
- {
- "path": "examples/calendar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "calendar-form",
- "type": "registry:example",
- "registryDependencies": ["calendar", "form", "popover"],
- "files": [
- {
- "path": "examples/calendar-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "card-demo",
- "type": "registry:example",
- "registryDependencies": ["card", "button", "switch"],
- "files": [
- {
- "path": "examples/card-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "card-with-form",
- "type": "registry:example",
- "registryDependencies": ["button", "card", "input", "label", "select"],
- "files": [
- {
- "path": "examples/card-with-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-demo",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-size",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-size.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-spacing",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-spacing.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-orientation",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-orientation.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-api",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-api.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "carousel-plugin",
- "type": "registry:example",
- "registryDependencies": ["carousel"],
- "files": [
- {
- "path": "examples/carousel-plugin.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-demo",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
- "files": [
- {
- "path": "examples/checkbox-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-disabled",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
- "files": [
- {
- "path": "examples/checkbox-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-form-multiple",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
- "files": [
- {
- "path": "examples/checkbox-form-multiple.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-form-single",
- "type": "registry:example",
- "registryDependencies": ["checkbox", "form"],
- "files": [
- {
- "path": "examples/checkbox-form-single.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "checkbox-with-text",
- "type": "registry:example",
- "registryDependencies": ["checkbox"],
- "files": [
- {
- "path": "examples/checkbox-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "collapsible-demo",
- "type": "registry:example",
- "registryDependencies": ["collapsible"],
- "files": [
- {
- "path": "examples/collapsible-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
- "files": [
- {
- "path": "examples/combobox-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-dropdown-menu",
- "type": "registry:example",
- "registryDependencies": ["command", "dropdown-menu", "button"],
- "files": [
- {
- "path": "examples/combobox-dropdown-menu.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-form",
- "type": "registry:example",
- "registryDependencies": ["command", "form"],
- "files": [
- {
- "path": "examples/combobox-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-popover",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover"],
- "files": [
- {
- "path": "examples/combobox-popover.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "combobox-responsive",
- "type": "registry:example",
- "registryDependencies": ["combobox", "popover", "drawer"],
- "files": [
- {
- "path": "examples/combobox-responsive.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "command-demo",
- "type": "registry:example",
- "registryDependencies": ["command"],
- "files": [
- {
- "path": "examples/command-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "command-dialog",
- "type": "registry:example",
- "registryDependencies": ["command", "dialog"],
- "files": [
- {
- "path": "examples/command-dialog.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "context-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["context-menu"],
- "files": [
- {
- "path": "examples/context-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "data-table-demo",
- "type": "registry:example",
- "registryDependencies": ["data-table"],
- "files": [
- {
- "path": "examples/data-table-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-demo",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
- "files": [
- {
- "path": "examples/date-picker-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-form",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "form", "popover"],
- "files": [
- {
- "path": "examples/date-picker-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-with-presets",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover", "select"],
- "files": [
- {
- "path": "examples/date-picker-with-presets.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "date-picker-with-range",
- "type": "registry:example",
- "dependencies": ["date-fns"],
- "registryDependencies": ["button", "calendar", "popover"],
- "files": [
- {
- "path": "examples/date-picker-with-range.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dialog-demo",
- "type": "registry:example",
- "registryDependencies": ["dialog"],
- "files": [
- {
- "path": "examples/dialog-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dialog-close-button",
- "type": "registry:example",
- "registryDependencies": ["dialog", "button"],
- "files": [
- {
- "path": "examples/dialog-close-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "drawer-demo",
- "type": "registry:example",
- "registryDependencies": ["drawer"],
- "files": [
- {
- "path": "examples/drawer-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "drawer-dialog",
- "type": "registry:example",
- "registryDependencies": ["drawer", "dialog"],
- "files": [
- {
- "path": "examples/drawer-dialog.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dropdown-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu"],
- "files": [
- {
- "path": "examples/dropdown-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dropdown-menu-checkboxes",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "checkbox"],
- "files": [
- {
- "path": "examples/dropdown-menu-checkboxes.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "dropdown-menu-radio-group",
- "type": "registry:example",
- "registryDependencies": ["dropdown-menu", "radio-group"],
- "files": [
- {
- "path": "examples/dropdown-menu-radio-group.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "hover-card-demo",
- "type": "registry:example",
- "registryDependencies": ["hover-card"],
- "files": [
- {
- "path": "examples/hover-card-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-demo",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-disabled",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-file",
- "type": "registry:example",
- "registryDependencies": ["input"],
- "files": [
- {
- "path": "examples/input-file.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-form",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "form"],
- "files": [
- {
- "path": "examples/input-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-button",
- "type": "registry:example",
- "registryDependencies": ["input", "button"],
- "files": [
- {
- "path": "examples/input-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-label",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-with-text",
- "type": "registry:example",
- "registryDependencies": ["input", "button", "label"],
- "files": [
- {
- "path": "examples/input-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-demo",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-pattern",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-pattern.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-separator",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-separator.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-controlled",
- "type": "registry:example",
- "registryDependencies": ["input-otp"],
- "files": [
- {
- "path": "examples/input-otp-controlled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "input-otp-form",
- "type": "registry:example",
- "registryDependencies": ["input-otp", "form"],
- "files": [
- {
- "path": "examples/input-otp-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "label-demo",
- "type": "registry:example",
- "registryDependencies": ["label"],
- "files": [
- {
- "path": "examples/label-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "menubar-demo",
- "type": "registry:example",
- "registryDependencies": ["menubar"],
- "files": [
- {
- "path": "examples/menubar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "navigation-menu-demo",
- "type": "registry:example",
- "registryDependencies": ["navigation-menu"],
- "files": [
- {
- "path": "examples/navigation-menu-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "pagination-demo",
- "type": "registry:example",
- "registryDependencies": ["pagination"],
- "files": [
- {
- "path": "examples/pagination-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "popover-demo",
- "type": "registry:example",
- "registryDependencies": ["popover"],
- "files": [
- {
- "path": "examples/popover-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "progress-demo",
- "type": "registry:example",
- "registryDependencies": ["progress"],
- "files": [
- {
- "path": "examples/progress-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-demo",
- "type": "registry:example",
- "registryDependencies": ["radio-group"],
- "files": [
- {
- "path": "examples/radio-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "radio-group-form",
- "type": "registry:example",
- "registryDependencies": ["radio-group", "form"],
- "files": [
- {
- "path": "examples/radio-group-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-demo-with-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-demo-with-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-vertical",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-vertical.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "resizable-handle",
- "type": "registry:example",
- "registryDependencies": ["resizable"],
- "files": [
- {
- "path": "examples/resizable-handle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "scroll-area-horizontal-demo",
- "type": "registry:example",
- "registryDependencies": ["scroll-area"],
- "files": [
- {
- "path": "examples/scroll-area-horizontal-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-demo",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-scrollable",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-scrollable.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "select-form",
- "type": "registry:example",
- "registryDependencies": ["select"],
- "files": [
- {
- "path": "examples/select-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "separator-demo",
- "type": "registry:example",
- "registryDependencies": ["separator"],
- "files": [
- {
- "path": "examples/separator-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-demo",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sheet-side",
- "type": "registry:example",
- "registryDependencies": ["sheet"],
- "files": [
- {
- "path": "examples/sheet-side.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-demo",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "skeleton-card",
- "type": "registry:example",
- "registryDependencies": ["skeleton"],
- "files": [
- {
- "path": "examples/skeleton-card.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "slider-demo",
- "type": "registry:example",
- "registryDependencies": ["slider"],
- "files": [
- {
- "path": "examples/slider-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "sonner-demo",
- "type": "registry:example",
- "registryDependencies": ["sonner"],
- "files": [
- {
- "path": "examples/sonner-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-demo",
- "type": "registry:example",
- "registryDependencies": ["switch"],
- "files": [
- {
- "path": "examples/switch-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "switch-form",
- "type": "registry:example",
- "registryDependencies": ["switch", "form"],
- "files": [
- {
- "path": "examples/switch-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "table-demo",
- "type": "registry:example",
- "registryDependencies": ["table"],
- "files": [
- {
- "path": "examples/table-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tabs-demo",
- "type": "registry:example",
- "registryDependencies": ["tabs"],
- "files": [
- {
- "path": "examples/tabs-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-demo",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-disabled",
- "type": "registry:example",
- "registryDependencies": ["textarea"],
- "files": [
- {
- "path": "examples/textarea-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-form",
- "type": "registry:example",
- "registryDependencies": ["textarea", "form"],
- "files": [
- {
- "path": "examples/textarea-form.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-button",
- "type": "registry:example",
- "registryDependencies": ["textarea", "button"],
- "files": [
- {
- "path": "examples/textarea-with-button.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-label",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-label.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "textarea-with-text",
- "type": "registry:example",
- "registryDependencies": ["textarea", "label"],
- "files": [
- {
- "path": "examples/textarea-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-group-single",
- "type": "registry:example",
- "registryDependencies": ["toggle-group"],
- "files": [
- {
- "path": "examples/toggle-group-single.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-demo",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-disabled",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-disabled.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-lg",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-lg.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-outline",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-outline.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-sm",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-sm.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "toggle-with-text",
- "type": "registry:example",
- "registryDependencies": ["toggle"],
- "files": [
- {
- "path": "examples/toggle-with-text.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "tooltip-demo",
- "type": "registry:example",
- "registryDependencies": ["tooltip"],
- "files": [
- {
- "path": "examples/tooltip-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-blockquote",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-blockquote.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h1",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h1.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h2",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h2.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h3",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h3.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-h4",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-h4.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-inline-code",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-inline-code.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-large",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-large.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-lead",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-lead.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-list",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-list.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-muted",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-muted.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-p",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-p.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-small",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-small.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "typography-table",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/typography-table.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "mode-toggle",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/mode-toggle.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-grid",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-grid.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-axis",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-axis.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-tooltip",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-tooltip.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-bar-demo-legend",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-bar-demo-legend.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "chart-tooltip-demo",
- "type": "registry:example",
- "files": [
- {
- "path": "examples/chart-tooltip-demo.tsx",
- "type": "registry:example"
- }
- ]
- },
- {
- "name": "utils",
- "type": "registry:lib",
- "dependencies": ["clsx", "tailwind-merge"],
- "files": [
- {
- "path": "registry/lib/utils.ts",
- "type": "registry:lib"
- }
- ]
- }
- ]
-}
diff --git a/scripts/build-registry.mts b/scripts/build-registry.mts
index cba9807..9624c4d 100644
--- a/scripts/build-registry.mts
+++ b/scripts/build-registry.mts
@@ -21,6 +21,9 @@ interface NormalizedRegistryFile {
}
const REGISTRY_PATH = path.join(process.cwd(), "public/r");
+/** Served at blode.co/ui/registry.json. Formatted alongside REGISTRY_PATH so
+ * `npm run check` stays green after a rebuild. */
+const PUBLIC_REGISTRY_JSON = path.join(process.cwd(), "public/registry.json");
const REGISTRY_SOURCE_PATH = path.join(process.cwd(), "__registry__");
const REGISTRY_INDEX_WHITELIST = new Set>([
@@ -360,11 +363,21 @@ async function buildRegistryJson(registry: Registry): Promise {
name: registry.name,
};
- await fs.writeFile(
- path.join(REGISTRY_PATH, "registry.json"),
- JSON.stringify(payload, null, 2),
- "utf-8",
- );
+ const json = JSON.stringify(payload, null, 2);
+
+ // Written to both paths deliberately. `public/r/registry.json` is the one the
+ // shadcn CLI resolves against, and `public/registry.json` is what
+ // blode.co/ui/registry.json serves, which is the URL a directory reviewer
+ // opens first.
+ //
+ // Both were hand-maintained copies until now, and both had drifted: they
+ // carried `"name": "blode/ui"` long after registry/index.ts moved to the bare
+ // `blode` token, and neither had a `$schema`. A reviewer checking the
+ // advertised registry URL saw a namespace that contradicts `@blode`.
+ await Promise.all([
+ fs.writeFile(path.join(REGISTRY_PATH, "registry.json"), json, "utf-8"),
+ fs.writeFile(PUBLIC_REGISTRY_JSON, json, "utf-8"),
+ ]);
}
// ----------------------------------------------------------------------------
@@ -444,7 +457,7 @@ try {
// diff that was byte-identical once parsed. Formatting the output here
// means what this script writes is already what the formatter wants, so a
// rebuild leaves a clean tree wherever it runs — not just on commit.
- execFileSync("npx", ["oxfmt", REGISTRY_PATH, REGISTRY_SOURCE_PATH], {
+ execFileSync("npx", ["oxfmt", REGISTRY_PATH, REGISTRY_SOURCE_PATH, PUBLIC_REGISTRY_JSON], {
stdio: "inherit",
});
console.log("💅 Formatted generated output");