跨平台与移动端 UI · 新资源

React Native Elements 设计系统.

使用 React Native Elements 5.0.0 构建完整的专注计划编辑器:使用真实的主题角色、受控输入和选项、验证、本地确认,并通过测试的 Web 构建。

OpenDesign 指南7 个章节39 条参考条目原始应用指南
01

React Native Elements 设计系统界面预览

编辑任务、时长和休息选项,并检查验证、外观和重置行为。

制定本地专注计划打开完整示例
通过 React Native Web 0.21.3 和 React 19.2.0 运行原生 RNEUI 5.0.0。· 实现参考
02

React Native Elements 设计系统设计参考

固定版本的 RNEUI 源码默认值、公开组件 API,以及明确标注的应用自行设计内容。

浅色主题颜色

来源
名称 / 规则值 / 配置用途
lightColors.primary#2089dc RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.secondary#ad1457 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.background#ffffff RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.black#242424 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.white#ffffff RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.grey1#43484d RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.grey2#5e6977 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.grey5#e1e8ee RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.success#52c41a RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.error#ff190c RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
lightColors.warning#faad14 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。

深色主题颜色

来源
名称 / 规则值 / 配置用途
darkColors.primary#439ce0 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.secondary#aa49eb RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.background#080808 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.black#f2f2f2 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.white#080808 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.grey1#bdc6cf RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.grey2#86939e RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.grey5#393e42 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.success#439946 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.error#bf2c24 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。
darkColors.warning#cfbe27 RNEUI 主题的实际取值。black/white 等角色在深色模式下会反转视觉含义;请使用当前主题,而不要硬编码颜色字面值。

默认间距与明确标注的应用自行设计内容

来源
名称 / 规则值 / 配置用途
spacing.xs2已发布的默认间距入口;这些名称属于主题对象,而非 CSS 变量令牌。
spacing.sm4已发布的默认间距入口;这些名称属于主题对象,而非 CSS 变量令牌。
spacing.md8已发布的默认间距入口;这些名称属于主题对象,而非 CSS 变量令牌。
spacing.lg12已发布的默认间距入口;这些名称属于主题对象,而非 CSS 变量令牌。
spacing.xl24已发布的默认间距入口;这些名称属于主题对象,而非 CSS 变量令牌。
Sample heading32px / weight 700这是原创示例的取值,在所提供的源码中明确配置,并非官方全局类型或圆角令牌。
Sample body15px / 23px line height这是原创示例的取值,在所提供的源码中明确配置,并非官方全局类型或圆角令牌。
Sample cards24px padding / 8px radius这是原创示例的取值,在所提供的源码中明确配置,并非官方全局类型或圆角令牌。
Button component defaultradius: 6这是原创示例的取值,在所提供的源码中明确配置,并非官方全局类型或圆角令牌。

组件与 Provider 约定

来源
名称 / 规则值 / 配置用途
createThememode, components, lightColors, darkColorsThemeProvider 接收构造好的对象;仅更改组件时仍可使用默认值。
useThemetheme, updateTheme外观操作会切换模式,但不会重置应用状态。
Inputvalue, onChangeText, errorMessage, ref空任务错误会显示出来,焦点会返回实际输入框。
ButtonGroupbuttons, selectedIndex, onPress受控索引会选择 15、25 或 45 分钟,并不代表时长本身。
Switchvalue, onValueChange受控布尔值会改变休息说明。
CardCard.Title, Card.Divider结构化界面表面会继承所选主题。
Buttontitle, onPress, type保存操作会验证本地状态;重置操作会恢复默认值。
SafeAreaProviderOuter application provider必需的集成上下文;Web 上运行成功并不能证明原生设备的安全区域行为正确。
03

React Native Elements 设计系统完整指南

实用指南,介绍如何为真实界面选择、应用和评审此系统。

DESIGN-react-native-elements.md

完整指导、实现起点和源代码链接。

下载指南

React Native Elements 设计系统运行环境与 Web 范围

运行实际主题组件

此示例使用版本为 5.0.0 的 @rneui/themed 和 @rneui/base、版本为 19.2.0 的 React,以及版本为 0.21.3 的 React Native Web。浏览器构建会将 react-native 别名为 react-native-web,并优先选择 .web.js 模块,其次才是通用 JavaScript。这些是实际库组件在 Web 上的渲染结果,并非 HTML 仿制移动端截图的占位框。提供的构建文件包含相应的模块解析设置,因此独立代码也能复现该预览。

摘自本 OpenDesign 指南

区分 Web 与原生平台的证据

此组合是专注计划编辑器,而不是正在运行的计时器或通知管理器。按照集成要求,应用由 SafeAreaProvider 包裹,但此浏览器测试不会验证 iOS 或 Android 的安全区域内边距、原生键盘行为或设备通知权限。原生项目除了这些共享组件示例外,还需要进行平台构建和设备检查。

  • Web 渲染使用 React Native Web。
  • 计划仅保存在本地 React 状态中。
  • 不会启动计时器、系统通知或后端保存操作。

React Native Elements 设计系统主题对象与颜色

使用当前主题角色

createTheme 会将内置的浅色和深色颜色与任何显式覆盖项合并。此示例仅更改组件默认值和模式。useTheme 会将解析后的颜色提供给周围的 View 和 Text 元素,因此大标题、描述和面板都会随所选外观变化。在深色模式下,black 表示浅色前景角色,white 表示深色表面角色;若将这些名称视为字面颜色值,就会破坏主题效果。

不要臆造通用排版比例

RNEUI 提供组件默认值和自定义钩子,其令牌模型与 CSS 设计系统并不相同。因此,参考内容将实际的 defaultSpacing 条目与示例中的 32px 标题、15px 正文和 8px 卡片圆角区分开来。这些尺寸是代码中可见的原始组合设置,不应被描述为强制性的 React Native Elements 品牌规范。

React Native Elements 设计系统输入验证与焦点

明确控制任务文本

Input 接收 value 和 onChangeText 回调。点击保留操作时,会先去除文本两端的空白,再判断内容是否为空。如果为空,errorMessage 会显示明确的提示,并通过组件 ref 让输入框重新获得焦点。修改文本时会清除之前的错误,并使本地确认状态失效,避免已过时的保存提示对应已编辑的计划。

同时使用标签和错误提示

可见的“专注任务”标签和 accessibilityLabel 都指向同一个控件。占位符用于提示输入内容,不能替代标签。验证仅在用户明确点击保留操作时触发,而不会随着每次按键执行。发生错误后,用户仍可保留草稿;同时,不会显示暗示服务器请求的异步保存动画,因为实际上并没有发出此类请求。

React Native Elements 设计系统受控选择

将选中索引与时长分开处理

ButtonGroup 接收三个标签、selectedIndex 和 onPress。返回的索引会用于从原始的 [15, 25, 45] 分钟列表中选择时长;若直接将该索引当作分钟数使用,就会造成应用错误。预览中的大号数字摘要也根据相同的选中索引生成,确保分段控件与易读的计划内容保持一致。

将休息选项设为真正的布尔值

React Native Elements 设计系统状态保留与重置

让主题与计划相互独立

切换外观时,会通过 updateTheme 更新为相反的模式。任务、所选时长、休息设置和本地确认均作为独立的应用状态保留,不受此次更新影响。原生组件会应用新主题,但不会重建计划。浏览器检查会在输入自定义任务后切换外观,以验证视觉模式不会意外导致数据重置。

提供一个明确的恢复操作

“重置计划”会恢复示例任务、25 分钟时长和已启用的休息选项,清除验证错误并移除确认状态,同时保留所选外观。这样可以将内容重置与主题偏好分开,避免令人意外的整页重新加载。此示例没有持久化层,因此重新打开文档时会从初始示例开始。

React Native Elements 设计系统响应式布局

调整双卡片布局

内容使用 useWindowDimensions,在宽度大于 700px 时采用行布局,在较窄的宽度下采用列布局。每张 Card 的外边距均为零,由组合设置中的 24px 间距控制对齐。宽度小于 500px 时,外侧内边距会缩小至 16px。两张卡片分别展示可编辑的计划和据此生成的摘要,而不是重复使用装饰性占位内容。

检查两种主题下的组件默认样式

除了全局颜色之外,RNEUI 组件内部也可能应用各自的默认样式。例如,此示例中未选中的 ButtonGroup 分段仍采用其原生表面样式。如果产品需要不同的对比度或视觉密度,可以显式提供 buttonStyle 和 selectedButtonStyle,但应经过测试后再确定,而不应认为它们会由全局主题自动调整。

React Native Elements 设计系统完整浏览器配置

配置 Web 解析与资源加载器

提供的 build.mjs 使用 esbuild,并为 JavaScript 依赖启用 JSX 解析、配置 react-native-web 别名、将 .web.js 设为优先扩展名,并为打包的 PNG 和 TTF 资源配置 data 加载器。包入口包含指向这些资源的导出项,即使可见组合中没有图标也是如此。因此,不能将此构建流程替换为在浏览器中直接导入未经处理的源文件。

测试完整的本地交互流程

将提供的源文件保存为 rne.jsx,将 HTML 保存为 index.html,安装锁定版本的依赖,运行构建并启动目录服务。测试空任务、自定义任务、不同时长、休息开关、外观和重置操作。这样可以验证所提供的组合,但不会自动验证所有导出的 RNEUI 组件或所有原生平台。

  1. 将提供的三个文件放在同一目录中。
  2. 安装锁定版本的依赖并运行 node build.mjs。
  3. 使用 index.html 提供生成后的构建文件。
  4. 测试空白、编辑、主题切换和重置状态。

React Native Elements 设计系统组件示例

rne.jsx

完整的 provider、原生组件和应用状态。

jsx
import React,{useState,useRef} from 'react';
import {createRoot} from 'react-dom/client';
import {View,Text,useWindowDimensions} from 'react-native';
import {ThemeProvider,createTheme,Button,ButtonGroup,Input,Switch,Card,Divider,useTheme} from '@rneui/themed';
import {SafeAreaProvider} from 'react-native-safe-area-context';
const theme=createTheme({mode:'light',components:{Button:{radius:6},Input:{containerStyle:{paddingHorizontal:0}}}});
function App(){const {theme,updateTheme}=useTheme();const {width}=useWindowDimensions();const [title,setTitle]=useState('Read a chapter'),[duration,setDuration]=useState(1),[breaks,setBreaks]=useState(true),[error,setError]=useState(false),[saved,setSaved]=useState('');const input=useRef(null);let c=theme.colors;function changed(){setSaved('')}function save(){if(!title.trim()){setError(true);input.current?.focus();return;}setError(false);setSaved(`${title.trim()} · ${[15,25,45][duration]} minutes · ${breaks?'with a short break':'no break reminder'}. Kept in this preview only.`)}return <View style={{backgroundColor:c.background,padding:width<500?16:32,maxWidth:1000,width:'100%',alignSelf:'center'}}><View style={{flexDirection:'row',justifyContent:'space-between',gap:24,flexWrap:'wrap',marginBottom:24}}><View style={{flexShrink:1}}><Text style={{color:c.primary,fontSize:13,fontWeight:'700'}}>REACT NATIVE ELEMENTS · WEB STUDY</Text><Text accessibilityRole="header" style={{fontSize:32,fontWeight:'700',color:c.black,marginTop:12}}>Make room for one thing</Text></View><Button title={theme.mode==='light'?'Use dark theme':'Use light theme'} type="outline" onPress={()=>updateTheme({mode:theme.mode==='light'?'dark':'light'})}/></View><Text style={{color:c.grey1,fontSize:15,lineHeight:23}}>An original focus-plan composer using RNEUI 5.0.0 through React Native Web. No timer or system notification is started.</Text><View style={{flexDirection:width>700?'row':'column',gap:24,marginTop:24}}><Card containerStyle={{flex:1,margin:0,padding:24,borderRadius:8}}><Card.Title>Shape your focus block</Card.Title><Card.Divider/><Input ref={input} label="Focus task" accessibilityLabel="Focus task" value={title} onChangeText={v=>{setTitle(v);setError(false);changed()}} errorMessage={error?'Enter a task before keeping this plan.':''} placeholder="What deserves your attention?"/><Text style={{fontSize:16,fontWeight:'700',color:c.grey1,marginBottom:8}}>Duration</Text><ButtonGroup buttons={['15 min','25 min','45 min']} selectedIndex={duration} onPress={i=>{setDuration(i);changed()}} containerStyle={{marginHorizontal:0,height:48,marginBottom:24}}/><View style={{flexDirection:'row',justifyContent:'space-between',alignItems:'center',gap:16,marginBottom:24}}><Text style={{fontSize:16,color:c.black,flexShrink:1}}>Include a short break</Text><Switch value={breaks} onValueChange={v=>{setBreaks(v);changed()}} accessibilityLabel="Include a short break"/></View><Button title="Keep this plan" onPress={save}/></Card><Card containerStyle={{flex:1,margin:0,padding:24,borderRadius:8}}><Card.Title>Your local plan</Card.Title><Card.Divider/><Text style={{fontSize:48,fontWeight:'700',color:c.primary}}>{[15,25,45][duration]}</Text><Text style={{fontSize:16,color:c.grey1,marginBottom:24}}>minutes for {title.trim()||'your next task'}</Text><Divider/><Text style={{color:c.black,fontSize:16,lineHeight:25,marginVertical:24}}>{breaks?'Finish with a pause before choosing what comes next.':'Keep the end of this block open; no break reminder is included.'}</Text><Text style={{fontSize:13,lineHeight:21,color:c.grey2}}>The duration, task and break choice are original application state. Theme colors, Input, ButtonGroup, Switch, Card and Button come from the installed library.</Text></Card></View><Text accessibilityLiveRegion="polite" style={{color:c.black,fontSize:15,lineHeight:23,marginTop:24}}>{saved}</Text><Button title="Reset the plan" type="clear" onPress={()=>{setTitle('Read a chapter');setDuration(1);setBreaks(true);setError(false);setSaved('');}} containerStyle={{alignSelf:'flex-start',marginTop:8}}/></View>}
createRoot(document.getElementById('root')).render(<SafeAreaProvider><ThemeProvider theme={theme}><App/></ThemeProvider></SafeAreaProvider>);

代码参考

  • 将这三个文件与固定版本的配置搭配使用。

build.mjs

实际的浏览器打包配置,包括 Web 模块优先级。

javascript
import {build} from 'esbuild';
await build({entryPoints:['rne.jsx'],bundle:true,minify:true,outfile:'rne.bundle.js',alias:{'react-native':'react-native-web'},resolveExtensions:['.web.js','.js','.jsx','.json'],loader:{'.js':'jsx','.ttf':'dataurl','.png':'dataurl'},define:{'process.env.NODE_ENV':'"production"'}});

代码参考

  • 将这三个文件与固定版本的配置搭配使用。

index.html

加载生成的 bundle 的完整根文档。

html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Focus plan composer</title><style>body{margin:0;background:#f4f7fa}*{box-sizing:border-box}input:focus-visible,[role=button]:focus-visible{outline:2px solid #2089dc;outline-offset:3px}</style></head><body><div id="root"></div><script src="./rne.bundle.js"></script></body></html>

代码参考

  • 将这三个文件与固定版本的配置搭配使用。
04

React Native Elements 设计系统 Agent 配置

实现起点

请先保存提供的 rne.jsx、build.mjs 和 index.html。这是经过验证的浏览器构建配置,不是原生应用配置。

sh
npm init -y
npm install [email protected] [email protected] @rneui/[email protected] @rneui/[email protected] [email protected] [email protected] [email protected] --legacy-peer-deps
npm install --save-dev esbuild
node build.mjs
python3 -m http.server 8000

适用于你项目的提示词

Agent 提示词
使用完整的浏览器构建配置和 providers,构建提供的 RNEUI 5.0.0 专注计划编辑器。保留受控的索引与时长映射、修剪验证和焦点处理、仅本地确认、独立于主题的计划状态,以及明确的重置操作。此 Web 示例不包含原生设备功能。
05

React Native Elements 设计系统来源与范围

通过 React Native Web 渲染的实际 RNEUI 5.0.0 组件。OpenDesign 原始计划内容和状态;不声称具备原生设备、计时器或通知功能。