Skip to content
Development
Skill

/hz-metavrx-ui-set

Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system. Covers UiSetTheme, buttons, cards, controls, dialogs, dropdowns, inputs, side navigation, sliders, tooltips, the Icons.Regular library, Gradle setup, and

From plugin
meta-vr
24936 skills1 MCP

Claude Code

$ npx -y skills add meta-quest/agentic-tools --skill hz-metavrx-ui-set --agent claude-code

SKILL.md

hz-metavrx-ui-set.SKILL.md
name: hz-metavrx-ui-set
license: Apache-2.0
description: "Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system. Covers UiSetTheme, buttons, cards, controls, dialogs, dropdowns, inputs, side navigation, sliders, tooltips, the Icons.Regular library, Gradle setup, and migration from the Spatial SDK UI Set. Build path: Standard Android; use hz-quest-verify-first if the path is unclear."

Using the Meta VR UI Set

UISet is a Jetpack Compose component library and design system for Android apps on Meta Horizon OS. Its dark and light themes ship Meta VR typography, shapes, density, interaction states, and semantic colors complete and usable with no configuration. Everything public lives under `metavrx.uiset.compose` and its subpackages.

It ships as the Maven artifact `com.meta.metavrx.uiset:uiset-compose-compat`.

This skill uses **progressive disclosure**: this page is the map — load the one reference file that matches your task.

Mental model

@Composable
fun AppContent(onContinue: () -> Unit) {
  UiSetTheme {                       // dark scheme, VR typography, Standard density
    Surface {
      Column {
        Text("Guardian", style = UiSetTheme.typography.headline)
        LabelButton(label = "Continue", onClick = onContinue)
      }
    }
  }
}

Below the theme it is ordinary Compose — `Row`/`Column`/`Box` from foundation, your own state, normal recomposition. The deltas from a Material 3 app are small but they are **replacements, not additions**:

| Material 3 | UISet | |-----------------------------------------------------|-------------------------------------------------------| | `androidx.compose.material3.MaterialTheme` | `metavrx.uiset.compose.theme.UiSetTheme` | | `androidx.compose.material3.Text` / `.Icon` | `metavrx.uiset.compose.Text` / `.Icon` | | `Button(onClick) { Text(…) }` | `LabelButton(label, onClick)` | | `androidx.compose.material.icons.Icons.Filled.Add` | `metavrx.uiset.compose.theme.icons.Icons.Regular.Add` | | `MaterialTheme.colorScheme.primary` | `UiSetTheme.colorScheme.accent` | | `androidx.compose.material3.LocalContentColor` | `metavrx.uiset.compose.LocalContentColor` |

UISet does not extend Material. The names collide, the types do not — import from `metavrx.uiset.compose.*` and do not mix the two in one screen.

Rules that bite

  • **Import from UISet, not Material.** `Text`, `Icon`, `Surface`, `Checkbox`,

`RadioButton`, `Switch`, `Slider`, `Icons`, `LocalContentColor` all exist in both. Mixed imports compile and then render unthemed.

  • **Icons are `@Composable` properties.** `Icons.Regular.Add` resolves a vector

resource, so reading it *is* a composable call — it cannot be evaluated in a `val`, an enum argument, or a `remember { }` block. Component `icon` / `leadingIcon` parameters take `@Composable () -> Unit` for exactly that reason.

  • **Item lists must be `PersistentList`.** `Dropdown`, `IconDropdown`, and

`ChoiceListDialog` take `PersistentList<…>` from kotlinx-collections-immutable; build with `persistentListOf(…)` inside `remember`.

  • **Dialogs are modal and caller-controlled.** Emit them under

`if (showDialog) { … }` and always pass `onDismissRequest`.

  • **Every interactive target is at least 48dp** in both dimensions, whatever the

density preset or a custom `Dimensions.minimumInteractiveSize` says. Visible artwork can be smaller than its target; lay out with the target in mind.

  • **Icon-only controls require a `contentDescription`** — it is a required

parameter on `IconButton`, not an optional one.

  • **Components read the theme through composition locals.** Anything outside a

`UiSetTheme` gets the built-in defaults and your customization never reaches it.

Read what you need

  • **[references/components.md](references/components.md)** — which component to

reach for, what the `ButtonStyle` emphasis levels mean, and the behaviour that is not visible in a signature. Start here for "which component, and what will it do that I don't expect".

  • **[references/theming.md](references/theming.md)** — `UiSetTheme`, the

semantic `ColorScheme` roles, typography, shapes, density, and interaction indications, plus the customization ladder from a one-value copy to a full replacement. Read when colors or metrics need to change.

  • **[references/icons.md](references/icons.md)** — `Icons.Regular`, the

composable-getter constraint, the icon-slot pattern, and how to find an icon.

  • **[references/integration.md](references/integration.md)** — adding UISet to

an Android app with Gradle and the Horizon OS manifest shape. Read when wiring the dependency, not the API.

  • **[references/migration.md](references/migration.md)** — moving off the

Spatial SDK UI Set (`com.meta.spatial:meta-spatial-sdk-uiset`): the coordinate and package changes, the `Spatial*` rename table, and the behavioral differences. Read when the existing code says `SpatialTheme`.

For exact signatures and KDoc, hover the symbol in your IDE — every public type is documented. Outside the IDE, `metavr docs api-search "<Component>"` reaches the same reference.

Read more
@meta-quest
Ships withmeta-vr

Agentic skills and tools for Meta VR and Horizon OS development.

24936 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
249
Star history of meta-quest/agentic-tools on GitHub, a chart by star-history.com

Other skills on meta-vr.

hz-android-2d-porting

hz-android-2d-porting

Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use…

@meta-quest@meta-questInstall Skill
hz-api-upgrade

hz-api-upgrade

Upgrades Meta VR apps to newer Horizon OS SDK versions — migration guides, deprecated API replacements, changelog. Use when…

@meta-quest@meta-questInstall Skill
hz-immersive-designer

hz-immersive-designer

Guides design of comfortable, intuitive VR/MR experiences for Meta VR and Horizon OS — comfort guidelines, interaction patterns,…

@meta-quest@meta-questInstall Skill
hz-iwsdk-webxr

hz-iwsdk-webxr

Builds WebXR experiences for Meta VR and Horizon OS using the Immersive Web SDK (IWSDK) — ECS architecture, Three.js integration,…

@meta-quest@meta-questInstall Skill
hz-metavrx-layout-sdk

hz-metavrx-layout-sdk

Build multi-window Meta Horizon OS experiences with the MetaVrx Layout SDK in Jetpack Compose or React Native. Covers framework…

@meta-quest@meta-questInstall Skill
hz-new-project-creation

hz-new-project-creatio…

Scaffolds new Meta VR and Horizon OS projects after the build path is selected — Standard Android, Meta Spatial SDK, Unity,…

@meta-quest@meta-questInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about hz-metavrx-ui-set.

Which coding agents can use hz-metavrx-ui-set?
hz-metavrx-ui-set installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.