# Symfony UX
> Symfony UX is a collection of PHP and JavaScript packages to add rich UI experiences to Symfony applications. This site provides demos, installation guides, and a cookbook. For full documentation, see the official Symfony docs.
## Packages
- [Autocomplete](https://ux.symfony.com/autocomplete.md): Ajax-powered Form Select
- [CalendarLink](https://ux.symfony.com/calendar-link.md): Save the date, anywhere
- [Chart.js](https://ux.symfony.com/chartjs.md): Interactive charts with Chart.js
- [Icons](https://ux.symfony.com/icons.md): SVG icons made easy
- [Image Cropper](https://ux.symfony.com/cropperjs.md): Form Tools for cropping images
- [Live Components](https://ux.symfony.com/live-component.md): Interactive UI in PHP & Twig
- [Map](https://ux.symfony.com/map.md): Interactive Maps
- [Native](https://ux.symfony.com/native.md): Hotwire Native for Symfony
- [Notify](https://ux.symfony.com/notify.md): Native Browser Notifications
- [React](https://ux.symfony.com/react.md): Render React components from Twig
- [Stimulus](https://ux.symfony.com/stimulus.md): Central Bridge of Symfony UX
- [Stylized Dropzone](https://ux.symfony.com/dropzone.md): Upload Files with Style
- [Toolkit](https://ux.symfony.com/toolkit.md): Build your Design System.
- [Translator](https://ux.symfony.com/translator.md): Symfony Translations in JavaScript
- [Turbo](https://ux.symfony.com/turbo.md): Single-page Symfony app
- [Twig Components](https://ux.symfony.com/twig-component.md): Render Reusable UI Elements
- [Vue.js](https://ux.symfony.com/vue.md): Render Vue components from Twig
## Demos
- [Live Component Demos](https://ux.symfony.com/demos.md): Interactive demos showcasing Symfony UX Live Components
## Cookbook
- [Component Architecture](https://ux.symfony.com/cookbook/component-architecture.md): Rules and patterns for working with components
## Changelog
- [Changelog](https://ux.symfony.com/changelog.md): Recent releases and changes
## Toolkit
- [accordion (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/accordion.md): Build vertically collapsing sections powered by Bootstrap's Collapse plugin.
- [alert (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/alert.md): Provides contextual feedback messages for typical user actions.
- [badge (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/badge.md): A small count or label used to highlight status, counts, or short contextual information.
- [breadcrumb (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/breadcrumb.md): Indicates the current page's location within a navigational hierarchy.
- [button-group (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/button-group.md): Groups a series of buttons on a single line or in a vertical column.
- [button (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/button.md): Use Bootstrap button styles for actions in forms, dialogs, navigation, and more.
- [card (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/card.md): Build flexible content containers with optional headers, footers, images, and contextual styles.
- [carousel (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/carousel.md): Cycle through images, text, and other content with optional controls and indicators.
- [close-button (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/close-button.md): Provide an accessible control for dismissing content such as modals and alerts.
- [collapse (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/collapse.md): Toggle the visibility of content with Bootstrap's Collapse plugin.
- [dropdown (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/dropdown.md): Display contextual menus from buttons and links in any Bootstrap direction.
- [figure (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/figure.md): Display related visual content with an optional caption and responsive alignment.
- [list-group (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/list-group.md): Display a flexible series of content with active, disabled, actionable, and contextual states.
- [modal (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/modal.md): Add accessible dialog overlays for notifications, forms, and custom content.
- [navbar (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/navbar.md): A powerful, responsive navigation header with support for branding, navigation, forms, and collapsing content.
- [navs-tabs (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/navs-tabs.md): Build navigation components and accessible dynamic tabbed interfaces with Bootstrap.
- [offcanvas (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/offcanvas.md): Build responsive sliding panels for navigation, forms, and supplementary content.
- [pagination (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/pagination.md): Indicate that related content is split across multiple pages with accessible pagination links.
- [placeholder (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/placeholder.md): Uses loading placeholders to indicate that content may still be loading.
- [popover (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/popover.md): Display contextual Bootstrap content beside a trigger element.
- [progress (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/progress.md): Display task progress with accessible labels, stacked bars, contextual colors, and animation.
- [scrollspy (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/scrollspy.md): Update Bootstrap navigation links as a scrollable region moves between sections.
- [spinner (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/spinner.md): Indicate the loading state of a component or page with Bootstrap spinners.
- [toast (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/toast.md): Show lightweight Bootstrap notifications with optional headers and dismissal controls.
- [tooltip (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/tooltip.md): Add Bootstrap tooltips to focusable controls with configurable content and placement.
- [clipboard (Common)](https://ux.symfony.com/toolkit/kits/common/components/clipboard.md): A Stimulus behavior that copies text to the clipboard — either a value you give it or the content of an element — with optional copied feedback.
- [closeable (Common)](https://ux.symfony.com/toolkit/kits/common/components/closeable.md): A Stimulus behavior that removes its element from the page when dismissed, with optional delayed and automatic closing and an animated countdown bar.
- [logout-link (Common)](https://ux.symfony.com/toolkit/kits/common/components/logout-link.md): A link that logs the current user out through a secure POST form.
- [post-link (Common)](https://ux.symfony.com/toolkit/kits/common/components/post-link.md): A link submitted as a form, with optional HTTP method spoofing, CSRF protection, and a confirmation prompt.
- [tooltip (Common)](https://ux.symfony.com/toolkit/kits/common/components/tooltip.md): A Stimulus behavior that shows a tooltip from a `content` value — or straight from an element's native `title`. Powered by [Floating UI](https://floating-ui.com/): the tooltip is rendered outside the trigger (appended to `
`), so it's never clipped by an `overflow` ancestor, and it flips and shifts to stay in view. Put it right on the trigger — it opens on hover and keyboard focus by default — and style the injected `.tooltip` once, globally.
- [alert (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/alert.md): The alert component can be used to provide information to your users such as success or error messages, but also highlighted information complementing the normal flow of paragraphs and headers on a page.
- [avatar (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/avatar.md): Use the avatar component to show a visual representation of a user profile using an image element or SVG object based on multiple styles and sizes
- [badge (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/badge.md): The badge component can be used to complement other elements such as buttons or text elements as a label or to show the count of a given data, such as the number of comments for an article or how much time has passed by since a comment has been made.
- [button-group (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/button-group.md): The button group component from Flowbite can be used to stack together multiple buttons and links inside a single element.
- [button (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/button.md): Use the button component inside forms, as links, social login, payment options with support for multiple styles, colors, sizes, gradients, and shadows
- [card (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/card.md): Use these responsive card components to show data entries and information to your users in multiple forms and contexts such as for your blog, application, user profiles, and more.
- [checkbox (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/checkbox.md): The checkbox component can be used to receive one or more selected options from the user in the form of a square box available in multiple styles, sizes, colors, and variants coded with the utility classes from Tailwind CSS and with support for dark mode.
- [dropdown (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/dropdown.md): The dropdown component can be used to show a list of menu items when clicking on an element such as a button and hiding it when focusing outside of the triggering element.
- [indicator (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/indicator.md): Use the indicator component to show a number count, account status, or as a loading label positioned relative to the parent component coded with Tailwind CSS
- [input (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/input.md): The input field is an important part of the form element that can be used to create interactive controls to accept data from the user based on multiple input types, such as text, email, number, password, URL, phone number, and more.
- [kbd (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/kbd.md): The KBD (Keyboard) component can be used to indicate a textual user input from the keyboard inside other elements such as in text, tables, cards, and more.
- [label (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/label.md): A text element that identifies form controls and other content.
- [modal (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/modal.md): Use the modal component to show interactive dialogs and notifications to your website users available in multiple sizes, colors, and styles
- [pagination (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/pagination.md): Use the Tailwind CSS pagination element to indicate a series of content across various pages based on multiple styles and sizes
- [radio (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/radio.md): The radio component can be used to allow the user to choose a single option from one or more available options coded with the utility classes from Tailwind CSS and available in multiple styles, variants, and colors and support dark mode.
- [select (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/select.md): Get started with the select component to allow the user to choose from one or more options from a dropdown list based on multiple styles, sizes, and variants
- [skeleton (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/skeleton.md): Use the skeleton component to indicate a loading status with placeholder elements that look very similar to the type of content that is being loaded such as paragraphs, heading, images, videos, and more.
- [spinner (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/spinner.md): An indicator that can be used to show a loading state.
- [table (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/table.md): Use the table component to show text, images, links, and other elements inside a structured set of data made up of rows and columns of table cells
- [tabs (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/tabs.md): Use the following default tabs component example to show a list of links that the user can navigate from on your website.
- [textarea (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/textarea.md): The textarea component is a multi-line text field input that can be used to receive longer chunks of text from the user in the form of a comment box, description field, and more.
- [toggle (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/toggle.md): Use the toggle component to switch between a binary state of true or false using a single click available in multiple sizes, variants, and colors
- [accordion (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/accordion.md): A vertically stacked set of interactive headings that each reveal a section of content.
- [alert-dialog (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/alert-dialog.md): A modal dialog that interrupts the user with important content and expects a response.
- [alert (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/alert.md): Displays a callout for user attention.
- [aspect-ratio (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/aspect-ratio.md): Displays content within a desired ratio.
- [avatar (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/avatar.md): An image element with a fallback for representing the user.
- [badge (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/badge.md): Displays a badge or a component that looks like a badge.
- [breadcrumb (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/breadcrumb.md): Displays the path to the current resource using a hierarchy of links.
- [button-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/button-group.md): A container that groups related buttons together with consistent styling.
- [button (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/button.md): Displays a button or a component that looks like a button.
- [card (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/card.md): Displays a card with header, content, and footer.
- [checkbox (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/checkbox.md): A control that allows the user to toggle between checked and not checked.
- [collapsible (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/collapsible.md): An interactive component which expands/collapses a panel.
- [combobox (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/combobox.md): Autocomplete input and command palette with a list of suggestions.
- [dialog (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/dialog.md): A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.
- [empty (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/empty.md): Use the Empty component to display an empty state.
- [field (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/field.md): Combine labels, controls, and help text to compose accessible form fields and grouped inputs.
- [hover-card (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/hover-card.md): For sighted users to preview content available behind a link.
- [input-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/input-group.md): Add addons, buttons, and helper content to inputs.
- [input (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/input.md): A text input component for forms and user data entry with built-in styling and accessibility features.
- [item (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/item.md): A versatile component for displaying content with media, title, description, and actions.
- [kbd (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/kbd.md): Used to display textual user input from keyboard.
- [label (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/label.md): Renders an accessible label associated with controls.
- [pagination (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/pagination.md): Pagination with page navigation, next and previous links.
- [progress (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/progress.md): Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.
- [radio-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/radio-group.md): A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.
- [resizable (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/resizable.md): Accessible resizable panel groups and layouts with keyboard support.
- [select (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/select.md): A dropdown control that allows users to choose from a list of options.
- [separator (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/separator.md): Visually or semantically separates content.
- [skeleton (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/skeleton.md): Use to show a placeholder while content is loading.
- [sonner (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/sonner.md): A Sonner-style stacked toast notification system with auto-dismiss, swipe-to-dismiss, rich colors, and JS or server-render support.
- [spinner (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/spinner.md): An indicator that can be used to show a loading state.
- [switch (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/switch.md): A control that allows the user to toggle between checked and not checked.
- [table (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/table.md): A responsive table component.
- [tabs (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/tabs.md): A set of layered sections of content—known as tab panels—that are displayed one at a time.
- [textarea (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/textarea.md): Displays a form textarea or a component that looks like a textarea.
- [toggle-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/toggle-group.md): A set of two-state buttons that can be toggled on or off.
- [toggle (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/toggle.md): A two-state button that can be either on or off.
- [tooltip (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/tooltip.md): A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
- [typography (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/typography.md): Styled HTML text elements for headings, paragraphs, quotes, lists and inline code.
## Optional
- [Official Symfony UX Documentation](https://symfony.com/bundles/ux): Full reference documentation for all Symfony UX packages
- [Symfony UX GitHub Repository](https://github.com/symfony/ux): Source code and issue tracker
---
# Symfony UX Packages
> A collection of PHP and JavaScript packages to add rich UI experiences to Symfony applications.
## Active Packages
- [Autocomplete](https://ux.symfony.com/autocomplete.md): Ajax-powered Form Select
- [CalendarLink](https://ux.symfony.com/calendar-link.md): Save the date, anywhere
- [Chart.js](https://ux.symfony.com/chartjs.md): Interactive charts with Chart.js
- [Icons](https://ux.symfony.com/icons.md): SVG icons made easy
- [Image Cropper](https://ux.symfony.com/cropperjs.md): Form Tools for cropping images
- [Live Components](https://ux.symfony.com/live-component.md): Interactive UI in PHP & Twig
- [Map](https://ux.symfony.com/map.md): Interactive Maps
- [Native](https://ux.symfony.com/native.md): Hotwire Native for Symfony
- [Notify](https://ux.symfony.com/notify.md): Native Browser Notifications
- [React](https://ux.symfony.com/react.md): Render React components from Twig
- [Stimulus](https://ux.symfony.com/stimulus.md): Central Bridge of Symfony UX
- [Stylized Dropzone](https://ux.symfony.com/dropzone.md): Upload Files with Style
- [Toolkit](https://ux.symfony.com/toolkit.md): Build your Design System.
- [Translator](https://ux.symfony.com/translator.md): Symfony Translations in JavaScript
- [Turbo](https://ux.symfony.com/turbo.md): Single-page Symfony app
- [Twig Components](https://ux.symfony.com/twig-component.md): Render Reusable UI Elements
- [Vue.js](https://ux.symfony.com/vue.md): Render Vue components from Twig
## Removed Packages
- **Lazy Image**: Delay Loading with Blurhash — [Migration guide](https://github.com/symfony/ux-lazy-image#readme)
- **Svelte**: Render Svelte components from Twig — [Migration guide](https://github.com/symfony/ux-svelte#readme)
- **Swup Integration**: Stylized Page Transitions — [Migration guide](https://github.com/symfony/ux-swup#readme)
- **Toggle Password**: Password Visibility Switch — [Migration guide](https://github.com/symfony/ux-toggle-password#readme)
- **Typed**: Animated Typing with Typed.js — [Migration guide](https://github.com/symfony/ux-typed#readme)
# Symfony UX Documentation
> Full documentation for all Symfony UX packages is available on [symfony.com](https://symfony.com/bundles#symfony-ux-bundles).
## Packages
- [Autocomplete](https://symfony.com/bundles/ux-autocomplete/current/index.html): Ajax-powered Form Select
- [CalendarLink](https://symfony.com/bundles/ux-calendar-link/current/index.html): Save the date, anywhere
- [Chart.js](https://symfony.com/bundles/ux-chartjs/current/index.html): Interactive charts with Chart.js
- [Icons](https://symfony.com/bundles/ux-icons/current/index.html): SVG icons made easy
- [Image Cropper](https://symfony.com/bundles/ux-cropperjs/current/index.html): Form Tools for cropping images
- [Live Components](https://symfony.com/bundles/ux-live-component/current/index.html): Interactive UI in PHP & Twig
- [Map](https://symfony.com/bundles/ux-map/current/index.html): Interactive Maps
- [Native](https://symfony.com/bundles/ux-native/current/index.html): Hotwire Native for Symfony
- [Notify](https://symfony.com/bundles/ux-notify/current/index.html): Native Browser Notifications
- [React](https://symfony.com/bundles/ux-react/current/index.html): Render React components from Twig
- [Stimulus](https://symfony.com/bundles/StimulusBundle): Central Bridge of Symfony UX
- [Stylized Dropzone](https://symfony.com/bundles/ux-dropzone/current/index.html): Upload Files with Style
- [Toolkit](https://symfony.com/bundles/ux-toolkit/current/index.html): Build your Design System.
- [Translator](https://symfony.com/bundles/ux-translator/current/index.html): Symfony Translations in JavaScript
- [Turbo](https://symfony.com/bundles/ux-turbo/current/index.html): Single-page Symfony app
- [Twig Components](https://symfony.com/bundles/ux-twig-component/current/index.html): Render Reusable UI Elements
- [Vue.js](https://symfony.com/bundles/ux-vue/current/index.html): Render Vue components from Twig
## Deprecated and Removed Packages
- **Lazy Image**: Delay Loading with Blurhash — [Migration guide](https://github.com/symfony/ux-lazy-image#readme)
- **Svelte**: Render Svelte components from Twig — [Migration guide](https://github.com/symfony/ux-svelte#readme)
- **Swup Integration**: Stylized Page Transitions — [Migration guide](https://github.com/symfony/ux-swup#readme)
- **Toggle Password**: Password Visibility Switch — [Migration guide](https://github.com/symfony/ux-toggle-password#readme)
- **Typed**: Animated Typing with Typed.js — [Migration guide](https://github.com/symfony/ux-typed#readme)
# Autocomplete
> Ajax-powered Form Select
Ajax-powered, auto-completable `select` elements
## Installation
```bash
composer require symfony/ux-autocomplete
```
## Links
- [Demos and examples](https://ux.symfony.com/autocomplete)
- [Official documentation](https://symfony.com/bundles/ux-autocomplete/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-autocomplete)
# CalendarLink
> Save the date, anywhere
Let users add your events to their calendar of choice in one click.
## Installation
```bash
composer require symfony/ux-calendar-link
```
## Links
- [Demos and examples](https://ux.symfony.com/calendar-link)
- [Official documentation](https://symfony.com/bundles/ux-calendar-link/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-calendar-link)
# Chart.js
> Interactive charts with Chart.js
Easy charts with Chart.js
## Installation
```bash
composer require symfony/ux-chartjs
```
## Links
- [Demos and examples](https://ux.symfony.com/chartjs)
- [Official documentation](https://symfony.com/bundles/ux-chartjs/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-chartjs)
- [Chart.js documentation.](https://www.chartjs.org/)
# Icons
> SVG icons made easy
Render SVG icons seamlessly from your Twig templates.
## Installation
```bash
composer require symfony/ux-icons
```
## Links
- [Demos and examples](https://ux.symfony.com/icons)
- [Official documentation](https://symfony.com/bundles/ux-icons/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-icons)
# Image Cropper
> Form Tools for cropping images
Form Type and tools for cropping images
## Installation
```bash
composer require symfony/ux-cropperjs
```
## Links
- [Demos and examples](https://ux.symfony.com/cropperjs)
- [Official documentation](https://symfony.com/bundles/ux-cropperjs/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-cropperjs)
- [Cropper.js documentation.](https://github.com/fengyuanchen/cropperjs)
# Live Components
> Interactive UI in PHP & Twig
Build dynamic interfaces with zero JavaScript
## Installation
```bash
composer require symfony/ux-live-component
```
## Links
- [Demos and examples](https://ux.symfony.com/live-component)
- [Official documentation](https://symfony.com/bundles/ux-live-component/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-live-component)
# Map
> Interactive Maps
Render interactive Maps in PHP with Leaflet or Google Maps.
## Installation
```bash
composer require symfony/ux-map
```
## Links
- [Demos and examples](https://ux.symfony.com/map)
- [Official documentation](https://symfony.com/bundles/ux-map/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-map)
# Native
> Hotwire Native for Symfony
Build native mobile apps that wrap your Symfony web application
## Installation
```bash
composer require symfony/ux-native
```
## Links
- [Demos and examples](https://ux.symfony.com/native)
- [Official documentation](https://symfony.com/bundles/ux-native/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-native)
- [Hotwire Native documentation.](https://native.hotwired.dev/)
# Notify
> Native Browser Notifications
Trigger native browser notifications from inside PHP
## Installation
```bash
composer require symfony/ux-notify
```
## Links
- [Demos and examples](https://ux.symfony.com/notify)
- [Official documentation](https://symfony.com/bundles/ux-notify/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-notify)
# React
> Render React components from Twig
Quickly render `` components & pass them props.
## Installation
```bash
composer require symfony/ux-react
```
## Links
- [Demos and examples](https://ux.symfony.com/react)
- [Official documentation](https://symfony.com/bundles/ux-react/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-react)
- [Go deeper with the React docs.](https://reactjs.org/)
# Stimulus
> Central Bridge of Symfony UX
Integration with Stimulus for HTML-powered controllers
## Installation
```bash
composer require symfony/stimulus-bundle
```
## Links
- [Demos and examples](https://ux.symfony.com/stimulus)
- [Official documentation](https://symfony.com/bundles/StimulusBundle)
- [GitHub repository](https://github.com/symfony/ux-stimulus)
- [More than 40 videos to master Stimulus.](https://symfonycasts.com/screencast/stimulus)
# Stylized Dropzone
> Upload Files with Style
Form type for stylized "drop zone" for file uploads
## Installation
```bash
composer require symfony/ux-dropzone
```
## Links
- [Demos and examples](https://ux.symfony.com/dropzone)
- [Official documentation](https://symfony.com/bundles/ux-dropzone/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-dropzone)
# Toolkit
> Build your Design System.
Collection of components and templates that you can use to build your pages.
## Installation
```bash
composer require --dev symfony/ux-toolkit
```
## Links
- [Demos and examples](https://ux.symfony.com/toolkit)
- [GitHub repository](https://github.com/symfony/ux-toolkit)
# Translator
> Symfony Translations in JavaScript
Use Symfony's translations in JavaScript
## Installation
```bash
composer require symfony/ux-translator
```
## Links
- [Demos and examples](https://ux.symfony.com/translator)
- [Official documentation](https://symfony.com/bundles/ux-translator/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-translator)
# Turbo
> Single-page Symfony app
Integration with Turbo for single-page-app and real-time experience
## Installation
```bash
composer require symfony/ux-turbo
```
## Links
- [Demos and examples](https://ux.symfony.com/turbo)
- [Official documentation](https://symfony.com/bundles/ux-turbo/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-turbo)
- [Documentation specifically for the Turbo JavaScript library.](https://turbo.hotwired.dev/handbook/introduction)
- [Go deep into all 3 parts of Turbo.](https://symfonycasts.com/screencast/turbo)
# Twig Components
> Render Reusable UI Elements
Create PHP classes that can render themselves
## Installation
```bash
composer require symfony/ux-twig-component
```
## Links
- [Demos and examples](https://ux.symfony.com/twig-component)
- [Official documentation](https://symfony.com/bundles/ux-twig-component/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-twig-component)
# Vue.js
> Render Vue components from Twig
Quickly render `` components & pass them props.
## Installation
```bash
composer require symfony/ux-vue
```
## Links
- [Demos and examples](https://ux.symfony.com/vue)
- [Official documentation](https://symfony.com/bundles/ux-vue/current/index.html)
- [GitHub repository](https://github.com/symfony/ux-vue)
- [Go deeper with the Vue.js docs.](https://vuejs.org/)
# Symfony UX Demos
> Interactive demos showcasing Symfony UX components and features.
## Infinite Scroll - 2/2
Loading on-scroll, flexible layout grid, colorfull loading animations and... more T-Shirts!
The second and final part of the **Infinite Scroll Series**, with a new range of (lovely) T-Shirts!
Now with `automatic loading on scroll`, a new trick and amazing `loading animations`!
Tags: grid, pagination, loading, scroll
- [View demo](https://ux.symfony.com/demos/live-component/infinite-scroll-2)
## Infinite Scroll - 1/2
Load more items as you scroll down the page.
Infinite scroll allows users to continuously load content as they scroll down the page.
`Part One` of this demo shows how to `append new items` to the page with a [`LiveComponent`](/live-component).
Tags: grid, pagination, navigation
- [View demo](https://ux.symfony.com/demos/live-component/infinite-scroll)
## Live Memory Card Game
A Memorable Game UX with Live Components!
A Memorable Game UX with Live Components! Discover how to use Live Components to create a game with a vibrant interface,
rich interactions and real-time updates. This journey will take you through many features of Live Components, and you'll
learn how to use them to create a fun and engaging game.
Tags: game, time, events, LiveAction
- [View demo](https://ux.symfony.com/demos/live-component/live-memory)
## Auto-Validating Form
Create a form that validates each field in-real-time as the user enters data!
Enter a bad email or leave the password empty, and see how the
form validates in real time!
This renders a normal `Symfony` form but with extras added on top,
all generated from Symfony & Twig.
Tags: form, validation, inline
- [View demo](https://ux.symfony.com/demos/live-component/auto-validating-form)
## Embedded CollectionType Form
Create embedded forms with functional "add" and "remove" buttons all in Twig.
Unlock the potential of Symfony's [`CollectionType`](https://symfony.com/doc/current/reference/forms/types/collection.html) while writing zero JavaScript.
This demo shows off adding and removing items entirely in PHP & Twig.
Tags: form, collection
- [View demo](https://ux.symfony.com/demos/live-component/form-collection-type)
## Dependent Form Fields
After selecting the first field, automatically reload the options for a second field.
Unleash the power of form events, thanks to [`LiveComponent`](/live-component) and [`DynamicForms`](https://github.com/SymfonyCasts/dynamic-forms).
Tags: form, field, events
- [View demo](https://ux.symfony.com/demos/live-component/dependent-form-fields)
## Up & Down Voting
Save up & down votes live in pure Twig & PHP.
With each row as its own component, it's easy to add up & down voting + keep track of which items have been voted on.
This uses a [LiveAction](https://symfony.com/bundles/ux-live-component/current/index.html#actions) to save everything with Ajax.
Tags: form, LiveAction
- [View demo](https://ux.symfony.com/demos/live-component/voting)
## Inline Editing
Activate an inline editing form with real-time validation.
Inline editing? Simple. Use LiveComponents to track if you're in "edit" mode, let
the user update any fields on your entity, and save through a `LiveAction`.
Tags: form, inline, LiveAction
- [View demo](https://ux.symfony.com/demos/live-component/inline-edit)
## Auto-Updating Chart
Render & Update a Chart.js chart in real-time.
What do you get with Live Components + UX Chart.js + UX Autocomplete?
An auto-updating chart that you will ❤️.
Tags: chart, data, LiveAction, stimulus
- [View demo](https://ux.symfony.com/demos/live-component/chartjs)
## Invoice Creator
Create an invoice + line items that updates as you type.
Create or edit an `Invoice` entity along with child components for each related `InvoiceItem` entity.
Children components emit events to communicate to the parent and everything is saved in a `saveInvoice` LiveAction method.
Tags: form, entity, events, LiveAction
- [View demo](https://ux.symfony.com/demos/live-component/invoice)
## Product Form + Category Modal
Create a Category on the fly - from inside a product form - via a modal.
Open a child modal component to create a new Category.
Tags: form, entity, events, modal
- [View demo](https://ux.symfony.com/demos/live-component/product-form)
## Uploading files
Upload file from your live component through a LiveAction.
File uploads are tricky. Submit them to a `#[LiveAction]` with the `files` modifier
on `data-live-action` then process them.
Tags: form, file, upload, LiveAction
- [View demo](https://ux.symfony.com/demos/live-component/upload)
# Component Architecture
> Rules and patterns for working with components
Tags: JavaScript, Symfony
---
title: Component Architecture
description: Rules and patterns for working with components
image: images/cookbook/component-architecture.png
tags:
- JavaScript
- Symfony
author: Mathéo Daninos
published_at: '2024-08-02'
---
## Introduction
In Symfony UX, there are two packages: [TwigComponents](https://symfony.com/bundles/ux-twig-component/current/index.html) and [LiveComponent](https://symfony.com/bundles/ux-live-component/current/index.html).
These packages allow you to create reusable components in your Symfony application.
However, component architecture is not exclusive to Symfony; it's a design pattern that can be applied to any programming language or framework.
The JavaScript world has implemented this architecture for a long time, across many frameworks like React, Vue, or Svelte.
A set of rules and patterns has already been defined for working with components. This is why Symfony UX tries to adhere closely to these rules.
Let's explore what these rules are!
## 4 Rules
### Composition
A page is no longer just a page but rather a collection of small, reusable components.
These components can be assembled to form a page. For example, there could be a component for the title and another for the training list.
The training list component could even be composed of smaller components, such as a training card component.
The goal is to create the most atomic and reusable components possible.
***How does it work in Symfony?***
In Symfony, you can have an `Alert` component, for example, with the following template:
```twig
{{ message }}
```
So here you can see we have an `Alert` component that itself uses an Icon component.
Or you can compose with the following syntax:
```twig
```
So here we have a `Alert` component, and we provide the content of this component with two other components.
### Independence
This is a really important rule and not an obvious one. Your component should live in its own context; it
should not be aware of the rest of the page. You should be able to take a component from one page to another, and it should work exactly the same.
This rule makes your component truly reusable.
***How does it work in Symfony?***
Symfony keeps the context of the page within the context of your component. So it is your own responsibility to follow these rules.
Note that if there are conflicts between a variable from the context page and your component, your component context overrides the page context.
### Props
Our component must remain independent, but we can customize its props.
For example, consider a button component. You want your component to look the same on every page, with the only change being the label.
To do this, you can declare a `label` prop in your button component.
When you use your button component, you can pass the label you want as a prop. The component will take this prop at initialization and keep it throughout its lifecycle.
***How does it work in Symfony?***
Let's take the example of the `Alert` component as an [anonymous component](https://symfony.com/bundles/ux-twig-component/current/index.html#anonymous-components).
We have the following template:
```twig
{% props type, icon, message %}
{{ message }}
```
Just like that, we define three props for our `Alert` component. We can now use it like this:
```twig
```
If your component is not anonymous but a class component, you can define props by adding properties to your class.
```php
#[AsTwigComponent]
class Alert
{
public string $type;
public string $icon;
public string $message;
}
```
There is something important to note with props: They should only flow in one direction, from parent to child. Props should never go up. **If your child needs to change something in the parent, you should use events.**
### State
A state is pretty much like a prop, but the main difference is that a state can
change during the life of the component. Let's take the example of a button component.
You can have a `loading` state that can be `true` or `false`. When the button is clicked
the `loading` state can be set to `true`, and the button can display a loader instead of the label.
When the loading is done, the `loading` state can be set to `false`, and the button can display the label again.
***How does it work in Symfony?***
In Symfony, you have two different approaches to handle state. The first is to use Stimulus directly in your component. We recommend setting a Stimulus controller at the root of your component.
```twig
{% props label %}
```
Then, you can define your controller like this:
```js
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
static values = { label: String };
connect() {
this.element.textContent = this.labelValue;
}
loading() {
this.element.textContent = 'Loading...';
}
}
```
The second approach is to use the [LiveComponent](https://symfony.com/bundles/ux-live-component/current/index.html) package.
How to choose between the two? If your component doesn't need any backend logic
for its state, keep it simple and use the Stimulus approach. But if you need to handle
backend logic for your state, use LiveComponent.
With LiveComponent, a live prop is a state. So if you want to store the number of clicks on a button you can do
so with the following component:
```php
clicks++;
$this->save();
}
}
```
## Conclusion
Even in Symfony, you can use component architecture.
Following these rules helps your front-end developers work on a codebase they are familiar with since these rules are
already widely used in the JavaScript world.
# Symfony UX Changelog
> Recent releases and changes to Symfony UX packages.
## v3.4.0 (v3.4.0)
Released: 2026-07-31
**Changelog** (https://github.com/symfony/ux/compare/v3.3.0...v3.4.0)
* feature #3740 [Toolkit][Common] Add `clipboard` and `tooltip` recipes (@kbond)
* feature #3733 [Toolkit] Document Stimulus controller CSS classes and outlets in the API reference (@kbond)
* feature #3741 [Icons] Add `auto_lock` to persist on-demand icons (@Kocal)
* feature #3395 [TwigComponent] Support component tag names from expressions and component objects (@andreybotanic)
* feature #3736 [Toolkit] Rework and normalize usage of `attributes.defaults()` in kits components (@seb-jean, @Kocal)
* minor #3735 Add sync-packages.php to normalize packages .gitattributes (@Kocal)
* bug #3730 Fix broken assets/tsconfig.json reference breaking webpack 5.109+ builds (@zalesak)
* minor #3734 [Toolkit] Remove `height` preview option (@Kocal)
* feature #3724 [Toolkit] Document Stimulus controllers in the recipe API reference (@kbond)
* feature #3725 [Toolkit][Common] Add `closeable` recipe (@kbond)
* feature #3716 [Translator] Make the component non-experimental (@Kocal)
* feature #3713 [Toolkit] Boostrap Toolkit (@smnandre, @Kocal)
* bug #3720 [Toolkit] Fix suggested frontend installation commands (@smnandre)
* feature #3719 [Toolkit] Support kit-level dependencies (@smnandre)
* bug #3721 [Toolkit] Require the correct twig/html-extra version for `html_attr_*` filters (@Kocal)
* feature #3718 [Toolkit] Add a documentation rendering layer so kits can describe themselves (@Kocal)
* feature #3714 [React][Vue] Add support for `import.meta.glob()` (Symfony Reprise) (@Kocal)
* feature #3707 [Toolkit][Common] Add the `common` kit with `logout-link` and `post-link` recipes (@kbond)
* bug #3710 [Toolkit][Shadcn] Fix `Table:Cell` and `Table:Head` class attibutes merging (@stephen-lewis)
* feature #3709 [Toolkit] Add `ClassMergeSpacingChecker` checker to the linter (@Kocal)
## v3.3.0 (v3.3.0)
Released: 2026-07-14
**Changelog** (https://github.com/symfony/ux/compare/v3.2.0...v3.3.0)
* feature #3705 [StimulusBundle] Add support for Symfony Reprise (@Kocal)
* feature #3702 [StimulusBundle] Support preserved `/*! stimulusFetch: 'lazy' */` syntax (@IndraGunawan)
* bug #3703 [StimulusBundle] Sort custom controllers to keep the generated loader deterministic (@Amoifr)
* bug #3676 [LiveComponent] Avoid 500 errors on malformed hydration payloads (@Amoifr)
* bug #3688 [LiveComponent] Fix data-loading scanner ignoring data-live-ignore subtrees (@Amoifr)
* bug #3690 [LiveComponent] Fix support for nullable collection properties on component (@rogierknoester)
* feature #3700 [Toolkit] Resolve `ux:install` recipe name case-insensitively and suggest alternatives (@Kocal)
* feature #3696 [Toolkit][Shadcn] Dismiss the `tooltip` on scroll and resize, and stop it from intercepting pointer events while hidden (@Kocal)
* feature #3694 [Toolkit] Refactor (again) but improve ``@prop`` and ``@block`` comments format (@Kocal)
* bug #3685 [Autocomplete] Fix LIKE ESCAPE clause breaking search on PostgreSQL (@Amoifr)
* feature #3477 [Shadcn] Add Sonner (@makraz)
* minor #3693 [Toolkit] Make component rendering snapshots independent from the libxml version (@Kocal)
* feature #3482 [Toolkit][Shadcn] Add Combobox (@makraz)
## v2.36.2 (v2.36.2)
Released: 2026-07-08
**Changelog** (https://github.com/symfony/ux/compare/v2.36.1...v2.36.2)
* bug #3685 [Autocomplete] Fix LIKE ESCAPE clause breaking search on PostgreSQL (@Amoifr)
## v3.2.0 (v3.2.0)
Released: 2026-06-19
**Changelog** (https://github.com/symfony/ux/compare/v3.1.0...v3.2.0)
* security #cve-2026-55877 [Icons] Sanitize Iconify SVG output and unify icon creation (@Kocal)
* security #cve-2026-55878 [Toolkit] Harden recipe installer against path traversal (@Kocal)
* bug #3682 [Toolkit][Shadcn] Fix position and phantom text-node in `tooltip` recipe (@Kocal)
* feature #3602 [TwigComponent] Allow standalone usage with any PSR-11 container (@guillaume-sainthillier)
* bug #3673 [Encore] Pin vue to <3.5.36 to workaround broken upstream publish (@Kocal)
* bug #3672 [Toolkit][Flowbite4] Fix linting issues (@Kocal)
* feature #3671 [Toolkit] Allow declaring kit-global dependencies in kit manifest (@Kocal)
* bug #3659 [Toolkit] Consider recipe deps in StimulusControllerChecker (@Kocal)
* feature #3655 [Toolkit] Add lint kit command and CI lint workflow (@Kocal)
* bug #3652 [Toolkit][Shadcn] Fix manifest dependencies (@seb-jean)
* feature #3600 [TwigComponent] Expose pre/embedded render methods on `ComponentRendererInterface` (@treztreiz)
* bug #3614 [Turbo] Conflict with Mercure >=0.7.0 <0.7.2 (@Kocal)
* feature #3611 [Native] Rename `ux-native:dump` command to `ux:native:build-configs` (@Kocal)
## v2.36.1 (v2.36.1)
Released: 2026-06-19
**Changelog** (https://github.com/symfony/ux/compare/v2.36.0...v2.36.1)
* security #cve-2026-55877 [Icons] Sanitize Iconify SVG output and unify icon creation (@Kocal)
* security #cve-2026-55878 [Toolkit] Harden recipe installer against path traversal (@Kocal)
## v3.1.0 (v3.1.0)
Released: 2026-05-29
**Changelog** (https://github.com/symfony/ux/compare/v3.0.0...v3.1.0)
* security #557 [LiveComponent] Require X-Requested-With header to prevent CSRF (@Kocal)
* security #cve-2026-49216 [Autocomplete] Fix XSS via unescaped AJAX response data (@Kocal)
* security #cve-2026-49208 [LiveComponent] Parse format-less date LiveProps strictly with RFC 3339 (@Kocal)
* security #cve-2026-49209 [LiveComponent] Cap the number of actions per `_batch` request (@Kocal)
* security #cve-2026-49210 [LiveComponent] Reject malicious child component tags (@Kocal)
* security #cve-2026-49212 [LiveComponent] Bind HMAC checksum to component name and slot (@Kocal)
* security #cve-2026-49211 [Autocomplete] Escape LIKE wildcards in the search query (@Amoifr)
* feature #3601 [Translator] Add `ux:translator:warm-cache` command (@Kocal)
* feature #3432 [LiveComponent] Improve form validation error messages in exceptions (@PierreCapel)
* feature #3455 Use `twig.safe_class` tag and move `setLexer` to `TwigComponentPass` (@GromNaN)
* feature #3586 [Toolkit][Shadcn] Align `button-group` with shadcn reference (@seb-jean)
* feature #3589 [Toolkit][Shadcn] Align `toggle-group` with shadcn reference (@seb-jean)
* feature #3587 [Toolkit][Shadcn] Align `hover-card` with shadcn reference (@seb-jean)
* feature #3584 [Toolkit][Shadcn] Align `collapsible` with shadcn reference (@seb-jean)
* feature #3561 [Toolkit][Shadcn] Align `table` with shadcn reference (@seb-jean)
* feature #3563 [Toolkit][Shadcn] Align `skeleton` with shadcn reference (@seb-jean)
* feature #3583 [Toolkit][Shadcn] Align `dialog` with shadcn reference (@seb-jean)
* feature #3585 [Toolkit][Shadcn] Align `empty` with shadcn reference (@seb-jean)
* bug #3566 [LiveComponent] Make `LiveComponentSubscriber` safe-by-default (@Kocal)
* feature #3591 [Toolkit][Shadcn] Align `switch` with shadcn reference (@seb-jean)
* feature #3592 [Toolkit][Shadcn] Align `field` with shadcn reference (@seb-jean)
* feature #3593 [Toolkit][Shadcn] Align `radio-group` with shadcn reference (@seb-jean)
* feature #3594 [Toolkit][Shadcn] Align `input-group` with shadcn reference (@seb-jean)
* feature #3590 [Toolkit][Shadcn] Align `input` with shadcn reference (@seb-jean)
* feature #3559 [Toolkit][Shadcn] Align `item` with shadcn reference (@seb-jean)
* feature #3574 [Toolkit][Shadcn] Align `label` with shadcn reference (@seb-jean)
* feature #3573 [Toolkit][Shadcn] Align `spinner` with shadcn reference (@seb-jean)
* feature #3576 [Toolkit][Shadcn] Align `checkbox` with shadcn reference (@seb-jean)
* feature #3577 [Toolkit][Shadcn] Align `progress` with shadcn reference (@seb-jean)
* feature #3581 [Toolkit][Shadcn] Align `kbd` with shadcn reference (@seb-jean)
* feature #3553 [Toolkit][Shadcn] Align `alert-dialog` with shadcn reference (@seb-jean)
* feature #3551 [Toolkit][Shadcn] Align `accordion` with shadcn reference (@seb-jean)
* feature #3539 [Toolkit][Shadcn] Align `separator` with shadcn reference (@seb-jean)
* feature #3552 [Toolkit][Shadcn] Align `alert` with shadcn reference (@seb-jean)
* feature #3554 [Toolkit][Shadcn] Align `aspect-ratio` with shadcn reference (@seb-jean)
* feature #3555 [Toolkit][Shadcn] Align `avatar` with shadcn reference (@seb-jean)
* feature #3556 [Toolkit][Shadcn] Align `badge` with shadcn reference (@seb-jean)
* feature #3557 [Toolkit][Shadcn] Align `breadcrumb` with shadcn reference (@seb-jean)
* feature #3558 [Toolkit][Shadcn] Align `button` with shadcn reference (@seb-jean)
* feature #3564 [Toolkit][Shadcn] Align `pagination` with shadcn reference (@seb-jean)
* feature #3567 [Toolkit][Shadcn] Align `tabs` with shadcn reference (@seb-jean)
* feature #3568 [Toolkit][Shadcn] Align `tooltip` with shadcn reference (@seb-jean)
* feature #3569 [Toolkit][Shadcn] Align `textarea` with shadcn reference (@seb-jean)
* feature #3570 [Toolkit][Shadcn] Align `resizable` with shadcn reference (@seb-jean)
* bug #3565 [Autocomplete] Use `hash_equals()` to compare the `extra_options` checksum (@Amoifr)
* feature #3560 [Toolkit][Shadcn] Align `toggle` with shadcn reference (@seb-jean)
* feature #3538 [Toolkit][Shadcn] Align `card` with shadcn reference (@seb-jean)
* feature #3505 [Turbo] Add `` custom element (@seb-jean)
* feature #3531 [Toolkit] Add `version-added` key in toolkit manifest (@MrYamous)
* feature #3460 [CalendarLink] Add component (@zairigimad)
* bug #3508 [LiveComponent] Fix dynamic template resolution when using "loading" attribute (@xDeSwa)
* bug #3500 [TwigComponent] Include attribute name in null value error message (@IndraGunawan)
* feature #3527 [Toolkit][Shadcn] Rework `collapsible` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3526 [Toolkit][Shadcn] Rework `tooltip` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3525 [Toolkit][Shadcn] Rework `alert-dialog` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3524 [Toolkit][Shadcn] Rework `dialog` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3523 [Toolkit][Shadcn] Rework `accordion` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3528 [Toolkit][Shadcn] Rework `toggle-group` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3521 [Toolkit][Shadcn] Rework `tabs` recipe to use `provide()`/`inject()` (@Kocal)
* feature #3512 [TwigComponent] Add `provide()` and `inject()` Twig functions (@Kocal)
* feature #3478 [Toolkit][Shadcn] Add hover-card recipe (@Amoifr)
* feature #3485 [Toolkit][Shadcn] Add resizable recipe (@Amoifr)
* feature #3462 [Turbo] Add TurboFrame service to detect Turbo Frame requests (@seb-jean)
* feature #3439 [Turbo] Add minimal frame layout template (@seb-jean)
* feature #3464 [Toolkit][Shadcn] Add radio-group, collapsible, typography and toggle-group recipes (@Amoifr)
* feature #3442 [LiveComponent] Use `aria-busy` attribute during component re-render (@Amoifr)
* feature #3459 [Toolkit][Flowbite] add Dropdown and Avatar component (@DcgRG)
## v2.36.0 (v2.36.0)
Released: 2026-05-29
**Changelog** (https://github.com/symfony/ux/compare/v2.35.0...v2.36.0)
* security #557 [LiveComponent] Require X-Requested-With header to prevent CSRF (@Kocal)
* security #cve-2026-49216 [Autocomplete] Fix XSS via unescaped AJAX response data (@Kocal)
* security #cve-2026-49208 [LiveComponent] Parse format-less date LiveProps strictly with RFC 3339 (@Kocal)
* security #cve-2026-49209 [LiveComponent] Cap the number of actions per `_batch` request (@Kocal)
* security #cve-2026-49210 [LiveComponent] Reject malicious child component tags (@Kocal)
* security #cve-2026-49212 [LiveComponent] Bind HMAC checksum to component name and slot (@Kocal)
* security #cve-2026-49211 [Autocomplete] Escape LIKE wildcards in the search query (@Amoifr)
## 3.0.0 : New Major Release! 🎉 (v3.0.0)
Released: 2026-04-13
**Changelog** (https://github.com/symfony/ux/compare/v2.35.0...v3.0.0)
* feature #3452 [LiveComponent] Remove compatibility layer with Symfony PropertyInfo <7.1 (@Kocal)
* feature #3453 Update minimum required Symfony version to 7.4 (@Kocal)
* feature #3450 Upgrade minimum required PHP version to 8.4 (@Kocal)
* feature #3433 [Cropper] Always apply rotation in `Crop::getCroppedImage()` and `Crop::getCroppedThumbnail()` (@MrYamous)
* bug #3398 Post-merge fixes for 3.x (@Kocal)
* feature #3186 [Autocomplete][Turbo] Remove BC layers for methods and parameters (@Kocal)
* bug #3191 Fix 2.x -> 3.x merge (@Kocal)
* bug #3187 Add phpunit.dist.xml in .gitattributes (@Kocal)
* bug #3182 Drop Symfony PHPUnit Bridge in favor of PHPUnit >= 11.0 (@Kocal)
* feature #3180 [StimulusBundle] Remove deprecations for 3.0 (@Kocal)
* feature #3179 [Vue] Remove deprecations for 3.0 (@Kocal)
* feature #3103 [Autocomplete] Remove deprecated code for 3.0 (@smnandre)
* feature #3115 [Map][Google] Upgrade `@googlemaps`/js-api-loader to ^2.0 (@Kocal)
* bug #3105 [TwigComponent] Remove dev-dependency on WebpackEncoreBundle (@Kocal)
* feature #3102 [Chartjs][Notify][React][Svelte] Remove StimulusHelper deprecation for 3.0 (@smnandre)
* feature #3101 [Vue] Remove deprecations for 3.0 (@smnandre)
* feature #3100 [Turbo] Remove deprecations for 3.0 (@smnandre)
* feature #3040 [TwigComponent][UX3] Remove deprecations (@smnandre)
* feature #3051 [LiveComponent][UX3] Remove deprecations (@smnandre)
* feature #3054 [Map] Remove deprecations from Map (@Kocal)
* feature #2998 Upgrade minimum required PHP version to 8.2 (@Kocal)
* feature #2996 Update minimum required Symfony version to ^6.4 (@Kocal)
* feature #2995 [TogglePassword] Remove package (@Kocal)
* feature #2994 [LazyImage] Remove package (@Kocal)
* feature #2993 [Typed] Remove package (@Kocal)
* feature #2985 [Swup] Remove package (@smnandre)
## v2.35.0 (v2.35.0)
Released: 2026-04-13
**Changelog** (https://github.com/symfony/ux/compare/v2.34.0...v2.35.0)
* feature #3444 [Svelte] Deprecate the package (@Kocal)
* feature #3422 [Autocomplete] Add option `clear_on_focus` (@zairigimad)
* feature #3368 [Toolkit][Flowbite] Add kit Flowbite 4.0 base (@DcgRG)
* feature #3421 [Toolkit][Shadcn] Add Toggle (@zairigimad)
* feature #3407 [Chartjs][Icons][Map][Notify][React][Svelte][Toolkit][Turbo][TwigComponent][Vue][Native] Allow Symfony UX 3.x packages (@Kocal)
* feature #3414 [Native] Introduce `assets/` to ease installation of ``@hotwired`/hotwire-native-bridge` JS dependency (@Kocal)
* feature #3409 [Toolkit] Embrace `html_attr_type` from `twig/html-extra:^3.24` to correctly merge trigger's attributes (@Kocal)
* feature #3408 [TwigComponent] Add support for `AttributeValueInterface` from `twig/html-extra:^3.24.0` in `ComponentAttributes` (@Kocal)
## 2.34.0 : CropperJS PHP Rotations 🔄 (v2.34.0)
Released: 2026-03-22
**Changelog** (https://github.com/symfony/ux/compare/v2.33.0...v2.34.0)
* bug #3404 [Native] Fix invalid priority for DevServerListener (@zairigimad)
* bug #3401 [Autocomplete][Chartjs][Cropperjs][Dropzone][LazyImage][LiveComponent][Map][Notify][React][StimulusBundle][Svelte][Swup][TogglePassword][Turbo][Typed][Vue][Translator] Update package.json to `2.33.0` (@Kocal)
* feature #3347 [Cropperjs] Add image rotation in php side (@MrYamous)
* bug #3400 [CI] Update permissions to allow pushing changes to the repository during NPM release (@Kocal)
* bug #3367 [LiveComponent] Allow empty values to bypass model validation modifiers (@xDeSwa)
* bug #3389 [React] Fix internal requirement of React 19 (devDependencies) (@milanqtx)
## 2.33.0 : UX Native! (v2.33.0)
Released: 2026-03-17
#### Major Changes
- **UX Native:** new component (again!) :rocket:
- **UX Toolkit:** many changes and fixes on existing recipes from Shadcn Kit
- **UX LiveComponent:** add option fetchCredentials
- **UX TwigComponent:** dynamic template at runtime
#### Minor Changes
- **UX TwigComponent:** minor performance improvement, and a fix when the components profiling was always enabled
- **UX Translator:** minor performance improvement
- **UX React:** support for React 19
- **UX Icons:** Add support for suffixes
#### Documentation Changes
- **UX TwigComponent:** readonly components, HoC components
- **UX Svelte:** Svelte 4 support
**Changelog** (https://github.com/symfony/ux/compare/v2.32.0...v2.33.0)
* bug #3342 [Translator] Improve performance of dumper under certain condition (@mkrauser)
* feature #3338 [Native] Init Hotwire Native (@imad)
* feature #3356 [Toolkit][Shadcn] Add Tabs recipe (@DcgRG)
* bug #3372 [LiveComponent][TwigComponent] Fix reflection issues for private properties from trait and parent class (@kachnitel)
* bug #3376 [Toolkit][Shadcn] Fix initial "open" state for AlertDialog and Dialog (Sylvain Gagnot)
* bug #3381 [TwigComponent] Fix profiling loaded in production (@VincentChataignier)
* feature #3364 [LiveComponent] Add `debug:live-component` command (Mickaël BULIARD)
* bug #3373 [Toolkit][Shadcn] Fix Tooltip's wrapper when re-rendered by LiveComponent (Sylvain Gagnot)
* feature #3361 [LiveComponent][TwigComponent] Add support for dynamic template resolution (@xDeSwa)
* bug #3363 [LiveComponent] Fix preservation of !important inline style changes (@xDeSwa)
* feature #3362 Migrate from tsup (deprecated) to tsdown (@Kocal)
* bug #3359 Fix JS unit testing script (@Kocal)
* bug #3355 Fix CI (@Kocal)
* bug #3353 [TwigComponent] Fix PHPDoc types of `TestLiveComponent::call()` (@StevenRenaux)
* bug #3348 [Toolkit] Fix `tailwind_merge` parentheses and simplify `attributes` … (@seb-jean)
* bug #3345 [Toolkit] Rewrite ``@prop`` documentation to normalize `Defaults to ...` (@Kocal)
* feature #3324 [Icons] Add support for suffixes (@seb-jean)
* feature #3336 [LiveComponent] Add option `fetchCredentials` (@Kocal)
* bug #3343 [Toolkit] Improve ``@prop`` and ``@block`` annotations description (@Kocal)
* bug #3341 [TwigComponent] Minor performance improvement by caching `PropertyAccessor::isWritable()` calls (@Kocal)
* bug #3340 [TwigComponent] Minor performance improvements when using `{ props }` (@Kocal)
* feature #3295 [TwigComponent] Add support for anonymous component name resolution in other bundle (@Phil23)
* feature #3326 [Toolkit][Shadcn] Update Avatar component (@ker0x, @Kocal)
* bug #3337 [LiveComponent] Fix tests with lowest dependencies, incompatibility with `zenstruck/foundry` and Symfony 5.4 (@GromNaN)
* bug #3325 Fix minimum requested 6.x version of FrameworkBundle for LiveComponent (@Kocal)
* bug #3323 [Autocomplete][Chartjs][Cropperjs][Dropzone][LazyImage][React][StimulusBundle][Svelte][Swup][TogglePassword][Turbo][Typed][Vue][Translator] Use `Extension` from `DependencyInjection` instead of `HttpKernel` (@Kocal)
* feature #3318 [Toolkit][Shadcn] Update Alert CSS class, add Alert:Action component (@ker0x)
* feature #3321 [Toolkit][Shadcn] Add Tooltip component (@Kocal)
* feature #3292 [Toolkit][Shadcn] Add Accordion component (@daFish)
* bug #3320 Fix `Field` demo code (@Kocal)
* feature #3314 [React] Add support for React 19 (@Kocal)
* feature #3299 [Toolkit][Shadcn] Rework recipes docs/examples (@Kocal)
* bug #3304 Fix npm releases due to `repository` issue (@Kocal)
* bug #3300 [Toolkit][Shadcn] Fix text color in dark mode for AlertDialog/Dialog components (@Kocal)
* bug #3291 [Toolkit][Shadcn] Fix text color of `Badge` destructive variant (@Jibbarth)
* feature #3282 [Toolkit] Prepare base for recipe type `Block` (@jeremyFreeAgent)
* bug #3290 Update root JS dependencies (@Kocal)
* feature #3285 [StimulusBundle] Change AssetMapper `excluded_patterns` from `**/controllers.json` to `*/controllers.json` (@Kocal)
* bug #3280 [CI] Fix compatibility issues with Symfony 8 and spatie/phpunit-snapshot-assertions (@Kocal)
* bug #3279 [CI] Remove usage of framework.annotations.enabled (@Kocal)
* bug #3278 [Toolkit] Fix recipe name display when asking for what alternative recipe to install (@jeremyFreeAgent)
* bug #3277 [Toolkit] fix getRecipes method with type (@jeremyFreeAgent)
* bug #3273 [Turbo] Fix `SplObjectStorage::attach` deprecation in Doctrine Broadcast listener (@GromNaN)
## 2.32.0 : Toolkit! (v2.32.0)
Released: 2026-01-05
### Autocomplete
* Untranslated `no_results` label when `options_as_html` is set by @maxperei in https://github.com/symfony/ux/pull/3148
* Add documentation about plugins management by @raphael-geffroy in https://github.com/symfony/ux/pull/3087
* Fix missing space in JSON snippet by @kasperh90 in https://github.com/symfony/ux/pull/3207
* Fix issue where TomSelect could already been initialized on an element by @daFish in https://github.com/symfony/ux/pull/3155
* Fix code-block rendering in Autocomplete by @JoppeDC in https://github.com/symfony/ux/pull/3259
### Turbo
* Fix Mercure custom transport with `turbo_steam_listen` by @Fan2Shrek in https://github.com/symfony/ux/pull/3147
### Twig Components
* Add option to disable the dump of components by @alinceDev in https://github.com/symfony/ux/pull/3066
* Fix typo in documentation by @alvidias in https://github.com/symfony/ux/pull/3168
* Allow using directory name as component name for anonymous components by @andyexeter in https://github.com/symfony/ux/pull/3169
### Live Components
* Add clarification of component re-rendering vs. loading content by @Wertisdk in https://github.com/symfony/ux/pull/3164
* Pin `phpdocumentor/reflection-docblock` to non dev version by @Kocal in https://github.com/symfony/ux/pull/3250
* Update index.rst with MarkdownTextarea template info by @Kocal in https://github.com/symfony/ux/pull/3267
### Map
* Add `Map::removeAll*()` method on Elements by @StevenRenaux in https://github.com/symfony/ux/pull/3245
### Icons
* Fix `aliases` and `default_attributes` config types for `config/reference.php` by @Kocal in https://github.com/symfony/ux/pull/3200
### Toolkit
* Add support for documenting props/blocks API by @Kocal in https://github.com/symfony/ux/pull/3154
* Add Item component by @bernard-ng in https://github.com/symfony/ux/pull/3144
* Update Button CSS class, remove as props by @ker0x in https://github.com/symfony/ux/pull/3158
* Add CONTRIBUTING.md by @Kocal in https://github.com/symfony/ux/pull/3161
* Add missing as props, update CONTRIBUTING.md by @ker0x in https://github.com/symfony/ux/pull/3166
* Add `Dialog` component by @seb-jean in https://github.com/symfony/ux/pull/3173
* Pin `tales-from-a-dev/twig-tailwind-extra` to `^1.0.0` by @Kocal in https://github.com/symfony/ux/pull/3190
* Remove hover style to clearly distinguish from Button by @tassilogroeper in https://github.com/symfony/ux/pull/3197
* Add new component kdb from shadcn ui by @tassilogroeper in https://github.com/symfony/ux/pull/3198
* add Empty component by @bernard-ng in https://github.com/symfony/ux/pull/3213
* add Field component by @bernard-ng in https://github.com/symfony/ux/pull/3214
* add ButtonGroup component by @bernard-ng in https://github.com/symfony/ux/pull/3215
* Add InputGroup component by @daFish in https://github.com/symfony/ux/pull/3236
* Fix forgotten documentation links, follows #3097 by @Kocal in https://github.com/symfony/ux/pull/3254
* Update CSS file by @Kocal in https://github.com/symfony/ux/pull/3258
### Translator
* Refactor API to use string-based translation keys instead of generated constants by @Kocal in https://github.com/symfony/ux/pull/3208
* Early exit parameters extraction from Intl messages, if no `{` is found by @Kocal in https://github.com/symfony/ux/pull/3219
* Add option `ux_translator.dump_typescript` to enable/disable TypeScript types generation by @Kocal in https://github.com/symfony/ux/pull/3218
* Reword `dump_typescript` option description by @Kocal in https://github.com/symfony/ux/pull/3221
* Refactor `TranslationsDumper` options from `__constructor` and setters, to `dump` method by @Kocal in https://github.com/symfony/ux/pull/3244
* Add `keys_patterns` configuration option to filter dumped translations by key patterns by @Kocal in https://github.com/symfony/ux/pull/3248
### Site
* Fix upson logo & url by @smnandre in https://github.com/symfony/ux/pull/3220
* Hide Toolkit menu by @Kocal in https://github.com/symfony/ux/pull/3224
* Minor fixes before deployement by @Kocal in https://github.com/symfony/ux/pull/3229
* Un-hide Toolkit, partially reverts #3224 by @Kocal in https://github.com/symfony/ux/pull/3255
* Rework Toolkit recipe rendering system, improve our Markdown converter by @Kocal in https://github.com/symfony/ux/pull/3256
* Fix TerminalCommand layout by @smnandre in https://github.com/symfony/ux/pull/3268
### Miscellaneous
* Tests over Symfony 7.4.0-RC1 and 8.0.0-RC1 by @Kocal in https://github.com/symfony/ux/pull/3159
* Fix CI when testing Symfony RCs versions by @Kocal in https://github.com/symfony/ux/pull/3178
* Add support for MercureBundle ^0.4.1 and Mercure ^0.7.0 by @Kocal in https://github.com/symfony/ux/pull/3185
* Tests on Symfony 8 stable by @Kocal in https://github.com/symfony/ux/pull/3192
* Git-ignore config/reference.php by @Kocal in https://github.com/symfony/ux/pull/3205
* Add E2E tests for Autocomplete by @Kocal in https://github.com/symfony/ux/pull/3230
* Add E2E tests for LiveComponent by @Kocal in https://github.com/symfony/ux/pull/3235
* Add E2E tests for Chart.js by @Kocal in https://github.com/symfony/ux/pull/3237
* Add E2E tests for Turbo by @Kocal in https://github.com/symfony/ux/pull/3239
* Add E2E tests for CropperJS by @Kocal in https://github.com/symfony/ux/pull/3240
* Add quality tools: PHP-CS-Fixer and Twig-CS-Fixer by @Kocal in https://github.com/symfony/ux/pull/3249
* Fix pnpm build command by @Kocal in https://github.com/symfony/ux/pull/3252
* Truly leverage PHP-CS-Fixer and Twig-CS-Fixer to Fabbot by @Kocal in https://github.com/symfony/ux/pull/3251
* Ensure "apps/" exists before adding it in Finder by @Kocal in https://github.com/symfony/ux/pull/3257
* PHP CS Fixer: update usage by @keradus in https://github.com/symfony/ux/pull/3263
* Run Twig-CS-Fixer on all repo's files, follow #3263 by @Kocal in https://github.com/symfony/ux/pull/3264
### New Contributors
* @alinceDev made their first contribution in https://github.com/symfony/ux/pull/3066
* @alvidias made their first contribution in https://github.com/symfony/ux/pull/3168
* @Wertisdk made their first contribution in https://github.com/symfony/ux/pull/3164
* @andyexeter made their first contribution in https://github.com/symfony/ux/pull/3169
* @tassilogroeper made their first contribution in https://github.com/symfony/ux/pull/3197
**Full Changelog**: https://github.com/symfony/ux/compare/v2.31.0...v2.32.0
## 2.31.0 : E2E Tests with Playwright (v2.31.0)
Released: 2025-10-23
### Live Components
* Fix new URL generation when using `LiveProp` with custom `fieldName` by @Kocal in https://github.com/symfony/ux/pull/3058
* Small update to explicit custom template path on components by @DocFX in https://github.com/symfony/ux/pull/3072
* Improve performance for `LiveUrlSubscriber` by @dannyvw in https://github.com/symfony/ux/pull/3077
* Replace the browser's URL before triggering `render:finished` hook by @xDeSwa in https://github.com/symfony/ux/pull/3088
* Add missing import to code snippet by @rgeraads in https://github.com/symfony/ux/pull/3127
* Add dispatch browser event assertion in `InteractsWithLiveComponents` by @Develog in https://github.com/symfony/ux/pull/3136
### Twig Components
* Remove floating text in documentation by @alexislefebvre in https://github.com/symfony/ux/pull/3131
* Document how to define mandatory/default props by @alexislefebvre in https://github.com/symfony/ux/pull/3132
### Icons
* Updates for UX Icons docs by @javiereguiluz in https://github.com/symfony/ux/pull/3063
* Explain svg colors and improve example configuration by @dbu in https://github.com/symfony/ux/pull/2671
* Add documentation on icons colors by @StevenRenaux in https://github.com/symfony/ux/pull/3082
### Map
* Add `fitBoundsToMarkers` option to Twig extension and component by @ker0x in https://github.com/symfony/ux/pull/3114
* Display warning when trying to define a custom icon for a `Marker` that already has an `Icon` by @ker0x in https://github.com/symfony/ux/pull/3118
### Vue
* Fix Route PHP attribute in Vue Router Web History mode by @michael-bouvy in https://github.com/symfony/ux/pull/3069
### StimulusBundle
* Add missing closing brace in AssetMapper 6.3 example by @quentinRogeret34 in https://github.com/symfony/ux/pull/3096
### Toolkit
* Add npm & importmap package dependencies by @Kocal in https://github.com/symfony/ux/pull/3071
* Add AlertDialog recipe by @Kocal in https://github.com/symfony/ux/pull/3073
* Rework the "dependencies" Recipe JSON schema by @Kocal in https://github.com/symfony/ux/pull/3076
* Minor fixes by @Kocal in https://github.com/symfony/ux/pull/3085
* Delay/hide the "Community Kits" feature, minor fixes by @Kocal in https://github.com/symfony/ux/pull/3097
* Rework recipe name by @Kocal in https://github.com/symfony/ux/pull/3107
* Add missing UX Icons dependencies by @Kocal in https://github.com/symfony/ux/pull/3129
* Add Spinner component by @bernard-ng in https://github.com/symfony/ux/pull/3145
### Translator
* Add E2E tests by @Kocal in https://github.com/symfony/ux/pull/3080
### Site
* Add examples listing on homepage, improve example page by @Kocal in https://github.com/symfony/ux/pull/3078
* Fix UX Translator demo on "price" parameter by @Kocal in https://github.com/symfony/ux/pull/3081
* Lock icons by @Kocal in https://github.com/symfony/ux/pull/3084
* Fix port to 9044 and upgrade UX dependencies by @Kocal in https://github.com/symfony/ux/pull/3093
### Miscellaneous
* Fix highest jobs with Doctrine ^3.0 by @Kocal in https://github.com/symfony/ux/pull/3059
* Configure .gitattributes to ignore Vitest and Playwright config files from export by @Kocal in https://github.com/symfony/ux/pull/3062
* PHP CS Fixer - apply const->var annotation conversion by @keradus in https://github.com/symfony/ux/pull/3065
* Prevent pnpm to install new packages published the same day by @Kocal in https://github.com/symfony/ux/pull/3083
* Fix deprecations with zenstruck/foundry:^2.7 by @Kocal in https://github.com/symfony/ux/pull/3089
* Add doc for E2E steps + minor modifications by @raphael-geffroy in https://github.com/symfony/ux/pull/3086
* Refactor "test_package.sh" to its original purpose, add multiples checks for packages definition by @Kocal in https://github.com/symfony/ux/pull/3090
* Fix `composer config` to avoid modifying `package.json` automatically by @Crovitche-1623 in https://github.com/symfony/ux/pull/3091
* Remove explicit configuration `twig.exception_controller` from Kernel for testing by @Kocal in https://github.com/symfony/ux/pull/3106
* Remove duplicated matrix entry for Symfony version in unit-tests.yaml by @Kocal in https://github.com/symfony/ux/pull/3108
* Add `--json` flag to composer config command by @Kocal in https://github.com/symfony/ux/pull/3139
* Configure OIDC for trusted auto-publishing by @Kocal in https://github.com/symfony/ux/pull/3142
### New Contributors
* @keradus made their first contribution in https://github.com/symfony/ux/pull/3065
* @DocFX made their first contribution in https://github.com/symfony/ux/pull/3072
* @michael-bouvy made their first contribution in https://github.com/symfony/ux/pull/3069
* @quentinRogeret34 made their first contribution in https://github.com/symfony/ux/pull/3096
* @rgeraads made their first contribution in https://github.com/symfony/ux/pull/3127
* @bernard-ng made their first contribution in https://github.com/symfony/ux/pull/3145
* @Develog made their first contribution in https://github.com/symfony/ux/pull/3136
**Full Changelog**: https://github.com/symfony/ux/compare/v2.30.0...v2.31.0
## 2.30.0 : PHP 8.5 (v2.30.0)
Released: 2025-08-27
Hey UX'ers!
This release focuses on stability and compatibility: Live Components and Maps get key
bug fixes, React and Icons see small improvements, and Symfony UX is now fully compatible
with PHP 8.5.
### Twig Components
* Replace Twig comments with PHP comments by @Tastaturberuf in https://github.com/symfony/ux/pull/3037
### Live Components
* Return empty string for `data-value=""` instead of falling back to `null` by @mercuryseries in https://github.com/symfony/ux/pull/3031
* Clean `versionadded` by @smnandre in https://github.com/symfony/ux/pull/3049
* Refactor and fix some edge cases on new URL generation with path + query LiveProps by @Kocal in https://github.com/symfony/ux/pull/3053
* Fix BC Break when defining `LiveProp` properties with PHPDoc type and no-native type, when using TypeInfo by @norkunas in https://github.com/symfony/ux/pull/3043
### Map
* Fix InfoWindow auto-opening by @Kocal in https://github.com/symfony/ux/pull/3034
* Correct and reword typos about polygons by @Kocal in https://github.com/symfony/ux/pull/3035
* Deprecate option `title` from `Polygon`, `Polyline`, `Rectangle` and `Circle` in favor of `infoWindow` by @Kocal in https://github.com/symfony/ux/pull/3036
* Add E2E tests, close #3022 by @Kocal in https://github.com/symfony/ux/pull/3038
* Fix typo by @rrr63 in https://github.com/symfony/ux/pull/3046
### React
* Fix importmap to require `react-dom/client` by @Kocal in https://github.com/symfony/ux/pull/3030
### Icons
* Fallback to default dimensions 16/16 when Icon's dimensions on Iconify are missing by @stlgaits in https://github.com/symfony/ux/pull/3042
### Miscellaneous
* Create E2E app for browsers tests by @Kocal in https://github.com/symfony/ux/pull/3014
* Rename `test_apps` to `apps` by @Kocal in https://github.com/symfony/ux/pull/3041
* Fix `highest-deps` job by @Kocal in https://github.com/symfony/ux/pull/3044
* Ensure PHP 8.5 compatibility by @Kocal in https://github.com/symfony/ux/pull/3045
* Re-configure LF eof in git by @Kocal in https://github.com/symfony/ux/pull/3047
* Add E2E tests by @Kocal in https://github.com/symfony/ux/pull/3048
* Remove some indirect deprecations by @Kocal in https://github.com/symfony/ux/pull/3055
### New Contributors
* @Tastaturberuf made their first contribution in https://github.com/symfony/ux/pull/3037
* @stlgaits made their first contribution in https://github.com/symfony/ux/pull/3042
**Full Changelog**: https://github.com/symfony/ux/compare/v2.29.2...v2.30.0
## 2.29.2 : fix LiveProp (v2.29.2)
Released: 2025-08-19
Hey UX'ers!
This release fixes a Live Component, `LiveProp` URL generation bug, it now correctly re-use the previous logic with support of Serializer and custom modifiers.
### Live Components
* Fix new URL calculation with `LiveProp` using Serializer (and attributes), and when using custom modifier by @Kocal in https://github.com/symfony/ux/pull/2988
### Icons
* Update the links to some icon sets by @javiereguiluz in https://github.com/symfony/ux/pull/2992
### ToolKit
* Improve CI workflows for linting Kits by @Kocal in https://github.com/symfony/ux/pull/2984
* Rework kits architecture, change term for "recipe" by @Kocal in https://github.com/symfony/ux/pull/2986
### Miscellaneous
* Remove unnecessary checks for PHP <8.1 (in tests) by @Kocal in https://github.com/symfony/ux/pull/2999
* Make the Windows CI green by @Kocal in https://github.com/symfony/ux/pull/3000
* Ensure UX Map assets are built first by @Kocal in https://github.com/symfony/ux/pull/3001
* Remove PHP-CS-Fixer job by @Kocal in https://github.com/symfony/ux/pull/3002
* Run latest PHP-CS-Fixer with improved configuration by @Kocal in https://github.com/symfony/ux/pull/3003
* Fix highest dev jobs by @Kocal in https://github.com/symfony/ux/pull/3004
* Configure Vitest for unit and browser tests (use @puppeteer/browsers and webdriverio) by @Kocal in https://github.com/symfony/ux/pull/3010
* Use Playwright for Browser testing by @Kocal in https://github.com/symfony/ux/pull/3013
**Full Changelog**: https://github.com/symfony/ux/compare/v2.29.1...v2.29.2
## 2.29.1 : npm fix (v2.29.1)
Released: 2025-08-08
Hey UX'ers!
Small bug fix release to fix installing the Map bridges with npm.
### Map
* Allows Bridges JavaScript assets to be installed with `npm` when using `file:vendor/symfony/ux-*-map/assets` by @Kocal in https://github.com/symfony/ux/pull/2983
**Full Changelog**: https://github.com/symfony/ux/compare/v2.29.0...v2.29.1
## 2.29.0 : Symfony 8! (v2.29.0)
Released: 2025-08-08
Hey UX'ers!
This release adds Symfony 8 support for all packages! In Map, we've added clustering support.
We've also deprecated the TogglePassword package, Symfony UX 3.0 will drop this package.
### Autocomplete
* Fix Fixtures\Form missing base namespace by @smnandre in https://github.com/symfony/ux/pull/2962
### Map
* Add Clustering Algorithms by @smnandre in https://github.com/symfony/ux/pull/2554
### Live Components
* Fix `#[LiveProp(writable: true, url: true)]` that was not updated as a query parameter by @mbuliard in https://github.com/symfony/ux/pull/2976
* Fix typo on `Valid` constraint name by @Seb33300 in https://github.com/symfony/ux/pull/2980
### TogglePassword
* Deprecate the package by @Kocal in https://github.com/symfony/ux/pull/2972
### Vue
* Update dev dependency `@vitejs/plugin-vue` by @neothone in https://github.com/symfony/ux/pull/2977
### Miscellaneous
* Add support for Symfony 8 by @Kocal in https://github.com/symfony/ux/pull/2973
* Remove `bin/rollup.ts` by @Kocal in https://github.com/symfony/ux/pull/2981
### New Contributors
* @neothone made their first contribution in https://github.com/symfony/ux/pull/2977
* @Seb33300 made their first contribution in https://github.com/symfony/ux/pull/2980
**Full Changelog**: https://github.com/symfony/ux/compare/v2.28.2...v2.29.0
## 2.28.2 : Whoopsie 2 (v2.28.2)
Released: 2025-07-30
Hey UX'ers!
This fixes a LiveComponent regression added in 2.28.0.
### Live Components
* Fix `LiveUrlSubscriber` throw `MethodNotAllowed` by @smnandre in https://github.com/symfony/ux/pull/2961
### Icons
* Change `xmlns` attribute of downloaded icons to `http://www.w3.org/2000/svg` by @roverwolf in https://github.com/symfony/ux/pull/2959
### Miscellaneous
* Rework `app-tests` job to use `npm` as user's packages manager by @Kocal in https://github.com/symfony/ux/pull/2953
* Fix npm releases with pnpm by @Kocal in https://github.com/symfony/ux/pull/2954
* Add Fabbot as a GitHub Actions by @Kocal in https://github.com/symfony/ux/pull/2955
* Apply fabbot rules by @nicolas-grekas in https://github.com/symfony/ux/pull/2957
### New Contributors
* @roverwolf made their first contribution in https://github.com/symfony/ux/pull/2959
**Full Changelog**: https://github.com/symfony/ux/compare/v2.28.1...v2.28.2
## 2.28.1 : Whoopsie (v2.28.1)
Released: 2025-07-28
Hey UX'ers!
We got a little too fancy in our `package.json` files.
### Miscellaneous
* Fix `package.json` files to not use "catalog" feature from PNPM, as it breaks installation from `vendor/` PHP packages by @Kocal in https://github.com/symfony/ux/pull/2952
**Full Changelog**: https://github.com/symfony/ux/compare/v2.28.0...v2.28.1
## 2.28.0 : Map Graduates 🎓 (v2.28.0)
Released: 2025-07-28
Hey UX'ers!
Map now has `minZoom`/`maxZoom` options and has graduated from experimental to stable! 🎉
In LiveComponents, the `LiveProp` can now map to a routing parameter. Autocomplete now
has the ability to disable plugins.
> [!WARNING]
> If using React with `symfony/asset-mapper` and *NOT* `symfony/flex`, there is a *small* BC break.
> See the [CHANGELOG](https://github.com/symfony/ux/blob/2.x/src/React/CHANGELOG.md#2280) for mitigation details.
### Autocomplete
* Force installation of CSS files for AssetMapper by @leevigraham in https://github.com/symfony/ux/pull/2902
* Upgrade Foundry to ^2.0 by @Kocal in https://github.com/symfony/ux/pull/2928
* Allow plugins to be disabled through `tom_select_options.plugins. = false` by @maartendekeizer in https://github.com/symfony/ux/pull/401
### Live Components
* Update css to cover more data-loading use cases by @barlito in https://github.com/symfony/ux/pull/2891
* Fix BC break when using `PropertyTypeExtractorInterface::getType()` on a `#[LiveProp]` property `x` when getter `getX` exists by @Kocal in https://github.com/symfony/ux/pull/2922
* Add validation modifiers (min_length, max_length, min_value, max_value) to data-model inputs by @xDeSwa in https://github.com/symfony/ux/pull/2926
* Add the possibility to map `LiveProp` as a path parameter by @mbuliard in https://github.com/symfony/ux/pull/2673
### Icons
* Don't disable commands based on debug by @kbond in https://github.com/symfony/ux/pull/2884
* Document `icon_sets` configuration by @Kocal in https://github.com/symfony/ux/pull/2938
* Fix `icon_sets` configuration documentation, follow #2938 by @Kocal in https://github.com/symfony/ux/pull/2939
* Some fixes on LiveComponent assets by @Kocal in https://github.com/symfony/ux/pull/2940
### Map
* Rewrite documentation about extra data by @Kocal in https://github.com/symfony/ux/pull/2871
* Add options `minZoom` and `maxZoom` by @Kocal in https://github.com/symfony/ux/pull/2896
* Mark package as non-experimental by @Kocal in https://github.com/symfony/ux/pull/2945
* Replace deprecation Vitest option `browser.name` to `browser.instances` by @Kocal in https://github.com/symfony/ux/pull/2947
### Translator
* Minor fixes in tests context by @Kocal in https://github.com/symfony/ux/pull/2870
* Add functional test to ensure only enabled locales are dumped by @Kocal in https://github.com/symfony/ux/pull/2946
### Swup
* Correct typo in Swup `README.md` by @Kocal in https://github.com/symfony/ux/pull/2883
### 🚧 Toolkit 🚧
* Fix compatibility with Windows by @Kocal in https://github.com/symfony/ux/pull/2892
### Site
* Improve Package header on mobile by @maxperei in https://github.com/symfony/ux/pull/2893
### Miscellaneous
* Run JS tests under multiple JS versions, define `.nvmrc` to 22.6 by @Kocal in https://github.com/symfony/ux/pull/2865
* Migrate PHPUnit configs and homogenize them by @Kocal in https://github.com/symfony/ux/pull/2867
* Fix functional tests Turbo (Chrome 137 & dev-tools) by @Kocal in https://github.com/symfony/ux/pull/2873
* Migrate `bin/*.js` to TypeScript, use `tsx` by @Kocal in https://github.com/symfony/ux/pull/2866
* Upgrade Rollup dependencies by @Kocal in https://github.com/symfony/ux/pull/2876
* Remove Babel dependencies by @Kocal in https://github.com/symfony/ux/pull/2877
* Remove `@symfony/stimulus-testing` dev dependencies by @Kocal in https://github.com/symfony/ux/pull/2879
* Remove useless `eslint-` comments by @Kocal in https://github.com/symfony/ux/pull/2880
* (Re-)use `ramsey/composer-install` action when possible by @Kocal in https://github.com/symfony/ux/pull/2885
* Run unit and functional tests under Windows too by @Kocal in https://github.com/symfony/ux/pull/2816
* Fix components assets compilation on Windows server by @Kocal in https://github.com/symfony/ux/pull/2890
* Fix typo `CONTRIBUTING.md` by @xDeSwa in https://github.com/symfony/ux/pull/2927
* Explicitly import Vitest APIs instead of relying on globals by @Kocal in https://github.com/symfony/ux/pull/2931
* Replace Yarn Berry by PNPM by @Kocal in https://github.com/symfony/ux/pull/2932
* Upgrade Vitest to ^3.2.4 by @Kocal in https://github.com/symfony/ux/pull/2933
* Modernize and simplify our packages building tools, replace Rollup by tsup by @Kocal in https://github.com/symfony/ux/pull/2944
* Download only Chromium browser for Vitest/Playwright tests by @Kocal in https://github.com/symfony/ux/pull/2948
### New Contributors
* @barlito made their first contribution in https://github.com/symfony/ux/pull/2891
* @maxperei made their first contribution in https://github.com/symfony/ux/pull/2893
* @leevigraham made their first contribution in https://github.com/symfony/ux/pull/2902
* @mbuliard made their first contribution in https://github.com/symfony/ux/pull/2673
**Full Changelog**: https://github.com/symfony/ux/compare/v2.27.0...v2.28.0
## 2.27.0 : Map Powerup (v2.27.0)
Released: 2025-06-27
Hey UX'ers!
This release adds a bunch of new features to Map: Circle and Rectangle support, attribution and zoom control
options, and more. Fixes, improvements, and optimizations are also included in Autocomplete, Twig Components,
and Live Components.
### Autocomplete
* Ensure default plugins are nicely merged with user-defined plugins by @Kocal in https://github.com/symfony/ux/pull/2841
### Twig Components
* Fix escaping of Alpine.js attribute keys containing numeric characters by @klausi85 in https://github.com/symfony/ux/pull/2833
* Update the docs about nested Twig components by @javiereguiluz in https://github.com/symfony/ux/pull/2847
* Update the docs about the `mount()` method of Twig components by @javiereguiluz in https://github.com/symfony/ux/pull/2843
### Live Components
* Fix query string decoding with no `=` by @smnandre in https://github.com/symfony/ux/pull/2829
* Optimize `LiveComponentStack::getCurrentLiveComponent()` by @Kocal in https://github.com/symfony/ux/pull/2821
* Add events assertions in `InteractsWithLiveComponents` by @Arkalo2 in https://github.com/symfony/ux/pull/2712
### Map
* Add option to configure attribution and zoom control by @dannyvw in https://github.com/symfony/ux/pull/2792
* Do not override `fitBoundsToMarkers` when using LiveComponent by @dannyvw in https://github.com/symfony/ux/pull/2811
* Fix missing dynamic attributes on `` example by @raphael-geffroy in https://github.com/symfony/ux/pull/2840
* Add Circle support by @Valmonzo in https://github.com/symfony/ux/pull/2838
* [Google] Fix race conditions when loading Google Maps API, when rendering >=2 maps by @Kocal in https://github.com/symfony/ux/pull/2854
* Add Rectangle support by @Valmonzo in https://github.com/symfony/ux/pull/2845
* [Google] Fix `InfoWindow` compatibility with `Circle` and `Rectangle` by @Kocal in https://github.com/symfony/ux/pull/2858
* Minor improvements on TypeScript types by @Kocal in https://github.com/symfony/ux/pull/2859
* Deprecate property `rawOptions` from `ux:map:*:before-create` events, in favor of `bridgeOptions` by @Kocal in https://github.com/symfony/ux/pull/2860
* Allows Map options customization in `ux:map:pre-connect` event (e.g.: `zoom`, `options`, `bridgeOptions`...) by @Kocal in https://github.com/symfony/ux/pull/2861
* Update test to include circle and rectangle data attributes by @Valmonzo in https://github.com/symfony/ux/pull/2862
* Add `extra` data to `Map` by @Kocal in https://github.com/symfony/ux/pull/2863
### Icons
* Docs: Merging code blocks; language improvements by @ThomasLandauer in https://github.com/symfony/ux/pull/2793
* Explain Icons SVG size by @dbu in https://github.com/symfony/ux/pull/2670
### Site
* Trim Icon's DataList's `
` to get a better copy value by @CyrilKrylatov in https://github.com/symfony/ux/pull/2836
### Miscellaneous
* Add missing return type in test Kernel by @smnandre in https://github.com/symfony/ux/pull/2830
* Fix `link` script by adding Bridges support by @Kocal in https://github.com/symfony/ux/pull/2839
* PHPStan: use PHP version from the matrix by @alexislefebvre in https://github.com/symfony/ux/pull/2842
* Configure `doctrine.orm.enable_native_lazy_objects` to fix deprecation in PHP 8.4+ by @Kocal in https://github.com/symfony/ux/pull/2851
* Reduce number of PHPStan jobs by @Kocal in https://github.com/symfony/ux/pull/2852
* Prevent `yarn watch` to exit if TypeScript plugin is unable to compile by @Kocal in https://github.com/symfony/ux/pull/2853
* Upgrade Biome.js to ^2 by @Kocal in https://github.com/symfony/ux/pull/2856
### New Contributors
* @CyrilKrylatov made their first contribution in https://github.com/symfony/ux/pull/2836
* @klausi85 made their first contribution in https://github.com/symfony/ux/pull/2833
* @Arkalo2 made their first contribution in https://github.com/symfony/ux/pull/2712
**Full Changelog**: https://github.com/symfony/ux/compare/v2.26.1...v2.27.0
## 2.26.1 : Conflict Resolution (v2.26.1)
Released: 2025-06-06
Hey UX'ers!
Just a small release to fix a Live Component composer conflict.
### Live Components
* Fix conflict with `symfony/type-info` by @Kocal in https://github.com/symfony/ux/pull/2828
### Miscellaneous
* Fix changelog version by @Kocal in https://github.com/symfony/ux/pull/2823
**Full Changelog**: https://github.com/symfony/ux/compare/v2.26.0...v2.26.1
## 2.26.0 : Package Deprecations (v2.26.0)
Released: 2025-06-05
Hey UX'ers!
This release deprecates 3 packages: `symfony/ux-typed`, `symfony/ux-lazy-image`
and `symfony/ux-swup`. These will be removed in 3.0. Their respective README files
have migration guides to help you move to alternatives.
Also included are many bug fixes and improvements, including multipolygon support
in `symfony/ux-map`!
### Twig Components
* Improve Parser exceptionsby @smnandre in https://github.com/symfony/ux/pull/2729
### Live Components
* Add missing `DefaultActionTrait` in a LiveComponent code example by @welcoMattic in https://github.com/symfony/ux/pull/2758
* Key is more reliable with child components by @weaverryan in https://github.com/symfony/ux/pull/2699
* `LiveProp`: Pass the property name as second parameter of the `modifier` callback by @jannes-io in https://github.com/symfony/ux/pull/2744
* Improve misleading smart render algorithm docs by @norkunas in https://github.com/symfony/ux/pull/2741
* Fix `PropertyTypeExtractorInterface::getTypes()` deprecation, use TypeInfo ^7.2 `Type` by @mtarld in https://github.com/symfony/ux/pull/2607
### Map
* Add definition to after create events in controller by @mart-insiders in https://github.com/symfony/ux/pull/2763
* Add return type to `__toString()` by @dannyvw in https://github.com/symfony/ux/pull/2772
* Remove invalid marker icon example by @dannyvw in https://github.com/symfony/ux/pull/2771
* Add multipolygon support by @dannyvw in https://github.com/symfony/ux/pull/2762
* Add missing dependency for `spatie/phpunit-snapshot-assertions` to `require-dev` by @dannyvw in https://github.com/symfony/ux/pull/2773
* Optional leaflet tilelayer by @dannyvw in https://github.com/symfony/ux/pull/2779
### Icons
* Check for empty paths before calling Finder in `ux:icons:lock` by @ameotoko in https://github.com/symfony/ux/pull/2723
* Fix typos by @ThomasLandauer in https://github.com/symfony/ux/pull/2781
* Remove broken link by @ThomasLandauer in https://github.com/symfony/ux/pull/2788
* Fix links to `symfony/ux-twig-component` by @ThomasLandauer in https://github.com/symfony/ux/pull/2789
### StimulusBundle
* Skip mapping `.ts` controller if `.js` version is available by @phasdev in https://github.com/symfony/ux/pull/2702
* Replace `chart` examples by `hello` to avoid confusion with the ChartJS component by @welcoMattic in https://github.com/symfony/ux/pull/2707
### React
* Improve error handling in `resolveReactComponent` by @teklakct in https://github.com/symfony/ux/pull/2006
### Turbo
* Fix Turbo CI (PHPStan & Functional tests) by @Kocal in https://github.com/symfony/ux/pull/2766
### 🚧 Toolkit 🚧
* Add components metadata (for dependencies) by @Kocal in https://github.com/symfony/ux/pull/2726
* Remove `FileType` by @Kocal in https://github.com/symfony/ux/pull/2800
* Remove old `FileType` references by @Kocal in https://github.com/symfony/ux/pull/2802
* Add myself to Toolkit code-owners by @Kocal in https://github.com/symfony/ux/pull/2804
* Remove `Kit::$uxIcon`, make icons internal to the website by @Kocal in https://github.com/symfony/ux/pull/2807
### Typed
* Deprecate the package by @Kocal in https://github.com/symfony/ux/pull/2809
### LazyImage
* Deprecate the package by @Kocal in https://github.com/symfony/ux/pull/2813
### Swup
* Deprecate the package by @Kocal in https://github.com/symfony/ux/pull/2814
### Miscellaneous
* Configure Git username/email to github-actions(bot) when committing version updates by @Kocal in https://github.com/symfony/ux/pull/2759
* Rework `tests-php` job matrix, better covers different PHP/SF versions, test all components in a single job by @Kocal in https://github.com/symfony/ux/pull/2734
* Re-organize workflows: split unit/functional/app tests, split code quality workflow by @Kocal in https://github.com/symfony/ux/pull/2764
* Remove oldest versionadded by @smnandre in https://github.com/symfony/ux/pull/2706
* Homogenize PHP-CS-Fixer configuration with `symfony/symfony`, and run it by @Kocal in https://github.com/symfony/ux/pull/2768
* Replace `ramsey/composer-install` by `composer install` in `app-tests` workflow by @Kocal in https://github.com/symfony/ux/pull/2780
* Re-add PHP-CS-Fixer by @Kocal in https://github.com/symfony/ux/pull/2803
### New Contributors
* @phasdev made their first contribution in https://github.com/symfony/ux/pull/2702
* @teklakct made their first contribution in https://github.com/symfony/ux/pull/2006
* @ameotoko made their first contribution in https://github.com/symfony/ux/pull/2723
* @mart-insiders made their first contribution in https://github.com/symfony/ux/pull/2763
* @dannyvw made their first contribution in https://github.com/symfony/ux/pull/2772
* @ThomasLandauer made their first contribution in https://github.com/symfony/ux/pull/2781
**Full Changelog**: https://github.com/symfony/ux/compare/v2.25.2...v2.26.0
## 2.25.2 : StimulusAttribute fix (v2.25.2)
Released: 2025-05-20
Hey UX'ers!
Just a small bug fix release to fix using `StimulusAttributes` with Twig Components.
### Twig Components
* Fix `ComponentAttributes` rendering when using `StimulusAttributes` as default attributes by @Kocal in https://github.com/symfony/ux/pull/2757
### Map
* Remove test for `render_map` deprecation by @Kocal in https://github.com/symfony/ux/pull/2755
### Toolkit
* Enforce `symfony/ux-twig-component:^2.25.1` by @Kocal in https://github.com/symfony/ux/pull/2753
**Full Changelog**: https://github.com/symfony/ux/compare/v2.25.1...v2.25.2
## 2.25.1 : CVE-2025-47946 (v2.25.1)
Released: 2025-05-19
Hey UX'ers!
> [!IMPORTANT]
> This release addresses [CVE-2025-47946](https://github.com/symfony/ux/security/advisories/GHSA-5j3w-5pcr-f8hg). See [the blog post](https://symfony.com/blog/symfony-ux-cve-2025-47946-unsanitized-html-attribute-injection-via-componentattributes) for more details.
### Twig Components
* Remove `ComponentAttributeFactory` and inject `EscaperRuntime` directly by @smnandre in https://github.com/symfony/ux/pull/2749
**Full Changelog**: https://github.com/symfony/ux/compare/v2.25.0...v2.25.1
## 2.25.0 : Squash Deprecations (v2.25.0)
Released: 2025-05-19
Hey UX'ers!
This release fixes Twig deprecations, improves the DX of Icons, adds UID support and fixes hydration issues in Live Components. This also includes an initial preview of the new UX Toolkit. This package isn't yet installable via Composer as it's still in heavy development, but you can check it out in the `src/Toolkit`.
### Autocomplete
* Escape `querySelector` dynamic selector with `CSS.escape()` by @Bartheyrman22 in https://github.com/symfony/ux/pull/2663
### Map
* Downgrade PHP requirement from 8.3 to 8.1 by @Kocal in https://github.com/symfony/ux/pull/2695
### Twig Components
* Fix `loadTemplate` deprecation for Twig >= 3.21 by @smnandre in https://github.com/symfony/ux/pull/2713
### Live Components
* Add UID support for hydration by @norkunas in https://github.com/symfony/ux/pull/2654
* Fix default option extraction ignores Translatable #2621 by @stehled in https://github.com/symfony/ux/pull/2627
* Fix: `LiveComponentHydrator::hydrateValue()` cannot hydrate null values by @nikophil in https://github.com/symfony/ux/pull/2730
### StimulusBundle
* Make the JS package private by @Kocal in https://github.com/symfony/ux/pull/2709
### Toolkit
* Introduce the UX Toolkit ✨ by @Halleck45 in https://github.com/symfony/ux/pull/2539
* Add missing Interface suffixes by @smnandre in https://github.com/symfony/ux/pull/2717
* Fix deprecation Kernel > 7.3 by @smnandre in https://github.com/symfony/ux/pull/2714
* Remove redundant code in Shadcn kit components by @Kocal in https://github.com/symfony/ux/pull/2711
* Add functional tests to render all Kit components usage codes (from their documentation), with a snapshot system by @Kocal in https://github.com/symfony/ux/pull/2720
* Minor adjustments on Kit creation command (reword questions, fix doc format) by @Kocal in https://github.com/symfony/ux/pull/2724
* Remove Kit "authors" by @Kocal in https://github.com/symfony/ux/pull/2725
* Improve descriptions of Shadcn components by @Kocal in https://github.com/symfony/ux/pull/2728
* Update snapshots & fix tests, following #2728 by @Kocal in https://github.com/symfony/ux/pull/2735
### Icons
* Improve DX when `symfony/http-client` is not installed by @kbond in https://github.com/symfony/ux/pull/2678
### Turbo
* Minor documentation syntax fixes by @seb-jean in https://github.com/symfony/ux/pull/2692
* Pass `turbo_stream_listen` topics to mercure if not defined by @Fan2Shrek in https://github.com/symfony/ux/pull/2694
### Miscellaneous
* Fix version bump for npm packages by @Kocal in https://github.com/symfony/ux/pull/2679
* Use git diff instead of git status by @smnandre in https://github.com/symfony/ux/pull/2687
* Add `.editorconfig`, enforce LF line-ending style by @Kocal in https://github.com/symfony/ux/pull/2691
* Adjust tags to `v2.*.*` for NPM auto-releases by @Kocal in https://github.com/symfony/ux/pull/2685
* Add step to disable `package.json` synchronization while upgrading PHP package by @Kocal in https://github.com/symfony/ux/pull/2698
* Replace `workspace:*` dependencies before publishing on npm by @Kocal in https://github.com/symfony/ux/pull/2739
* Fix Doctor RST warning about quotes by @smnandre in https://github.com/symfony/ux/pull/2745
### Site
* Add manual installation steps for Component installation (and some website tweaks) by @Kocal in https://github.com/symfony/ux/pull/2716
### New Contributors
* @stehled made their first contribution in https://github.com/symfony/ux/pull/2627
* @Bartheyrman22 made their first contribution in https://github.com/symfony/ux/pull/2663
* @Halleck45 made their first contribution in https://github.com/symfony/ux/pull/2539
* @nikophil made their first contribution in https://github.com/symfony/ux/pull/2730
**Full Changelog**: https://github.com/symfony/ux/compare/v2.24.0...v2.25.0
## 2.24.0 : NPM Packages (v2.24.0)
Released: 2025-04-05
Hey UX'ers!
UX packages that require JS have their JS published on NPM. This installation method is reserved for **advanced users** who want to decouple their JavaScript dependencies from their PHP dependencies. **Symfony Flex is still the method recommended for most users.**
### Autocomplete
- Fix invalid createQueryBuilder code example by @tacman in https://github.com/symfony/ux/pull/2470
- Rethrow `BadRequestHttpException` in case of malformed `extra_options` by @norkunas in https://github.com/symfony/ux/pull/2600
- Add `EnumType` precision by @Huluti in https://github.com/symfony/ux/pull/2640
### Map
- **Add Marker Icon customization capability by @sblondeau in https://github.com/symfony/ux/pull/2605**
- **Markers, polygons and polylines removal by @sblondeau in https://github.com/symfony/ux/pull/2547**
- JavaScript package should not be added in user's package.json by @Kocal in https://github.com/symfony/ux/pull/2611
- Add missing `README`/`LICENSE` files for Map Bridges JS packages by @Kocal in https://github.com/symfony/ux/pull/2616
- Improve "Interact with the map" section by @Kocal in https://github.com/symfony/ux/pull/2638
- Make renderer tests way easier to maintain, use snapshots by @Kocal in https://github.com/symfony/ux/pull/2658
- Fix 2.23/2.24 changelog by @zak39 in https://github.com/symfony/ux/pull/2674
### Twig Components
- **Minimal support of comment lines by @smnandre in https://github.com/symfony/ux/pull/2464**
- Fix ComponentTokenParser on 32-bits by @smnandre in https://github.com/symfony/ux/pull/2572
- Fix Twig 3.21 deprecations (getExpressionParser) by @smnandre in https://github.com/symfony/ux/pull/2591
- Add `OptionResolver` namespace in doc example by @ThibaultPelloquin in https://github.com/symfony/ux/pull/2634
- Fix test when high-deps by @Kocal in https://github.com/symfony/ux/pull/2645
### Live Components
- Move `symfony/property-info` to the require section by @mtarld in https://github.com/symfony/ux/pull/2608
- Fix default select value with preferred choices by @1ed in https://github.com/symfony/ux/pull/2587
- Document how to pass a value to an event listener from Twig by @Artusamak in https://github.com/symfony/ux/pull/2610
- Remove mention of deprecated annotation in docs by @smnandre in https://github.com/symfony/ux/pull/2631
### Turbo
- Document `` by @seb-jean in https://github.com/symfony/ux/pull/2481
- Update `index.rst` by @DennisdeBest in https://github.com/symfony/ux/pull/2603
- Add Twig Extensions for `meta` tags by @seb-jean in https://github.com/symfony/ux/pull/2618
- Pass EventSource options to `turbo_stream_listen` by @Fan2Shrek in https://github.com/symfony/ux/pull/2447
### StimulusBundle
- **Add support for `symfony/stimulus-bridge` 4 by @bobvandevijver in https://github.com/symfony/ux/pull/2609**
- Fix missing `}`, reformat so it's visible by @tacman in https://github.com/symfony/ux/pull/2599
- Misc doc fixes by @javiereguiluz in https://github.com/symfony/ux/pull/2597
- Fix lazy load Stimulus controllers with Turbo by @smnandre in https://github.com/symfony/ux/pull/2590
### Icons
- Improve setup instructions by @dbu in https://github.com/symfony/ux/pull/2664
- Add `xmlns` attribute to svg icons by @Enz000 in https://github.com/symfony/ux/pull/2661
### Notify
- Update image link for native notification example by @skmedix in https://github.com/symfony/ux/pull/2604
- Added `options` to Notification by @ernie76 in https://github.com/symfony/ux/pull/1853
### Miscellaneous
- **Add workflow to automatically publish JS packages on npm by @Kocal in https://github.com/symfony/ux/pull/2615**
- Fix links to changed dist files by @Kocal in https://github.com/symfony/ux/pull/2563
- Fix dist files base/head information by @Kocal in https://github.com/symfony/ux/pull/2564
- Ensure TypeScript code is valid by @Kocal in https://github.com/symfony/ux/pull/2562
- Run tests on minimum-stability=dev too by @Kocal in https://github.com/symfony/ux/pull/2594
- Normalize `package.json` files, to prepare publication on NPM by @Kocal in https://github.com/symfony/ux/pull/2595
- Document `src/**/assets/README.md` files about direct installation and recommended alternatives. by @Kocal in https://github.com/symfony/ux/pull/2612
- Ensure JS packages (either from `vendor/` or npm versions) can be installed/used inside an Encore App by @Kocal in https://github.com/symfony/ux/pull/2613
- Refactor some steps in test-app-encore-app job by @Kocal in https://github.com/symfony/ux/pull/2614
- Document about alternative JS assets installation with npm packages by @Kocal in https://github.com/symfony/ux/pull/2617
- Add documentation check to PR template by @kbond in https://github.com/symfony/ux/pull/2630
- Document and update CI for Corepack manual installation by @Kocal in https://github.com/symfony/ux/pull/2649
### Site
- Fix `favicon.svg` and mention "UX" by @Kocal in https://github.com/symfony/ux/pull/2626
### New Contributors
* @bobvandevijver made their first contribution in https://github.com/symfony/ux/pull/2609
* @Artusamak made their first contribution in https://github.com/symfony/ux/pull/2610
* @ThibaultPelloquin made their first contribution in https://github.com/symfony/ux/pull/2634
* @Huluti made their first contribution in https://github.com/symfony/ux/pull/2640
* @zak39 made their first contribution in https://github.com/symfony/ux/pull/2674
* @dbu made their first contribution in https://github.com/symfony/ux/pull/2664
* @ernie76 made their first contribution in https://github.com/symfony/ux/pull/1853
* @Enz000 made their first contribution in https://github.com/symfony/ux/pull/2661
**Full Changelog**: https://github.com/symfony/ux/compare/v2.23.0...v2.24.0
## 2.23.0 : Minor Improvements & Fixes (v2.23.0)
Released: 2025-02-10
Hey UXer's!
Not a ground-breaking release, but some nice minor improvements and fixes.
### Autocomplete
* Reset TomSelect when updating controller attributes by @pierredup in https://github.com/symfony/ux/pull/1505
* Deprecate `ExtraLazyChoiceLoader` in favor of `LazyChoiceLoader` by @norkunas in https://github.com/symfony/ux/pull/2458
* Fix Incompatibility filter_query and max_results (doc) by @ytilotti in https://github.com/symfony/ux/pull/2440
* Configurable results by @J-Ben87 in https://github.com/symfony/ux/pull/2541
### Twig Components
* Update using macro docs by @smnandre in https://github.com/symfony/ux/pull/2444
* Minor doc syntax fix by @javiereguiluz in https://github.com/symfony/ux/pull/2459
* Document about unwanted behavior with `ExposeInTemplate` and computed methods by @Kocal in https://github.com/symfony/ux/pull/2456
* Fix typo in docs by @JalenWasHere in https://github.com/symfony/ux/pull/2452
* Remove word in documentation by @jmwill86 in https://github.com/symfony/ux/pull/2475
* Various fix / cleans in documentation by @smnandre in https://github.com/symfony/ux/pull/2471
* Use promoted properties in code sample by @tacman in https://github.com/symfony/ux/pull/2484
* Add explicit string cast on string assertions by @Valmonzo in https://github.com/symfony/ux/pull/2507
* Remove obsolete `TemplateNameParser` by @sneakyvv in https://github.com/symfony/ux/pull/2506
### Live Components
* Update CSRF docs by @smnandre in https://github.com/symfony/ux/pull/2443
* "Hooks: Handle Component Behavior" spacing issue in docs by @nehalgajjar in https://github.com/symfony/ux/pull/2435
* Check secret is not empty + add `[SensitiveParameter]` by @smnandre in https://github.com/symfony/ux/pull/2461
* Allow configuring secret for fingerprints and checksums by @smnandre in https://github.com/symfony/ux/pull/2462
* Use `container.build_hash` instead of `kernel.secret` in `CacheWarmer` by @dkarlovi in https://github.com/symfony/ux/pull/2451
* Remove form property in live component docs by @jannes-io in https://github.com/symfony/ux/pull/2474
* Document `make:twig-component` by @seb-jean in https://github.com/symfony/ux/pull/2480
* Add a link label in doc by @MrYamous in https://github.com/symfony/ux/pull/2476
* Update doc on how to use `submitForm()` by @yalit in https://github.com/symfony/ux/pull/2510
* Fix `ComponentWithFormTrait::extractFormValues()` with edge cases by @smnandre in https://github.com/symfony/ux/pull/2491
* Add very simple download files docs by @zefyx in https://github.com/symfony/ux/pull/2513
* Prevent `__component` property to be serialized when called `JSON.stringify()` by @Kocal in https://github.com/symfony/ux/pull/2537
* Add Documentation for testing with `LiveCollectionType` by @yalit in https://github.com/symfony/ux/pull/2517
* Fix formatting of the inline code for the text `RedirectResponse` by @zefyx in https://github.com/symfony/ux/pull/2530
* Fix `ComponentWithFormTrait` not working in batch actions by @smnandre in https://github.com/symfony/ux/pull/2553
### Icons
* Fix aliases support when fetching multiples icons with Iconify by @Kocal in https://github.com/symfony/ux/pull/2467
### Map
* Add new helpers: `DistanceUnit`, `DistanceCalculator`, `CoordinateUtils` by @smnandre in https://github.com/symfony/ux/pull/2551
### Chart.js
* Listen to Stimulus `disconnect` event to destroy the chart by @Shadow-Devil in https://github.com/symfony/ux/pull/1944
### Stimulus
* Update Stimulus Components URL by @94noni in https://github.com/symfony/ux/pull/2495
* Fasten lazy loading + add debug `lazy:loading` and `lazy:loaded` by @smnandre in https://github.com/symfony/ux/pull/2463
### Turbo
* Remove obsolete Mercure configuration (docs) by @smnandre in https://github.com/symfony/ux/pull/2524
* Add stream format with request listener by @aleho in https://github.com/symfony/ux/pull/2550
### LazyImage
* Add a warning message to not recommend Lazy Image package by @javiereguiluz in https://github.com/symfony/ux/pull/2501
### Site
* Add BlueSky by @smnandre in https://github.com/symfony/ux/pull/2436
* Update deps by @smnandre in https://github.com/symfony/ux/pull/2441
* Visual improvments on IconModal by @Kocal in https://github.com/symfony/ux/pull/2465
* Update site banner by @smnandre in https://github.com/symfony/ux/pull/2489
* Upgrade PHP8.4 on psh by @smnandre in https://github.com/symfony/ux/pull/2442
* Back to PHP 8.3 by @smnandre in https://github.com/symfony/ux/pull/2494
* Add links to UX icons documentation by @smnandre in https://github.com/symfony/ux/pull/2499
### Miscellaneous
* Mention Doctor Rst in `CONTRIBUTING.md` by @smnandre in https://github.com/symfony/ux/pull/2472
* Fix and display changed dist files in the CI by @Kocal in https://github.com/symfony/ux/pull/2503
* Drop explicit Yarn dependencies caching steps for actions/setup-node by @Kocal in https://github.com/symfony/ux/pull/2504
### New Contributors
* @dkarlovi made their first contribution in https://github.com/symfony/ux/pull/2451
* @JalenWasHere made their first contribution in https://github.com/symfony/ux/pull/2452
* @ytilotti made their first contribution in https://github.com/symfony/ux/pull/2440
* @Shadow-Devil made their first contribution in https://github.com/symfony/ux/pull/1944
* @jmwill86 made their first contribution in https://github.com/symfony/ux/pull/2475
* @Valmonzo made their first contribution in https://github.com/symfony/ux/pull/2507
* @yalit made their first contribution in https://github.com/symfony/ux/pull/2510
* @zefyx made their first contribution in https://github.com/symfony/ux/pull/2513
* @J-Ben87 made their first contribution in https://github.com/symfony/ux/pull/2541
**Full Changelog**: https://github.com/symfony/ux/compare/v2.22.1...v2.23.0
## 2.22.1 : Bug Squashing (v2.22.1)
Released: 2024-12-09
Hey UX'ers!
Just a small, but important bug fix release.
### Autocomplete
* Fix grouped options order by @zavarock in https://github.com/symfony/ux/pull/1825
* Added Polish translation for "Add ..." message by @skmedix in https://github.com/symfony/ux/pull/2418
### Map
* Fix documentations codeblocks for the LiveComponent integration by @Kocal in https://github.com/symfony/ux/pull/2412
* Fix default values of Stimulus Map Controller by @Kocal in https://github.com/symfony/ux/pull/2420
### Icons
* Fix `LockIconsCommand` definition when Iconify is disabled by @smnandre in https://github.com/symfony/ux/pull/2416
* Fix doc typo by @karpilin in https://github.com/symfony/ux/pull/2424
### StimulusBundle
* Fix typo by @MrYamous in https://github.com/symfony/ux/pull/2430
### Live Components
* Update docs for `PostHydrate`, `PreDehydrate` & `PreReRender` by @nehalgajjar in https://github.com/symfony/ux/pull/2431
* Handle loose comparison with empty placeholder by @FoxCie in https://github.com/symfony/ux/pull/2426
### Twig Components
* Add tip about `make:twig-component` command by @DennisdeBest in https://github.com/symfony/ux/pull/2384
* Mention how to work with Twig macros in Twig Components by @javiereguiluz in https://github.com/symfony/ux/pull/2432
### Miscellaneous
* Apply natural import order for JS to synchronise the code base with Biome and its configuration by @chadyred in https://github.com/symfony/ux/pull/2423
* Drop format, lint, check-format and check-lint commands, replace them with check and ci commands by @Kocal in https://github.com/symfony/ux/pull/2428
* Replace CleanCSS by LightningCSS by @Kocal in https://github.com/symfony/ux/pull/2429
### Site
* Update Symfony 7.2 by @smnandre in https://github.com/symfony/ux/pull/2411
* Show a visible link to the docs of each package by @javiereguiluz in https://github.com/symfony/ux/pull/2309
### New Contributors
* @zavarock made their first contribution in https://github.com/symfony/ux/pull/1825
* @skmedix made their first contribution in https://github.com/symfony/ux/pull/2418
* @karpilin made their first contribution in https://github.com/symfony/ux/pull/2424
* @nehalgajjar made their first contribution in https://github.com/symfony/ux/pull/2431
* @FoxCie made their first contribution in https://github.com/symfony/ux/pull/2426
**Full Changelog**: https://github.com/symfony/ux/compare/v2.22.0...v2.22.1
## 2.22.0 : So long CSRF! (v2.22.0)
Released: 2024-11-30
Hey UX'ers!
Here's a shiny new release for you! 🎉
Live components now rely on _same-origin/CORS_ instead of CSRF tokens for protection. They're now stateless and the session is no longer required! In Turbo, `` and `` Twig components were added plus support for multiple Mercure topics in `turbo_stream_listen`. The Map component now supports _polylines_ and have come [*alive* with Live Components](https://symfony.com/bundles/ux-map/current/index.html#usage-with-live-components). Across the board, we've improved performance, fixed bugs, and updated documentation.
### Autocomplete
* **Allow configuring TomSelect’s `labelField` by @MatTheCat in https://github.com/symfony/ux/pull/2382**
* Update `AutocompleteBundle.tr.php` by @xDeSwa in https://github.com/symfony/ux/pull/2294
* Adjust `index.rst` format by @smnandre in https://github.com/symfony/ux/pull/2297
* Note form requirements by @MrYamous in https://github.com/symfony/ux/pull/2295
* Mention `preload` can be set to `false` by @MatTheCat in https://github.com/symfony/ux/pull/2348
* Fix handling of associated properties in DQL joins by @HugoSEIGLE in https://github.com/symfony/ux/pull/2377
### Live Components
* **Remove CSRF tokens - rely on same-origin/CORS instead by @nicolas-grekas in https://github.com/symfony/ux/pull/2251**
* Fix documentation for select data-model by @Nek- in https://github.com/symfony/ux/pull/2313
* Fix variable in docs by @xDeSwa in https://github.com/symfony/ux/pull/2402
* Fix checkbox/radio value matching by @smnandre in https://github.com/symfony/ux/pull/2401
* Refactor `elementBelongsToThisComponent` by @smnandre in https://github.com/symfony/ux/pull/2399
* Fix required select not initialized by @dsoriano in https://github.com/symfony/ux/pull/2403
### Twig Components
* Cache component properties metadata by @smnandre in https://github.com/symfony/ux/pull/2211
* Optimize TwigPreLexer by @smnandre in https://github.com/symfony/ux/pull/2316
* Improve `BlockStack` performance by @smnandre in https://github.com/symfony/ux/pull/2343
* Fix directory separator in Debug command by @clussiana in https://github.com/symfony/ux/pull/2342
* Improve `ComponentFactory` performance by @smnandre in https://github.com/symfony/ux/pull/2344
* Store mount methods in compiler pass by @smnandre in https://github.com/symfony/ux/pull/2357
* Cache template class resolution by @smnandre in https://github.com/symfony/ux/pull/2364
* Ignore "nested" for Alpine & Vue attributes by @smnandre in https://github.com/symfony/ux/pull/2328
### StimulusBundle
* Update Jetbrains stimulus plugin url by @Basster in https://github.com/symfony/ux/pull/2299
* Check controllers source files for laziness by @MatTheCat in https://github.com/symfony/ux/pull/2304
* Mention `removeComments` will no longer be necessary by @MatTheCat in https://github.com/symfony/ux/pull/2347
### Turbo
* **Add generic `` component by @seb-jean in https://github.com/symfony/ux/pull/2302**
* **Add `` component by @seb-jean in https://github.com/symfony/ux/pull/2303**
* **Support custom `TurboStreamResponse` actions by @DRaichev in https://github.com/symfony/ux/pull/2298**
* **Add support for providing multiple mercure topics to `turbo_stream_listen` by @norkunas in https://github.com/symfony/ux/pull/2407**
* Delete whitespace for `` components by @seb-jean in https://github.com/symfony/ux/pull/2300
### Icons
* Fix commands receive polluted SVG by @smnandre in https://github.com/symfony/ux/pull/2314
* Prepare lock / warmup optimization by @smnandre in https://github.com/symfony/ux/pull/2351
* Support aliases in LockIconsCommand by @smnandre in https://github.com/symfony/ux/pull/2356
* Fetch icons in batch in Import command by @smnandre in https://github.com/symfony/ux/pull/2352
* Use dedicated cache pool by @IndraGunawan in https://github.com/symfony/ux/pull/2410
### Map
* **Add polyline support by @sblondeau in https://github.com/symfony/ux/pull/2340**
* **Make UX Map compatible with Live Components (and some internal things) by @Kocal in https://github.com/symfony/ux/pull/2385**
* Update documentation by @smnandre in https://github.com/symfony/ux/pull/2317
* Update `index.rst` by @LesRouxDominerontLeMonde in https://github.com/symfony/ux/pull/2339
* Introduce `ux_map.google_maps.default_map_id` configuration by @Kocal in https://github.com/symfony/ux/pull/2350
* Add documentation about `ux_map.google_maps.default_map_id` by @Kocal in https://github.com/symfony/ux/pull/2358
* Remove duplicate question mark ? in DSN string by @alexander-schranz in https://github.com/symfony/ux/pull/2371
* Fix Twig Component example by @ker0x in https://github.com/symfony/ux/pull/2373
* Add position and missing closing parenthesis by @tacman in https://github.com/symfony/ux/pull/2360
* Fix typos 'an' should be 'a' in READMEs by @tacman in https://github.com/symfony/ux/pull/2398
* Fix and improve TypeScript types, refactor same logic into dedicated methods (to reduce file size) by @Kocal in https://github.com/symfony/ux/pull/2406
### Svelte
* Fix a broken link by @MrYamous in https://github.com/symfony/ux/pull/2383
### React
* Fix broken Link in docs by @xDeSwa in https://github.com/symfony/ux/pull/2372
### Translator
* Handle W3C locale format on document element by @aleho in https://github.com/symfony/ux/pull/2390
### Site
* Update dependencies by @smnandre in https://github.com/symfony/ux/pull/2293
* Fix React/Svelte/Vue demo by @smnandre in https://github.com/symfony/ux/pull/2284
* Update docker compose configuration by @Nek- in https://github.com/symfony/ux/pull/2305
* Update `bin/link-locally` by @smnandre in https://github.com/symfony/ux/pull/2310
* Test Symfony 7.2 beta by @smnandre in https://github.com/symfony/ux/pull/2323
* Use variable webfont by @smnandre in https://github.com/symfony/ux/pull/2327
* Update demo components paths by @smnandre in https://github.com/symfony/ux/pull/2336
* Fix FileTree markup (minor) by @smnandre in https://github.com/symfony/ux/pull/2335
* Update symfony by @smnandre in https://github.com/symfony/ux/pull/2346
* Fix typo on cookbook index by @kbond in https://github.com/symfony/ux/pull/2355
### Miscellaneous
* Add myself to code-owners by @Kocal in https://github.com/symfony/ux/pull/2308
* Update the issue template by @smnandre in https://github.com/symfony/ux/pull/2320
* Add CI workflow to compute diff between files dist files by @Kocal in https://github.com/symfony/ux/pull/2269
* Add per-package Yarn scripts (build, watch, test, lint, ...) by @Kocal in https://github.com/symfony/ux/pull/2326
* Some improvements for dependencies management when testing by @Kocal in https://github.com/symfony/ux/pull/2349
* Fix some misc doc issues by @javiereguiluz in https://github.com/symfony/ux/pull/2387
* Add PR template and auto-close PR on subtree split repositories by @Kocal in https://github.com/symfony/ux/pull/2395
* Add `CONTRIBUTING.md` by @Kocal in https://github.com/symfony/ux/pull/2408
### New Contributors
* @MrYamous made their first contribution in https://github.com/symfony/ux/pull/2295
* @Basster made their first contribution in https://github.com/symfony/ux/pull/2299
* @LesRouxDominerontLeMonde made their first contribution in https://github.com/symfony/ux/pull/2339
* @clussiana made their first contribution in https://github.com/symfony/ux/pull/2342
* @alexander-schranz made their first contribution in https://github.com/symfony/ux/pull/2371
* @DRaichev made their first contribution in https://github.com/symfony/ux/pull/2298
* @sblondeau made their first contribution in https://github.com/symfony/ux/pull/2340
* @HugoSEIGLE made their first contribution in https://github.com/symfony/ux/pull/2377
**Full Changelog**: https://github.com/symfony/ux/compare/v2.21.0...v2.22.0
## 2.21.0 : Turbo + TwigComponents = ❤️ (v2.21.0)
Released: 2024-10-22
Hey UX-er's!
In addition to many minor bug fixes and improvements across all packages, this release adds new
`` Twig components to Turbo. Also in Turbo, a new`TurboStreamResponse` and
`TurboStream` helpers we added.
### Map
* Explicitly require StimulusBundle in Bridges, fix tests by @Kocal in https://github.com/symfony/ux/pull/2207
* Update `index.rst` by @ebedy in https://github.com/symfony/ux/pull/2229
### Translator
* Many performance improvements on the cache warming by @Kocal in https://github.com/symfony/ux/pull/2206
### Twig Components
* Fix an example in Twig Components doc by @javiereguiluz in https://github.com/symfony/ux/pull/2213
* Fix `ux:icon` & `ux:map` renders by @smnandre in https://github.com/symfony/ux/pull/2210
* Fix internal variables are dispatched by @smnandre in https://github.com/symfony/ux/pull/2220
* Fix wiring of `ComponentRuntime` by @kbond in https://github.com/symfony/ux/pull/2231
* Fix outerblock markup example by @tobiasberge in https://github.com/symfony/ux/pull/2235
### Toggle Password
* Misc updates in TogglePassword docs by @javiereguiluz in https://github.com/symfony/ux/pull/2214
### React
* Update some dependencies to fix some issues from Dependabot by @Kocal in https://github.com/symfony/ux/pull/2219
* Add `permanent` option to `react_component` function by @smnandre in https://github.com/symfony/ux/pull/2283
* Update `phpunit.xml.dist` by @smnandre in https://github.com/symfony/ux/pull/2286
### Swup
* For Swup's dev dependencies exclusion from our yarn.lock by @Kocal in https://github.com/symfony/ux/pull/2221
### StimulusBundle
* Normalize Stimulus controller name in event name by @7-zete-7 in https://github.com/symfony/ux/pull/2159
### Autocomplete
* Add czech and slovak translation for "Add ..." message by @fbuchlak in https://github.com/symfony/ux/pull/2216
* Typo on Autocomplete page by @alexislefebvre in https://github.com/symfony/ux/pull/2253
* Add missing types by @smnandre in https://github.com/symfony/ux/pull/2265
* Remove `symfony/string` dependency by @smnandre in https://github.com/symfony/ux/pull/2267
* Remove unused `symfony/security-csrf` dev dependency by @smnandre in https://github.com/symfony/ux/pull/2264
* Update `AutocompleteBundle.de.php` by @simonsolutions in https://github.com/symfony/ux/pull/2285
* Translate "Add ..." text with remote data setup by @jonasdekeukelaere in https://github.com/symfony/ux/pull/2279
### Icons
* Some updates in the full configuration example docs by @javiereguiluz in https://github.com/symfony/ux/pull/2226
* Fix a typo in UX Icons docs by @dfridrich in https://github.com/symfony/ux/pull/2275
* Patch to handle Iconify API change by @smnandre in https://github.com/symfony/ux/pull/2289
* Improve `icons:lock` command verbosity by @smnandre in https://github.com/symfony/ux/pull/2287
### Turbo
* Add `Helper/TurboStream::append()` et al. methods by @nicolas-grekas in https://github.com/symfony/ux/pull/2196
* Add `` components by @nicolas-grekas in https://github.com/symfony/ux/pull/2227
* Replace JS toolchain by asset-mapper when testing ux-turbo by @nicolas-grekas in https://github.com/symfony/ux/pull/2232
* Fix to the right test by @GrinWay in https://github.com/symfony/ux/pull/2234
### Dropzone
* Enable file replacement via "drag-and-drop" by @rrr63 in https://github.com/symfony/ux/pull/2154
### Live Components
* Update `index.rst` by @GrinWay in https://github.com/symfony/ux/pull/2274
### Miscellaneous
* Migrate from Yarn Classic to Yarn Berry by @Kocal in https://github.com/symfony/ux/pull/2222
* Delete `UPGRADE.md` by @smnandre in https://github.com/symfony/ux/pull/2242
* Clean `.gitignore`/`.gitattributes` by @smnandre in https://github.com/symfony/ux/pull/2243
* Remove yarn commands in documentations by @Kocal in https://github.com/symfony/ux/pull/2263
* Remove stimulus-bundle unnecessary warning on documentation by @feymo in https://github.com/symfony/ux/pull/2270
### New Contributors
* @ebedy made their first contribution in https://github.com/symfony/ux/pull/2229
* @tobiasberge made their first contribution in https://github.com/symfony/ux/pull/2235
* @GrinWay made their first contribution in https://github.com/symfony/ux/pull/2274
* @dfridrich made their first contribution in https://github.com/symfony/ux/pull/2275
* @jonasdekeukelaere made their first contribution in https://github.com/symfony/ux/pull/2279
**Full Changelog**: https://github.com/symfony/ux/compare/v2.20.0...v2.21.0
## 2.20.0 : Performance and Optimization! (v2.20.0)
Released: 2024-09-24
Hey UX-ers!
This release is packed full of bug fixes and new features. You can now add Polygons in _Map_ and configure icon sets and aliases in _Icons_. There are also some great performance optimizations, especially in _Twig_/_Live_ components and _StimulusBundle_.
### Map
* Rename `render_map` Twig function `ux_map` by @smnandre in https://github.com/symfony/ux/pull/2073
* Fix bridges `.gitattributes` by @smnandre in https://github.com/symfony/ux/pull/2080
* Fix a Twig function name in docs by @javiereguiluz in https://github.com/symfony/ux/pull/2107
* Misc updates in the docs by @javiereguiluz in https://github.com/symfony/ux/pull/2112
* Rename `leaflet` to `L` in event's payloads by @Kocal in https://github.com/symfony/ux/pull/2113
* Adjust changelogs and fix `render_map` deprecated version by @Kocal in https://github.com/symfony/ux/pull/2138
* Render map from Twig with `ux_map()` and `` by @smnandre in https://github.com/symfony/ux/pull/2117
* Fix Google/Leaflet bridges when using Webpack Encore by @Kocal in https://github.com/symfony/ux/pull/2199
* Adding polygons to google and leaflet + info window by @rrr63 in https://github.com/symfony/ux/pull/2162
* Fixed typo in links to Symfony UX repo by @sblum51 in https://github.com/symfony/ux/pull/2193
* Fix some links in docs by @javiereguiluz in https://github.com/symfony/ux/pull/2198
### Twig Components
* Original `Throwable` get lost during component render by @cuchac in https://github.com/symfony/ux/pull/2030
* Fix debug command by @yceruto in https://github.com/symfony/ux/pull/2088
* Twig code style & "boolean props" part by @smnandre in https://github.com/symfony/ux/pull/2082
* Remove `$tag` parameter from `*Node`, as it is now deprecated by `twig/twig` 3.12 by @Kocal in https://github.com/symfony/ux/pull/2114
* Add notice about needing `phpdocumentor/reflection-docblock` by @dejagersh in https://github.com/symfony/ux/pull/2102
* Add some explanation about mixing Twig and HTML syntax in nested components by @javiereguiluz in https://github.com/symfony/ux/pull/2125
* Deprecate `cva` twig function by @Kocal in https://github.com/symfony/ux/pull/2144
* Update `index.rst` by @LaurentMarquet in https://github.com/symfony/ux/pull/2170
* Use a `RuntimeExtension` by @smnandre in https://github.com/symfony/ux/pull/2168
* Optimize the `ComponentLoggerListener` by @smnandre in https://github.com/symfony/ux/pull/2167
* Fix HTML in the profiler panel by @javiereguiluz in https://github.com/symfony/ux/pull/2181
* Optimize `ComponentFactory` by @smnandre in https://github.com/symfony/ux/pull/2201
### Live Components
* Fix PHP 8.4 errors + deprecations by @smnandre in https://github.com/symfony/ux/pull/2079
* Add `setRouteLocale` in `TestLiveComponent` by @smnandre in https://github.com/symfony/ux/pull/2124
* Update CSRF token after component request by @tijnema in https://github.com/symfony/ux/pull/2022
* Fix `DeferLiveComponentSubscriber` service definition by @smnandre in https://github.com/symfony/ux/pull/2200
### Autocomplete
* Reset form state on each request for applications that reuse the Symfony application between requests by @dotdevio in https://github.com/symfony/ux/pull/2094
* Translate "Add ..." text by @jmsche in https://github.com/symfony/ux/pull/2108
### Icons
* Icon aliases by @smnandre in https://github.com/symfony/ux/pull/2127
* Fix issues found by DOCtor-RST by @Kocal in https://github.com/symfony/ux/pull/2145
* Add support for int/float attribute to `ux_icon` function by @Kocal in https://github.com/symfony/ux/pull/2149
* Add _versionadded_ for Icon Aliases to doc by @kbond in https://github.com/symfony/ux/pull/2163
* Configure icon sets: path, alias & icon attributes by @smnandre in https://github.com/symfony/ux/pull/2156
### Dropzone
* Change physical link to the default style file by @chadyred in https://github.com/symfony/ux/pull/2188
### Translator
* Option to throw an exception instead of returning the message as is when the message is not found. by @Crovitche-1623 in https://github.com/symfony/ux/pull/2185
### StimulusBundle
* Improve `StimulusAttributes` rendering performances by switching to `html` escaping strategy by @Kocal in https://github.com/symfony/ux/pull/2180
### Miscellaneous
* Run PHP-CS-Fixer by @Kocal in https://github.com/symfony/ux/pull/2074
* Update php-cs-fixer config by @smnandre in https://github.com/symfony/ux/pull/2077
* Configure `ISSUE_TEMPLATE` by @smnandre in https://github.com/symfony/ux/pull/2084
* Upgrade JS build dependencies by @Kocal in https://github.com/symfony/ux/pull/2075
* Fix Twig extension return types by @smnandre in https://github.com/symfony/ux/pull/2076
* Link to UX support page by @smnandre in https://github.com/symfony/ux/pull/2093
* Upgrade Vitest, use a real browser for Map Bridges tests by @Kocal in https://github.com/symfony/ux/pull/2146
* Add tests on PHP8.4 by @smnandre in https://github.com/symfony/ux/pull/2169
### New Contributors
* @cuchac made their first contribution in https://github.com/symfony/ux/pull/2030
* @dotdevio made their first contribution in https://github.com/symfony/ux/pull/2094
* @dejagersh made their first contribution in https://github.com/symfony/ux/pull/2102
* @tijnema made their first contribution in https://github.com/symfony/ux/pull/2022
* @LaurentMarquet made their first contribution in https://github.com/symfony/ux/pull/2170
* @chadyred made their first contribution in https://github.com/symfony/ux/pull/2188
* @Crovitche-1623 made their first contribution in https://github.com/symfony/ux/pull/2185
* @sblum51 made their first contribution in https://github.com/symfony/ux/pull/2193
* @rrr63 made their first contribution in https://github.com/symfony/ux/pull/2162
**Full Changelog**: https://github.com/symfony/ux/compare/v2.19.3...v2.20.0
## 2.19.3 : Translator fix (v2.19.3)
Released: 2024-08-16
### Map
* Fix doc link by @smnandre in https://github.com/symfony/ux/pull/2058
* Fix Typo: Removal of an extra ";" by @yoanbernabeu in https://github.com/symfony/ux/pull/2064
### Translator
* Revert #1965, which break cache warmup for Symfony applications by @Kocal in https://github.com/symfony/ux/pull/2060
### New Contributors
* @fbnlsr made their first contribution in https://github.com/symfony/ux/pull/2067
**Full Changelog**: https://github.com/symfony/ux/compare/v2.19.2...v2.19.3
## 2.19.2 : Enable Anon. Twig Components in Bundles (v2.19.2)
Released: 2024-08-13
Another follow up to 2.19.0 that fixes UX Map plus enables a convention for providing anonymous Twig Components in 3rd-party bundles!
### Map
* Re-add keyword "symfony-ux", to fix Symfony Flex `package.json` resolving by @Kocal in https://github.com/symfony/ux/pull/2052
* [Leaflet] Fix marker icon gradients rendering, which can fails on some projects by @Kocal in https://github.com/symfony/ux/pull/2055
### Twig Components
* Adding convention to load Anonymous components from bundles by @yceruto in https://github.com/symfony/ux/pull/2019
### Live Components
* Update naming of stimulus controller on default attributes - index.rst by @DennisdeBest in https://github.com/symfony/ux/pull/2046
### Autocomplete
* Fix warning and code formatting on Autocomplete by @alexislefebvre in https://github.com/symfony/ux/pull/2049
### New Contributors
* @alexislefebvre made their first contribution in https://github.com/symfony/ux/pull/2049
**Full Changelog**: https://github.com/symfony/ux/compare/v2.19.1...v2.19.2
## 2.19.1 : UX Map Improvements (v2.19.1)
Released: 2024-08-12
Just a small follow up to 2.19.0 that adds some missing UX Map features!
### Map
* Add the possibility to not configure map zoom/center if fit bounds to markers by @Kocal in https://github.com/symfony/ux/pull/2045
* Add support for `libraries` for Google Bridge, inject provider's SDK (`L` or `google`) to dispatched events by @Kocal in https://github.com/symfony/ux/pull/2044
**Full Changelog**: https://github.com/symfony/ux/compare/v2.19.0...v2.19.1
## 2.19.0 : New UX Map Package (v2.19.0)
Released: 2024-08-12
Hey UX-ers!
This is a big new release with a lot of bug fixes, quality of live improvements, and a
new UX Map package. A new `live_action()` Twig function was added to dramatically reduce
the boilerplate for Live Component actions.
### Translator
* Revert Fix changing dump directory using AssetMapper by @maelanleborgne in https://github.com/symfony/ux/pull/1913
* Disable cache warmup when translator is identity translator by @SanderVerkuil in https://github.com/symfony/ux/pull/1965
* Fix CS on TranslatorCompilerPass by @Kocal in https://github.com/symfony/ux/pull/1996
* Add configuration to filter dumped translations by domain by @maelanleborgne in https://github.com/symfony/ux/pull/1930
### Turbo
* Fix Doctrine Proxy are not Broadcasted by @smnandre in https://github.com/symfony/ux/pull/1929
* Modernize code (ppp, types..) by @smnandre in https://github.com/symfony/ux/pull/1931
* Fix mercure config-file by @Chris53897 in https://github.com/symfony/ux/pull/1928
### Twig Components
* Ignore array|sequence in exception message by @smnandre in https://github.com/symfony/ux/pull/1940
* Allow @ prefix in nested attributes by @smnandre in https://github.com/symfony/ux/pull/1966
* Allow attributes to be prefixed with `@` by @kbond in https://github.com/symfony/ux/pull/1960
* Minor syntax fixes in the Twig component docs by @javiereguiluz in https://github.com/symfony/ux/pull/1977
* Fix wrong example for HTML syntax by @WebMamba in https://github.com/symfony/ux/pull/1985
* Fix null props not overwrite parent context by @WebMamba in https://github.com/symfony/ux/pull/1989
* Fix random errors are throw when empty props by @WebMamba in https://github.com/symfony/ux/pull/1988
* Mention that boolean properties require the dynamic syntax by @javiereguiluz in https://github.com/symfony/ux/pull/1991
* Minor syntax fix in Twig Components docs by @javiereguiluz in https://github.com/symfony/ux/pull/2021
### Live Components
* Tokenize classes on all allowed whitespaces by @aleho in https://github.com/symfony/ux/pull/1828
* Fix typing for loading hooks + HookManager by @YummYume in https://github.com/symfony/ux/pull/1921
* Fix (de)hydration of composite and/or foreign ID entities by @MatTheCat in https://github.com/symfony/ux/pull/1957
* Typo in LiveComponentHydrator.php by @JeanDavidDaviet in https://github.com/symfony/ux/pull/1972
* Handle `loading="lazy"` for LiveComponent only by @smnandre in https://github.com/symfony/ux/pull/1976
* Allow updates in arrays of DTOs by @cgrabenstein in https://github.com/symfony/ux/pull/1990
* Add a new helper to interact with forms in functional tests by @yoye in https://github.com/symfony/ux/pull/1992
* Fix 'onUpdated' hook call by @kempha in https://github.com/symfony/ux/pull/1980
* Add 'live_action' twig function by @pierredup in https://github.com/symfony/ux/pull/1946
* Document how to use `extra_options` in the Ajax-powered autocomplete by @jakubtobiasz in https://github.com/symfony/ux/pull/1702
* Add missing end delimiter by @JanoschOltmanns in https://github.com/symfony/ux/pull/2037
### Dropzone
* Remove event listeners on disconnect by @aleho in https://github.com/symfony/ux/pull/1951
### Icons
* Expose IconRendererInterface by @smnandre in https://github.com/symfony/ux/pull/1889
* Emphasis HTML syntax requires TwigComponent by @smnandre in https://github.com/symfony/ux/pull/1994
* Fix some misc issues in UX Icons docs by @javiereguiluz in https://github.com/symfony/ux/pull/2027
* Add `ignore_not_found` config option by @smnandre in https://github.com/symfony/ux/pull/2023
### React
* Update index.rst by @elkuku in https://github.com/symfony/ux/pull/1974
### Lazy Image
* Webperfs and LCP considerations by @Kocal in https://github.com/symfony/ux/pull/1967
### Map
* Create Map component by @Kocal in https://github.com/symfony/ux/pull/1937
* Rename "symfony/ux-map-%s" to "symfony/ux-%s-map" by @Kocal in https://github.com/symfony/ux/pull/2031
* Fix custom attribute "data-controller" usage by @Kocal in https://github.com/symfony/ux/pull/2032
* [Leaflet] Fix Marker inside-circle by @Kocal in https://github.com/symfony/ux/pull/2036
* [Leaflet] Fix Popup's automatic-content by @Kocal in https://github.com/symfony/ux/pull/2035
* Change "BeforeConnect" for "BeforeCreate" in documentation by @Kocal in https://github.com/symfony/ux/pull/2039
* Add "extra" data for markers and infowindows by @Kocal in https://github.com/symfony/ux/pull/2040
* Fix some comments in component defer part by @Nek- in https://github.com/symfony/ux/pull/2043
### _Miscellaneous_
* Upgrade target from es2017 to es2021 by @Kocal in https://github.com/symfony/ux/pull/1987
* Drop ESLint and Prettier for Biome by @Kocal in https://github.com/symfony/ux/pull/1848
* Upgrade Biomejs, fix patterns, don't use yarn workspaces by @Kocal in https://github.com/symfony/ux/pull/2015
* Update README.md by @94noni in https://github.com/symfony/ux/pull/2038
### New Contributors
* @aleho made their first contribution in https://github.com/symfony/ux/pull/1828
* @MatTheCat made their first contribution in https://github.com/symfony/ux/pull/1957
* @SanderVerkuil made their first contribution in https://github.com/symfony/ux/pull/1965
* @cgrabenstein made their first contribution in https://github.com/symfony/ux/pull/1990
* @Chris53897 made their first contribution in https://github.com/symfony/ux/pull/1928
* @yoye made their first contribution in https://github.com/symfony/ux/pull/1992
* @kempha made their first contribution in https://github.com/symfony/ux/pull/1980
* @JanoschOltmanns made their first contribution in https://github.com/symfony/ux/pull/2037
* @Nek- made their first contribution in https://github.com/symfony/ux/pull/2043
**Full Changelog**: https://github.com/symfony/ux/compare/v2.18.1...v2.19.0
## 2.18.1 : Hotfix (v2.18.1)
Released: 2024-06-12
👋🏻 This is a small release that fixes some issues we had in 2.18.0.
### Twig Components
* Revert throwing exception when public property is unitialized by @smnandre in https://github.com/symfony/ux/pull/1911
* Revert removing `twig_component.controllers_json` by @smnandre in https://github.com/symfony/ux/pull/1908
### Live Components
* Accept live component Content-Type with suffix by @WebMamba in https://github.com/symfony/ux/pull/1903
### Stimulus
* Use camelCase for target naming by @Jibbarth in https://github.com/symfony/ux/pull/1910
### Translator
* Fix changing dump directory using AssetMapper by @maelanleborgne in https://github.com/symfony/ux/pull/1904
**Full Changelog**: https://github.com/symfony/ux/compare/v2.18.0...v2.18.1
## 2.18.0 : Mostly Maintenance (v2.18.0)
Released: 2024-06-07
Hey UX'ers!
This is mostly a maintenance release with a lot of small fixes and improvements across all components.
The most notable changes are the addition of Slovak translations for the Autocomplete component the
abstraction of image content fetching in the Lazy Image component.
### Lazy Image
* Abstract image content fetching by @Kocal in https://github.com/symfony/ux/pull/1781
* Re-add forgotten `twig.runtime` by @Kocal in https://github.com/symfony/ux/pull/1771
* Fix code block rendering in docs by @mttsch in https://github.com/symfony/ux/pull/1876
### Autocomplete
* Ignore the `ExtraLazyChoiceLoader` if the parent `$loader` is `null` by @vesselind in https://github.com/symfony/ux/pull/1775
* Add Slovak translations by @fbuchlak in https://github.com/symfony/ux/pull/1866
### Turbo
* Document running tests locally by @kbond in https://github.com/symfony/ux/pull/1778
* Fix `TurboExtension` for PhpStan by @smnandre in https://github.com/symfony/ux/pull/1854
* Fix the example with Expression Language by @seb-jean in https://github.com/symfony/ux/pull/1874
### Live Components
* Add a note about `render:finished` event by @smnandre in https://github.com/symfony/ux/pull/1779
* Fix namespaces on documentation by @mickaelblondeau in https://github.com/symfony/ux/pull/1801
* Add signature overload for on and off methods of component by @YummYume in https://github.com/symfony/ux/pull/1685
* Add support for testing file uploads in actions by @daFish in https://github.com/symfony/ux/pull/1832
* Fix EscaperRuntime deprecation by @smnandre in https://github.com/symfony/ux/pull/1855
* Add missing closing paranthesis by @richardhj in https://github.com/symfony/ux/pull/1859
### Twig Components
* Fix LiveComponent namespace mapping by @smnandre in https://github.com/symfony/ux/pull/1772
* Misc fixes in Twig Component docs by @javiereguiluz in https://github.com/symfony/ux/pull/1789
* Remove the `--dir` option in `debug:twig-component` command by @javiereguiluz in https://github.com/symfony/ux/pull/1790
* Fix aria attribute cannot be removed by @smnandre in https://github.com/symfony/ux/pull/1805
* Throws if exposed public prop is uninitialized by @smnandre in https://github.com/symfony/ux/pull/1780
* Fix silently failing tests by @adrienlucas in https://github.com/symfony/ux/pull/1810
* Remove wrongly added configuration by @smnandre in https://github.com/symfony/ux/pull/1823
* Allow input props to have the same name as context variables by @squrious in https://github.com/symfony/ux/pull/1820
* Fix `EscaperExtension` deprecation by @smnandre in https://github.com/symfony/ux/pull/1835
* Update DOC preMount validation data code by @cavasinf in https://github.com/symfony/ux/pull/1845
* Disable profiler integration via configuration by @smnandre in https://github.com/symfony/ux/pull/1877
* Restrict anonymous component lookup to Twig files in debug command by @squrious in https://github.com/symfony/ux/pull/1882
### Icons
* Fix warning when Iconset license URL is null by @smnandre in https://github.com/symfony/ux/pull/1792
* Use lowercase `` in documentation by @smnandre in https://github.com/symfony/ux/pull/1798
* Improve aria attributes rendering by @smnandre in https://github.com/symfony/ux/pull/1797
* Document http-client requirement by @smnandre in https://github.com/symfony/ux/pull/1885
### Translator
* Create valid constant names for keys starting with numeric chars by @wolfgangweintritt in https://github.com/symfony/ux/pull/1809
### Stimulus
* Use Twig >3.9 `EscaperRuntime` by @smnandre in https://github.com/symfony/ux/pull/1824
* Use version instead of url in docs by @ruudk in https://github.com/symfony/ux/pull/1865
### Chart.js
* Replace `chart.js/auto` import with `Chart.register` calls by @smnandre in https://github.com/symfony/ux/pull/1263
* Improve Y axis formatting example by @hellomedia in https://github.com/symfony/ux/pull/1837
### ux.symfony.com
* Fix UX Icons color by @smnandre in https://github.com/symfony/ux/pull/1888
* Add Icons package data by @smnandre in https://github.com/symfony/ux/pull/1864
* CodeBlock with gutter and line pre-slice by @smnandre in https://github.com/symfony/ux/pull/1863
* Icons colors by @smnandre in https://github.com/symfony/ux/pull/1831
* Some more cleaning by @smnandre in https://github.com/symfony/ux/pull/1815
* Add `robots.txt` & `sitemap.xml` by @smnandre in https://github.com/symfony/ux/pull/1814
* Clean demos & packages pages by @smnandre in https://github.com/symfony/ux/pull/1813
* Fix input range color by @smnandre in https://github.com/symfony/ux/pull/1821
* Clean templates by @smnandre in https://github.com/symfony/ux/pull/1827
* Adapt highlighted code blocks to tempest by @smnandre in https://github.com/symfony/ux/pull/1811
* Various small fixes / improvements by @smnandre in https://github.com/symfony/ux/pull/1804
* switch from `highlight.js` to `tempest/highlight` by @kbond in https://github.com/symfony/ux/pull/1808
* Configure Twig-CS-Fixer by @smnandre in https://github.com/symfony/ux/pull/1793
* adjust external link config by @kbond in https://github.com/symfony/ux/pull/1794
* Refactor Translator page by @smnandre in https://github.com/symfony/ux/pull/1783
* refactor commonmark config by @kbond in https://github.com/symfony/ux/pull/1791
* Fix InvoiceCreator demo by @WebMamba in https://github.com/symfony/ux/pull/1861
* Infinite Scroll 2/2 by @smnandre in https://github.com/symfony/ux/pull/1887
### New Contributors
* @vesselind made their first contribution in https://github.com/symfony/ux/pull/1775
* @mickaelblondeau made their first contribution in https://github.com/symfony/ux/pull/1801
* @YummYume made their first contribution in https://github.com/symfony/ux/pull/1685
* @wolfgangweintritt made their first contribution in https://github.com/symfony/ux/pull/1809
* @hellomedia made their first contribution in https://github.com/symfony/ux/pull/1837
* @richardhj made their first contribution in https://github.com/symfony/ux/pull/1859
* @fbuchlak made their first contribution in https://github.com/symfony/ux/pull/1866
* @ruudk made their first contribution in https://github.com/symfony/ux/pull/1865
**Full Changelog**: https://github.com/symfony/ux/compare/v2.17.0...v2.18.0
## 2.17.0 : New UX Icons Package (v2.17.0)
Released: 2024-04-23
Hey UX-ers!
This is a big release - lots of new features to Twig/Live Components and the first release of [UX Icons](https://symfony.com/bundles/ux-icons/current/index.html)! With UX Icons, comes a [beautiful icon search on ux.symfony.com](https://ux.symfony.com/icons)!
### Live Components
* Improve child render handling: avoid removing element from DOM when possible by @weaverryan in https://github.com/symfony/ux/pull/1561
* Add modifier option to `LiveProp` by @squrious in https://github.com/symfony/ux/pull/1507
* Fix collections hydration with serializer by @squrious in https://github.com/symfony/ux/pull/1583
* Lazy load LiveComponent by @smnandre in https://github.com/symfony/ux/pull/1515
* Throw exception for typed LiveProps as interfaces by @smnandre in https://github.com/symfony/ux/pull/1593
* Alias URL bound props by @squrious in https://github.com/symfony/ux/pull/1396
### Twig Components
* CVA: Apply function accept null arguments by @WebMamba in https://github.com/symfony/ux/pull/1575
* Add `attributes.has()` method by @barbieswimcrew in https://github.com/symfony/ux/pull/1571
* CVA: Allow array for base, variants and compound by @WebMamba in https://github.com/symfony/ux/pull/1600
* CVA: Allow compound variant value to be string by @kbond in https://github.com/symfony/ux/pull/1610
* Allow stringable objects as attribute values by @kbond in https://github.com/symfony/ux/pull/1609
* Nested attributes by @kbond in https://github.com/symfony/ux/pull/1405
* Remove experimental tag to HTML syntax by @WebMamba in https://github.com/symfony/ux/pull/1662
* CVA: Resolving boolean as variant keys by @smnandre in https://github.com/symfony/ux/pull/1710
* Handle `aria-*` attribute boolean values by @smnandre in https://github.com/symfony/ux/pull/1709
* Merge props from template with class props by @WebMamba in https://github.com/symfony/ux/pull/1652
* Twig "use_yield" compatibility by @smnandre in https://github.com/symfony/ux/pull/1487
### Icons
* Introduce `symfony/ux-icons` by @kbond in https://github.com/symfony/ux/pull/1450https://github.com/symfony/ux/pull/1603
* Website Icon search (beta) by @smnandre in https://github.com/symfony/ux/pull/1577
### Chart.js
* Add view-value-change event by @IndraGunawan in https://github.com/symfony/ux/pull/1605
### Autocomplete
* Command `make:autocomplete-field` output a doc compliant class by @lucbu in https://github.com/symfony/ux/pull/1699
* Use `choice_value` in the `WrappedEntityTypeAutocompleter` in `EntityAutocompleteField` by @jakubtobiasz in https://github.com/symfony/ux/pull/1723
### Turbo
* Use blocks instead of partials to render turbo-streams by @nicolas-grekas in https://github.com/symfony/ux/pull/1045
### Lazy Image
* Cache BlurHash, close #2 by @Kocal in https://github.com/symfony/ux/pull/1755
* Support `intervention/image` 3 by @kbond in https://github.com/symfony/ux/pull/1766
### New Contributors
* @o0morgan0o made their first contribution in https://github.com/symfony/ux/pull/1580
* @barbieswimcrew made their first contribution in https://github.com/symfony/ux/pull/1576
* @tomschwiha made their first contribution in https://github.com/symfony/ux/pull/1621
* @IndraGunawan made their first contribution in https://github.com/symfony/ux/pull/1605
* @JeanDavidDaviet made their first contribution in https://github.com/symfony/ux/pull/1633
* @gremo made their first contribution in https://github.com/symfony/ux/pull/1615
* @kachnitel made their first contribution in https://github.com/symfony/ux/pull/1584
* @yoanbernabeu made their first contribution in https://github.com/symfony/ux/pull/1654
* @LtMost made their first contribution in https://github.com/symfony/ux/pull/1703
* @JorickPepin made their first contribution in https://github.com/symfony/ux/pull/1692
* @kasperh90 made their first contribution in https://github.com/symfony/ux/pull/1689
* @lucbu made their first contribution in https://github.com/symfony/ux/pull/1699
* @cavasinf made their first contribution in https://github.com/symfony/ux/pull/1705
* @raphael-geffroy made their first contribution in https://github.com/symfony/ux/pull/1716
* @daifma made their first contribution in https://github.com/symfony/ux/pull/1746
* @adrienlucas made their first contribution in https://github.com/symfony/ux/pull/1745
**Full Changelog**: https://github.com/symfony/ux/compare/v2.16.0...v2.17.0
## 2.16.0 : Live Components is Stable 🥳 (v2.16.0)
Released: 2024-02-29
Hi UX'ers!
This release is the first that declares Live Components as *stable* 🎆! This means that it is now protected by our backwards compatibility promise. However, there *are* some **BC breaks in LiveComponents** that will affect most projects. See https://github.com/symfony/ux/blob/2.x/src/LiveComponent/CHANGELOG.md#2160
In addition, this release has a number of fun features & fixes.
### Live Components
- LiveComponents is now stable and no longer experimental 🥳
- [BC BREAK] The `data-action-name` attribute behavior was removed in favor of using Stimulus "action parameters" and `data-live-action-param`. This is a breaking change if you were using the `data-action-name` attribute directly in your templates. #1418
To upgrade your application, follow these changes:
```diff
```
To pass arguments to an action, also use the Stimulus "action parameters" syntax:
```diff
```
Additionally, the `prevent` modifier (e.g. `prevent|save`) was removed. Replace this with the standard Stimulus `:prevent` action option:
```diff
```
- [BC BREAK] The `data-event` attribute was removed in favor of using Stimulus "action parameters": rename `data-event` to `data-live-event-param`. Additionally, if you were passing arguments to the event name, use action parameter attributes for those as well - e.g. `data-live-foo-param="bar"`. #1418
- Reverted setting `ignoreActiveValue: true` in Idiomorph #1548
- New placeholder macro to generate defer/lazy skeleton #1532
- improve TestLiveComponent::actingAs() #1461
- Drop Twig 2 support #1436
- Add better error message when hydrating dates #1431
- Store TemplateMap in build_dir #1525
### Twig Component
- Introduce CVA to style TwigComponent #1416
- Drop Twig 2 support #1436
- Fix full context is stored in profiler #1552
### Autocomplete
- Missing translations added for many languages #1527 #1528 #1535
### Translator
- Increase version range of `intl-messageformat` to `^10.5.11`, in order to see a faster implementation of ICU messages parsing. #1443
### New Contributors
* @itsdanielfelix made their first contribution in https://github.com/symfony/ux/pull/1511
* @Fan2Shrek made their first contribution in https://github.com/symfony/ux/pull/1545
* @xDeSwa made their first contribution in https://github.com/symfony/ux/pull/1535
**Full Changelog**: https://github.com/symfony/ux/compare/v2.15.0...v2.16.0
Have fun!
## v2.15.0 - LiveComponents & Autocomplete improvements & more (v2.15.0)
Released: 2024-02-20
Hi UX'ers!
This release contains a mixture of new features and important bug fixes, especially LiveComponents & Autocomplete, which were discovered after the morphing library change in 2.14.0.
### Autocomplete
Add doctrine/orm 3 support #1468
- Allow passing extra options to the autocomplete fields #1322
- Fix 2 bugs where TomSelect would reset when not necessary #1502
- Add one missing German translation #1521
### Chartjs
- Remove restriction that prevented Chart.js 3.9 #1518
### LiveComponent
- [BC BREAK] The `data-live-id` attribute was changed to `id` #1484
- Fixed child handling bug during re-rendering introduced with the
new morphing library in 2.14.0 #1484
- Fix bug where the active input would maintain its value, but lose its cursor position #1501
- Restrict Twig 3.9 for now #1486
### Turbo
- Add Turbo 8 support #1476
- Fix missing `use` statement used during broadcast #1475
### TwigComponent
- Add the ability to render specific attributes from the `attributes` variable #1442
- Restrict Twig 3.9 for now #1486
- Build reproducible TemplateMap to fix possible post-deploy breakage #1497
### New Contributors
* @jrushlow made their first contribution in https://github.com/symfony/ux/pull/1475
* @partulaj made their first contribution in https://github.com/symfony/ux/pull/1485
* @simonsolutions made their first contribution in https://github.com/symfony/ux/pull/1521
**Full Changelog**: https://github.com/symfony/ux/compare/v2.14.2...v2.15.0
Have fun!
## Fixing Turbo support for newer Doctrine (v2.14.2)
Released: 2024-02-07
Hi UX'ers!
This release fixes a regression in the Live Component testing utilities.
### Turbo
* [Turbo] Fixing support for not using old ClassUtils by @weaverryan in https://github.com/symfony/ux/pull/1471
### StimulusBundle
* [StimulusBundle] UxPackageReader class doesn't support projects with varied structures using Composer with custom directory structure by @yobrx in https://github.com/symfony/ux/pull/1467
### New Contributors
* @yobrx made their first contribution in https://github.com/symfony/ux/pull/1467
**Full Changelog**: https://github.com/symfony/ux/compare/v2.14.1...v2.14.2
Have fun!
## Fix regression in Live Component testing tools (v2.14.1)
Released: 2024-02-03
Hi UX'ers!
This release fixes a regression in the Live Component testing utilities.
### Live Component
* fix: use method from metadata for live component test helper by @daFish in https://github.com/symfony/ux/pull/1434
### StimulusBundle
* Handles Windows directory separator when normalizing controller names by @tamcy in https://github.com/symfony/ux/pull/1444
### ux.symfony.com
* [Site] LiveMemory demo by @smnandre in https://github.com/symfony/ux/pull/1377
### New Contributors
* @tamcy made their first contribution in https://github.com/symfony/ux/pull/1444
**Full Changelog**: https://github.com/symfony/ux/compare/v2.14.0...v2.14.1
Have fun!
## Features & Fixed for LiveComponent, TwigComponent & other packages (v2.14.0)
Released: 2024-01-30
Hi UX'ers!
A beautiful release with a set of features across several packages. 100+ commits, from 19 contributors 🔥 .
### TwigComponent
- Make `ComponentAttributes` traversable/countable
- Fixed lexing some `{# twig comments #}` with HTML Twig syntax
- Fix various usages of deprecated Twig code
### LiveComponent
- Add support for URL binding in `LiveProp`
- DOM morphing changed from `morphdom` to `idiomorph`
- Allow multiple `LiveListener` attributes on a single method
- Requests to LiveComponent are sent as POST by default
- Add method prop to AsLiveComponent to still allow GET requests, usage: `#[AsLiveComponent(method: 'get')]`
- Add a new `urlReferenceType` parameter to `AsLiveComponent`, which allows to
generate different type URL (e.g. absolute) for the component Ajax calls
- The `symfony/serializer` dependency is now optional
- Added a `data-skip-morph` attribute to allow skipping morphing of an element
(the element's attributes will be morphed, but its inner HTML will be overwritten
instead of morphed)
- Added an entry to the packages' `package.json` file so that `@symfony/ux-live-component`
will appear in the user's `importmap.php` file if using AssetMapper. This
will allow using the JavaScript from the package without extra setup.
- Fixed edge-case rendering bug where a 2nd Ajax request might start before
the 1st finished processing
- Fix usage of `{% embed %}` with `{% block %}` in `` components
- Fixed `data-loading` not working when on root element of a component
- Fixed error when `class` attributes contained a space at start or end
- Fixed loading directives being matched in a child component
### Autocomplete
- Fixed behavior of Autocomplete when the underlying `select` or `option`
elements were modified to hopefully, more reliably, reset the autocomplete
instance. This is particularly important with LiveComponents.
- Add support for the `render.loading_more` Tom Select Virtual Scroll option (`loading_more_text`)
- Avoid losing the selected options when the Stimulus component is disconnected
and reconnected to the DOM.
- Added `tom-select/dist/css/tom-select.bootstrap4.css` to `autoimport` - this
will cause this to appear in your `controllers.json` file by default, but disabled
see.
### StimulusBundle
- Added Typescript controllers support
### ChartJs
- Add support for Chart.js version 4
**Full Changelog**: https://github.com/symfony/ux/compare/v2.13.3...v2.14.0
### New Contributors
* @nayodahl made their first contribution in https://github.com/symfony/ux/pull/1316
* @squrious made their first contribution in https://github.com/symfony/ux/pull/1230
* @srich387 made their first contribution in https://github.com/symfony/ux/pull/1367
* @vgaret made their first contribution in https://github.com/symfony/ux/pull/1338
* @hepisec made their first contribution in https://github.com/symfony/ux/pull/1218
* @althaus made their first contribution in https://github.com/symfony/ux/pull/1425
Have fun!
## Various minor bug fixes (v2.13.3)
Released: 2024-01-30
Hi UX'ers!
A bug fix release. Nice!
### TwigComponent
* Merge data-action in `ComponentAttributes` #1288
* Fix DataCollector return types #1297
### LiveComponent
* Fix date object hydration for custom format #1295
* Allow trailing coma in "props" tags #1298
* Fix `BatchActionController` redirection #1301
### StimulusBundle
* Remove `stimulus.asset_mapper.loader_javascript_compiler` when no asset-mapper
**Full Changelog**: https://github.com/symfony/ux/compare/v2.13.2...v2.13.3
### New Contributors
* @nieck made their first contribution in https://github.com/symfony/ux/pull/1272
* @maxrem made their first contribution in https://github.com/symfony/ux/pull/1269
* @boedah made their first contribution in https://github.com/symfony/ux/pull/1280
* @TBoileau made their first contribution in https://github.com/symfony/ux/pull/1275
* @JeroenMoonen made their first contribution in https://github.com/symfony/ux/pull/1302
* @mariusadam made their first contribution in https://github.com/symfony/ux/pull/1294
* @6insanes made their first contribution in https://github.com/symfony/ux/pull/1301
* @stloyd made their first contribution in https://github.com/symfony/ux/pull/1311
Have fun!
## v2.13.2 Revert change to type: module (v2.13.2)
Released: 2023-11-11
Hi UX'ers!
In 2.13.0, all UX JavaScript packages changed to `type: module`. This had unintended side effects in certain environments / setups. This release reverts that change. See #1268.
**Full Changelog**: https://github.com/symfony/ux/compare/v2.13.1...v2.13.2
Have fun!
## v2.13.1: Fix chart.js but with type: module (v2.13.1)
Released: 2023-11-09
Hi UX'ers!
This release fixes a but in ux-chart.js. We changed the package to `type: 'module'`, but due to some inconsistencies with the `chart.js` library, that can't be done quite yet. We've reverted for now.
### What's Changed
* [Chart.js] Reverting chart.js type: module by @weaverryan in https://github.com/symfony/ux/pull/1264
**Full Changelog**: https://github.com/symfony/ux/compare/v2.13.0...v2.13.1
Have fun!
## v2.13.0: Lazy/Deferred components, Symfony 7 support & more (v2.13.0)
Released: 2023-11-08
Hi UX People!
This is a big release that contains new features across the components! It's the result of 156 commits from 29 different contributors! Note there is an edge-case **BC BREAK** in StimulusBundle if you were using action parameters in an unexpected way.
### All Components
- Add Symfony 7 support.
- Change JavaScript package to `type: module`
### Autocomplete
- Add new `BaseEntityAutocompleteType`
- Drop symfony 5.4 support.
### TwigComponent
- Added configuration to separate your components into different "namespaces"
- Add `outerScope` variable reach variables from the parent template of an
"embedded" component.
- Deprecate calling `ComponentTemplateFinder` constructor without `directory` argument.
- Add profiler integration: `TwigComponentDataCollector` and debug toolbar templates
- Add search feature in `debug:twig-component` command.
- Fix inconsistencies with how `{% component %}`/`` syntaxes are
rendered vs `component()`: `PostRenderEvent` is now dispatched & the template
resolution happens at runtime.
- Fix priority of passed in props vs default props with anonymous components.
- Add Symfony 7 support.
- TwigPreLexer: improve performance.
- Fix twig:lint bug with anonymous component tag.
### LIveComponent
- Add deferred/lazy rendering of Live Components.
- Fix option tag synchronization.
- Handle array-like objects when working with checkboxes.
- Normalize "true" & "false" model values
- Fix DTO hydration from phpdoc typehints.
- Fix instantiating LiveComponentMetadata multiple times.
- Throwing an error when setting an invalid model name.
### StimulusBundle
- Normalize parameters names given to twig helper 'stimulus_action()'.
**BC Break**: previously, parameters given in camelCase (eg.
`bigCrocodile`) were incorrectly registered by the controller as
flatcase (`event.params.bigcrocodile`). This was fixed, which means
they are now correctly registered as camelCase
(`event.params.bigCrocodile`).
- Added AssetMapper 6.4 support.
- Add Symfony 7 support.
- Fix missing double dash in namespaced Stimulus outlets.
- Change JavaScript package to `type: module`
### Svelte
- Add support for Svelte 4.
### New Contributors
* @tacman made their first contribution in https://github.com/symfony/ux/pull/1144
* @dsoriano made their first contribution in https://github.com/symfony/ux/pull/1145
* @gregberger made their first contribution in https://github.com/symfony/ux/pull/1148
* @andersonamuller made their first contribution in https://github.com/symfony/ux/pull/1154
* @JoppeDC made their first contribution in https://github.com/symfony/ux/pull/1135
* @gharlan made their first contribution in https://github.com/symfony/ux/pull/1175
* @jakubtobiasz made their first contribution in https://github.com/symfony/ux/pull/1143
* @maelanleborgne made their first contribution in https://github.com/symfony/ux/pull/1196
* @yceruto made their first contribution in https://github.com/symfony/ux/pull/1185
* @norival made their first contribution in https://github.com/symfony/ux/pull/1193
* @rrenteria-dev made their first contribution in https://github.com/symfony/ux/pull/1250
* @TheDutchScorpion made their first contribution in https://github.com/symfony/ux/pull/1251
* @bdujon made their first contribution in https://github.com/symfony/ux/pull/1246
**Full Changelog**: https://github.com/symfony/ux/compare/v2.12.0...v2.13.0
## v2.12.0 LiveComponent DTO support & much more (v2.12.0)
Released: 2023-09-22
Hi UX People!
This release contains a basket-load of goodness.
#### TwigComponent
- Added a `debug:twig-component` command.
- Fixed bad exception when the error comes from a Twig template.
- Fixed deprecation with `TemplateCacheWarmer` return type.
#### LiveComponent
- Add support for (de)hydrating DTO classes in `LiveProp`.
- Fixed `emit()` method of `TestLiveComponent` to properly test events.
- Add `actingAs()` to `TestLiveComponent`.
- Fixed rendering bug when using Chrome's translation feature.
- Add `onUpdated()` hook for `LiveProp`.
- Fix support for Alpine.js & live components.
#### TogglePassword
- Added default values for the Stimulus controller values.
### New Contributors
* @OskarStark made their first contribution in https://github.com/symfony/ux/pull/1109
* @MirakuSan made their first contribution in https://github.com/symfony/ux/pull/1101
* @StevenRenaux made their first contribution in https://github.com/symfony/ux/pull/1088
* @rdavaillaud made their first contribution in https://github.com/symfony/ux/pull/1134
**Full Changelog**: https://github.com/symfony/ux/compare/v2.11.2...v2.12.0
Have fun!
## ux-autocomplete security release + LiveComponent bugs (v2.11.2)
Released: 2023-09-11
Hi!
This release contains an important security release for `symfony/ux-autocomplete`: https://symfony.com/blog/cve-2023-41336-symfony-ux-autocomplete-prevent-injection-of-invalid-entity-ids-for-autocomplete-fields
If you are using `symfony/ux-autocomplete`, you should upgrade immediately:
```
composer update symfony/ux-autocomplete
```
Other changes:
#### LiveComponents
* [bug] Only consider Live components in InterceptChildComponentRenderSubscriber by @sneakyvv in https://github.com/symfony/ux/pull/1097
* [bug] Don't store ux_live_component URLs in setTargetPath of the security component by @gbere in https://github.com/symfony/ux/pull/1096
### New Contributors
* @andersmateusz made their first contribution in https://github.com/symfony/ux/pull/1100
* @mariecharles made their first contribution in https://github.com/symfony/ux/pull/1058
* @gbere made their first contribution in https://github.com/symfony/ux/pull/1096
**Full Changes**: https://github.com/symfony/ux/compare/v2.11.1...v2.11.2
## v2.11.1 - Twig & Live Component bug fixes (v2.11.1)
Released: 2023-09-07
Hi UX'ers!
A small release to address a few bug fixes:
### What's Changed
* [LiveComponent] Add priority to PreDehydrate & PostHydrate hooks by @sneakyvv in https://github.com/symfony/ux/pull/1074
* [LiveComponent] Use `display:revert` for `data-loading` style by @norkunas in https://github.com/symfony/ux/pull/1079
* [TwigComponent][LiveComponent] Fix Live embedded component within namespaced template by @sneakyvv in https://github.com/symfony/ux/pull/1082
* [TwigComponent][LiveComponent] Fix DataModelPropsSubscriber for embedded components by @sneakyvv in https://github.com/symfony/ux/pull/1093
**Full Changes**: https://github.com/symfony/ux/compare/v2.11.0...v2.11.1
Have fun!
## v2.11.0: TogglePassword Component, Anonymous Twig Components + more! (v2.11.0)
Released: 2023-08-28
Hi UX People!
This release contains a bucketload of good stuff:
#### New Component!
* UX Toggle Password: add "hide/show" links to toggle the password to plain-text!
#### TwigComponent
- Support ...spread operator with html syntax (requires Twig 3.7.0 or higher)
- Add support for anonymous Twig components.
- Add `RenderedComponent::crawler()` and `toString()` methods.
- Allow a block outside a Twig component to be available inside via `outerBlocks`.
- Fix `` syntax where an attribute is set to an empty value.
#### LiveComponent
- Add helper for testing live components.
- Add initial file upload support.
- Respect `data-turbo="false"` when handling redirects.
- Fix checksum calculation for deeply nested data.
### New Contributors
* @youassi made their first contribution in https://github.com/symfony/ux/pull/987
* @ngrie made their first contribution in https://github.com/symfony/ux/pull/993
* @DennisdeBest made their first contribution in https://github.com/symfony/ux/pull/1001
* @gpetraroli made their first contribution in https://github.com/symfony/ux/pull/1011
* @asispts made their first contribution in https://github.com/symfony/ux/pull/1019
* @feymo made their first contribution in https://github.com/symfony/ux/pull/1000
* @leonardsimonse made their first contribution in https://github.com/symfony/ux/pull/1020
* @sponno made their first contribution in https://github.com/symfony/ux/pull/1035
* @yassinefikri made their first contribution in https://github.com/symfony/ux/pull/1040
* @jcrombez made their first contribution in https://github.com/symfony/ux/pull/1054
* @Jasperator made their first contribution in https://github.com/symfony/ux/pull/1067
**Full Changes**: https://github.com/symfony/ux/compare/v2.10.0...v2.11.0
## (v2.10.0)
Released: 2023-07-06
Hi UX People!
This release contains various new features and big fixes:
#### BC Breaks
* [LiveComponent] A BC break was made to `ComponentWithFormTrait` in #967: some methods were renamed.
#### Features
* [All] bump to php >=8.1 everywhere by @bendavies in https://github.com/symfony/ux/pull/946
* [TwigComponent] Support passing blocks to nested embedded components by @sneakyvv in https://github.com/symfony/ux/pull/920
* [TwigComponent] add test helper by @kbond in https://github.com/symfony/ux/pull/821
* [LiveComponent] resetForm() method to get a fresh form by @weaverryan in https://github.com/symfony/ux/pull/884
* [LiveComponent] Method Name changes in ComponentWithFormTrait + expanded docs by @weaverryan in https://github.com/symfony/ux/pull/967
* [Autocomplete] When min chars is not set, keep loading after initial load by @weaverryan in https://github.com/symfony/ux/pull/919
* Stimulus controllers: allow to define outlets by @jmsche in https://github.com/symfony/ux/pull/942
#### Bug Fixes
* Fix Doctrine Persistence deprecation by @jmsche in https://github.com/symfony/ux/pull/918
* [Live] Removing docs showing the proxied component by @weaverryan in https://github.com/symfony/ux/pull/926
* [TwigComponent] Fix opening of default block inside an open twig block by @sneakyvv in https://github.com/symfony/ux/pull/892
* [TwigComponent] Ignore verbatim block during Prelexing by @WebMamba in https://github.com/symfony/ux/pull/949
* [TwigComponent] Fix escaping stimulus attributes by @1ed in https://github.com/symfony/ux/pull/969
* [LiveComponent] Working around issue where FormView is passed to the component by @weaverryan in https://github.com/symfony/ux/pull/943
* [Turbo] Fixing a bug where saving a proxy would not trigger Broadcasts by @weaverryan in https://github.com/symfony/ux/pull/951
* [Live] Fixing bug with data-action="live#update" and inside clickable elements by @weaverryan in https://github.com/symfony/ux/pull/950
* [Translator] generate unique constants name (fix #938) by @Kocal in https://github.com/symfony/ux/pull/945
* [StimulusBundle] Fix controller name conversion by @jon-ht in https://github.com/symfony/ux/pull/953
* [StimulusBundle] Fixing bug where new custom controllers were not seen due to cache by @weaverryan in https://github.com/symfony/ux/pull/964
**Full Changes**: https://github.com/symfony/ux/compare/v2.9.1...v2.10.0
## Various compatibility bug fixes (v2.9.1)
Released: 2023-05-31
Hi UX people!
This release fixes several bugs with the 2.9.0 release that caused problems when updating.
* More precisely initializing services/config for asset mapper by @weaverryan in https://github.com/symfony/ux/pull/911
* [LiveComponent] Fix array valued checkboxes change event handling by @welcoMattic in https://github.com/symfony/ux/pull/910
* [StimulusBundle] Marking only the AssetMapper integration as experimental by @weaverryan in https://github.com/symfony/ux/pull/908
* [TwigComponent] Fix breaking (deprecation instead) when using .add() + StimulusBundle by @weaverryan in https://github.com/symfony/ux/pull/914
### Upgrading
Like with version 2.9.0, if you're upgrading from a 2.8 or earlier, you may get this error after running `composer update`:
> Uncaught Exception: The service "chartjs.twig_extension" has a dependency on a non-existent service "stimulus.helper"
To fix this, run `composer update` one more time. The problem is, after the first update, Symfony Flex may not properly add StimulusBundle to `config/bundles.php`. After the 2nd update, it should be added, and the error will go away. See #907.
Diff: https://github.com/symfony/ux/compare/v2.9.0...v2.9.1
Cheers!
## New StimulusBundle + AssetMapper Support (v2.9.0)
Released: 2023-05-29
Hi UX people!
This release includes significant, but lower-level changes:
A) A new StimulusBundle was added! This is the new home for the `{{ stimulus_controller() }}`, `{{ stimulus_action() }}` and `{{ stimulus_target() }}` Twig functions that were previously part of WebpackEncoreBundle. These functions work the same as before, though the internals of how they do their job was improved.
B) Several UX packages (e.g. ux/chartjs) that previously relied on WebpackEncoreBundle internally now rely on StimulusBundle. Though, you shouldn't notice any difference.
C) Support for Symfony 6.3's new AssetMapper component were added to all packages.
In addition to this, several bugs were fixed in TwigComponent's new HTML syntax, LiveComponent and Chart.js.
### Upgrading
Due to a bug in Symfony Flex, when upgrading your dependencies, you may get an error like:
> Uncaught Exception: The service "chartjs.twig_extension" has a dependency on a non-existent service "stimulus.helper"
To fix this, run `composer update` one more time. The problem is, after the first update, Symfony Flex may not properly add StimulusBundle to `config/bundles.php`. After the 2nd update, it should be added, and the error will go away. See #907.
Diff: https://github.com/symfony/ux/compare/v2.8.1...v2.9.0
Cheers!
## Collection of bug fixes across LiveComponents, TwigComponents, Chartjs (v2.8.1)
Released: 2023-05-16
Hi UX people!
This release contains a number of nice bug fixes across several components:
#### ChartJs
* [Bug] Adding a better way to register Chartjs plugins by @weaverryan in https://github.com/symfony/ux/pull/870
#### TwigComponent
* [Bug] Fix lexer to escape attribute name when it contains dashes by @norkunas in https://github.com/symfony/ux/pull/837
* [Bug] Ignore twig comments when prelexing by @WebMamba in https://github.com/symfony/ux/pull/842
* [Bug] fixing issue with files finishing with comments by @WebMamba in https://github.com/symfony/ux/pull/847
* [Bug] Fix lexer to escape truthy attribute names by @norkunas in https://github.com/symfony/ux/pull/848
* [Bug] Fixing bug where traditional blocks aren't handled correctly by @weaverryan in https://github.com/symfony/ux/pull/859
#### LiveComponent
* [Bug] Throw clear error when using union types for LiveProps by @sneakyvv in https://github.com/symfony/ux/pull/856
* [Bug] Fixing bug with ComponentWithFormTrait and empty collections by @weaverryan in https://github.com/symfony/ux/pull/857
* [Bug] Smarter form trait data extracting by @weaverryan in https://github.com/symfony/ux/pull/866
* [Bug] Upping priority on LiveComponentSubscriber by @weaverryan in https://github.com/symfony/ux/pull/868
Diff: https://github.com/symfony/ux/compare/v2.8.0...v2.8.1
Happy UX'ing!
## 2 new components, Twig HTML Syntax + Big Live Updates (v2.8.0)
Released: 2023-05-03
Hi UX people!
This is a BIG release full of a new Twig component HTML syntax (``), massive live components updates and various other items.
* 2 new components: [ux-translator](https://ux.symfony.com/translator) and [ux-svelte](https://ux.symfony.com/svelte)!
* `LiveComponents`: new smart rendering system, better handling for `LiveProp` data types, `emit()` to other components + much more - see the full [CHANGELOG](https://github.com/symfony/ux/blob/2.x/src/LiveComponent/CHANGELOG.md)
* `TwigComponents`: new `` HTML syntax and other improvements - [CHANGELOG](https://github.com/symfony/ux/blob/2.x/src/TwigComponent/CHANGELOG.md)
* `Chartjs`: Chart now smartly re-renders if any Stimulus values passed to it change [CHANGELOG](https://github.com/symfony/ux/blob/2.x/src/Chartjs/CHANGELOG.md)
* `Autocomplete`: Added support for `optiongroup` & updating of the smart select when the underlying options change - [CHANGELOG](https://github.com/symfony/ux/blob/2.x/src/Autocomplete/CHANGELOG.md).
Diff: https://github.com/symfony/ux/compare/v2.7.1...v2.8.0
Cheers!
## Fixing missing CSS files in packages (v2.7.1)
Released: 2023-01-25
Hi UX people!
This release fixes a problem where some packages were missing their associated CSS files, do to an overeager `.gitattributes` setting. That's it - nice and simple.
Diff: https://github.com/symfony/ux/compare/v2.7.0...v2.7.1
Cheers!
## TypeScript Types, JavaScript Bubbling & Many LiveComponent Improvements (v2.7.0)
Released: 2023-01-23
Hi UX people!
This release is a big mixture of a lot of nice changes. The most notable are that (A) TypeScript types are now included in the packages, (B) all Stimulus events (e.g. `chartjs:connect`) now "bubble" so that you can attach listeners around the controllers (this was already the case for some packages, but not all) and (C) MANY continued improvements and fixes for LiveComponents.
Diff: https://github.com/symfony/ux/compare/v2.6.1...v2.7.0
### UX Autocomplete
- Add `assets/src` to `.gitattributes` to exclude them from the installation
- Fix minCharacters option default value handling when using a falsy value like 0.
- Fix TypeScript types
- Add a new `route` parameter to `AsEntityAutocompleteField`, which allows to choose another route for Ajax calls.
- Fix minCharacters option default value handling when using a falsy value like 0.
- Fix TypeScript types
- Add a way to detect if a field is an "autocomplete" field in form themes - #608
### UX Chartjs
- The `chartjs:connect` JavaScript event now bubbles up.
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### UX Cropperjs
- The JavaScript events now bubble up.
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### Dropzone
- The JavaScript events now bubble up.
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### LazyImage
- The JavaScript events now bubble up.
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### LiveComponent
- [BC BREAK]: The "key" used to load the controller in your `assets/controllers.json`
file changed from `typed` to `live`. Update your `assets/controllers.json`
file to change this key.
- Add a strategy for adding a Stimulus controller to a Twig component - #589.
- Added a new `getCompontent()` function in JavaScript as the best way to find
a Component object for a given element.
- Fixed various bugs related to child component handling - #596
- Added a new `route` parameter to `AsLiveComponent`, which allows to choose
another route for Ajax calls.
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
- Added new `response:error` JavaScript component hook for custom handling Ajax errors - #587.
### Notify
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### React
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### Swup
- The JavaScript events now bubble up.
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### Turbo
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### TwigComponent
- `PreMount` and `PostMount` hooks can now return nothing.
### Typed
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
### Vue
- Add `assets/src` to `.gitattributes` to exclude source TypeScript files from
installing.
- TypeScript types are now included.
Cheers!
## Fix Autocomplete preload behavior & ux-turbo-mercure packae (v2.6.1)
Released: 2022-12-07
Hi UX people!
This PR fixes a few bugs with 2.6.0. Most notably, the `symfony/ux-turbo-mercure` package is deprecated as it now comes automatically with `symfony/ux-turbo`. See the [Turbo CHANGELOG](https://github.com/symfony/ux/blob/2.x/src/Turbo/CHANGELOG.md#261) for more details.
Diff: https://github.com/symfony/ux/compare/v2.6.0...v2.6.1
Cheers!
# Accordion
Build vertically collapsing sections powered by Bootstrap's Collapse plugin.
```twig
Symfony UX connects Symfony with modern frontend tools.
It provides JavaScript packages, Twig components, and integrations designed to work naturally with Symfony applications.
Yes. Pass HTML attributes and Bootstrap utility classes directly to the Twig components, or customize Bootstrap through Sass and CSS variables.
Set alwaysOpen on the root accordion to omit Bootstrap's parent constraint.
```
## Installation
```shell
php bin/console ux:install accordion --kit bootstrap
```
## Usage
```twig
Update your personal details and contact information.
Review your password and two-factor authentication settings.
```
## Accessibility
Choose a `headingTag` that fits the surrounding document hierarchy. Each heading contains a button with `aria-expanded` and `aria-controls`, and each panel references its heading with `aria-labelledby`.
Bootstrap's transition respects `prefers-reduced-motion`. Keep labels concise and do not hide essential information exclusively inside collapsed sections.
## Examples
Render a conventional accordion where opening one item closes the currently open item.
```twig
This is the first item's accordion body.
It is shown by default until the Collapse plugin updates the appropriate classes and ARIA state.
This is the second item's accordion body.
It is hidden by default and can contain nearly any HTML content.
This is the third item's accordion body.
Opening it closes the currently open item.
```
### Flush
Remove outer borders and rounded corners for an edge-to-edge accordion.
```twig
Placeholder content for this edge-to-edge accordion item.
The flush style removes some borders and rounded corners.
Items retain the same Collapse behavior and accessibility attributes.
```
### Always open
Allow several items to remain expanded by omitting Bootstrap's parent constraint.
```twig
This item starts open and remains open when another item is expanded.
Multiple items can stay open because no data-bs-parent constraint is rendered.
Each button still controls its own panel and synchronizes aria-expanded.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | The unique identifier used to coordinate the accordion items. |
| `flush` | `boolean` | `false` | Whether to remove outer borders and rounded corners. |
| `alwaysOpen` | `boolean` | `false` | Whether multiple accordion items may remain open. |
| Block | Description |
|:------|:------------|
| `content` | The accordion items, typically `Accordion:Item` components. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | The unique identifier used for the heading and collapsible panel. |
| `label` | `string` | `''` | The text displayed in the accordion button. |
| `expanded` | `boolean` | `false` | Whether the accordion item is initially expanded. |
| `headingTag` | `'h1'\|'h2'\|'h3'\|'h4'\|'h5'\|'h6'` | `'h2'` | The heading element to render. |
| Block | Description |
|:------|:------------|
| `label` | The accordion button label. |
| `content` | The content displayed inside the collapsible panel. |
# Alert
Provides contextual feedback messages for typical user actions.
```twig
Your changes were saved successfully. Review them now.
```
## Installation
```shell
php bin/console ux:install alert --kit bootstrap
```
## Usage
```twig
A simple primary alert - check it out!
```
## Accessibility
Do not rely on color alone to communicate the alert's meaning. Include clear visible text or additional context for assistive technologies.
Dismissal removes the alert from the document. When appropriate, listen for Bootstrap's `closed.bs.alert` event and move focus to a logical destination.
## Examples
### Contextual variants
Use one of Bootstrap's eight contextual colors to match the message's purpose.
```twig
A simple primary alert - check it out!A simple secondary alert - check it out!A simple success alert - check it out!A simple danger alert - check it out!A simple warning alert - check it out!A simple info alert - check it out!A simple light alert - check it out!A simple dark alert - check it out!
```
### Link color
Use `alert-link` for links that inherit a suitable color from their alert variant.
```twig
A simple primary alert with an example link. Give it a click if you like.A simple secondary alert with an example link. Give it a click if you like.A simple success alert with an example link. Give it a click if you like.A simple danger alert with an example link. Give it a click if you like.A simple warning alert with an example link. Give it a click if you like.A simple info alert with an example link. Give it a click if you like.A simple light alert with an example link. Give it a click if you like.A simple dark alert with an example link. Give it a click if you like.
```
### Additional content
Alerts can contain headings, paragraphs, dividers, and other structured content.
```twig
Aww yeah, you successfully read this important alert message. This example text is long enough to show how spacing works with additional content.
Whenever you need to, use margin utilities to keep things nice and tidy.
```
### Icons
Combine alerts with flex utilities and accessible inline icons.
```twig
An example alert with an icon
An example alert with an icon
An example success alert with an icon
An example warning alert with an icon
An example danger alert with an icon
```
### Dismissing
Enable Bootstrap's alert plugin with a close button, dismissal classes, and transition classes.
```twig
Holy guacamole! You should check in on some of those fields below.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'` | `'primary'` | The Bootstrap contextual color. |
| `dismissible` | `boolean` | `false` | Whether to render a dismiss button and dismissal transition classes. |
| `heading` | `string\|null` | `null` | The optional alert heading. |
| `content` | `string` | `''` | The fallback message when no content block is provided. |
| Block | Description |
|:------|:------------|
| `heading` | The alert heading, rendered before the main content. |
| `content` | The alert message and optional additional content. |
| `close` | The dismiss control rendered when the alert is dismissible. |
# Badge
A small count or label used to highlight status, counts, or short contextual information.
```twig
NewPublishedPending99+
```
## Installation
```shell
php bin/console ux:install badge --kit bootstrap
```
## Usage
```twig
New
```
## Accessibility
Do not rely on badge color alone to communicate meaning. Include meaningful visible text or additional context with Bootstrap's `visually-hidden` utility.
When a badge contains a count, make sure its relationship to the surrounding heading, button, or link is clear to assistive technologies.
## Examples
### Headings
Badges inherit their size from the immediate parent, so they scale naturally inside headings.
```twig
Example heading New
Example heading New
Example heading New
Example heading New
Example heading New
Example heading New
```
### Buttons
Place a badge inside a button to display a related count.
```twig
```
### Positioned
Combine badges with Bootstrap's position utilities to create counters and status indicators.
```twig
```
### Background colors
Use contextual background colors while keeping the badge's meaning clear from its text.
```twig
PrimarySecondarySuccessDangerWarningInfoLightDark
```
### Pill badges
Use the pill style for a more rounded badge with a larger border radius.
```twig
PrimarySecondarySuccessDangerWarningInfoLightDark
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'` | `'primary'` | The Bootstrap contextual color. |
| `pill` | `boolean` | `false` | Whether to use Bootstrap's rounded pill style. |
| `label` | `string` | `''` | The fallback badge text when no content block is provided. |
| Block | Description |
|:------|:------------|
| `content` | The badge text and optional inline content. |
# Breadcrumb
Indicates the current page's location within a navigational hierarchy.
```twig
```
## Accessibility
Give the navigation a meaningful accessible name. Apply `aria-current="page"` to the final breadcrumb item so assistive technologies can identify the current page.
## Examples
Build breadcrumb trails with linked items followed by an active item for the current page.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `divider` | `string\|null` | `null` | The custom text used as the divider between breadcrumb items. |
| `label` | `string\|null` | `'breadcrumb'` | The accessible name for the breadcrumb navigation. |
| Block | Description |
|:------|:------------|
| `content` | The ordered list of breadcrumb items. |
# Button Group
Groups a series of buttons on a single line or in a vertical column.
```twig
LeftMiddleRightDeleteArchivePublish
```
## Installation
```shell
php bin/console ux:install button-group --kit bootstrap
```
## Usage
```twig
LeftMiddleRight
```
## Accessibility
Button groups need `role="group"` and an explicit accessible name. The `label` prop supplies `aria-label`; set it to `null` only when providing an equivalent `aria-labelledby` attribute.
Use `role="toolbar"` and a meaningful label on toolbars that combine multiple button groups.
## Examples
### Basic example
Group buttons or links together as one related set of controls.
```twig
LeftMiddleRightActive linkLinkLink
```
### Mixed styles
Mix contextual button styles within one group.
```twig
LeftMiddleRight
```
### Outlined styles
Use outline buttons for a group with less visual weight.
```twig
LeftMiddleRight
```
### Checkbox and radio button groups
Combine Bootstrap toggle inputs and labels into seamless checkbox or radio groups.
```twig
```
### Button toolbar
Combine several button groups, and optionally input groups, inside a labeled toolbar.
```twig
12345678
1234
@
1234
@
```
### Sizing
Apply a size to the group instead of repeating it on every button.
```twig
LeftMiddleRightLeftMiddleRightLeftMiddleRight
```
### Nesting
Nest a button group to place a dropdown alongside other buttons.
```twig
12Dropdown
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `vertical` | `boolean` | `false` | Whether to stack the buttons vertically. |
| `size` | `'sm'\|'lg'\|null` | `null` | The Bootstrap size applied to every button in the group. |
| `label` | `string\|null` | `'Button group'` | The accessible name for the group. |
| Block | Description |
|:------|:------------|
| `content` | The buttons, links, or form controls contained in the group. |
# Button
Use Bootstrap button styles for actions in forms, dialogs, navigation, and more.
```twig
```
## Installation
```shell
php bin/console ux:install button --kit bootstrap
```
## Usage
```twig
Save changes
```
## Accessibility
Do not rely on button color alone to communicate meaning. Use explicit labels or additional visually hidden text when needed.
Disabled links omit their `href`, expose `aria-disabled="true"`, and are removed from keyboard navigation.
## Examples
### Base class
Use the base Bootstrap button class without a contextual color when defining a custom style.
```twig
Base class
```
### Variants
Use contextual colors to communicate the purpose of an action.
```twig
```
### Disable text wrapping
Add Bootstrap's `text-nowrap` utility when a button label must remain on one line.
```twig
This button label does not wrap
```
### Button tags
Render the component as a button, link, or input depending on the semantic element required.
```twig
LinkButton
```
### Outline buttons
Use outline styles for actions that need less visual weight.
```twig
PrimarySecondarySuccessDangerWarningInfoLightDark
```
### Sizes
Use Bootstrap's large and small sizes, or customize the component with Bootstrap CSS variables.
```twig
Large buttonLarge button
Small buttonSmall button
Custom button
```
### Disabled state
Disable buttons and links while preserving the appropriate HTML and accessibility semantics.
```twig
Primary buttonButtonPrimary buttonButton
Primary linkLink
```
### Block buttons
Combine the component with Bootstrap layout utilities to create responsive full-width buttons.
```twig
ButtonButton
ButtonButton
ButtonButton
ButtonButton
```
### Toggle states
Use Bootstrap's button plugin for controls that toggle between pressed and unpressed states.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'button'\|'a'\|'input'` | `'button'` | The HTML element to render. |
| `type` | `'button'\|'submit'\|'reset'\|null` | `null` | The type used for button and input elements. |
| `href` | `string\|null` | `null` | The destination used for anchor elements. |
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'\|'link'\|null` | `'primary'` | The Bootstrap contextual color. |
| `outline` | `boolean` | `false` | Whether to use an outline style. |
| `size` | `'sm'\|'lg'\|null` | `null` | The Bootstrap button size. |
| `disabled` | `boolean` | `false` | Whether the control is disabled. |
| `value` | `string\|null` | `null` | The value rendered by input elements. |
| `content` | `string` | `''` | The fallback label when no content block is provided. |
| Block | Description |
|:------|:------------|
| `content` | The button label and optional inline content. |
# Card
Build flexible content containers with optional headers, footers, images, and contextual styles.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=720&q=80' %}
Explore the outdoorsWeekend inspirationDiscover a new trail and make time for a change of scenery.Find a trailView guideUpdated today
```
## Installation
```shell
php bin/console ux:install card --kit bootstrap
```
## Usage
```twig
FeaturedCard titleSome quick example text to build on the card title.2 days ago
```
## Accessibility
Choose a semantic heading level for each card title that fits the surrounding page hierarchy.
Do not rely on background, text, or border color alone to communicate meaning. Keep sufficient contrast and provide an equivalent text cue when color carries information.
## Examples
Combine an image, title, supporting text, and action in a fixed-width card.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=720&q=80' %}
Card titleSome quick example text to build on the card title and make up the bulk of the card's content.Go somewhere
```
### Content types
Mix card bodies, titles, subtitles, text, links, images, and list groups.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=720&q=80' %}
Card titleCard subtitleSome quick example text to build on the card title.Card linkAnother linkText, images, list groups, and links can be freely combined.
An item
A second item
A third item
Card link
```
### Header and footer
Add optional headers and footers, including semantic heading and quote content.
```twig
FeaturedSpecial title treatmentWith supporting text below as a natural lead-in to additional content.Go somewhereFeatured
A well-known quote, contained in a blockquote element.
Someone famous in Source Title2 days ago
```
### Sizing
Size cards with Bootstrap's grid, width utilities, or custom CSS.
```twig
Grid-sized cardThe surrounding Bootstrap grid controls this card's width.
Utility-sized cardWidth utilities or custom CSS can size a card directly.
```
### Text alignment
Apply Bootstrap text alignment utilities to a card or one of its sections.
```twig
{% for alignment, label in {'': 'Start', 'text-center': 'Center', 'text-end': 'End'} %}
{{ label }} alignedUse Bootstrap text utilities on the whole card or an individual section.Go somewhere
{% endfor %}
```
### Navigation
Place tabs or pills in the card header.
```twig
Special title treatmentCard headers can contain Bootstrap tab or pill navigation.
{% endfor %}
```
### Image caps
Position an image at the top or bottom edge of a card.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=960&q=80' %}
Top image capImages can sit at either end of a card.
Bottom image capThe bottom position matches the lower card corners.
```
### Image overlays
Use an image as the card background and place concise, high-contrast content over it.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=960&q=80' %}
Card titleOverlay text should remain shorter than the image height and maintain sufficient contrast.Last updated 3 mins ago
```
### Horizontal
Combine the component with Bootstrap's responsive grid to create a horizontal card.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=720&q=80' %}
Card titleThis card becomes horizontal at the small breakpoint.Last updated 3 mins ago
```
### Background and color
Use Bootstrap's `text-bg-*` helpers for contextual card styles.
```twig
{% for color in ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'] %}
Header{{ color|title }} card titleSome quick example text to build on the card title.
{% endfor %}
```
### Borders
Change border and text colors independently with utility classes.
```twig
{% for color in ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'] %}
Header{{ color|title }} card titleUse border utilities independently from backgrounds.
{% endfor %}
```
### Mixins utilities
Customize header and footer borders or remove their background color.
```twig
HeaderSuccess card titleHeader and footer borders can be customized independently.Footer
```
### Card groups
Render a set of attached cards with equal width and height.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=720&q=80' %}
{% for length in ['This content is a little bit longer.', 'This card has supporting text.', 'This card has even longer content to demonstrate equal heights.'] %}
Card title{{ length }}Last updated 3 mins ago
{% endfor %}
```
### Grid cards
Use responsive grid columns and `h-100` cards for a flexible multi-card layout.
```twig
{% set image_url = 'https://images.unsplash.com/photo-1535189043414-47a3c49a0bed?auto=format&fit=crop&w=720&q=80' %}
{% for length in ['A longer card with supporting text.', 'A short card.', 'A card with supporting text and an aligned footer.'] %}
Card title{{ length }}Last updated 3 mins ago
{% endfor %}
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The card content, typically including `Card:Header`, `Card:Body`, and `Card:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content area of the card. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer content of the card. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'div'\|'h2'\|'h3'\|'h4'\|'h5'\|'h6'` | `'div'` | The HTML element to render. |
| Block | Description |
|:------|:------------|
| `content` | The header content of the card. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `src` | `string` | - | The image source URL. |
| `alt` | `string` | `''` | A text alternative describing the image. |
| `position` | `'top'\|'bottom'\|'background'` | `'top'` | The image position within the card. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `href` | `string` | `'#'` | The link destination. |
| Block | Description |
|:------|:------------|
| `content` | The link label. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The content displayed over the card image. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'h2'\|'h3'\|'h4'\|'h5'\|'h6'\|'div'` | `'h6'` | The HTML element to render. |
| Block | Description |
|:------|:------------|
| `content` | The subtitle text of the card. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'p'\|'div'` | `'p'` | The HTML element to render. |
| Block | Description |
|:------|:------------|
| `content` | The supporting text of the card. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'h2'\|'h3'\|'h4'\|'h5'\|'h6'\|'div'` | `'h5'` | The HTML element to render. |
| Block | Description |
|:------|:------------|
| `content` | The title text of the card. |
# Carousel
Cycle through images, text, and other content with optional controls and indicators.
```twig
First slide
Second slide
Third slide
```
## Installation
```shell
php bin/console ux:install carousel --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Every carousel needs a unique `id`, and every indicator and control must target that same value. Mark exactly one initial `Carousel:Item` as `active`; otherwise the carousel is not visible.
Carousels that start automatically can be difficult for people using assistive technology or who need more time to read. Prefer user-controlled playback, or provide a pause control when autoplay is required. Write meaningful alternative text for images and keep the previous and next labels understandable in the page language.
## Examples
### Basic example
Cycle through three slides with Bootstrap's previous and next controls.
```twig
First slide
Second slide
Third slide
```
### Indicators
Add buttons that identify and select each slide.
```twig
First slide
Second slide
Third slide
```
### Captions
Overlay responsive headings and supporting text on each slide.
```twig
First slide label
Representative placeholder content for the first slide.
Second slide label
Representative placeholder content for the second slide.
Third slide label
Representative placeholder content for the third slide.
```
### Crossfade
Replace the horizontal movement with a fade transition.
```twig
First slide
Second slide
Third slide
```
### Autoplaying carousels
Start cycling as soon as the page loads with `ride="carousel"`.
```twig
First slide
Second slide
Third slide
```
### Ride after interaction
Start cycling only after the user first interacts with the carousel.
```twig
First slide
Second slide
Third slide
```
### Individual item interval
Give individual slides a longer or shorter display interval.
```twig
10 seconds
2 seconds
Default interval
```
### Autoplay without controls
Autoplay a carousel without rendering previous and next buttons.
```twig
First slide
Second slide
Third slide
```
### Disable touch swiping
Keep controls active while disabling touch gestures.
```twig
First slide
Second slide
Third slide
```
### Dark variant
Use Bootstrap's dark color mode for controls and indicators on a light slide.
```twig
First slide
Second slide
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | The unique identifier targeted by carousel controls and indicators. |
| `controls` | `boolean` | `true` | Whether to render previous and next controls. |
| `indicators` | `boolean` | `false` | Whether to render the indicators block. |
| `ride` | `'carousel'\|'true'\|null` | `null` | Whether and when the carousel starts cycling automatically. |
| `interval` | `number\|null` | `null` | The delay in milliseconds between automatically cycling slides. |
| `pause` | `'hover'\|false\|null` | `null` | Whether cycling pauses when the pointer enters the carousel. |
| `wrap` | `boolean` | `true` | Whether the carousel cycles continuously. |
| `touch` | `boolean` | `true` | Whether touch swipe interactions are enabled. |
| `fade` | `boolean` | `false` | Whether slides crossfade instead of moving horizontally. |
| `theme` | `'light'\|'dark'\|null` | `null` | The component-specific Bootstrap color mode. |
| Block | Description |
|:------|:------------|
| `indicators` | The carousel indicator buttons. |
| `content` | The carousel items, typically `Carousel:Item` components. |
| `previous` | The visually hidden label for the previous control. |
| `next` | The visually hidden label for the next control. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `active` | `boolean` | `false` | Whether this item is the currently visible slide. |
| `interval` | `number\|null` | `null` | The item-specific delay in milliseconds before advancing. |
| Block | Description |
|:------|:------------|
| `content` | The slide content. |
# Close Button
Provide an accessible control for dismissing content such as modals and alerts.
```twig
```
## Installation
```shell
php bin/console ux:install close-button --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Always provide a concise `label` that identifies what the button closes or dismisses. The visible icon is decorative and the accessible name comes from `aria-label`.
Use the disabled state only when the close action is genuinely unavailable.
## Examples
Render a standard close button with an accessible label.
```twig
```
### Disabled state
Disable the button when the dismiss action is unavailable.
```twig
```
### Dark variant
Use Bootstrap's `data-bs-theme="dark"` color mode on the button or an ancestor. The deprecated `.btn-close-white` class is intentionally not used.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `disabled` | `boolean` | `false` | Whether the close button is disabled. |
| `label` | `string` | - | The accessible label describing the close action. |
# Collapse
Toggle the visibility of content with Bootstrap's Collapse plugin.
```twig
This panel is controlled by Bootstrap's Collapse plugin. Its trigger automatically keeps aria-expanded synchronized.
```
## Installation
```shell
php bin/console ux:install collapse --kit bootstrap
```
## Usage
```twig
Additional details appear here.
```
## Accessibility
Prefer a native button trigger. If an anchor is used, add `role="button"`. Set the initial `aria-expanded` value to match the `show` prop and point `aria-controls` to the collapsible element's ID.
Bootstrap synchronizes `aria-expanded` while toggling. Avoid padding directly on the collapse element because Bootstrap animates its height or width; place padding on an inner element instead.
## Examples
Control the same collapsible panel with a link or a button.
```twig
Some placeholder content for the collapse component. This panel can be toggled by either control.
```
### Horizontal
Animate width instead of height and set a width on the immediate child.
```twig
This content collapses horizontally. The immediate child defines the expanded width.
```
### Multiple toggles and targets
Use ID and class selectors to control individual panels or several targets together.
```twig
The first panel can be toggled independently or together with the second.
The second panel responds to its ID and the shared class selector.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | The unique identifier targeted by collapse controls. |
| `show` | `boolean` | `false` | Whether the collapsible content is initially visible. |
| `horizontal` | `boolean` | `false` | Whether the width is collapsed instead of the height. |
| Block | Description |
|:------|:------------|
| `content` | The content shown and hidden by the collapse control. |
# Dropdown
Display contextual menus from buttons and links in any Bootstrap direction.
```twig
Dropdown buttonActionAnother actionSomething else here
```
## Installation
```shell
php bin/console ux:install dropdown --kit bootstrap
```
## Usage
```twig
ActionsEditDuplicateArchive
```
## Accessibility
Bootstrap dropdowns are generic popovers, so the component does not add ARIA menu roles automatically. Add `role="menu"`, `role="menuitem"`, and the matching keyboard behavior only when the dropdown implements the complete ARIA menu pattern.
Use a button for actions and reserve link toggles and items for navigation. Give a toggle an `id` and pass it to the menu's `labelledBy` prop when an explicit accessible relationship is useful. Disabled links receive `aria-disabled="true"` and are removed from sequential keyboard navigation, but application code must still prevent any custom activation behavior.
## Examples
### Single button
Use buttons or links with Bootstrap's contextual colors.
```twig
{% for color in ['primary', 'secondary', 'success', 'info', 'warning', 'danger'] %}
{{ color|title }}ActionAnother actionSomething else here
{% endfor %}
Dropdown linkActionAnother action
```
### Split button
Separate the primary action from the menu toggle.
```twig
{% for color in ['primary', 'secondary', 'success', 'info', 'warning', 'danger'] %}
ActionAnother actionSeparated link
{% endfor %}
```
### Sizing
Create large and small regular or split dropdown buttons.
```twig
Large buttonActionActionSmall buttonActionAction
```
### Dark dropdowns
Render a dark menu with a visible active item.
```twig
Dropdown buttonActionAnother actionSomething else hereSeparated link
```
### Directions
Open menus from the center, above, or from either side.
```twig
```
### Active and disabled items
Communicate the current item and unavailable choices.
```twig
Regular linkActive linkDisabled link
```
### Menu alignment
Align a menu against the end of its toggle.
```twig
Right-aligned menuActionAnother actionSomething else here
```
### Responsive alignment
Change menu alignment at Bootstrap breakpoints.
```twig
Left-aligned but right-aligned when large screenActionRight-aligned but left-aligned when large screenAction
```
### Alignment options
Combine responsive alignment with dropdowns that open in different directions.
```twig
DropdownMenu itemMenu itemDropendRight-aligned, left-aligned when largeDropstartLeft-aligned, right-aligned when largeDropupRight-aligned menu
```
### Headers, dividers, and text
Structure longer menus with headings, separators, and explanatory copy.
```twig
Dropdown headerActionAnother actionSome example text that's free-flowing within the dropdown menu.Separated link
```
### Forms
Display a static form or open one from a dropdown toggle.
```twig
Dropdown form
```
### Dropdown options
Configure Popper's offset and reference element with Bootstrap data attributes.
```twig
OffsetActionAction
```
### Auto close behavior
Choose which inside or outside interactions dismiss the menu.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `direction` | `'down'\|'center'\|'up'\|'up-center'\|'end'\|'start'` | `'down'` | The direction in which the menu opens. |
| `grouped` | `boolean` | `false` | Whether to use a button group wrapper, as required by split toggles. |
| Block | Description |
|:------|:------------|
| `content` | The dropdown toggle and menu. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'h1'\|'h2'\|'h3'\|'h4'\|'h5'\|'h6'` | `'h6'` | The heading element to render. |
| Block | Description |
|:------|:------------|
| `content` | The dropdown section heading. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'a'\|'button'` | `'a'` | The interactive element to render. |
| `href` | `string` | `'#'` | The destination used by link items. |
| `active` | `boolean` | `false` | Whether the item represents the current selection. |
| `disabled` | `boolean` | `false` | Whether the item is unavailable. |
| Block | Description |
|:------|:------------|
| `content` | The dropdown item label. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'ul'\|'div'\|'form'` | `'ul'` | The menu container element to render. |
| `dark` | `boolean` | `false` | Whether to use Bootstrap's dark menu variant. |
| `align` | `string\|array\|null` | `null` | One or more Bootstrap alignment suffixes, such as `end` or `lg-end`. |
| `labelledBy` | `string\|null` | `null` | The identifier of the toggle that labels the menu. |
| Block | Description |
|:------|:------------|
| `content` | The dropdown menu items and custom content. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The non-interactive dropdown text. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'button'\|'a'` | `'button'` | The interactive element to render. |
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'` | `'secondary'` | The Bootstrap contextual color. |
| `outline` | `boolean` | `false` | Whether to render the outline variant. |
| `size` | `'sm'\|'lg'\|null` | `null` | The optional button size. |
| `split` | `boolean` | `false` | Whether to render only the split-menu caret. |
| `disabled` | `boolean` | `false` | Whether the toggle is disabled. |
| Block | Description |
|:------|:------------|
| `content` | The visible toggle label. |
# Figure
Display related visual content with an optional caption and responsive alignment.
```twig
```
## Installation
```shell
php bin/console ux:install figure --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Write image alternative text that describes the image's purpose in context. Avoid repeating the caption verbatim unless both carry distinct information.
Use an empty `alt` value for a decorative image. The caption remains associated with the figure through the native `figure` and `figcaption` elements.
## Examples
### Default figure
Display a responsive image with a caption below it.
```twig
```
### Caption alignment
Align the caption with Bootstrap's text utilities through the `captionAlign` prop.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `caption` | `string\|null` | `null` | The optional caption displayed below the figure content. |
| `captionAlign` | `'start'\|'center'\|'end'\|null` | `null` | The horizontal alignment of the caption. |
| Block | Description |
|:------|:------------|
| `content` | The figure content, typically a responsive image. |
# List Group
Display a flexible series of content with active, disabled, actionable, and contextual states.
```twig
The current link itemA second link itemA third link itemA disabled link item
```
## Installation
```shell
php bin/console ux:install list-group --kit bootstrap
```
## Usage
```twig
An itemA second itemA third item
```
## Accessibility
Do not rely on contextual color alone to communicate meaning. Make the meaning explicit in the visible content or provide additional visually hidden text.
Disabled links omit their `href`, expose `aria-disabled="true"`, and are removed from keyboard navigation. Associate every checkbox and radio with a visible label or an `aria-label`.
## Examples
### Basic example
Use a list group to display a simple series of related items.
```twig
An itemA second itemA third itemA fourth itemAnd a fifth one
```
### Active items
Mark the current selection with the active state.
```twig
An active itemA second itemA third itemA fourth itemAnd a fifth one
```
### Links and buttons
Render actionable list items as links or buttons to expose hover, active, and disabled states.
```twig
The current link itemA second link itemA third link itemA fourth link itemA disabled link itemThe current buttonA second button itemA third button itemA fourth button itemA disabled button item
```
### Flush
Remove outer borders and rounded corners for edge-to-edge rendering inside a parent container.
```twig
An itemA second itemA third itemA fourth itemAnd a fifth one
```
### Numbered
Generate item numbers with Bootstrap's CSS counters, including for items with custom content.
```twig
A list itemA list itemA list item
{% for item in 1..3 %}
Subheading
Content for list item
14
{% endfor %}
```
### Horizontal
Display items horizontally at every breakpoint or from a selected responsive breakpoint.
```twig
{% for breakpoint in [true, 'sm', 'md', 'lg', 'xl', 'xxl'] %}
An itemA second itemA third item
{% endfor %}
```
### Variants
Apply contextual colors to non-actionable list items.
```twig
A simple default list group itemA simple primary list group itemA simple secondary list group itemA simple success list group itemA simple danger list group itemA simple warning list group itemA simple info list group itemA simple light list group itemA simple dark list group item
```
### Action variants
Combine contextual colors with actionable links and their hover and active states.
```twig
A simple default list group itemA simple primary list group itemA simple secondary list group itemA simple success list group itemA simple danger list group itemA simple warning list group itemA simple info list group itemA simple light list group itemA simple dark list group item
```
### With badges
Add badges to communicate counts or activity alongside an item label.
```twig
A list item
14
A second list item
2
A third list item
1
```
### Custom content
Compose headings, supporting text, metadata, and other HTML within actionable items.
```twig
List group item heading
3 days ago
Some placeholder content in a paragraph.
And some small print.
{% for item in 1..2 %}
List group item heading
3 days ago
Some placeholder content in a paragraph.
And some muted small print.
{% endfor %}
```
### Checkboxes and radios
Place labeled form controls inside list items, with an optional stretched label for a larger click target.
```twig
```
### JavaScript behavior
Use Bootstrap's tab plugin and data attributes to connect list items with tab panels.
```twig
HomeProfileMessagesSettings
Some placeholder content relating to Home.
Some placeholder content relating to Profile.
Some placeholder content relating to Messages.
Some placeholder content relating to Settings.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'ul'\|'ol'\|'div'\|null` | `null` | The HTML element to render. |
| `flush` | `boolean` | `false` | Whether to remove outer borders and rounded corners. |
| `numbered` | `boolean` | `false` | Whether to display CSS-generated item numbers. |
| `horizontal` | `boolean\|'sm'\|'md'\|'lg'\|'xl'\|'xxl'` | `false` | Whether and when to use a horizontal layout. |
| Block | Description |
|:------|:------------|
| `content` | The list group items. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'li'\|'a'\|'button'\|null` | `null` | The HTML element to render. |
| `href` | `string\|null` | `null` | The destination used for anchor items. |
| `type` | `'button'\|'submit'\|'reset'` | `'button'` | The type used for button items. |
| `active` | `boolean` | `false` | Whether the item represents the current selection. |
| `current` | `boolean\|string\|null` | `null` | Whether and how to expose an active item as current. |
| `disabled` | `boolean` | `false` | Whether the actionable item is disabled. |
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'\|null` | `null` | The Bootstrap contextual color. |
| `label` | `string` | `''` | The fallback label when no content block is provided. |
| Block | Description |
|:------|:------------|
| `content` | The item content. |
# Modal
Add accessible dialog overlays for notifications, forms, and custom content.
```twig
Review changes
Your profile information is ready to be saved.
You can return to editing or confirm these changes now.
```
## Installation
```shell
php bin/console ux:install modal --kit bootstrap
```
## Usage
```twig
Modal titleModal body content goes here.
```
## Accessibility
Include a `Modal:Title` so the root modal's `aria-labelledby` points to a real heading. A modal represents a separate document context, so an `h1` is usually appropriate; use the `tag` prop when the surrounding hierarchy requires another level.
Bootstrap adds the dialog role and manages focus while the modal is open. The HTML `autofocus` attribute does not focus controls inside a modal; listen for `shown.bs.modal` when an initial focus target is required. Do not nest modals, and always provide an explicit dismiss action.
## Examples
### Modal components
Display the complete modal structure statically when composing or reviewing its content.
```twig
Modal title
Modal body text goes here.
```
### Live demo
Open and dismiss a standard animated modal through Bootstrap data attributes.
```twig
Modal title
Woo-hoo, you're reading this text in a modal!
```
### Static backdrop
Prevent backdrop clicks and Escape from dismissing a modal that requires an explicit choice.
```twig
Modal title
I will not close if you click outside of me or press Escape.
```
### Scrolling long content
Let the viewport scroll with a long modal or constrain scrolling to the modal body.
```twig
Long modal
This modal grows with its content, allowing the viewport to scroll.
This content appears at the bottom.
Scrollable modal
Only this modal body scrolls when its content exceeds the available height.
This content appears at the bottom.
```
### Vertically centered
Center the dialog vertically, with or without an independently scrollable body.
```twig
Modal titleThis is a vertically centered modal.Modal title
This modal combines vertical centering with an independently scrollable body.
Just like that.
```
### Tooltips and popovers
Place supplementary Bootstrap overlays inside a modal. Bootstrap dismisses them automatically when the modal closes.
```twig
```
## Accessibility
The component renders a native `nav` landmark. When a page contains multiple navigation landmarks, give each one a distinct accessible name with the `label` prop or an `aria-labelledby` attribute.
Mark the active link with `aria-current="page"`. Every toggler must expose `aria-controls`, `aria-expanded`, and a meaningful accessible label. When external content opens before its toggler in the document, move focus programmatically when needed.
## Examples
### Supported content
Compose branding, navigation, dropdowns, forms, togglers, and collapsing content inside one responsive navbar.
```twig
```
## Installation
```shell
php bin/console ux:install navs-tabs --kit bootstrap
```
## Usage
```twig
ActiveLinkDisabled
Home tab content.
Profile tab content.
Contact tab content.
```
## Accessibility
Use `aria-current="page"` for active navigation links. Dynamic tab interfaces instead need `role="tablist"`, `role="tab"`, `role="tabpanel"`, and the `aria-selected`, `aria-controls`, and `aria-labelledby` relationships shown in the examples.
Prefer buttons for dynamic tabs. Do not put `role="tablist"` directly on a `nav` landmark; place it on a nested `div` instead. Vertical tab lists also need `aria-orientation="vertical"`.
## Examples
### Base nav
Build navigation with list markup or direct links inside a `nav` element.
```twig
ActiveLinkLinkDisabledActiveLinkLinkDisabled
```
### Horizontal alignment
Align navigation items with Bootstrap flexbox utilities through the `align` prop.
```twig
ActiveLinkLinkDisabledActiveLinkLinkDisabled
```
### Vertical
Stack navigation links vertically with list or landmark markup.
```twig
ActiveLinkLinkDisabledActiveLinkLinkDisabled
```
### Tabs
Apply the static tab appearance to navigation links.
```twig
ActiveLinkLinkDisabled
```
### Pills
Render active navigation links with Bootstrap's pill style.
```twig
ActiveLinkLinkDisabled
```
### Underline
Use the underline style introduced in Bootstrap 5.3.
```twig
ActiveLinkLinkDisabled
```
### Fill and justify
Fill the available width proportionally or give every navigation item the same width.
```twig
ActiveMuch longer nav linkLinkDisabledActiveMuch longer nav linkLinkDisabled
```
### Responsive flex
Combine the component with responsive flex utilities for breakpoint-specific layouts.
```twig
ActiveLonger nav linkLinkDisabled
```
### Tabs with dropdowns
Add a Bootstrap dropdown to a static tabs navigation.
```twig
ActiveDropdown
LinkDisabled
```
### JavaScript tabs
Connect tab buttons to focusable content panels with Bootstrap's Tab plugin.
```twig
HomeProfileContactDisabledThis is the Home tab content.This is the Profile tab content.This is the Contact tab content.This tab is disabled.
```
### JavaScript nav
Keep the navigation landmark while placing `role="tablist"` on a nested container.
```twig
This is the Home tab content.This is the Profile tab content.This is the Contact tab content.This tab is disabled.
```
### JavaScript pills
Use the same dynamic tab semantics with Bootstrap's pill appearance.
```twig
HomeProfileContactDisabledThis is the Home pill content.This is the Profile pill content.This is the Contact pill content.This pill is disabled.
```
### Vertical pills
Build a vertical dynamic tab interface and expose its orientation to assistive technologies.
```twig
```
## Installation
```shell
php bin/console ux:install offcanvas --kit bootstrap
```
## Usage
```twig
Navigation
Add navigation links or any other content here.
```
## Accessibility
Every trigger must identify the panel with either `href` or `data-bs-target` and expose the same id through `aria-controls`. The offcanvas root derives its `aria-labelledby` from its `id`, and `Offcanvas:Title` automatically applies the matching id, so the panel is always correctly labelled.
Bootstrap adds the dialog role and manages focus when a non-responsive offcanvas opens. Keep a visible dismiss control in the header, use descriptive trigger text, and verify that responsive panels remain understandable when they become regular page content above their breakpoint.
## Examples
### Offcanvas components
Display the complete panel structure statically while composing its content.
```twig
Offcanvas
Content for the offcanvas goes here. You can place just about any Bootstrap component or custom element here.
```
### Live demo
Open the same panel from either a link or a button.
```twig
```
### Body scrolling
Allow body scrolling without displaying a backdrop.
```twig
Offcanvas with body scrolling
Try scrolling the rest of the page while this offcanvas is open.
```
### Body scrolling and backdrop
Keep the body scrollable while retaining the backdrop.
```twig
Backdrop with scrolling
Try scrolling the rest of the page while this offcanvas is open.
```
### Static backdrop
Require an explicit dismiss action instead of closing on backdrop clicks.
```twig
Offcanvas
I will not close if you click outside of me.
```
### Dark offcanvas
Apply Bootstrap's dark color mode to the panel and its close button.
```twig
Dark offcanvas
Place offcanvas content here.
```
### Responsive
Turn an offcanvas panel into regular content at a selected breakpoint.
```twig
Responsive offcanvas
This is content within an .offcanvas-lg.
```
### Placement
Open panels from any viewport edge.
```twig
{% for placement in ['start', 'end', 'top', 'bottom'] %}
Offcanvas {{ placement }}
Offcanvas content from the {{ placement }} edge.
{% endfor %}
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | The unique identifier targeted by offcanvas controls. |
| `placement` | `'start'\|'end'\|'top'\|'bottom'` | `'start'` | The viewport edge from which the panel appears. |
| `responsive` | `'sm'\|'md'\|'lg'\|'xl'\|'xxl'\|null` | `null` | The breakpoint at which the panel becomes regular content. |
| `backdrop` | `boolean\|'static'` | `true` | Whether clicking the backdrop dismisses the panel. |
| `scroll` | `boolean` | `false` | Whether the page body remains scrollable while the panel is open. |
| `keyboard` | `boolean` | `true` | Whether pressing Escape dismisses the panel. |
| `shown` | `boolean` | `false` | Whether to display the panel statically. |
| `theme` | `'light'\|'dark'\|null` | `null` | The component-specific Bootstrap color mode. |
| Block | Description |
|:------|:------------|
| `content` | The offcanvas structure, typically `Offcanvas:Header` and `Offcanvas:Body`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content of the offcanvas. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `closable` | `boolean` | `true` | Whether to render a dismiss button. |
| `closeLabel` | `string` | - | The accessible label of the dismiss button. |
| Block | Description |
|:------|:------------|
| `content` | The offcanvas heading, typically an `Offcanvas:Title` component. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'h1'\|'h2'\|'h3'\|'h4'\|'h5'\|'h6'` | `'h5'` | The heading element to render. |
| Block | Description |
|:------|:------------|
| `content` | The offcanvas title. |
# Pagination
Indicate that related content is split across multiple pages with accessible pagination links.
```twig
```
## Installation
```shell
php bin/console ux:install pagination --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Give each pagination landmark a descriptive `ariaLabel`, especially when a page contains more than one pagination control.
The active item exposes `aria-current="page"`. Disabled items render as non-interactive `span` elements instead of links.
## Examples
### Overview
Use connected page links to navigate through a series of related pages.
```twig
```
### Working with icons
When replacing previous and next labels with symbols, provide an accessible label and hide the symbol from assistive technologies.
```twig
«»
```
### Active
Mark the page currently being viewed as active. It can remain a link or render as a non-interactive item.
```twig
```
### Disabled
Disable unavailable navigation items without leaving an unusable link in the keyboard tab order.
```twig
```
### Sizing
Use Bootstrap's large and small pagination sizes.
```twig
```
### Alignment
Align the pagination links with Bootstrap flexbox utilities through the `align` prop.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `'sm'\|'lg'\|null` | `null` | The pagination control size. |
| `align` | `'start'\|'center'\|'end'\|null` | `null` | The horizontal alignment of the pagination links. |
| `ariaLabel` | `string` | `'Pagination'` | The accessible name of the navigation landmark. |
| Block | Description |
|:------|:------------|
| `content` | The pagination items, typically `Pagination:Item` components. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `active` | `boolean` | `false` | Whether the item represents the current page. |
| `disabled` | `boolean` | `false` | Whether the item is unavailable for interaction. |
| `href` | `string\|null` | `null` | The destination of the page link. |
| `label` | `string` | `''` | The fallback item label when no content block is provided. |
| `ariaLabel` | `string\|null` | `null` | The accessible label for the page link. |
| Block | Description |
|:------|:------------|
| `content` | The page link content. |
# Placeholder
Uses loading placeholders to indicate that content may still be loading.
```twig
```
## Installation
```shell
php bin/console ux:install placeholder --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Placeholders are decorative and hidden from assistive technologies. Mark the loading region with `aria-busy="true"`, then announce meaningful content changes when loading completes.
The application remains responsible for replacing placeholders and informing users when the updated content is available.
## Examples
Match a placeholder card's proportions to the content it temporarily replaces.
```twig
Card title
Some quick example text to build on the card title and make up the bulk of the card's content.
```
### How it works
Use placeholders as text replacements or modifiers on existing components.
```twig
```
### Width
Set widths with grid columns, width utilities, or inline styles.
```twig
```
### Color
Use the inherited text color or Bootstrap background utilities.
```twig
```
### Sizing
Adjust placeholder height with large, small, and extra-small variants.
```twig
```
### Animation
Use glow or wave animation to reinforce that content is actively loading.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'span'\|'a'\|'div'\|'p'\|'h1'\|'h2'\|'h3'\|'h4'\|'h5'\|'h6'` | `'span'` | The HTML element used for the placeholder. |
| `size` | `'lg'\|'sm'\|'xs'\|null` | `null` | The Bootstrap placeholder size. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `tag` | `'span'\|'a'\|'div'\|'p'\|'h1'\|'h2'\|'h3'\|'h4'\|'h5'\|'h6'` | `'div'` | The HTML element used for the animation wrapper. |
| `animation` | `'glow'\|'wave'` | `'glow'` | The Bootstrap placeholder animation. |
| Block | Description |
|:------|:------------|
| `content` | The placeholders animated by this wrapper. |
# Popover
Display contextual Bootstrap content beside a trigger element.
```twig
```
## Installation
```shell
php bin/console ux:install popover --kit bootstrap
```
## Usage
```twig
```
Bootstrap popovers are opt-in. Initialize them after Bootstrap is loaded:
```js
import { Popover } from 'bootstrap';
document.querySelectorAll('[data-bs-toggle="popover"]').forEach((element) => {
Popover.getOrCreateInstance(element);
});
```
The component follows an as-child pattern: render `popover_trigger_attrs` with Twig's `html_attr()` function on the actual interactive element so Bootstrap receives the data attributes without an extra wrapper.
## Accessibility
Use a button for popovers opened by click. For a dismiss-on-next-click popover, use the `focus` trigger on an element that can receive keyboard focus. Never rely on `hover` alone because keyboard and touch users cannot reliably reach that content.
Keep popovers short and supplementary. Their generated markup is not a modal dialog and does not trap focus. Disabled controls cannot receive focus, so attach the popover to a focusable wrapper and keep the disabled control inside it.
When `html` is enabled, Bootstrap sanitizes allowed markup by default. Do not disable sanitization for untrusted content.
## Examples
### Enable popovers
Initialize every `data-bs-toggle="popover"` trigger before expecting it to open.
```twig
```
### Live demo
Combine a heading and body content in a conventional click-triggered popover.
```twig
```
### Four directions
Prefer top, right, bottom, or left placement while allowing Popper to adjust when space is constrained.
```twig
{% for placement in ['left', 'top', 'bottom', 'right'] %}
{% endfor %}
```
### Custom container
Append the generated popover to a specific container when the surrounding layout requires it.
```twig
```
### Custom popovers
Attach a custom class to the generated popover and customize Bootstrap's CSS variables in your stylesheet.
```twig
```
### Dismiss on next click
Use the `focus` trigger so moving focus away closes the popover.
```twig
```
### Disabled elements
Place a disabled control inside a focusable wrapper that owns the popover attributes.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `title` | `string\|null` | `null` | The optional heading displayed in the popover. |
| `content` | `string` | `''` | The popover body content. |
| `placement` | `'top'\|'right'\|'bottom'\|'left'\|'auto'` | `'right'` | The preferred placement relative to the trigger. |
| `trigger` | `string` | `'click'` | The Bootstrap interaction or space-separated interactions that open and close the popover. |
| `html` | `boolean` | `false` | Whether the popover body may contain sanitized HTML. |
| `container` | `string\|null` | `null` | The optional selector of the element that receives the generated popover. |
| `customClass` | `string\|null` | `null` | The optional class added to the generated popover. |
| Block | Description |
|:------|:------------|
| `content` | The trigger element, which must render `popover_trigger_attrs` with `html_attr()`. |
# Progress
Display task progress with accessible labels, stacked bars, contextual colors, and animation.
```twig
```
## Installation
```shell
php bin/console ux:install progress --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Give every progress indicator a concise accessible name with `ariaLabel`. Keep `value`, `min`, and `max` synchronized with the task's real state.
Do not rely on color alone to communicate status. Long labels can cross both the filled and unfilled backgrounds, so prefer a separate visible label when contrast cannot be guaranteed.
## Examples
### How it works
Set the current value to update both the visual width and the progressbar accessibility attributes.
```twig
{% for value in [0, 25, 50, 75, 100] %}
{% endfor %}
```
### Width
Use Bootstrap width utilities when the visual width should be controlled by a class.
```twig
```
### Height
Set a custom height on the progress container.
```twig
```
### Labels
Display short text inside the bar, with care for overflow and contrast when labels are long.
```twig
```
### Backgrounds
Apply contextual background colors, with matching text-background helpers for labeled bars.
```twig
```
### Striped
Add striped styling to default and contextual progress bars.
```twig
```
### Animated stripes
Animate a striped bar to emphasize an actively changing task.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `number` | `0` | The current progress value. |
| `min` | `number` | `0` | The minimum progress value. |
| `max` | `number` | `100` | The maximum progress value. |
| `ariaLabel` | `string` | `'Progress'` | The accessible name of the progress indicator. |
| `label` | `string` | `''` | The fallback text displayed inside the bar. |
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'\|null` | `null` | The Bootstrap background color. |
| `striped` | `boolean` | `false` | Whether to display striped styling. |
| `animated` | `boolean` | `false` | Whether to animate striped styling. |
| `height` | `string\|null` | `null` | The custom height of the progress container. |
| `barWidth` | `string\|false\|null` | `null` | The CSS width of the visual bar, or false to omit it. |
| `barClass` | `string` | `''` | The additional classes applied to the visual bar. |
| `stacked` | `boolean` | `false` | Whether this progress indicator is a segment within a stacked progress bar. |
| Block | Description |
|:------|:------------|
| `content` | The text or custom content displayed inside the visual bar. |
# Scrollspy
Update Bootstrap navigation links as a scrollable region moves between sections.
```twig
{% for number in 1..3 %}
Section {{ number }}
Scroll this region to update the active navigation item.
The observed content stays inside its own scrollable container.
Scrollspy activates the navigation link for the section currently in view.
Second section
Every link must point to a matching section identifier.
```
The `target` prop must select the navigation element, and every navigation link must point to the ID of a section inside the scrollable component. Bootstrap initializes Scrollspy through its data API.
## Accessibility
The component adds `tabindex="0"` so a scrollable region without focusable children remains keyboard-accessible. Use meaningful link labels, unique section IDs, and a logical heading hierarchy inside the observed content.
An active navigation style is a visual enhancement, not a substitute for headings or document structure. When smooth scrolling is enabled, Bootstrap respects `prefers-reduced-motion` through CSS.
## Examples
### Navbar
Track sections from links inside a Bootstrap navbar.
```twig
{% for id, title in {first: 'First heading', second: 'Second heading', third: 'Third heading'} %}
{{ title }}
Representative content for {{ title|lower }}. Keep scrolling to activate the next link.
{% endfor %}
```
### Nested nav
Activate both parent and nested navigation links for hierarchical content.
```twig
{% for id in ['1', '1-1', '1-2', '2'] %}
Item {{ id }}
Nested navigation activates parent and child links as their sections enter view.
{% endfor %}
```
### List group
Use a list group as the navigation target.
```twig
List group links work as Scrollspy navigation controls.
{% endfor %}
```
### Simple anchors
Track sections with lightweight anchor navigation and optional smooth scrolling.
```twig
FirstSecondThird
{% for id, title in {first: 'First section', second: 'Second section', third: 'Third section'} %}
{{ title }}
Simple links receive the active class when this section becomes current.
{% endfor %}
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `target` | `string` | - | The CSS selector of the navigation element controlled by Scrollspy. |
| `height` | `string` | `'200px'` | The height of the scrollable region. |
| `smoothScroll` | `boolean` | `false` | Whether link activation scrolls smoothly to its target section. |
| `rootMargin` | `string\|null` | `null` | The optional Intersection Observer root margin. |
| `threshold` | `string\|null` | `null` | The optional comma-separated Intersection Observer thresholds. |
| Block | Description |
|:------|:------------|
| `content` | The sections observed by Scrollspy. |
# Spinner
Indicate the loading state of a component or page with Bootstrap spinners.
```twig
```
## Installation
```shell
php bin/console ux:install spinner --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Standalone spinners use `role="status"` and include a visually hidden loading message. Customize `label` so the announced status describes what is loading.
When visible text already announces the status, set `decorative` to hide the spinner itself from assistive technologies.
## Examples
### Border spinner
Use the border animation for a lightweight loading indicator.
```twig
```
### Colors
The spinner inherits `currentColor`; use Bootstrap contextual text colors to customize it.
```twig
```
### Growing spinner
Switch to the growing animation while keeping the same contextual color options.
```twig
```
### Margin
Use Bootstrap spacing utilities to add space around a spinner.
```twig
```
### Flex placement
Use flexbox utilities to center a spinner or place it after a visible loading status.
```twig
Loading...
```
### Floats
Use float utilities when a spinner needs to follow the edge of its container.
```twig
```
### Text align
Because the component is inline-flex, text alignment utilities can position it within a block.
```twig
```
### Size
Use the compact Bootstrap size or set custom dimensions with CSS.
```twig
```
### Buttons
Place a decorative spinner inside a disabled button and provide the loading status as button text or visually hidden text.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `type` | `'border'\|'grow'` | `'border'` | The spinner animation style. |
| `color` | `'primary'\|'secondary'\|'success'\|'danger'\|'warning'\|'info'\|'light'\|'dark'\|null` | `null` | The Bootstrap contextual text color. |
| `small` | `boolean` | `false` | Whether to use Bootstrap's compact spinner size. |
| `role` | `string\|null` | `'status'` | The ARIA role used for an announced loading status. |
| `label` | `string` | `'Loading...'` | The visually hidden loading message. |
| `decorative` | `boolean` | `false` | Whether to hide the spinner from assistive technologies. |
| Block | Description |
|:------|:------------|
| `content` | The accessible loading message or custom inner content. |
# Toast
Show lightweight Bootstrap notifications with optional headers and dismissal controls.
```twig
Bootstrap
Hello, world! This is a toast message.
```
## Installation
```shell
php bin/console ux:install toast --kit bootstrap
```
## Usage
```twig
Your changes have been saved.
```
Bootstrap toasts are opt-in. Create an instance before showing a hidden toast:
```js
import { Toast } from 'bootstrap';
const trigger = document.querySelector('#live-toast-trigger');
const element = document.querySelector('#live-toast');
const toast = Toast.getOrCreateInstance(element);
trigger.addEventListener('click', () => toast.show());
```
A toast rendered with `show` is immediately visible and does not need JavaScript until it must hide, dismiss, or be shown again.
## Accessibility
Keep the live region in the DOM before injecting or updating a toast. Use the defaults `role="status"` and `live="polite"` for ordinary notifications; reserve `role="alert"` and `live="assertive"` for urgent interruptions.
Choose a delay long enough to read the message. Set `autohide` to `false` when a toast contains interactive controls and always provide an explicit close action in that case. Avoid placing important actions inside an autohiding toast because focus may be lost when it disappears.
## Examples
### Basic
Compose a standard toast from a header and body.
```twig
Bootstrap
Hello, world! This is a toast message.
```
### Live example
Start hidden and show the toast from application JavaScript.
```twig
See? Just like this.
```
### Translucent
Place the default translucent toast over colored content.
```twig
Toasts are slightly translucent to blend with what is behind them.
First toast in the stack.
Second toast, automatically spaced by the container.
```
### Custom content
Omit the header and compose body content, actions, and dismissal controls directly.
```twig
Hello, world! This is a toast message.
Hello, world! This is a toast message.
```
### Color schemes
Combine contextual background and foreground utilities for stronger visual emphasis.
```twig
{% for color in ['primary', 'success', 'danger'] %}
A {{ color }} toast with matching contextual color.
{% endfor %}
```
### Placement
Position a toast container with Bootstrap's positioning utilities.
```twig
Position the container with Bootstrap utilities.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `show` | `boolean` | `true` | Whether the toast is visible on initial render. |
| `autohide` | `boolean` | `true` | Whether Bootstrap hides the toast automatically. |
| `delay` | `int\|null` | `null` | The delay in milliseconds before an autohiding toast closes. |
| `animation` | `boolean` | `true` | Whether Bootstrap animates the toast. |
| `role` | `'status'\|'alert'` | `'status'` | The accessibility role that describes the notification urgency. |
| `live` | `'polite'\|'assertive'` | `'polite'` | The live region politeness level. |
| Block | Description |
|:------|:------------|
| `content` | The toast structure, typically `Toast:Header` and `Toast:Body`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The notification message and optional actions. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `title` | `string` | `''` | The notification title. |
| `timestamp` | `string\|null` | `null` | The optional relative or absolute notification time. |
| `imageSrc` | `string\|null` | `null` | The optional image displayed before the title. |
| `imageAlt` | `string` | `''` | The alternative text for the header image. |
| `closeButton` | `boolean` | `true` | Whether to render a Bootstrap dismiss button. |
| `closeLabel` | `string` | `'Close'` | The accessible label of the dismiss button. |
| Block | Description |
|:------|:------------|
| `content` | The header title or custom header content. |
# Tooltip
Add Bootstrap tooltips to focusable controls with configurable content and placement.
```twig
```
## Installation
```shell
php bin/console ux:install tooltip --kit bootstrap
```
## Usage
```twig
```
## Accessibility
Apply `tooltip_trigger_attrs` to a natively focusable, interactive element such as a button or link so the tooltip works with both pointer and keyboard input. Do not configure hover as the only trigger.
Disabled controls cannot receive focus or pointer events. Put the tooltip attributes on a focusable wrapper as shown below. Bootstrap sanitizes HTML tooltip content by default, but plain text remains preferable for user-provided content.
## Examples
### Enable tooltips
Bootstrap tooltips are opt-in and must be initialized explicitly after Bootstrap's JavaScript is loaded.
```twig
```
### Tooltips on links
Apply the trigger attributes directly to inline links so they remain keyboard accessible.
```twig
Placeholder text to demonstrate
inline links
with tooltips. Content placed here mimics how
real text
flows around them. You can use
these tooltips on links
in your own interface.
```
### Custom tooltips
Use a custom class and Bootstrap CSS variables to change a generated tooltip's appearance.
```twig
```
### Directions
Choose a preferred placement or enable Bootstrap's sanitized HTML content.
```twig
```
### Disabled elements
Put the trigger on a focusable wrapper when the described control is disabled.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `title` | `string` | - | The tooltip content stored by Bootstrap. |
| `placement` | `'auto'\|'top'\|'right'\|'bottom'\|'left'` | `'top'` | The preferred tooltip placement. |
| `html` | `boolean` | `false` | Whether the tooltip title contains sanitized HTML. |
| `customClass` | `string\|null` | `null` | The custom class applied to the generated tooltip. |
| Block | Description |
|:------|:------------|
| `content` | The focusable trigger rendering `tooltip_trigger_attrs` with `html_attr()`. |
# Clipboard
A Stimulus behavior that copies text to the clipboard — either a value you give it or the content of an element — with optional copied feedback.
```twig
composer require symfony/ux-toolkitCopied!
```
## Installation
```shell
php bin/console ux:install clipboard --kit common
```
## Usage
Add `data-controller="clipboard"`, mark the element to copy from with a `source` target, then trigger `clipboard#copy` from a button:
```twig
Text to copy
```
To copy a fixed string instead of an element, set a `source` value (`data-clipboard-source-value`) — see [Copy using a Value](#content-copy-using-a-value).
> [!NOTE]
> Every successful copy also dispatches a `clipboard:copied` event, with the copied text available as `event.detail.text`. Listen for it to drive your own feedback.
## Examples
### Copy a Form Element's Value
Form controls — inputs, textareas, selects — are copied from their `value`:
```twig
```
### Copy an Element's Text
For non-form elements, the `source` target's text content is copied:
```twig
The quick brown fox jumps over the lazy dog.
```
### Copy Code
A classic: a code block with its own copy button. Point the `source` target at the `
` — its text content is copied verbatim, indentation and newlines included:
```twig
$response = new JsonResponse([
'status' => 'ok',
]);
```
### Copy using a Value
Set a `source` value to copy a fixed string, independent of what's shown on screen. Here the field displays a masked key while the button copies the real one:
```twig
```
### Copied Feedback
Add a `success` target to reveal a confirmation after a successful copy. It's hidden again after `successDuration` milliseconds (defaults to `2000`):
```twig
symfony serve -dCopied to clipboard!
```
### Swap the Button Label
Put both an `idle` and a `success` label inside the button: the `idle` one is hidden while the `success` one shows, swapping "Copy" for "Copied!" on click.
```twig
git clone git@github.com:symfony/ux.git
```
### Animate the Feedback
The `success` target is toggled from `display: none` to visible on copy, and showing a hidden element restarts its CSS animations — so an animated `success` target replays its effect on every click. Give it a burst `@keyframes` and match `successDuration` to the animation's length:
```twig
php bin/console cache:clear
```
### Feedback via a CSS Class
Prefer to drive feedback purely from CSS? Instead of `success`/`idle` targets, set a `success` class with `data-clipboard-success-class`. The controller adds it to its element for `successDuration`, so you can restyle anything beneath it — including the trigger itself:
> [!TIP]
> Pass multiple space-separated classes if you like (`data-clipboard-success-class="ring pulse"`) — they're all applied for the duration.
```twig
php bin/console about
```
### Feedback with a Tooltip
Pair with the [`tooltip`](../tooltip) recipe for a floating confirmation. With both controllers on the button, copying dispatches `clipboard:copied` right there, opening a manual, self-hiding tooltip above it — no `success` target or class needed:
```twig
php bin/console debug:router
```
## API Reference
### `data-controller="clipboard"`
| Value | Type | Default | Description |
|:------|:-----|:--------|:------------|
| `data-clipboard-source-value` | `String` | - | Text to copy to the clipboard; when set, it takes precedence over the `source` target. |
| `data-clipboard-success-duration-value` | `Number` | `2000` | How long, in milliseconds, the success feedback stays active after a copy. Defaults to 2000. |
| Target | Description |
|:-------|:------------|
| `source` | Element to copy from when no `source` value is set: its form value (input, textarea, select) or, failing that, its text content. |
| `success` | Element revealed briefly after a successful copy, then hidden again. Hidden on connect. |
| `idle` | Element hidden while the `success` target is showing, then revealed again; pair it with `success` inside the button to swap the label. |
| Class | Description |
|:------|:------------|
| `data-clipboard-success-class` | Class(es) added to the controller element for the same window, as a CSS-only alternative to the `success`/`idle` targets. |
| Action | Description |
|:-------|:------------|
| `copy` | Copies the source to the clipboard, then dispatches a `clipboard:copied` event and flashes the success feedback. |
# Closeable
A Stimulus behavior that removes its element from the page when dismissed, with optional delayed and automatic closing and an animated countdown bar.
```twig
Heads up!
This message can be dismissed.
```
## Installation
```shell
php bin/console ux:install closeable --kit common
```
## Usage
Add `data-controller="closeable"` to the element you want to remove, then trigger `closeable#close` from a child element:
```twig
```
## Examples
### Delayed Close
Set a `data-closeable-delay-param` (in milliseconds) on the close action to defer the removal. Add a `timerbar` target to visualize the countdown.
```twig
Saved!
Dismiss to close after a short delay.
```
### Auto Close
Set `data-closeable-auto-close-value` (in milliseconds) to remove the element automatically once it connects. The `timerbar` target animates down over the same duration.
```twig
Copied to clipboard
This message closes on its own.
```
### Cancel Auto Close
Call `closeable#cancel` to stop a pending close. Here, hovering the message cancels the automatic close so the user has time to read it.
```twig
Hover to keep me
Move your pointer over this message to cancel the automatic close.
```
## API Reference
### `data-controller="closeable"`
| Value | Type | Default | Description |
|:------|:-----|:--------|:------------|
| `data-closeable-auto-close-value` | `Number` | - | Delay in milliseconds after which the element removes itself once connected. |
| Target | Description |
|:-------|:------------|
| `timerbar` | Element whose width animates down to 0 over the close delay to visualize the countdown. It is hidden until a delayed or automatic close starts. |
| Action | Description |
|:-------|:------------|
| `close` | Removes the element. Accepts a `data-closeable-delay-param` (milliseconds) to defer the removal. |
| `cancel` | Cancels a pending delayed or automatic close. |
# Logout Link
A link that logs the current user out through a secure POST form.
```twig
Logout
```
## Installation
```shell
php bin/console ux:install logout-link --kit common
```
## Usage
```twig
Logout
```
> [!WARNING]
> `LogoutLink` logs the user out through a **POST** request protected by a CSRF token (token id `logout`). For it to work, your firewall's logout must **require `POST`** and have **CSRF protection enabled** — otherwise logging out will be rejected.
Restrict the logout route to `POST` so it can't be triggered by a plain link or prefetch:
```php
#[Route('/logout', name: 'app_logout', methods: ['POST'])]
public function logout(): never
{
throw new \LogicException('This method is intercepted by the logout key on your firewall.');
}
```
Point the firewall's logout at that route (`app_logout`) and enable CSRF protection (this validates the `logout` token the component sends):
```yaml
# config/packages/security.yaml
security:
firewalls:
main:
logout:
path: app_logout
enable_csrf: true
```
## Examples
### Specific Firewall
Set the `firewall` prop to log out from a specific firewall instead of the current one.
```twig
Logout from the main firewall
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `firewall` | `string\|null` | `null` | The firewall name to log out from; when null, the current firewall is used. |
| Block | Description |
|:------|:------------|
| `content` | The link label. |
# Post Link
A link submitted as a form, with optional HTTP method spoofing, CSRF protection, and a confirmation prompt.
```twig
Subscribe
```
## Installation
```shell
php bin/console ux:install post-link --kit common
```
## Usage
```twig
Publish
```
## Examples
### Custom Method
Set the `method` prop to submit the form with a spoofed HTTP method. A hidden `_method` field is added so Symfony can route the request to the matching controller.
> [!WARNING]
> Method spoofing only works when HTTP method override is enabled in your Symfony app. Set `framework.http_method_override: true` in `config/packages/framework.yaml`.
```twig
Delete post
```
### With Confirmation
Pass a `confirm` message to prompt the user with a native confirmation dialog before the form is submitted.
```twig
Delete post
```
### With CSRF Protection
Set `csrfTokenId` to add a hidden CSRF token field, protecting the form against cross-site request forgery.
```twig
Delete post
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `href` | `string` | - | The URL the form submits to. |
| `csrfTokenId` | `string\|null` | `null` | The CSRF token ID used to generate the hidden token field; when null, no token is added. |
| `method` | `string` | `'POST'` | The HTTP method used to submit the form; when not `POST`, a hidden `_method` field is added for method spoofing. |
| `confirm` | `string\|null` | `null` | A confirmation message shown before submitting; when null, no confirmation is required. |
| Block | Description |
|:------|:------------|
| `content` | The button label. |
# Tooltip
A Stimulus behavior that shows a tooltip from a `content` value — or straight from an element's native `title`. Powered by [Floating UI](https://floating-ui.com/): the tooltip is rendered outside the trigger (appended to ``), so it's never clipped by an `overflow` ancestor, and it flips and shifts to stay in view. Put it right on the trigger — it opens on hover and keyboard focus by default — and style the injected `.tooltip` once, globally.
```twig
```
## Installation
```shell
php bin/console ux:install tooltip --kit common
```
## Usage
Style every tooltip once, in your global stylesheet — Floating UI sets the position and the arrow's offsets, so you only own the look:
```css
.tooltip {
position: absolute;
top: 0;
left: 0;
width: max-content;
border-radius: 0.25rem;
background: #1f2937;
color: #fff;
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
pointer-events: none;
z-index: 50;
}
.tooltip-arrow {
position: absolute;
width: 8px;
height: 8px;
background: inherit;
transform: rotate(45deg);
}
```
Then put the controller on the trigger with a `content` value — hover and focus are wired for you:
```twig
```
Set `placement` to hint a side (`top` by default, `bottom`, `left`, or `right`) — Floating UI flips and shifts from there to keep it on screen. Set `trigger` to `click` to toggle on click, or `manual` to drive `show`/`hide` yourself (for example from another controller's event). The controller injects the `.tooltip` into `` and points the trigger's `aria-describedby` at it.
As a shortcut — the form shown at the top — drop the controller onto an element that already has a `title` and skip the `content` value: the controller adopts the title text and removes the attribute so the browser's native tooltip is suppressed.
## Examples
### Placement
Set `placement` to `top` (default), `bottom`, `left`, or `right`. It's a _preference_ — Floating UI flips to the opposite side and shifts along the axis whenever the trigger is too close to an edge:
```twig
```
### Click to Toggle
Set `trigger` to `click` for a tooltip that stays open until the next click:
```twig
```
### Auto-hide
Set `autoHide` (milliseconds) so a shown tooltip dismisses itself — handy when it's opened programmatically rather than by a hover you can leave:
```twig
```
### Manual Control
With `trigger` set to `manual`, nothing is wired automatically — you drive `show`, `hide`, and `toggle` yourself, from your own actions or another controller's event. The tooltip anchors to the controller's element:
```twig
```
## API Reference
### `data-controller="tooltip"`
| Value | Type | Default | Description |
|:------|:-----|:--------|:------------|
| `data-tooltip-content-value` | `String` | - | The text shown inside the tooltip; falls back to the element's `title` when omitted. Any `title` is removed regardless, so the browser's native tooltip never competes with this one. |
| `data-tooltip-placement-value` | `String` | `'top'` | Preferred side of the trigger: `top` (default), `bottom`, `left` or `right`. Flips and shifts to stay in view. |
| `data-tooltip-trigger-value` | `String` | `'hover'` | How the tooltip opens: `hover` (on hover and keyboard focus, the default), `click` (toggle on click), or `manual` (you drive `show`/`hide` yourself). Defaults to `hover`. |
| `data-tooltip-auto-hide-value` | `Number` | - | Delay in milliseconds after which a shown tooltip hides itself; when 0, it stays until `hide`. Defaults to 0. |
| Action | Description |
|:-------|:------------|
| `show` | Shows the tooltip, scheduling an automatic hide when `autoHide` is set. |
| `hide` | Hides the tooltip. |
| `toggle` | Shows the tooltip when hidden, hides it when shown. |
# Alert
The alert component can be used to provide information to your users such as success or error messages, but also highlighted information complementing the normal flow of paragraphs and headers on a page.
```twig
Info alert! Change a few things up and try submitting again.
Danger alert! Change a few things up and try submitting again.
Success alert! Change a few things up and try submitting again.
Warning alert! Change a few things up and try submitting again.
Dark alert! Change a few things up and try submitting again.
```
## Installation
```shell
php bin/console ux:install alert --kit flowbite-4
```
## Usage
```twig
Info alert!
You can add components to your app using the cli.
Enable
```
## Examples
### Alerts with icon
You can also include a descriptive icon to complement the message inside the alert component with the following example.
```twig
Info alert! Change a few things up and try submitting again.
Danger alert! Change a few things up and try submitting again.
Success alert! Change a few things up and try submitting again.
Warning alert! Change a few things up and try submitting again.
Dark alert! Change a few things up and try submitting again.
```
### Borders
Use this example to add a border accent to the alert component instead of just a plain background.
```twig
Info alert! Change a few things up and try submitting again.
Danger alert! Change a few things up and try submitting again.
Success alert! Change a few things up and try submitting again.
Warning alert! Change a few things up and try submitting again.
Dark alert! Change a few things up and try submitting again.
```
### With List
Use this example to show a list and a description inside an alert component.
```twig
Ensure that these requirements are met:
At least 10 characters (and up to 100 characters)
At least one lowercase character
Inclusion of at least one special character, e.g., ! @ # ?
```
### Dismissing
**Requires Flowbite JS**
Use the following alert elements that are also dismissible.
```twig
A simple info alert with an example link. Give it a click if you like.
A simple danger alert with an example link. Give it a click if you like.
A simple success alert with an example link. Give it a click if you like.
A simple warning alert with an example link. Give it a click if you like.
A simple dark alert with an example link. Give it a click if you like.
```
### Action
Use `Alert:Action` to add a button or other action element to the alert.
```twig
This is an info alert
More info about this info alert goes here. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.
View more
```
### Border Accent
Use this example to add a border accent on top of the alert component for further visual distinction.
```twig
Info alert! Change a few things up and try submitting again.
Danger alert! Change a few things up and try submitting again.
Success alert! Change a few things up and try submitting again.
Warning alert! Change a few things up and try submitting again.
Dark alert! Change a few things up and try submitting again.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'brand'\|'danger'\|'success'\|'warning'\|'dark'` | `'brand'` | The visual style variant. |
| `border` | `'none'\|'bordered'\|'accent'` | `'none'` | The visual border style. |
| `dismissible` | `boolean` | `false` | Whether the alert can be dismissible. |
| Block | Description |
|:------|:------------|
| `content` | The alert content, typically includes `Alert:Title` and `Alert:Description`. |
| `icon` | The alert icon, typically includes `twig:ux:icon`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The action element, typically a button or link. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text of the alert. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the alert. |
# Avatar
Use the avatar component to show a visual representation of a user profile using an image element or SVG object based on multiple styles and sizes
```twig
JLJL
```
## Installation
```shell
php bin/console ux:install avatar --kit flowbite-4
```
## Usage
```twig
JL
```
## Examples
### Bordered
Apply a border around the avatar component you can use the `ring-{color}` class from Tailwind CSS.
```twig
JLJL
```
### Placeholder
This example can be used to show an icon placeholder or the initials of the user’s first and last name as a placeholder when no profile picture is available.
```twig
JLJL
```
### Dot indicator
Use the `Indicator` component relative to the avatar component as an indicator for the user (eg. online or offline status).
```twig
JL
JL
JL
JL
```
### Stacked
Use `Avatar:Group` if you want to stack a group of users by overlapping the avatar components.
```twig
JLBGTLRLJLBGTL+99
```
### Avatar with text
This example can be used if you want to show additional information in the form of text elements such as the user’s name and join date
```twig
JL
Jese Leos
Joined in August 2014
```
### User dropdown
Use this example if you want to show a dropdown menu when clicking on the avatar component.
```twig
JL
Bonnie Green
name@flowbite.com
DashboardSettingsEarningsSign out
```
### Sizes
Use the `size` prop to change the avatar dimensions.
```twig
JLJLJLJLJLJL
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `'xs'\|'sm'\|'md'\|'lg'\|'xl'\|'2xl'` | `'md'` | The avatar size. |
| `shape` | `'circle'\|'rounded'` | `'circle'` | The avatar shape. |
| `border` | `'none'\|'bordered'` | `'none'` | Whether to show a ring border. |
| Block | Description |
|:------|:------------|
| `content` | The avatar content, typically `Avatar:Image` and `Avatar:Fallback`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The fallback content displayed when no image is available, typically initials or a placeholder icon. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The grouped avatars, typically multiple `Avatar` components. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `as` | `string` | `'div'` | The avatar group tag. |
| Block | Description |
|:------|:------------|
| `content` | The count indicator, e.g. "+99". |
# Badge
The badge component can be used to complement other elements such as buttons or text elements as a label or to show the count of a given data, such as the number of comments for an article or how much time has passed by since a comment has been made.
```twig
BrandAlternativeGrayDangerSuccessWarning
```
## Installation
```shell
php bin/console ux:install badge --kit flowbite-4
```
## Usage
```twig
Badge
```
## Examples
### Bordered badges
This example can be used to add a border accent to the badge component.
```twig
BrandAlternativeGrayDangerSuccessWarning
```
### Large badges
```twig
BrandAlternativeGrayDangerSuccessWarning
```
### Pill badges
Use this example to make the corners even more rounded like pills for the badge component.
```twig
BrandAlternativeGrayDangerSuccessWarning
```
### Badges as link
You can also use badges as anchor elements to link to another page.
```twig
BrandAlternativeGrayDangerSuccessWarning
```
### Badges with icon
You can also use [SVG icons](https://ux.symfony.com/icons) inside the badge elements.
```twig
2 min ago 2 min ago 2 min ago 2 min ago 2 min ago 2 min ago
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'brand'\|'alternative'\|'gray'\|'danger'\|'success'\|'warning'` | `'brand'` | The visual style variant. |
| `size` | `'default'\|'lg'` | `'default'` | The badge size. |
| `shape` | `'rounded'\|'pill'` | `'rounded'` | The badge shape. |
| `border` | `'none'\|'bordered'` | `'none'` | The badge border. |
| `as` | `'div'` | `'div'` | The HTML tag to render. |
| Block | Description |
|:------|:------------|
| `content` | The badge label or content. |
# Button Group
The button group component from Flowbite can be used to stack together multiple buttons and links inside a single element.
```twig
ProfileSettingsMessages
```
## Installation
```shell
php bin/console ux:install button-group --kit flowbite-4
```
## Usage
```twig
OneTwo
```
## Accessibility
- The `ButtonGroup` component has the `role` attribute set to `group`.
- Use `Tab` to navigate between the buttons in the group.
## Examples
### Orientation
```twig
ProfileSettingsMessages
```
### Size
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | The layout direction of the button group. |
| Block | Description |
|:------|:------------|
| `content` | The grouped buttons and/or separators. |
# Button
Use the button component inside forms, as links, social login, payment options with support for multiple styles, colors, sizes, gradients, and shadows
```twig
```
## Installation
```shell
php bin/console ux:install button --kit flowbite-4
```
## Usage
```twig
Button
```
## Examples
### Button pills
The button pills can be used as an alternative style by using fully rounded edges.
```twig
```
### Outline buttons
Use the following button styles to show the colors only for the border of the element.
```twig
OutlineBrandSuccessDangerWarning
```
### Button sizes
Use these examples if you want to use smaller or larger buttons.
```twig
Extra smallSmallBaseLargeExtra large
```
### Button with icon
Use the following examples to add a [SVG icons](https://ux.symfony.com/icons) inside the button either on the left or right side.
```twig
Buy now
Choose plan
```
### Icon buttons
Sometimes you need a button to indicate an action using only an icon.
```twig
```
### Loader button
Use the following [spinner components](https://ux.symfony.com/toolkit/kits/flowbite-4/components/spinner) from Flowbite to indicate a loader animation inside buttons:
```twig
Loading...
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'brand'\|'secondary'\|'tertiary'\|'success'\|'danger'\|'warning'\|'dark'\|'ghost'\|'outline'\|'outline-brand'\|'outline-success'\|'outline-danger'\|'outline-warning'` | `'brand'` | The visual style variant. |
| `size` | `'default'\|'xs'\|'sm'\|'lg'\|'xl'\|'icon'\|'icon-xs'\|'icon-sm'` | `'default'` | The button size. |
| `shape` | `'rounded'\|'pill'` | `'rounded'` | The badge shape. |
| `as` | `'button'` | `'button'` | The HTML tag to render. |
| Block | Description |
|:------|:------------|
| `content` | The button label and/or icon. |
# Card
Use these responsive card components to show data entries and information to your users in multiple forms and contexts such as for your blog, application, user profiles, and more.
```twig
Noteworthy technology acquisitions 2021
Here are the biggest technology acquisitions of 2025 so far, in reverse chronological order.
```
## Examples
### Card with button
Use the following example of a card element if you also want to have an action button.
```twig
Noteworthy technology acquisitions 2021
Here are the biggest technology acquisitions of 2025 so far, in reverse chronological order.
Read more
```
### Card with image
Use this alternative styled card with an image for features, blog posts, and more.
```twig
Trending
Streamlining your design process today.
In today’s fast-paced digital landscape, fostering seamless collaboration among Developers and IT Operations.
Read more
```
### Card with form inputs
Use this card example where you can add form input elements that can be used for authentication actions or any other context where you need to receive information from your users.
```twig
Sign in to our platform
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The card content, typically includes `Card:Content` with `Card:Header`, and/or `Card:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content area of the card. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer area, typically contains actions or additional information. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains `Card:Title`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `as` | `string` | `'span'` | The HTML tag used to render the title. |
| Block | Description |
|:------|:------------|
| `content` | The title text of the card. |
# Checkbox
The checkbox component can be used to receive one or more selected options from the user in the form of a square box available in multiple styles, sizes, colors, and variants coded with the utility classes from Tailwind CSS and with support for dark mode.
```twig
Default checkbox
Checked state
```
## Installation
```shell
php bin/console ux:install checkbox --kit flowbite-4
```
## Usage
```twig
```
## Examples
### Disabled
This example can be used for the disabled state of the checkbox component by applying the disabled attribute to the input element.
```twig
Default checkbox
Checked state
```
### Bordered
This example can be used to create a checkbox component with a bordered style, a description text and an icon.
```twig
16GB unified memory
Seamlessly handle multitasking, large apps.
1TB SSD storage
Get ultra-fast storage with 1TB of SSD space
```
## API Reference
# Dropdown
The dropdown component can be used to show a list of menu items when clicking on an element such as a button and hiding it when focusing outside of the triggering element.
```twig
Dropdown button
DashboardSettingsEarningsSign out
```
## Installation
```shell
php bin/console ux:install dropdown --kit flowbite-4
```
## Usage
```twig
Dropdown
Bonnie Greenname@flowbite.comLink itemButton item
Sub menu
Sub itemSub item
```
## Examples
### Dropdown hover
Use the `̀triggerType="{hover|click}"` prop options to set whether the dropdown should be shown when hovering or clicking on the trigger element (ie. button).
There’s a 300ms default delay when showing or hiding the dropdown due to UI/UX reasons and how it may affect the interaction with other components on the page. Generally, we recommend using the `click` method.
```twig
Dropdown button
DashboardSettingsEarningsSign out
```
#### Delay duration
You can use the `delay={milliseconds}` prop options to set the delay on when to show or hide the dropdown menu when using hover. You may want to use this depending on how the users interact with your interface.
In this example we add 500 milliseconds instead of the default 300.
```twig
Dropdown button
DashboardSettingsEarningsSign out
```
### Dropdown divider
You can use multiple `Dropdown:Group`, the `Dropdown:Content` add a divider between the groups.
```twig
Dropdown button
DashboardSettingsEarningsSign outSeparated link
```
### With header
Use this example to show extra information outside of the list of menu items inside the dropdown.
```twig
Dropdown button
BG
Bonnie Green
name@flowbite.com
PRO
Dashboard
Settings
Privacy
Sign out
```
### Multi-level dropdown
Use this example to enable multi-level dropdown menus by adding stacked elements inside of each other.
```twig
Dropdown button
Dashboard
Settings
Submenu itemSubmenu itemEarningsSign out
```
### With icon
Use the menu icon trigger element on components such as cards as an alternative element to the button.
```twig
Dashboard
Settings
Earnings
Sign out
Dashboard
Settings
Earnings
Sign out
```
### Placement
You can also use the `placement={top|right|bottom|left}` prop options to choose the placement of the dropdown menu.
By default the positioning is set to the bottom side of the button.
```twig
Dropdown top
DashboardSettingsEarnings
Dropdown right
DashboardSettingsEarnings
Dropdown bottom
DashboardSettingsEarnings
Dropdown left
DashboardSettingsEarnings
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier for generating internal IDs. |
| `open` | `boolean` | `false` | Whether the dropdown is open on initial render. |
| `placement` | `'bottom'\|'top'\|'left'\|'right'\|'left-start'\|'left-end'\|'right-start'\|'right-end'\|'bottom-start'\|'bottom-end'\|'top-start'\|'top-end'` | `'bottom'` | The dropdown placement relative to the trigger. |
| `triggerType` | `'click'\|'hover'` | `'click'` | The dropdown trigger type. |
| `delay` | `int` | `300` | The dropdown delay. |
| `offsetDistance` | `int` | `10` | The dropdown content offset. |
| Block | Description |
|:------|:------------|
| `content` | The dropdown structure (Dropdown:Trigger and Dropdown:Content). |
### ``
| Block | Description |
|:------|:------------|
| `content` | The dropdown menu content, typically includes `Dropdown:Group`, `Dropdown:Header`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The list of `Dropdown:Item` elements. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header content (e.g., user name, email). |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `as` | `string` | `'a'` | The item tag. |
| Block | Description |
|:------|:------------|
| `content` | The item label. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier for generating internal IDs. |
| `placement` | `'bottom'\|'top'\|'left'\|'right'\|'left-start'\|'left-end'\|'right-start'\|'right-end'\|'bottom-start'\|'bottom-end'\|'top-start'\|'top-end'` | `'right-start'` | The dropdown placement relative to the trigger. |
| `triggerType` | `'click'\|'hover'` | `'click'` | The dropdown trigger type. |
| `delay` | `int` | `300` | The dropdown delay. |
| `offsetDistance` | `int` | `10` | The dropdown content offset. |
| Block | Description |
|:------|:------------|
| `content` | The dropdown structure (Dropdown:SubTrigger and Dropdown:Content). |
### ``
| Block | Description |
|:------|:------------|
| `content` | The trigger label that toggles the sub dropdown when clicked. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The trigger element (e.g., a `Button`) that toggles the dropdown when clicked. |
# Indicator
Use the indicator component to show a number count, account status, or as a loading label positioned relative to the parent component coded with Tailwind CSS
```twig
```
## Installation
```shell
php bin/console ux:install indicator --kit flowbite-4
```
## Usage
```twig
Value
```
## Examples
### Count indicator
This example can be used to show a number count inside the indicator and position it relative to a button component.
```twig
Notifications
Messages
8
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'brand'\|'gray'\|'danger'\|'success'\|'warning'` | `'brand'` | The visual style variant. |
| `size` | `'default'\|'lg'` | `'default'` | The badge size. |
| Block | Description |
|:------|:------------|
| `content` | The value. |
# Input
The input field is an important part of the form element that can be used to create interactive controls to accept data from the user based on multiple input types, such as text, email, number, password, URL, phone number, and more.
```twig
```
## Installation
```shell
php bin/console ux:install input --kit flowbite-4
```
## Usage
```twig
```
## Examples
### Disabled
Get started with this example if you want to apply the disabled state to an input field.
```twig
```
### Invalid
Use the following example to apply validation styles for error messages.
```twig
Your name
Oh, snapp! Some error message.
```
### File
Get started with a simple file input component to let users upload one single file.
```twig
Picture
```
### With Button
```twig
Search
```
## API Reference
# Kbd
The KBD (Keyboard) component can be used to indicate a textual user input from the keyboard inside other elements such as in text, tables, cards, and more.
```twig
ShiftCtrlTabCaps LockEscSpacebarEnter
```
## Installation
```shell
php bin/console ux:install kbd --kit flowbite-4
```
## Usage
```twig
Ctrl
```
## Examples
### Arrow keys
Use this example to show arrow keys inside the KBD styled element.
```twig
Arrow key upArrow key downArrow key leftArrow key right
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The keyboard key text (e.g., "Ctrl", "⌘", "Enter"). |
# Label
A text element that identifies form controls and other content.
```twig
Company
```
## Installation
```shell
php bin/console ux:install label --kit flowbite-4
```
## Usage
```twig
Your email address
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'invalid'` | `'default'` | The visual style variant. |
| Block | Description |
|:------|:------------|
| `content` | The label text for a form control. |
# Modal
Use the modal component to show interactive dialogs and notifications to your website users available in multiple sizes, colors, and styles
```twig
Open ModalEdit profile
With less than a month to go before the European Union enacts new consumer privacy laws for its citizens, companies around the world are updating their terms of service agreements to comply.
The European Union’s General Data Protection Regulation (G.D.P.R.) goes into effect on May 25 and is meant to ensure a common set of data rights in the European Union. It requires organizations to notify users as soon as possible of high-risk data breaches that could personally affect them.
I acceptDecline
```
## Installation
```shell
php bin/console ux:install modal --kit flowbite-4
```
## Usage
```twig
OpenAre you absolutely sure?
```
## Examples
### Static modal
Use the prop `backdrop="static"` to prevent the modal from closing when clicking outside of it. This can be used with situations where you want to force the user to choose an option such as a cookie notice or when taking a survey.
```twig
Open ModalEdit profile
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean placerat, velit sit amet interdum auctor, ligula lorem posuere urna, ut lobortis odio odio et leo. Nam scelerisque vel sem vel pulvinar.
I acceptDecline
```
### Pop-up modal
You can use this modal example to show a pop-up decision dialog to your users especially when deleting an item and making sure if the user really wants to do that by double confirming.
```twig
DeleteAre you sure you want to delete this product from your account?
Yes, I'm sure
No, cancel
```
### Opened by default
```twig
Open ModalEdit profile
With less than a month to go before the European Union enacts new consumer privacy laws for its citizens, companies around the world are updating their terms of service agreements to comply.
The European Union’s General Data Protection Regulation (G.D.P.R.) goes into effect on May 25 and is meant to ensure a common set of data rights in the European Union. It requires organizations to notify users as soon as possible of high-risk data breaches that could personally affect them.
I acceptDecline
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `open` | `boolean` | `false` | Whether the modal is open on initial render. |
| `id` | `string` | - | Unique identifier used to generate internal Modal IDs. |
| Block | Description |
|:------|:------------|
| `content` | The modal structure, typically includes `Modal:Trigger` and `Modal:Content`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content area of the moda. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The close trigger element (e.g., a `Button`) that closes the modal when clicked. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `showCloseButton` | `boolean` | `true` | Whether to display the close button in the top-right corner. |
| `backdrop` | `'dynamic'\|'static'` | `'dynamic'` | To prevent the modal from closing when clicking outside. |
| Block | Description |
|:------|:------------|
| `content` | The modal content, typically includes `Modal:Header` and optionally `Modal:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer area, typically contains action buttons. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains `Modal:Title` and `Modal:Description`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the modal. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The trigger element (e.g., a `Button`) that opens the modal when clicked. |
# Pagination
Use the Tailwind CSS pagination element to indicate a series of content across various pages based on multiple styles and sizes
```twig
123
```
## Installation
```shell
php bin/console ux:install pagination --kit flowbite-4
```
## Usage
```twig
123
```
## Examples
### As icon
The following pagination component example shows how you can use [SVG icons](https://ux.symfony.com/icons) instead of text to show the previous and next pages.
```twig
123
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The pagination structure, typically a `Pagination:Content`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The pagination items, typically multiple `Pagination:Item` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The pagination item content, typically a `Pagination:Link`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `active` | `boolean` | `false` | Whether this is the current page. |
| Block | Description |
|:------|:------------|
| `content` | The page number or navigation icon. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `asIcon` | `boolean` | `false` | Whether to render only the chevron icon instead of the text label. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `asIcon` | `boolean` | `false` | Whether to render only the chevron icon instead of the text label. |
# Radio
The radio component can be used to allow the user to choose a single option from one or more available options coded with the utility classes from Tailwind CSS and available in multiple styles, variants, and colors and support dark mode.
```twig
Default radio
Checked state
```
## Installation
```shell
php bin/console ux:install radio --kit flowbite-4
```
## Usage
```twig
```
## Examples
### Disabled
This example can be used for the disabled state of the radio component by applying the disabled attribute to the input element.
```twig
Default radio
Checked state
```
### Bordered
This example can be used to create a radio component with a bordered style, a description text and an icon.
```twig
16GB unified memory
Seamlessly handle multitasking, large apps.
1TB SSD storage
Get ultra-fast storage with 1TB of SSD space
```
## API Reference
# Select
Get started with the select component to allow the user to choose from one or more options from a dropdown list based on multiple styles, sizes, and variants
```twig
```
## Installation
```shell
php bin/console ux:install select --kit flowbite-4
```
## Usage
```twig
```
## Examples
### Multiple
Apply the `multiple` attribute to the select component to allow users to select one or more options.
```twig
```
### Disabled state
Apply the `disabled` attribute to the select component to prevent users from interacting with it.
```twig
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The select options (`
# Skeleton
Use the skeleton component to indicate a loading status with placeholder elements that look very similar to the type of content that is being loaded such as paragraphs, heading, images, videos, and more.
```twig
Loading...
```
## Installation
```shell
php bin/console ux:install skeleton --kit flowbite-4
```
## Usage
```twig
```
## Examples
### Card placeholder
Use this example to show a placeholder when loading content inside a card.
```twig
Loading...
Loading...
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `shape` | `'rounded'\|'pill'` | `'pill'` | The badge shape. |
| Block | Description |
|:------|:------------|
| `content` | The content rendered inside the skeleton placeholder. |
# Spinner
An indicator that can be used to show a loading state.
```twig
```
## Installation
```shell
php bin/console ux:install spinner --kit flowbite-4
```
## Usage
```twig
Please wait
```
## Examples
### Size
Change the size of the spinner component using the `h-{*}` and `w-{*}` or `size-{*}` utility classes from Tailwind CSS:
```twig
```
### Color
You can change the colors of the spinner element using the fill and color utility classes from Tailwind CSS:
use `text-{*}` to change the main colors
```twig
```
### Alignment
Because the spinner component is an inline HTML element it can easily be aligned on the left, center, or right side using the `text-{left|center|right}` utility classes:
```twig
Loading...
Loading...
Loading...
```
### Spinner with card
Use this animated loading indicator when content inside of a card is still loading.
```twig
Noteworthy technology acquisitions 2021
Here are the biggest technology acquisitions of 2025 so far, in reverse chronological order.
Loading...
```
### Progress spinner
Use this animated spinner component inside a list of steppers elements.
```twig
Converting your image:
Upload your file to our website
Choose your file format
Loading...
Preparing your file
```
### Buttons
The spinner component can also be used inside elements such as buttons when submitting form data:
```twig
Loading...
```
## API Reference
# Table
Use the table component to show text, images, links, and other elements inside a structured set of data made up of rows and columns of table cells
```twig
{%- set products = [
{name: 'Apple MacBook Pro 17"', color: 'Silver', category: 'Laptop', price: '$2999', stock: 231},
{name: 'Microsoft Surface Pro', color: 'White', category: 'Laptop PC', price: '$1999', stock: 423},
{name: 'Magic Mouse 2', color: 'Black', category: 'Accessories', price: '$99', stock: 121},
] -%}
Our products
Browse a list of Flowbite products designed to help you work and play, stay organized, get answers, keep in touch, grow your business, and more.
```
## Installation
```shell
php bin/console ux:install table --kit flowbite-4
```
## Usage
```twig
A list of your recent invoices.InvoiceStatusMethodAmountINV001PaidCredit Card$250.00
```
## Examples
### Highlight striped
Use this example to increase the readability of the data sets by alternating the background color of every second table row.
```twig
{%- set products = [
{name: 'Apple MacBook Pro 17"', color: 'Silver', category: 'Laptop', price: '$2999', stock: 231},
{name: 'Microsoft Surface Pro', color: 'White', category: 'Laptop PC', price: '$1999', stock: 423},
{name: 'Magic Mouse 2', color: 'Black', category: 'Accessories', price: '$99', stock: 121},
] -%}
```
### Without border
Use this example of a table component without any border between the table cells.
```twig
{%- set products = [
{name: 'Apple MacBook Pro 17"', color: 'Silver', category: 'Laptop', price: '$2999', stock: 231},
{name: 'Microsoft Surface Pro', color: 'White', category: 'Laptop PC', price: '$1999', stock: 423},
{name: 'Magic Mouse 2', color: 'Black', category: 'Accessories', price: '$99', stock: 121},
] -%}
Product nameColorCategoryPriceStock
{% for product in products %}
{{ product.name }}{{ product.color }}{{ product.category }}{{ product.price }}{{ product.stock }}
{% endfor %}
Total$5997775
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `borderless` | `boolean` | `false` | Whether to hide the table borders. |
| Block | Description |
|:------|:------------|
| `content` | The table structure, typically includes `Table:Header`, `Table:Body`, and optionally `Table:Footer`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `highlight` | `'none'\|'hover'\|'striped'` | `'hover'` | The visual row style highlight. |
| Block | Description |
|:------|:------------|
| `content` | The table body rows, typically `Table:Row` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The table caption text. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The cell content. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The table footer rows, typically `Table:Row` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header cell content. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header row(s), typically a `Table:Row` with `Table:Head` cells. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The row cells, typically `Table:Cell` or `Table:Head` components. |
# Tabs
Use the following default tabs component example to show a list of links that the user can navigate from on your website.
```twig
ProfileDashboardSettingsContactDisabled
This is some placeholder content the Profile tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling.
This is some placeholder content the Dashboard tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling.
This is some placeholder content the Settings tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling.
This is some placeholder content the Contact tab's associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling.
```
## Installation
```shell
php bin/console ux:install tabs --kit flowbite-4
```
## Usage
```twig
AccountPasswordMake changes to your account here.Change your password here.
```
## Examples
### Tabs with underline
Use this alternative tabs component style with an underline instead of a background when hovering and being active on a certain page.
```twig
ProfileDashboardSettingsContactsDisabled
```
### Tabs with icons
This is an example of the tabs component where you can also use a SVG powered icon to complement the text within the navigational tabs.
```twig
Profile
Dashboard
Settings
Contacts
Disabled
```
### Pills tabs
If you want to use pills as a style for the tabs component you can do so by using this example.
```twig
ProfileDashboardSettingsContactsDisabled
```
### Vertical
Use this example to show a vertically aligned set of tabs on the left side of the page.
```twig
ProfileDashboardSettingsContactDisabled
Profile Tab
This is some placeholder content the Profile tab's associated content, clicking another tab will toggle the visibility of this one for the next.
The tab JavaScript swaps classes to control the content visibility and styling.
Dashboard Tab
Settings Tab
Contact Tab
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `defaultValue` | `string` | `''` | Define the open Tabs at initial rendering. |
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | Define the visual orientation. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `string` | - | Unique suffix identifier for generating Tabs internal IDs. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'line'` | `'default'` | The visual style variant. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `string` | - | Unique suffix identifier for generating Tabs internal IDs. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
# Textarea
The textarea component is a multi-line text field input that can be used to receive longer chunks of text from the user in the form of a comment box, description field, and more.
```twig
```
## Installation
```shell
php bin/console ux:install textarea --kit flowbite-4
```
## Usage
```twig
```
## Examples
### Comment Box
Most often the textarea component is used as the main text field input element in comment sections. Use this example to also apply a helper text and buttons below the textarea itself.
```twig
```
### WYSIWYG Editor
Use this example to add action buttons alongside a textarea for rich text editing capabilities.
```twig
```
### Chatroom Input
If you want to build a chatroom component you will usually want to use a textarea element to allow users to write multi-line chunks of text.
```twig
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The initial textarea value. |
# Toggle
Use the toggle component to switch between a binary state of true or false using a single click available in multiple sizes, variants, and colors
```twig
Toggle me
```
## Installation
```shell
php bin/console ux:install toggle --kit flowbite-4
```
## Usage
```twig
Label
```
## Examples
### Disabled
Apply the disabled attribute to disallow the users from making any further selections.
```twig
Toggle me
Toggle me
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The toggle label text. |
# Accordion
A vertically stacked set of interactive headings that each reveal a section of content.
```twig
What are your shipping options?
We offer standard (5-7 days), express (2-3 days), and overnight
shipping. Free shipping on international orders.
What is your return policy?
Returns accepted within 30 days. Items must be unused and in original
packaging. Refunds processed within 5-7 business days.
How can I contact customer support?
Reach us via email, live chat, or phone. We respond within 24 hours
during business days.
```
## Installation
```shell
php bin/console ux:install accordion --kit shadcn
```
## Usage
```twig
Is it accessible?
Yes. It adheres to the WAI-ARIA design pattern.
```
## Examples
### Basic
A basic accordion that shows one item at a time. The first item is open by default.
```twig
{% set items = [
{
value: 'item-1',
trigger: 'How do I reset my password?',
content:
"Click on 'Forgot Password' on the login page, enter your email address, and we'll send you a link to reset your password. The link will expire in 24 hours.",
},
{
value: 'item-2',
trigger: 'Can I change my subscription plan?',
content:
'Yes, you can upgrade or downgrade your plan at any time from your account settings. Changes will be reflected in your next billing cycle.',
},
{
value: 'item-3',
trigger: 'What payment methods do you accept?',
content:
'We accept all major credit cards, PayPal, and bank transfers. All payments are processed securely through our payment partners.',
},
] %}
{% for item in items %}
{{ item.trigger }}{{ item.content }}
{% endfor %}
```
### Multiple
Use the `multiple` prop to allow multiple items to be open at the same time.
```twig
{% set items = [
{
value: 'notifications',
trigger: 'Notification Settings',
content:
'Manage how you receive notifications. You can enable email alerts for updates or push notifications for mobile devices.',
},
{
value: 'privacy',
trigger: 'Privacy & Security',
content:
'Control your privacy settings and security preferences. Enable two-factor authentication, manage connected devices, review active sessions, and configure data sharing preferences. You can also download your data or delete your account.',
},
{
value: 'billing',
trigger: 'Billing & Subscription',
content:
'View your current plan, payment history, and upcoming invoices. Update your payment method, change your subscription tier, or cancel your subscription.',
},
] %}
{% for item in items %}
{{ item.trigger }}{{ item.content }}
{% endfor %}
```
### Disabled
Use the `disabled` prop on `Accordion:Item` to disable individual items.
```twig
Can I access my account history?
Yes, you can view your complete account history including all
transactions, plan changes, and support tickets in the Account History
section of your dashboard.
Premium feature information
This section contains information about premium features. Upgrade your
plan to access this content.
How do I update my email address?
You can update your email address in your account settings.
You'll receive a verification email at your new address to
confirm the change.
```
### Borders
Add `border` to the `Accordion` and `border-b last:border-b-0` to the `Accordion:Item` to add borders to the items.
```twig
{% set items = [
{
value: 'billing',
trigger: 'How does billing work?',
content:
'We offer monthly and annual subscription plans. Billing is charged at the beginning of each cycle, and you can cancel anytime. All plans include automatic backups, 24/7 support, and unlimited team members.',
},
{
value: 'security',
trigger: 'Is my data secure?',
content:
'Yes. We use end-to-end encryption, SOC 2 Type II compliance, and regular third-party security audits. All data is encrypted at rest and in transit using industry-standard protocols.',
},
{
value: 'integration',
trigger: 'What integrations do you support?',
content:
'We integrate with 500+ popular tools including Slack, Zapier, Salesforce, HubSpot, and more. You can also build custom integrations using our REST API and webhooks.',
},
] %}
{% for item in items %}
{{ item.trigger }}{{ item.content }}
{% endfor %}
```
### Card
Wrap the `Accordion` in a `Card` component.
```twig
Subscription & Billing
Common questions about your account, plans, payments and cancellations.
What subscription plans do you offer?
We offer three subscription tiers: Starter ($9/month), Professional ($29/month), and Enterprise ($99/month). Each plan includes increasing storage limits, API access, priority support, and team collaboration features.
How does billing work?
Billing occurs automatically at the start of each billing cycle. We accept all major credit cards, PayPal, and ACH transfers for enterprise customers. You'll receive an invoice via email after each payment.
How do I cancel my subscription?
You can cancel your subscription anytime from your account settings. There are no cancellation fees or penalties. Your access will continue until the end of your current billing period.
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
كيف يمكنني إعادة تعيين كلمة المرور؟
انقر على 'نسيت كلمة المرور' في صفحة تسجيل الدخول، أدخل عنوان بريدك الإلكتروني، وسنرسل لك رابطًا لإعادة تعيين كلمة المرور. سينتهي صلاحية الرابط خلال 24 ساعة.
هل يمكنني تغيير خطة الاشتراك الخاصة بي؟
نعم، يمكنك ترقية أو تخفيض خطتك في أي وقت من إعدادات حسابك. ستظهر التغييرات في دورة الفوترة التالية.
ما هي طرق الدفع التي تقبلونها؟
نقبل جميع بطاقات الائتمان الرئيسية و PayPal والتحويلات المصرفية. تتم معالجة جميع المدفوعات بأمان من خلال شركاء الدفع لدينا.
איך אני משנה את הסיסמה שלי?
לחץ על 'שכחתי סיסמה' בעמוד ההתחברות, הזן את כתובת האימייל שלך, ונשלח לך קישור לשינוי הסיסמה. הקישור יסתיים תוך 24 שעות.
האם אני יכול לשנות את תוכנית המנוי שלי?
כן, אתה יכול לשדרג או להוריד את התוכנית שלך בכל עת מההגדרות של החשבון שלך. השינויים יבואו לידי ביטוי במחזור החיוב הבא.
אילו אמצעי תשלום אתם מקבלים?
אנו מקבלים כרטיסי אשראי, PayPal והעברות בנקאיות.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier for the Accordion. |
| `multiple` | `boolean` | `false` | Whether multiple items can be opened at once. |
| `defaultValue` | `string\|array\|null` | `null` | Value(s) of the item(s) to open by default. |
| `orientation` | `'vertical'\|'horizontal'` | `'vertical'` | The visual orientation, controls whether keyboard navigation uses up/down or left/right arrow keys. |
| Block | Description |
|:------|:------------|
| `content` | The accordion items, typically multiple `Accordion:Item` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The collapsible content of the accordion item. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `string` | - | Unique value for this accordion item. |
| `open` | `boolean` | `false` | Whether the item is open by default. |
| `disabled` | `boolean` | `false` | Whether the item is disabled. |
| Block | Description |
|:------|:------------|
| `content` | The item content, typically an `Accordion:Trigger` and `Accordion:Content`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The clickable trigger label that toggles the accordion item. |
# Alert Dialog
A modal dialog that interrupts the user with important content and expects a response.
```twig
Show DialogAre you absolutely sure?
This action cannot be undone. This will permanently delete your
account from our servers.
CancelContinue
```
## Installation
```shell
php bin/console ux:install alert-dialog --kit shadcn
```
## Usage
```twig
Show DialogAre you absolutely sure?
This action cannot be undone. This will permanently delete your
account and remove your data from our servers.
CancelContinue
```
## Examples
### Basic
A basic alert dialog with a title, description, and cancel and continue buttons.
```twig
Show DialogAre you absolutely sure?
This action cannot be undone. This will permanently delete your
account and remove your data from our servers.
CancelContinue
```
### Small
Use the `size="sm"` prop to make the alert dialog smaller.
```twig
Show DialogAllow accessory to connect?
Do you want to allow the USB accessory to connect to this device?
Don't allowAllow
```
### Media
Use the `AlertDialog:Media` component to add a media element such as an icon or image to the alert dialog.
```twig
Share ProjectShare this project?
Anyone with the link will be able to view and edit this project.
CancelShare
```
### Small with Media
Use the `size="sm"` prop to make the alert dialog smaller and the `AlertDialog:Media` component to add a media element such as an icon or image to the alert dialog.
```twig
Show DialogAllow accessory to connect?
Do you want to allow the USB accessory to connect to this device?
Don't allowAllow
```
### Destructive
Use the `AlertDialog:Action` component to add a destructive action button to the alert dialog.
```twig
Delete ChatDelete chat?
This will permanently delete this chat conversation. View
Settings delete any memories saved during this chat.
CancelDelete
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
إظهار الحوارهل أنت متأكد تمامًا؟
لا يمكن التراجع عن هذا الإجراء. سيتم حذف حسابك نهائيًا من خوادمنا.
إلغاءمتابعةإظهار الحوار (صغير)السماح للملحق بالاتصال؟
هل تريد السماح لملحق USB بالاتصال بهذا الجهاز؟
عدم السماحالسماح
הצג דיאלוגהאם אתה בטוח לחלוטין?
לא ניתן לבטל. זה ימחק לצמיתות את החשבון שלך מהשרתים שלנו.
ביטולהמשךהצג דיאלוג (קטן)לחבר התקן?
חבר התקן USB למכשיר זה?
דחהאשר
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier used to generate internal AlertDialog IDs. |
| `open` | `boolean` | `false` | Whether the dialog is open on initial render. |
| Block | Description |
|:------|:------------|
| `content` | The dialog structure, typically includes `AlertDialog:Trigger` and `AlertDialog:Content`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'secondary'\|'destructive'\|'outline'\|'ghost'\|'link'` | `'default'` | The button style variant. |
| `size` | `'default'\|'sm'\|'lg'\|'xs'\|'icon'` | `'default'` | The button size. |
| Block | Description |
|:------|:------------|
| `content` | The action button label. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'secondary'\|'destructive'\|'outline'\|'ghost'\|'link'` | `'outline'` | The button style variant. |
| `size` | `'default'\|'sm'\|'lg'\|'xs'\|'icon'` | `'default'` | The button size. |
| Block | Description |
|:------|:------------|
| `content` | The cancel button label. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `'default'\|'sm'` | `'default'` | The size of the dialog. |
| Block | Description |
|:------|:------------|
| `content` | The dialog content, typically includes `AlertDialog:Header` and `AlertDialog:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text explaining the alert dialog purpose. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer area, typically contains `AlertDialog:Cancel` and `AlertDialog:Action` buttons. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains `AlertDialog:Title` and `AlertDialog:Description`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The media element (icon or image) to display in the alert dialog header. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the alert dialog. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The trigger element (e.g., a `Button`) that opens the dialog when clicked. |
# Alert
Displays a callout for user attention.
```twig
Payment successful
Your payment of $29.99 has been processed. A receipt has been sent to your email address.
New feature available
We've added dark mode support. You can enable it in your account settings.
```
## Installation
```shell
php bin/console ux:install alert --kit shadcn
```
## Usage
```twig
Heads up!
You can add components to your app using the cli.
Enable
```
## Examples
### Basic
A basic alert with an icon, title and description.
```twig
Account updated successfully
Your profile information has been saved. Changes will be reflected immediately.
```
### Destructive
Use `variant="destructive"` to create a destructive alert.
```twig
Payment failed
Your payment could not be processed. Please check your payment method and try again.
```
### Action
Use `Alert:Action` to add a button or other action element to the alert.
```twig
Dark mode is now available
Enable it under your profile settings to get started.
Enable
```
### Custom Colors
You can customize the alert colors by adding custom classes such as `bg-amber-50 dark:bg-amber-950` to the `Alert` component.
```twig
Your subscription will expire in 3 days.
Renew now to avoid service interruption or upgrade to a paid plan to continue using the service.
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
تم الدفع بنجاح
تمت معالجة دفعتك البالغة 29.99 دولارًا. تم إرسال إيصال إلى عنوان بريدك الإلكتروني.
ميزة جديدة متاحة
لقد أضفنا دعم الوضع الداكن. يمكنك تفعيله في إعدادات حسابك.
התשלום בוצע בהצלחה
התשלום שלך בסך 29.99 דולר עובד. קבלה נשלחה לכתובת האימייל שלך.
תכונה חדשה זמינה
כעת יש תמיכה במצב כהה. ניתן לאשר זאת בהגדרות החשבון.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'destructive'` | `'default'` | The visual style variant. |
| Block | Description |
|:------|:------------|
| `content` | The alert content, typically includes `Alert:Title` and `Alert:Description`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The action element, typically a button or link positioned at the top-right. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text of the alert. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the alert. |
# Aspect Ratio
Displays content within a desired ratio.
```twig
```
## Installation
```shell
php bin/console ux:install aspect-ratio --kit shadcn
```
## Usage
```twig
```
## Examples
### Square
A square aspect ratio component using the `ratio="1 / 1"` prop. This is useful for displaying images in a square format.
```twig
```
### Portrait
A portrait aspect ratio component using the `ratio="9 / 16"` prop. This is useful for displaying images in a portrait format.
```twig
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
منظر طبيعي جميلמראה נהדר
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `ratio` | `string` | - | The aspect ratio (e.g., `16 / 9`, `4 / 3`, `1 / 1`). |
| Block | Description |
|:------|:------------|
| `content` | The content to display within the aspect ratio container. |
# Avatar
An image element with a fallback for representing the user.
```twig
CNERCNLRER+3
```
## Installation
```shell
php bin/console ux:install avatar --kit shadcn
```
## Usage
```twig
CN
```
## Examples
### Basic
A basic avatar component with an image and a fallback.
```twig
CN
```
### Badge
Use the `Avatar:Badge` component to add a badge to the avatar. The badge is positioned at the bottom right of the avatar.
```twig
CN
```
### Badge with Icon
You can also use an icon inside `Avatar:Badge`.
```twig
PP
```
### Avatar Group
Use the `Avatar:Group` component to add a group of avatars.
```twig
CNLRER
```
### Avatar Group Count
Use `Avatar:GroupCount` to add a count to the group.
```twig
CNLRER+3
```
### Avatar Group with Icon
You can also use an icon inside `Avatar:GroupCount`.
```twig
CNLRER
```
### Sizes
Use the `size` prop to change the size of the avatar.
```twig
CNCNCN
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
CNERCNLRER+٣
CNERCNLRER+3
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `'default'\|'sm'\|'lg'` | `'default'` | The avatar size. |
| Block | Description |
|:------|:------------|
| `content` | The avatar content, typically an image or `Avatar:Fallback`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The badge content, typically an icon indicating status. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The fallback content displayed when no image is available, typically initials. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The grouped avatars, typically multiple `Avatar` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The count indicator showing number of additional avatars (e.g., "+3"). |
# Badge
Displays a badge or a component that looks like a badge.
```twig
BadgeSecondaryDestructiveOutline
```
## Installation
```shell
php bin/console ux:install badge --kit shadcn
```
## Usage
```twig
Badge
```
## Examples
### Variants
Use the `variant` prop to change the variant of the badge.
```twig
DefaultSecondaryDestructiveOutlineGhost
```
### With Icon
You can render an icon inside the badge. Use `data-icon="inline-start"` to render the icon on the left and `data-icon="inline-end"` to render the icon on the right.
```twig
Verified
Bookmark
```
### With Spinner
You can render a spinner inside the badge. Remember to add the `data-icon="inline-start"` or `data-icon="inline-end"` attribute to the spinner.
```twig
Deleting
Generating
```
### Link
Use the `as` prop to render a link as a badge.
```twig
Open Link
```
### Custom Colors
You can customize the colors of a badge by adding custom classes such as `bg-green-50 dark:bg-green-800` to the `Badge` component.
```twig
BlueGreenSkyPurpleRed
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
شارةثانويمدمرمخطط
متحقق
إشارة مرجعية
תגמשניהרסניקווי מתאר
מאומת
סימנייה
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'secondary'\|'destructive'\|'outline'\|'ghost'\|'link'` | `'default'` | The visual style variant. |
| `as` | `'span'` | `'span'` | The HTML tag to render. |
| Block | Description |
|:------|:------------|
| `content` | The badge label or content. |
# Breadcrumb
Displays the path to the current resource using a hierarchy of links.
```twig
HomeComponentsBreadcrumb
```
## Installation
```shell
php bin/console ux:install breadcrumb --kit shadcn
```
## Usage
```twig
HomeComponentsBreadcrumb
```
## Examples
### Basic
A basic breadcrumb with a home link and a components link.
```twig
HomeComponentsBreadcrumb
```
### Custom separator
Use a custom component as `children` for `Breadcrumb:Separator` to create a custom separator.
```twig
HomeComponentsBreadcrumb
```
### Collapsed
We provide a `Breadcrumb:Ellipsis` component to show a collapsed state when the breadcrumb is too long.
```twig
HomeComponentsBreadcrumb
```
### Link component
To use a custom link component from your routing library, you can pass the `href` attribute to `Breadcrumb:Link`.
```twig
HomeComponentsBreadcrumb
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
الرئيسيةالمكوناتمسار التنقلביתרכיביםניווט
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The breadcrumb structure, typically a `Breadcrumb:List`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The breadcrumb item content, typically a `Breadcrumb:Link` or `Breadcrumb:Page`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The clickable link text. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The list of breadcrumb items, typically multiple `Breadcrumb:Item` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The current page text (non-clickable). |
### ``
| Block | Description |
|:------|:------------|
| `content` | The separator icon between breadcrumb items, defaults to a chevron. |
# Button Group
A container that groups related buttons together with consistent styling.
```twig
ArchiveReport
Snooze
```
## Installation
```shell
php bin/console ux:install button-group --kit shadcn
```
## Usage
```twig
Button 1Button 2
```
## Accessibility
- The `ButtonGroup` component has the `role` attribute set to `group`.
- Use `Tab` to navigate between the buttons in the group.
- Use `aria-label` or `aria-labelledby` to label the button group.
```twig
Button 1Button 2
```
## Examples
### Orientation
Set the `orientation` prop to change the button group layout.
```twig
```
### Size
Control the size of buttons using the `size` prop on individual buttons.
```twig
```
### Nested
Nest `ButtonGroup` components to create button groups with spacing.
```twig
```
### Separator
The `ButtonGroup:Separator` 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.
```twig
CopyPaste
```
### Split
Create a split button group by adding two buttons separated by a `ButtonGroup:Separator`.
```twig
Button
```
### Input
Wrap an `Input` component with buttons.
```twig
```
### Input Group
Wrap an `InputGroup` component to create complex input layouts.
```twig
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
أرشفةتقريرتأجيل
ארכיוןדוחדחה
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | The layout direction of the button group. |
| Block | Description |
|:------|:------------|
| `content` | The grouped buttons and/or separators. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'horizontal'\|'vertical'` | `'vertical'` | The separator orientation. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `as` | `'div'` | `'div'` | The HTML tag to render. |
| Block | Description |
|:------|:------------|
| `content` | The text content displayed in the button group. |
# Button
Displays a button or a component that looks like a button.
```twig
Button
```
## Installation
```shell
php bin/console ux:install button --kit shadcn
```
## Usage
```twig
Button
```
## Examples
### Size
Use the `size` prop to change the size of the button.
```twig
Extra Small
Small
Default
Large
```
### Default
```twig
Button
```
### Outline
```twig
Outline
```
### Secondary
```twig
Secondary
```
### Ghost
```twig
Ghost
```
### Destructive
```twig
Destructive
```
### Link
```twig
Link
```
### Icon
```twig
```
### With Icon
Remember to add the `data-icon="inline-start"` or `data-icon="inline-end"` attribute to the icon for the correct spacing.
```twig
New Branch
```
### Rounded
Use the `rounded-full` class to make the button rounded.
```twig
```
### Spinner
Render a `Spinner` component inside the button to show a loading state. Remember to add the `data-icon="inline-start"` or `data-icon="inline-end"` attribute to the spinner for the correct spacing.
```twig
Generating
Downloading
```
### As Child
You can use the `as` prop on `Button` to make another element look like a button. Here's an example of a link that looks like a button.
```twig
Login
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
زرحذف
إرسال
جاري التحميل
לחצןמחק
שלח
טוען
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'secondary'\|'destructive'\|'outline'\|'ghost'\|'link'` | `'default'` | The visual style variant. |
| `size` | `'default'\|'xs'\|'sm'\|'lg'\|'icon'\|'icon-xs'\|'icon-sm'\|'icon-lg'` | `'default'` | The button size. |
| `as` | `'button'` | `'button'` | The HTML tag to render. |
| Block | Description |
|:------|:------------|
| `content` | The button label and/or icon. |
# Card
Displays a card with header, content, and footer.
```twig
Login to your account
Enter your email below to login to your account
Sign Up
Login
Login with Google
```
## Installation
```shell
php bin/console ux:install card --kit shadcn
```
## Usage
```twig
Card TitleCard DescriptionCard Action
Card Content
Card Footer
```
## Examples
### Size
Use the `size="sm"` prop to set the size of the card to small. The small size variant uses smaller spacing.
```twig
Small Card
This card uses the small size variant.
The card component supports a size prop that can be set to
"sm" for a more compact appearance.
Action
```
### Image
Add an image before the card header to create a card with an image.
```twig
FeaturedDesign systems meetup
A practical talk on component APIs, accessibility, and shipping faster.
View Event
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
تسجيل الدخول إلى حسابك
أدخل بريدك الإلكتروني أدناه لتسجيل الدخول إلى حسابك
إنشاء حسابتسجيل الدخولتسجيل الدخول باستخدام Google
{# Hebrew #}
התחברות לחשבון שלך
הזן את כתובת האימייל שלך למטה כדי להתחבר לחשבון שלך
הרשמההתחברותהתחברות עם Google
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `'default'\|'sm'` | `'default'` | Size variant of the card. |
| Block | Description |
|:------|:------------|
| `content` | The card content, typically includes `Card:Header`, `Card:Content`, and/or `Card:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The action area placed in the top-right corner of the card header. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content area of the card. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text of the card. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer area, typically contains actions or additional information. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains `Card:Title`, `Card:Description`, and `Card:Action`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the card. |
# Checkbox
A control that allows the user to toggle between checked and not checked.
```twig
Accept terms and conditionsAccept terms and conditionsBy clicking this checkbox, you agree to the terms.Enable notificationsEnable notificationsYou can enable or disable notifications at any time.
```
## Installation
```shell
php bin/console ux:install checkbox --kit shadcn
```
## Usage
```twig
```
## Examples
### Basic
Pair the checkbox with `Field` and `Field:Label` for proper layout and labeling.
```twig
Accept terms and conditions
```
### Description
Use `Field:Content` and `Field:Description` for helper text.
```twig
Accept terms and conditionsBy clicking this checkbox, you agree to the terms and conditions.
```
### Disabled
Use the `disabled` attribute to prevent interaction and add the `data-disabled` attribute to the `Field` component for disabled styles.
```twig
Enable notifications
```
### Group
Use multiple fields to create a checkbox list.
```twig
Show these items on the desktop:Select the items you want to show on the desktop.Hard disksExternal disksCDs, DVDs, and iPodsConnected servers
```
### Table
```twig
NameEmailRoleSarah Chensarah.chen@example.comAdminMarcus Rodriguezmarcus.rodriguez@example.comUserPriya Patelpriya.patel@example.comUserDavid Kimdavid.kim@example.comEditor
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
قبول الشروط والأحكامقبول الشروط والأحكامبالنقر على هذا المربع، فإنك توافق على الشروط.تفعيل الإشعاراتتفعيل الإشعاراتيمكنك تفعيل أو إلغاء تفعيل الإشعارات في أي وقت.
{# Hebrew #}
קבל תנאים והגבלותקבל תנאים והגבלותעל ידי לחיצה על תיבת הסימון הזו, אתה מסכים לתנאים.הדלק התראותהדלק התראותאתה יכול להדליק או לכבות התראות בכל עת.
```
## API Reference
# Collapsible
An interactive component which expands/collapses a panel.
```twig
Order #4189
Toggle details
StatusShipped
Shipping address
100 Market St, San Francisco
Items
2x Studio Headphones
```
## Installation
```shell
php bin/console ux:install collapsible --kit shadcn
```
## Usage
```twig
Can I use this in my project?
Yes. Free to use for personal and commercial projects. No attribution required.
```
## Examples
### Basic
```twig
Product details
This panel can be expanded or collapsed to reveal additional content.
Learn More
```
### Settings Panel
Use a trigger button to reveal additional settings.
```twig
RadiusSet the corner radius of the element.
Radius XRadius YRadius XRadius Y
```
### File Tree
Use nested collapsibles to build a file tree.
```twig
ExplorerOutline
{# Folder: components #}
components
{# Nested folder: components/ui #}
ui
{% for file in ['button.tsx', 'card.tsx', 'dialog.tsx', 'input.tsx', 'select.tsx', 'table.tsx'] %}
{{ file }}
{% endfor %}
{% for file in ['login-form.tsx', 'register-form.tsx'] %}
{{ file }}
{% endfor %}
{# Folder: lib #}
lib
{% for file in ['utils.ts', 'cn.ts', 'api.ts'] %}
{{ file }}
{% endfor %}
{# Folder: hooks #}
hooks
{% for file in ['use-media-query.ts', 'use-debounce.ts', 'use-local-storage.ts'] %}
{{ file }}
{% endfor %}
{# Folder: types #}
types
{% for file in ['index.d.ts', 'api.d.ts'] %}
{{ file }}
{% endfor %}
{# Folder: public #}
public
{% for file in ['favicon.ico', 'logo.svg', 'images'] %}
{{ file }}
{% endfor %}
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier for ARIA references and internal element IDs. |
| `name` | `string\|null` | `null` | If set, renders a hidden input for form submission. |
| `value` | `string` | `''` | The initially selected value. Must match a choices entry. |
| `choices` | `array` | `[]` | List of choices: `[{value: '...', label: '...'}]` or grouped `[{label: '...', choices: [{value: '...', label: '...'}]}]`. |
| `placeholder` | `string` | `'Select option...'` | Text shown on the trigger when nothing is selected. |
| `searchPlaceholder` | `string` | `'Search...'` | Placeholder inside the search input. |
| `emptyMessage` | `string` | `'No results found.'` | Shown when the filter matches nothing. |
| `disabled` | `boolean` | `false` | Whether the widget is disabled. |
| `required` | `boolean` | `false` | Adds required to the hidden input (only applies when name is set). |
| `clearable` | `boolean` | `false` | Shows a clear button when a value is selected. |
# Dialog
A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.
```twig
Open DialogEdit profile
Make changes to your profile here. Click save when you're done.
Name
Username
CancelSave changes
```
## Installation
```shell
php bin/console ux:install dialog --kit shadcn
```
## Usage
```twig
OpenAre you absolutely sure?
This action cannot be undone. This will permanently delete your account
and remove your data from our servers.
```
## Examples
### Custom Close Button
Replace the default close control with your own button.
```twig
ShareShare link
Anyone who has this link will be able to view this.
Link
Close
```
### No Close Button
Set the `showCloseButton` prop to `false` to hide the close button.
```twig
No Close ButtonNo Close Button
This dialog doesn't have a close button in the top-right corner.
```
### Sticky Footer
Keep actions visible while the content scrolls.
```twig
Sticky FooterSticky Footer
This dialog has a sticky footer that stays visible while the content scrolls.
{% for i in 1..10 %}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
{% endfor %}
Close
```
### Scrollable Content
Long content can scroll while the header stays in view.
```twig
Scrollable ContentScrollable Content
This is a dialog with scrollable content.
{% for i in 1..10 %}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
{% endfor %}
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
فتح الحوارتعديل الملف الشخصي
قم بإجراء تغييرات على ملفك الشخصي هنا. انقر فوق حفظ عند الانتهاء.
الاسم
اسم المستخدم
إلغاءحفظ التغييرات
{# Hebrew #}
הצג דיאלוגערוך נתונים
ניתן לשנות נתונים כאן. לחץ שמור בסיום.
שם
שם משתמש
בטלשמור שינויים
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier used to generate internal Dialog IDs. |
| `open` | `boolean` | `false` | Whether the dialog is open on initial render. |
| Block | Description |
|:------|:------------|
| `content` | The dialog structure, typically includes `Dialog:Trigger` and `Dialog:Content`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The close trigger element (e.g., a `Button`) that closes the dialog when clicked. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `showCloseButton` | `boolean` | `true` | Whether to display the close button in the top-right corner. |
| Block | Description |
|:------|:------------|
| `content` | The dialog content, typically includes `Dialog:Header` and optionally `Dialog:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text explaining the dialog purpose. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer area, typically contains action buttons. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains `Dialog:Title` and `Dialog:Description`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the dialog. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The trigger element (e.g., a `Button`) that opens the dialog when clicked. |
# Empty
Use the Empty component to display an empty state.
```twig
No Projects Yet
You haven't created any projects yet. Get started by creating your first project.
Create ProjectImport Project
Learn More
```
## Installation
```shell
php bin/console ux:install empty --kit shadcn
```
## Usage
```twig
No dataNo data foundAdd data
```
## Examples
### Outline
Use the `border` utility class to create an outline empty state.
```twig
Cloud Storage Empty
Upload files to your cloud storage to access them anywhere.
Upload Files
```
### Background
Use the `bg-*` utilities to add a background to the empty state.
```twig
No Notifications
You're all caught up. New notifications will appear here.
Refresh
```
### Avatar
Use the `Empty:Media` component to display an avatar in the empty state.
```twig
LRUser Offline
This user is currently offline. You can leave a message to notify them or try again later.
Leave Message
```
### Avatar Group
Use the `Empty:Media` component to display an avatar group in the empty state.
```twig
CNLRER
No Team Members
Invite your team to collaborate on this project.
Invite Members
```
### InputGroup
You can add an `InputGroup` component to the `Empty:Content` component.
```twig
404 - Not Found
The page you're looking for doesn't exist. Try searching for what you need below.
/
Need help? Contact support
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
لا توجد مشاريع بعد
لم تقم بإنشاء أي مشاريع بعد. ابدأ بإنشاء مشروعك الأول.
إنشاء مشروعاستيراد مشروع
تعرف على المزيد
{# Hebrew #}
אין מיזמים עדיין
עדיין לא יצרת מיזמים. התחל ביצירת המיזם הראשון שלך.
צור מיזםייבא מיזם
למד עוד
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The empty state content, typically includes `Empty:Media`, `Empty:Header`, and/or `Empty:Content`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content area, typically contains actions like buttons. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text explaining the empty state. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains `Empty:Title` and `Empty:Description`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'icon'` | `'default'` | The media display style. |
| Block | Description |
|:------|:------------|
| `content` | The visual element, typically an icon or illustration. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the empty state. |
# Field
Combine labels, controls, and help text to compose accessible form fields and grouped inputs.
```twig
```
## Installation
```shell
php bin/console ux:install field --kit shadcn
```
## Usage
```twig
ProfileThis appears on invoices and emails.Full nameThis appears on invoices and emails.UsernameChoose another username.Subscribe to the newsletter
```
## Examples
### Input
```twig
Username
Choose a unique username for your account.
Password
Must be at least 8 characters long.
```
### Textarea
```twig
Feedback
Share your thoughts about our service.
```
### Select
```twig
Department
Select your department or area of work.
```
### Fieldset
```twig
Address information
We need your address to deliver your order.
Street address
CityPostal code
```
### Checkbox
```twig
Show these items on the desktop
Select the items you want to show on the desktop.
Hard disks
External disks
CDs, DVDs, and iPods
Connected servers
Sync Desktop & Documents folders
Your Desktop & Documents folders are being synced with iCloud Drive. You can access them from other devices.
```
### Switch
```twig
Multi-factor authentication
```
### Choice Card
Wrap `Field` components inside `Field:Label` to create selectable field groups. This works with `RadioGroup:Item`, `Checkbox`, and `Switch` components.
```twig
Compute EnvironmentSelect the compute environment for your cluster.KubernetesRun GPU workloads on a K8s cluster.Virtual MachineAccess a cluster to run GPU workloads.
```
### Field Group
```twig
Responses
Get notified when ChatGPT responds to requests that take time, like research or image generation.
Push notifications
Tasks
Get notified when tasks you've created have updates. Manage tasks
Push notifications
Email notifications
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'vertical'\|'horizontal'\|'responsive'` | `'vertical'` | The layout direction of the field. |
| Block | Description |
|:------|:------------|
| `content` | The field content, typically includes `Field:Label` and form input(s). |
### ``
| Block | Description |
|:------|:------------|
| `content` | The input and supplementary elements like `Field:Description` and `Field:Error`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The helper text describing the field. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `errors` | `array` | `[]` | A list of error messages (strings or objects with a `message` property). |
| Block | Description |
|:------|:------------|
| `content` | Custom error content, overrides the `errors` prop if provided. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The grouped fields, typically multiple `Field` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The label text for the field. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'legend'\|'label'` | `'legend'` | The text size variant. |
| Block | Description |
|:------|:------------|
| `content` | The legend text for a fieldset. |
### ``
| Block | Description |
|:------|:------------|
| `content` | Optional text displayed in the center of the separator. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The fieldset content, typically includes `Field:Legend` and `Field` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text for the field (non-label variant). |
# Hover Card
For sighted users to preview content available behind a link.
```twig
Hover Here
@symfony
The PHP framework for web applications — created by @fabpot.
Joined October 2010
```
## Installation
```shell
php bin/console ux:install hover-card --kit shadcn
```
## Usage
```twig
@symfony
The Symfony PHP framework — official organization on GitHub.
```
## Examples
### Basic
```twig
Hover Here
@symfony
The PHP framework for web applications — created by @fabpot.
Joined October 2010
```
### Sides
```twig
{% for side in ['left', 'top', 'bottom', 'right'] %}
{{ side }}
Hover Card
This hover card appears on the {{ side }} side of the trigger.
{% endfor %}
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
{% for side, label in {left: 'يسار', top: 'أعلى', bottom: 'أسفل', right: 'يمين'} %}
{{ label }}
سماعات لاسلكية
٩٩.٩٩ $
{% endfor %}
{# Hebrew #}
{% for side, label in {left: 'שמאל', top: 'למעלה', bottom: 'למטה', right: 'ימין'} %}
{{ label }}
אוזניות אלחוטיות
99.99 $
{% endfor %}
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `openDelay` | `number` | `0` | Delay in milliseconds before showing the content. |
| `closeDelay` | `number` | `0` | Delay in milliseconds before hiding the content. |
| Block | Description |
|:------|:------------|
| `content` | The hover card structure, typically a `HoverCard:Trigger` and `HoverCard:Content`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `side` | `'bottom'\|'top'\|'left'\|'right'` | `'bottom'` | The side where the content appears. |
| Block | Description |
|:------|:------------|
| `content` | The content revealed on hover. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The element that reveals the hover card on hover or focus. |
# Input Group
Add addons, buttons, and helper content to inputs.
```twig
12 results
```
## Installation
```shell
php bin/console ux:install input-group --kit shadcn
```
## Usage
```twig
```
## Examples
### Icon
```twig
```
### Text
```twig
$USDhttps://.com@company.com120 characters left
```
### Button
```twig
https://
Search
```
### Kbd
```twig
⌘K
```
### Spinner
```twig
Saving...Please wait...
```
### Textarea
```twig
Line 1, Column 1
Run
script.js
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
١٢ نتيجةجاري الحفظ...منطقة النص٠/٢٨٠نشرتذييل موضع أسفل منطقة النص.
12 תוצאותשומר...אזור טקסט0/280שלחכותרת תחתונה ממוקמת מתחת לאזור הטקסט.
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The input group elements, typically includes input, `InputGroup:Addon`, and/or `InputGroup:Button`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `align` | `'inline-start'\|'inline-end'\|'block-start'\|'block-end'` | `'inline-start'` | The addon position relative to the input. |
| Block | Description |
|:------|:------------|
| `content` | The addon content, typically an icon or text. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `type` | `'button'\|'submit'` | `'button'` | The button type. |
| `variant` | `'default'\|'secondary'\|'destructive'\|'outline'\|'ghost'\|'link'` | `'ghost'` | The visual style variant. |
| `size` | `'default'\|'sm'\|'lg'\|'icon'\|'icon-sm'\|'icon-lg'` | `'xs'` | The button size. |
| Block | Description |
|:------|:------------|
| `content` | The button label and/or icon. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The text content displayed in the input group. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The initial textarea value. |
# Input
A text input component for forms and user data entry with built-in styling and accessibility features.
```twig
API KeyYour API key is encrypted and stored securely.
```
### Field
Use `Field`, `Field:Label`, and `Field:Description` to create an input with a label and description.
```twig
UsernameChoose a unique username for your account.
```
### Field Group
Use `Field:Group` to show multiple `Field` blocks and to build forms.
```twig
NameEmailWe'll send updates to this address.ResetSubmit
```
### Disabled
Use the `disabled` prop to disable the input. To style the disabled state, add the `data-disabled` attribute to the `Field` component.
```twig
EmailThis field is currently disabled.
```
### Invalid
Use the `aria-invalid` prop to mark the input as invalid. To style the invalid state, add the `data-invalid` attribute to the `Field` component.
```twig
Invalid InputThis field contains validation errors.
```
### File
Use the `type="file"` prop to create a file input.
```twig
PictureSelect a picture to upload.
```
### Inline
Use `Field` with `orientation="horizontal"` to create an inline input. Pair with `Button` to create a search input with a button.
```twig
Search
```
### Grid
Use a grid layout to place multiple inputs side by side.
```twig
First NameLast Name
```
### Required
Use the `required` attribute to indicate required inputs.
```twig
Required Field *This field must be filled out.
```
### Badge
Use `Badge` in the label to highlight a recommended field.
```twig
Webhook URL
Beta
```
### Input Group
To add icons, text, or buttons inside an input, use the `InputGroup` component.
```twig
Website URLhttps://
```
### Button Group
To add buttons to an input, use the `ButtonGroup` component.
```twig
SearchSearch
```
### Form
A full form example with multiple inputs, a select, and a button.
```twig
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
مفتاح APIمفتاح API الخاص بك مشفر ومخزن بأمان.
קוד APIקוד ה-API שלך מוצן ומאוחסן בצורה מאובטחת.
```
## API Reference
# Item
A versatile component for displaying content with media, title, description, and actions.
```twig
Basic Item
A simple item with title and description.
Action
Your profile has been verified.
```
## Installation
```shell
php bin/console ux:install item --kit shadcn
```
## Usage
```twig
TitleDescriptionAction
```
## Examples
### Variant
Use the `variant` prop to change the visual style of the item.
```twig
Default Variant
Transparent background with no border.
Outline Variant
Outlined style with a visible border.
Muted Variant
Muted background for secondary content.
```
### Size
Use the `size` prop to change the size of the item. Available sizes are `default`, `sm`, and `xs`.
```twig
Default Size
The standard size for most use cases.
Small SizeA compact size for dense layouts.Extra Small SizeThe most compact size available.
```
### Icon
Use `Item:Media` with `variant="icon"` to display an icon.
```twig
Security Alert
New login detected from unknown device.
Review
```
### Avatar
Use `Item:Media` to display an avatar.
```twig
EREvil Rabbit
Last seen 5 months ago
CNLRER
No Team Members
Invite your team to collaborate on this project.
Invite
```
### Image
Use `Item:Media` with `variant="image"` to display an image.
```twig
Midnight City Lights - Electric NightsNeon Dreams3:45Coffee Shop Conversations - Urban StoriesThe Morning Brew4:05Digital Rain - Binary BeatsCyber Symphony3:30
```
### Group
Use `Item:Group` to group related items together.
```twig
Sshadcnshadcn@vercel.comMmaxleitermaxleiter@vercel.comEevilrabbitevilrabbit@vercel.com
```
### Header
Use `Item:Header` to add a header above the item content.
```twig
v0-1.5-smEveryday tasks and UI generation.v0-1.5-lgAdvanced thinking or reasoning.v0-2.0-miniOpen Source model for everyone.
```
### Link
Use the `as` prop to render the item as a link. The hover and focus states will be applied to the anchor element.
```twig
Visit our documentation
Learn how to get started with our components.
External resource
Opens in a new tab with security attributes.
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
عنصر أساسيعنصر بسيط يحتوي على عنوان ووصف.إجراءتم التحقق من ملفك الشخصي.
{# Hebrew #}
ערך בסיסיערך עם כותרת ותיאור.בצעהחשבון שלך אומת.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'outline'\|'muted'` | `'default'` | The visual style variant. |
| `size` | `'default'\|'sm'\|'xs'` | `'default'` | The item size. |
| `as` | `'div'` | `'div'` | The HTML tag to render. |
| Block | Description |
|:------|:------------|
| `content` | The item content, typically includes `Item:Media`, `Item:Content`, and/or `Item:Actions`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The action buttons or controls for the item. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The main content area, typically includes `Item:Title` and `Item:Description`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The descriptive text of the item. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The footer area, typically contains metadata or secondary actions. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The grouped items, typically multiple `Item` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header area, typically contains title and actions. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'icon'\|'image'` | `'default'` | The media display style. |
| Block | Description |
|:------|:------------|
| `content` | The visual element, typically an icon or image. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | The separator orientation. |
| `decorative` | `bool` | `true` | Whether the separator is purely decorative (not semantic). |
### ``
| Block | Description |
|:------|:------------|
| `content` | The title text of the item. |
# Kbd
Used to display textual user input from keyboard.
```twig
⌘⇧⌥⌃Ctrl+B
```
## Installation
```shell
php bin/console ux:install kbd --kit shadcn
```
## Usage
```twig
Ctrl
```
## Examples
### Group
Use the `KbdGroup` component to group keyboard keys together.
```twig
Use
Ctrl + BCtrl + K
to open the command palette
```
### Button
Use the `Kbd` component inside a `Button` component to display a keyboard key inside a button.
```twig
Accept ⏎
```
### Tooltip
You can use the `Kbd` component inside a `Tooltip` component to display a tooltip with a keyboard key.
```twig
Save
Save Changes SPrint
Print Document CtrlP
```
### Input Group
You can use the `Kbd` component inside an `InputGroup:Addon` component to display a keyboard key inside an input group.
```twig
⌘K
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
⌘⇧⌥⌃Ctrl+B
{# Hebrew #}
⌘⇧⌥⌃Ctrl+B
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The keyboard key text (e.g., "Ctrl", "⌘", "Enter"). |
### ``
| Block | Description |
|:------|:------------|
| `content` | The keyboard shortcut combination, typically multiple `Kbd` components. |
# Label
Renders an accessible label associated with controls.
```twig
Accept terms and conditions
```
## Installation
```shell
php bin/console ux:install label --kit shadcn
```
## Usage
```twig
Your email address
```
## Examples
### Label in Field
For form fields, use the `Field` component which includes built-in label, description, and error handling.
```twig
Your email address
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
قبول الشروط والأحكام
{# Hebrew #}
קבל תנאים והגבלות
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The label text for a form control. |
# Pagination
Pagination with page navigation, next and previous links.
```twig
123
```
## Installation
```shell
php bin/console ux:install pagination --kit shadcn
```
## Usage
```twig
123
```
## Examples
### Simple
A simple pagination with only page numbers.
```twig
12345
```
### Icons Only
Use just the previous and next buttons without page numbers. This is useful for data tables with a rows per page selector.
```twig
Rows per page
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
١٢٣
{# Hebrew #}
123
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The pagination structure, typically a `Pagination:Content`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The pagination items, typically multiple `Pagination:Item` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The pagination item content, typically a `Pagination:Link`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `active` | `boolean` | `false` | Whether this is the current page. |
| Block | Description |
|:------|:------------|
| `content` | The page number or navigation icon. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `text` | `string` | `'Next'` | The label text. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `text` | `string` | `'Previous'` | The label text. |
# Progress
Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.
```twig
```
## Installation
```shell
php bin/console ux:install progress --kit shadcn
```
## Usage
```twig
```
## Examples
### Label
Use a `Field` component to add a label to the progress bar.
```twig
Upload progress56%
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
تقدم الرفع٥٦%
{# Hebrew #}
התקדמות העלאה56%
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `integer` | `0` | The progress percentage (0-100). |
# Radio Group
A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.
```twig
```
## Examples
### Description
Radio group items with a description using the `Field` component.
```twig
DefaultStandard spacing for most use cases.ComfortableMore space between elements.CompactMinimal spacing for dense layouts.
```
### Choice Card
Use `Field:Label` to wrap the entire `Field` for a clickable card-style selection.
```twig
PlusFor individuals and small teams.ProFor growing businesses.EnterpriseFor large teams and enterprises.
```
### Fieldset
Use `Field:Set` and `Field:Legend` to group radio items with a label and description.
```twig
Subscription PlanYearly and lifetime plans offer significant savings.Monthly ($9.99/month)Yearly ($99.99/year)Lifetime ($299.99)
```
### Disabled
Use the `disabled` prop on `RadioGroup:Item` to disable individual items.
```twig
DisabledOption 2Option 3
```
### Invalid
Use `aria-invalid` on `RadioGroup:Item` and `data-invalid` on `Field` to show validation errors.
```twig
Notification PreferencesChoose how you want to receive notifications.Email onlySMS onlyBoth Email & SMS
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
افتراضيتباعد قياسي لمعظم حالات الاستخدام.مريحمساحة أكبر بين العناصر.مضغوطتباعد أدنى للتخطيطات الكثيفة.ברירת מחדלריווח סטנדרטי לרוב מקרי השימוש.נוחיותר מקום בין האלמנטים.דחוסריווח מינימלי לממשקים דחוסים.
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The radio items, typically multiple `RadioGroup:Item` components with `Label`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `name` | `string` | - | The name shared by all radio inputs in the same group. |
| `value` | `string` | - | The value submitted when this item is selected. |
# Resizable
Accessible resizable panel groups and layouts with keyboard support.
```twig
Drag the bottom-right corner to resize me in any direction.
```
## Examples
### Vertical
Use `orientation="vertical"` for vertical resizing.
```twig
Header
Content
```
### Handle
Use the `withHandle` prop on `Resizable:Handle` to show a visible handle.
```twig
Sidebar
Content
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
واحد
اثنان
ثلاثة
{# Hebrew #}
אחד
שניים
שלושה
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | Layout direction. |
| Block | Description |
|:------|:------------|
| `content` | One or more `Resizable:Panel` separated by `Resizable:Handle`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `withHandle` | `bool` | `false` | Show a visible grip handle. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `int\|null` | `null` | Initial size as a flex-grow value (proportional). If omitted, panels share space equally. |
| Block | Description |
|:------|:------------|
| `content` | The panel content. |
# Select
A dropdown control that allows users to choose from a list of options.
```twig
```
## Installation
```shell
php bin/console ux:install select --kit shadcn
```
## Usage
```twig
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The select options (`
# Separator
Visually or semantically separates content.
```twig
shadcn/ui
The Foundation for your Design System
A set of beautifully designed components that you can customize, extend, and build on.
```
## Installation
```shell
php bin/console ux:install separator --kit shadcn
```
## Usage
```twig
```
## Examples
### Vertical
Use `orientation="vertical"` for a vertical separator.
```twig
Blog
Docs
Source
```
### Menu
Vertical separators between menu items with descriptions.
```twig
SettingsManage preferences
AccountProfile & security
HelpSupport & docs
```
### List
Horizontal separators between list items.
```twig
Item 1
Value 1
Item 2
Value 2
Item 3
Value 3
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
shadcn/ui
الأساس لنظام التصميم الخاص بك
مجموعة من المكونات المصممة بشكل جميل يمكنك تخصيصها وتوسيعها والبناء عليها.
{# Hebrew #}
shadcn/ui
הבסיס למערכת העיצוב שלך
קבוצה של רכיבים מעוצבים בצורה טובה שניתן להתאים אישית, להרחיב ולבנות עליהם.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | The separator orientation. |
| `decorative` | `boolean` | `true` | Whether the separator is purely decorative (not semantic). |
# Skeleton
Use to show a placeholder while content is loading.
```twig
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
{# Hebrew #}
```
## API Reference
# Sonner
A Sonner-style stacked toast notification system with auto-dismiss, swipe-to-dismiss, rich colors, and JS or server-render support.
```twig
```
### With Description
```twig
Show Sonner
```
### With Action
```twig
Show Sonner
```
### Rich Colors
```twig
SuccessErrorWarningInfo
```
### Position
```twig
Top Left
Top Center
Top Right
Bottom Left
Bottom Center
Bottom Right
```
### Server Rendered
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `position` | `'top-left'\|'top-center'\|'top-right'\|'bottom-left'\|'bottom-center'\|'bottom-right'` | `'top-right'` | Position of the notification region. |
| `expand` | `boolean` | `false` | Whether toasts expand on hover instead of stacking. |
| `richColors` | `boolean` | `false` | Whether to use semantic colors for toast types. |
| `closeButton` | `boolean` | `false` | Whether to show a close button on every toast. |
| `duration` | `int` | `4000` | Auto-dismiss duration in milliseconds. |
| `gap` | `int` | `14` | Pixel gap between stacked toasts. |
| `visibleToasts` | `int` | `3` | Maximum number of visible stacked toasts. |
| `dir` | `'ltr'\|'rtl'\|'auto'` | `'ltr'` | Text direction. |
| `theme` | `'light'\|'dark'\|'system'` | `'system'` | Color theme. |
| Block | Description |
|:------|:------------|
| `content` | Optional trigger button(s) or server-rendered `` components. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `type` | `'default'\|'success'\|'error'\|'warning'\|'info'\|'loading'` | `'default'` | The toast type. |
| `title` | `string` | `''` | The toast title. Required. |
| `description` | `string\|null` | `null` | The secondary description line. |
| `duration` | `int\|null` | `null` | Per-toast auto-dismiss override in ms. Uses the Toaster default when `null`. |
| `closeButton` | `boolean` | `false` | Whether to show a close button. |
| `id` | `string\|null` | `null` | Stable ID for deduplication. Auto-generated when `null`. |
| `action` | `array\|null` | `null` | Action link with `label` and `url` keys. |
# Spinner
An indicator that can be used to show a loading state.
```twig
Processing payment...$100.00
```
## Installation
```shell
php bin/console ux:install spinner --kit shadcn
```
## Usage
```twig
Please wait
```
## Examples
### Size
Use the `size-*` utility class to change the size of the spinner.
```twig
```
### Button
Add a spinner to a button to indicate a loading state. Place the `Spinner` before the label with `data-icon="inline-start"` for a start position, or after the label with `data-icon="inline-end"` for an end position.
```twig
Loading...
Please wait
Processing
```
### Badge
Add a spinner to a badge to indicate a loading state. Place the `Spinner` before the label with `data-icon="inline-start"` for a start position, or after the label with `data-icon="inline-end"` for an end position.
```twig
Syncing
Updating
Processing
```
### Input Group
```twig
Validating...
Send
```
### Empty
```twig
Processing your requestPlease wait while we process your request. Do not refresh the page.Cancel
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
جاري معالجة الدفع...١٠٠.٠٠ دولار
{# Hebrew #}
מעבד תשלום...$100.00
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `label` | `string` | `'Loading'` | The accessible label announced to assistive technologies. |
# Switch
A control that allows the user to toggle between checked and not checked.
```twig
Airplane Mode
```
## Installation
```shell
php bin/console ux:install switch --kit shadcn
```
## Usage
```twig
```
## Examples
### Description
```twig
Share across devicesFocus is shared across devices, and turns off when you leave the app.
```
### Choice Card
Card-style selection where `Field:Label` wraps the entire `Field` for a clickable card pattern.
```twig
Share across devicesFocus is shared across devices, and turns off when you leave the app.Enable notificationsReceive notifications when focus mode is enabled or disabled.
```
### Disabled
Add the `disabled` prop to the `Switch` to disable it. Add the `data-disabled` prop to the `Field` for styling.
```twig
Disabled
```
### Invalid
Add `aria-invalid="true"` to the `Switch` to indicate an invalid state. Add `data-invalid` to the `Field` for styling.
```twig
Accept terms and conditionsYou must accept the terms and conditions to continue.
```
### Size
Use the `size` prop to change the size of the switch.
```twig
SmallDefault
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
المشاركة عبر الأجهزةيتم مشاركة التركيز عبر الأجهزة، ويتم إيقاف تشغيله عند مغادرة التطبيق.שיתוף בין מכשיריםהמיקוד משותף בין מכשירים, וכבה כשאתה עוזב את התוכנה.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `size` | `'default'\|'sm'` | `'default'` | The switch size. |
| `checked` | `boolean` | `false` | Whether the switch is initially checked. |
# Table
A responsive table component.
```twig
{%- set invoices = [
{invoice: 'INV001', paymentStatus: 'Paid', totalAmount: '$250.00', paymentMethod: 'Credit Card'},
{invoice: 'INV002', paymentStatus: 'Pending', totalAmount: '$150.00', paymentMethod: 'PayPal'},
{invoice: 'INV003', paymentStatus: 'Unpaid', totalAmount: '$350.00', paymentMethod: 'Bank Transfer'},
{invoice: 'INV004', paymentStatus: 'Paid', totalAmount: '$450.00', paymentMethod: 'Credit Card'},
{invoice: 'INV005', paymentStatus: 'Paid', totalAmount: '$550.00', paymentMethod: 'PayPal'},
{invoice: 'INV006', paymentStatus: 'Pending', totalAmount: '$200.00', paymentMethod: 'Bank Transfer'},
{invoice: 'INV007', paymentStatus: 'Unpaid', totalAmount: '$300.00', paymentMethod: 'Credit Card'},
] -%}
A list of your recent invoices.InvoiceStatusMethodAmount
{% for invoice in invoices %}
{{ invoice.invoice }}{{ invoice.paymentStatus }}{{ invoice.paymentMethod }}{{ invoice.totalAmount }}
{% endfor %}
Total$2,500.00
```
## Installation
```shell
php bin/console ux:install table --kit shadcn
```
## Usage
```twig
A list of your recent invoices.InvoiceStatusMethodAmountINV001PaidCredit Card$250.00
```
## Examples
### Footer
Use the `TableFooter` component to add a footer to the table.
```twig
{%- set invoices = [
{invoice: 'INV001', paymentStatus: 'Paid', totalAmount: '$250.00', paymentMethod: 'Credit Card'},
{invoice: 'INV002', paymentStatus: 'Pending', totalAmount: '$150.00', paymentMethod: 'PayPal'},
{invoice: 'INV003', paymentStatus: 'Unpaid', totalAmount: '$350.00', paymentMethod: 'Bank Transfer'},
] -%}
A list of your recent invoices.InvoiceStatusMethodAmount
{% for invoice in invoices %}
{{ invoice.invoice }}{{ invoice.paymentStatus }}{{ invoice.paymentMethod }}{{ invoice.totalAmount }}
{% endfor %}
Total$2,500.00
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
قائمة بفواتيرك الأخيرة.الفاتورةالحالةالطريقةالمبلغINV001مدفوعبطاقة ائتمانية$250.00INV002قيد الانتظارPayPal$150.00INV003غير مدفوعتحويل بنكي$350.00المجموع$2,500.00
{# Hebrew #}
רשימת החשבוניות האחרונות שלך.חשבוניתסטטוסשיטהסכוםINV001שולםכרטיס אשראי$250.00INV002ממתיןPayPal$150.00INV003לא שולםהעברה בנקאית$350.00סה"כ$2,500.00
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The table structure, typically includes `Table:Header`, `Table:Body`, and optionally `Table:Footer`. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The table body rows, typically `Table:Row` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The table caption text. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The cell content. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The table footer rows, typically `Table:Row` components. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header cell content. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The header row(s), typically a `Table:Row` with `Table:Head` cells. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The row cells, typically `Table:Cell` or `Table:Head` components. |
# Tabs
A set of layered sections of content—known as tab panels—that are displayed one at a time.
```twig
OverviewAnalyticsReportsSettingsOverview
View your key metrics and recent project activity. Track progress
across all your active projects.
You have 12 active projects and 3 pending tasks.
Analytics
Track performance and user engagement metrics. Monitor trends and
identify growth opportunities.
Page views are up 25% compared to last month.
Reports
Generate and download your detailed reports. Export data in
multiple formats for analysis.
You have 5 reports ready and available to export.
Settings
Manage your account preferences and options. Customize your
experience to fit your needs.
Configure notifications, security, and themes.
```
## Installation
```shell
php bin/console ux:install tabs --kit shadcn
```
## Usage
```twig
AccountPasswordMake changes to your account here.Change your password here.
```
## Examples
### Line
Use the `variant="line"` prop on `Tabs:List` for a line style.
```twig
OverviewAnalyticsReports
```
### Vertical
Use `orientation="vertical"` for vertical tabs.
```twig
AccountPasswordNotifications
```
### Disabled
```twig
Home
Disabled
```
### Icons
```twig
Preview
Code
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
نظرة عامةالتحليلاتالتقاريرالإعداداتنظرة عامة
عرض مقاييسك الرئيسية وأنشطة المشروع الأخيرة. تتبع التقدم عبر جميع مشاريعك النشطة.
لديك ١٢ مشروعًا نشطًا و٣ مهام معلقة.
التحليلات
تتبع مقاييس الأداء ومشاركة المستخدمين. راقب الاتجاهات وحدد فرص النمو.
زادت مشاهدات الصفحة بنسبة ٢٥٪ مقارنة بالشهر الماضي.
التقارير
إنشاء وتنزيل تقاريرك التفصيلية. تصدير البيانات بتنسيقات متعددة للتحليل.
لديك ٥ تقارير جاهزة ومتاحة للتصدير.
الإعدادات
إدارة تفضيلات حسابك وخياراته. تخصيص تجربتك لتناسب احتياجاتك.
تكوين الإشعارات والأمان والسمات.
{# Hebrew #}
סקירה כלליתאנליטיקהדוחותהגדרותסקירה כללית
הצג את המדדים העיקריים שלך ואת הנתונים האחרונים. עקוב אחר ההתקדמות בכל המיזמים.
יש לך 12 מיזמים נגישים ו-3 משימות ממתינות.
אנליטיקה
עקוב אחר ביצועים ומדדי מעורבות משתמשים. זהה מגמות והזדמנויות צמיחה.
הגידול עמד על 25% בהשוואה לחודש שעבר.
דוחות
צור והורד את הדוחות המלאים שלך. ייצא נתונים בתבניות שונות לניתוח.
יש לך 5 דוחות מוכנים וזמינים לייצוא.
הגדרות
ערוך את הגדרות החשבון שלך. התאם אישית את החוויה כך שתתאים לצרכיך.
הגדר התראות, אבטחה וערכות נושא.
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `defaultValue` | `string` | `''` | Define the open Tabs at initial rendering. |
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | Define the visual orientation. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `string` | - | Unique suffix identifier for generating Tabs internal IDs. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'line'` | `'default'` | The visual style variant. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `value` | `string` | - | Unique suffix identifier for generating Tabs internal IDs. |
| Block | Description |
|:------|:------------|
| `content` | The default block. |
# Textarea
Displays a form textarea or a component that looks like a textarea.
```twig
```
## Installation
```shell
php bin/console ux:install textarea --kit shadcn
```
## Usage
```twig
```
## Examples
### Field
Use `Field`, `Field:Label`, and `Field:Description` to create a textarea with a label and description.
```twig
MessageEnter your message below.
```
### Disabled
Use the `disabled` attribute to disable the textarea. To style the disabled state, add the `data-disabled` attribute to the `Field` component.
```twig
Message
```
### Invalid
Use the `aria-invalid` attribute to mark the textarea as invalid. To style the invalid state, add the `data-invalid` attribute to the `Field` component.
```twig
MessagePlease enter a valid message.
```
### Button
Pair with `Button` to create a textarea with a submit button.
```twig
Send message
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
التعليقاتشاركنا أفكارك حول خدمتنا.
{# Hebrew #}
משובשתף את מחשבותיך על השירות שלנו.
```
## API Reference
### ``
| Block | Description |
|:------|:------------|
| `content` | The initial textarea value. |
# Toggle Group
A set of two-state buttons that can be toggled on or off.
```twig
```
## Installation
```shell
php bin/console ux:install toggle-group --kit shadcn
```
## Usage
```twig
ABC
```
## Examples
### Outline
```twig
AllMissed
```
### Size
```twig
TopBottomLeftRightTopBottomLeftRight
```
### Spacing
```twig
TopBottomLeftRight
```
### Vertical
```twig
```
### Disabled
```twig
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'outline'` | `'default'` | The visual style variant. |
| `size` | `'default'\|'sm'\|'lg'` | `'default'` | The toggle group size. |
| `type` | `'single'\|'multiple'` | `'multiple'` | Whether only one or multiple items can be active. |
| `spacing` | `number` | `2` | Gap between toggle group items. |
| `orientation` | `'horizontal'\|'vertical'` | `'horizontal'` | The layout direction. |
| `disabled` | `boolean` | `false` | Whether all items in the group are disabled. |
| Block | Description |
|:------|:------------|
| `content` | The toggle items, typically multiple `ToggleGroup:Item` components. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `pressed` | `boolean` | `false` | Whether the item is initially pressed. |
| Block | Description |
|:------|:------------|
| `content` | The toggle item label and/or icon. |
# Toggle
A two-state button that can be either on or off.
```twig
Bookmark
```
## Installation
```shell
php bin/console ux:install toggle --kit shadcn
```
## Usage
```twig
Toggle
```
## Examples
### Outline
Use `variant="outline"` for an outline style.
```twig
Italic
Bold
```
### With Text
```twig
Italic
```
### Size
Use the `size` prop to change the size of the toggle.
```twig
Small
Default
Large
```
### Disabled
```twig
Disabled
Disabled
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
إشارة مرجعية
{# Hebrew #}
סימנייה
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `variant` | `'default'\|'outline'` | `'default'` | The visual style variant. |
| `size` | `'default'\|'sm'\|'lg'` | `'default'` | The toggle size. |
| `pressed` | `boolean` | `false` | Whether the toggle is initially pressed. |
| Block | Description |
|:------|:------------|
| `content` | The toggle label and/or icon. |
# Tooltip
A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
```twig
Hover
```
## Examples
### Side
Use the `side` prop to change the position of the tooltip.
```twig
{% for side in ['left', 'top', 'bottom', 'right'] %}
{{ side|capitalize }}
Add to library
{% endfor %}
```
### With Keyboard Shortcut
```twig
Save Changes S
```
### Disabled Button
Show a tooltip on a disabled button by wrapping it with a span.
```twig
Disabled
This feature is currently unavailable
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
{# Arabic #}
{% for side, label in {left: 'يسار', top: 'أعلى', bottom: 'أسفل', right: 'يمين'} %}
{{ label }}
إضافة إلى المكتبة
{% endfor %}
```
## API Reference
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `id` | `string` | - | Unique identifier for the tooltip. |
| `delayDuration` | `number` | `0` | Delay in milliseconds before showing the tooltip. |
| Block | Description |
|:------|:------------|
| `content` | The tooltip structure, typically includes `Tooltip:Trigger` and `Tooltip:Content`. |
### ``
| Prop | Type | Default | Description |
|:-----|:-----|:--------|:------------|
| `side` | `'top'\|'right'\|'bottom'\|'left'` | `'top'` | The preferred side to display the tooltip. |
| `sideOffset` | `number` | `0` | The distance in pixels from the trigger. |
| Block | Description |
|:------|:------------|
| `content` | The tooltip text or content. |
### ``
| Block | Description |
|:------|:------------|
| `content` | The element that triggers the tooltip on hover/focus. |
# Typography
Styled HTML text elements for headings, paragraphs, quotes, lists and inline code.
```twig
Taxing Laughter: The Joke Tax Chronicles
Once upon a time, in a far-off land, there was a very lazy king who spent all day lounging on his throne. One day, his advisors came to him with a problem: the kingdom was running out of money.
The King's Plan
The king thought long and hard, and finally came up with a brilliant plan: he would tax the jokes in the kingdom.
"After all," he said, "everyone enjoys a good joke, so it's only fair that they should pay for the privilege."
The Joke Tax
The king's subjects were not amused. They grumbled and complained, but the king was firm:
1st level of puns: 5 gold coins
2nd level of jokes: 10 gold coins
3rd level of one-liners : 20 gold coins
As a result, people stopped telling jokes, and the kingdom fell into a gloom. But there was one person who refused to let the king's foolishness get him down: a court jester named Jokester.
Jokester's Revolt
Jokester began sneaking into the castle in the middle of the night and leaving jokes all over the place: under the king's pillow, in his soup, even in the royal toilet. The king was furious, but he couldn't seem to stop Jokester.
And then, one day, the people of the kingdom discovered that the jokes left by Jokester were so funny that they couldn't help but laugh. And once they started laughing, they couldn't stop.
The People's Rebellion
The people of the kingdom, feeling uplifted by the laughter, started to tell jokes and puns again, and soon the entire kingdom was in on the joke.
King's Treasury
People's happiness
Empty
Overflowing
Modest
Satisfied
Full
Ecstatic
The king, seeing how much happier his subjects were, realized the error of his ways and repealed the joke tax. Jokester was declared a hero, and the kingdom lived happily ever after.
The moral of the story is: never underestimate the power of a good laugh and always be careful of bad ideas.
```
## Installation
```shell
php bin/console ux:install typography --kit shadcn
```
## Usage
```twig
The Joke Tax Chronicles
Once upon a time, in a far-off land, there was a very lazy king who spent all day lounging on his throne.
```
## Examples
### H1
```twig
Taxing Laughter: The Joke Tax Chronicles
```
### H2
```twig
The People of the Kingdom
```
### H3
```twig
The Joke Tax
```
### H4
```twig
People stopped telling jokes
```
### Paragraph
```twig
The king, seeing how much happier his subjects were, realized the error of his ways and repealed the joke tax.
```
### Blockquote
```twig
"After all," he said, "everyone enjoys a good joke, so it's only fair that they should pay for the privilege."
```
### Table
```twig
King's Treasury
People's happiness
Empty
Overflowing
Modest
Satisfied
Full
Ecstatic
```
### List
```twig
1st level of puns: 5 gold coins
2nd level of jokes: 10 gold coins
3rd level of one-liners : 20 gold coins
```
### Inline Code
```twig
@radix-ui/react-alert-dialog
```
### Lead
```twig
A modal dialog that interrupts the user with important content and expects a response.
```
### Large
```twig
Are you absolutely sure?
```
### Small
```twig
Email address
```
### Muted
```twig
Enter your email address.
```
### RTL
To enable RTL support, set the `dir="rtl"` attribute on the root element.
```twig
فرض الضرائب على الضحك: سجلات ضريبة النكتة
في قديم الزمان، في أرض بعيدة، كان هناك ملك كسول جداً يقضي يومه كله مستلقياً على عرشه. في أحد الأيام، جاءه مستشاروه بمشكلة: المملكة كانت تنفد من المال.
خطة الملك
فكر الملك طويلاً وبجد، وأخيراً توصل إلى خطة عبقرية: سيفرض ضريبة على النكات في المملكة.
"في النهاية،" قال، "الجميع يستمتع بنكتة جيدة، لذا من العدل أن يدفعوا مقابل هذا الامتياز."
ضريبة النكتة
لم يكن رعايا الملك سعداء. تذمروا واشتكوا، لكن الملك كان حازماً:
المستوى الأول من التورية: 5 قطع ذهبية
المستوى الثاني من النكات: 10 قطع ذهبية
المستوى الثالث من النكات القصيرة: 20 قطعة ذهبية
نتيجة لذلك، توقف الناس عن رواية النكات، وغرقت المملكة في الكآبة. لكن كان هناك شخص واحد رفض أن تحبطه حماقة الملك: مهرج البلاط المسمى المازح.
ثورة المازح
بدأ المازح يتسلل إلى القلعة في منتصف الليل ويترك النكات في كل مكان: تحت وسادة الملك، في حسائه، حتى في المرحاض الملكي. كان الملك غاضباً، لكنه لم يستطع إيقاف المازح.
وبعد ذلك، في يوم من الأيام، اكتشف سكان المملكة أن النكات التي تركها المازح كانت مضحكة جداً لدرجة أنهم لم يستطيعوا منع أنفسهم من الضحك. وبمجرد أن بدأوا بالضحك، لم يستطيعوا التوقف.
ثورة الشعب
شعر سكان المملكة بالبهجة من الضحك، وبدأوا في رواية النكات والتورية مرة أخرى، وسرعان ما أصبحت المملكة بأكملها جزءاً من النكتة.
خزينة الملك
سعادة الشعب
فارغة
فائضة
متواضعة
راضٍ
ممتلئة
منتشٍ
الملك، عندما رأى مدى سعادة رعاياه، أدرك خطأ طرقه وألغى ضريبة النكتة. أُعلن المازح بطلاً، وعاشت المملكة في سعادة دائمة.
مغزى القصة هو: لا تستهن أبداً بقوة الضحك الجيد وكن دائماً حذراً من الأفكار السيئة.
```
```twig
מיסוי הצחוק: כרוניקות מס הבדיחה
היה היה פעם, בארץ רחוקה, מלך עצלן מאוד שבילה את כל היום בהתרווחות על כס מלכותו. יום אחד, יועציו באו אליו עם בעיה: הממלכה נגמר לה הכסף.
התוכנית של המלך
המלך חשב ארוכות וקשות, ולבסוף העלה תוכנית גאונית: הוא ימסה את הבדיחות בממלכה.
"אחרי הכל," אמר, "כולם נהנים מבדיחה טובה, אז זה רק הוגן שישלמו על הזכות הזו."
מס הבדיחה
נתיני המלך לא היו מרוצים. הם התלוננו והתרעמו, אבל המלך היה נחוש:
רמה ראשונה של משחקי מילים: 5 מטבעות זהב
רמה שנייה של בדיחות: 10 מטבעות זהב
רמה שלישית של חידודים: 20 מטבעות זהב
כתוצאה מכך, אנשים הפסיקו לספר בדיחות, והממלכה שקעה בעצב. אבל היה אדם אחד שסירב לתת לטיפשות המלך להפיל אותו: ליצן חצר בשם הבדחן.
המרד של הבדחן
הבדחן התחיל להתגנב לטירה באמצע הלילה ולהשאיר בדיחות בכל מקום: מתחת לכרית המלך, במרק שלו, אפילו בשירותים המלכותיים. המלך היה זועם, אבל הוא לא הצליח לעצור את הבדחן.
ואז, יום אחד, תושבי הממלכה גילו שהבדיחות שהבדחן השאיר היו כל כך מצחיקות שהם לא יכלו להתאפק מלצחוק. וברגע שהתחילו לצחוק, הם לא יכלו להפסיק.
המרד של העם
תושבי הממלכה, שהרגישו מרוממים מהצחוק, התחילו לספר בדיחות ומשחקי מילים שוב, ובקרוב כל הממלכה הייתה חלק מהבדיחה.
אוצר המלך
אושר העם
ריק
גדוש
צנוע
מרוצה
מלא
אקסטטי
המלך, כשראה כמה מאושרים נתיניו, הבין את טעותו וביטל את מס הבדיחה. הבדחן הוכרז כגיבור, והממלכה חיה באושר לנצח.
המוסר של הסיפור הוא: לעולם אל תזלזל בכוח של צחוק טוב ותמיד היזהר מרעיונות רעים.
```
## Installation
```shell
php bin/console ux:install login-02 --kit shadcn
```
# Symfony UX
> Symfony UX is a collection of PHP and JavaScript packages to add rich UI experiences to Symfony applications. This site provides demos, installation guides, and a cookbook. For full documentation, see the official Symfony docs.
## Packages
- [Autocomplete](https://ux.symfony.com/autocomplete.md): Ajax-powered Form Select
- [CalendarLink](https://ux.symfony.com/calendar-link.md): Save the date, anywhere
- [Chart.js](https://ux.symfony.com/chartjs.md): Interactive charts with Chart.js
- [Icons](https://ux.symfony.com/icons.md): SVG icons made easy
- [Image Cropper](https://ux.symfony.com/cropperjs.md): Form Tools for cropping images
- [Live Components](https://ux.symfony.com/live-component.md): Interactive UI in PHP & Twig
- [Map](https://ux.symfony.com/map.md): Interactive Maps
- [Native](https://ux.symfony.com/native.md): Hotwire Native for Symfony
- [Notify](https://ux.symfony.com/notify.md): Native Browser Notifications
- [React](https://ux.symfony.com/react.md): Render React components from Twig
- [Stimulus](https://ux.symfony.com/stimulus.md): Central Bridge of Symfony UX
- [Stylized Dropzone](https://ux.symfony.com/dropzone.md): Upload Files with Style
- [Toolkit](https://ux.symfony.com/toolkit.md): Build your Design System.
- [Translator](https://ux.symfony.com/translator.md): Symfony Translations in JavaScript
- [Turbo](https://ux.symfony.com/turbo.md): Single-page Symfony app
- [Twig Components](https://ux.symfony.com/twig-component.md): Render Reusable UI Elements
- [Vue.js](https://ux.symfony.com/vue.md): Render Vue components from Twig
## Demos
- [Live Component Demos](https://ux.symfony.com/demos.md): Interactive demos showcasing Symfony UX Live Components
## Cookbook
- [Component Architecture](https://ux.symfony.com/cookbook/component-architecture.md): Rules and patterns for working with components
## Changelog
- [Changelog](https://ux.symfony.com/changelog.md): Recent releases and changes
## Toolkit
- [accordion (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/accordion.md): Build vertically collapsing sections powered by Bootstrap's Collapse plugin.
- [alert (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/alert.md): Provides contextual feedback messages for typical user actions.
- [badge (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/badge.md): A small count or label used to highlight status, counts, or short contextual information.
- [breadcrumb (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/breadcrumb.md): Indicates the current page's location within a navigational hierarchy.
- [button-group (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/button-group.md): Groups a series of buttons on a single line or in a vertical column.
- [button (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/button.md): Use Bootstrap button styles for actions in forms, dialogs, navigation, and more.
- [card (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/card.md): Build flexible content containers with optional headers, footers, images, and contextual styles.
- [carousel (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/carousel.md): Cycle through images, text, and other content with optional controls and indicators.
- [close-button (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/close-button.md): Provide an accessible control for dismissing content such as modals and alerts.
- [collapse (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/collapse.md): Toggle the visibility of content with Bootstrap's Collapse plugin.
- [dropdown (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/dropdown.md): Display contextual menus from buttons and links in any Bootstrap direction.
- [figure (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/figure.md): Display related visual content with an optional caption and responsive alignment.
- [list-group (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/list-group.md): Display a flexible series of content with active, disabled, actionable, and contextual states.
- [modal (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/modal.md): Add accessible dialog overlays for notifications, forms, and custom content.
- [navbar (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/navbar.md): A powerful, responsive navigation header with support for branding, navigation, forms, and collapsing content.
- [navs-tabs (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/navs-tabs.md): Build navigation components and accessible dynamic tabbed interfaces with Bootstrap.
- [offcanvas (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/offcanvas.md): Build responsive sliding panels for navigation, forms, and supplementary content.
- [pagination (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/pagination.md): Indicate that related content is split across multiple pages with accessible pagination links.
- [placeholder (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/placeholder.md): Uses loading placeholders to indicate that content may still be loading.
- [popover (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/popover.md): Display contextual Bootstrap content beside a trigger element.
- [progress (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/progress.md): Display task progress with accessible labels, stacked bars, contextual colors, and animation.
- [scrollspy (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/scrollspy.md): Update Bootstrap navigation links as a scrollable region moves between sections.
- [spinner (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/spinner.md): Indicate the loading state of a component or page with Bootstrap spinners.
- [toast (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/toast.md): Show lightweight Bootstrap notifications with optional headers and dismissal controls.
- [tooltip (Bootstrap)](https://ux.symfony.com/toolkit/kits/bootstrap/components/tooltip.md): Add Bootstrap tooltips to focusable controls with configurable content and placement.
- [clipboard (Common)](https://ux.symfony.com/toolkit/kits/common/components/clipboard.md): A Stimulus behavior that copies text to the clipboard — either a value you give it or the content of an element — with optional copied feedback.
- [closeable (Common)](https://ux.symfony.com/toolkit/kits/common/components/closeable.md): A Stimulus behavior that removes its element from the page when dismissed, with optional delayed and automatic closing and an animated countdown bar.
- [logout-link (Common)](https://ux.symfony.com/toolkit/kits/common/components/logout-link.md): A link that logs the current user out through a secure POST form.
- [post-link (Common)](https://ux.symfony.com/toolkit/kits/common/components/post-link.md): A link submitted as a form, with optional HTTP method spoofing, CSRF protection, and a confirmation prompt.
- [tooltip (Common)](https://ux.symfony.com/toolkit/kits/common/components/tooltip.md): A Stimulus behavior that shows a tooltip from a `content` value — or straight from an element's native `title`. Powered by [Floating UI](https://floating-ui.com/): the tooltip is rendered outside the trigger (appended to ``), so it's never clipped by an `overflow` ancestor, and it flips and shifts to stay in view. Put it right on the trigger — it opens on hover and keyboard focus by default — and style the injected `.tooltip` once, globally.
- [alert (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/alert.md): The alert component can be used to provide information to your users such as success or error messages, but also highlighted information complementing the normal flow of paragraphs and headers on a page.
- [avatar (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/avatar.md): Use the avatar component to show a visual representation of a user profile using an image element or SVG object based on multiple styles and sizes
- [badge (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/badge.md): The badge component can be used to complement other elements such as buttons or text elements as a label or to show the count of a given data, such as the number of comments for an article or how much time has passed by since a comment has been made.
- [button-group (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/button-group.md): The button group component from Flowbite can be used to stack together multiple buttons and links inside a single element.
- [button (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/button.md): Use the button component inside forms, as links, social login, payment options with support for multiple styles, colors, sizes, gradients, and shadows
- [card (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/card.md): Use these responsive card components to show data entries and information to your users in multiple forms and contexts such as for your blog, application, user profiles, and more.
- [checkbox (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/checkbox.md): The checkbox component can be used to receive one or more selected options from the user in the form of a square box available in multiple styles, sizes, colors, and variants coded with the utility classes from Tailwind CSS and with support for dark mode.
- [dropdown (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/dropdown.md): The dropdown component can be used to show a list of menu items when clicking on an element such as a button and hiding it when focusing outside of the triggering element.
- [indicator (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/indicator.md): Use the indicator component to show a number count, account status, or as a loading label positioned relative to the parent component coded with Tailwind CSS
- [input (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/input.md): The input field is an important part of the form element that can be used to create interactive controls to accept data from the user based on multiple input types, such as text, email, number, password, URL, phone number, and more.
- [kbd (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/kbd.md): The KBD (Keyboard) component can be used to indicate a textual user input from the keyboard inside other elements such as in text, tables, cards, and more.
- [label (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/label.md): A text element that identifies form controls and other content.
- [modal (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/modal.md): Use the modal component to show interactive dialogs and notifications to your website users available in multiple sizes, colors, and styles
- [pagination (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/pagination.md): Use the Tailwind CSS pagination element to indicate a series of content across various pages based on multiple styles and sizes
- [radio (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/radio.md): The radio component can be used to allow the user to choose a single option from one or more available options coded with the utility classes from Tailwind CSS and available in multiple styles, variants, and colors and support dark mode.
- [select (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/select.md): Get started with the select component to allow the user to choose from one or more options from a dropdown list based on multiple styles, sizes, and variants
- [skeleton (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/skeleton.md): Use the skeleton component to indicate a loading status with placeholder elements that look very similar to the type of content that is being loaded such as paragraphs, heading, images, videos, and more.
- [spinner (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/spinner.md): An indicator that can be used to show a loading state.
- [table (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/table.md): Use the table component to show text, images, links, and other elements inside a structured set of data made up of rows and columns of table cells
- [tabs (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/tabs.md): Use the following default tabs component example to show a list of links that the user can navigate from on your website.
- [textarea (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/textarea.md): The textarea component is a multi-line text field input that can be used to receive longer chunks of text from the user in the form of a comment box, description field, and more.
- [toggle (Flowbite v4)](https://ux.symfony.com/toolkit/kits/flowbite-4/components/toggle.md): Use the toggle component to switch between a binary state of true or false using a single click available in multiple sizes, variants, and colors
- [accordion (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/accordion.md): A vertically stacked set of interactive headings that each reveal a section of content.
- [alert-dialog (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/alert-dialog.md): A modal dialog that interrupts the user with important content and expects a response.
- [alert (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/alert.md): Displays a callout for user attention.
- [aspect-ratio (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/aspect-ratio.md): Displays content within a desired ratio.
- [avatar (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/avatar.md): An image element with a fallback for representing the user.
- [badge (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/badge.md): Displays a badge or a component that looks like a badge.
- [breadcrumb (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/breadcrumb.md): Displays the path to the current resource using a hierarchy of links.
- [button-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/button-group.md): A container that groups related buttons together with consistent styling.
- [button (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/button.md): Displays a button or a component that looks like a button.
- [card (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/card.md): Displays a card with header, content, and footer.
- [checkbox (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/checkbox.md): A control that allows the user to toggle between checked and not checked.
- [collapsible (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/collapsible.md): An interactive component which expands/collapses a panel.
- [combobox (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/combobox.md): Autocomplete input and command palette with a list of suggestions.
- [dialog (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/dialog.md): A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.
- [empty (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/empty.md): Use the Empty component to display an empty state.
- [field (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/field.md): Combine labels, controls, and help text to compose accessible form fields and grouped inputs.
- [hover-card (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/hover-card.md): For sighted users to preview content available behind a link.
- [input-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/input-group.md): Add addons, buttons, and helper content to inputs.
- [input (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/input.md): A text input component for forms and user data entry with built-in styling and accessibility features.
- [item (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/item.md): A versatile component for displaying content with media, title, description, and actions.
- [kbd (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/kbd.md): Used to display textual user input from keyboard.
- [label (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/label.md): Renders an accessible label associated with controls.
- [pagination (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/pagination.md): Pagination with page navigation, next and previous links.
- [progress (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/progress.md): Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.
- [radio-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/radio-group.md): A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.
- [resizable (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/resizable.md): Accessible resizable panel groups and layouts with keyboard support.
- [select (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/select.md): A dropdown control that allows users to choose from a list of options.
- [separator (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/separator.md): Visually or semantically separates content.
- [skeleton (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/skeleton.md): Use to show a placeholder while content is loading.
- [sonner (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/sonner.md): A Sonner-style stacked toast notification system with auto-dismiss, swipe-to-dismiss, rich colors, and JS or server-render support.
- [spinner (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/spinner.md): An indicator that can be used to show a loading state.
- [switch (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/switch.md): A control that allows the user to toggle between checked and not checked.
- [table (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/table.md): A responsive table component.
- [tabs (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/tabs.md): A set of layered sections of content—known as tab panels—that are displayed one at a time.
- [textarea (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/textarea.md): Displays a form textarea or a component that looks like a textarea.
- [toggle-group (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/toggle-group.md): A set of two-state buttons that can be toggled on or off.
- [toggle (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/toggle.md): A two-state button that can be either on or off.
- [tooltip (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/tooltip.md): A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
- [typography (Shadcn UI)](https://ux.symfony.com/toolkit/kits/shadcn/components/typography.md): Styled HTML text elements for headings, paragraphs, quotes, lists and inline code.
## Optional
- [Official Symfony UX Documentation](https://symfony.com/bundles/ux): Full reference documentation for all Symfony UX packages
- [Symfony UX GitHub Repository](https://github.com/symfony/ux): Source code and issue tracker