# astryx-vue > A community Vue 3 implementation of the Astryx design system: 245 documented components, themes, and an agent-friendly CLI. Every link below is the plain Markdown version of a page. Add `.md` to any page URL to get the same text. The whole documentation in one file: [llms-full.txt](https://astryx-vue.pages.dev/llms-full.txt). ## Guide - [Introduction](https://astryx-vue.pages.dev/en/guide/why.md): astryx-vue is an open-source Vue 3 reimplementation of Meta's Astryx design language. The upstream documentation is located at … - [Principles](https://astryx-vue.pages.dev/en/guide/principles.md): Every decision in this library follows from four sentences. - [Quick start](https://astryx-vue.pages.dev/en/guide/getting-started.md): Install the components and the theme. The peer dependency is Vue ^3.5.0. - [Installation](https://astryx-vue.pages.dev/en/guide/installation.md): @astryx-vue/core peers on vue: ^3.5.0. The theme package depends on @fontsource/figtree and @fontsource/jetbrains-mono for the body and monospace faces. Both… - [CLI](https://astryx-vue.pages.dev/en/guide/cli.md): @astryx-vue/cli looks up astryx-vue component docs and playground pages from the terminal, for people and for agents. The binary is astryx-vue. It is not… - [Working with AI](https://astryx-vue.pages.dev/en/guide/working-with-ai.md): An AI writing component code makes two mistakes more than any other: it guesses props, and it copies React idioms from upstream. One instruction file and one… - [Theme and styles](https://astryx-vue.pages.dev/en/guide/styling.md): An app imports two things at minimum: a theme, and structural styles for the components it uses. - [Icons](https://astryx-vue.pages.dev/en/guide/icons.md): Draw an icon with Icon and an Iconify name. You do not import a component for each glyph. - [Composables](https://astryx-vue.pages.dev/en/guide/composables.md): There is no @astryx-vue/core/composables subpath. The functions exported from packages/core/src/composables/index.ts are below. Parameters are the TypeScript… - [Patterns](https://astryx-vue.pages.dev/en/guide/patterns.md): A conversation is a composition. The transcript, bubbles, reasoning, tool calls, citations, and the composer are separate components, and the page decides how… - [Templates](https://astryx-vue.pages.dev/en/guide/templates.md): Each playground page is a starting point you can edit. Choosing one puts its source in the editor, and the preview follows the theme. Add ?template= to open a… - [Links and routers](https://astryx-vue.pages.dev/en/guide/links.md): A jump in the app is one of two things. A normal href lets the browser open the address. A route that should stay inside Vue Router, without a full page load… - [Page layout](https://astryx-vue.pages.dev/en/guide/layout.md): Build a page from the outside in. Settle the frame and how much room each region gets before you write any content. Doing it the other way round, content… - [Responsive layout](https://astryx-vue.pages.dev/en/guide/responsive.md): Decide what each region does as the width drops, then wire the components. A region can stay and get narrower, move into a layer that opens on demand, or leave… - [Accessibility](https://astryx-vue.pages.dev/en/guide/accessibility.md): Components are built around accessible names, the keyboard, and screen readers. Docs and examples do not drop the focus ring or the contrast to get a look. - [Dark mode](https://astryx-vue.pages.dev/en/guide/dark-mode.md): Neutral does not ship a separate dark stylesheet. Each color is light-dark(light, dark), and the element's color-scheme picks the stop. - [Internationalization](https://astryx-vue.pages.dev/en/guide/i18n.md): Strings that the components speak come from a message catalog. They are not hard-coded at every call site. The built-in locales are en and zh-CN. The type… - [Browser support](https://astryx-vue.pages.dev/en/guide/browser-support.md): These components solve styling and layering with what browsers ship, not with JavaScript patches. The upside is small code, good accessibility, and no extra… - [Changelog](https://astryx-vue.pages.dev/en/guide/changelog.md): The two packages publish together. This page repeats what CHANGELOG.md already records. It is not a roadmap. - [Upgrade guide](https://astryx-vue.pages.dev/en/guide/migration.md): This version matches Astryx v0.7.1. The previous version matched 0.4.1. - [Contributing](https://astryx-vue.pages.dev/en/guide/contributing.md): The repository is . Use GitHub Issues. The license is MIT. ## Themes - [Overview](https://astryx-vue.pages.dev/en/themes.md): A theme sets the color, type, radius, shadow, and motion the components use. Structural styles stay in @astryx-vue/core. - [Neutral](https://astryx-vue.pages.dev/en/themes/neutral.md): That entry loads fonts.css, then each file under neutral/ in name order, including base.css. fonts.css loads Figtree and JetBrains Mono at 400, 500, 600, 700… - [Butter](https://astryx-vue.pages.dev/en/themes/butter.md): Golden surfaces, blue accents. Outfit for text, Sarina for display sizes. - [Chocolate](https://astryx-vue.pages.dev/en/themes/chocolate.md): Warm brown and beige. Albert Sans for text, Fraunces for headings. - [Gothic](https://astryx-vue.pages.dev/en/themes/gothic.md): Dark only. Deep blue-gray surfaces stay dark when the rest of the page is light. Fustat for text, Manufacturing Consent for display sizes. - [Matcha](https://astryx-vue.pages.dev/en/themes/matcha.md): Earthy greens. DM Sans for text, Playwrite US Trad for headings. - [Stone](https://astryx-vue.pages.dev/en/themes/stone.md): Warm stone and slate. Figtree for text, Montserrat for headings. - [Y2K](https://astryx-vue.pages.dev/en/themes/y2k.md): Periwinkle, cream, and sharp corners. Poppins for text, Crimson Text for display sizes. - [Extend a theme](https://astryx-vue.pages.dev/en/themes/extending.md): @astryx-vue/themes ships Neutral, Butter, Chocolate, Gothic, Matcha, Stone, and Y2K. Each one is a CSS entry such as butter.css plus the stylesheets in that… - [Design tokens](https://astryx-vue.pages.dev/en/themes/tokens.md): A design token is a decision the system can reuse: a color, a space step, a radius, a duration. Components read tokens instead of hard-coding those numbers… - [CSS variables](https://astryx-vue.pages.dev/en/themes/css-variables.md): Themes and component styles use CSS variables and cascade layers. You do not install UnoCSS or StyleX to use them. - [Color](https://astryx-vue.pages.dev/en/themes/color.md): Neutral colors are --astryx-color-. Each one uses light-dark() for the light stop and the dark stop. In the grid below, the left chip is light and the right… - [Typography](https://astryx-vue.pages.dev/en/themes/typography.md): Two font stacks live on Neutral's semantic tokens. - [Motion](https://astryx-vue.pages.dev/en/themes/motion.md): Durations come from the Neutral motion scale. The bases are fast 125, medium 300, and slow 700. Neighbors use a 0.75 ratio, and the results are rounded to 5… - [Space, radius, shadow](https://astryx-vue.pages.dev/en/themes/scale.md): Spacing runs from --astryx-spacing-0 through --astryx-spacing-12, with 0.5 and 1.5 in between. The values are rem: --astryx-spacing-2 is 0.5rem and… ## Components - [Button](https://astryx-vue.pages.dev/en/components/button.md): Button triggers an action. Set label to name the action. - [Button Group](https://astryx-vue.pages.dev/en/components/button-group.md): Three related actions joined into a single connected control. Provide a group label for accessibility and keep all buttons the same variant so they read as one… - [Context Menu](https://astryx-vue.pages.dev/en/components/context-menu.md): ContextMenu gives one region of the interface its own actions: a right-click inside the trigger area — or the keyboard's context-menu key, or a long press on… - [Context Menu Item](https://astryx-vue.pages.dev/en/components/context-menu-item.md): Menu item component for compound mode. Re-exported from DropdownMenuItem for discoverability. - [Dropdown Menu](https://astryx-vue.pages.dev/en/components/dropdown-menu.md): DropdownMenu turns a button into the entry point for a small set of actions. The button stays quiet; the menu appears next to it when opened, closes as soon as… - [Dropdown Menu Item](https://astryx-vue.pages.dev/en/components/dropdown-menu-item.md): Helper component for custom item rendering with consistent styling. Host attributes and DOM event handlers (aria-, data-, id, drag and drop) reach the row… - [Dropdown Menu Group](https://astryx-vue.pages.dev/en/components/dropdown-menu-group.md): A titled group of rows in a compound menu. Renders role="group" named by its heading; the heading is plain text, not a menuitem, so arrow keys and typeahead… - [Dropdown Menu Divider](https://astryx-vue.pages.dev/en/components/dropdown-menu-divider.md): A horizontal rule separating groups of rows in a compound menu. Renders role="separator", so it is never a stop in the arrow-key order. The data-driven… - [Dropdown Menu Submenu](https://astryx-vue.pages.dev/en/components/dropdown-menu-submenu.md): A single menu row that reveals a nested flyout of its own items. The row adopts DropdownMenuItem semantics (label / icon / description / isDisabled); its… - [Icon Button](https://astryx-vue.pages.dev/en/components/icon-button.md): Icon fills the square the button already sizes. Leave size unset. A CSS icon class still works in the slot when your build generates it; UnoCSS is not required. - [Link](https://astryx-vue.pages.dev/en/components/link.md): Link navigates inside the app or out of it. With href it renders an anchor. Pass as to use a router link or another component; that component receives both… - [More Menu](https://astryx-vue.pages.dev/en/components/more-menu.md): MoreMenu is an overflow menu behind a ⋯ trigger. It holds the actions that do not need to stay visible: secondary actions in a table row, a card header, or a… - [Segmented Control](https://astryx-vue.pages.dev/en/components/segmented-control.md): SegmentedControl lays a small set of mutually exclusive options out in one row, with exactly one of them selected at all times. It looks like a tab bar but… - [Segmented Control Item](https://astryx-vue.pages.dev/en/components/segmented-control-item.md): Individual segment item rendering as a radio button within the segmented control. - [Toggle Button](https://astryx-vue.pages.dev/en/components/toggle-button.md): ToggleButton is a button with a pressed and an unpressed state. It stands for a lasting choice — bold text, a view mode, a favorite, a running recording —… - [Toolbar](https://astryx-vue.pages.dev/en/components/toolbar.md): Toolbar is a role="toolbar". label is required. start, center, and end are three groups. Arrow keys move focus across them, and Home and End jump to the ends… - [Toggle Button Group](https://astryx-vue.pages.dev/en/components/toggle-button-group.md): ToggleButtonGroup keeps the pressed state of its ToggleButton children. Each child needs a value. The group's v-model:value replaces that button's own pressed… - [Dropdown Menu Checkbox Item](https://astryx-vue.pages.dev/en/components/dropdown-menu-checkbox-item.md): DropdownMenuCheckboxItem is one checkable row inside a Dropdown Menu. Its role is menuitemcheckbox. It toggles its own boolean and leaves the menu open, so… - [Dropdown Menu Radio Group](https://astryx-vue.pages.dev/en/components/dropdown-menu-radio-group.md): DropdownMenuRadioGroup is a single-select set of radio rows inside a Dropdown Menu. Its role is group, and each option is a Dropdown Menu Radio Item with role… - [Dropdown Menu Radio Item](https://astryx-vue.pages.dev/en/components/dropdown-menu-radio-item.md): DropdownMenuRadioItem is one option in a Dropdown Menu Radio Group. Its role is menuitemradio. It has to sit inside that group. The group's value matches this… - [Chat](https://astryx-vue.pages.dev/en/components/chat.md): The chat display is a set of pieces that stack into a transcript: a scrolling layout, a message log, rows for each sender, bubbles, tool calls, a reasoning… - [Chat Layout](https://astryx-vue.pages.dev/en/components/chat-layout.md): ChatLayout is the layout shell for full-page chat interfaces. It renders messages in normal page flow and docks the composer to the bottom with a frosted glass… - [Chat Layout Scroll Button](https://astryx-vue.pages.dev/en/components/chat-layout-scroll-button.md): Floating scroll-to-bottom button that appears when the user scrolls away from the latest messages. It fades in as a compact icon button and expands to show a… - [Chat Message](https://astryx-vue.pages.dev/en/components/chat-message.md): Sender context wrapper: handles avatar, name, metadata, and alignment based on sender role. - [Chat Tool Calls](https://astryx-vue.pages.dev/en/components/chat-tool-calls.md): ChatToolCalls displays tool or function call invocations from an LLM response. Pass an array of calls and the component handles the rest: a single call renders… - [Chat Message List](https://astryx-vue.pages.dev/en/components/chat-message-list.md): Presentational message container with density context and infinite scroll support. Provides role="log" with aria-live="polite" for accessibility. A flex spacer… - [Chat Message Bubble](https://astryx-vue.pages.dev/en/components/chat-message-bubble.md): Styled content container for the chat "bubble." Reads sender from parent ChatMessage context to auto-style the background. Use filled for standard messages and… - [Chat System Message](https://astryx-vue.pages.dev/en/components/chat-system-message.md): Use ChatSystemMessage for concise, non-sender content inside a chat transcript. Choose the default variant for factual status notices and the divider variant… - [Chat Tokenized Text](https://astryx-vue.pages.dev/en/components/chat-tokenized-text.md): Use ChatTokenizedText inside a chat message when stored plain text contains serialized token values that should be projected as inline badges or… - [Chat Message Metadata](https://astryx-vue.pages.dev/en/components/chat-message-metadata.md): Place ChatMessageMetadata below a message or in the last ChatMessageBubble metadata slot to show a timestamp, footer content, and optional delivery status… - [Chat Composer](https://astryx-vue.pages.dev/en/components/chat-composer.md): ChatComposer is the message-entry shell for a chat surface. It coordinates a controlled or uncontrolled draft, provides a default token-capable input and… - [Chat Send Button](https://astryx-vue.pages.dev/en/components/chat-send-button.md): Use ChatSendButton as ChatComposer’s send control when the action should switch between sending and stopping. Inside ChatComposer it reads readiness, streaming… - [Chat Composer Input](https://astryx-vue.pages.dev/en/components/chat-composer-input.md): Pass ChatComposerInput to ChatComposer's input slot when the draft needs trigger menus, inline tokens, history recall, dictation insertion, or file intake. - [Chat Composer Drawer](https://astryx-vue.pages.dev/en/components/chat-composer-drawer.md): Use ChatComposerDrawer in the ChatComposer drawer slot for supplementary content such as attachments, context chips, or previews. Provide count only when… - [Chat Dictation Button](https://astryx-vue.pages.dev/en/components/chat-dictation-button.md): ChatDictationButton is a toggle button that starts and stops voice dictation inside a chat composer. It pairs with useChatDictation to show a microphone icon… - [Chat Composer Token Element](https://astryx-vue.pages.dev/en/components/chat-composer-token-element.md): Renders a single token chip outside the contentEditable input. Wraps a badge config or custom render function in the correct data-astryx-token span so the… - [Card](https://astryx-vue.pages.dev/en/components/card.md): Card is a bordered surface with a background and rounded corners, and it turns a group of content into one thing you can treat on its own. Its job is… - [Collapsible](https://astryx-vue.pages.dev/en/components/collapsible.md): Collapsible folds one content region behind a trigger: the trigger stays visible and a click expands or collapses the content underneath. It belongs in… - [Clickable Card](https://astryx-vue.pages.dev/en/components/clickable-card.md): ClickableCard is a card whose whole surface activates one action. The keyboard stop is a visually hidden link when href is set, and a button otherwise. Nested… - [Selectable Card](https://astryx-vue.pages.dev/en/components/selectable-card.md): SelectableCard is a card with a selected state. The keyboard stop is a visually hidden checkbox. Bind the state with v-model:is-selected, or pass :is-selected… - [Collapsible Group](https://astryx-vue.pages.dev/en/components/collapsible-group.md): CollapsibleGroup coordinates the Collapsible sections inside it. Give each section a value. Inside the group, that section's own isOpen is ignored. - [Carousel](https://astryx-vue.pages.dev/en/components/carousel.md): Carousel scrolls a row of items sideways. The root is a region with aria-roledescription="carousel". Each direct child is one slide, named Slide N of M. - [Avatar](https://astryx-vue.pages.dev/en/components/avatar.md): Import the component from its dedicated entry. Structural styles are loaded automatically. - [Avatar Status Dot](https://astryx-vue.pages.dev/en/components/avatar-status-dot.md): Status indicator dot for Avatar. Put one in the avatar's status slot and it sits on the bottom-right corner, showing whether someone is online, away, or busy… - [Avatar Group](https://astryx-vue.pages.dev/en/components/avatar-group.md): Import the components from their dedicated entry. Structural styles are loaded automatically. - [Avatar Group Overflow](https://astryx-vue.pages.dev/en/components/avatar-group-overflow.md): AvatarGroupOverflow appears at the end of an AvatarGroup to summarize people who are not shown individually. Use it when a group is sliced to a small number of… - [Blockquote](https://astryx-vue.pages.dev/en/components/blockquote.md): Import the component from its dedicated entry. The component loads its structural styles. - [Citation](https://astryx-vue.pages.dev/en/components/citation.md): Citation marks a source inside a sentence. The label variant is a chip with the source title. The number variant is a compact superscript. Pass number as the… - [Code](https://astryx-vue.pages.dev/en/components/code.md): Code marks a short technical reference inside a sentence, such as a function name, a prop, a file path, or a command-line flag. It renders a semantic … - [Empty State](https://astryx-vue.pages.dev/en/components/empty-state.md): EmptyState fills a region that has no content yet: a search that returned nothing, a list that is still empty, a page the user is visiting for the first time… - [Heading](https://astryx-vue.pages.dev/en/components/heading.md): Import the component from its dedicated entry. Structural styles are loaded automatically. - [Kbd](https://astryx-vue.pages.dev/en/components/kbd.md): Kbd presents a keyboard shortcut as a small group of painted key badges, such as ⌘K or ⇧↵. It belongs next to the action it triggers — on the right of a menu… - [Markdown](https://astryx-vue.pages.dev/en/components/markdown.md): Markdown renders a Markdown source as prose. It covers headings, paragraphs, emphasis, links, inline code, code blocks, quotes, lists, task lists, tables… - [Text](https://astryx-vue.pages.dev/en/components/text.md): Import the component from its dedicated entry. Structural styles are loaded automatically. - [Thumbnail](https://astryx-vue.pages.dev/en/components/thumbnail.md): Thumbnail is a 64px preview. With no src it shows a placeholder. isLoading without src is a skeleton. isLoading with src covers the image with a spinner… - [Timestamp](https://astryx-vue.pages.dev/en/components/timestamp.md): Timestamp renders one instant in a