hz-metavrx-ui-set
Skill200 starsChanged 53 days agoApache-2.0View on GitHub
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.
In this repository37 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- hz-android-2d-portingSkill
- hz-api-upgradeSkill
- hz-immersive-designerSkill
- hz-iwsdk-webxrSkill
- hz-metavrx-layout-sdkSkill
- hz-new-project-creationSkill
- hz-perfetto-debugSkill
- hz-platform-sdkSkill
- hz-psdk-integrationSkill
- hz-quest-verify-firstSkill
- hz-react-native-expoSkill
- hz-simpleperf-debugSkill
- hz-spatial-sdkSkill
- hz-store-pwaSkill
- hz-store-submitSkill
- hz-unity-code-reviewSkill
- hz-unity-device-readinessSkill
- hz-unity-face-trackingSkill
- hz-unity-fbx-importSkill
- hz-unity-meta-core-sdkSkill
- hz-unity-meta-interaction-sdkSkill
- hz-unity-meta-mixed-reality-utility-kitSkill
- hz-unity-meta-movement-sdk-retargetingSkill
- hz-unity-meta-quest-uiSkill
- hz-unity-passthrough-camera-accessSkill
- hz-unity-placementSkill
- hz-unity-platform-sdkSkill
- hz-unity-project-analyzerSkill
- hz-unity-sdk-upgradeSkill
- hz-unity-tmp-resourcesSkill
- hz-vr-debugSkill
- hz-xr-simulator-controlSkill
- hz-xr-simulator-install-and-configureSkill
- metavr-cliSkill
- portalSkill
The file
Files
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,LocalContentColorall exist in both. Mixed imports compile and then render unthemed. - Icons are
@Composableproperties.Icons.Regular.Addresolves a vector resource, so reading it is a composable call — it cannot be evaluated in aval, an enum argument, or aremember { }block. Componenticon/leadingIconparameters take@Composable () -> Unitfor exactly that reason. - Item lists must be
PersistentList.Dropdown,IconDropdown, andChoiceListDialogtakePersistentList<…>from kotlinx-collections-immutable; build withpersistentListOf(…)insideremember. - Dialogs are modal and caller-controlled. Emit them under
if (showDialog) { … }and always passonDismissRequest. - Every interactive target is at least 48dp in both dimensions, whatever the
density preset or a custom
Dimensions.minimumInteractiveSizesays. 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 onIconButton, not an optional one. - Components read the theme through composition locals. Anything outside a
UiSetThemegets the built-in defaults and your customization never reaches it.
Read what you need
- references/components.md — which component to
reach for, what the
ButtonStyleemphasis 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 —
UiSetTheme, the semanticColorSchemeroles, 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 —
Icons.Regular, the composable-getter constraint, the icon-slot pattern, and how to find an icon. - 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 — moving off the
Spatial SDK UI Set (
com.meta.spatial:meta-spatial-sdk-uiset): the coordinate and package changes, theSpatial*rename table, and the behavioral differences. Read when the existing code saysSpatialTheme.
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.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

