# UI Thing Documentation > **Note:** This documentation corresponds to **UI Thing CLI v0.2.0** (major update). # Introduction **UI Thing** is a collection of beautifully designed, reusable UI components built specifically for **Nuxt**, powered by Reka UI and Tailwind CSS. This project is inspired by **shadcn/ui**, with adaptations to fit Nuxt's framework and developer ecosystem. > **Note:** This is *not* a traditional component library you install via npm. Instead, it hands you open, editable code-so you can pick the components you need, copy them into your app, and customize as you see fit. ## Why "UI Thing" for Nuxt? - **Open Code Philosophy**:br Every component is fully visible and editable-no wrappers or opaque abstractions. This gives you full control to adapt the UI to your design system. This makes it especially AI-friendly, letting models read, understand, and even generate new components. - **Nuxt-Native**:br Created with the Nuxt ecosystem at heart, UI Thing respects Nuxt's conventions-whether you're on Nuxt 3 or upgrading to Nuxt 4-and integrates smoothly with your app's structure and tooling. - **DIY, Your Way**:br Rather than bundling code you can't touch, UI Thing encourages you to copy, paste, and personalize any component. The code becomes entirely yours-no extra layers, no wrappers. - **Learn & Build**:br This project started as an experiment-and a fun one at that. I wanted to explore building an entire component reference for Nuxt, and along the way, I created a CLI to streamline the dev experience. --- ## Comparison Table | Feature | UI Thing (for Nuxt) | Traditional Component Library | | ------------------ | -------------------------- | -------------------------------- | | Distribution | Copy-paste + CLI | Publish to npm, import as a dep | | Customization | Directly edit code | Override or wrap components | | Nuxt Compatibility | Built for Nuxt conventions | Generic (may require adaptation) | | CLI Support | Yes | Sometimes minimal or none | | Ideal Use Case | Highly customizable UIs | Quick plug-and-play UIs | --- ## How to Use It 1. **Browse** [component](https://uithing.com/components/accordion) docs and [examples](https://uithing.com/examples/cards). 2. **Use the CLI** (`npx ui-thing@latest add `) to scaffold components into your project, or copy-paste code manually. 3. **Customize** each component freely-tweak styles, logic, responsive behavior, or layout as needed. # Setup So you want to use UI Thing in your Nuxt project? Great! This guide will walk you through the steps to get started. ## Prerequisites Before you can use UI Thing, you need to have a Nuxt project. If you don't have one yet, you can create one with the following command: :prose-pm-x{command="nuxi@latest init my-app"} This will create a new Nuxt project in the `my-app` directory. You can then navigate to that directory and start the development server: ```bash cd my-app && npm run dev ``` ## Initialization Once you have a Nuxt project, you can initialize UI Thing with the following command: :prose-pm-x{command="ui-thing@latest init"} This command will ask you a bunch of question the first time you run it ```bash ✔ Which theme do you want to start with? › Violet ✔ Where is your tailwind.css file located? … app/assets/css/tailwind.css ✔ Where should your components be stored? … app/components/Ui ✔ Where should your composables be stored? … app/composables ✔ Where should your plugins be stored? … app/plugins ✔ Where should your utils be stored? … app/utils ✔ Should we just replace component files if they already exist? … yes ✔ Would you like to use the default filename when adding components? … yes ✔ Which package manager do you use? › Npm ``` ## Adding components Once initialized, add components by running: :prose-pm-x{command="ui-thing@latest add"} You'll be prompted to select the components you want. **UI Thing** will then: - Copy the selected components into your components directory - Add any required composables, utils, and plugins - Install missing dependencies - Update `nuxt.config` with necessary configuration ## Adding themes UI Thing ships with several pre-made themes. Add one to your project with: :prose-pm-x{command="ui-thing@latest theme"} This will ask you to select the theme you want to add to your project. Once you have selected a theme, UI Thing will ask you if you want to overwrite your `tailwind.css` file. If you answer yes, it will overwrite your `tailwind.css` file with the theme you selected. ⚠️ Please note that this will overwrite your `tailwind.css` file. If you have made any changes to this file, you will lose them. ### Theme source The themes included in this cli all come from [shadcn/ui theme page](https://ui.shadcn.com/themes){rel=""nofollow""}. So if you don't want to use this CLI to add themes, you can just customize your theme on that page and copy the code into your `tailwind.css` file. > Thanks shadcn for making these themes available for free! 🙏 # CLI :prose-pm-x{command="ui-thing@latest"} ```sh Usage: ui-thing [options] [command] CLI for adding ui-thing components to your Nuxt application Options: -V, --version output the version number -h, --help display help for command Commands: init [options] Initialize UI Thing in your Nuxt project. add [options] [componentNames...] Add a list of components to your project. theme Add a new theme to your project. shortcuts Add the shortcuts composable to your project. prettier Add prettier config to your project. help [command] display help for command ``` ## init :prose-pm-x{command="ui-thing@latest init"} This command will initialize UI Thing in your Nuxt project. This will: - Update your `nuxt.config` file - Add the necessary dependencies - Create a `ui-thing.config.ts` file with the default configuration It is recommended that you run this command in a new Nuxt project before adding any components. ```sh Usage: ui-thing init [options] Initialize UI Thing in your Nuxt project. ✅ Add tailwindcss to your project ✅ Update your nuxt.config file ✅ Add the necessary dependencies ✅ Create a ui-thing.config file with the default configuration Options: -f --force Overwrite config file if it exists. (default: false) -y --yes Skip prompts and use default values. (default: false) -n --nuxtVersion Specify the Nuxt version you are using. -h, --help display help for command ``` ## add :prose-pm-x{command="ui-thing@latest add"} This command will add a list of components to your project. If no argument is passed, it will ask you to select from a list of available components. ```sh ? Select the components you want to add > Instructions: ↑/↓: Highlight option ←/→/[space]: Toggle selection [a,b,c]/delete: Filter choices enter/return: Complete answer Filtered results for: Enter something to filter ◯ Accordion ◯ Alert ◯ Alert Dialog ◯ ApexCharts ◯ Apexcharts ◯ Aspect Ratio ◯ Autocomplete ◯ Avatar ◯ Badge ◯ Border Beam ``` ## theme The theme command allows you to add a new theme to your project. You can visit the [themes page](https://ui.shadcn.com/themes){rel=""nofollow""} on shadcn to see the available themes. :prose-pm-x{command="ui-thing@latest theme"} Running this command allows you to select a theme from the list ```sh ? Which theme do you want to add? » > Zinc Slate Stone Gray Neutral Red Rose Orange Green ↓ Blue ``` ## prettier The prettier command allows you to add an opinionated prettier config to your project. :prose-pm-x{command="ui-thing@latest prettier"} This will create a `.prettierrc` file that looks like this ```json { "arrowParens": "always", "endOfLine": "lf", "plugins": ["@ianvs/prettier-plugin-sort-imports", "prettier-plugin-tailwindcss"], "printWidth": 100, "semi": true, "singleQuote": false, "tabWidth": 2, "trailingComma": "es5", "useTabs": false, "vueIndentScriptAndStyle": true, "tailwindFunctions": ["tv"], "importOrder": ["", "", "", "", "^[.]"] } ``` It will then instal the necessary dependencies and format your code. ## shortcuts The shortcuts command allows you to add the `shortcuts` composables to your project. :prose-pm-x{command="ui-thing@latest shortcuts"} This will create a `shortcuts.ts` file in your `composables` directory. # Starters ## Counter ![Counter Starter Image](https://ui-thing-starter.behonbaker.com/__og-image__/image/og.png){.border} [Live Demo](https://ui-thing-starter.behonbaker.com/){rel=""nofollow""} • [Github Repo](https://github.com/BayBreezy/ui-thing-starter){rel=""nofollow""} The counter starter is a Nuxt app with UI Thing already initialized. ### Features - **Pinia** - A state management library for Vue/Nuxt - **Es Lint** - Nuxt eslint installed and configured - **Prettier** - Code formatter for consistent style - **Commit Lint** - Lint your commit messages - **Husky** - Git hooks for linting - **Lint Staged** - Lint staged files before commit # Shortcuts ## Credits I just want to say that this composable is coming directly from [Nuxt UI](https://ui.nuxt.com/){rel=""nofollow""}. I am not the creator of this composable, I just wanted to share it with you because I think it's a really cool feature to have in your project. You can find the original docs here: [Nuxt UI - Shortcuts](https://ui.nuxt.com/composables/define-shortcuts){rel=""nofollow""}. > Thanks Nuxt UI ♥ ## `defineShortcuts` The `defineShortcuts` composable allows you to define keyboard shortcuts in your app really easily. Try it out by pressing `Ctrl + v` :shortcuts-ex-one ```vue [ShortcutsExOne.vue] ``` ## API ### `defineShortcuts(config: ShortcutsConfig, options?: ShortcutsOptions)` Define keyboard shortcuts for your application. - `config`: An object where keys are shortcut definitions and values are either handler functions or shortcut configuration objects. - `options`: Optional configuration for the shortcuts behavior. - `chainDelay`: The delay between key presses to consider the shortcut as chained. Default is `250`. Shortcuts keys are written as the literal keyboard key value. For a complete list of available shortcut keys, refer to the [`KeyboardEvent.key`](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values){rel=""nofollow""} API documentation. Note that the key should be written in lowercase. #### Shortcut Definition Shortcuts are defined using the following format: - Single key: `a`, `b`, `1`, `?`, etc. - Key combinations: Use `_` to separate keys, e.g., `meta_k`, `ctrl_shift_f` - Key sequences: Use `-` to define a sequence, e.g., `g-d` #### Modifiers - `meta`: Represents `⌘ Command` on macOS and `Ctrl` on other platforms - `ctrl`: Represents `Ctrl` on all platforms - `shift`: Used for alphabetic keys when Shift is required #### Special Keys - `escape`: Triggers on Esc key - `enter`: Triggers on Enter key - `arrowleft`, `arrowright`, `arrowup`, `arrowdown`: Trigger on respective arrow keys Examples of keys: - `escape`: will trigger by hitting `Esc` - `meta_k`: will trigger by hitting `⌘` and `K` at the same time on MacOS, and `Ctrl` and `K` on Windows and Linux - `ctrl_k`: will trigger by hitting `Ctrl` and `K` at the same time on MacOS, Windows and Linux - `shift_e`: will trigger by hitting `Shift` and `E` at the same time on MacOS, Windows and Linux - `?`: will trigger by hitting ? on some keyboard layouts, or for example Shift and /, which results in ? on US Mac keyboards - `g-d`: will trigger by hitting `g` then `d` with a maximum delay of 800ms by default - `arrowleft`: will trigger by hitting `←` (also: `arrowright`, `arrowup`, `arrowdown`) ### Shortcut Configuration Each shortcut can be defined as a function or an object with the following properties: ```ts interface ShortcutConfig { handler: () => void; usingInput?: boolean | string; } ``` - `handler`: Function to be executed when the shortcut is triggered - `usingInput`: - `false` (default): Shortcut only triggers when no input is focused - `true`: Shortcut triggers even when any input is focused - `string`: Shortcut only triggers when the specified input (by name) is focused ### `usingInput` Prop: `usingInput?: string | boolean` By default, `usingInput` is `false`, meaning it will only trigger when no input is focused. When set to `true`, the shortcut will also trigger when any input is focused. For a more advanced behavior, `usingInput` can be set to the name of an input, so it only triggers when focusing this specific input. ::show-case :shortcuts-ex-two #code ```vue [ShortcutsExTwo.vue] ``` :: ### Simple shortcut In case the shortcut does not need any config, it can be written as a function. :shortcuts-ex-three ```vue [ShortcutsExThree.vue] ``` ## `useKbd` To get the OS specific meta key symbol, you can use the `useKbd` composable. ```vue ``` *`metaSymbol` will display either `⌘` on MacOS or `Ctrl` on any other OS* # MCP Server ## What it gives you The UI Thing MCP server exposes the library in a way that is useful to agents: - small discovery indexes for components, blocks, prose, docs, examples, and page templates - exact detail tools for full source code and markdown docs - install-plan tools for mixed selections - scaffold-first planning tools for new Nuxt projects This matters because UI Thing is a copy-paste library. The files are the product, so the MCP server is designed to help agents find the right files, dependencies, and docs before implementation. ## Available resources These resources are intentionally compact indexes: - `resource://uithing/components` - `resource://uithing/blocks` - `resource://uithing/prose` - `resource://uithing/documentation-pages` - `resource://uithing/examples` - `resource://uithing/page-templates` - `resource://uithing/quick-start` - `resource://uithing/design-patterns` Use the detail tools when you need full source or full markdown. ## Available tools ### Discovery - `list-components` - `list-blocks` - `list-prose` - `list-documentation-pages` - `list-block-pages` - `search-components` - `search-documentation-pages` - `resolve-library-item` ### Details - `get-component` - `get-block` - `get-prose` - `get-documentation-page` ### Planning - `get-project-setup` - `get-install-plan` - `plan-page` - `plan-form` - `validate-dependencies`:br Compatibility alias for `get-install-plan` ## Available prompts - `setup-project` - `build-page` - `create-form` - `implement-component` - `create-documentation` - `fix-component-issue` - `optimize-accessibility` Prompts now point to the tools above instead of trying to embed the whole workflow in prompt text. ## Recommended workflow For a new Nuxt project: 1. Call `get-project-setup` 2. Call `plan-page` or `plan-form` 3. Call `resolve-library-item` if the target names are fuzzy 4. Call `get-install-plan` 5. Call `get-component`, `get-block`, `get-prose`, or `get-documentation-page` ## Codex Codex does not read `.vscode/mcp.json`. Add MCP servers with `codex mcp add` or by editing `~/.codex/config.toml`. ### Recommended entries - `nuxtMcpToolkit`:br Reference docs server for current Nuxt guidance - `uiThingLocal`:br Local development server for authoring and testing - `uiThingHosted`:br Hosted production endpoint for end-user flows ### CLI setup ```bash codex mcp add nuxtMcpToolkit --url https://mcp-toolkit.nuxt.dev/mcp codex mcp add uiThingLocal --url http://localhost:3000/mcp codex mcp add uiThingHosted --url https://uithing.com/mcp ``` ### Manual config ```toml [~/.codex/config.toml] [mcp_servers.nuxtMcpToolkit] url = "https://mcp-toolkit.nuxt.dev/mcp" [mcp_servers.uiThingLocal] url = "http://localhost:3000/mcp" [mcp_servers.uiThingHosted] url = "https://uithing.com/mcp" ``` ## VS Code If you are using VS Code MCP support, add UI Thing alongside the Nuxt MCP Toolkit docs server: ```json [.vscode/mcp.json] { "servers": { "Nuxt MCP Toolkit": { "type": "http", "url": "https://mcp-toolkit.nuxt.dev/mcp" }, "UI Thing": { "type": "http", "url": "https://uithing.com/mcp" } }, "inputs": [] } ``` For local development, switch the UI Thing URL to `http://localhost:3000/mcp`. ## Cursor ```json [~/.cursor/mcp.json] { "mcpServers": { "ui-thing": { "type": "http", "url": "https://uithing.com/mcp" } } } ``` ## Claude Desktop ```json [claude_desktop_config.json] { "mcpServers": { "ui-thing": { "command": "npx", "args": ["mcp-remote", "https://uithing.com/mcp"] } } } ``` ## Windsurf ```json [.codeium/windsurf/mcp_config.json] { "mcpServers": { "ui-thing": { "type": "http", "url": "https://uithing.com/mcp" } } } ``` ## Example requests ```sh "Set up UI Thing in a new Nuxt app" ``` ```sh "Plan a landing page using UI Thing blocks" ``` ```sh "Build an install plan for button, dialog, and Hero 1" ``` ```sh "Resolve the best UI Thing match for a date picker" ``` ```sh "Fetch the full Button component source and docs" ``` ```sh "Search the documentation for sidebar persistence" ``` # Changelog ## March 20, 2026 ### Component Updates - [**Sidebar**](https://uithing.com/components/sidebar): Fixed an issue where the `SidebarProvider` was not persisting the open or closed state correctly with cookies. The provider now restores the saved state properly and keeps the cookie in sync with controlled updates. - **Class Overrides**: Updated component and prose style builders to normalize Vue class bindings with `normalizeClass(...)` before passing them into `tv()`. This removes the TypeScript errors introduced by the recent Vue class type change without narrowing the public `class` prop API. - [**Scrollspy**](https://uithing.com/components/scrollspy): Added a shared `mode="multiple"` option so docs and app layouts can mark every visible heading as active at once. The docs TOC rail now follows those active headings with a segmented zigzag highlight instead of a single active branch. ### Developer Experience - **Agent Skills**: Added a new local `uithing` Codex skill for UI Thing workflows. It covers real CLI usage, component/docs/generator/MCP authoring inside this repo, and React or shadcn-style snippet conversion into native Vue, Nuxt, and UI Thing composition. ### Form Updates - [**VeeSwitch**](https://uithing.com/forms/veeswitch): Added a dedicated Vee-Validate switch wrapper with docs and examples, including settings and preferences card patterns. The wrapper now also aligns with the current Reka Switch value model so initial values and custom true/false values display correctly in the UI. ## January 24, 2026 ### New Component - **Color Picker**: A versatile color picker component that supports multiple color formats (HEX, RGB, HSL) and includes features like alpha transparency, preset swatches, and a user-friendly interface. Check out the documentation [here](https://uithing.com/components/color-picker). ## January 3, 2026 ### Component Updates - [**Alert**](https://uithing.com/components/alert): The Alert component has been updated to adjust the icon alignment when there is no title provided. Check out the updated documentation [here](https://uithing.com/components/alert). - [**Sheet**](https://uithing.com/components/sheet): The Sheet component has been updated to include a new `variant` prop that allows for different visual styles. A `fullscreen` prop was also introduced that will determine if the sheet takes up the entire screen or not. The default variant has been preserved, and additional variants can be explored in the documentation [here](https://uithing.com/components/sheet). ## January 2, 2026 ### Component Updates - [**Tanstack Table**](https://uithing.com/components/tanstacktable): The Tanstack Table component has been updated to fix an issue with column pinning styles. Pinned columns now have the correct background color applied. Check out the updated documentation [here](https://uithing.com/components/tanstacktable). ## January 1, 2026 ### New Component - **Flip Clock**: An animated split-flap clock that supports live time and countdown modes. Check out the documentation [here](https://uithing.com/components/flip-clock). ## December 29, 2025 ### New Components - **QR Code**: A component for generating and displaying QR codes with customizable styling and frame handles. Check out the documentation [here](https://uithing.com/components/qrcode). - **Avatar Label Group**: A component for displaying an Avatar with associated title and subtitle. Check out the documentation [here](https://uithing.com/components/avatar). ## December 25, 2025 🎄 Happy Holidays 🎄 ### MCP Server UI Thing now has an MCP server that powers its AI capabilities. This allows AI assistants like Claude Desktop, Cursor, and VS Code to access component source code, documentation, installation instructions, and more. Learn more about it at [Getting Started - MCP Server](https://uithing.com/getting-started/mcp). ### Component Updates - [**Fancy Icon**](https://uithing.com/components/fancyicon): The fancy icon component has been updated to closer resemble the one from Untitled UI. From the start, it should have looked like that but I was too lazy. This update comes with some breaking changes. Be sure to check the docs [here](https://uithing.com/components/fancyicon) for usage examples. - [**Icon**](https://uithing.com/components/icon): The icon component has always been in the repo but there was no documentation for it. This was built because of an issue Where the Datatable component could not render icons from the official Nuxt Icon module. - [**Iframe (Lazy)**](https://uithing.com/components/iframelazy): The Iframe Lazy component is another one that has always been buried in the codebase with no documentation lol. This component allows you to lazy load iframes only when they come into view. Check out the docs [here](https://uithing.com/components/iframelazy). - [**Tanstack Table**](https://uithing.com/components/tanstacktable): The Tanstack Table component has been updated. No breaking changes but new examples were added to showcase the updates. I am lazy, so I wanted a table that would just take an array of objects and generate the table for me. I also asked Claude to implement the server side pagination part. I may update this later to include other stuff... who knows. ### Component API The component API now includes an endpoint to get a component by name. The response now includes a `docsPath` property that contains the path to the documentation page for that component. **Endpoints:** - Get all components: [`/api/components`](https://uithing.com/api/components) - You can also filter with a search query - Get a component by name: [`/api/components/{name}`](https://uithing.com/api/components/%7Bname%7D) ### Blocks API A new API endpoint has been added to get all blocks. **Endpoints:** - Get all blocks: [`/api/blocks`](https://uithing.com/api/blocks) - You can also filter with a search query - Get a block by name: [`/api/blocks/{name}`](https://uithing.com/api/blocks/%7Bname%7D) - Get all block categories: [`/api/blocks/categories`](https://uithing.com/api/blocks/categories) - Get blocks by category: [`/api/blocks/categories/{name}`](https://uithing.com/api/blocks/categories/%7Bname%7D) ### Prose API A new API endpoint has been added to get all prose components. **Endpoints:** - Get all prose components: [`/api/prose`](https://uithing.com/api/prose) - You can also filter with a search query - Get a prose component by name: [`/api/prose/{name}`](https://uithing.com/api/prose/%7Bname%7D) ### Block Paths The URL for several block paths have been updated to be more consistent. Some dashes were added here and there. This is only breaking if you were hardcoding the paths somewhere or add them bookmarked 👀... ### Landing Page Example A new landing page example has been added to the [Examples](https://uithing.com/examples/landing) section. ## October 31, 2025 ### New Field Components Added new interactive field components to enhance user input experiences: - **DocsFieldHear** - A hearing-style interactive field component - **DocsFieldNotionPrompt** - Notion-style prompt field with mentions and context ### Home Page Refactor Refactored the home page layout and added new HomeCards components for improved visual presentation. ### Utilities Added `no-scrollbar` utility class for improved user experience on scrollable elements. ## October 20, 2025 ### Prose Components Added a comprehensive collection of prose components for enhanced content rendering and documentation: #### Typography Components - **ProseH1-H6** - Heading components with anchor link support and customizable styles - **ProseP** - Paragraph component with customizable classes - **ProseLead** - Lead paragraph component for introductory text - **ProseStrong** - Strong text rendering component - **ProseEm** - Emphasized text component - **ProseBlockquote** - Styled blockquote component - **ProseA** - Customizable anchor links with styling - **ProseHr** - Horizontal rule component #### List Components - **ProseUl, ProseOl, ProseLi** - List components with customizable styles - **ProseIconList** - Lists with icons and multiple variants #### Table Components - Added complete table prose components for documentation tables #### Code Components - **ProseCodeGroup** - Tabbed interface for multiple code snippets - **ProseCodeSnippet** - Dynamic code imports with syntax highlighting - **ProsePre** - Enhanced code blocks with file name display and meta parsing - **ProseCodeTree** - Interactive file navigation component - Code collapse functionality - Copy button for code blocks #### Documentation Components - **ProseField & ProseFieldGroup** - Enhanced documentation for component props - **ProseCallout** - Callout component with various styles and variants - **ProseCard** - Card component with animated border effects - **ProseCollapsible** - Collapsible content with customizable icons - **ProseTabs** - Tabbed content for documentation - **ProseImage** - Custom image with zoom functionality - **ProseColorModeImage** - Adaptive images for light/dark modes - **ProseSmartIcon** - Smart icon component #### Package Manager Components - **ProsePmInstall** - Package installation commands - **ProsePmRun** - Package manager script execution - **ProsePmX** - Package manager command execution - Added `usePm` composable for package manager integration #### Typography Documentation Added comprehensive typography documentation showcasing all prose components and their usage. ## October 30, 2025 ### New Block Components Expanded the blocks section with multiple new component categories: #### Testimonial Blocks Added 8 new testimonial block variations featuring: - Carousel sliders with auto-rotation - Grid layouts with customer avatars - Star ratings and company logos - Masonry/Pinterest-style layouts #### Sign Up Blocks Added 4 new sign up page designs: - Two-column layouts with feature showcases - Password confirmation fields - Social authentication options - Compact and minimal card designs #### Pricing Blocks Added 4 new pricing section layouts: - Interactive annual/monthly toggles - Feature comparison grids - Popular plan badges - Four-tier pricing with custom options #### Login Blocks Added 4 new login page designs: - Two-column layouts with security messages - Minimal card designs with icon headers - Social-first authentication layouts - Compact designs with terms notices #### Metric Blocks Added 6 new metric display styles: - Icon-based compact layouts - Card-based designs with badges - Two-column contextual sections - Business metrics with growth indicators #### Newsletter Blocks Created 5 new newsletter signup blocks: - Centered layouts with badges - Card-based split designs - Multi-field forms with checkboxes - Feature showcase grids ### Documentation Updates Enhanced documentation across multiple sections: - Updated sidebar documentation with detailed descriptions - Improved navigation documentation - Enhanced header section documentation with style descriptions ### Component Updates - **Tiptap Editor**: Added new Tiptap editor block with toolbar and formatting options - **Nav Component**: Removed client-only wrapper for better performance - **Animated Tooltip**: Added new component with mouse tracking and animations ## October 27, 2025 ### New Block Components #### Password Recovery & Reset Implemented password recovery and reset components with enhanced layouts and validation. #### Footer Components Enhanced footer components with multiple layouts and styles. #### Feature Blocks Added multiple feature blocks with animations and responsive design. #### FAQ Components Enhanced FAQ components with multiple layouts and animations. #### Error Pages Added custom error pages (404, 500, etc.) with animations and helpful suggestions. #### CTA Components Enhanced call-to-action components with animations and new styles. ### Infrastructure - Added Dockerfile for building and running the application - Updated to Nuxt v4.2 ## September 4, 2023 ### UI Thing V2 Launch 🚀 Launched version 2 of UI Thing with a complete rebuild featuring: - Modern component architecture - Enhanced documentation - Improved developer experience - New component library built on Reka UI - Update to Tailwind CSS v4 - Comprehensive examples and blocks ## February 27, 2025 ### Timeline In this update, the [`Timeline`](https://uithing.com/components/timeline) component was added. You can add it by running ```bash npx ui-thing@latest add timeline ``` ## February 9, 2025 ### Progress In this update, the [`Progress`](https://uithing.com/components/progress) component was updated. There was an issue with how the transform value was being calculated. You can update it by running ```bash npx ui-thing@latest add progress ``` ### Description List The [`Description List`](https://uithing.com/components/description-list) component was added. You can try it out by running ```bash npx ui-thing@latest add description-list ``` ### Native Checkbox The [`Native Checkbox`](https://uithing.com/forms/veecheckbox-native) component was added. It was added because of some array issues I had with the Checkbox from Radix Vue. You can try it out by running ```bash npx ui-thing@latest add vee-native-checkbox ``` ## February 7, 2025 ### Loader In this update, I added the [`Loader`](https://uithing.com/components/loader) component. It was recommended in this [issue](https://github.com/BayBreezy/ui-thing/issues/77){rel=""nofollow""}. You can try it out by running ```bash npx ui-thing@latest add loader ``` ## February 2, 2025 ### Form Builder In this update, I added the [`Form Builder`](https://uithing.com/forms/form-builder) component. I stumbled across an example in the Vee Validate docs and thought it would be nice to have something like this at hand. You can try it out by running ```bash npx ui-thing@latest add vee-form-builder ``` ## January 15, 2025 ### Tabs Im this update, I added some examples for the [`Tabs`](https://uithing.com/components/tabs) component. The examples are taken from the [Origin UI](https://originui.com/){rel=""nofollow""} library. Thanks to the team over there for all the great free examples ❤️. You can run this command to add the updated tabs component to your project ```bash npx ui-thing@latest add tabs ``` ## January 15, 2025 ### Datatables Im this update, I added some examples for the [`Datatables`](https://uithing.com/components/datatable) component. The examples are taken from the [Origin UI](https://originui.com/){rel=""nofollow""} library. Thanks to the team over there for all the great free examples ❤️. You can run this command to add the updated table component to your project ```bash npx ui-thing@latest add datatable ``` ## January 14, 2025 ### Table Im this update, I added some examples for the [`Table`](https://uithing.com/components/table) component. The examples are taken from the [Origin UI](https://originui.com/){rel=""nofollow""} library. Thanks to the team over there for all the great free examples ❤️. You can run this command to add the updated table component to your project ```bash npx ui-thing@latest add table ``` ## December 28, 2024 ### Avatar Im this update, I added some examples for the [`Avatar`](https://uithing.com/components/avatar) component. The examples are taken from the [Origin UI](https://originui.com/){rel=""nofollow""} library. Thanks to the team over there for all the great free examples ❤️. ## December 27, 2024 ### Input & Textarea In this update, the [`Input`](https://uithing.com/components/input) and [`Textarea`](https://uithing.com/components/textarea) components were updated. A new `pattern` & `maxlength` props was added to them both. Thanks to [arshx86](https://github.com/arshx86){rel=""nofollow""}. You can try them out by running ```bash npx ui-thing@latest add input textarea ``` ## December 23, 2024 ### Breadcrumbs & Pagination In this update the [`Breadcrumbs`](https://uithing.com/components/breadcrumbs) component got a little update. You can now pass a `slot` in the array of items & customize what is displayed in that slot. ```html ``` You can try it out by running ```bash npx ui-thing@latest add breadcrumbs ``` ### Pagination The [`Pagination`](https://uithing.com/components/pagination) component got a little update too. For the core components, only an additional import statement was added from the Vue Use library. Some nice examples were copied over from the [Origin UI](https://originui.com/){rel=""nofollow""} library. You can try it out by running ```bash npx ui-thing@latest add pagination ``` ## December 21, 2024 ### Carousel In this update, the `Carousel` component was added. Thanks to the [Shadcn Vue](https://www.shadcn-vue.com/){rel=""nofollow""} team for doing the heavy lifting. You can try it out by running ```bash npx ui-thing@latest add carousel ``` ## December 17, 2024 ### Alert In this update, the `Alert` component was updated. Some cool examples were added from the [Origin UI](https://originui.com/){rel=""nofollow""} library. To update just run this command in your project ```bash npx ui-thing@latest add alert ``` ### Vue Tippy The Goodies section was updated with the [Vue Tippy](https://uithing.com/goodies/vue-tippy) package. You can create cool tooltips with it. The `Tooltip` component still works so now you have two options to choose from 🎉. ## December 15, 2024 ### Sliders In this update, the `Slider` component was updated to accommodate `vertical` orientation. While adding some examples from the [Origin UI](https://originui.com/){rel=""nofollow""} library, I noticed that the `Slider` component was missing the necessary classes that would make it work in a vertical orientation. ### Vertical Slider You can check out all the awesome examples here: [Sliders](https://uithing.com/components/slider#origin-ui-examples). ### Checkboxes? I also add some examples of checkboxes from the [Origin UI](https://originui.com/){rel=""nofollow""} library. You can check them out here: [Checkboxes](https://uithing.com/forms/veecheckbox#origin-ui-examples). ## December 11, 2024 - More Examples & Refactor ### Refactor In this update, I made some minor fixes to some components that were using `className` instead of `class`. Some of the code examples were also updated: - [Dropdown Menu](https://uithing.com/components/dropdownmenu) - [Navigation Menu](https://uithing.com/components/navigationmenu) - [Sidebar](https://uithing.com/components/sidebar) - [Stepper](https://uithing.com/components/stepper) ### Button Examples I added more button examples to the [Button](https://uithing.com/components/button) page. Shoutout to the [Origin UI](https://originui.com/){rel=""nofollow""} team for providing these examples 🙏. ### Dialogs Some dialog examples were added to the [Dialog](https://uithing.com/components/dialog) page. These examples are taken from the [Origin UI](https://originui.com/){rel=""nofollow""} library as well. I hope to add some more examples soon. ## December 1, 2024 ### VueForm Slider Let me start by giving credit to the [VueForm Slider](https://github.com/vueform/slider){rel=""nofollow""} creators ❤️. In this release, I added the [`VeeVueFormSlider`](https://uithing.com/forms/vee-vueformslider) component to the forms section. Yes, there is an existing `Slider` component provided [here](https://uithing.com/components/slider). The problem with this component is that the `v-model` directive returns an array. ALWAYS! This is coming from the implementation provided by Reka UI. Based on the issue raised here [#38](https://github.com/BayBreezy/ui-thing/issues/38){rel=""nofollow""}, I decided to create a new slider component that returns a single value. This is the [`VeeVueFormSlider`](https://uithing.com/forms/vee-vueformslider) component. The cool thing is that this one has built in support for `vee-validate` 🙂. You can try it out by running ```bash npx ui-thing@latest add vee-vue-form-slider ``` ## November 20, 2024 ### Sidebar & Placeholder In this release, the [`Sidebar`](https://uithing.com/components/sidebar) component was added to the components section. Thanks to this issue here [#32](https://github.com/BayBreezy/ui-thing/issues/32){rel=""nofollow""}, I saw that shadcn-ui added a [`Sidebar`](https://uithing.com/components/sidebar) component to their library. The guys at shadcn-vue had already created a port of this, so I used most of that code to create the [`Sidebar`](https://uithing.com/components/sidebar) component. Thanks to all the great devs that made this component possible ❤️. As for the [`Placeholder`](https://uithing.com/components/placeholder) component, this one was taken from the guys at [Nuxt UI](https://ui.nuxt.com/){rel=""nofollow""} 🙏. ### Sidebar Blocks If you want to copy and paste some Sidebar blocks, you can check out the [Sidebar Blocks](https://uithing.com/blocks/sidebar) page. The examples are taken from the shadcn-ui library 🙂. ## November 14, 2024 ### Input Examples In this update, a tonne of Input examples were added to the [Vee Input](https://uithing.com/forms/veeinput) page. Thanks to the maintainers of the [Origin UI](https://originui.com/){rel=""nofollow""} library for providing these examples 🙏. Check them out & let me know what you think. The [`Password Strength`](https://uithing.com/forms/veeinput#input-with-password-strength-indicator) example is really cool 😎. ## October 31, 2024 ### Button Styles In this release, I added a few button styles to the [Button](https://uithing.com/components/button) page. The examples are taken from [Enhanced Button](https://enhanced-button.vercel.app/){rel=""nofollow""} ❤️. Check them out & let me know what you think. # Cards :page-ex-cards # Dashboard :page-ex-dashboard # Landing Page :page-ex-landing # Schema Visualizer :page-ex-schema-visualizer # All Components :page-components-search # Accordion ## Source code Click :source-code-link{component="Accordion"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Anatomy Pass a list of `items` to the component. ```vue [Accordion Anatomy.vue] lines ``` Or use each part individually ```vue [Accordion Anatomy.vue] lines ``` ## Installation :prose-pm-x{command="ui-thing@latest add accordion"} ## Usage ### Basic The most common way to use the accordion is by just passing an array of items to the `items` prop. Each item should have a `value`, `title`, and `content`. ::show-case :docs-accordion #code ```vue [DocsAccordion.vue] ``` :: ### Custom styling If you want to change the way that the items look, you can do so by using the different components that the accordion is composed of. ::show-case :docs-accordion-variant #code ```vue [DocsAccordionVariant.vue] ``` :: ### Custom icon You can change the `icon` that is displayed based on the open state of an item. Just override the the `trigger` slot and then override the `icon` slot. ::show-case :docs-accordion-icon #code ```vue [DocsAccordionIcon.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/accordions){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### With Chevron ::show-case :docs-accordion-with-chevron #code ```vue [DocsAccordionWithChevron.vue] ``` :: ### With Chevron Left ::show-case :docs-accordion-with-chevron-left #code ```vue [DocsAccordionWithChevronLeft.vue] ``` :: ### With Chevron & Icon ::show-case :docs-accordion-with-chevron-icon #code ```vue [DocsAccordionWithChevronIcon.vue] ``` :: ### With Sub-Header & Chevron ::show-case :docs-accordion-with-chevron-sub-header #code ```vue [DocsAccordionWithChevronSubHeader.vue] ``` :: ### With Icon, Sub-Header & Chevron ::show-case :docs-accordion-with-chevron-sub-header-icon #code ```vue [DocsAccordionWithChevronSubHeaderIcon.vue] ``` :: ### Tabs with Chevron ::show-case :docs-accordion-tabs-with-chevron #code ```vue [DocsAccordionTabsWithChevron.vue] ``` :: ### Tabs with Left Chevron ::show-case :docs-accordion-tabs-with-chevron-left #code ```vue [DocsAccordionTabsWithChevronLeft.vue] ``` :: ### Table with Chevron ::show-case :docs-accordion-table-with-chevron #code ```vue [DocsAccordionTableWithChevron.vue] ``` :: ### Table with Left Chevron ::show-case :docs-accordion-table-with-chevron-left #code ```vue [DocsAccordionTableWithChevronLeft.vue] ``` :: ### Multi-Level ::show-case :docs-accordion-multi-level #code ```vue [DocsAccordionMultiLevel.vue] ``` :: # Alert ## Source code Click :source-code-link{component="Alert"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add alert"} ## Usage ### Basic ::show-case :docs-alert #code ```vue [DocsAlert.vue] ``` :: ### Destructive ::show-case :docs-alert-destructive #code ```vue [DocsAlertDestructive.vue] ``` :: ### Border ::show-case :docs-alert-border #code ```vue [DocsAlertBorder.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/alerts-notifications-banners){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Warning ::show-case :docs-alert-warning #code ```vue [DocsAlertWarning.vue] ``` :: ### Warning Outline ::show-case :docs-alert-warning-outline #code ```vue [DocsAlertWarningOutline.vue] ``` :: ### Error ::show-case :docs-alert-error #code ```vue [DocsAlertError.vue] ``` :: ### Error Outline ::show-case :docs-alert-error-outline #code ```vue [DocsAlertErrorOutline.vue] ``` :: ### Info ::show-case :docs-alert-info #code ```vue [DocsAlertInfo.vue] ``` :: ### Info Outline ::show-case :docs-alert-info-outline #code ```vue [DocsAlertInfoOutline.vue] ``` :: ### Success ::show-case :docs-alert-success #code ```vue [DocsAlertSuccess.vue] ``` :: ### Success Outline ::show-case :docs-alert-success-outline #code ```vue [DocsAlertSuccessOutline.vue] ``` :: ### End Link ::show-case :docs-alert-end-link #code ```vue [DocsAlertEndLink.vue] ``` :: ### Sub Data ::show-case :docs-alert-sub-data #code ```vue [DocsAlertSubData.vue] ``` :: ### Close Button ::show-case :docs-alert-close-button #code ```vue [DocsAlertCloseButton.vue] ``` :: ## Notifications ### Close Button w/ Undo ::show-case :docs-alert-notification-single-button #code ```vue [DocsAlertNotificationSingleButton.vue] ``` :: ### Double Button ::show-case :docs-alert-notification-double-button #code ```vue [DocsAlertNotificationDoubleButton.vue] ``` :: ### Success Learn More ::show-case :docs-alert-notification-success-more #code ```vue [DocsAlertNotificationSuccessMore.vue] ``` :: ### Privacy ::show-case :docs-alert-notification-privacy #code ```vue [DocsAlertNotificationPrivacy.vue] ``` :: ### Version Update ::show-case :docs-alert-notification-version #code ```vue [DocsAlertNotificationVersion.vue] ``` :: ### Mentioned ::show-case :docs-alert-notification-mention #code ```vue [DocsAlertNotificationMention.vue] ``` :: # Alert Dialog ## Source code Click :source-code-link{component="AlertDialog"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add alert-dialog"} ## Usage ### Simple ::show-case :docs-alert-dialog #code ```vue [DocsAlertDialog.vue] ``` :: ### Stacked Left ::show-case :docs-alert-dialog-stacked-left #code ```vue [DocsAlertDialogStackedLeft.vue] ``` :: ### Media ::show-case :docs-alert-dialog-media #code ```vue [DocsAlertDialogMedia.vue] ``` :: ### Alert w/ Icon ::show-case :docs-alert-dialog-with-icon #code ```vue [DocsAlertDialogWithIcon.vue] ``` :: # Animated Tooltip ## Source code Click :source-code-link{component="AnimatedTooltip.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add animated-tooltip"} ## Anatomy Pass a list of `items` to the component. Each item should contain an image, title, and optionally a description. ```vue [AnimatedTooltip Anatomy.vue] ``` ## Usage ### Basic Display a group of avatars with animated tooltips that appear on hover. The tooltips follow mouse movement with smooth spring animations. ::show-case :docs-animated-tooltip #code ```vue [DocsAnimatedTooltip.vue] ``` :: ### Without Description You can omit the description field to show only the title in the tooltip. ::show-case :docs-animated-tooltip-no-description #code ```vue [DocsAnimatedTooltipNoDescription.vue] ``` :: ### Large Group The component works well with larger groups of people. The avatars automatically stack with negative margin. ::show-case :docs-animated-tooltip-large #code ```vue [DocsAnimatedTooltipLarge.vue] ``` :: ## Features - **Dynamic Animation**: Tooltips animate in with smooth spring physics using Motion V - **Mouse Tracking**: Tooltips rotate and translate based on mouse position for a natural feel - **Auto-generated IDs**: If no ID is provided, the component automatically generates unique IDs - **Flexible Content**: Support for title and optional description in tooltips - **Stacked Layout**: Avatars stack with negative margin for a compact group display - **Hover Effects**: Smooth scale and z-index transitions on hover ## Props The component accepts an `items` prop with the following interface: ```ts interface Item { id?: string; // Optional: Auto-generated if not provided title: string; // Required: Displayed in tooltip description?: string; // Optional: Secondary text in tooltip image: string; // Required: Avatar image URL } ``` ## Customization You can customize the component by modifying the styles directly in the component file: - **Avatar size**: Change `size-14` class on the image element - **Tooltip styling**: Modify the tooltip container classes - **Animation parameters**: Adjust `stiffness` and `damping` in the Motion component - **Gradient colors**: Update the `via-emerald-500` and `via-sky-500` classes for different accent colors # Aspect Ratio ## Source code Click :source-code-link{component="AspectRatio"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add aspect-ratio"} ## Usage Right click the image to perform different actions. ::show-case :docs-aspect-ratio #code ```vue [DocsAspectRatio.vue] ``` :: # Autocomplete ## Source code Click :source-code-link{component="Autocomplete"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add autocomplete"} ## Usage ### Basic ::show-case :docs-auto-complete-basic #code ```vue [DocsAutoCompleteBasic.vue] ``` :: ### Objects ::show-case :docs-auto-complete-objects #code ```vue [DocsAutoCompleteObjects.vue] ``` :: ### Multiple ::show-case :docs-auto-complete-multiple #code ```vue [DocsAutoCompleteMultiple.vue] ``` :: ### Async This example shows how you can search for a value and make a call to your API for the results. ::show-case :docs-auto-complete-async #code ```vue [DocsAutoCompleteAsync.vue] ``` :: # Avatar ## Source code Click :source-code-link{component="Avatar"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add avatar"} ## Usage ::show-case :docs-avatar #code ```vue [DocsAvatar.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/avatars-badges){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Simple ::show-case :docs-avatar-simple #code ```vue [DocsAvatarSimple.vue] ``` :: ### Initials Only ::show-case :docs-avatar-initial-only #code ```vue [DocsAvatarInitialOnly.vue] ``` :: ### Icon Only ::show-case :docs-avatar-icon-only #code ```vue [DocsAvatarIconOnly.vue] ``` :: ### Chip ::show-case :docs-avatar-chip #code ```vue [DocsAvatarChip.vue] ``` :: ### Badge ::show-case :docs-avatar-badge #code ```vue [DocsAvatarBadge.vue] ``` :: ### Group ::show-case :docs-avatar-group #code ```vue [DocsAvatarGroup.vue] ``` :: ### Badge Group ::show-case :docs-avatar-badge-group #code ```vue [DocsAvatarBadgeGroup.vue] ``` :: ### Avatar Label Group ::show-case :docs-avatar-label-group #code ```vue [DocsAvatarLabelGroup.vue] ``` :: # Badge ## Source code Click :source-code-link{component="Badge.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add badge"} ## Variants ### Default ::show-case :docs-badge-default #code ```vue [DocsBadgeDefault.vue] ``` :: ### Destructive ::show-case :docs-badge-destructive #code ```vue [DocsBadgeDestructive.vue] ``` :: ### Outline ::show-case :docs-badge-outline #code ```vue [DocsBadgeOutline.vue] ``` :: ### Secondary ::show-case :docs-badge-secondary #code ```vue [DocsBadgeSecondary.vue] ``` :: ### Shadcn ::show-case :docs-badge-shadcn #code ```vue [DocsBadgeShadcn.vue] ``` :: ### Origin UI ::show-case :docs-badge-origin-u-i #code ```vue [DocsBadgeOriginUI.vue] ``` :: ## Sizes Three sizes are available for badges: `sm`, `md`, and `lg`. ::show-case :docs-badge-sizes #code ```vue [DocsBadgeSizes.vue] ``` :: # Badge Group ## Source code Click :source-code-link{component="BadgeGroup.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add badge-group"} ## Usage ::show-case :docs-badge-group-default #code ```vue [DocsBadgeGroupDefault.vue] ``` :: ## Colors The `color` prop controls the palette of the badge addon and icon. Applies to the `light` theme only — the `modern` theme uses system-aware tokens. ### All colors ::show-case :docs-badge-group-all-colors #code ```vue [DocsBadgeGroupAllColors.vue] ``` :: ### Semantic aliases ::show-case :docs-badge-group-colors #code ```vue [DocsBadgeGroupColors.vue] ``` :: ## Sizes Two sizes are available: `md` and `lg`. ::show-case :docs-badge-group-sizes #code ```vue [DocsBadgeGroupSizes.vue] ``` :: ## Alignment ### Leading The addon pill appears before the main text with the icon at the trailing end. ::show-case :docs-badge-group-colors #code ```vue [DocsBadgeGroupColors.vue] ``` :: ### Trailing The main text comes first, followed by the addon pill with the icon inside. ::show-case :docs-badge-group-trailing #code ```vue [DocsBadgeGroupTrailing.vue] ``` :: ## Theme ### Modern — leading The modern theme uses system-aware background and border tokens with a color dot indicator inside the addon. ::show-case :docs-badge-group-modern-leading #code ```vue [DocsBadgeGroupModernLeading.vue] ``` :: ### Modern — trailing ::show-case :docs-badge-group-modern-trailing #code ```vue [DocsBadgeGroupModernTrailing.vue] ``` :: ## No icon Set `:icon="false"` to hide the trailing icon entirely. ::show-case :docs-badge-group-no-icon #code ```vue [DocsBadgeGroupNoIcon.vue] ``` :: # BG Pattern - Circle ## Source code Click :source-code-link{component="BgPattern/Circle.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add bg-pattern-circle"} ## Usage ### Basic Place the component inside a relatively positioned container. It renders an inline SVG sized to the chosen `size` prop. ::show-case :docs-bg-pattern-circle-basic #code ```vue [DocsBgPatternCircleBasic.vue] ``` :: ### Sizes Three built-in sizes — `sm` (336x336), `md` (480x480), and `lg` (768x768, default). ::show-case :docs-bg-pattern-circle-sizes #code ```vue [DocsBgPatternCircleSizes.vue] ``` :: ### Custom Color The component inherits `currentColor` for its strokes. Override the color by passing a text color utility via `class`. ::show-case :docs-bg-pattern-circle-colored #code ```vue [DocsBgPatternCircleColored.vue] ``` :: ## Props | Prop | Type | Default | Description | | ------- | ------------------------- | ------- | --------------------------------------------------------------------------------------------- | | `size` | `"sm" | "md" | "lg"` | `"lg"` | Controls the overall dimensions of the SVG pattern. | | `class` | `HTMLAttributes["class"]` | — | Extra classes forwarded to the `` element. Use text color utilities to tint the circles. | # BG Pattern - Grid ## Source code Click :source-code-link{component="BgPattern/Grid.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add bg-pattern-grid"} ## Usage ### Basic Place the component inside a relatively positioned container. It renders an inline SVG sized to the chosen `size` prop. ::show-case :docs-bg-pattern-grid-basic #code ```vue [DocsBgPatternGridBasic.vue]
Background Pattern
``` :: ### Sizes Three built-in sizes — `sm` (336x336), `md` (480x480), and `lg` (768x768, default). ::show-case :docs-bg-pattern-grid-sizes #code ```vue [DocsBgPatternGridSizes.vue] ``` :: ### Custom Color The component inherits `currentColor` for its strokes. Override the color by passing a text color utility via `class`. ::show-case :docs-bg-pattern-grid-colored #code ```vue [DocsBgPatternGridColored.vue] ``` :: ## Props | Prop | Type | Default | Description | | ------- | ------------------------- | ------- | ------------------------------------------------------------------------------------------------ | | `size` | `"sm" | "md" | "lg"` | `"lg"` | Controls the overall dimensions of the SVG pattern. | | `class` | `HTMLAttributes["class"]` | — | Extra classes forwarded to the `` element. Use text color utilities to tint the grid lines. | # BG Pattern - Square ## Source code Click :source-code-link{component="BgPattern/Square.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add bg-pattern-square"} ## Usage ### Basic Place the component inside a relatively positioned container. It renders an inline SVG sized to the chosen `size` prop. ::show-case :docs-bg-pattern-square-basic #code ```vue [DocsBgPatternSquareBasic.vue]
Background Pattern
``` :: ### Sizes Three built-in sizes — `sm` (336x336), `md` (480x480), and `lg` (910x910, default). ::show-case :docs-bg-pattern-square-sizes #code ```vue [DocsBgPatternSquareSizes.vue] ``` :: ### Custom Color The component inherits `currentColor` for its strokes. Override the color by passing a text color utility via `class`. ::show-case :docs-bg-pattern-square-colored #code ```vue [DocsBgPatternSquareColored.vue] ``` :: ## Props | Prop | Type | Default | Description | | ------- | ------------------------- | ------- | --------------------------------------------------------------------------------------------- | | `size` | `"sm" | "md" | "lg"` | `"lg"` | Controls the overall dimensions of the SVG pattern. | | `class` | `HTMLAttributes["class"]` | — | Extra classes forwarded to the `` element. Use text color utilities to tint the squares. | # Breadcrumbs ## Source code Click :source-code-link{component="Breadcrumbs.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add breadcrumbs"} ## Usage ### Basic ::show-case :docs-breadcrumbs #code ```vue [DocsBreadcrumbs.vue]
``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/breadcrumbs-paginations){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Dots Dropdown ::show-case :docs-breadcrumbs-dot-dropdown #code ```vue [DocsBreadcrumbsDotDropdown.vue] ``` :: ### Icon Dropdown ::show-case :docs-breadcrumbs-icon-dropdown #code ```vue [DocsBreadcrumbsIconDropdown.vue] ``` :: ### Icons ::show-case :docs-breadcrumbs-icons #code ```vue [DocsBreadcrumbsIcons.vue] ``` :: ### Separator ::show-case :docs-breadcrumbs-separator #code ```vue [DocsBreadcrumbsSeparator.vue] ``` :: ### Bordered ::show-case :docs-breadcrumbs-bordered #code ```vue [DocsBreadcrumbsBordered.vue] ``` :: ### Select ::show-case :docs-breadcrumbs-select #code ```vue [DocsBreadcrumbsSelect.vue] ``` :: # Button ## Source code Click :source-code-link{component="Button.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add button"} ## Plain Buttons Here we have a few examples of the plain buttons. ### Default Button ::show-case :docs-button-default #code ```vue [DocsButtonDefault.vue] ``` :: ### Secondary Button ::show-case :docs-button-secondary #code ```vue [DocsButtonSecondary.vue] ``` :: ### With Icon ::show-case :docs-button-with-icon #code ```vue [DocsButtonWithIcon.vue] ``` :: ### Loading ::show-case :docs-button-loading #code ```vue [DocsButtonLoading.vue] ``` :: ### Outline ::show-case :docs-button-outline #code ```vue [DocsButtonOutline.vue] ``` :: ### Destructive ::show-case :docs-button-destructive #code ```vue [DocsButtonDestructive.vue] ``` :: ### Ghost ::show-case :docs-button-ghost #code ```vue [DocsButtonGhost.vue] ``` :: ### Link ::show-case :docs-button-link #code ```vue [DocsButtonLink.vue] ``` :: ### Icon ::show-case :docs-button-icon-only #code ```vue [DocsButtonIconOnly.vue] ``` :: ## Sizes Here are the different sizes that are available for the buttons. ### Regular Button Sizes ::show-case :docs-button-sizes #code ```vue [DocsButtonSizes.vue] ``` :: ### Icon Button Sizes ::show-case :docs-button-icon-sizes #code ```vue [DocsButtonIconSizes.vue] ``` :: ## Enhanced Buttons These are some buttons that I found today over here [Enhanced Buttons](https://enhanced-button.vercel.app/){rel=""nofollow""}. I think they are cool. ### Expand Icon - Right ::show-case :docs-button-expand-icon-right #code ```vue [DocsButtonExpandIconRight.vue] ``` :: ### Expand Icon - Left ::show-case :docs-button-expand-icon-left #code ```vue [DocsButtonExpandIconLeft.vue] ``` :: ### Gooey - Left ::show-case :docs-button-gooey-left #code ```vue [DocsButtonGooeyLeft.vue] ``` :: ### Gooey - Right ::show-case :docs-button-gooey-right #code ```vue [DocsButtonGooeyRight.vue] ``` :: ### Shine ::show-case :docs-button-shine #code ```vue [DocsButtonShine.vue] ``` :: ### Shine on Hover ::show-case :docs-button-shine-hover #code ```vue [DocsButtonShineHover.vue] ``` :: ### Gradient Slideshow ::show-case :docs-button-gradient-flow #code ```vue [DocsButtonGradientFlow.vue] ``` :: ### Ring Hover ::show-case :docs-button-ring-hover #code ```vue [DocsButtonRingHover.vue] ``` :: ### Link Hover 1 ::show-case :docs-button-link-hover1 #code ```vue [DocsButtonLinkHover1.vue] ``` :: ### Link Hover 2 ::show-case :docs-button-link-hover2 #code ```vue [DocsButtonLinkHover2.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/buttons){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Animated Close Button ::show-case :docs-button-animated-menu #code ```vue [DocsButtonAnimatedMenu.vue] ``` :: ### Animated Rotate Plus ::show-case :docs-button-rotate-plus #code ```vue [DocsButtonRotatePlus.vue] ``` :: ### Group Outline Counter ::show-case :docs-button-group-outline-counter #code ```vue [DocsButtonGroupOutlineCounter.vue] ``` :: ### Volume Control ::show-case :docs-button-volume #code ```vue [DocsButtonVolume.vue] ``` :: ### Animated Copy ::show-case :docs-button-animated-copy #code ```vue [DocsButtonAnimatedCopy.vue] ``` :: ### Upload Button w/ Icon ::show-case :docs-button-upload #code ```vue [DocsButtonUpload.vue] ``` :: ### Arrows ::show-case :docs-button-arrows #code ```vue [DocsButtonArrows.vue] ``` :: # Button Group ## Source code Click :source-code-link{component="ButtonGroup"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add button-group"} ## Usage ### Basic ::show-case :docs-button-group #code ```vue [DocsButtonGroup.vue] ``` :: ### Orientation ::show-case :docs-button-group-orientation #code ```vue [DocsButtonGroupOrientation.vue] ``` :: ### Size ::show-case :docs-button-group-size #code ```vue [DocsButtonGroupSize.vue] ``` :: ### Nested ::show-case :docs-button-group-nested #code ```vue [DocsButtonGroupNested.vue] ``` :: ### Separator The `ButtonGroupSeparator` component visually divides buttons within a group. Buttons with variant `outline` do not need a separator since they have a border. For other variants, a separator is recommended to improve the visual hierarchy. ::show-case :docs-button-group-separator #code ```vue [DocsButtonGroupSeparator.vue] ``` :: ### Split ::show-case :docs-button-group-split #code ```vue [DocsButtonGroupSplit.vue] ``` :: ### Input ::show-case :docs-button-group-input #code ```vue [DocsButtonGroupInput.vue] ``` :: ### Input Group ::show-case :docs-button-group-input-group #code ```vue [DocsButtonGroupInputGroup.vue] ``` :: ### Dropdown ::show-case :docs-button-group-dropdown #code ```vue [DocsButtonGroupDropdown.vue] ``` :: ### Select ::show-case :docs-button-group-select #code ```vue [DocsButtonGroupSelect.vue] ``` :: ### Popover ::show-case :docs-button-group-popover #code ```vue [DocsButtonGroupPopover.vue] ``` :: # Calendar ## Source code Click :source-code-link{component="Calendar.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add calendar"} You can optionally configure the vcalendar module in your `nuxt.config.js` file: ```ts vcalendar: { calendarOptions: { masks: { weekdays: "WW", }, }, }, ``` ## Usage ### Attributes Attributes are visual decorators that can be applied to specific calendar dates. Learn more about them [here](https://vcalendar.io/calendar/attributes.html). ::show-case :docs-calendar-attributes #code ```vue [DocsCalendarAttributes.vue] ``` :: ### Right Title - Left Nav ::show-case :docs-calendar-right-title #code ```vue [DocsCalendarRightTitle.vue] ``` :: ### Header Slot ::show-case :docs-calendar-header-slot #code ```vue [DocsCalendarHeaderSlot.vue] ``` :: ### Date Range ::show-case :docs-calendar-range #code ```vue [DocsCalendarRange.vue] ``` :: ### Disabled Dates ::show-case :docs-calendar-disabled-date #code ```vue [DocsCalendarDisabledDate.vue] ``` :: ### Footer Slot ::show-case :docs-calendar-footer-slot #code ```vue [DocsCalendarFooterSlot.vue] ``` :: ### Week View ::show-case :docs-calendar-week-view #code ```vue [DocsCalendarWeekView.vue] ``` :: # Card ## Source code Click :source-code-link{component="Card"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add card"} ## Usage ::show-case :docs-card #code ```vue [DocsCard.vue] ``` :: ## Example ::show-case :docs-card-example #code ```vue [DocsCardExample.vue] ``` :: # Carousel ## Source code Click :source-code-link{component="Carousel"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## About The carousel component is built using the [Embla Carousel](https://www.embla-carousel.com/){rel=""nofollow""} library. ## Installation :prose-pm-x{command="ui-thing@latest add carousel"} ## Usage ```vue [DocsCarouselUsage.vue] ``` ## Examples ### Sizes To set the size of the items, you can use the `basis` utility class on the ``. ::show-case :docs-carousel-sizes #code ```vue [DocsCarouselSizes.vue] ``` :: Other Size Example ```html [DocsCarouselSizesExample.vue] ``` Responsive ```html [DocsCarouselSizesResponsive.vue] ``` ### Spacing To set the spacing between the items, we use a `pl-[VALUE]` utility on the `` and a negative `-ml-[VALUE]` on the ``. ::prose-callout{title="Why not use gap?"} I tried to use the `gap` property or a `grid` layout on the `CarouselContent` but it required a lot of math and mental effort to get the spacing right. I found `pl-[VALUE]` and `-ml-[VALUE]` utilities much easier to use. :br:br You can always adjust this in your own project if you need to. :: ::show-case :docs-carousel-spacing #code ```vue [DocsCarouselSpacing.vue] ``` :: Other Spacing Example ```html [DocsCarouselSpacingExample.vue] ``` Responsive ```html [DocsCarouselSpacingResponsive.vue] ``` ### Orientation Use the `orientation` prop to set the orientation of the carousel. ::show-case :docs-carousel-orientation #code ```vue [DocsCarouselOrientation.vue] ``` :: ### Thumbnail ::show-case :docs-carousel-thumbnail #code ```vue [DocsCarouselThumbnail.vue] ``` :: ## Options You can pass options to the carousel using the `opts` prop. See the [Embla Carousel docs](https://www.embla-carousel.com/api/options/){rel=""nofollow""} for more information. ```vue ``` ## API ### Method 1 Use the `@init-api` emit method on `` component to set the instance of the API. ::show-case :docs-carousel-method1 #code ```vue [DocsCarouselMethod1.vue] ``` :: ### Method 2 You can access it through setting a template ref on the `` component. ```vue ``` ## Events You can listen to events using the API. To get the API instance use the `@init-api` emit method on the `` component ```vue ``` See the [Embla Carousel docs](https://www.embla-carousel.com/api/events/){rel=""nofollow""} for more information on using events. ## Slot Props You can get the reactive slot props like `carouselRef, canScrollNext..Prev, scrollNext..Prev` using the `v-slot` directive in the `` component to extend the functionality. ```vue ``` ## Plugins You can use the `plugins` prop to add plugins to the carousel. ```bash npm i embla-carousel-autoplay ``` ```vue ``` ::show-case :docs-carousel-plugin #code ```vue [DocsCarouselPlugin.vue] ``` :: See the [Embla Carousel docs](https://www.embla-carousel.com/api/plugins/){rel=""nofollow""} for more information on using plugins. # Checkbox ## Source code Click :source-code-link{component="Checkbox"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add checkbox"} ## Usage ### Basic ::show-case :docs-checkbox #code ```vue [DocsCheckbox.vue] ``` :: ### Default ::show-case :docs-checkbox-default-values #code ```vue [DocsCheckboxDefaultValues.vue] ``` :: ### Shadcn ::show-case :docs-checkbox-shadcn #code ```vue [DocsCheckboxShadcn.vue] ``` :: ## Origin UI ### Simple ::show-case :docs-checkbox-origin-simple #code ```vue [DocsCheckboxOriginSimple.vue] ``` :: ### Indeterminate ::show-case :docs-checkbox-origin-indeterminate #code ```vue [DocsCheckboxOriginIndeterminate.vue] ``` :: ### Colored ::show-case :docs-checkbox-origin-colored #code ```vue [DocsCheckboxOriginColored.vue] ``` :: ### Disabled ::show-case :docs-checkbox-origin-disabled #code ```vue [DocsCheckboxOriginDisabled.vue] ``` :: ### Line Through ::show-case :docs-checkbox-origin-line-through #code ```vue [DocsCheckboxOriginLineThrough.vue] ``` :: ### Fancy Todo ::show-case :docs-checkbox-origin-fancy-todo #code ```vue [DocsCheckboxOriginFancyTodo.vue] ``` :: ### Frameworks (Group Checkbox) ::show-case :docs-checkbox-origin-group-frameworks #code ```vue [DocsCheckboxOriginGroupFrameworks.vue] ``` :: ### Frameworks (Group Checkbox - Vertical) ::show-case :docs-checkbox-origin-group-vertical #code ```vue [DocsCheckboxOriginGroupVertical.vue] ``` :: ### Checkbox with Description ::show-case :docs-checkbox-origin-description #code ```vue [DocsCheckboxOriginDescription.vue] ``` :: ### Selections ::show-case :docs-checkbox-origin-options #code ```vue [DocsCheckboxOriginOptions.vue] ``` :: # Chip ## Source code Click :source-code-link{component="Chip.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add chip"} ## Usage ### Basic ::show-case :docs-chip #code ```vue [DocsChip.vue] ``` :: ### Size Pass a size to the `size` prop to change the size of the chip. ::show-case :docs-chip-size #code ```vue [DocsChipSize.vue] ``` :: ### Color You can change the color of the chip by passing any tailwind color `bg` class to the `color` prop. ::show-case :docs-chip-color #code ```vue [DocsChipColor.vue] ``` :: ### Text You can display a text inside the chip by passing a `string` to the `text` prop. ::show-case :docs-chip-text #code ```vue [DocsChipText.vue] ``` :: ### Inset The `inset` prop can be used to move the indicator closer to the element. ::show-case :docs-chip-inset #code ```vue [DocsChipInset.vue] ``` :: # Collapsible ## Source code Click :source-code-link{component="Collapsible"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add collapsible"} ## Usage ::show-case :docs-collapsible #code ```vue [DocsCollapsible.vue] ``` :: # Color Picker ## Source code Click :source-code-link{component="ColorPicker"} to see the source code for this component on GitHub. ## Installation :prose-pm-x{command="ui-thing@latest add color-picker"} ## Usage ### Basic ::show-case :docs-color-picker-basic #code ```vue [DocsColorPickerBasic.vue] ``` :: ### With Alpha Channel Enable alpha/opacity control by setting `show-alpha` to `true`. ::show-case :docs-color-picker-alpha #code ```vue [DocsColorPickerAlpha.vue] ``` :: ### Multiple Formats The color picker supports HEX, RGB, HSL, and HSV formats. Users can toggle between formats using the dropdown selector. ::show-case :docs-color-picker-formats #code ```vue [DocsColorPickerFormats.vue] ``` :: ### With Preset Swatches Add preset color swatches for quick selection. ::show-case :docs-color-picker-presets #code ```vue [DocsColorPickerPresets.vue] ``` :: ### Full Featured Showcase See all features in action: alpha channel, format toggle, input field, and preset swatches. ::show-case :docs-color-picker-showcase #code ```vue [DocsColorPickerShowcase.vue] ``` :: ### In a Popover Combine with a Popover for a compact color picker trigger. ::show-case :docs-color-picker-popover #code ```vue [DocsColorPickerPopover.vue] ``` :: ## API ### Props | Prop | Type | Default | Description | | ------------------ | ------------------------------- | ----------- | --------------------------------------------------------------------------------------- | | `modelValue` | `string` | `"#ff5733"` | The current color value. Accepts any valid color string supported by `colord`. | | `format` | `"hex" | "rgb" | "hsl" | "hsv"` | `"hex"` | Output format used for `update:modelValue` and the input field display. | | `showAlpha` | `boolean` | `false` | Enables alpha/opacity editing and forces HEX output to `#rrggbbaa` when `format="hex"`. | | `showFormatToggle` | `boolean` | `true` | Shows the format dropdown (`HEX/RGB/HSL/HSV`). | | `showInput` | `boolean` | `true` | Shows the text input that displays/accepts the current color string. | | `showPresets` | `boolean` | `false` | Shows preset swatches. | | `presets` | `string[]` | `[]` | List of preset colors. | | `class` | `HTMLAttributes["class"]` | `undefined` | Additional classes for the root wrapper. | ### Events | Event | Payload | Description | | ------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `update:modelValue` | `(value: string)` | Fired whenever the internal color changes. The emitted string matches the selected `format`. If `showAlpha` is enabled and `format="hex"`, the output is always `#rrggbbaa` (lowercase). | | `update:format` | `(format: "hex" | "rgb" | "hsl" | "hsv")` | Fired when the format selection changes. Supports `v-model:format`. | ### Slots | Slot | Description | | ---------- | ------------------------------------------------------- | | `top` | Content rendered above the main UI. | | `sv` | Replace the default SV (saturation/value) component. | | `hue` | Replace the default hue slider component. | | `alpha` | Replace the default alpha slider component. | | `controls` | Replace preview + format + input area. | | `presets` | Replace preset swatches area. | | `default` | Rendered at the bottom inside the root (after presets). | ## Dependencies This component uses the [colord](https://www.npmjs.com/package/colord){rel=""nofollow""} library for color parsing and conversion between different formats. # Combobox ## Installation The Combobox is built using a composition of the `` and the `` components. See installation instructions for the [Popover](https://uithing.com/components/popover) and the [Command](https://uithing.com/components/command) components. ## Usage ```vue ``` ### Combobox ::show-case :docs-combobox #code ```vue [DocsCombobox.vue] ``` :: ### Origin UI ::show-case :docs-combobox-origin #code ```vue [DocsComboboxOrigin.vue] ``` :: # Command ## Source code Click :source-code-link{component="Command"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add command"} ## Usage ### Basic ::show-case :docs-command #code ```vue [DocsCommand.vue] ``` :: ### Dialog ::show-case :docs-command-shortcut #code ```vue [DocsCommandShortcut.vue] ``` :: ### Popover ::show-case :docs-command-popover #code ```vue [DocsCommandPopover.vue] ``` :: ### Dropdown Menu ::show-case :docs-command-dropdown #code ```vue [DocsCommandDropdown.vue] ``` :: ### Responsive You can create a responsive combobox by using the `` on desktop and the `` components on mobile. ::show-case :docs-command-responsive #code ```vue [DocsCommandResponsive.vue] ``` :: # Container ## Source code Click :source-code-link{component="Container.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add container"} ## Usage ### Basic ::show-case :docs-container #code ```vue [DocsContainer.vue] ``` :: # Context Menu ## Source code Click :source-code-link{component="ContextMenu"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add context-menu"} ## Usage ### Basic ::show-case :docs-context-menu-basic #code ```vue [DocsContextMenuBasic.vue] ``` :: ### Checkbox Items ::show-case :docs-context-menu-check-items #code ```vue [DocsContextMenuCheckItems.vue] ``` :: ### Radio Items ::show-case :docs-context-menu-radio-items #code ```vue [DocsContextMenuRadioItems.vue] ``` :: # Credit Card ## Credits This component was designed by [Untitled UI](https://www.untitledui.com/react/components/credit-cards){rel=""nofollow""}. I just made it compatible with UI Thing. ## Source code Click :source-code-link{component="CreditCard.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add credit-card"} ## Usage Import `getCardType` alongside the component when you need to detect the card network from a number entered by the user. ```ts import { getCardType } from "~/components/Ui/CreditCard.vue"; const network = getCardType("4111 1111 1111 1111"); // "visa" ``` ## Variants ### Normal ::show-case :docs-credit-card-default #code ```vue [DocsCreditCardDefault.vue] ``` :: ### Horizontal Strip The bottom half of the card becomes a dark strip — common in designs that separate the number area from the brand area. ::show-case :docs-credit-card-strip #code ```vue [DocsCreditCardStrip.vue] ``` :: ### Vertical Strip A dark panel occupies the left portion of the card, leaving a coloured accent stripe on the right. ::show-case :docs-credit-card-vertical-strip #code ```vue [DocsCreditCardVerticalStrip.vue] ``` :: ### Scaled Pass a `width` prop to scale the card proportionally from its native 316 × 190 px dimensions. ::show-case :docs-credit-card-scaled #code ```vue [DocsCreditCardScaled.vue] ``` :: ## Props | Prop | Type | Default | Description | | ----------------- | ------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `variant` | `CreditCardVariant` | `"brand-dark"` | Visual style of the card. | | `company` | `string` | `"UI Thing."` | Brand or company name shown at the top-left. | | `cardNumber` | `string` | `"1234 1234 1234 1234"` | Formatted card number. | | `cardHolder` | `string` | `"JOHN DOE"` | Cardholder name shown in the footer. | | `cardExpiration` | `string` | `"06/36"` | Expiration date shown in the footer. | | `width` | `number` | — | Target render width in px. The card scales proportionally when provided. | | `networkIcon` | `string` | — | Icon name for the network logo (e.g. `"logos:visa"`). Falls back to Mastercard based on variant. Overridden by the `network-icon` slot. | | `contactlessIcon` | `string` | — | Icon name for the contactless symbol. Defaults to `"mdi:contactless-payment"`. Overridden by the `contactless-icon` slot. | | `class` | `HTMLAttributes["class"]` | — | Extra classes applied to the outer wrapper element. | ## Slots | Slot | Description | | ------------------ | ------------------------------------------------------------------------------------------------- | | `company` | Replaces the company name in the top-left corner. | | `contactless-icon` | Replaces the contactless symbol in the top-right corner. Takes precedence over `contactlessIcon`. | | `card-holder` | Replaces the cardholder name in the footer. | | `card-expiration` | Replaces the expiration date in the footer. | | `card-number` | Replaces the card number in the footer. | | `network-icon` | Replaces the network logo in the bottom-right corner. Takes precedence over `networkIcon`. | ## Variants reference | Variant | Style | | ------------------------- | ------------------------------------------- | | `brand-dark` | Solid primary gradient | | `brand-light` | Light primary tint | | `gray-dark` | Dark gray gradient | | `gray-light` | Light gray | | `transparent` | Frosted-glass (blur + white overlay) | | `transparent-gradient` | Frosted-glass with coloured diffuse glows | | `gray-strip` | Light gray top, dark strip bottom | | `gradient-strip` | Blue→pink gradient top, dark strip bottom | | `salmon-strip` | Salmon top, dark strip bottom | | `transparent-strip` | Frosted top, dark strip bottom | | `gray-strip-vertical` | Dark panel left, glass right | | `gradient-strip-vertical` | Dark panel left, pink→purple gradient right | | `salmon-strip-vertical` | Dark panel left, salmon right | # Currency Input ## Source code Click :source-code-link{component="CurrencyInput.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add currency-input"} Adding this component will also install the `vue-currency-input` package. ## Usage ### Default Configuration The default configuration for the currency input component is as follows: ```json { "currency": "USD", "locale": "en-US", "hideCurrencySymbolOnFocus": false, "hideGroupingSeparatorOnFocus": false } ``` ### Basic ::show-case :docs-currency-input-basic #code ```vue [DocsCurrencyInputBasic.vue] ``` :: ### Options You can change the configuration by passing the `options` prop. ::show-case :docs-currency-input-options #code ```vue [DocsCurrencyInputOptions.vue] ``` :: ### Form ::show-case :docs-currency-input-form #code ```vue [DocsCurrencyInputForm.vue] ``` :: # DataTable ## Source code Click :source-code-link{component="Datatable.client.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add datatable"} ::prose-callout{title="Update Tailwind Reference" variant="info"} Be sure to update your Tailwind CSS reference path (usually located at `~/assets/css/tailwind.css`) once this component is installed. :br:br By default, the `Datatable` component has `@reference "~/assets/css/tailwind.css";` at the top of its scoped styles to ensure that Tailwind classes are available within the component. :: ## Usage ### Dom Take note of how the [`dom`](https://datatables.net/reference/option/dom){rel=""nofollow""} option is configured in the code. We use it to structure the layout of the table. ::show-case :docs-datatable-basic #code ```vue [DocsDatatableBasic.vue] ``` :: ### Custom component With the new version of DataTables.net, you can now use custom Vue components in your table. ::show-case :docs-datatable-component #code ```vue [DocsDatatableComponent.vue] ``` :: ### Layout The new version of DataTables.net also allows you to use custom layouts for your table. You can read more about it [here](https://datatables.net/reference/option/layout){rel=""nofollow""} For this, you will actually need to add some custom classes for things to look how you want. ::show-case :docs-datatable-layout #code ```vue [DocsDatatableLayout.vue] ``` :: ### Simple ::show-case :docs-datatable-simple #code ```vue [DocsDatatableSimple.vue] ``` :: ### Image ::show-case :docs-datatable-images #code ```vue [DocsDatatableImages.vue] ``` :: ### No Horizontal ::show-case :docs-datatable-no-horizontal #code ```vue [DocsDatatableNoHorizontal.vue] ``` :: ### Striped ::show-case :docs-datatable-striped #code ```vue [DocsDatatableStriped.vue] ``` :: ### Vertical Lines ::show-case :docs-datatable-vertical-lines #code ```vue [DocsDatatableVerticalLines.vue] ``` :: ### Dense ::show-case :docs-datatable-dense #code ```vue [DocsDatatableDense.vue] ``` :: ### Row Selection ::show-case :docs-datatable-row-selection #code ```vue [DocsDatatableRowSelection.vue] ``` :: ### Card ::show-case :docs-datatable-card #code ```vue [DocsDatatableCard.vue] ``` :: ### Scroll with Sticky Header ::show-case :docs-datatable-scroll-y #code ```vue [DocsDatatableScrollY.vue] ``` :: ### Badge & Icons ::show-case :docs-datatable-badge #code ```vue [DocsDatatableBadge.vue] ``` :: ### Search & Sort ::show-case :docs-datatable-search-sort #code ```vue [DocsDatatableSearchSort.vue] ``` :: ### Fixed Columns ::show-case :docs-datatable-fixed-column #code ```vue [DocsDatatableFixedColumn.vue] ``` :: ### Column ReOrder This requires the `fixedColumns` plugin to be installed. ```bash npm install --save datatables.net-colreorder-dt ``` Then add the following to your `datatables` plugin file ```ts import "datatables.net-colreorder-dt"; import "datatables.net-colreorder-dt/css/colReorder.dataTables.css"; ``` ::show-case :docs-datatable-column-re-order #code ```vue [DocsDatatableColumnReOrder.vue] ``` :: ### Pagination ::show-case :docs-datatable-pagination #code ```vue [DocsDatatablePagination.vue] ``` :: # Date Field ## Source code Click :source-code-link{component="DateField.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add date-field"} ## Usage ::show-case :docs-date-field #code ```vue [DocsDateField.vue] ``` :: # Datepicker ## Source code Click :source-code-link{component="Datepicker.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add datepicker"} You can optionally configure the vcalendar module in your `nuxt.config.js` file: ```ts vcalendar: { calendarOptions: { masks: { weekdays: "WW", }, }, }, ``` ## Usage ### Datetime Mode ::show-case :docs-datepicker-mode #code ```vue [DocsDatepickerMode.vue] ``` :: ### Custom Title ::show-case :docs-datepicker-title #code ```vue [DocsDatepickerTitle.vue] ``` :: ### Button Slot ::show-case :docs-datepicker-button #code ```vue [DocsDatepickerButton.vue] ``` :: ### Input Slot ::show-case :docs-datepicker-input #code ```vue [DocsDatepickerInput.vue] ``` :: ### Responsive Layout One a mobile screen, the `Datepicker` will expand to full width and display only one column. On larger screens, it will display two columns. ::show-case :docs-datepicker-responsive #code ```vue [DocsDatepickerResponsive.vue] ``` :: ### Time Rules Limit the time selection by setting [Time Rules](https://vcalendar.io/datepicker/time-rules.html){rel=""nofollow""} on the `Datepicker`. Here the user can set an appointment between 9 AM and 5 PM, with a 30-minute interval. Weekends are disabled. ::show-case :docs-datepicker-time-rules #code ```vue [DocsDatepickerTimeRules.vue] ``` :: ### Presets ::show-case :docs-datepicker-presets #code ```vue [DocsDatepickerPresets.vue] ``` :: ### Custom Day Content ::show-case :docs-datepicker-custom-day-content #code ```vue [DocsDatepickerCustomDayContent.vue] ``` :: # Description List ## Source code Click :source-code-link{component="Description"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add description-list"} ## Usage ### Basic ::show-case :docs-description-list-basic #code ```vue [DocsDescriptionListBasic.vue] ``` :: ### With Card ::show-case :docs-description-list-card #code ```vue [DocsDescriptionListCard.vue] ``` :: # Dialog ## Source code Click :source-code-link{component="Dialog"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add dialog"} ## Usage ### Profile Dialog ::show-case :docs-dialog #code ```vue [DocsDialog.vue] ``` :: ### Translucent Surface The `translucent` prop is additive, so you can opt into the glass treatment on dialog-like surfaces without changing their structure, focus management, or motion. ::show-case :docs-dialog-translucent #code ```vue [DocsDialogTranslucent.vue] ``` :: ### Custom Close Button ::show-case :docs-dialog-custom-close #code ```vue [DocsDialogCustomClose.vue] ``` :: ## Origin UI Dialogs Here are some of the dialog examples from the [Origin UI](https://originui.com){rel=""nofollow""} documentation. Hats off to the Origin UI team ❤️. I just made them work with my setup. ### Scrollable (native scrollbar) ::show-case :docs-dialog-scroll-native #code ```vue [DocsDialogScrollNative.vue] ``` :: ### Scrollable (custom scrollbar) ::show-case :docs-dialog-scroll-custom #code ```vue [DocsDialogScrollCustom.vue] ``` :: ### Scrollable (sticky header) ::show-case :docs-dialog-scroll-sticky-header #code ```vue [DocsDialogScrollStickyHeader.vue] ``` :: ### Scrollable (sticky footer) ::show-case :docs-dialog-scroll-sticky-footer #code ```vue [DocsDialogScrollStickyFooter.vue] ``` :: ### Terms & Condition ::show-case :docs-dialog-terms-condition #code ```vue [DocsDialogTermsCondition.vue] ``` :: ### Newsletter ::show-case :docs-dialog-newsletter #code ```vue [DocsDialogNewsletter.vue] ``` :: ### Feedback ::show-case :docs-dialog-feedback #code ```vue [DocsDialogFeedback.vue] ``` :: ### Rating ::show-case :docs-dialog-rating #code ```vue [DocsDialogRating.vue] ``` :: ### OTP Code ::show-case :docs-dialog-otp-code #code ```vue [DocsDialogOtpCode.vue] ``` :: ### Sign Up ::show-case :docs-dialog-sign-up #code ```vue [DocsDialogSignUp.vue] ``` :: ### Sign In ::show-case :docs-dialog-sign-in #code ```vue [DocsDialogSignIn.vue] ``` :: ### Invite Members ::show-case :docs-dialog-invite-members #code ```vue [DocsDialogInviteMembers.vue] ``` :: ### Card Details This implementation requires the use of [Maska](https://beholdr.github.io/maska/v3/#/install){rel=""nofollow""} ::show-case :docs-dialog-card-details #code ```vue [DocsDialogCardDetails.vue] ``` :: ### Checkout This implementation requires the use of [Maska](https://beholdr.github.io/maska/v3/#/install){rel=""nofollow""} ::show-case :docs-dialog-checkout #code ```vue [DocsDialogCheckout.vue] ``` :: ### Change Plan ::show-case :docs-dialog-change-plan #code ```vue [DocsDialogChangePlan.vue] ``` :: ### Edit Profile ::show-case :docs-dialog-edit-profile #code ```vue [DocsDialogEditProfile.vue] ``` :: ### Onboarding ::show-case :docs-dialog-onboarding #code ```vue [DocsDialogOnboarding.vue] ``` :: ### Command Pallette Search ::show-case :docs-dialog-search #code ```vue [DocsDialogSearch.vue] ``` :: # Divider ## Source code Click :source-code-link{component="Divider.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add divider"} ## Usage ### Basic ::show-case :docs-divider #code ```vue [DocsDivider.vue] ``` :: ### Label ::show-case :docs-divider-label #code ```vue [DocsDividerLabel.vue] ``` :: ### Icon ::show-case :docs-divider-icon #code ```vue [DocsDividerIcon.vue] ``` :: ### Avatar ::show-case :docs-divider-avatar #code ```vue [DocsDividerAvatar.vue] ``` :: ### Vertical ::show-case :docs-divider-vertical #code ```vue [DocsDividerVertical.vue] ``` :: # Draggable ## Source code Click :source-code-link{component="Draggable.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add draggable"} ## Usage ### Simple ::show-case :docs-draggable-simple #code ```vue [DocsDraggableSimple.vue] ``` :: ### Two Lists ::show-case :docs-draggable-two-lists #code ```vue [DocsDraggableTwoLists.vue] ``` :: ### Clone ::show-case :docs-draggable-clone #code ```vue [DocsDraggableClone.vue] ``` :: ### Custom Clone ::show-case :docs-draggable-custom-clone #code ```vue [DocsDraggableCustomClone.vue] ``` :: ### Clone on `Meta` key Press the `Meta` key (Command on Mac, Windows key on Windows) while dragging to clone an item. ::show-case :docs-draggable-clone-on-meta #code ```vue [DocsDraggableCloneOnMeta.vue] ``` :: ### Handle ::show-case :docs-draggable-handle #code ```vue [DocsDraggableHandle.vue] ``` :: ### Table ::show-case :docs-draggable-table #code ```vue [DocsDraggableTable.vue] ``` :: ### Slots ::show-case :docs-draggable-slots #code ```vue [DocsDraggableSlots.vue] ``` :: ### Nested ::show-case :docs-draggable-nested #code ```vue [DocsDraggableNested.vue] ``` :: # Drawer ## Source code Click :source-code-link{component="Drawer"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add drawer"} ## Usage ### Basic Form We can bring the different components together to make a simple drawer. ::show-case :docs-drawer-basic #code ```vue [DocsDrawerBasic.vue] ``` :: ### With Image We can add an image inside as well. ::show-case :docs-drawer-image #code ```vue [DocsDrawerImage.vue] ``` :: ### Responsive Dialog You can combine the `Dialog` and `Drawer` components to create a responsive dialog. This renders a `Dialog` component on desktop and a `Drawer` on mobile. ::show-case :docs-drawer-responsive-dialog #code ```vue [DocsDrawerResponsiveDialog.vue] ``` :: # Dropdown Menu ## Source code Click :source-code-link{component="DropdownMenu"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add dropdown-menu"} ## Usage ### Menu Items w/ Submenu ::show-case :docs-dropdown-menu-basic #code ```vue [DocsDropdownMenuBasic.vue] ``` :: ### Translucent Surface Use the `translucent` prop on the content surface when you want a softer glassmorphic menu treatment without changing the menu behavior. ::show-case :docs-dropdown-menu-translucent #code ```vue [DocsDropdownMenuTranslucent.vue] ``` :: ### Checkbox Menu Items ::show-case :docs-dropdown-menu-check-items #code ```vue [DocsDropdownMenuCheckItems.vue] ``` :: ### Radio Menu Items ::show-case :docs-dropdown-menu-radio-items #code ```vue [DocsDropdownMenuRadioItems.vue] ``` :: ### Origin UI Examples ::show-case :docs-dropdown-menu-origin-u-i #code ```vue [DocsDropdownMenuOriginUI.vue] ``` :: # Dropfile ## Source code Click :source-code-link{component="Dropfile.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add dropfile"} ## Usage ### Placeholder ::show-case :docs-dropfile #code ```vue [DocsDropfile.vue] ``` :: # Editable ## Source code Click :source-code-link{component="Editable"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add editable"} ## Usage The `Editable` component is one that will be used differently in different parts of your app. Since we already have styled buttons and inputs, it kinda makes no sense to force a specific style on the `Editable` component when we can just use the `asChild` prop to pass in the children we want to use. ::show-case :docs-editable #code ```vue [DocsEditable.vue] ``` :: # Empty ## Source code Click :source-code-link{component="Empty"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add empty"} ## Usage ```vue ``` ## Examples ### Basic ::show-case :docs-empty #code ```vue [DocsEmpty.vue] ``` :: ### Outline ::show-case :docs-empty-outline #code ```vue [DocsEmptyOutline.vue] ``` :: ### Background ::show-case :docs-empty-background #code ```vue [DocsEmptyBackground.vue] ``` :: ### Avatar ::show-case :docs-empty-avatar #code ```vue [DocsEmptyAvatar.vue] ``` :: ### Avatar Group ::show-case :docs-empty-avatar-group #code ```vue [DocsEmptyAvatarGroup.vue] ``` :: ### Input Group ::show-case :docs-empty-input-group #code ```vue [DocsEmptyInputGroup.vue] ``` :: # Fancy Icon ## Source code Click :source-code-link{component="FancyIcon"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add fancy-icon"} ## Usage ### Basic ::show-case :docs-fancy-icon #code ```vue [DocsFancyIcon.vue] ``` :: ### Light Theme ::show-case :docs-fancy-icon-light #code ```vue [DocsFancyIconLight.vue] ``` :: ### Dark Theme ::show-case :docs-fancy-icon-dark #code ```vue [DocsFancyIconDark.vue] ``` :: ### Outline Theme ::show-case :docs-fancy-icon-outline #code ```vue [DocsFancyIconOutline.vue] ``` :: ### Modern Theme ::show-case :docs-fancy-icon-modern #code ```vue [DocsFancyIconModern.vue] ``` :: ### Modern Neue Theme ::show-case :docs-fancy-icon-modern-neue #code ```vue [DocsFancyIconModernNeue.vue] ``` :: ### Gradient Theme ::show-case :docs-fancy-icon-gradient #code ```vue [DocsFancyIconGradient.vue] ``` :: # Field ## Source code Click :source-code-link{component="Field"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add field"} ## Usage ```vue ``` ## Anatomy The `Field` family is designed for composing accessible forms. A typical field is structured as follows: ```vue ``` - `Field` is the core wrapper for a single field. - `FieldContent` is a flex column that groups label and description. Not required if you have no description. - Wrap related fields with `FieldGroup`, and use `FieldSet` with `FieldLegend` for semantic grouping. ## Examples ### Basic ::show-case :docs-field-basic #code ```vue [DocsFieldBasic.vue] ``` :: ### Input ::show-case :docs-field-input #code ```vue [DocsFieldInput.vue] ``` :: ### Textarea ::show-case :docs-field-textarea #code ```vue [DocsFieldTextarea.vue] ``` :: ### Select ::show-case :docs-field-select #code ```vue [DocsFieldSelect.vue] ``` :: ### Slider ::show-case :docs-field-slider #code ```vue [DocsFieldSlider.vue] ``` :: ### FieldSet ::show-case :docs-field-field-set #code ```vue [DocsFieldFieldSet.vue] ``` :: ### Checkbox ::show-case :docs-field-checkbox #code ```vue [DocsFieldCheckbox.vue] ``` :: ### Radio ::show-case :docs-field-radio #code ```vue [DocsFieldRadio.vue] ``` :: ### Switch ::show-case :docs-field-switch #code ```vue [DocsFieldSwitch.vue] ``` :: ## Notion Prompt ::show-case :docs-field-notion-prompt #code ```vue [DocsFieldNotionPrompt.vue] ``` :: ### How did you hear about us? ::show-case :docs-field-hear #code ```vue [DocsFieldHear.vue] ``` :: ### Choice Card Wrap `Field` components inside `FieldLabel` to create selectable field groups. This works with `RadioItem`, `Checkbox` and `Switch` components. ::show-case :docs-field-choice-card #code ```vue [DocsFieldChoiceCard.vue] ``` :: ### Field Group Stack `Field` components with `FieldGroup`. Add `FieldSeparator` to divide them. ::show-case :docs-field-field-group #code ```vue [DocsFieldFieldGroup.vue] ``` :: ### Responsive Layout - **Vertical fields:** Default orientation stacks label, control, and helper text—ideal for mobile-first layouts. - **Horizontal fields:** Set `orientation="horizontal"` on `Field` to align the label and control side-by-side. Pair with `FieldContent` to keep descriptions aligned. - **Responsive fields:** Set `orientation="responsive"` for automatic column layouts inside container-aware parents. Apply `@container/field-group` classes on `FieldGroup` to switch orientations at specific breakpoints. ::show-case :docs-field-responsive-layout #code ```vue [DocsFieldResponsiveLayout.vue] ``` :: ## Validation and Errors - Add `data-invalid` to `Field` to switch the entire block into an error state. - Add `aria-invalid` on the input itself for assistive technologies. - Render `FieldError` immediately after the control or inside `FieldContent` to keep error messages aligned with the field. ```vue ``` ## Accessibility - `FieldSet` and `FieldLegend` keep related controls grouped for keyboard and assistive tech users. - `Field` outputs `role="group"` so nested controls inherit labeling from `FieldLabel` and `FieldLegend` when combined. - Apply `FieldSeparator` sparingly to ensure screen readers encounter clear section boundaries. # Flip Clock ## Source code Click :source-code-link{component="FlipClock"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Credits This port is based on the 8 Star Labs UI flip clock — thanks to [8 Star Labs UI](https://ui.8starlabs.com/docs/components/flip-clock){rel=""nofollow""} for the original design. ## Installation :prose-pm-x{command="ui-thing@latest add flip-clock"} ## Usage ### Live clock and countdown ::show-case :docs-flip-clock-basic #code ```vue [DocsFlipClockBasic.vue] ``` :: ### Sizes ::show-case :docs-flip-clock-sizes #code ```vue [DocsFlipClockSizes.vue] ``` :: ### Variants ::show-case :docs-flip-clock-variants #code ```vue [DocsFlipClockVariants.vue] ``` :: ### Day display modes ::show-case :docs-flip-clock-show-days #code ```vue [DocsFlipClockShowDays.vue] ``` :: ## Props - `countdown` (boolean, default `false`): when `true`, counts down toward `targetDate`; otherwise shows the current time. - `targetDate` (Date | string | number): future point in time to count down to. Ignored when `countdown` is `false`. - `showDays` (`auto` | `always` | `never`, default `auto`): controls when the days column is rendered. - `size` (`sm` | `md` | `lg` | `xl`): adjusts digit dimensions and spacing. - `variant`: supports `default`, `secondary`, `destructive`, `outline`, `muted`, plus Tailwind color hues (`red`, `orange`, `amber`, `yellow`, `lime`, `green`, `emerald`, `teal`, `cyan`, `sky`, `blue`, `indigo`, `violet`, `purple`, `fuchsia`, `pink`, `rose`). ## Accessibility - The wrapping element uses `aria-live="polite"` and includes a visually hidden time string for screen readers. - Digits update individually to avoid excessive announcements while keeping time changes detectable. # Floating Dock ## Source code Click :source-code-link{component="FloatingDock.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add floating-dock"} Use `active: true` on any item to show the small running-app dot, similar to the macOS dock. ## Usage ### Basic ::show-case :docs-floating-dock #code ```vue [DocsFloatingDock.vue] ``` :: ### Soft colors ::show-case :docs-floating-dock-soft-colors #code ```vue [DocsFloatingDockSoftColors.vue] ``` :: ### Custom item slot Use the `#item` slot when you want to render something other than the default icon output. This is useful for components like `UiFancyIcon` or any other custom visual treatment. ::show-case :docs-floating-dock-fancy-icon #code ```vue [DocsFloatingDockFancyIcon.vue] ``` :: # Form Forms are tricky. They are one of the most common things you'll build in a web application, but also one of the most complex. Well-designed HTML forms are: - Well-structured and semantically correct. - Easy to use and navigate (keyboard). - Accessible with ARIA attributes and proper labels. - Has support for client and server side validation. - Well-styled and consistent with the rest of the application. In this guide, we will take a look at building forms with :prose-a[vee-validate]{href="https://vee-validate.logaretm.com/v4/" target="\_blank"} and :prose-a[zod]{href="https://zod.dev/" target="\_blank"}. We're going to use a `` component to compose accessible forms using Reka UI components. ## Features The `
` component is a wrapper around the `vee-validate` library. It provides a few things: - Composable components for building forms. - A `` component for building controlled form fields. - Form validation using `zod`. - Applies the correct `aria` attributes to form fields based on states, handle unqiue IDs - Built to work with all Reka UI components. - Bring your own schema library. We use `zod` but you can use any other supported schema validation you want, like `yup` or `valibot`. - You have full control over the markup and styling. :prose-a[vee-validate]{href="https://vee-validate.logaretm.com/v4/" target="\_blank"} makes use of two flavors to add validation to your forms. - Composition API - Higher-order components (HOC) ## Anatomy ```html ``` The `` component is auto-imported by the `@vee-validate/nuxt` module. You can change the name of the impported components in your `nuxt.config .ts` file. You can visit :prose-a[here]{href="https://vee-validate.logaretm.com/v4/integrations/nuxt/" target="\_blank"} for more information. ## Source code Click :source-code-link{component="Form"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add form"} ## Usage ### User profile form ::show-case :docs-form-user #code ```vue [DocsFormUser.vue] ``` :: # Gradient Divider ## Source code Click :source-code-link{component="GradientDivider.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add gradient-divider"} ## Usage ::show-case :docs-gradient-divider #code ```vue [DocsGradientDivider.vue] ``` :: # Heading ## Source code Click :source-code-link{component="Heading.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add heading"} ## Usage ### Basic example ::show-case :docs-heading-basic #code ```vue [DocsHeadingBasic.vue] ``` :: # Hover Card ## Source code Click :source-code-link{component="HoverCard"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add hover-card"} ## Usage ### Basic ::show-case :docs-hover-card #code ```vue [DocsHoverCard.vue] ``` :: ### Vue ::show-case :docs-hover-card-vue #code ```vue [DocsHoverCardVue.vue] ``` :: # Icon ## Source code Click :source-code-link{component="Icon.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Anatomy The Icon component automatically detects the type of icon you want to display and renders it appropriately. ```vue [Icon Anatomy.vue] ``` ## Installation :prose-pm-x{command="ui-thing@latest add icon"} ## Usage ### Iconify Icons The primary use case is displaying icons from Iconify's vast collection of icon sets. Simply use the format `collection:icon-name`. ::show-case :docs-icon #code ```vue [DocsIcon.vue] ``` :: ### Different Sizes Control the size of icons using the `size` prop. It accepts both numbers (pixels) and strings. ::show-case :docs-icon-sizes #code ```vue [DocsIconSizes.vue] ``` :: ### Emojis The component automatically detects and renders emojis properly. ::show-case :docs-icon-emoji #code ```vue [DocsIconEmoji.vue] ``` :: ### Custom Images You can also use custom image URLs. The component will render them as `` tags. ::show-case :docs-icon-image #code ```vue [DocsIconImage.vue] ``` :: ### With Colors Style icons using Tailwind classes. The component inherits color from the parent context. ::show-case :docs-icon-colors #code ```vue [DocsIconColors.vue] ``` :: ### In Buttons Icons work seamlessly with other components like buttons. ::show-case :docs-icon-button #code ```vue [DocsIconButton.vue] ``` :: ### Popular Icon Sets Here are some popular icon sets you can use with the component: ::show-case :docs-icon-sets #code ```vue [DocsIconSets.vue] ``` :: ## Features - **Automatic Detection**: Intelligently detects whether the input is an Iconify icon, emoji, or image URL - **Vast Icon Library**: Access to 200,000+ icons from Iconify's collection - **Flexible Sizing**: Support for both numeric and string size values - **Emoji Support**: Built-in emoji rendering with proper sizing - **Image URLs**: Fallback to image rendering for custom icons - **Type Safe**: Full TypeScript support with proper type definitions - **Class Support**: Accepts Tailwind and custom classes for styling ## Props ```ts interface IconProps { /** * The icon to display. Can be: * - Iconify icon name (e.g., "lucide:home") * - Emoji (e.g., "🚀") * - Image URL (e.g., "https://example.com/icon.png") */ name: string; /** * Size of the icon in pixels * @default 16 */ size?: number | string; } ``` ## Finding Icons To find icons from Iconify's collection: 1. Visit [Iconify Icon Sets](https://icon-sets.iconify.design/){rel=""nofollow""} 2. Search for the icon you want 3. Copy the icon name in the format `collection:icon-name` 4. Use it in your component: `` ## Popular Icon Collections - **Lucide** (`lucide:`) - Modern, clean icons - **Heroicons** (`heroicons:`) - Tailwind CSS icons - **Material Design** (`mdi:`) - Google's Material Design - **Tabler Icons** (`tabler:`) - Open source icons - **Remix Icon** (`ri:`) - Neutral-style icons - **Simple Icons** (`simple-icons:`) - Brand icons - **Font Awesome** (`fa6-solid:`, `fa6-regular:`) - Popular icon set ## Customization The Icon component is highly flexible and can be styled using Tailwind classes: ```vue ``` # Iframe (Lazy) ## Source code Click :source-code-link{component="IframeLazy.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add iframe-lazy"} ## Usage ### Basic The simplest way to use the component is by passing a `src` prop. The iframe will load only when it comes into view. ::show-case :docs-iframe-lazy #code ```vue [DocsIframeLazy.vue] ``` :: ### Custom Placeholder You can customize the placeholder shown before the iframe loads using the `#placeholder` slot. ::show-case :docs-iframe-lazy-custom-placeholder #code ```vue [DocsIframeLazyCustomPlaceholder.vue] ``` :: ### Eager Loading Set `loading="eager"` to load the iframe immediately without waiting for intersection. ::show-case :docs-iframe-lazy-eager #code ```vue [DocsIframeLazyEager.vue] ``` :: ### No Placeholder Disable the placeholder by setting `placeholder` to `false`. ::show-case :docs-iframe-lazy-no-placeholder #code ```vue [DocsIframeLazyNoPlaceholder.vue] ``` :: ### With Load Event Listen to the `@load` event to know when the iframe has finished loading. ::show-case :docs-iframe-lazy-load-event #code ```vue [DocsIframeLazyLoadEvent.vue] ``` :: ### Custom Root Margin Adjust when the iframe loads by changing the `rootMargin`. Positive values trigger loading earlier, negative values later. ::show-case :docs-iframe-lazy-root-margin #code ```vue [DocsIframeLazyRootMargin.vue] ``` :: ### Multiple Iframes Use multiple lazy-loaded iframes on the same page for better performance. ::show-case :docs-iframe-lazy-multiple #code ```vue [DocsIframeLazyMultiple.vue] ``` :: ## Props | Prop | Type | Default | Description | | --------------- | ------------------- | ----------- | ------------------------------------------------------------------------------ | | `src` | `string` | `undefined` | The URL of the page to embed in the iframe | | `class` | `string` | `undefined` | Additional classes to apply to the wrapper element | | `iframeClass` | `string` | `undefined` | Additional classes to apply to the iframe element | | `loading` | `"lazy" | "eager"` | `"lazy"` | When to load the iframe - lazy waits for intersection, eager loads immediately | | `placeholder` | `boolean` | `true` | Whether to show a placeholder before the iframe loads | | `rootMargin` | `string` | `"150px"` | Margin around the root for intersection detection (e.g., "150px", "20%") | | `threshold` | `number | number[]` | `0` | Threshold for intersection detection (0.0 to 1.0) | | `disableScroll` | `boolean` | `false` | Disable scrolling within the iframe | ## Events | Event | Payload | Description | | ------ | ------- | ---------------------------------------- | | `load` | `Event` | Emitted when the iframe finishes loading | ## Slots | Slot | Props | Description | | ------------- | ----- | ---------------------------------------------- | | `placeholder` | - | Custom content to show before the iframe loads | ## Features - **Lazy Loading**: Iframes only load when they enter the viewport, improving page performance - **Intersection Observer**: Uses modern browser API for efficient viewport detection - **Custom Placeholders**: Show loading states, skeletons, or custom content while waiting - **Flexible Configuration**: Control when loading triggers with `rootMargin` and `threshold` - **Load Events**: React to iframe load completion with the `@load` event - **Performance**: Reduces initial page load time and bandwidth usage - **Accessible**: Maintains proper iframe attributes like `allowfullscreen` ## Use Cases - Embedding third-party content (YouTube, maps, documentation) - Loading multiple iframes on documentation pages - Deferring heavy content until needed - Improving Core Web Vitals scores - Reducing initial page weight and load time # Input ## Source code Click :source-code-link{component="Input.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add input"} ## Usage ### Email ::show-case :docs-input-email #code ```vue [DocsInputEmail.vue] ``` :: ### Disabled ::show-case :docs-input-disabled #code ```vue [DocsInputDisabled.vue] ``` :: ### Label ::show-case :docs-input-label #code ```vue [DocsInputLabel.vue] ``` :: ### Form ::show-case :docs-input-form #code ```vue [DocsInputForm.vue] ``` :: ### Max Length Restrict the number of characters that can be entered into the input field. ::show-case :docs-input-max-length #code ```vue [DocsInputMaxLength.vue] ``` :: ### Pattern Restrict the type of characters that can be entered into the input field. You don't need to use `/` at the beginning and end of the pattern as the RegExp is being created internally with the `new RegExp()` constructor. ::show-case :docs-input-pattern #code ```vue [DocsInputPattern.vue] ``` :: # Input Group ## Source code Click :source-code-link{component="InputGroup"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add input-group"} ## Usage ### Basic ::show-case :docs-input-group #code ```vue [DocsInputGroup.vue] ``` :: ### Icon ::show-case :docs-input-group-icon #code ```vue [DocsInputGroupIcon.vue] ``` :: ### Text ::show-case :docs-input-group-text #code ```vue [DocsInputGroupText.vue] ``` :: ### Button ::show-case :docs-input-group-button #code ```vue [DocsInputGroupButton.vue] ``` :: ### Tooltip ::show-case :docs-input-group-tooltip #code ```vue [DocsInputGroupTooltip.vue] ``` :: ### Textarea ::show-case :docs-input-group-textarea #code ```vue [DocsInputGroupTextarea.vue] ``` :: ### Loader ::show-case :docs-input-group-loader #code ```vue [DocsInputGroupLoader.vue] ``` :: ### Label ::show-case :docs-input-group-label #code ```vue [DocsInputGroupLabel.vue] ``` :: ### Dropdown ::show-case :docs-input-group-dropdown #code ```vue [DocsInputGroupDropdown.vue] ``` :: # Item The `Item` component is a straightforward flex container that can house nearly any type of content. Use it to display a title, description, and actions. Group it with the `ItemGroup` component to create a list of items. ## Source code Click :source-code-link{component="Item"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add item"} ## Usage ```vue ``` ## Item vs Field Use `Field` if you need to display a form input such as a checkbox, input, radio, or select. If you only need to display content such as a title, description, and actions, use `Item`. ## Examples ### Basic ::show-case :docs-item #code ```vue [DocsItem.vue] ``` :: ### Variants ::show-case :docs-item-variants #code ```vue [DocsItemVariants.vue] ``` :: ### Size The `Item` component has different sizes for different use cases. For example, you can use the `sm` size for a compact item or the `default` size for a standard item. ::show-case :docs-item-size #code ```vue [DocsItemSize.vue] ``` :: ### Icon ::show-case :docs-item-icon #code ```vue [DocsItemIcon.vue] ``` :: ### Avatar ::show-case :docs-item-avatar #code ```vue [DocsItemAvatar.vue] ``` :: ### Image ::show-case :docs-item-image #code ```vue [DocsItemImage.vue] ``` :: ### Group ::show-case :docs-item-group #code ```vue [DocsItemGroup.vue] ``` :: ### Header ::show-case :docs-item-header #code ```vue [DocsItemHeader.vue] ``` :: ### Link To render an item as a link, use the `as-child` prop. The hover and focus states will be applied to the anchor element. ::show-case :docs-item-link #code ```vue [DocsItemLink.vue] ``` :: ### Dropdown ::show-case :docs-item-dropdown #code ```vue [DocsItemDropdown.vue] ``` :: # Keyboard Key ## Source code Click :source-code-link{component="Kbd.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add kbd"} ## Usage ```vue ``` ## Examples ### Basic ::show-case :docs-kbd #code ```vue [DocsKbd.vue] ``` :: ### Group Use the `KbdGroup` component to group keyboard keys together. ::show-case :docs-kbd-group #code ```vue [DocsKbdGroup.vue] ``` :: ### Button Use the `Kbd` component inside a `Button` component to display a keyboard key inside a button. ::show-case :docs-kbd-button #code ```vue [DocsKbdButton.vue] ``` :: ### Tooltip You can use the `Kbd` component inside a `Tooltip` component to display a tooltip with a keyboard key. ::show-case :docs-kbd-tooltip #code ```vue [DocsKbdTooltip.vue] ``` :: ### Input Group You can use the `Kbd` component inside a `InputGroupAddon` component to display a keyboard key inside an input group. ::show-case :docs-kbd-input-group #code ```vue [DocsKbdInputGroup.vue] ``` :: ### Sizes ::show-case :docs-kbd-sizes #code ```vue [DocsKbdSizes.vue] ``` :: ### Variants ::show-case :docs-kbd-variants #code ```vue [DocsKbdVariants.vue] ``` :: # Label ## Source code Click :source-code-link{component="Label.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add label"} ## Usage ### Input ::show-case :docs-input-label #code ```vue [DocsInputLabel.vue] ``` :: # List ## Source code Click :source-code-link{component="List"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add list"} ## Usage ### Basic ::show-case :docs-list-basic #code ```vue [DocsListBasic.vue] ``` :: ### Mini cart ::show-case :docs-list-products #code ```vue [DocsListProducts.vue] ``` :: ### Navigation list ::show-case :docs-list-nav #code ```vue [DocsListNav.vue] ``` :: # Listbox ## Source code Click :source-code-link{component="Listbox"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add listbox"} ## Usage ### Basic ::show-case :docs-listbox-basic #code ```vue [DocsListboxBasic.vue] ``` :: ### Objects ::show-case :docs-listbox-objects #code ```vue [DocsListboxObjects.vue] ``` :: ### Multiple - Strings ::show-case :docs-listbox-string-multiple #code ```vue [DocsListboxStringMultiple.vue] ``` :: ### Multiple - Objects ::show-case :docs-listbox-objects-multiple #code ```vue [DocsListboxObjectsMultiple.vue] ``` :: ### Virtualizer - Strings ::show-case :docs-listbox-string-virtualizer #code ```vue [DocsListboxStringVirtualizer.vue] ``` :: ### Origin UI ::show-case :docs-listbox-origin #code ```vue [DocsListboxOrigin.vue] ``` :: ### Transfer ::show-case :docs-listbox-transfer #code ```vue [DocsListboxTransfer.vue] ``` :: # Loader ## Source code Click :source-code-link{component="Loader.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add loader"} ## Usage ### Basic ::show-case :docs-loader-basic #code ```vue [DocsLoaderBasic.vue] ``` :: ### Variants So you can use any of the loaders located on the [Iconify Website](https://icones.js.org/collection/svg-spinners){rel=""nofollow""}. Simply copy the name of the loader and paste it into the `icon` prop. ::show-case :docs-loader-variants #code ```vue [DocsLoaderVariants.vue] ``` :: ### Sizes You can adjust the size of the loader by passing a CSS class to the `class` prop. ::show-case :docs-loader-sizes #code ```vue [DocsLoaderSizes.vue] ``` :: ### Colors You can adjust the color of the loader by passing a CSS class to the `class` prop. ::show-case :docs-loader-colors #code ```vue [DocsLoaderColors.vue] ``` :: ### Full Page Loader The loader can operate as a full page loader by passing the `full-page` prop. When the `full-page` prop is passed, the loader will take up the entire screen. It can be closed manually or by pressing the `esc` key. ::show-case :docs-loader-backdrop #code ```vue [DocsLoaderBackdrop.vue] ``` :: # Menubar ## Source code Click :source-code-link{component="Menubar"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add menubar"} ## Usage ### Full example ::show-case :docs-menubar #code ```vue [DocsMenubar.vue] ``` :: ### Simple A minimal menubar with keyboard shortcuts and disabled items — great as a starting point. ::show-case :docs-menubar-simple #code ```vue [DocsMenubarSimple.vue] ``` :: ### With labels Use `UiMenubarLabel` to visually group items within a menu into named sections. ::show-case :docs-menubar-with-labels #code ```vue [DocsMenubarWithLabels.vue] ``` :: ### Destructive items Use `variant="destructive"` on `UiMenubarItem` to highlight dangerous or irreversible actions. ::show-case :docs-menubar-destructive #code ```vue [DocsMenubarDestructive.vue] ``` :: ### Translucent Pass `translucent` to `UiMenubarContent` for a frosted-glass panel effect. ::show-case :docs-menubar-translucent #code ```vue [DocsMenubarTranslucent.vue] ``` :: # Nav ## Credits This component is a port of the one created by [Intent UI](https://intentui.com/docs/components/layouts/navbar){rel=""nofollow""}. Thanks to them for their work! ## Source code Click :source-code-link{component="Nav"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add nav"} ## Usage ### Default ::show-case :docs-nav1 #code ```vue [DocsNav1.vue] ``` :: ### Inset ::show-case :docs-nav-inset #code ```vue [DocsNavInset.vue] ``` :: ### Floating ::show-case :docs-nav-floating #code ```vue [DocsNavFloating.vue] ``` :: # Navbar ## Source code Click :source-code-link{component="Navbar.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add navbar"} ## Usage ### Basic ::show-case :docs-navbar #code ```vue [DocsNavbar.vue] ``` :: ## Origin UI ### One ::show-case :docs-origin-navbar1 #code ```vue [DocsOriginNavbar1.vue] ``` :: ### Two ::show-case :docs-origin-navbar2 #code ```vue [DocsOriginNavbar2.vue] ``` :: ### Three ::show-case :docs-origin-navbar3 #code ```vue [DocsOriginNavbar3.vue] ``` :: # Navigation Menu ## Source code Click :source-code-link{component="NavigationMenu"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add navigation-menu"} ## Anatomy ```vue ``` ## Usage ### Horizontal Navigation Menu The default orientation of the Navigation Menu is horizontal. ::show-case :docs-navigation-menu #code ```vue [DocsNavigationMenu.vue] ``` :: ### Shadcn UI The default orientation of the Navigation Menu is horizontal. ::show-case :docs-navigation-menu-shadcn #code ```vue [DocsNavigationMenuShadcn.vue] ``` :: # Number Field ## Source code Click :source-code-link{component="NumberField"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add number-field"} ## Usage ### Basic ::show-case :docs-number-field #code ```vue [DocsNumberField.vue] ``` :: ### Disabled ::show-case :docs-number-field-disabled #code ```vue [DocsNumberFieldDisabled.vue] ``` :: ### Decimal ::show-case :docs-number-field-decimal #code ```vue [DocsNumberFieldDecimal.vue] ``` :: ### Percent ::show-case :docs-number-field-percent #code ```vue [DocsNumberFieldPercent.vue] ``` :: ### Currency ::show-case :docs-number-field-currency #code ```vue [DocsNumberFieldCurrency.vue] ``` :: ### Custom ::show-case :docs-number-field-custom #code ```vue [DocsNumberFieldCustom.vue] ``` :: # Pagination ## Source code Click :source-code-link{component="Pagination"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add pagination"} ## Anatomy ```vue ``` ## Usage ### Full example ::show-case :docs-pagination #code ```vue [DocsPagination.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/breadcrumbs-paginations){rel=""nofollow""} ❤️. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Apart ::show-case :docs-pagination-apart #code ```vue [DocsPaginationApart.vue] ``` :: ### Info Center ::show-case :docs-pagination-info-center #code ```vue [DocsPaginationInfoCenter.vue] ``` :: ### Info Start & End ::show-case :docs-pagination-info-start-end #code ```vue [DocsPaginationInfoStartEnd.vue] ``` :: ### Bootstrap ::show-case :docs-pagination-bootstrap #code ```vue [DocsPaginationBootstrap.vue] ``` :: ### Table ::show-case :docs-pagination-table #code ```vue [DocsPaginationTable.vue] ``` :: # Pin Input ## Source code Click :source-code-link{component="PinInput"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add pin-input"} ## Usage ### Placeholder Passing a value to the placeholder prop will render a placeholder character in each input. ::show-case :docs-pin-input #code ```vue [DocsPinInput.vue] ``` :: ### Separator Passing a value to the separator prop will render a separator character between each input. ::show-case :docs-pin-input-separator #code ```vue [DocsPinInputSeparator.vue] ``` :: ### Complete event The complete event is emitted when the user has entered a value in all inputs. ::show-case :docs-pin-input-complete #code ```vue [DocsPinInputComplete.vue] ``` :: ### Origin UI ::show-case :docs-pin-input-origin #code ```vue [DocsPinInputOrigin.vue] ``` :: # Placeholder ## Source code Click :source-code-link{component="Placeholder.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add placeholder"} ## Usage ::show-case :docs-placeholder #code ```vue [DocsPlaceholder.vue] ``` :: # Pointer Highlight ## Source code Click :source-code-link{component="PointerHighlight.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add pointer-highlight"} ## Usage ### Inline text ::show-case :docs-pointer-highlight-inline #code ```vue [DocsPointerHighlightInline.vue] ``` :: ### Basic example ::show-case :docs-pointer-highlight-basic #code ```vue [DocsPointerHighlightBasic.vue] ``` :: ### Animated background ::show-case :docs-pointer-highlight-background #code ```vue [DocsPointerHighlightBackground.vue] ``` :: ### Styled card ::show-case :docs-pointer-highlight-card #code ```vue [DocsPointerHighlightCard.vue] ``` :: ### Marketing grid ::show-case :docs-pointer-highlight-marketing #code ```vue [DocsPointerHighlightMarketing.vue] ``` :: ### Class customization Use `containerClass`, `rectangleClass`, and `pointerClass` to control the spacing and appearance of the highlight treatment. ::show-case :docs-pointer-highlight-classes #code ```vue [DocsPointerHighlightClasses.vue] ``` :: # Popover ## Source code Click :source-code-link{component="Popover"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add popover"} ## Anatomy ```vue ``` ## Usage ### Full example ::show-case :docs-popover #code ```vue [DocsPopover.vue] ``` :: ### Origin UI ::show-case :docs-popover-origin #code ```vue [DocsPopoverOrigin.vue] ``` :: # Progress ## Source code Click :source-code-link{component="Progress"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add progress"} ## Anatomy ```vue ``` ## Usage ### Full example ::show-case :docs-progress #code ```vue [DocsProgress.vue] ``` :: ### Loader ::show-case :docs-progress-loading #code ```vue [DocsProgressLoading.vue] ``` :: # QR Code ## Source code Click :source-code-link{component="QRCode"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add qrcode"} ## Usage ### Basic ::show-case :docs-q-r-code-basic #code ```vue [DocsQRCodeBasic.vue] ``` :: ### Large Size ::show-case :docs-q-r-code-large #code ```vue [DocsQRCodeLarge.vue] ``` :: ### Custom Frame Handles ::show-case :docs-q-r-code-custom-handles #code ```vue [DocsQRCodeCustomHandles.vue] ``` :: ### With Gradient Scan ::show-case :docs-q-r-code-gradient-scan #code ```vue [DocsQRCodeGradientScan.vue] ``` :: ### Dynamic Value Update ::show-case :docs-q-r-code-dynamic #code ```vue [DocsQRCodeDynamic.vue] ``` :: ### With Custom Options ::show-case :docs-q-r-code-custom-options #code ```vue [DocsQRCodeCustomOptions.vue] ``` :: ### Full Featured ::show-case :docs-q-r-code-full #code ```vue [DocsQRCodeFull.vue] ``` :: ## Props | Prop | Type | Default | Description | | --------- | ---------------------- | ----------- | --------------------------------------------------- | | `value` | `string` | required | The value to encode in the QR code | | `size` | `'md' | 'lg'` | `'md'` | The size of the QR code | | `options` | `QRCodeStylingOptions` | `undefined` | Additional options to customize the QR code styling | | `class` | `string` | `undefined` | Additional CSS classes to apply to the root element | ## Slots | Slot | Description | | -------------- | --------------------------------------------- | | `top-left` | Slot for the top-left frame handle | | `top-right` | Slot for the top-right frame handle | | `bottom-right` | Slot for the bottom-right frame handle | | `bottom-left` | Slot for the bottom-left frame handle | | `overlay` | Slot for overlay content (like gradient scan) | ## Sub-Components ### Frame Handle The `UiQRCodeFrameHandle` component is used to display the corner handles of the QR code. It can be customized or hidden using the named slots. ### Gradient Scan The `UiQRCodeGradientScan` component creates a gradient scanning effect overlay on the QR code, commonly seen in modern QR code designs. ## Notes - The QR code uses the [qr-code-styling](https://www.npmjs.com/package/qr-code-styling){rel=""nofollow""} library for generation and rendering - QR codes are rendered as SVG for scalability and crisp rendering - All size variants are responsive and accessible - The component automatically updates when the `value` prop or `options` change # Radio Group ## Source code Click :source-code-link{component="RadioGroup"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add radio-group"} ## Anatomy ```vue ``` ## Usage ### Default value ::show-case :docs-radio-group #code ```vue [DocsRadioGroup.vue] ``` :: ### Form ::show-case :docs-radio-group-form #code ```vue [DocsRadioGroupForm.vue] ``` :: # Rating ## Source code Click :source-code-link{component="Rating.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add rating"} ## Usage ### Basic ::show-case :docs-rating #code ```vue [DocsRating.vue] ``` :: ### Decimal ::show-case :docs-rating-decimal #code ```vue [DocsRatingDecimal.vue] ``` :: ### Show Rating ::show-case :docs-rating-show-value #code ```vue [DocsRatingShowValue.vue] ``` :: ### Editable ::show-case :docs-rating-editable #code ```vue [DocsRatingEditable.vue] ``` :: ### Size ::show-case :docs-rating-size #code ```vue [DocsRatingSize.vue] ``` :: ### Icons ::show-case :docs-rating-icons #code ```vue [DocsRatingIcons.vue] ``` :: ### Statistics ::show-case :docs-rating-statistics #code ```vue [DocsRatingStatistics.vue] ``` :: # Scroll Area ## Source code Click :source-code-link{component="ScrollArea"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add scroll-area"} ## Usage ```vue ``` ### Basic example ::show-case :docs-scroll-area #code ```vue [DocsScrollArea.vue] ``` :: ### Horizontal scroll ::show-case :docs-scroll-area-horizontal #code ```vue [DocsScrollAreaHorizontal.vue] ``` :: # Scrollspy ## Source code Click :source-code-link{component="Scrollspy.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add scrollspy"} ## Usage ### Component ::show-case :docs-scrollspy #code ```vue [DocsScrollspy.vue] ``` :: ### Multiple active links Set `mode="multiple"` when you want every currently visible heading or section to receive `data-active="true"` instead of only the single current section. ```vue {{ item.label }} ``` The composable also exposes `activeIds` so you can react to the full visible set while still using `activeId` as the canonical current section for history and change events. ### Composable ::show-case :docs-scrollspy-composable #code ```vue [DocsScrollspyComposable.vue] ``` :: ### Horizontal ::show-case :docs-scrollspy-horizontal #code ```vue [DocsScrollspyHorizontal.vue] ``` :: # Select ## Source code Click :source-code-link{component="Select"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add select"} ## Usage ### Basic example ::show-case :docs-select #code ```vue [DocsSelect.vue] ``` :: ### Scrollable ::show-case :docs-select-scrollable #code ```vue [DocsSelectScrollable.vue] ``` :: ### Form ::show-case :docs-select-form #code ```vue [DocsSelectForm.vue] ``` :: ### Origin UI ::show-case :docs-select-origin #code ```vue [DocsSelectOrigin.vue] ``` :: # Select - Native ## Source code Click :source-code-link{component="NativeSelect.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add native-select"} ## Origin UI Examples ::show-case :docs-native-select-origin #code ```vue [DocsNativeSelectOrigin.vue] ``` :: # Separator ## Source code Click :source-code-link{component="Separator.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add separator"} ## Usage ### Basic example ::show-case :docs-separator #code ```vue [DocsSeparator.vue] ``` :: # Sheet ## Source code Click :source-code-link{component="Sheet"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add sheet"} ## Usage ### Right side sheet (default) ::show-case :docs-sheet #code ```vue [DocsSheet.vue] ``` :: ### Left side sheet ::show-case :docs-sheet-left #code ```vue [DocsSheetLeft.vue] ``` :: ### Bottom sheet ::show-case :docs-sheet-bottom #code ```vue [DocsSheetBottom.vue] ``` :: ### Top sheet ::show-case :docs-sheet-top #code ```vue [DocsSheetTop.vue] ``` :: ### No blur overlay ::show-case :docs-sheet-no-blur #code ```vue [DocsSheetNoBlur.vue] ``` :: ### Floating variant ::show-case :docs-sheet-floating #code ```vue [DocsSheetFloating.vue] ``` :: ### Interactive playground ::show-case :docs-sheet-interactive #code ```vue [DocsSheetInteractive.vue] ``` :: ### Fullscreen control ::show-case :docs-sheet-fullscreen #code ```vue [DocsSheetFullscreen.vue] ``` :: # Sidebar ## Source code Click :source-code-link{component="Sidebar"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add sidebar"} ## Usage You should always ensure that you have all parts of the `Sidebar` components wrapped in a `UiSidebarProvider` component. This is to ensure that the sidebar can be toggled on and off. ```vue [app.vue] ``` ### First Sidebar Let's start with the most basic sidebar. A collapsible sidebar with a menu. ::block-showcase --- block-path: Sidebar/BlockSidebarFirstSidebar component: BlockSidebarFirstSidebar container-class: h-screen iframe-height: 600px --- :: The code. Take note of the `UiSidebarTrigger` component. This is what toggles the sidebar. Also, the `UiSidebarInset` component! When I just started using this component, I was confused as to where the page content should go. ```vue [BlockSidebarFirstSidebar.vue] ``` ## SidebarHeader Use the `UiSidebarHeader` component to add a sticky header to the sidebar. The following example adds a `` to the `UiSidebarHeader`. ::block-showcase --- block-path: Sidebar/BlockSidebarHeader component: BlockSidebarHeader container-class: h-screen iframe-height: 600px --- :: ## SidebarFooter Use the `UiSidebarFooter` component to add a sticky footer to the sidebar. The following example adds a `` to the `UiSidebarFooter`. ::block-showcase --- block-path: Sidebar/BlockSidebarFooter component: BlockSidebarFooter container-class: h-screen iframe-height: 600px --- :: ## Collapsible SidebarGroup To make a `UiSidebarGroup` collapsible, wrap it in a `UiCollapsible`. ::block-showcase --- block-path: Sidebar/BlockSidebarCollapsibleSideGroup component: BlockSidebarCollapsibleSideGroup container-class: h-screen iframe-height: 600px --- :: We wrap the `UiCollapsibleTrigger` in a `UiSidebarGroupLabel` to render a button. ## SidebarGroupAction Use the `UiSidebarGroupAction` component to add an action button to the `UiSidebarGroup`. ::block-showcase --- block-path: Sidebar/BlockSidebarSidebarGroupAction component: BlockSidebarSidebarGroupAction container-class: h-screen iframe-height: 600px --- :: ## SidebarMenuAction The `UiSidebarMenuAction` component is used to render a menu action within a `UiSidebarMenuItem`. This button works independently of the `UiSidebarMenuButton` i.e you can have the `` as a clickable link and the `` as a button. ::block-showcase --- block-path: Sidebar/BlockSidebarSidebarMenuAction component: BlockSidebarSidebarMenuAction container-class: h-screen iframe-height: 600px --- :: ## SidebarMenuSub The `UiSidebarMenuSub` component is used to render a submenu within a `UiSidebarMenu`. Use `` and `` to render a submenu item. ::block-showcase --- block-path: Sidebar/BlockSidebarSidebarMenuSub component: BlockSidebarSidebarMenuSub container-class: h-screen iframe-height: 600px --- :: ## Collapsible SidebarMenu To make a `UiSidebarMenu` component collapsible, wrap it and the `UiSidebarMenuSub` components in a `UiCollapsible`. ::block-showcase --- block-path: Sidebar/BlockSidebarSidebarMenuSubCollapsible component: BlockSidebarSidebarMenuSubCollapsible container-class: h-screen iframe-height: 600px --- :: ## SidebarMenuBadge The `UiSidebarMenuBadge` component is used to render a badge within a `UiSidebarMenuItem`. ::block-showcase --- block-path: Sidebar/BlockSidebarSidebarMenuBadge component: BlockSidebarSidebarMenuBadge container-class: h-screen iframe-height: 600px --- :: ## SidebarRail The `UiSidebarRail` component is used to render a rail within a `UiSidebar`. This rail can be used to toggle the sidebar. ::block-showcase --- block-path: Sidebar/BlockSidebarSidebarRail component: BlockSidebarSidebarRail container-class: h-screen iframe-height: 600px --- :: ## Controlled Sidebar Use the `v-model:open` directive to control the visibility of the sidebar. This should be added to the `UiSidebarProvider` component. You can even model this to local storage with the help of [useStorage](https://vueuse.org/core/useStorage/){rel=""nofollow""} from VueUse. You can even use Pinia to store the state of the sidebar & make it global. ::block-showcase --- block-path: Sidebar/BlockSidebarControlled component: BlockSidebarControlled container-class: h-screen iframe-height: 600px --- :: # Skeleton ## Source code Click :source-code-link{component="Skeleton.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add skeleton"} ## Usage ### Profile skeleton ::show-case :docs-skeleton #code ```vue [DocsSkeleton.vue] ``` :: ### Text skeleton ::show-case :docs-skeleton-text #code ```vue [DocsSkeletonText.vue] ``` :: ### Card skeleton ::show-case :docs-skeleton-card #code ```vue [DocsSkeletonCard.vue] ``` :: ### List skeleton ::show-case :docs-skeleton-list #code ```vue [DocsSkeletonList.vue] ``` :: ### Form skeleton ::show-case :docs-skeleton-form #code ```vue [DocsSkeletonForm.vue] ``` :: ### Table skeleton ::show-case :docs-skeleton-table #code ```vue [DocsSkeletonTable.vue] ``` :: # Slider ## Source code Click :source-code-link{component="Slider"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add slider"} ## Usage ### Basic example ::show-case :docs-slider #code ```vue [DocsSlider.vue] ``` :: ### Multiple thumbs ::show-case :docs-slider-multiple #code ```vue [DocsSliderMultiple.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/sliders){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Square Thumb ::show-case :docs-slider-square-thumb #code ```vue [DocsSliderSquareThumb.vue] ``` :: ### Solid Thumb ::show-case :docs-slider-solid-thumb #code ```vue [DocsSliderSolidThumb.vue] ``` :: ### Tiny Thumb ::show-case :docs-slider-tiny-thumb #code ```vue [DocsSliderTinyThumb.vue] ``` :: ### Reference Labels ::show-case :docs-slider-reference-labels #code ```vue [DocsSliderReferenceLabels.vue] ``` :: ### Ticks ::show-case :docs-slider-ticks #code ```vue [DocsSliderTicks.vue] ``` :: ### Slider w/ Output ::show-case :docs-slider-output #code ```vue [DocsSliderOutput.vue] ``` :: ### Slider w/ Labels ::show-case :docs-slider-labels #code ```vue [DocsSliderLabels.vue] ``` :: ### Slider w/ Labels & Tooltip ::show-case :docs-slider-labels-tooltips #code ```vue [DocsSliderLabelsTooltips.vue] ``` :: ### Dual Range ::show-case :docs-slider-dual-range #code ```vue [DocsSliderDualRange.vue] ``` :: ### Dual Range w/ Output ::show-case :docs-slider-dual-range-output #code ```vue [DocsSliderDualRangeOutput.vue] ``` :: ### Volume ::show-case :docs-slider-volume #code ```vue [DocsSliderVolume.vue] ``` :: ### Temperature ::show-case :docs-slider-temperature #code ```vue [DocsSliderTemperature.vue] ``` :: ### Input ::show-case :docs-slider-input #code ```vue [DocsSliderInput.vue] ``` :: ### Rate your experience ::show-case :docs-slider-rate-exp1 #code ```vue [DocsSliderRateExp1.vue] ``` :: ### Rate your experience (tooltip) ::show-case :docs-slider-rate-exp-tooltip #code ```vue [DocsSliderRateExpTooltip.vue] ``` :: ### Dual Range w/ Input ::show-case :docs-slider-dual-range-input #code ```vue [DocsSliderDualRangeInput.vue] ``` :: ### Credits per Month ::show-case :docs-slider-credits-per-month #code ```vue [DocsSliderCreditsPerMonth.vue] ``` :: ### Money Range ::show-case :docs-slider-money-range #code ```vue [DocsSliderMoneyRange.vue] ``` :: ### Vertical ::show-case :docs-slider-vertical #code ```vue [DocsSliderVertical.vue] ``` :: ### Vertical Input ::show-case :docs-slider-vertical-input #code ```vue [DocsSliderVerticalInput.vue] ``` :: ### Vertical Dual Range w/ Tooltip ::show-case :docs-slider-vertical-dual-tooltip #code ```vue [DocsSliderVerticalDualTooltip.vue] ``` :: ### Object Position ::show-case :docs-slider-object-position #code ```vue [DocsSliderObjectPosition.vue] ``` :: ### Price ::show-case :docs-slider-price #code ```vue [DocsSliderPrice.vue] ``` :: ### Equalizer ::show-case :docs-slider-equalizer #code ```vue [DocsSliderEqualizer.vue] ``` :: # Sonner ## Source code Click :source-code-link{component="Sonner.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add sonner"} Add the `` component to your `app.vue` file: ```vue [app.vue] noFormat ``` ## Usage ### Full example ::show-case :docs-sonner #code ```vue [DocsSonner.vue] ``` :: For the custom element, this is what the code looks like ```vue [DocsSonnerHeadless.vue] ``` # Splitter ## Source code Click :source-code-link{component="Splitter"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add splitter"} ## Usage ### Basic We can put the parts together to build a simple layout with a resizable sidebar. ::show-case :docs-splitter-basic #code ```vue [DocsSplitterBasic.vue] ``` :: ### Handle We can pass teh `withHandle` prop to the `UiSplitterHandle` component to show a handle. We can even pass in a custom icon to display for the handle. Do note that the handle will be rotated because of this class that is added to it `[&[data-orientation=vertical]>div]:rotate-90`. ::show-case :docs-splitter-handle #code ```vue [DocsSplitterHandle.vue] ``` :: ### Collapsible We can use the `collapsible` prop to make the panels go down to the `collapsedSize` when the `minSize` is reached. ::show-case :docs-splitter-collapsible #code ```vue [DocsSplitterCollapsible.vue] ``` :: ### Persist Layout with SSR We can use the `autoSaveId` prop to persist the layout data into the local storage. Try changing the layout and then refresh the page to see the layout persist. ::show-case :docs-splitter-persist #code ```vue [DocsSplitterPersist.vue] ``` :: # Stepper ## Source code Click :source-code-link{component="Stepper"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add stepper"} ### Origin UI ::show-case :docs-stepper-origin #code ```vue [DocsStepperOrigin.vue] ``` :: # Switch ## Source code Click :source-code-link{component="Switch"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add switch"} ## Usage ### Basic example ::show-case :docs-switch #code ```vue [DocsSwitch.vue] ``` :: ### Form ::show-case :docs-switch-form #code ```vue [DocsSwitchForm.vue] ``` :: ### Origin UI ::show-case :docs-switch-origin #code ```vue [DocsSwitchOrigin.vue] ``` :: # Table ## Source code Click :source-code-link{component="Table"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add table"} ## Usage ### Basic example ::show-case :docs-table #code ```vue [DocsTable.vue] ``` :: ### Simple ::show-case :docs-table-simple #code ```vue [DocsTableSimple.vue] ``` :: ### Stacked on mobile ::show-case :docs-table-stacked-mobile #code ```vue [DocsTableStackedMobile.vue] ``` :: ### Sticky header ::show-case :docs-table-sticky-header #code ```vue [DocsTableStickyHeader.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/tables){rel=""nofollow""} ❤️. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Basic Table ::show-case :docs-table-basic #code ```vue [DocsTableBasic.vue] ``` :: ### Table with Images ::show-case :docs-table-images #code ```vue [DocsTableImages.vue] ``` :: ### Table No Horizontal Lines ::show-case :docs-table-no-horizontal-lines #code ```vue [DocsTableNoHorizontalLines.vue] ``` :: ### Striped Tabled ::show-case :docs-table-striped #code ```vue [DocsTableStriped.vue] ``` :: ### Vertical Lines ::show-case :docs-table-vertical-lines #code ```vue [DocsTableVerticalLines.vue] ``` :: ### Dense Table ::show-case :docs-table-dense #code ```vue [DocsTableDense.vue] ``` :: ### Row Selection ::show-case :docs-table-basic-row-selection #code ```vue [DocsTableBasicRowSelection.vue] ``` :: ### Card Table ::show-case :docs-table-card-table #code ```vue [DocsTableCardTable.vue] ``` :: ### Vertical Table ::show-case :docs-table-vertical #code ```vue [DocsTableVertical.vue] ``` :: ### Sticky Header 2 ::show-case :docs-table-sticky-header2 #code ```vue [DocsTableStickyHeader2.vue] ``` :: ### Browser Support ::show-case :docs-table-browser-support #code ```vue [DocsTableBrowserSupport.vue] ``` :: # Tabs ## Source code Click :source-code-link{component="Tabs"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add tabs"} ## Usage ### Basic example ::show-case :docs-tabs #code ```vue [DocsTabs.vue] ``` :: ### With Indicator Passing `:pill="false"` to the List and Trigger components will remove the background color from both components. This allows us to use the Indicator component to create a custom indicator. ::show-case :docs-tabs-indicator #code ```vue [DocsTabsIndicator.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/tabs){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### One ::show-case :docs-tabs1 #code ```vue [DocsTabs1.vue] ``` :: ### Two ::show-case :docs-tabs2 #code ```vue [DocsTabs2.vue] ``` :: ### Three ::show-case :docs-tabs3 #code ```vue [DocsTabs3.vue] ``` :: ### Four ::show-case :docs-tabs4 #code ```vue [DocsTabs4.vue] ``` :: ### Five ::show-case :docs-tabs5 #code ```vue [DocsTabs5.vue] ``` :: ### Six ::show-case :docs-tabs6 #code ```vue [DocsTabs6.vue] ``` :: ### Seven ::show-case :docs-tabs7 #code ```vue [DocsTabs7.vue] ``` :: ### Eight ::show-case :docs-tabs8 #code ```vue [DocsTabs8.vue] ``` :: ### Nine ::show-case :docs-tabs9 #code ```vue [DocsTabs9.vue] ``` :: ### Ten ::show-case :docs-tabs10 #code ```vue [DocsTabs10.vue] ``` :: ### Eleven ::show-case :docs-tabs11 #code ```vue [DocsTabs11.vue] ``` :: ### Twelve ::show-case :docs-tabs12 #code ```vue [DocsTabs12.vue] ``` :: ### Thirteen ::show-case :docs-tabs13 #code ```vue [DocsTabs13.vue] ``` :: ### Fourteen ::show-case :docs-tabs14 #code ```vue [DocsTabs14.vue] ``` :: ### Fifteen ::show-case :docs-tabs15 #code ```vue [DocsTabs15.vue] ``` :: ### Sixteen ::show-case :docs-tabs16 #code ```vue [DocsTabs16.vue] ``` :: ### Seventeen ::show-case :docs-tabs17 #code ```vue [DocsTabs17.vue] ``` :: ### Eighteen ::show-case :docs-tabs18 #code ```vue [DocsTabs18.vue] ``` :: ### Nineteen ::show-case :docs-tabs19 #code ```vue [DocsTabs19.vue] ``` :: ### Twenty ::show-case :docs-tabs20 #code ```vue [DocsTabs20.vue] ``` :: # Tags Input ## Source code Click :source-code-link{component="TagsInput"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add tags-input"} ## Usage ### Basic example ::show-case :docs-tags-input #code ```vue [DocsTagsInput.vue] ``` :: # Tanstack Table ## Source code Click :source-code-link{component="TanStackTable.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add tanstacktable"} ## Usage ### Regular ::show-case :docs-tan-stack-table #code ```vue [DocsTanStackTable.vue] ``` :: ### Basic ::show-case :docs-tan-stack-basic #code ```vue [DocsTanStackBasic.vue] ``` :: ### Filters ::show-case :docs-tan-stack-filters #code ```vue [DocsTanStackFilters.vue] ``` :: ### Simple (Auto-Generated Columns) Shows zero-config usage with automatic column generation from data keys. ::show-case :docs-tan-stack-simple #code ```vue [DocsTanStackSimple.vue] ``` :: ### Custom Columns Custom column definitions with formatted cells and styled badges. ::show-case :docs-tan-stack-custom-columns #code ```vue [DocsTanStackCustomColumns.vue] ``` :: ### With Slots Using slots to customize cell rendering with avatars and dropdowns. ::show-case :docs-tan-stack-slots #code ```vue [DocsTanStackSlots.vue] ``` :: ### With Footer Table footer with column totals using aggregation functions. ::show-case :docs-tan-stack-footer #code ```vue [DocsTanStackFooter.vue] ``` :: ### Minimal (No Footer) Clean table without footer controls for simple layouts. ::show-case :docs-tan-stack-minimal #code ```vue [DocsTanStackMinimal.vue] ``` :: ### Loading State Table with loading indicator - includes custom loader slot support. ::show-case :docs-tan-stack-loading #code ```vue [DocsTanStackLoading.vue] ``` :: ### Server-Side Pagination Manual pagination with server-side data fetching and search. Enable `manual-pagination` prop and listen to the `@update:pagination` event. ::show-case :docs-tan-stack-server-pagination #code ```vue [DocsTanStackServerPagination.vue] ``` :: ### Expansion Expandable rows to display additional details using the expansion feature. ::show-case :docs-tan-stack-expansion #code ```vue [DocsTanStackExpansion.vue] ``` :: ### Row Pinning Pin rows to the top or bottom. The table emits `update:rowPinning` and `row-pin` so parents can sync state. ::show-case :docs-tan-stack-pinning #code ```vue [DocsTanStackPinning.vue] ``` :: ### Column Pinning Opt-in header pin buttons let you pin columns left or right. Pinned columns are sticky to the table edges; override `--ui-table-pinned-bg` in CSS if you need a different background. Use `enable-column-pinning` and `show-column-pin-buttons` to render the controls, and listen to `update:columnPinning` / `column-pin` if you need to sync state. ::show-case :docs-tan-stack-column-pinning #code ```vue [DocsTanStackColumnPinning.vue] ``` :: ### Context Menu ::show-case :docs-tan-stack-context-menu #code ```vue [DocsTanStackContextMenu.vue] ``` :: # Textarea ## Source code Click :source-code-link{component="Textarea.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add textarea"} ## Usage ### Basic example ::show-case :docs-textarea #code ```vue [DocsTextarea.vue] ``` :: ### Label ::show-case :docs-textarea-label #code ```vue [DocsTextareaLabel.vue] ``` :: ### Form ::show-case :docs-textarea-form #code ```vue [DocsTextareaForm.vue] ``` :: ### Max Length Restrict the number of characters that can be entered into the textarea. ::show-case :docs-textarea-max-length #code ```vue [DocsTextareaMaxLength.vue] ``` :: ### Pattern Restrict the type of characters that can be entered into the textarea. You don't need to use `/` at the beginning and end of the pattern as the RegExp is being created internally with the `new RegExp()` constructor. ::show-case :docs-textarea-pattern #code ```vue [DocsTextareaPattern.vue] ``` :: # Timeline ## Credits Thanks to the team at [Origin UI](https://originui.com/timeline){rel=""nofollow""} for creating this component ❤️. I just made a vue version of it. ## Source code Click :source-code-link{component="Timeline"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add timeline"} ## Usage ### Basic ::show-case :docs-timeline #code ```vue [DocsTimeline.vue] ``` :: ### Date Left ::show-case :docs-timeline-date-left #code ```vue [DocsTimelineDateLeft.vue] ``` :: ### Date Top ::show-case :docs-timeline-date-top #code ```vue [DocsTimelineDateTop.vue] ``` :: ### Time Bottom ::show-case :docs-timeline-time-bottom #code ```vue [DocsTimelineTimeBottom.vue] ``` :: ### Check Icon ::show-case :docs-timeline-check-icon #code ```vue [DocsTimelineCheckIcon.vue] ``` :: ### Git ::show-case :docs-timeline-git #code ```vue [DocsTimelineGit.vue] ``` :: ### Card Content ::show-case :docs-timeline-card-content #code ```vue [DocsTimelineCardContent.vue] ``` :: ### Left & Right ::show-case :docs-timeline-left-right #code ```vue [DocsTimelineLeftRight.vue] ``` :: ### Card ::show-case :docs-timeline-card #code ```vue [DocsTimelineCard.vue] ``` :: ### Activity ::show-case :docs-timeline-activity #code ```vue [DocsTimelineActivity.vue] ``` :: ### Horizontal ::show-case :docs-timeline-horizontal #code ```vue [DocsTimelineHorizontal.vue] ``` :: ### Horizontal - Date Top ::show-case :docs-timeline-horizontal-date-top #code ```vue [DocsTimelineHorizontalDateTop.vue] ``` :: # Toggle ## Source code Click :source-code-link{component="Toggle.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add toggle"} ## Usage ### Basic example ::show-case :docs-toggle #code ```vue [DocsToggle.vue] ``` :: # Toggle Group ## Source code Click :source-code-link{component="ToggleGroup"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add toggle-group"} ## Usage ### Basic ::show-case :docs-toggle-group-basic #code ```vue [DocsToggleGroupBasic.vue] ``` :: ### Outline ::show-case :docs-toggle-group-outline #code ```vue [DocsToggleGroupOutline.vue] ``` :: ### Multiple ::show-case :docs-toggle-group-multiple #code ```vue [DocsToggleGroupMultiple.vue] ``` :: ### Sizes ::show-case :docs-toggle-group-size #code ```vue [DocsToggleGroupSize.vue] ``` :: # Tooltip ## Source code Click :source-code-link{component="Tooltip"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add tooltip"} ## Usage ### Basic example ::show-case :docs-tooltip #code ```vue [DocsTooltip.vue] ``` :: ### Origin UI ::show-case :docs-tooltip-origin #code ```vue [DocsTooltipOrigin.vue] ``` :: # Tree ## Source code Click :source-code-link{component="Tree"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add tree"} ## Usage ### Basic The `Tree` component can be styled to look like anything you want. For that reason, I decided to not style the tree component at all. Instead, I provide a basic example of how to use the tree component. ::show-case :docs-tree #code ```vue [DocsTree.vue] ``` :: ### Virtualizer We can render a large number of items using the `Virtualizer` component. Click on one of the items to see the details. ::show-case :docs-tree-virtualizer #code ```vue [DocsTreeVirtualizer.vue] ``` :: ### Origin UI ::show-case :docs-tree-origin #code ```vue [DocsTreeOrigin.vue] ``` :: # Border Beam ## Credits Shout out to [Magic UI](https://magicui.design/docs/components/border-beam){rel=""nofollow""} for the inspiration. I actually discovered this package while browsing their website. ## Source code Click :source-code-link{component="BorderBeam.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add border-beam"} ## Usage ### Basic Just place the border beam component inside a div with relative positioning, width, and height. You will notice the beam automatically moves around the perimeter of it's container. ::show-case :docs-border-beam #code ```vue [DocsBorderBeam.vue] ``` :: ### 2 Border Beams ::show-case :docs-border-beam-two #code ```vue [DocsBorderBeamTwo.vue] ``` :: ### Reverse ::show-case :docs-border-beam-reverse #code ```vue [DocsBorderBeamReverse.vue] ``` :: ### Spring Animation ::show-case :docs-border-beam-spring #code ```vue [DocsBorderBeamSpring.vue] ``` :: # Confetti ## Credits Shout out to [Magic UI](https://magicui.design/docs/components/confetti){rel=""nofollow""} for the inspiration. I actually discovered this package while browsing their website. ## Getting Started ::steps :::step ### Installation To get started, you will need to install the package. You can visit the [Canvas Confetti](https://github.com/catdad/canvas-confetti){rel=""nofollow""} page for more details... All the details 🙂. :prose-pm-install{name="canvas-confetti"} ::: :::step ### Create Composable Create a composable in your `composables` directory. You can name it `useConfetti.ts`. Add this to the file: ::::prose-code-snippet --- file: /composables/useConfetti.ts language: ts meta: noFormat title: useConfetti Composable --- :::: ::: :: ## Usage ### Basic We can just call the `useConfetti` method to trigger the confetti. ::show-case :docs-confetti #code ```vue [DocsConfetti.vue] ``` :: ### Random Direction This is how you can shoot confetti off in a random direction. ::show-case :docs-confetti-random-direction #code ```vue [DocsConfettiRandomDirection.vue] ``` :: ### Fireworks ::show-case :docs-confetti-fireworks #code ```vue [DocsConfettiFireworks.vue] ``` :: ### Stars ::show-case :docs-confetti-stars #code ```vue [DocsConfettiStars.vue] ``` :: ### Snow ::show-case :docs-confetti-snow #code ```vue [DocsConfettiSnow.vue] ``` :: ### Side Cannon ::show-case :docs-confetti-side-cannon #code ```vue [DocsConfettiSideCannon.vue] ``` :: ### Emoji ::show-case :docs-confetti-emoji #code ```vue [DocsConfettiEmoji.vue] ``` :: # File Upload ## Credits - [ReUI](https://reui.io/docs/file-upload){rel=""nofollow""} - [Origin UI Vue](https://www.originui-vue.com/file-upload){rel=""nofollow""} ## Getting Started ::steps :::step ### Installation Add the following packages to your project :prose-pm-install{name="@vueuse/core"} ::: :::step ### Add Composable Add the following composable to your `composables` directory ::::prose-code-snippet --- file: /composables/useFileUpload.ts language: ts meta: noFormat title: useFileUpload Composable --- :::: ::: :: ## Usage ### Avatar Upload 1 ::show-case :docs-file-upload-avatar-upload1 #code ```vue [DocsFileUploadAvatarUpload1.vue] ``` :: ### Avatar Upload 2 ::show-case :docs-file-upload-avatar-upload2 #code ```vue [DocsFileUploadAvatarUpload2.vue] ``` :: ### Single Image Uploader ::show-case :docs-file-upload-single-image-uploader #code ```vue [DocsFileUploadSingleImageUploader.vue] ``` :: ### Single Image Uploader w/ Button ::show-case :docs-file-upload-single-image-uploader-button #code ```vue [DocsFileUploadSingleImageUploaderButton.vue] ``` :: ### Multiple Image Uploader w/ Grid ::show-case :docs-file-upload-multiple-image-uploader-grid #code ```vue [DocsFileUploadMultipleImageUploaderGrid.vue] ``` :: ### Multiple Image Uploader w/ List + Button ::show-case :docs-file-upload-multiple-image-uploader-list-button #code ```vue [DocsFileUploadMultipleImageUploaderListButton.vue] ``` :: ### Single File Uploader ::show-case :docs-file-upload-single-file-uploader #code ```vue [DocsFileUploadSingleFileUploader.vue] ``` :: ### Multiple File Uploader ::show-case :docs-file-upload-multiple-file-uploader #code ```vue [DocsFileUploadMultipleFileUploader.vue] ``` :: ### Multiple File Uploader w/ List Inside ::show-case :docs-file-upload-multiple-file-uploader-list-inside #code ```vue [DocsFileUploadMultipleFileUploaderListInside.vue] ``` :: ### Multiple File Uploader w/ Table ::show-case :docs-file-upload-multiple-file-uploader-table #code ```vue [DocsFileUploadMultipleFileUploaderTable.vue] ``` :: ### Mixed Content w/ Card ::show-case :docs-file-upload-mixed-content-card #code ```vue [DocsFileUploadMixedContentCard.vue] ``` :: # Full Calendar ## Getting Started ::steps :::step ### Installation To get started, you can install the package with the following command: :prose-pm-install{name="@fullcalendar/core @fullcalendar/vue3"} ::: :::step ### Add Plugins You can also install the plugins for Full Calendar: :prose-pm-install{name="@fullcalendar/daygrid @fullcalendar/interaction @fullcalendar/timegrid @fullcalendar/list @fullcalendar/multimonth @fullcalendar/scrollgrid"} ::: :::step ### Update CSS In order to make the calendar match the UI Thing theme, I had to create the `full-calendar.css` file and import it in the `nuxt.config.ts` file. :prose-code-snippet{file="/assets/css/full-calendar.css" language="css" title="Full Calendar"} ::: :: ## Usage ### Month View ::show-case :docs-full-calendar #code ```vue [DocsFullCalendar.vue] ``` :: ### List View ::show-case :docs-full-calendar-list #code ```vue [DocsFullCalendarList.vue] ``` :: ### TimeGrid View ::show-case :docs-full-calendar-time-grid #code ```vue [DocsFullCalendarTimeGrid.vue] ``` :: ### MultiMonth View ::show-case :docs-full-calendar-multi-month #code ```vue [DocsFullCalendarMultiMonth.vue] ``` :: # Gooey Menu ## Credits Shout out to [Julien Thibeaut](https://ibelick.com/){rel=""nofollow""} for the source code. I discovered this gooey menu while browsing his website. ## Usage ### Basic This may not be a component that can be reused across multiple projects, but it's a fun one to have in your back pocket. ::show-case :docs-gooey-menu #code ```vue [DocsGooeyMenu.vue] ``` :: # Meteors ## Credits Shout out to [Magic UI](https://magicui.design/docs/components/meteors){rel=""nofollow""} for the inspiration. I actually discovered this package while browsing their website. ## Getting Started ::steps :::step ### Add Animation You will need to add this to your `tailwind.css` file. ```css @theme inline { --animate-meteor: meteor 5s linear infinite; @keyframes meteor { 0% { transform: rotate(var(--angle)) translateX(0); opacity: 1; } 70% { opacity: 1; } 100% { transform: rotate(var(--angle)) translateX(-500px); opacity: 0; } } } ``` ::: :::step ### Create Component Create the component `Meteors.client.vue` in the `components` directory. :prose-code-snippet{file="/components/Ui/Meteors.client.vue" language="vue" title="Meteors Component"} ::: :: ## Usage ### Basic We can add the `UiMeteors` component to trigger the meteors. ::show-case :docs-meteors #code ```vue [DocsMeteors.vue] ``` :: # Neon Gradient Card ## Credits Shout out to [Magic UI](https://magicui.design/docs/components/neon-gradient-card){rel=""nofollow""} for the implementation. I actually discovered this component while browsing their website. ## Getting Started ::steps :::step ### Create the Component Create the the `NeonGradientCard` component in the `components` directory. ```vue [NeonGradientCard.vue] ``` ::: :::step ### Add animation to `tailwind.css` file ```css @theme inline { --animate-background-position-spin: background-position-spin 3000ms infinite alternate; @keyframes background-position-spin { 0% { background-position: top center; } 100% { background-position: bottom center; } } } ``` ::: :: ## Usage ::show-case :docs-neon-gradient-card #code ```vue [DocsNeonGradientCard.vue] ``` :: # Quill ## Getting Started ::steps :::step ### Installation To get started, you can install the package with the following command: :prose-pm-install{name="@vueup/vue-quill"} ::: :::step ### Create CSS File In order to make the editor match the design of this website (and the whole shadcn/ui theme), I had to add this css file: You should copy this and add it to your project. :prose-code-snippet{file="/assets/css/quill.css" language="css" title="Quill CSS Overrides"} ::: :: ## Usage ### Basic Here is a basic example of how to use the Quill component. We are using a technique called `Slot Forwarding` so that if the developer wants to create a component and pass through the `toolbar` slot, they can do so. ::show-case :docs-quill #code ```vue [DocsQuill.vue] ``` :: ### Toolbar We can add our custom toolbar configuration by using the `toolbar` prop. ::show-case :docs-quill-toolbar #code ```vue [DocsQuillToolbar.vue] ``` :: ### Slot - Toolbar Another way of customizing the toolbar is by using the `toolbar` slot. This way, we can create a custom toolbar with our own components. ::show-case :docs-quill-toolbar2 #code ```vue [DocsQuillToolbar2.vue] ``` :: ### Bubble Theme We can pass the `bubble` value to the `theme` prop to use the snow theme. You have to select something in the editor to see the toolbar. ::show-case :docs-quill-bubble #code ```vue [DocsQuillBubble.vue] ``` :: ### Module We can pass an object or an array of objects to the `module` prop to use any Quill module. Something like this: ```vue ``` Upload an image to see the module in action. ::show-case :docs-quill-module #code ```vue [DocsQuillModule.vue] ``` :: # Retro Grid ## Credits Shout out to [Magic UI](https://magicui.design/docs/components/retro-grid){rel=""nofollow""} for the inspiration. I actually discovered this package while browsing their website. ## Getting Started ::steps :::step ### Add Animation You will need to add this to your `tailwind.css` file. ```css --animate-grid: grid 15s linear infinite; @keyframes grid { 0% { transform: translateY(-50%); } 100% { transform: translateY(0); } } ``` ::: :::step ### Create Component Create the component `RetroGrid.vue` in the `components` directory. ```vue [RetroGrid.vue] ``` ::: :: ## Usage ### Basic ::show-case :docs-retro-grid #code ```vue [DocsRetroGrid.vue] ``` :: # Terminal ## Credits Shout out to [Magic UI](https://magicui.design/docs/components/terminal){rel=""nofollow""} for the inspiration. I actually discovered this component while browsing their website. ## Getting Started ::steps :::step ### Add Components This consists of four(4) components #### Terminal ```vue [Terminal.vue] ``` #### TerminalItem ```vue [TerminalItem.vue] ``` #### AnimatedSpan ```vue [AnimatedSpan.vue] ``` #### TypingAnimation ```vue [TypingAnimation.vue] ``` ::: :: ## Usage ::show-case :docs-terminal #code ```vue [DocsTerminal.vue] ``` :: # Tiptap ## Getting Started ::steps :::step ### Installation First wee need to install basic packages that we need. To make a great editor, you will need to install a whole lot more extensions. But for now, we will just install the basic packages. :prose-pm-install{name="@tiptap/vue-3 @tiptap/pm @tiptap/starter-kit"} ::: :::step ### Create Editor Component Create the component `Tiptap.vue` in the `components` directory. The component has to be a client only component. The one used here looks like this. Like I said earlier, you have to install a lot of packages to get the functionality you want. :prose-code-snippet{file="/components/Ui/Tiptap.vue" language="vue" title="TipTap"} ::: :: ## Usage ### Basic In this example, we are just passing the model to the editor. We are also customizing the look and feel of this single instance of the editor. Feel free to customize it to your liking. ::show-case :docs-tiptap #code ```vue [DocsTiptap.vue] ``` :: # Vue Tippy ## Getting Started ::steps :::step ### Installation Run the command below to install the Vue Tippy package. :prose-pm-install{name="vue-tippy@v6"} ::: :::step ### Create Plugin Create a plugin to add Vue Tippy globally to your Nuxt application. Here I added some configurations to the plugin, like the default animation, delay, trigger, and touch. Feel free to change these configurations to fit your needs. ```ts [tippy.ts] import VueTippy from "vue-tippy"; import type { TippyPluginOptions } from "vue-tippy"; import "tippy.js/animations/scale.css"; import "tippy.js/animations/shift-away.css"; import "tippy.js/animations/shift-toward.css"; import "tippy.js/animations/perspective.css"; export default defineNuxtPlugin((nuxtApp) => { nuxtApp.vueApp.use(VueTippy, { component: "Tippy", directive: "tippy", defaultProps: { animation: "shift-away", delay: [200, 100], trigger: "mouseenter", touch: ["hold", 500], arrow: false, }, } satisfies TippyPluginOptions); }); ``` ::: :::step ### Add CSS Create a new CSS file and add the following code to it. ```css [tippy.css] @reference "./tailwind.css"; [data-tippy-root] { .tippy-box { @apply rounded-md bg-popover px-2 py-1 text-popover-foreground shadow ring-1 ring-border; .tippy-content { @apply text-[13px]; } } .tippy-box[data-theme~="error"] { @apply bg-destructive text-destructive-foreground ring-destructive; } } ``` ::: :: ## Usage There are three(3) ways in which you can use Vue Tippy: ### Directive We can add the `v-tippy` directive to any element to show a tooltip. The directive accepts a string with the content of the tooltip OR an object with the content and the options. Check out the [Directive Docs](https://vue-tippy.netlify.app/flavor/directive){rel=""nofollow""} to learn more. ::show-case :docs-tippy-usage-directive #code ```vue [DocsTippyUsageDirective.vue] ``` :: ### Component We can use the `` component to show a tooltip. You can visit the [Component Docs](https://vue-tippy.netlify.app/flavor/component){rel=""nofollow""} to see some more examples of how this component can be used. ::show-case :docs-tippy-usage-component #code ```vue [DocsTippyUsageComponent.vue] ``` :: #### Additional Props Do note that these additional props can be added to the component | Prop | Type | Default | Description | | --------------- | ----------------- | ------- | --------------------- | | `tag` | String | "span" | Trigger wrapper tag | | `content-tag` | String | "span" | Content wrapper tag | | `content-class` | String | null | Content wrapper class | | `to` | Element or String | null | Target selector | ### Composition API We can import nd use the `useTippy` composable to show a tooltip. This is a low-level, flexible composition, ideal for building tooltips with complex interactions. You can visit the [Composition API Docs](https://vue-tippy.netlify.app/flavor/composition-api){rel=""nofollow""} to see some more examples of how this composition can be used. ::show-case :docs-tippy-usage-composition #code ```vue [DocsTippyUsageComposition.vue] ``` :: ## Vue Tippy Examples Here are some examples taken from the [Vue Tippy](https://vue-tippy.netlify.app/){rel=""nofollow""} documentation. ### Follow Mouse This example shows how to create a tooltip that follows the mouse. ::show-case :docs-tippy-follow-mouse #code ```vue [DocsTippyFollowMouse.vue] ``` :: ### Context Menu This example shows how to create a context menu using Vue Tippy. ::show-case :docs-tippy-context-menu #code ```vue [DocsTippyContextMenu.vue] ``` :: ### Trigger Target This example shows how to create a tooltip that is triggered by another element. ::show-case :docs-tippy-target-el #code ```vue [DocsTippyTargetEl.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin Ui](https://originui.com/tooltips){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Title ::show-case :docs-tippy-title #code ```vue [DocsTippyTitle.vue] ``` :: ### Icon ::show-case :docs-tippy-icon #code ```vue [DocsTippyIcon.vue] ``` :: ### Image ::show-case :docs-tippy-image #code ```vue [DocsTippyImage.vue] ``` :: ### Pan ::show-case :docs-tippy-pan #code ```vue [DocsTippyPan.vue] ``` :: ### Stats ::show-case :docs-tippy-stats #code ```vue [DocsTippyStats.vue] ``` :: ### Chart ::show-case :docs-tippy-chart #code ```vue [DocsTippyChart.vue] ``` :: # V-Wave ## Getting Started ::steps :::step ### Installation To get started, you will need to install the package. You can visit the [V-Wave](https://github.com/justintaddei/v-wave){rel=""nofollow""} page for more details... All the details 🙂. :prose-pm-install{name="v-wave"} ::: :::step ### Add it to `nuxt.config.ts` Once installed, you can add it to your `nuxt.config.ts` file. ```ts modules: ["v-wave/nuxt"]; ``` ::: :: ## Usage ### Buttons You can add the `v-wave` directive to any button. Be sure to check out the available options in the repo. ::show-case :docs-v-wave-button #code ```vue [DocsVWaveButton.vue] ``` :: ### Options You can change the color of the ripple effect by passing a color to the directive. Even background images are allowed. ::show-case :docs-v-wave-color #code ```vue [DocsVWaveColor.vue] ``` :: # Forms Introduction So you may be wondering why I have 2 types of forms in this documentation... In all honesty, I was just following the guys that created shadcn-vue lol. The components created here is how I usually go about creating form elements to be used in my projects. I use the composition API provided by `vee-validate` to compose my reusable form elements and then use the `useForm` composable to do the validation with either `zod` or `yup` schemas. ## Getting Started ::steps :::step ### Installation In order to get this to work in your app, you will need to install the [Vee-Validate Nuxt Module](https://vee-validate.logaretm.com/v4/integrations/nuxt/){rel=""nofollow""} :prose-pm-install{name="@vee-validate/nuxt"} ::: :::step ### Add Validation Library You will also need a library that will be used to perform validation. Since `vee-validate` supports `zod`, `yup`, `valibot` and `joi`, you can choose any of these libraries to perform validation. #### Zod :prose-pm-install{name="zod @vee-validate/zod"} #### Yup :prose-pm-install{name="yup @vee-validate/yup"} #### Valibot :prose-pm-install{name="valibot @vee-validate/valibot"} #### Joi :prose-pm-install{name="joi @vee-validate/joi"} ::: :::step ### Update Nuxt Config After that, we will need to add the `@vee-validate/nuxt` module to our `nuxt.config.js` file. ```ts export default defineNuxtConfig({ //... modules: ["@vee-validate/nuxt"], //... }); ``` ::: :: # Form Builder We all know that building forms can be a pain in the butt. I stumbled on this form builder example in the vee-validate documentation and thought that it would be nice to have one of these here as well. ## Getting Started ::steps :::step ### Setup To get started, you need to setup Vee Validate in your Nuxt project. You can do so by following the instructions outline in the [Forms Introduction](https://uithing.com/forms) page. ::: :::step ### Installation Next, you can install the form builder component by running the following command. :prose-pm-x{command="ui-thing@latest add vee-form-builder"} ::: :::step ### Use the Form Builder Component Now you can use the form builder component in your project. ```vue ``` ::: :: ## Full Example Here is an example of the component in action. Do note that you can use the `renderIf` prop to conditionally render a field. Also, you can render your own markup by using the `name` of the prop on the object as the slot name. This is demonstrated in the `Conditional & Currency` section of the form. ::show-case :docs-form-builder-full #code ```vue [DocsFormBuilderFull.vue] ``` :: # VeeVueFormSlider ## Source code Click :source-code-link{component="Vee/VueFormSlider.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-vue-form-slider"} ## Usage You can visit the [VueForm Slider page](https://github.com/vueform/slider?tab=readme-ov-file#demo){rel=""nofollow""} for more information on how to use this component. ### Single Slider ::show-case :docs-vee-vue-form-slider-single #code ```vue [DocsVeeVueFormSliderSingle.vue] ``` :: ### Multiple Sliders ::show-case :docs-vee-vue-form-slider-multiple #code ```vue [DocsVeeVueFormSliderMultiple.vue] ``` :: ### Tooltip Formatting ::show-case :docs-vee-vue-form-slider-tooltip #code ```vue [DocsVeeVueFormSliderTooltip.vue] ``` :: ### Tooltip Merging ::show-case :docs-vee-vue-form-slider-merging #code ```vue [DocsVeeVueFormSliderMerging.vue] ``` :: ### Vertical Slider ::show-case :docs-vee-vue-form-slider-vertical #code ```vue [DocsVeeVueFormSliderVertical.vue] ``` :: ### Form Validation ::show-case :docs-vee-vue-form-slider-validate #code ```vue [DocsVeeVueFormSliderValidate.vue] ``` :: # VeeCheckbox ## Source code Click :source-code-link{component="Vee/Checkbox.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-checkbox"} ## Usage ### Grouping checkboxes Checkboxes can be tricky to implement with validation libraries. Luckily, Vee-Validate takes care of the heavy lifting for us. Take a look at the [`Building Checkboxes Docs`](https://vee-validate.logaretm.com/v4/guide/composition-api/custom-inputs/#building-checkboxes){rel=""nofollow""} for more information on how this works. ::show-case :docs-vee-checkbox #code ```vue [DocsVeeCheckbox.vue] ``` :: ### Single checkbox ::show-case :docs-vee-checkbox-single #code ```vue [DocsVeeCheckboxSingle.vue] ``` :: ### Default Value We can use the `v-model` prop to set the default value of the VeeCheckbox. ::show-case :docs-vee-checkbox-default #code ```vue [DocsVeeCheckboxDefault.vue] ``` :: ## Origin UI Examples These are some examples that I found today over here [Origin UI](https://originui.com/checks-radios-switches){rel=""nofollow""}. I think they are cool. To use these examples you will have to copy the code and adjust it for your own use. ### Colored Checkbox ::show-case :docs-vee-checkbox-colored #code ```vue [DocsVeeCheckboxColored.vue] ``` :: ### Simple Todo ::show-case :docs-vee-checkbox-simple-todo #code ```vue [DocsVeeCheckboxSimpleTodo.vue] ``` :: ### Fancy Todo ::show-case :docs-vee-checkbox-fancy-todo #code ```vue [DocsVeeCheckboxFancyTodo.vue] ``` :: ### Terms of Service ::show-case :docs-vee-checkbox-terms #code ```vue [DocsVeeCheckboxTerms.vue] ``` :: ### Frameworks ::show-case :docs-vee-checkbox-frameworks #code ```vue [DocsVeeCheckboxFrameworks.vue] ``` :: ### Right Aligned ::show-case :docs-vee-checkbox-right-aligned #code ```vue [DocsVeeCheckboxRightAligned.vue] ``` :: ### Label w/ Sublabel ::show-case :docs-vee-checkbox-label-sublabel #code ```vue [DocsVeeCheckboxLabelSublabel.vue] ``` :: ### Input Expansion ::show-case :docs-vee-checkbox-input-expansion #code ```vue [DocsVeeCheckboxInputExpansion.vue] ``` :: ### Right Aligned w/ Sublabel ::show-case :docs-vee-checkbox-right-aligned-sublabel #code ```vue [DocsVeeCheckboxRightAlignedSublabel.vue] ``` :: ### Right Aligned w/ Sublabel Bordered ::show-case :docs-vee-checkbox-right-aligned-sublabel-border #code ```vue [DocsVeeCheckboxRightAlignedSublabelBorder.vue] ``` :: ### Grid Box ::show-case :docs-vee-checkbox-grid-box #code ```vue [DocsVeeCheckboxGridBox.vue] ``` :: ### Days of the Week ::show-case :docs-vee-checkbox-days-of-the-week #code ```vue [DocsVeeCheckboxDaysOfTheWeek.vue] ``` :: # Checkbox - Native ## Source code Click :source-code-link{component="Vee/NativeCheckbox.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-native-checkbox"} ## Why? You may be wondering why this is here. I ran into an issue the other day with how the checkbox from Radix Vue was working with an array of values. This has been fixed with the `CheckboxGroup` component in Reka UI but I am keeping this here anyways 🙂 ## Usage ### Basic ::show-case :docs-vee-native-checkbox-basic #code ```vue [DocsVeeNativeCheckboxBasic.vue] ``` :: ### Indeterminate ::show-case :docs-vee-native-checkbox-indeterminate #code ```vue [DocsVeeNativeCheckboxIndeterminate.vue] ``` :: ### Colors ::show-case :docs-vee-native-checkbox-colors #code ```vue [DocsVeeNativeCheckboxColors.vue] ``` :: ### Sizes ::show-case :docs-vee-native-checkbox-sizes #code ```vue [DocsVeeNativeCheckboxSizes.vue] ``` :: ### Label Only ::show-case :docs-vee-native-checkbox-label #code ```vue [DocsVeeNativeCheckboxLabel.vue] ``` :: ### Description Only ::show-case :docs-vee-native-checkbox-description #code ```vue [DocsVeeNativeCheckboxDescription.vue] ``` :: ### Label & Description ::show-case :docs-vee-native-checkbox-label-description #code ```vue [DocsVeeNativeCheckboxLabelDescription.vue] ``` :: ### Array of Items ::show-case :docs-vee-native-checkbox-array #code ```vue [DocsVeeNativeCheckboxArray.vue] ``` :: # VeeCurrencyInput ## Source code Click :source-code-link{component="Vee/CurrencyInput.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-currency-input"} ## Usage ### User form In the form below, we are using the `useForm` composition function provided by Vee-Validate to handle the form submission and validation. The `useForm` composable accepts a `validationSchema` option that we can use to define our validation rules. We are using the `yup` library to define our validation rules. You can use any validation library you want as long as it is supported by Vee-Validate and can be passed to the `toTypedSchema` function. ::show-case :docs-vee-currency-input #code ```vue [DocsVeeCurrencyInput.vue] ``` :: # VeeDateField ## Source code Click :source-code-link{component="Vee/DateField.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-date-field"} ## Usage ### DOB form In the form below, we are using the `useForm` composition provided by Vee-Validate to handle the form submission and validation. The `useForm` composable accepts a `validationSchema` option that we can use to define our validation rules. We are using the `yup` library to define our validation rules. You can use any validation library you want as long as it is supported by Vee-Validate and can be passed to the `toTypedSchema` function. ::show-case :docs-vee-date-field #code ```vue [DocsVeeDateField.vue] ``` :: # VeeDatepicker ## Source code Click :source-code-link{component="Vee/Datepicker.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-datepicker"} ## Usage ::show-case :docs-vee-datepicker #code ```vue [DocsVeeDatepicker.vue] ``` :: # VeeFileInput ## Source code Click :source-code-link{component="Vee/FileInput.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-file-input"} ## Usage ### File upload Why not use the `VeeInput` to accept file uploads? Well, we cannot force select a file from a user's device so the way how data binding works with file inputs and `vee-validate` is a bit different. According to the [docs](https://vee-validate.logaretm.com/v4/api/field#rendering-complex-fields-with-scoped-slots){rel=""nofollow""} it is better to use the `handleChange` and `handleBlur` methods to handle the file input changes. ::show-case :docs-vee-input-files #code ```vue [DocsVeeInputFiles.vue] ``` :: # VeeInput ## Source code Click :source-code-link{component="Vee/Input.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-input"} ## Usage ### User form In the form below, we are using the `useForm` composition function provided by Vee-Validate to handle the form submission and validation. The `useForm` composable accepts a `validationSchema` option that we can use to define our validation rules. We are using the `zod` library to define our validation rules. You can use any validation library you want as long as it is supported by Vee-Validate and can be passed to the `toTypedSchema` function. ::show-case :docs-vee-input #code ```vue [DocsVeeInput.vue] ``` :: ## Origin UI Here we have some examples that come from [Origin UI](https://originui.com/inputs){rel=""nofollow""}. Not all examples are copied but these should give you a good idea of what you can do with the `VeeInput` component. ### Required Input ::show-case :docs-origin-input-required #code ```vue [DocsOriginInputRequired.vue] ``` :: ### Input with Helper Text ::show-case :docs-origin-input-helper-text #code ```vue [DocsOriginInputHelperText.vue] ``` :: ### Input with label hint ::show-case :docs-origin-input-label-hint #code ```vue [DocsOriginInputLabelHint.vue] ``` :: ### Input with Colored Ring ::show-case :docs-origin-input-colored-border #code ```vue [DocsOriginInputColoredBorder.vue] ``` :: ### Input with Gray Background ::show-case :docs-origin-input-gray-bg #code ```vue [DocsOriginInputGrayBg.vue] ``` :: ### Disabled Input ::show-case :docs-origin-input-disabled #code ```vue [DocsOriginInputDisabled.vue] ``` :: ### Input with Start Icon ::show-case :docs-origin-input-start-icon #code ```vue [DocsOriginInputStartIcon.vue] ``` :: ### Input with End Icon ::show-case :docs-origin-input-end-icon #code ```vue [DocsOriginInputEndIcon.vue] ``` :: ### Input with Start Inline Addon ::show-case :docs-origin-input-start-inline-add-on #code ```vue [DocsOriginInputStartInlineAddOn.vue] ``` :: ### Input with End Inline Addon ::show-case :docs-origin-input-end-inline-add-on #code ```vue [DocsOriginInputEndInlineAddOn.vue] ``` :: ### Input with Inline Addons ::show-case :docs-origin-input-inline-add-ons #code ```vue [DocsOriginInputInlineAddOns.vue] ``` :: ### Input with Start Addon ::show-case :docs-origin-input-start-addon #code ```vue [DocsOriginInputStartAddon.vue] ``` :: ### Input with End Addon ::show-case :docs-origin-input-end-addon #code ```vue [DocsOriginInputEndAddon.vue] ``` :: ### Input with Inline Start & End Addon ::show-case :docs-origin-input-inline-start-end-addon #code ```vue [DocsOriginInputInlineStartEndAddon.vue] ``` :: ### Input with Start Select ::show-case :docs-origin-input-start-select #code ```vue [DocsOriginInputStartSelect.vue] ``` :: ### Input with End Select ::show-case :docs-origin-input-end-select #code ```vue [DocsOriginInputEndSelect.vue] ``` :: ### Input with End Inline Button ::show-case :docs-origin-input-end-inline-button #code ```vue [DocsOriginInputEndInlineButton.vue] ``` :: ### Input with End Icon Button ::show-case :docs-origin-input-end-icon-button #code ```vue [DocsOriginInputEndIconButton.vue] ``` :: ### Input with End Button ::show-case :docs-origin-input-end-button #code ```vue [DocsOriginInputEndButton.vue] ``` :: ### Input with Button ::show-case :docs-origin-input-with-button #code ```vue [DocsOriginInputWithButton.vue] ``` :: ### Input with Show/Hide Password ::show-case :docs-origin-input-show-hide-password #code ```vue [DocsOriginInputShowHidePassword.vue] ``` :: ### Input with Clear Button ::show-case :docs-origin-input-clear-button #code ```vue [DocsOriginInputClearButton.vue] ``` :: ### Input with \ ::show-case :docs-origin-input-with-k-d-b #code ```vue [DocsOriginInputWithKDB.vue] ``` :: ### Search Input with Icon & Button ::show-case :docs-origin-input-search-with-icon-button #code ```vue [DocsOriginInputSearchWithIconButton.vue] ``` :: ### Search Input with Loader Icon ::show-case :docs-origin-input-search-with-loader #code ```vue [DocsOriginInputSearchWithLoader.vue] ``` :: ### Input with Overlapping Label ::show-case :docs-origin-input-overlapping-label #code ```vue [DocsOriginInputOverlappingLabel.vue] ``` :: ### Input with Password Strength Indicator ::show-case :docs-origin-input-password-strength-indicator #code ```vue [DocsOriginInputPasswordStrengthIndicator.vue] ``` :: # VeeMultiSelect ## Source code Click :source-code-link{component="Vee/Multiselect.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-multi-select"} ## Usage You can visit the [VueForm Multiselect page](https://www.npmjs.com/package/@vueform/multiselect#demo){rel=""nofollow""} for more information on how to use this component. ### Objects ::show-case :docs-vee-multiselect-object #code ```vue [DocsVeeMultiselectObject.vue] ``` :: ### Groups ::show-case :docs-vee-multiselect-group #code ```vue [DocsVeeMultiselectGroup.vue] ``` :: ### Search ::show-case :docs-vee-multiselect-search #code ```vue [DocsVeeMultiselectSearch.vue] ``` :: ### Tags w/ Search & Create ::show-case :docs-multiselect-tags-search-create #code ```vue [DocsMultiselectTagsSearchCreate.vue] ``` :: ### Autocomplete w/ Async ::show-case :docs-multiselect-autocomplete-async #code ```vue [DocsMultiselectAutocompleteAsync.vue] ``` :: # VeeNumberField ## Source code Click :source-code-link{component="Vee/NumberField.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-number-field"} ## Usage ### User form In the form below, we are using the `useForm` composition function provided by Vee-Validate to handle the form submission and validation. The `useForm` composable accepts a `validationSchema` option that we can use to define our validation rules. We are using the `yup` library to define our validation rules. You can use any validation library you want as long as it is supported by Vee-Validate. ::show-case :docs-vee-number-field #code ```vue [DocsVeeNumberField.vue] ``` :: # VeePinInput ## Source code Click :source-code-link{component="Vee/PinInput.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-pin-input"} ## Usage ### User form In the form below, we are using the `useForm` composition function provided by Vee-Validate to handle the form submission and validation. The `useForm` composable accepts a `validationSchema` option that we can use to define our validation rules. We are using the `zod` library to define our validation rules. You can use any validation library you want as long as it is supported by Vee-Validate and can be passed to the `toTypedSchema` function. ::show-case :docs-vee-pin-input #code ```vue [DocsVeePinInput.vue] ``` :: # VeeRadioGroup ## Source code Click :source-code-link{component="Vee/RadioGroup.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-radio-group"} ## Usage ### Notification type In the form below, we are using the `` component to create a radio group that allows the user to select how they want to be notified. The component uses the composition API provided by Vee-Validate to perform validation. Notice that we pass the different `RadioItems` into the default slot of the component. ::show-case :docs-vee-radio-group #code ```vue [DocsVeeRadioGroup.vue] ``` :: # VeeSelect ## Source code Click :source-code-link{component="Vee/Select.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-select"} ## Usage ### Form In the form below, we are using the `useForm` composition function provided by Vee-Validate to handle the form submission and validation. The `useForm` composable accepts a `validationSchema` option that we can use to define our validation rules. We are using the `zod` library to define our validation rules. You can use any validation library you want as long as it is supported by Vee-Validate and can be passed to the `toTypedSchema` function. ::show-case :docs-vee-select #code ```vue [DocsVeeSelect.vue] ``` :: # VeeSwitch ## Source code Click :source-code-link{component="Vee/Switch.vue"} to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use. ## Installation :prose-pm-x{command="ui-thing@latest add vee-switch"} ## Usage ### Basic example ::show-case :docs-vee-switch #code ```vue [DocsVeeSwitch.vue] ``` :: ### Default value ::show-case :docs-vee-switch-default #code ```vue [DocsVeeSwitchDefault.vue] ``` :: ### Settings row ::show-case :docs-vee-switch-settings #code ```vue [DocsVeeSwitchSettings.vue]