# Lumiose UI > `@lumiose/ui`: accessible, unstyled UI primitives built on native elements (``, popover, invoker commands, CSS anchor positioning), server-rendered without hydration. Style them with your own CSS or the optional default theme. These docs ship in `@lumiose/ui` and match the installed version: `node_modules/@lumiose/ui/docs`. In a project that depends on it, `lumiose docs ui` prints the index and `lumiose docs dialog` a component's page; the Lumiose MCP server's `ui_components` tool lists every component's parts, props, events and styling hooks. The Lumiose docs: `node_modules/lumiose/docs/llms.txt`. ## Overview - [UI components](/ui/): `@lumiose/ui`: accessible, unstyled UI primitives built on native elements (``, popover, invoker commands, CSS anchor positioning), server-rendered without hydration. Style them with your own CSS or the optional default theme. - [Installation](/ui/installation/): Add `@lumiose/ui` to a Lumiose app and import its stylesheets, and the default theme if you want its look. The components then render in server HTML, without an island, and a page loads only the small scripts of the components it renders. - [Theming](/ui/theming/): `@lumiose/ui` is unstyled: its stylesheets hold only what the components need to work. The optional default theme gives them a look, light and dark, through `--lu-` custom properties you can change; or style the parts with your own CSS. - [Virtualizer](/ui/virtualizer/): A headless virtualizer for long lists, tables and grids in islands: `createVirtualizer()` computes which rows are near the viewport and where they go, and your component renders, places and styles them. The window or an element scrolls; rows have a fixed or an estimated size, or are measured as they render (one ResizeObserver for all of them); grids fit their columns to the container's width. The server renders the first items, and the island takes those same keyed rows over. 1.6 kB brotli, no script and no CSS of its own. For a list, a grid of cells or a table, start with Virtual List, Virtual Grid or Virtual Table, which run on it. ## Components - [Accordion](/ui/accordion/): A stack of items whose triggers show and hide their panels, after the WAI-ARIA accordion pattern: each item is a native `
`, one open at a time through the browser's exclusive group (`name`) or several, so it works in server HTML with no JavaScript and find-in-page opens the item it lands in. ``, a 1 kB light-DOM element, adds the arrow keys and Base UI's animation hooks. `bind:value` (or `value` and `onValueChange`) keeps a signal in sync. - [Autocomplete](/ui/autocomplete/): A text input with suggestions, for text that may be anything (a search, a tag, an address): the WAI-ARIA combobox pattern with list autocomplete, after Base UI's Autocomplete. Unlike a Combobox, the text is the value: the input has the name and submits what is typed, and choosing a suggestion only fills it in. It runs on the Combobox's element (``, 5.8 kB) and parts, on server-rendered pages and in islands; `bind:value` keeps a signal in sync. Filtering, inline completion, groups, an empty state and a status. - [Avatar](/ui/avatar/): A person's picture with a fallback, such as their initials, after Base UI's Avatar: the image loads in the server HTML and shows once it has loaded, the fallback shows until then, after an optional delay, and when the image fails. Both sit in one cell, so neither moves the other. A 0.5 kB script follows the image's loading status; without JavaScript an avatar with an image shows the image alone. - [Button](/ui/button/): A native `