简介
Skyroc Native UI — 基于 Uniwind 与 Tailwind CSS v4 的 React Native 组件库
@skyroc/native-ui 是面向 React Native / Expo 的移动端组件库,使用 Uniwind 和 Tailwind CSS v4 编写。组件与 Web 端共用 @skyroc/tailwind-plugin 里的设计令牌,通过 className、语义色和统一的组件 API 保持一致的开发体验。
当前版本 0.1.0,组件仍在持续补充和校准。仓库内的 Native UI
Playground
是查看实际效果与交互行为的首选入口。
核心特性
- Tailwind 写法 — 组件样式用 Uniwind 的
className表达,静态样式全部走原子类,只有运行时计算值才落到style。 - 与 Web 同源的令牌 —
primary、foreground、muted、border、destructive等语义色来自@skyroc/tailwind-plugin,Web 与 Native 共用一套主题定义。 - 无需
dark:分支 — 主题由宿主应用切换,组件只写语义色,明暗自动跟随。 - 50 个组件 — 覆盖通用、布局、输入、展示、导航、弹层与反馈七大类,表单部分接入
@skyroc/form。 - TypeScript — 组件与类型均从包根路径导出,完整类型推导。
站在巨人的肩膀上
这个库不打算把所有轮子重造一遍。RN 生态里已经有一批打磨多年的库,手势、绘制、弹层这些底层能力交给它们,比自己写一个半成品更靠谱。@skyroc/native-ui 做的是在上面加一层:统一 API 与受控写法、接上设计令牌与暗色主题、把安全区 / 触摸热区 / 按下态这些默认行为补齐。
| 能力 | 底层库 | 涉及组件 |
|---|---|---|
| 底部面板与档位 | @gorhom/bottom-sheet | Sheet、ActionSheet、ShareSheet、Picker 系、DatePicker、TimePicker |
| 遮罩弹层 | react-native-modal | Popup、Dialog |
| 动画与手势 | react-native-reanimated、react-native-gesture-handler | Tabs、Slider、SwipeCell、IndexBar、FloatingButton 等 20+ 组件 |
| 分格验证码输入 | react-native-confirmation-code-field | PasswordInput |
| 月历面板 | react-native-ui-datepicker | Calendar |
| 画布绘制 | @shopify/react-native-skia | Signature |
| 图片加载 | expo-image | Image、Avatar |
| 分页容器 | react-native-pager-view | Tabs |
| 图标 | @expo/vector-icons | 大部分带图标的组件 |
这层封装的代价是透明的:碰到某个组件的行为边界,答案通常在对应上游库的文档里,而不是这里。完整的依赖与组件对照见 依赖说明。
平台支持
主力目标平台是 Android 与 iOS,组件都在真机与模拟器上验证过。
React Native Web 不是一等公民,能跑但不保证完整:
- 依赖原生模块的组件(Signature 的 Skia、Picker 系的 bottom sheet 与手势、Image 的 expo-image)在 Web 上可能样式错位、交互降级,甚至直接报错。
- 手势驱动的交互(SwipeCell、FloatingButton、IndexBar 的吸附)在鼠标环境下体验不完整,
expo-haptics的触感反馈在 Web 上是空实现。 - 安全区工具类(
pt-safe等)依赖react-native-safe-area-context,Web 下恒为0。
需要 Web 端界面时,推荐用同源的 @skyroc/web-ui —— 两边共用 @skyroc/tailwind-plugin 的设计令牌,色板和主题切换是同一套。
上手
import { Button, Text } from '@skyroc/native-ui';
import { View } from 'react-native';
const Panel = () => {
return (
<View className="gap-3 rounded-2xl bg-background p-4">
<Text className="text-lg font-semibold text-foreground">确认提交</Text>
<Button size="lg">提交</Button>
</View>
);
};组件库依赖 Uniwind 的构建期扫描和几个根节点 Provider,装完包还需要配置 Metro、CSS 入口和根布局才能跑起来:
组件总览
通用
Button
触发即时操作的按钮组件
FloatingButton
可拖拽、可吸附边缘的悬浮操作按钮
Text
支持语义色、字号、字重与上下文继承
TextEllipsis
多行文本折叠,展开 / 收起入口内联在末行
Divider
分隔内容的细线,支持文字、虚线与竖向
Image
基于 expo-image,内置加载中与失败占位
布局容器
输入
Form
列表式布局的表单容器与字段
Field
纵向堆叠布局的表单字段
Input
单行文本输入框,内置清除与密码可见性切换
PasswordInput
分格密码 / 验证码输入框
Search
搜索栏,内置放大镜、清除与取消操作
Checkbox
在一组选项中选择任意多项
Radio
单选框,含分组、卡片与卡片组
Switch
立即生效的开关,支持加载态
Slider
单值 / 区间滑块,支持垂直方向
Stepper
数值步进器,支持长按连续触发
Rate
星级评分,支持半星与只读小数
Signature
手写签名板,基于 Skia 绘制并导出 base64
Picker
滚轮选择器,支持单列、多列与级联
PickerGroup
分组选择器,多个滚轮共用一套工具栏
DatePicker
年月日滚轮选择器,列范围级联收窄
TimePicker
时间选择器,按 min / maxTime 逐级收窄
Calendar
支持单选、范围与多选的月历面板
NumberKeyboard
自定义数字键盘,用于密码、金额场景
TreeSelect
分类选择,左侧分组导航 + 右侧子项列表
数据展示
Avatar
展示用户或实体头像的圆形图片组件
Badge
标记数量或状态的角标组件
Tag
标签,用于状态标记与分类
CountDown
按格式展示剩余时间的倒计时
RollingText
数字 / 文本翻滚动画
SwipeCell
可左右滑动的单元格,露出两侧操作区
导航
NavBar
页面顶部导航栏,左中右三区布局
Tabs
标签页,支持手势翻页与面板懒加载
Sidebar
竖排侧边导航,常与右侧内容区配合
AnchorNav
锚点导航,点击定位、滚动联动
IndexBar
字母索引列表,右缘悬浮索引条
BackTop
滚动一段距离后出现的回到顶部按钮
Pagination
分页器,支持页码折叠与简单模式
DropdownMenu
贴着标题栏展开的多列筛选菜单
弹层覆盖
Popup
通用弹出层,五个方向 + 遮罩
Dialog
居中对话框,用于提示、二次确认与轻量输入
Sheet
底部面板,支持吸附档位与动态高度
ActionSheet
从底部弹出的操作面板
ShareSheet
分享面板,图标网格 + 取消按钮