Lynx-native UI primitives for Vue.
Vy UI brings a Radix-style primitives layer to the Vue-Lynx ecosystem. Build native mobile apps for iOS, Android, and Web from a single Vue codebase, with components you own and can modify.
⚠️ Status: alpha. Vue-Lynx itself is pre-alpha. APIs will change. Not production-ready.
Vue-Lynx is the Vue binding for Lynx, ByteDance's open-source native cross-platform framework (the same one powering parts of TikTok). It's a serious alternative to React Native for the 2M+ Vue developer community.
But the Lynx ecosystem currently has no extensive UI component library. There's no Radix, no shadcn/ui, no Vant equivalent for Vue-Lynx. Vy UI fills that gap:
-
Headless primitives for behavior, accessibility, and composition
-
Native-first — designed for Lynx's
<view>and<text>rendering model, not retrofitted from web -
Styled components on top via
@vyui/kit, with@vyui/coreproviding the underlying primitive layer
Two packages today, with more planned (see Roadmap):
@vyui/core → Runtime primitives, ship in your app bundle
@vyui/kit → Styled components built on top of @vyui/core
The runtime library. Provides headless, accessible component logic for Vue-Lynx:
-
Behavioral primitives: Dialog, Popover, Dropdown, Tooltip, Tabs, Accordion
-
Form primitives: Field, Label, Error, Validation
-
Composables for focus management, keyboard navigation, and state
-
Type-safe APIs designed for Lynx's native rendering model
Components expose state attributes (data-state, data-disabled, …) and
namespaced structural markers (data-vyui-*) you can style and select against —
see docs/data-attributes.md.
pnpm add @vyui/coreOpinionated styled components layered on top of @vyui/core, published for Vue-Lynx apps that want ready-to-use Vy* components and theme defaults.
Add Vy UI to your own Vue-Lynx app:
pnpm add @vyui/core @vyui/kitThen use the primitives directly — they're headless, so they render with your own styling and work without any further wiring:
<!-- App.vue -->
<script setup>
import { SliderRoot, SliderTrack, SliderRange, SliderThumb } from '@vyui/core'
import { ref } from 'vue'
const value = ref(50)
</script>
<template>
<SliderRoot v-model="value" :max="100">
<SliderTrack><SliderRange /></SliderTrack>
<SliderThumb />
</SliderRoot>
</template>To use the styled @vyui/kit components (<VyButton>, <VyCalendar>, …) you
also wire the Tailwind preset, theme stylesheet, and providers. That setup is
covered step by step in the installation guide.
Working on Vy UI itself (not consuming it):
git clone https://github.com/KealanAU/vyui.git
cd vyui
pnpm install
# Run the styled-component showcase
pnpm --filter @vyui/kit-demo devScan the LAN QR with Lynx Explorer for on-device preview, or open the printed main.web.bundle URL for the web preview. See CONTRIBUTING.md for the full workflow (the workspace source aliasing, MT-worklet pitfalls, and the PR checklist).
vyui/
├── packages/
│ ├── core/ # @vyui/core — runtime primitives (published)
│ ├── kit/ # @vyui/kit — styled components on top of core
│ ├── shared-build-config/ # shared Vite build config
│ └── testing-utils/ # shared test helpers
└── apps/
└── examples/
├── kit-demo/ # styled-component showcase
├── docs-playground/ # docs example bundle
└── …
Where the project is today and where it's headed. Everything is pre-1.0, so even shipped pieces are still subject to change.
@vyui/core— headless primitives, published on npm@vyui/kit— styled components on top of core, published on npm@vyui/cli— shadcn-style CLI for adding components to a downstream project (vyui init,vyui add button,list,view,styles,info)- Component registry —
<style>/*JSON manifests (inlined source,@vyui/coredependencies, file destinations) generated bytools/gen-registry.ts - Style namespacing (à la shadcn
default) — pick a style atinit; styles layer tokens, UI theme deltas, and optional full-file overlays over the kit base - Documentation site (
vyui.dev) with generated API tables and live examples - Theme system / design tokens —
defineVyuiConfigfeeds both the Tailwind preset (build) and the runtime, so the emitted classes can't drift from the selected variant <VyIcon>primitive — resolves any Iconify icon (bring your own@iconify-jsonset; nothing is bundled)
- Cross-target verification (iOS, Android, Web) — behavior is proven on some targets but not yet uniformly validated across all three
- Starter templates — a
create-vyui/ template repo that wires the Tailwind preset, providers, and overlay hosts in one step (the setup ceremony is the biggest onboarding cost today)
Contributions welcome — especially:
-
Primitive implementations and behavioral edge cases
-
Lynx-specific platform adjustments (iOS, Android, Web targets)
-
Styled component templates for
@vyui/kitand the future registry -
Documentation, examples, and starter templates
See CONTRIBUTING.md for the local-development workflow
(including how @vyui/core and @vyui/kit are source-aliased into the demo
apps, the MT-worklet pitfalls list, and the PR checklist).
Vy UI stands on the shoulders of excellent prior work. None of this would exist without the projects below — much of the primitive design, theming approach, distribution model, and Lynx-specific scaffolding was learned by reading, porting, and adapting from them.
-
Radix UI — Pioneered the headless primitives model and the multi-part component pattern (
Root/Trigger/Content/ etc.) that Vy UI follows. MIT. -
Nuxt UI — The Tailwind Variants +
createTvtheming model in@vyui/kit, the slot-based component theme files underpackages/kit/src/theme/*, and theapps/docssite itself all draw heavily on Nuxt UI's approach. MIT. -
shadcn/ui — Defined the CLI + registry distribution model that the planned
@vyui/cliandvyui.dev/registry/*manifests are modeled on. MIT. -
Lynx UI — ByteDance's reference component set for Lynx. The patterns for working around Lynx's
<view>/<text>constraints, MT-worklet pitfalls, and the rasterized<svg>model were learned in part from reading Lynx UI's source. Apache-2.0. -
Vue-Lynx — The Vue binding for Lynx that this entire library targets. Without it, Vy UI has nothing to render to. Apache-2.0.
-
Park UI — Proved the layered primitives + styled-on-top + CLI distribution model is portable across primitive libraries.
-
Headless UI and Ariakit — Earlier explorations of the headless-primitives space that shaped the ecosystem.
-
Tailwind CSS and Tailwind Variants — The utility + variants system
@vyui/kitis built on. -
Iconify and icones.js.org — The icon ecosystem Vy UI's
<Icon>primitive resolves against.
Some styled component templates may be ported from or inspired by other MIT projects. Where this is the case, original license terms and attribution are preserved in each component file.
MIT © 2026 Kealan Clarke and Vy UI contributors
Built with respect for the open-source ecosystem that made this possible.