react-native-system-ui 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -22
- package/dist/cjs/components/flex/Flex.js +1 -1
- package/dist/cjs/components/flex/FlexItem.js +1 -1
- package/dist/cjs/components/grid/Grid.js +1 -1
- package/dist/cjs/components/grid/GridItem.js +1 -1
- package/dist/cjs/components/selector/Selector.js +1 -1
- package/dist/es/components/flex/Flex.js +1 -1
- package/dist/es/components/flex/FlexItem.js +1 -1
- package/dist/es/components/grid/Grid.js +1 -1
- package/dist/es/components/grid/GridItem.js +1 -1
- package/dist/es/components/selector/Selector.js +1 -1
- package/dist/types/components/grid/Grid.d.ts +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# react-native-system-ui
|
|
2
2
|
|
|
3
|
-
面向 React Native 的高性能设计系统组件库。基于 Design Tokens 驱动主题体系,50+ 组件全量覆盖移动端场景;原生 StyleSheet 零运行时开销,单组件均值 **2.
|
|
3
|
+
面向 React Native 的高性能设计系统组件库。基于 Design Tokens 驱动主题体系,50+ 组件全量覆盖移动端场景;原生 StyleSheet 零运行时开销,单组件均值 **2.7 KB gzip**;iOS / Android / Web 三端同构,API 一致、行为对齐。
|
|
4
4
|
|
|
5
5
|
## 核心优势
|
|
6
6
|
|
|
7
|
-
- **极致轻量**:全组件经过逐行精简——冗余 Hook 移除、StyleSheet 合并、计算内联、辅助函数提取;构建产物 esbuild 压缩;按需引入 + Tree Shaking,单组件平均 gzip 仅 **2.
|
|
7
|
+
- **极致轻量**:全组件经过逐行精简——冗余 Hook 移除、StyleSheet 合并、计算内联、辅助函数提取;构建产物 esbuild 压缩;按需引入 + Tree Shaking,单组件平均 gzip 仅 **2.7 KB**,最小组件(SafeAreaView)仅 **0.5 KB**。
|
|
8
8
|
- **原生性能**:纯 StyleSheet 驱动,零 CSS-in-JS 运行时;动画基于原生 Animated / LayoutAnimation,无 JS 线程阻塞;列表类组件(Picker、Swiper、Tabs)基于 FlatList / ScrollView 原生滚动,确保 60fps 流畅交互。
|
|
9
9
|
- **三端同构**:iOS / Android / Web 统一 API 与交互行为;Swiper、Picker 等核心组件在 Web 端自动适配桌面鼠标拖拽与移动端触控,无需业务层额外处理。
|
|
10
10
|
- **设计系统**:Design Tokens + ThemeProvider 分层架构,组件自管 tokens;支持 light / dark / 品牌主题一键切换,样式定制不侵入组件实现。
|
|
@@ -151,29 +151,29 @@ enableNativeWind(cssInterop)
|
|
|
151
151
|
|
|
152
152
|
## 组件体积
|
|
153
153
|
|
|
154
|
-
按需引入后单组件均值约 **2.
|
|
154
|
+
按需引入后单组件均值约 **2.7 KB**(各组件目录 gzip 相加估算,数据由 `pnpm run build && pnpm run docs:update-size` 生成)。支持 Tree Shaking,实际打包体积以构建结果为准。
|
|
155
155
|
|
|
156
156
|
| 组件 | gzip | 组件 | gzip | 组件 | gzip |
|
|
157
157
|
| --- | ---: | --- | ---: | --- | ---: |
|
|
158
|
-
| picker | 6.
|
|
159
|
-
| dialog | 4.
|
|
160
|
-
| calendar | 4.
|
|
161
|
-
| toast |
|
|
162
|
-
| notify | 3.
|
|
163
|
-
|
|
|
164
|
-
| radio | 3.
|
|
165
|
-
|
|
|
166
|
-
| password-input | 2.
|
|
167
|
-
|
|
|
168
|
-
| progress | 2.
|
|
169
|
-
|
|
|
170
|
-
| search | 2.
|
|
171
|
-
| water-mark |
|
|
172
|
-
| space | 1.
|
|
173
|
-
| empty | 1.
|
|
174
|
-
| count-down | 1.
|
|
175
|
-
| overlay | 0.
|
|
158
|
+
| picker | 6.3 KB | tabs | 6.2 KB | form | 4.7 KB |
|
|
159
|
+
| dialog | 4.6 KB | cascader | 4.5 KB | field | 4.4 KB |
|
|
160
|
+
| calendar | 4.2 KB | slider | 4.1 KB | number-keyboard | 4.0 KB |
|
|
161
|
+
| toast | 3.9 KB | swiper | 3.9 KB | popup | 3.8 KB |
|
|
162
|
+
| notify | 3.7 KB | image-preview | 3.6 KB | checkbox | 3.6 KB |
|
|
163
|
+
| stepper | 3.6 KB | button | 3.6 KB | cell | 3.4 KB |
|
|
164
|
+
| radio | 3.3 KB | grid | 3.2 KB | tabbar | 3.0 KB |
|
|
165
|
+
| notice-bar | 2.9 KB | collapse | 2.8 KB | config-provider | 2.8 KB |
|
|
166
|
+
| password-input | 2.8 KB | action-sheet | 2.8 KB | image | 2.7 KB |
|
|
167
|
+
| sidebar | 2.6 KB | datetime-picker | 2.5 KB | share-sheet | 2.4 KB |
|
|
168
|
+
| progress | 2.3 KB | selector | 2.2 KB | nav-bar | 2.2 KB |
|
|
169
|
+
| portal | 2.1 KB | typography | 2.1 KB | circle | 2.0 KB |
|
|
170
|
+
| search | 2.0 KB | skeleton | 1.9 KB | badge | 1.9 KB |
|
|
171
|
+
| water-mark | 1.9 KB | tag | 1.8 KB | flex | 1.6 KB |
|
|
172
|
+
| space | 1.6 KB | avatar | 1.5 KB | divider | 1.4 KB |
|
|
173
|
+
| empty | 1.4 KB | input | 1.3 KB | area | 1.2 KB |
|
|
174
|
+
| count-down | 1.1 KB | loading | 1.1 KB | switch | 1.0 KB |
|
|
175
|
+
| overlay | 0.8 KB | error-boundary | 0.6 KB | safe-area-view | 0.5 KB |
|
|
176
176
|
|
|
177
177
|
## 版本与反馈
|
|
178
178
|
|
|
179
|
-
当前为 v1.0.
|
|
179
|
+
当前为 v1.0.6,欢迎 issue / PR。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlexContext=exports.Flex=void 0;var _tokens=require("./tokens");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,a=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,o,i={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return i;if(n=t?a:r){if(n.has(e))return n.get(e);n.set(e,i)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((o=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(o.get||o.set)?n(i,t,o):i[t]=e[t]);return i})(e,t)}const FlexContext=exports.FlexContext=_react().default.createContext({horizontalGap:0,verticalGap:0,columns:24}),alignMap={start:"flex-start",center:"center",end:"flex-end",baseline:"baseline",stretch:"stretch"},justifyMap={start:"flex-start",end:"flex-end",center:"center",around:"space-around",between:"space-between"},FlexImpl=e=>{const{tokensOverride:t,children:r,direction:a,wrap:n,gutter:o,align:i,justify:l,style:
|
|
1
|
+
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlexContext=exports.Flex=void 0;var _tokens=require("./tokens");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,a=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,o,i={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return i;if(n=t?a:r){if(n.has(e))return n.get(e);n.set(e,i)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((o=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(o.get||o.set)?n(i,t,o):i[t]=e[t]);return i})(e,t)}const FlexContext=exports.FlexContext=_react().default.createContext({horizontalGap:0,verticalGap:0,columns:24}),alignMap={start:"flex-start",center:"center",end:"flex-end",baseline:"baseline",stretch:"stretch"},justifyMap={start:"flex-start",end:"flex-end",center:"center",around:"space-around",between:"space-between"},FlexImpl=e=>{const{tokensOverride:t,children:r,direction:a,wrap:n,gutter:o,align:i,justify:l,style:u,columns:c}=e,s=(0,_tokens.useFlexTokens)(t),f=a??s.defaults.direction,p=n??s.defaults.wrap,d=o??s.defaults.gutter,x=i??s.defaults.align,_=l??s.defaults.justify,y=Math.max(1,c??s.defaults.columns),[m,v]=Array.isArray(d)?d:[d,0],M=Math.max(0,m??0),g=Math.max(0,v??0),h=(0,_react().useMemo)(()=>({horizontalGap:M,verticalGap:g,columns:y}),[M,g,y]);return _react().default.createElement(FlexContext.Provider,{value:h},_react().default.createElement(_reactNative().View,{style:[s.layout.container,{flexDirection:f,flexWrap:p,alignItems:alignMap[x],justifyContent:justifyMap[_],columnGap:M||void 0,rowGap:g||void 0},u]},r))},Flex=exports.Flex=_react().default.memo(FlexImpl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlexItem=void 0;var _FlexContext=require("./FlexContext"),_utils=require("../../utils");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,i=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,l
|
|
1
|
+
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.FlexItem=void 0;var _FlexContext=require("./FlexContext"),_utils=require("../../utils");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,i=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,u,l={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return l;if(n=t?i:r){if(n.has(e))return n.get(e);n.set(e,l)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((u=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(u.get||u.set)?n(l,t,u):l[t]=e[t]);return l})(e,t)}const parseFlex=e=>{if((0,_utils.isNumber)(e))return{flex:e};if(!e)return;const t=e.trim();if(!t)return;if("auto"===t)return{flexGrow:1,flexShrink:1,flexBasis:"auto"};if("none"===t)return{flexGrow:0,flexShrink:0,flexBasis:"auto"};const r=Number(t);if((0,_utils.isNumber)(r))return{flex:r};const i=t.split(/\s+/);if(i.length>=2){const[e,t]=i.map(Number);if((0,_utils.isNumber)(e)&&(0,_utils.isNumber)(t)){const r=i.slice(2).join(" ");let n;if("auto"===r)n="auto";else if(r){const e=r.match(/^(-?\d+(?:\.\d+)?)px$/),t=Number(e?e[1]:r);(0,_utils.isNumber)(t)&&(n=t)}return{flexGrow:e,flexShrink:t,flexBasis:n}}}},FlexItemImpl=({span:e,flex:t,style:r,children:i})=>{const{columns:n}=(0,_react().useContext)(_FlexContext.FlexContext);if((0,_utils.isNumber)(e)&&e<=0)return null;const u={};if((0,_utils.isNumber)(e)){const t=Math.max(1,n),r=Math.min(Math.max(e,0),t)/t;u.flexBasis=100*r+"%",u.flexGrow=0,u.flexShrink=1}return _react().default.createElement(_reactNative().View,{style:[u,parseFlex(t),r]},i)},FlexItem=exports.FlexItem=_react().default.memo(FlexItemImpl);FlexItem.displayName="FlexItem";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.GridContext=exports.Grid=void 0;var _utils=require("../../utils"),_tokens=require("./tokens");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,o=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var a,i
|
|
1
|
+
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.GridContext=exports.Grid=void 0;var _utils=require("../../utils"),_tokens=require("./tokens");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,o=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,a,i={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return i;if(n=t?o:r){if(n.has(e))return n.get(e);n.set(e,i)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((a=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?n(i,t,a):i[t]=e[t]);return i})(e,t)}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)({}).hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},_extends.apply(null,arguments)}const GridContext=exports.GridContext=_react().default.createContext(null),GridImpl=e=>{const{tokensOverride:t,children:r,columnNum:o,gutter:n,border:a,center:i,square:u,direction:l,reverse:c,clickable:s,iconSize:d,iconColor:f,style:_,onLayout:m,...p}=e,y=(0,_tokens.useGridTokens)(t),[b,v]=_react().default.useState(0),g=(0,_react().useMemo)(()=>{const e=o??y.defaults.columnNum;return Number.isFinite(e)&&e>0?Math.floor(e):y.defaults.columnNum},[o,y.defaults.columnNum]),k=(0,_react().useMemo)(()=>{const e=n??y.defaults.gutter;return Number.isFinite(e)&&e>0?e:0},[n,y.defaults.gutter]),x=a??y.defaults.border,G=i??y.defaults.center,M=u??y.defaults.square,N=l??y.defaults.direction,h=c??y.defaults.reverse,w=s??y.defaults.clickable,q=(0,_react().useMemo)(()=>{const e=d??y.defaults.iconSize;return Number.isFinite(e)&&e>0?e:y.defaults.iconSize},[d,y.defaults.iconSize]),C=(0,_react().useMemo)(()=>_react().default.Children.toArray(r).filter(e=>_react().default.isValidElement(e)),[r]),O=x&&!k,E=y.colors.border,W=(0,_react().useMemo)(()=>O?_react().default.createElement(_reactNative().View,{style:[y.layout.border,y.layout.borderTop,(0,_utils.createHairlineView)({position:"top",color:E,left:0,right:0,top:0})]}):null,[E,O,y.layout.border,y.layout.borderTop]),j=(0,_react().useMemo)(()=>O?_react().default.createElement(_reactNative().View,{style:[y.layout.border,y.layout.borderBottom,(0,_utils.createHairlineView)({position:"bottom",color:E,left:0,right:0,bottom:0})]}):null,[E,O,y.layout.border,y.layout.borderBottom]),P=(0,_react().useMemo)(()=>({columnNum:g,gutter:k,border:x,center:G,square:M,direction:N,reverse:h,clickable:w,iconSize:q,iconColor:f,count:C.length,containerWidth:b,tokens:y}),[x,G,C.length,w,g,b,N,k,f,q,h,M,y]),S=(0,_react().useMemo)(()=>C.map((e,t)=>_react().default.cloneElement(e,{gridItemIndex:t,key:e.key??t})),[C]),V=(0,_react().useCallback)(e=>{v(e.nativeEvent.layout.width),m?.(e)},[m]);return _react().default.createElement(GridContext.Provider,{value:P},_react().default.createElement(_reactNative().View,_extends({accessibilityRole:"grid",onLayout:V,style:[y.layout.container,k?{columnGap:k,rowGap:k}:void 0,_]},p),W,S,j))},Grid=exports.Grid=_react().default.memo(GridImpl);Grid.displayName="Grid";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.GridItem=void 0;var _designSystem=require("../../design-system"),_badge=_interopRequireDefault(require("../badge")),_utils=require("../../utils"),_GridContext=require("./GridContext");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,i=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var o,n,a={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return a;if(o=t?i:r){if(o.has(e))return o.get(e);o.set(e,a)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((n=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(n.get||n.set)?o(a,t,n):a[t]=e[t]);return a})(e,t)}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)({}).hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},_extends.apply(null,arguments)}const GridItemImpl=e=>{const t=(0,_react().useContext)(_GridContext.GridContext);if(!t)throw new Error("GridItem must be used within Grid");const{gridItemIndex:r=0,text:i,icon:o,iconColor:n,badge:a,dot:l,contentStyle:c,textStyle:u,children:s,style:d,onPress:f,...p}=e,{tokens:y,columnNum:
|
|
1
|
+
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.GridItem=void 0;var _designSystem=require("../../design-system"),_badge=_interopRequireDefault(require("../badge")),_utils=require("../../utils"),_GridContext=require("./GridContext");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,i=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var o,n,a={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return a;if(o=t?i:r){if(o.has(e))return o.get(e);o.set(e,a)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((n=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(n.get||n.set)?o(a,t,n):a[t]=e[t]);return a})(e,t)}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)({}).hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},_extends.apply(null,arguments)}const GridItemImpl=e=>{const t=(0,_react().useContext)(_GridContext.GridContext);if(!t)throw new Error("GridItem must be used within Grid");const{gridItemIndex:r=0,text:i,icon:o,iconColor:n,badge:a,dot:l,contentStyle:c,textStyle:u,children:s,style:d,onPress:f,...p}=e,{tokens:y,columnNum:m,gutter:_,border:g,center:h,square:x,direction:b,reverse:v,clickable:w,iconSize:G,iconColor:W,count:S,containerWidth:q}=t,N=(r+1)%m===0,O=Math.floor(r/m),C=Math.floor((S-1)/m),I=[y.layout.itemContentBase,"horizontal"===b?y.layout.itemHorizontal:y.layout.itemVertical,h&&y.layout.itemCenter,v?"horizontal"===b?y.layout.itemReverseRow:y.layout.itemReverseColumn:null,x?y.layout.itemContentSquare:null,{paddingHorizontal:y.spacing.paddingHorizontal,paddingVertical:y.spacing.paddingVertical,backgroundColor:y.colors.background},c],R=(0,_utils.isRenderable)(i),z=n??W??y.colors.text,H=(0,_react().useMemo)(()=>{if(s)return(0,_utils.isText)(s)?(0,_utils.renderTextOrNode)(s,[y.layout.text,{color:y.colors.text,fontSize:y.typography.fontSize,lineHeight:y.typography.lineHeight,fontFamily:y.typography.fontFamily,fontWeight:y.typography.fontWeight},u]):s;let e=null;if(o||a||l){const{style:t,...r}=a??{},i="vertical"===b?v?"marginTop":"marginBottom":v?"marginLeft":"marginRight",n=[y.layout.iconWrapper,R&&{[i]:y.spacing.iconGap}],c=(0,_utils.isFunction)(o)?o(G,z):o,u=_react().default.createElement(_reactNative().View,{style:n},c);e=a||l?_react().default.createElement(_badge.default,_extends({dot:l},r,{style:h?[t,{alignSelf:"center"}]:t}),u):u}const t=R&&((0,_utils.isText)(i)?_react().default.createElement(_designSystem.Text,{style:[y.layout.text,{color:y.colors.text,fontSize:y.typography.fontSize,lineHeight:y.typography.lineHeight,fontFamily:y.typography.fontFamily,fontWeight:y.typography.fontWeight},u],numberOfLines:y.defaults.textNumberOfLines},i):i);return _react().default.createElement(_react().default.Fragment,null,e,t)},[a,h,s,b,l,R,o,G,z,v,i,u,y.colors.text,y.defaults.textNumberOfLines,y.layout.iconWrapper,y.layout.text,y.spacing.iconGap,y.typography.fontFamily,y.typography.fontSize,y.typography.fontWeight,y.typography.lineHeight]),E=!g||_||N?null:_react().default.createElement(_reactNative().View,{style:[y.layout.itemBorderRight,(0,_utils.createHairlineView)({position:"right",color:y.colors.border,top:0,bottom:0,right:0})]}),V=g&&!_&&O<C?_react().default.createElement(_reactNative().View,{style:[y.layout.itemBorderBottom,(0,_utils.createHairlineView)({position:"bottom",color:y.colors.border,left:0,right:0,bottom:0})]}):null,k=_react().default.createElement(_reactNative().View,{style:I},H,E,V),M=_>0&&q>0?{width:(q-(m-1)*_)/m,flexGrow:0,flexShrink:0}:{flexBasis:100/m+"%",flexGrow:0,flexShrink:1,minWidth:0,minHeight:0};return w||(0,_utils.isFunction)(f)?_react().default.createElement(_reactNative().Pressable,_extends({accessibilityRole:"button",style:e=>[M,"function"==typeof d?d(e):d,{opacity:e.pressed?y.defaults.pressedOpacity:1}],android_ripple:{color:y.colors.active},onPress:f},p),k):_react().default.createElement(_reactNative().View,_extends({style:[M,"function"==typeof d?d({pressed:!1}):d]},p),k)},GridItem=exports.GridItem=_react().default.memo(GridItemImpl);GridItem.displayName="GridItem";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Selector=void 0;var _tokens=require("./tokens"),_hooks=require("../../hooks"),_utils=require("../../utils");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var
|
|
1
|
+
"use strict";function _react(){const e=_interopRequireWildcard(require("react"));return _react=function(){return e},e}function _reactNative(){const e=require("react-native");return _reactNative=function(){return e},e}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Selector=void 0;var _tokens=require("./tokens"),_hooks=require("../../hooks"),_utils=require("../../utils");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var o=new WeakMap,r=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var a,l,i={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return i;if(a=t?r:o){if(a.has(e))return a.get(e);a.set(e,i)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((l=(a=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(l.get||l.set)?a(i,t,l):i[t]=e[t]);return i})(e,t)}function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)({}).hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},_extends.apply(null,arguments)}const CHECK_MARK="✓",CH=8,CW=10,SelectorOptionItemImpl=({option:e,active:t,disabled:o,multiple:r,showCheckMark:a,basis:l,containerWidth:i,columns:n,gap:c,tokens:s,itemStyle:u,labelStyle:d,descriptionStyle:p,onToggle:f})=>{const y=e.label,m=e.description,_=null!=m,g=(0,_utils.isText)(y)?String(y):String(e.value),b=(0,_utils.isText)(m)?String(m):void 0,{interactionProps:h,states:S}=(0,_hooks.useAriaPress)({disabled:o,onPress:()=>f(e),extraProps:{accessibilityRole:r?"checkbox":"radio",accessibilityLabel:g,accessibilityHint:b,accessibilityState:r?{checked:t,disabled:o}:{selected:t,disabled:o}}}),k=i>0?{width:(i-(n-1)*c)/n,flexGrow:0,flexShrink:0}:{flexBasis:l,flexShrink:1};return _react().default.createElement(_reactNative().Pressable,_extends({},h,{style:[s.layout.pressable,k]}),_react().default.createElement(_reactNative().View,{style:[s.layout.item,{paddingHorizontal:s.spacing.paddingHorizontal,paddingVertical:s.spacing.paddingVertical,borderRadius:s.radii.item,borderColor:t?s.colors.borderActive:s.colors.border,backgroundColor:t?s.colors.backgroundActive:s.colors.background,opacity:o?s.states.disabledOpacity:1},S.pressed&&{opacity:.9},u]},(0,_utils.isText)(y)?_react().default.createElement(_reactNative().Text,{style:[s.layout.label,{color:t?s.colors.textActive:s.colors.text,fontSize:s.typography.fontSize,lineHeight:1.4*s.typography.fontSize,fontFamily:s.typography.fontFamily,fontWeight:s.typography.fontWeight},d]},y):y,_?(0,_utils.isText)(m)?_react().default.createElement(_reactNative().Text,{style:[s.layout.description,{marginTop:s.spacing.descriptionMarginTop,color:o?s.colors.disabledText:s.colors.description,fontSize:s.typography.descriptionSize,lineHeight:1.4*s.typography.descriptionSize},p]},m):_react().default.createElement(_reactNative().View,{style:{marginTop:s.spacing.descriptionMarginTop}},m):null,t&&a?_react().default.createElement(_react().default.Fragment,null,_react().default.createElement(_reactNative().View,{style:[s.layout.checkMarkTriangle,{borderTopWidth:8,borderBottomWidth:8,borderLeftWidth:10,borderRightWidth:10,borderBottomColor:s.colors.check,borderRightColor:s.colors.check}]}),_react().default.createElement(_reactNative().Text,{style:[s.layout.checkMark,{color:s.colors.checkForeground}]},"✓")):null))},SelectorOptionItemMemo=_react().default.memo(SelectorOptionItemImpl);SelectorOptionItemMemo.displayName="SelectorOptionItem";const SelectorOptionItem=SelectorOptionItemMemo,SelectorImpl=e=>{const{tokensOverride:t,options:o,columns:r,multiple:a,showCheckMark:l,disabled:i,onChange:n,itemStyle:c,labelStyle:s,descriptionStyle:u,style:d,onLayout:p,...f}=e,y=(0,_tokens.useSelectorTokens)(t),[m,_]=_react().default.useState(0),g=r??y.defaults.columns??1,b=a??y.defaults.multiple,h=l??y.defaults.showCheckMark,S=Boolean(i??y.defaults.disabled),[k=[],v]=(0,_hooks.useControllableValue)(e,{defaultValue:[]}),x=(0,_react().useMemo)(()=>{const e=new Map;for(const t of o)e.set(t.value,t);return e},[o]),M=Math.max(1,Math.floor(g)),w=100/M+"%",O=y.spacing.gap,T=(0,_react().useMemo)(()=>new Set(k),[k]),C=(0,_react().useCallback)(e=>{if(S||e.disabled)return;const t=T.has(e.value),o=b?t?k.filter(t=>t!==e.value):[...k,e.value]:t?[]:[e.value];v(o,{items:o.map(e=>x.get(e)).filter(Boolean)})},[S,b,x,T,v,k]),W=(0,_react().useCallback)(e=>{_(e.nativeEvent.layout.width),p?.(e)},[p]);return _react().default.createElement(_reactNative().View,_extends({},f,{onLayout:W,style:[y.layout.container,{columnGap:O,rowGap:O},d],accessibilityRole:b?void 0:"radiogroup"}),o.map(e=>_react().default.createElement(SelectorOptionItem,{key:String(e.value),option:e,active:T.has(e.value),disabled:S||Boolean(e.disabled),multiple:b,showCheckMark:h,basis:w,containerWidth:m,columns:M,gap:O,tokens:y,itemStyle:c,labelStyle:s,descriptionStyle:u,onToggle:C})))},Selector=exports.Selector=_react().default.memo(SelectorImpl);Selector.displayName="Selector";var _default=exports.default=Selector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import React,{useMemo}from"react";import{
|
|
1
|
+
import React,{useMemo}from"react";import{View}from"react-native";import{useFlexTokens}from"./tokens";export const FlexContext=React.createContext({horizontalGap:0,verticalGap:0,columns:24});const alignMap={start:"flex-start",center:"center",end:"flex-end",baseline:"baseline",stretch:"stretch"},justifyMap={start:"flex-start",end:"flex-end",center:"center",around:"space-around",between:"space-between"},FlexImpl=e=>{const{tokensOverride:t,children:a,direction:r,wrap:n,gutter:l,align:o,justify:s,style:i,columns:c}=e,u=useFlexTokens(t),m=r??u.defaults.direction,p=n??u.defaults.wrap,x=l??u.defaults.gutter,f=o??u.defaults.align,d=s??u.defaults.justify,y=Math.max(1,c??u.defaults.columns),[M,h]=Array.isArray(x)?x:[x,0],v=Math.max(0,M??0),g=Math.max(0,h??0),w=useMemo(()=>({horizontalGap:v,verticalGap:g,columns:y}),[v,g,y]);return React.createElement(FlexContext.Provider,{value:w},React.createElement(View,{style:[u.layout.container,{flexDirection:m,flexWrap:p,alignItems:alignMap[f],justifyContent:justifyMap[d],columnGap:v||void 0,rowGap:g||void 0},i]},a))};export const Flex=React.memo(FlexImpl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import React,{useContext}from"react";import{
|
|
1
|
+
import React,{useContext}from"react";import{View}from"react-native";import{FlexContext}from"./FlexContext";import{isNumber}from"../../utils";const parseFlex=e=>{if(isNumber(e))return{flex:e};if(!e)return;const t=e.trim();if(!t)return;if("auto"===t)return{flexGrow:1,flexShrink:1,flexBasis:"auto"};if("none"===t)return{flexGrow:0,flexShrink:0,flexBasis:"auto"};const r=Number(t);if(isNumber(r))return{flex:r};const i=t.split(/\s+/);if(i.length>=2){const[e,t]=i.map(Number);if(isNumber(e)&&isNumber(t)){const r=i.slice(2).join(" ");let l;if("auto"===r)l="auto";else if(r){const e=r.match(/^(-?\d+(?:\.\d+)?)px$/),t=Number(e?e[1]:r);isNumber(t)&&(l=t)}return{flexGrow:e,flexShrink:t,flexBasis:l}}}},FlexItemImpl=({span:e,flex:t,style:r,children:i})=>{const{columns:l}=useContext(FlexContext);if(isNumber(e)&&e<=0)return null;const s={};if(isNumber(e)){const t=Math.max(1,l),r=Math.min(Math.max(e,0),t)/t;s.flexBasis=100*r+"%",s.flexGrow=0,s.flexShrink=1}return React.createElement(View,{style:[s,parseFlex(t),r]},i)};export const FlexItem=React.memo(FlexItemImpl);FlexItem.displayName="FlexItem";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var
|
|
1
|
+
function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)({}).hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},_extends.apply(null,arguments)}import React,{useCallback,useMemo}from"react";import{View}from"react-native";import{createHairlineView}from"../../utils";import{useGridTokens}from"./tokens";export const GridContext=React.createContext(null);const GridImpl=e=>{const{tokensOverride:t,children:o,columnNum:r,gutter:i,border:n,center:l,square:a,direction:u,reverse:c,clickable:s,iconSize:d,iconColor:m,style:b,onLayout:f,...y}=e,p=useGridTokens(t),[g,v]=React.useState(0),k=useMemo(()=>{const e=r??p.defaults.columnNum;return Number.isFinite(e)&&e>0?Math.floor(e):p.defaults.columnNum},[r,p.defaults.columnNum]),R=useMemo(()=>{const e=i??p.defaults.gutter;return Number.isFinite(e)&&e>0?e:0},[i,p.defaults.gutter]),h=n??p.defaults.border,G=l??p.defaults.center,w=a??p.defaults.square,x=u??p.defaults.direction,M=c??p.defaults.reverse,N=s??p.defaults.clickable,C=useMemo(()=>{const e=d??p.defaults.iconSize;return Number.isFinite(e)&&e>0?e:p.defaults.iconSize},[d,p.defaults.iconSize]),V=useMemo(()=>React.Children.toArray(o).filter(e=>React.isValidElement(e)),[o]),E=h&&!R,S=p.colors.border,z=useMemo(()=>E?React.createElement(View,{style:[p.layout.border,p.layout.borderTop,createHairlineView({position:"top",color:S,left:0,right:0,top:0})]}):null,[S,E,p.layout.border,p.layout.borderTop]),I=useMemo(()=>E?React.createElement(View,{style:[p.layout.border,p.layout.borderBottom,createHairlineView({position:"bottom",color:S,left:0,right:0,bottom:0})]}):null,[S,E,p.layout.border,p.layout.borderBottom]),O=useMemo(()=>({columnNum:k,gutter:R,border:h,center:G,square:w,direction:x,reverse:M,clickable:N,iconSize:C,iconColor:m,count:V.length,containerWidth:g,tokens:p}),[h,G,V.length,N,k,g,x,R,m,C,M,w,p]),T=useMemo(()=>V.map((e,t)=>React.cloneElement(e,{gridItemIndex:t,key:e.key??t})),[V]),_=useCallback(e=>{v(e.nativeEvent.layout.width),f?.(e)},[f]);return React.createElement(GridContext.Provider,{value:O},React.createElement(View,_extends({accessibilityRole:"grid",onLayout:_,style:[p.layout.container,R?{columnGap:R,rowGap:R}:void 0,b]},y),z,T,I))};export const Grid=React.memo(GridImpl);Grid.displayName="Grid";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)({}).hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},_extends.apply(null,arguments)}import React,{useContext,useMemo}from"react";import{
|
|
1
|
+
function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)({}).hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},_extends.apply(null,arguments)}import React,{useContext,useMemo}from"react";import{Pressable,View}from"react-native";import{Text}from"../../design-system";import Badge from"../badge";import{createHairlineView,isFunction,isRenderable,isText,renderTextOrNode}from"../../utils";import{GridContext}from"./GridContext";const GridItemImpl=e=>{const t=useContext(GridContext);if(!t)throw new Error("GridItem must be used within Grid");const{gridItemIndex:o=0,text:r,icon:i,iconColor:n,badge:a,dot:l,contentStyle:s,textStyle:c,children:m,style:p,onPress:y,...d}=e,{tokens:u,columnNum:g,gutter:f,border:h,center:x,square:b,direction:R,reverse:w,clickable:G,iconSize:C,iconColor:H,count:S,containerWidth:V}=t,z=(o+1)%g===0,E=Math.floor(o/g),I=Math.floor((S-1)/g),v=[u.layout.itemContentBase,"horizontal"===R?u.layout.itemHorizontal:u.layout.itemVertical,x&&u.layout.itemCenter,w?"horizontal"===R?u.layout.itemReverseRow:u.layout.itemReverseColumn:null,b?u.layout.itemContentSquare:null,{paddingHorizontal:u.spacing.paddingHorizontal,paddingVertical:u.spacing.paddingVertical,backgroundColor:u.colors.background},s],F=isRenderable(r),O=n??H??u.colors.text,W=useMemo(()=>{if(m)return isText(m)?renderTextOrNode(m,[u.layout.text,{color:u.colors.text,fontSize:u.typography.fontSize,lineHeight:u.typography.lineHeight,fontFamily:u.typography.fontFamily,fontWeight:u.typography.fontWeight},c]):m;let e=null;if(i||a||l){const{style:t,...o}=a??{},r="vertical"===R?w?"marginTop":"marginBottom":w?"marginLeft":"marginRight",n=[u.layout.iconWrapper,F&&{[r]:u.spacing.iconGap}],s=isFunction(i)?i(C,O):i,c=React.createElement(View,{style:n},s);e=a||l?React.createElement(Badge,_extends({dot:l},o,{style:x?[t,{alignSelf:"center"}]:t}),c):c}const t=F&&(isText(r)?React.createElement(Text,{style:[u.layout.text,{color:u.colors.text,fontSize:u.typography.fontSize,lineHeight:u.typography.lineHeight,fontFamily:u.typography.fontFamily,fontWeight:u.typography.fontWeight},c],numberOfLines:u.defaults.textNumberOfLines},r):r);return React.createElement(React.Fragment,null,e,t)},[a,x,m,R,l,F,i,C,O,w,r,c,u.colors.text,u.defaults.textNumberOfLines,u.layout.iconWrapper,u.layout.text,u.spacing.iconGap,u.typography.fontFamily,u.typography.fontSize,u.typography.fontWeight,u.typography.lineHeight]),B=!h||f||z?null:React.createElement(View,{style:[u.layout.itemBorderRight,createHairlineView({position:"right",color:u.colors.border,top:0,bottom:0,right:0})]}),T=h&&!f&&E<I?React.createElement(View,{style:[u.layout.itemBorderBottom,createHairlineView({position:"bottom",color:u.colors.border,left:0,right:0,bottom:0})]}):null,_=React.createElement(View,{style:v},W,B,T),k=f>0&&V>0?{width:(V-(g-1)*f)/g,flexGrow:0,flexShrink:0}:{flexBasis:100/g+"%",flexGrow:0,flexShrink:1,minWidth:0,minHeight:0};return G||isFunction(y)?React.createElement(Pressable,_extends({accessibilityRole:"button",style:e=>[k,"function"==typeof p?p(e):p,{opacity:e.pressed?u.defaults.pressedOpacity:1}],android_ripple:{color:u.colors.active},onPress:y},d),_):React.createElement(View,_extends({style:[k,"function"==typeof p?p({pressed:!1}):p]},d),_)};export const GridItem=React.memo(GridItemImpl);GridItem.displayName="GridItem";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var l in o)({}).hasOwnProperty.call(o,l)&&(e[l]=o[l])}return e},_extends.apply(null,arguments)}import React,{useCallback,useMemo}from"react";import{Pressable,Text,View}from"react-native";import{useSelectorTokens}from"./tokens";import{useAriaPress,useControllableValue}from"../../hooks";import{isText}from"../../utils";const CHECK_MARK="✓",
|
|
1
|
+
function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var l in o)({}).hasOwnProperty.call(o,l)&&(e[l]=o[l])}return e},_extends.apply(null,arguments)}import React,{useCallback,useMemo}from"react";import{Pressable,Text,View}from"react-native";import{useSelectorTokens}from"./tokens";import{useAriaPress,useControllableValue}from"../../hooks";import{isText}from"../../utils";const CHECK_MARK="✓",CH=8,CW=10,SelectorOptionItemImpl=({option:e,active:t,disabled:o,multiple:l,showCheckMark:a,basis:i,containerWidth:r,columns:s,gap:c,tokens:n,itemStyle:d,labelStyle:p,descriptionStyle:m,onToggle:u})=>{const y=e.label,b=e.description,g=null!=b,h=isText(y)?String(y):String(e.value),S=isText(b)?String(b):void 0,{interactionProps:f,states:k}=useAriaPress({disabled:o,onPress:()=>u(e),extraProps:{accessibilityRole:l?"checkbox":"radio",accessibilityLabel:h,accessibilityHint:S,accessibilityState:l?{checked:t,disabled:o}:{selected:t,disabled:o}}}),x=r>0?{width:(r-(s-1)*c)/s,flexGrow:0,flexShrink:0}:{flexBasis:i,flexShrink:1};return React.createElement(Pressable,_extends({},f,{style:[n.layout.pressable,x]}),React.createElement(View,{style:[n.layout.item,{paddingHorizontal:n.spacing.paddingHorizontal,paddingVertical:n.spacing.paddingVertical,borderRadius:n.radii.item,borderColor:t?n.colors.borderActive:n.colors.border,backgroundColor:t?n.colors.backgroundActive:n.colors.background,opacity:o?n.states.disabledOpacity:1},k.pressed&&{opacity:.9},d]},isText(y)?React.createElement(Text,{style:[n.layout.label,{color:t?n.colors.textActive:n.colors.text,fontSize:n.typography.fontSize,lineHeight:1.4*n.typography.fontSize,fontFamily:n.typography.fontFamily,fontWeight:n.typography.fontWeight},p]},y):y,g?isText(b)?React.createElement(Text,{style:[n.layout.description,{marginTop:n.spacing.descriptionMarginTop,color:o?n.colors.disabledText:n.colors.description,fontSize:n.typography.descriptionSize,lineHeight:1.4*n.typography.descriptionSize},m]},b):React.createElement(View,{style:{marginTop:n.spacing.descriptionMarginTop}},b):null,t&&a?React.createElement(React.Fragment,null,React.createElement(View,{style:[n.layout.checkMarkTriangle,{borderTopWidth:8,borderBottomWidth:8,borderLeftWidth:10,borderRightWidth:10,borderBottomColor:n.colors.check,borderRightColor:n.colors.check}]}),React.createElement(Text,{style:[n.layout.checkMark,{color:n.colors.checkForeground}]},"✓")):null))},SelectorOptionItemMemo=React.memo(SelectorOptionItemImpl);SelectorOptionItemMemo.displayName="SelectorOptionItem";const SelectorOptionItem=SelectorOptionItemMemo,SelectorImpl=e=>{const{tokensOverride:t,options:o,columns:l,multiple:a,showCheckMark:i,disabled:r,onChange:s,itemStyle:c,labelStyle:n,descriptionStyle:d,style:p,onLayout:m,...u}=e,y=useSelectorTokens(t),[b,g]=React.useState(0),h=l??y.defaults.columns??1,S=a??y.defaults.multiple,f=i??y.defaults.showCheckMark,k=Boolean(r??y.defaults.disabled),[x=[],v]=useControllableValue(e,{defaultValue:[]}),R=useMemo(()=>{const e=new Map;for(const t of o)e.set(t.value,t);return e},[o]),T=Math.max(1,Math.floor(h)),C=100/T+"%",M=y.spacing.gap,w=useMemo(()=>new Set(x),[x]),O=useCallback(e=>{if(k||e.disabled)return;const t=w.has(e.value),o=S?t?x.filter(t=>t!==e.value):[...x,e.value]:t?[]:[e.value];v(o,{items:o.map(e=>R.get(e)).filter(Boolean)})},[k,S,R,w,v,x]),E=useCallback(e=>{g(e.nativeEvent.layout.width),m?.(e)},[m]);return React.createElement(View,_extends({},u,{onLayout:E,style:[y.layout.container,{columnGap:M,rowGap:M},p],accessibilityRole:S?void 0:"radiogroup"}),o.map(e=>React.createElement(SelectorOptionItem,{key:String(e.value),option:e,active:w.has(e.value),disabled:k||Boolean(e.disabled),multiple:S,showCheckMark:f,basis:C,containerWidth:b,columns:T,gap:M,tokens:y,itemStyle:c,labelStyle:n,descriptionStyle:d,onToggle:O})))};export const Selector=React.memo(SelectorImpl);Selector.displayName="Selector";export default Selector;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-system-ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "面向 React Native 的设计系统级组件库,Tokens + ThemeProvider 主题体系,按需引入、体积小;API 统一可组合、高效可靠,支持可访问性与多端一致。",
|
|
5
5
|
"homepage": "https://rn-system-ui.netlify.app/",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|