react-native-x-components 0.1.0

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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/dist/XActionSheet/index.d.ts +47 -0
  4. package/dist/XActionSheet/index.js +100 -0
  5. package/dist/XAnimatedSearchPanel/index.d.ts +33 -0
  6. package/dist/XAnimatedSearchPanel/index.js +295 -0
  7. package/dist/XAnimatedView/index.d.ts +77 -0
  8. package/dist/XAnimatedView/index.js +227 -0
  9. package/dist/XButton/index.d.ts +44 -0
  10. package/dist/XButton/index.js +126 -0
  11. package/dist/XCalendar/XCalendarPopup.d.ts +38 -0
  12. package/dist/XCalendar/XCalendarPopup.js +76 -0
  13. package/dist/XCalendar/index.d.ts +50 -0
  14. package/dist/XCalendar/index.js +241 -0
  15. package/dist/XCarousel/index.d.ts +72 -0
  16. package/dist/XCarousel/index.js +183 -0
  17. package/dist/XCascadeSelect/index.d.ts +39 -0
  18. package/dist/XCascadeSelect/index.js +147 -0
  19. package/dist/XChart/index.d.ts +78 -0
  20. package/dist/XChart/index.js +162 -0
  21. package/dist/XCheckbox/index.d.ts +61 -0
  22. package/dist/XCheckbox/index.js +128 -0
  23. package/dist/XConfirmForm/index.d.ts +69 -0
  24. package/dist/XConfirmForm/index.js +113 -0
  25. package/dist/XDivider/index.d.ts +33 -0
  26. package/dist/XDivider/index.js +61 -0
  27. package/dist/XDropdownMenu/index.d.ts +66 -0
  28. package/dist/XDropdownMenu/index.js +258 -0
  29. package/dist/XElevator/index.d.ts +52 -0
  30. package/dist/XElevator/index.js +138 -0
  31. package/dist/XForm/FormStore.d.ts +82 -0
  32. package/dist/XForm/FormStore.js +279 -0
  33. package/dist/XForm/index.d.ts +116 -0
  34. package/dist/XForm/index.js +212 -0
  35. package/dist/XForm/types.d.ts +82 -0
  36. package/dist/XForm/types.js +1 -0
  37. package/dist/XForm/useForm.d.ts +2 -0
  38. package/dist/XForm/useForm.js +19 -0
  39. package/dist/XForm/utils.d.ts +42 -0
  40. package/dist/XForm/utils.js +131 -0
  41. package/dist/XForm/validate.d.ts +20 -0
  42. package/dist/XForm/validate.js +118 -0
  43. package/dist/XFormPro/components/FieldTrigger.d.ts +14 -0
  44. package/dist/XFormPro/components/FieldTrigger.js +38 -0
  45. package/dist/XFormPro/components/XDateField.d.ts +22 -0
  46. package/dist/XFormPro/components/XDateField.js +22 -0
  47. package/dist/XFormPro/components/XSelectField.d.ts +16 -0
  48. package/dist/XFormPro/components/XSelectField.js +19 -0
  49. package/dist/XFormPro/index.d.ts +44 -0
  50. package/dist/XFormPro/index.js +111 -0
  51. package/dist/XFormPro/renderers.d.ts +24 -0
  52. package/dist/XFormPro/renderers.js +53 -0
  53. package/dist/XFormPro/types.d.ts +142 -0
  54. package/dist/XFormPro/types.js +1 -0
  55. package/dist/XImage/index.d.ts +13 -0
  56. package/dist/XImage/index.js +32 -0
  57. package/dist/XInput/index.d.ts +43 -0
  58. package/dist/XInput/index.js +136 -0
  59. package/dist/XLicensePlate/index.d.ts +40 -0
  60. package/dist/XLicensePlate/index.js +172 -0
  61. package/dist/XLocale/index.d.ts +23 -0
  62. package/dist/XLocale/index.js +174 -0
  63. package/dist/XModalForm/index.d.ts +32 -0
  64. package/dist/XModalForm/index.js +85 -0
  65. package/dist/XMultiSelect/index.d.ts +31 -0
  66. package/dist/XMultiSelect/index.js +131 -0
  67. package/dist/XNumberKeyboard/index.d.ts +57 -0
  68. package/dist/XNumberKeyboard/index.js +142 -0
  69. package/dist/XPicker/index.d.ts +35 -0
  70. package/dist/XPicker/index.js +96 -0
  71. package/dist/XPickerDate/index.d.ts +58 -0
  72. package/dist/XPickerDate/index.js +234 -0
  73. package/dist/XPopupProvider/index.d.ts +23 -0
  74. package/dist/XPopupProvider/index.js +6 -0
  75. package/dist/XProgress/index.d.ts +49 -0
  76. package/dist/XProgress/index.js +196 -0
  77. package/dist/XProviders/XImagePreview/index.d.ts +44 -0
  78. package/dist/XProviders/XImagePreview/index.js +164 -0
  79. package/dist/XProviders/XLoadingModal/index.d.ts +46 -0
  80. package/dist/XProviders/XLoadingModal/index.js +119 -0
  81. package/dist/XProviders/XToast/index.d.ts +50 -0
  82. package/dist/XProviders/XToast/index.js +183 -0
  83. package/dist/XProviders/index.d.ts +31 -0
  84. package/dist/XProviders/index.js +28 -0
  85. package/dist/XProviders/usageExample.d.ts +19 -0
  86. package/dist/XProviders/usageExample.js +83 -0
  87. package/dist/XPullView/index.d.ts +76 -0
  88. package/dist/XPullView/index.js +220 -0
  89. package/dist/XRadio/index.d.ts +83 -0
  90. package/dist/XRadio/index.js +186 -0
  91. package/dist/XRecord/index.d.ts +37 -0
  92. package/dist/XRecord/index.js +160 -0
  93. package/dist/XSignature/XSignatureSkia.d.ts +39 -0
  94. package/dist/XSignature/XSignatureSkia.js +184 -0
  95. package/dist/XSignature/core.d.ts +69 -0
  96. package/dist/XSignature/core.js +108 -0
  97. package/dist/XSignature/index.d.ts +33 -0
  98. package/dist/XSignature/index.js +88 -0
  99. package/dist/XTabs/index.d.ts +65 -0
  100. package/dist/XTabs/index.js +210 -0
  101. package/dist/XTag/index.d.ts +61 -0
  102. package/dist/XTag/index.js +153 -0
  103. package/dist/XTopView/index.d.ts +25 -0
  104. package/dist/XTopView/index.js +8 -0
  105. package/dist/XTopViewStore/index.d.ts +45 -0
  106. package/dist/XTopViewStore/index.js +49 -0
  107. package/dist/XUpload/XUploadImage.d.ts +37 -0
  108. package/dist/XUpload/XUploadImage.js +142 -0
  109. package/dist/XUpload/XUploadVideo.d.ts +24 -0
  110. package/dist/XUpload/XUploadVideo.js +83 -0
  111. package/dist/XUpload/adapters.d.ts +50 -0
  112. package/dist/XUpload/adapters.js +110 -0
  113. package/dist/XUpload/helpers.d.ts +35 -0
  114. package/dist/XUpload/helpers.js +85 -0
  115. package/dist/XUpload/index.d.ts +12 -0
  116. package/dist/XUpload/index.js +5 -0
  117. package/dist/XUpload/provider.d.ts +26 -0
  118. package/dist/XUpload/provider.js +43 -0
  119. package/dist/XUpload/types.d.ts +31 -0
  120. package/dist/XUpload/types.js +4 -0
  121. package/dist/XWheel/index.d.ts +49 -0
  122. package/dist/XWheel/index.js +263 -0
  123. package/dist/index.d.ts +113 -0
  124. package/dist/index.js +127 -0
  125. package/dist/theme.d.ts +164 -0
  126. package/dist/theme.js +161 -0
  127. package/package.json +78 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * ============================================================================
3
+ * X-Components 共享设计 token(对标 antd v5 design token,取值做 RN 适配)
4
+ * ============================================================================
5
+ *
6
+ * 【v2:暗黑模式】
7
+ * - 本文件现在维护两套完整 token:lightTokens / darkTokens,键完全一致;
8
+ * - 组件统一用 useXTheme() 取当前模式的 token(跟随系统 + 可强制覆盖),
9
+ * 旧代码里的 `import {xTheme} from '../theme'` 仍然有效(xTheme === lightTokens),
10
+ * 但只有走 useXTheme() 才能获得暗黑适配;
11
+ * - 尺寸类 token(圆角/字号/高度/时长)两种模式共用一套值,只有颜色不同。
12
+ *
13
+ * 【切换模式】
14
+ * - setXThemeMode('light' | 'dark' | 'system'),全局生效(zustand);
15
+ * - 默认 'system':跟随系统外观(useColorScheme)。
16
+ *
17
+ * 色值来源约定:
18
+ * - 主色沿用项目既有主色 #2080F0(原 DuxPopup 弹窗族、现 X 弹窗族同款);
19
+ * - 浅色语义色(成功/警告/错误/边框/文字灰阶)按 antd v5 默认 token 取值;
20
+ * - 暗黑文字灰阶按 antd v5 dark 算法(白色低透明度阶梯),
21
+ * 容器/布局底色对齐项目 App 级 Colors.dark(#000000 / #212225),保证组件
22
+ * 贴合应用页面背景而不是自成一套。
23
+ * ============================================================================
24
+ */
25
+ export declare const lightTokens: {
26
+ /** 品牌色(项目主色) */
27
+ readonly colorPrimary: "#2080F0";
28
+ /** 主色按压反馈用的浅主色(对标 antd colorPrimaryActive/BorderHover 一档) */
29
+ readonly colorPrimaryActive: "#0E6FD8";
30
+ /** 主色弱背景(对标 antd colorPrimaryBg) */
31
+ readonly colorPrimaryBg: "#E6F1FE";
32
+ readonly colorSuccess: "#52C41A";
33
+ readonly colorSuccessBg: "#F6FFED";
34
+ readonly colorWarning: "#FAAD14";
35
+ readonly colorWarningBg: "#FFFBE6";
36
+ readonly colorError: "#FF4D4F";
37
+ readonly colorErrorBg: "#FFF2F0";
38
+ /** 主文字(对标 antd colorText:rgba(0,0,0,0.88)) */
39
+ readonly colorText: "rgba(0, 0, 0, 0.88)";
40
+ /** 次要文字(对标 antd colorTextSecondary) */
41
+ readonly colorTextSecondary: "rgba(0, 0, 0, 0.65)";
42
+ readonly colorTextTertiary: "rgba(0, 0, 0, 0.45)";
43
+ readonly colorTextQuaternary: "rgba(0, 0, 0, 0.25)";
44
+ /** 实底主色上的文字 / 图标色(对标 antd colorTextLightSolid:primary 按钮、选中态文字用) */
45
+ readonly colorTextLightSolid: "#FFFFFF";
46
+ /** 描边色(对标 antd colorBorder) */
47
+ readonly colorBorder: "#D9D9D9";
48
+ /** 弱分割线(对标 antd colorSplit) */
49
+ readonly colorSplit: "#F0F0F0";
50
+ /** 进度条轨道底色(比 colorSplit 深一档,白底卡片上肉眼可见) */
51
+ readonly colorProgressTrack: "#E5E7EB";
52
+ readonly colorBgContainer: "#FFFFFF";
53
+ readonly colorBgLayout: "#F5F5F5";
54
+ /** 禁用态容器底色(对标 antd colorBgContainerDisabled) */
55
+ readonly colorBgContainerDisabled: "rgba(0, 0, 0, 0.04)";
56
+ /** 禁用态主色(浅一档的主色,用于主按钮禁用底色) */
57
+ readonly colorPrimaryDisabled: "#91C9FF";
58
+ /** 小圆角:输入框 / 小按钮 / 标签(对标 antd borderRadiusSM) */
59
+ readonly borderRadiusSM: 4;
60
+ readonly borderRadius: 6;
61
+ readonly borderRadiusLG: 8;
62
+ /** 卡片 / 大面板圆角(项目扩展:antd 只有 2/4/6/8 四档,此档对齐项目既有卡片视觉) */
63
+ readonly borderRadiusXL: 12;
64
+ /** 文本字号(对标 antd v5 默认 fontSize 14) */
65
+ readonly fontSize: 14;
66
+ readonly fontSizeSM: 12;
67
+ readonly fontSizeLG: 16;
68
+ readonly controlHeight: 36;
69
+ readonly controlHeightSM: 30;
70
+ readonly controlHeightLG: 44;
71
+ /** 动效时长(对标 antd motionDurationMid) */
72
+ readonly motionDurationMid: 200;
73
+ };
74
+ /** 两套 token 的统一形状(以浅色为基准;暗黑必须提供全部键)。
75
+ * 注意:把 as const 的字面量类型拓宽为 string/number,否则 darkTokens 的
76
+ * 任何色值都会因"字面量不相等"报类型错误。 */
77
+ type Widen<T> = {
78
+ [K in keyof T]: T[K] extends string ? string : T[K] extends number ? number : never;
79
+ };
80
+ export type XTheme = Widen<typeof lightTokens>;
81
+ /**
82
+ * 暗黑 token:
83
+ * - 文字 = 白色透明度阶梯(antd v5 dark 算法);
84
+ * - colorBgLayout = #000000、colorBgContainer = #212225,对齐 App 级 Colors.dark,
85
+ * 弹层面板压在页面上时与 backgroundElement 同色系;
86
+ * - 语义色底(PrimaryBg/SuccessBg/...)改为对应主色的低透明度版本,暗底下不会刺眼;
87
+ * - 分割线/边框用白色低透明度,避免死灰感。
88
+ */
89
+ export declare const darkTokens: XTheme;
90
+ /**
91
+ * 【向后兼容】旧代码里的 xTheme 就是浅色 token。
92
+ * 新组件请改用 useXTheme()(见下方),静态导入只允许用于"与模式无关"的取值。
93
+ */
94
+ export declare const xTheme: {
95
+ /** 品牌色(项目主色) */
96
+ readonly colorPrimary: "#2080F0";
97
+ /** 主色按压反馈用的浅主色(对标 antd colorPrimaryActive/BorderHover 一档) */
98
+ readonly colorPrimaryActive: "#0E6FD8";
99
+ /** 主色弱背景(对标 antd colorPrimaryBg) */
100
+ readonly colorPrimaryBg: "#E6F1FE";
101
+ readonly colorSuccess: "#52C41A";
102
+ readonly colorSuccessBg: "#F6FFED";
103
+ readonly colorWarning: "#FAAD14";
104
+ readonly colorWarningBg: "#FFFBE6";
105
+ readonly colorError: "#FF4D4F";
106
+ readonly colorErrorBg: "#FFF2F0";
107
+ /** 主文字(对标 antd colorText:rgba(0,0,0,0.88)) */
108
+ readonly colorText: "rgba(0, 0, 0, 0.88)";
109
+ /** 次要文字(对标 antd colorTextSecondary) */
110
+ readonly colorTextSecondary: "rgba(0, 0, 0, 0.65)";
111
+ readonly colorTextTertiary: "rgba(0, 0, 0, 0.45)";
112
+ readonly colorTextQuaternary: "rgba(0, 0, 0, 0.25)";
113
+ /** 实底主色上的文字 / 图标色(对标 antd colorTextLightSolid:primary 按钮、选中态文字用) */
114
+ readonly colorTextLightSolid: "#FFFFFF";
115
+ /** 描边色(对标 antd colorBorder) */
116
+ readonly colorBorder: "#D9D9D9";
117
+ /** 弱分割线(对标 antd colorSplit) */
118
+ readonly colorSplit: "#F0F0F0";
119
+ /** 进度条轨道底色(比 colorSplit 深一档,白底卡片上肉眼可见) */
120
+ readonly colorProgressTrack: "#E5E7EB";
121
+ readonly colorBgContainer: "#FFFFFF";
122
+ readonly colorBgLayout: "#F5F5F5";
123
+ /** 禁用态容器底色(对标 antd colorBgContainerDisabled) */
124
+ readonly colorBgContainerDisabled: "rgba(0, 0, 0, 0.04)";
125
+ /** 禁用态主色(浅一档的主色,用于主按钮禁用底色) */
126
+ readonly colorPrimaryDisabled: "#91C9FF";
127
+ /** 小圆角:输入框 / 小按钮 / 标签(对标 antd borderRadiusSM) */
128
+ readonly borderRadiusSM: 4;
129
+ readonly borderRadius: 6;
130
+ readonly borderRadiusLG: 8;
131
+ /** 卡片 / 大面板圆角(项目扩展:antd 只有 2/4/6/8 四档,此档对齐项目既有卡片视觉) */
132
+ readonly borderRadiusXL: 12;
133
+ /** 文本字号(对标 antd v5 默认 fontSize 14) */
134
+ readonly fontSize: 14;
135
+ readonly fontSizeSM: 12;
136
+ readonly fontSizeLG: 16;
137
+ readonly controlHeight: 36;
138
+ readonly controlHeightSM: 30;
139
+ readonly controlHeightLG: 44;
140
+ /** 动效时长(对标 antd motionDurationMid) */
141
+ readonly motionDurationMid: 200;
142
+ };
143
+ /** 主题模式:light 强制浅色 / dark 强制暗黑 / system 跟随系统(默认) */
144
+ export type XThemeMode = 'light' | 'dark' | 'system';
145
+ /** 实际生效的明暗方案 */
146
+ export type XThemeScheme = 'light' | 'dark';
147
+ /** 全局切换主题模式(命令式,任何地方可调用) */
148
+ export declare function setXThemeMode(mode: XThemeMode): void;
149
+ /** 读取当前模式(非 React 环境 / 事件回调里用) */
150
+ export declare function getXThemeMode(): XThemeMode;
151
+ /** 订阅当前模式(React 组件里用) */
152
+ export declare function useXThemeMode(): XThemeMode;
153
+ /**
154
+ * 【核心 Hook】当前模式下的完整 token 集。
155
+ *
156
+ * - 返回值是模块级常量对象(lightTokens / darkTokens),
157
+ * 引用稳定、不会触发无谓重渲染;模式切换时组件自然重渲染取到新对象;
158
+ * - 解析规则:mode==='system' 时跟随 useColorScheme(),
159
+ * 否则用强制值(未挂 Provider 也能工作,状态全局单例)。
160
+ */
161
+ export declare function useXTheme(): XTheme;
162
+ /** 当前实际生效的明暗方案(isDark 便捷判断用) */
163
+ export declare function useXThemeScheme(): XThemeScheme;
164
+ export {};
package/dist/theme.js ADDED
@@ -0,0 +1,161 @@
1
+ /**
2
+ * ============================================================================
3
+ * X-Components 共享设计 token(对标 antd v5 design token,取值做 RN 适配)
4
+ * ============================================================================
5
+ *
6
+ * 【v2:暗黑模式】
7
+ * - 本文件现在维护两套完整 token:lightTokens / darkTokens,键完全一致;
8
+ * - 组件统一用 useXTheme() 取当前模式的 token(跟随系统 + 可强制覆盖),
9
+ * 旧代码里的 `import {xTheme} from '../theme'` 仍然有效(xTheme === lightTokens),
10
+ * 但只有走 useXTheme() 才能获得暗黑适配;
11
+ * - 尺寸类 token(圆角/字号/高度/时长)两种模式共用一套值,只有颜色不同。
12
+ *
13
+ * 【切换模式】
14
+ * - setXThemeMode('light' | 'dark' | 'system'),全局生效(zustand);
15
+ * - 默认 'system':跟随系统外观(useColorScheme)。
16
+ *
17
+ * 色值来源约定:
18
+ * - 主色沿用项目既有主色 #2080F0(原 DuxPopup 弹窗族、现 X 弹窗族同款);
19
+ * - 浅色语义色(成功/警告/错误/边框/文字灰阶)按 antd v5 默认 token 取值;
20
+ * - 暗黑文字灰阶按 antd v5 dark 算法(白色低透明度阶梯),
21
+ * 容器/布局底色对齐项目 App 级 Colors.dark(#000000 / #212225),保证组件
22
+ * 贴合应用页面背景而不是自成一套。
23
+ * ============================================================================
24
+ */
25
+ export const lightTokens = {
26
+ /** 品牌色(项目主色) */
27
+ colorPrimary: '#2080F0',
28
+ /** 主色按压反馈用的浅主色(对标 antd colorPrimaryActive/BorderHover 一档) */
29
+ colorPrimaryActive: '#0E6FD8',
30
+ /** 主色弱背景(对标 antd colorPrimaryBg) */
31
+ colorPrimaryBg: '#E6F1FE',
32
+ colorSuccess: '#52C41A',
33
+ colorSuccessBg: '#F6FFED',
34
+ colorWarning: '#FAAD14',
35
+ colorWarningBg: '#FFFBE6',
36
+ colorError: '#FF4D4F',
37
+ colorErrorBg: '#FFF2F0',
38
+ /** 主文字(对标 antd colorText:rgba(0,0,0,0.88)) */
39
+ colorText: 'rgba(0, 0, 0, 0.88)',
40
+ /** 次要文字(对标 antd colorTextSecondary) */
41
+ colorTextSecondary: 'rgba(0, 0, 0, 0.65)',
42
+ colorTextTertiary: 'rgba(0, 0, 0, 0.45)',
43
+ colorTextQuaternary: 'rgba(0, 0, 0, 0.25)',
44
+ /** 实底主色上的文字 / 图标色(对标 antd colorTextLightSolid:primary 按钮、选中态文字用) */
45
+ colorTextLightSolid: '#FFFFFF',
46
+ /** 描边色(对标 antd colorBorder) */
47
+ colorBorder: '#D9D9D9',
48
+ /** 弱分割线(对标 antd colorSplit) */
49
+ colorSplit: '#F0F0F0',
50
+ /** 进度条轨道底色(比 colorSplit 深一档,白底卡片上肉眼可见) */
51
+ colorProgressTrack: '#E5E7EB',
52
+ colorBgContainer: '#FFFFFF',
53
+ colorBgLayout: '#F5F5F5',
54
+ /** 禁用态容器底色(对标 antd colorBgContainerDisabled) */
55
+ colorBgContainerDisabled: 'rgba(0, 0, 0, 0.04)',
56
+ /** 禁用态主色(浅一档的主色,用于主按钮禁用底色) */
57
+ colorPrimaryDisabled: '#91C9FF',
58
+ /** 小圆角:输入框 / 小按钮 / 标签(对标 antd borderRadiusSM) */
59
+ borderRadiusSM: 4,
60
+ borderRadius: 6,
61
+ borderRadiusLG: 8,
62
+ /** 卡片 / 大面板圆角(项目扩展:antd 只有 2/4/6/8 四档,此档对齐项目既有卡片视觉) */
63
+ borderRadiusXL: 12,
64
+ /** 文本字号(对标 antd v5 默认 fontSize 14) */
65
+ fontSize: 14,
66
+ fontSizeSM: 12,
67
+ fontSizeLG: 16,
68
+ controlHeight: 36,
69
+ controlHeightSM: 30,
70
+ controlHeightLG: 44,
71
+ /** 动效时长(对标 antd motionDurationMid) */
72
+ motionDurationMid: 200,
73
+ };
74
+ /**
75
+ * 暗黑 token:
76
+ * - 文字 = 白色透明度阶梯(antd v5 dark 算法);
77
+ * - colorBgLayout = #000000、colorBgContainer = #212225,对齐 App 级 Colors.dark,
78
+ * 弹层面板压在页面上时与 backgroundElement 同色系;
79
+ * - 语义色底(PrimaryBg/SuccessBg/...)改为对应主色的低透明度版本,暗底下不会刺眼;
80
+ * - 分割线/边框用白色低透明度,避免死灰感。
81
+ */
82
+ export const darkTokens = {
83
+ colorPrimary: '#2080F0',
84
+ colorPrimaryActive: '#3C93F5',
85
+ colorPrimaryBg: 'rgba(32, 128, 240, 0.18)',
86
+ colorSuccess: '#6BD643',
87
+ colorSuccessBg: 'rgba(82, 196, 26, 0.16)',
88
+ colorWarning: '#FFC53D',
89
+ colorWarningBg: 'rgba(250, 173, 20, 0.16)',
90
+ colorError: '#FF7875',
91
+ colorErrorBg: 'rgba(255, 77, 79, 0.16)',
92
+ colorText: 'rgba(255, 255, 255, 0.88)',
93
+ colorTextSecondary: 'rgba(255, 255, 255, 0.65)',
94
+ colorTextTertiary: 'rgba(255, 255, 255, 0.45)',
95
+ colorTextQuaternary: 'rgba(255, 255, 255, 0.25)',
96
+ colorTextLightSolid: '#FFFFFF',
97
+ colorBorder: 'rgba(255, 255, 255, 0.22)',
98
+ colorSplit: 'rgba(255, 255, 255, 0.08)',
99
+ colorProgressTrack: 'rgba(255, 255, 255, 0.12)',
100
+ colorBgContainer: '#212225',
101
+ colorBgLayout: '#000000',
102
+ colorBgContainerDisabled: 'rgba(255, 255, 255, 0.08)',
103
+ colorPrimaryDisabled: 'rgba(32, 128, 240, 0.38)',
104
+ borderRadiusSM: 4,
105
+ borderRadius: 6,
106
+ borderRadiusLG: 8,
107
+ borderRadiusXL: 12,
108
+ fontSize: 14,
109
+ fontSizeSM: 12,
110
+ fontSizeLG: 16,
111
+ controlHeight: 36,
112
+ controlHeightSM: 30,
113
+ controlHeightLG: 44,
114
+ motionDurationMid: 200,
115
+ };
116
+ /**
117
+ * 【向后兼容】旧代码里的 xTheme 就是浅色 token。
118
+ * 新组件请改用 useXTheme()(见下方),静态导入只允许用于"与模式无关"的取值。
119
+ */
120
+ export const xTheme = lightTokens;
121
+ // ---------------------------------------------------------------------------
122
+ // 模式状态(zustand 全局单例:任何组件 setXThemeMode('dark') 全库即时换肤)
123
+ // ---------------------------------------------------------------------------
124
+ import { create } from 'zustand';
125
+ import { useColorScheme } from 'react-native';
126
+ const useXThemeModeStore = create(set => ({
127
+ mode: 'system',
128
+ setMode: mode => set({ mode }),
129
+ }));
130
+ /** 全局切换主题模式(命令式,任何地方可调用) */
131
+ export function setXThemeMode(mode) {
132
+ useXThemeModeStore.getState().setMode(mode);
133
+ }
134
+ /** 读取当前模式(非 React 环境 / 事件回调里用) */
135
+ export function getXThemeMode() {
136
+ return useXThemeModeStore.getState().mode;
137
+ }
138
+ /** 订阅当前模式(React 组件里用) */
139
+ export function useXThemeMode() {
140
+ return useXThemeModeStore(s => s.mode);
141
+ }
142
+ /**
143
+ * 【核心 Hook】当前模式下的完整 token 集。
144
+ *
145
+ * - 返回值是模块级常量对象(lightTokens / darkTokens),
146
+ * 引用稳定、不会触发无谓重渲染;模式切换时组件自然重渲染取到新对象;
147
+ * - 解析规则:mode==='system' 时跟随 useColorScheme(),
148
+ * 否则用强制值(未挂 Provider 也能工作,状态全局单例)。
149
+ */
150
+ export function useXTheme() {
151
+ const mode = useXThemeModeStore(s => s.mode);
152
+ const systemScheme = useColorScheme();
153
+ const scheme = mode === 'system' ? (systemScheme === 'dark' ? 'dark' : 'light') : mode;
154
+ return scheme === 'dark' ? darkTokens : lightTokens;
155
+ }
156
+ /** 当前实际生效的明暗方案(isDark 便捷判断用) */
157
+ export function useXThemeScheme() {
158
+ const mode = useXThemeModeStore(s => s.mode);
159
+ const systemScheme = useColorScheme();
160
+ return mode === 'system' ? (systemScheme === 'dark' ? 'dark' : 'light') : mode;
161
+ }
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "react-native-x-components",
3
+ "version": "0.1.0",
4
+ "description": "Ant Design 风格的 React Native (Expo) 组件库:表单/弹层(TopView)/日历/Skia逐字签名/上传适配器(MinIO预签名)/轻量图表,内置暗黑模式与中英双语。",
5
+ "main": "dist/index.js",
6
+ "react-native": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "sideEffects": false,
14
+ "keywords": [
15
+ "react-native",
16
+ "expo",
17
+ "components",
18
+ "ui-kit",
19
+ "antd",
20
+ "ant-design",
21
+ "calendar",
22
+ "signature",
23
+ "skia",
24
+ "upload",
25
+ "minio",
26
+ "presigned",
27
+ "charts",
28
+ "dark-mode",
29
+ "i18n",
30
+ "topview",
31
+ "popup"
32
+ ],
33
+ "license": "MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/maoyuxiang/rn-x-components.git"
37
+ },
38
+ "peerDependencies": {
39
+ "react": ">=18.0.0",
40
+ "react-native": ">=0.74.0",
41
+ "react-native-reanimated": ">=3.17.0",
42
+ "react-native-safe-area-context": ">=4.0.0",
43
+ "react-native-svg": ">=14.0.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@shopify/react-native-skia": {
47
+ "optional": true
48
+ },
49
+ "@react-native-vector-icons/ant-design": {
50
+ "optional": true
51
+ },
52
+ "expo-audio": {
53
+ "optional": true
54
+ },
55
+ "expo-file-system": {
56
+ "optional": true
57
+ },
58
+ "expo-image-manipulator": {
59
+ "optional": true
60
+ },
61
+ "expo-image-picker": {
62
+ "optional": true
63
+ },
64
+ "react-native-gesture-handler": {
65
+ "optional": true
66
+ },
67
+ "react-native-linear-gradient": {
68
+ "optional": true
69
+ },
70
+ "react-native-zoom-toolkit": {
71
+ "optional": true
72
+ }
73
+ },
74
+ "dependencies": {
75
+ "dayjs": "^1.11.0",
76
+ "zustand": "^5.0.0"
77
+ }
78
+ }