# Changelog (/docs/changelog) ## July 2026 - Base UI [#july-2026---base-ui] ui-x is now built on [Base UI](https://base-ui.com). Following shadcn/ui's adoption of Base UI as the modern successor to Radix UI, every component has been rebuilt on Base UI primitives and restyled to match the latest shadcn/ui design. ### What's changed [#whats-changed] * **Base UI everywhere** β€” All Radix UI dependencies are gone. Components are built on Base UI primitives and utilities, with React 19 ref handling throughout. * **Restyled** β€” Every component, demo and docs page has been refreshed against the latest shadcn/ui styling. * **Simpler forms** β€” Demos use Base UI's `Field` and `Form` for form plumbing. For React Hook Form or TanStack Form wiring, see the shadcn/ui [forms guides](https://ui.shadcn.com/docs/forms). * **Dropzone composes with Empty** β€” `DropzoneGroup`, `DropzoneTitle` and `DropzoneDescription` are gone. Build the zone's title and description with shadcn/ui's [Empty](https://ui.shadcn.com/docs/components/empty) component instead; `DropzoneUploadIcon` stays for the drag-state icon swap. ### Superseded components [#superseded-components] shadcn/ui now ships first-class versions of several components that ui-x originally existed to fill in. These have been removed in favor of the official ones: | ui-x component | Use instead | | -------------- | -------------------------------------------------------------------- | | Calendar | [Calendar](https://ui.shadcn.com/docs/components/calendar) | | Combobox | [Combobox](https://ui.shadcn.com/docs/components/combobox) | | Control Group | [Button Group](https://ui.shadcn.com/docs/components/button-group) | | File List | [Attachment](https://ui.shadcn.com/docs/components/attachment) | | Input Base | [Input Group](https://ui.shadcn.com/docs/components/input-group) | | Kbd | [Kbd](https://ui.shadcn.com/docs/components/kbd) | | Native Select | [Native Select](https://ui.shadcn.com/docs/components/native-select) | ## June 2025 - Phone Input and Emoji Picker [#june-2025---phone-input-and-emoji-picker] We've added a new `` component and a new `` component. ### Phone Input [#phone-input] A component for phone number input field with country selection and formatting. Built on top of [react-phone-number-input](https://github.com/catamphetamine/react-phone-number-input). [Read the docs](/docs/components/phone-input) ### Emoji Picker [#emoji-picker] A component that allows users to select an emoji from a list of emojis. Built on top of [frimousse](https://frimousse.liveblocks.io/). [Read the docs](/docs/components/emoji-picker) ## May 2025 - Tailwind v4 and React 19 [#may-2025---tailwind-v4-and-react-19] We're excited to announce support for Tailwind v4 and React 19! This major update brings significant improvements and new features to the UI components library. Please refer to shadcn/ui's [Tailwind v4](https://ui.shadcn.com/docs/tailwind-v4) documentation for more details on migrating your project and taking advantage of the new capabilities. ### Wheel Picker [#wheel-picker] Along with this major update, we've also added a new `` component, built on top of [react-wheel-picker](https://github.com/ncdai/react-wheel-picker). This component provides an iOS-like interface for selecting options from a scrollable wheel. [Read the docs](/docs/components/wheel-picker) ## February 2025 - Virtualizer [#february-2025---virtualizer] We've added a new Virtualizer documentation page. ### Virtualizer [#virtualizer] Learn how to use the `virtua` library to efficiently render large lists and grids by virtualizing your components. This documentation provides practical examples and guidance on integrating `virtua` with your existing components. [Read the docs](/docs/utilities/virtualized) ## February 2025 - Sortable and Control Group [#february-2025---sortable-and-control-group] We've added a new `` component and a new `` component. ### Sortable [#sortable] A drag and drop component for reordering items in a list or grid. `` is built on top of [@dnd-kit](https://dndkit.com)'s [sortable](https://docs.dndkit.com/presets/sortable) preset. [See more examples](/docs/utilities/sortable) ### Control Group [#control-group] A component for grouping form controls like text inputs, buttons, selects and other elements into a single cohesive unit. When used together with Input Base, you can create highly customizable and flexible input layouts for a variety of use cases. Control Group has since been superseded by shadcn/ui's [Button Group](https://ui.shadcn.com/docs/components/button-group). ### Thank you [#thank-you] I'd like to thank everyone who has been using this project, providing feedback and contributing to it. I really appreciate it. Thank you πŸ™ # Introduction (/docs) **Similar to shadcn/ui, this is not a component library, It is how you build your component library.** junwen-k/ui-x is a thoughtfully crafted extension that provides additional components while maintaining the same principles of being open, composable and customizable. As junwen-k/ui-x is built as an extension of shadcn/ui, it inherits the core philosophies and approaches. For the foundational concepts, please refer to shadcn/ui's [documentation](https://ui.shadcn.com/docs). ## Philosophy [#philosophy] The components in this extension are built around four key principles: * **Intuitive Developer Experience:** Each component's API mirrors Base UI conventions and shadcn/ui patterns, creating an intuitive and familiar experience. * **Natural Extension:** Components are thoughtfully designed to feel like natural additions to the shadcn/ui ecosystem, maintaining the same level of quality and coherence. * **Open and Customizable:** Like shadcn/ui, you have full access to the component code, allowing complete customization to fit your needs. * **AI-Ready:** Components are designed to be compatible with AI tools like [v0](https://v0.dev), enabling seamless integration with AI-powered development workflows. ## Acknowledgments [#acknowledgments] This project stands on the shoulders of amazing open source projects and many other incredible libraries. Thank you to all the maintainers and contributors who make this extension possible. ## FAQ [#faq] How does it integrate with shadcn/ui? The components are designed to work seamlessly with shadcn's design system and distribution approach. They integrate naturally with your existing shadcn/ui components while maintaining consistent styling, behavior, and developer experience. Why are there additional primitives? This extension includes additional primitive components for features not covered by Base UI. By maintaining the separation between primitive logic and styled components, we ensure cleaner code and better maintainability while expanding the available functionality. # Installation (/docs/installation) junwen-k/ui-x is an extension of [shadcn/ui](https://ui.shadcn.com) and is distributed through the same registry system. Set up shadcn/ui in your project first by following the official [installation guide](https://ui.shadcn.com/docs/installation) for your framework. ## Requirements [#requirements] * A project set up with [shadcn/ui](https://ui.shadcn.com/docs/installation) (Tailwind CSS v4 and React 19 for the latest components). The Tailwind v3 docs are no longer maintained and remain archived at [v3-ui-x.junwen-k.dev](https://v3-ui-x.junwen-k.dev). * Components are built on [Base UI](https://base-ui.com) primitives, matching shadcn/ui's Base UI-based components. ## Installing components [#installing-components] Every component can be installed with the shadcn CLI by pointing at this registry: ```bash npx shadcn@latest add junwen-k/ui-x/date-field ``` Each component's documentation page includes its exact install command, along with a manual installation option if you prefer to copy the source directly. ## Utilities [#utilities] Utility docs such as [Sortable](/docs/utilities/sortable) and [Virtualized](/docs/utilities/virtualized) are guides built around third-party libraries β€” their pages describe which packages to install. # Badge Group (/docs/components/badge-group) ## Installation [#installation] CLI Manual ```bash npx shadcn@latest add junwen-k/ui-x/badge-group ``` Install the following dependencies: ```bash npm install @base-ui/react @base-ui/utils ``` Copy and paste the following code into your project. Update the import paths to match your project setup. ## Usage [#usage] ```tsx import { BadgeGroup, BadgeGroupItem } from "@/components/ui/badge-group"; ``` ```tsx Chocolate Mint Strawberry Vanilla ``` ## Examples [#examples] ### Default [#default] ### Form [#form] ## Accessibility [#accessibility] The group is built on [Base UI Toggle Group](https://base-ui.com/react/components/toggle-group): one item is tabbable at a time, the arrow keys move focus between items, and Space or Enter toggles the focused item. When removal is enabled, Backspace and Delete remove the focused item β€” the close icon is a pointer-only affordance hidden from assistive technology, so keyboard and screen-reader users are not dependent on it. ## API Reference [#api-reference] ### BadgeGroup [#badgegroup] The group container. Renders a [Base UI Toggle Group](https://base-ui.com/react/components/toggle-group). | Prop | Type | Default | Description | | --------------- | ------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `type` | `"single" \| "multiple"` | `"single"` | Whether one or several items can be pressed at a time. Determines the value type below. | | `value` | `string \| string[]` | - | The pressed item(s), typed by `type`. Use for controlled value. | | `defaultValue` | `string \| string[]` | - | The initial value when uncontrolled. | | `onValueChange` | `(value) => void` | - | Called when the pressed item(s) change. The value is typed by `type`. | | `onRemove` | `(value) => void` | - | Enables removal. Called with the removed value(s) when an item's close icon is clicked or Backspace / Delete is pressed. | | `...props` | `ToggleGroup.Props` | - | Remaining props are spread to [Base UI Toggle Group](https://base-ui.com/react/components/toggle-group#api-reference). | ### BadgeGroupItem [#badgegroupitem] A single badge. Renders a [Base UI Toggle](https://base-ui.com/react/components/toggle) styled as an outline [Badge](https://ui.shadcn.com/docs/components/badge). Shows a close icon when the group has `onRemove`. | Prop | Type | Default | Description | | ---------- | -------------- | ------- | ---------------------------------------------------------------------------------------------------------- | | `value` | `string` | - | The item's value within the group. Required. | | `...props` | `Toggle.Props` | - | Remaining props are spread to [Base UI Toggle](https://base-ui.com/react/components/toggle#api-reference). | # Confirmer (/docs/components/confirmer) ## About [#about] The `` component is built on top of [react-call](https://react-call.desko.dev/). ## Installation [#installation] CLI Manual Run the following command: ```bash npx shadcn@latest add junwen-k/ui-x/confirmer ``` Add the `` component. ```tsx title="app/layout.tsx" showLineNumbers {1,9} import { Confirmer } from "@/components/ui/confirmer"; export default function RootLayout({ children }) { return (
{children}
); } ```
Install the following dependencies: ```bash npm install react-call ``` Add the `` and `