zkit-ui 1.0.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.
- package/README.md +267 -0
- package/dist/ComponentLibProvider.d.ts +15 -0
- package/dist/ComponentLibProvider.d.ts.map +1 -0
- package/dist/ComponentLibProvider.js +18 -0
- package/dist/assets/animations/spinner.json +1 -0
- package/dist/assets/icons/check.svg +4 -0
- package/dist/assets/icons/toast/error.webp +0 -0
- package/dist/assets/icons/toast/success.webp +0 -0
- package/dist/assets/icons/toast/warning.webp +0 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +42 -0
- package/dist/i18n/I18nProvider.d.ts +11 -0
- package/dist/i18n/I18nProvider.d.ts.map +1 -0
- package/dist/i18n/I18nProvider.js +84 -0
- package/dist/i18n/locale.d.ts +7 -0
- package/dist/i18n/locale.d.ts.map +1 -0
- package/dist/i18n/locale.js +87 -0
- package/dist/i18n/locales/de.d.ts +51 -0
- package/dist/i18n/locales/de.d.ts.map +1 -0
- package/dist/i18n/locales/de.js +62 -0
- package/dist/i18n/locales/en-US.d.ts +51 -0
- package/dist/i18n/locales/en-US.d.ts.map +1 -0
- package/dist/i18n/locales/en-US.js +62 -0
- package/dist/i18n/locales/index.d.ts +9 -0
- package/dist/i18n/locales/index.d.ts.map +1 -0
- package/dist/i18n/locales/index.js +23 -0
- package/dist/i18n/locales/ja.d.ts +51 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -0
- package/dist/i18n/locales/ja.js +62 -0
- package/dist/i18n/locales/zh-CN.d.ts +51 -0
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
- package/dist/i18n/locales/zh-CN.js +62 -0
- package/dist/i18n/locales/zh-TW.d.ts +51 -0
- package/dist/i18n/locales/zh-TW.d.ts.map +1 -0
- package/dist/i18n/locales/zh-TW.js +62 -0
- package/dist/i18n/types.d.ts +11 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/useI18n.d.ts +2 -0
- package/dist/i18n/useI18n.d.ts.map +1 -0
- package/dist/i18n/useI18n.js +41 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/services/ActionDialogService/ActionDialog.d.ts +4 -0
- package/dist/services/ActionDialogService/ActionDialog.d.ts.map +1 -0
- package/dist/services/ActionDialogService/ActionDialog.js +531 -0
- package/dist/services/ActionDialogService/index.d.ts +4 -0
- package/dist/services/ActionDialogService/index.d.ts.map +1 -0
- package/dist/services/ActionDialogService/index.js +8 -0
- package/dist/services/ActionDialogService/service.d.ts +7 -0
- package/dist/services/ActionDialogService/service.d.ts.map +1 -0
- package/dist/services/ActionDialogService/service.js +309 -0
- package/dist/services/ActionDialogService/shared.d.ts +17 -0
- package/dist/services/ActionDialogService/shared.d.ts.map +1 -0
- package/dist/services/ActionDialogService/shared.js +167 -0
- package/dist/services/ActionDialogService/types.d.ts +160 -0
- package/dist/services/ActionDialogService/types.d.ts.map +1 -0
- package/dist/services/ActionDialogService/types.js +2 -0
- package/dist/services/CardToastService/index.d.ts +115 -0
- package/dist/services/CardToastService/index.d.ts.map +1 -0
- package/dist/services/CardToastService/index.js +899 -0
- package/dist/services/ImagePreviewService/index.d.ts +179 -0
- package/dist/services/ImagePreviewService/index.d.ts.map +1 -0
- package/dist/services/ImagePreviewService/index.js +1383 -0
- package/dist/services/LoadingService/index.d.ts +146 -0
- package/dist/services/LoadingService/index.d.ts.map +1 -0
- package/dist/services/LoadingService/index.js +827 -0
- package/dist/services/PermissionPurposeDialogService/index.d.ts +99 -0
- package/dist/services/PermissionPurposeDialogService/index.d.ts.map +1 -0
- package/dist/services/PermissionPurposeDialogService/index.js +360 -0
- package/dist/services/PickerService/index.d.ts +128 -0
- package/dist/services/PickerService/index.d.ts.map +1 -0
- package/dist/services/PickerService/index.js +250 -0
- package/dist/theme/ThemeProvider.d.ts +15 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +61 -0
- package/dist/theme/defaultTheme.d.ts +3 -0
- package/dist/theme/defaultTheme.d.ts.map +1 -0
- package/dist/theme/defaultTheme.js +28 -0
- package/dist/theme/mergeTheme.d.ts +3 -0
- package/dist/theme/mergeTheme.d.ts.map +1 -0
- package/dist/theme/mergeTheme.js +19 -0
- package/dist/theme/types.d.ts +17 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +2 -0
- package/dist/theme/useTheme.d.ts +2 -0
- package/dist/theme/useTheme.d.ts.map +1 -0
- package/dist/theme/useTheme.js +46 -0
- package/dist/ui/Accordion/index.d.ts +99 -0
- package/dist/ui/Accordion/index.d.ts.map +1 -0
- package/dist/ui/Accordion/index.js +777 -0
- package/dist/ui/AddressCascader/index.d.ts +58 -0
- package/dist/ui/AddressCascader/index.d.ts.map +1 -0
- package/dist/ui/AddressCascader/index.js +710 -0
- package/dist/ui/BetweenTime/index.d.ts +82 -0
- package/dist/ui/BetweenTime/index.d.ts.map +1 -0
- package/dist/ui/BetweenTime/index.js +702 -0
- package/dist/ui/Button/index.d.ts +93 -0
- package/dist/ui/Button/index.d.ts.map +1 -0
- package/dist/ui/Button/index.js +832 -0
- package/dist/ui/Checkbox/index.d.ts +103 -0
- package/dist/ui/Checkbox/index.d.ts.map +1 -0
- package/dist/ui/Checkbox/index.js +694 -0
- package/dist/ui/DatePicker/index.d.ts +5 -0
- package/dist/ui/DatePicker/index.d.ts.map +1 -0
- package/dist/ui/DatePicker/index.js +157 -0
- package/dist/ui/DatePicker/types.d.ts +99 -0
- package/dist/ui/DatePicker/types.d.ts.map +1 -0
- package/dist/ui/DatePicker/types.js +2 -0
- package/dist/ui/DatePicker/utils.d.ts +32 -0
- package/dist/ui/DatePicker/utils.d.ts.map +1 -0
- package/dist/ui/DatePicker/utils.js +316 -0
- package/dist/ui/LinkedScroll/index.d.ts +78 -0
- package/dist/ui/LinkedScroll/index.d.ts.map +1 -0
- package/dist/ui/LinkedScroll/index.js +470 -0
- package/dist/ui/LoadingSpinner/index.d.ts +8 -0
- package/dist/ui/LoadingSpinner/index.d.ts.map +1 -0
- package/dist/ui/LoadingSpinner/index.js +122 -0
- package/dist/ui/Picker/actionBar.d.ts +14 -0
- package/dist/ui/Picker/actionBar.d.ts.map +1 -0
- package/dist/ui/Picker/actionBar.js +28 -0
- package/dist/ui/Picker/index.d.ts +5 -0
- package/dist/ui/Picker/index.d.ts.map +1 -0
- package/dist/ui/Picker/index.js +412 -0
- package/dist/ui/Picker/types.d.ts +80 -0
- package/dist/ui/Picker/types.d.ts.map +1 -0
- package/dist/ui/Picker/types.js +2 -0
- package/dist/ui/Picker/utils.d.ts +27 -0
- package/dist/ui/Picker/utils.d.ts.map +1 -0
- package/dist/ui/Picker/utils.js +182 -0
- package/dist/ui/Radio/index.d.ts +95 -0
- package/dist/ui/Radio/index.d.ts.map +1 -0
- package/dist/ui/Radio/index.js +633 -0
- package/dist/ui/Sheet/index.d.ts +12 -0
- package/dist/ui/Sheet/index.d.ts.map +1 -0
- package/dist/ui/Sheet/index.js +832 -0
- package/dist/ui/Sheet/nativeBottom.d.ts +52 -0
- package/dist/ui/Sheet/nativeBottom.d.ts.map +1 -0
- package/dist/ui/Sheet/nativeBottom.js +442 -0
- package/dist/ui/Sheet/nativeBottom.web.d.ts +18 -0
- package/dist/ui/Sheet/nativeBottom.web.d.ts.map +1 -0
- package/dist/ui/Sheet/nativeBottom.web.js +46 -0
- package/dist/ui/Sheet/slots.d.ts +5 -0
- package/dist/ui/Sheet/slots.d.ts.map +1 -0
- package/dist/ui/Sheet/slots.js +40 -0
- package/dist/ui/Sheet/types.d.ts +131 -0
- package/dist/ui/Sheet/types.d.ts.map +1 -0
- package/dist/ui/Sheet/types.js +2 -0
- package/dist/ui/SliderCaptcha/index.d.ts +57 -0
- package/dist/ui/SliderCaptcha/index.d.ts.map +1 -0
- package/dist/ui/SliderCaptcha/index.js +586 -0
- package/dist/ui/Switch/index.d.ts +72 -0
- package/dist/ui/Switch/index.d.ts.map +1 -0
- package/dist/ui/Switch/index.js +671 -0
- package/dist/ui/Text/index.d.ts +41 -0
- package/dist/ui/Text/index.d.ts.map +1 -0
- package/dist/ui/Text/index.js +325 -0
- package/dist/ui/TextInput/TextInputPrimitive.d.ts +8 -0
- package/dist/ui/TextInput/TextInputPrimitive.d.ts.map +1 -0
- package/dist/ui/TextInput/TextInputPrimitive.js +54 -0
- package/dist/ui/TextInput/index.d.ts +89 -0
- package/dist/ui/TextInput/index.d.ts.map +1 -0
- package/dist/ui/TextInput/index.js +545 -0
- package/dist/ui/WheelColumn/ZKitWheelPickerNativeComponent.d.ts +39 -0
- package/dist/ui/WheelColumn/ZKitWheelPickerNativeComponent.d.ts.map +1 -0
- package/dist/ui/WheelColumn/ZKitWheelPickerNativeComponent.js +60 -0
- package/dist/ui/WheelColumn/constants.d.ts +2 -0
- package/dist/ui/WheelColumn/constants.d.ts.map +1 -0
- package/dist/ui/WheelColumn/constants.js +4 -0
- package/dist/ui/WheelColumn/index.d.ts +59 -0
- package/dist/ui/WheelColumn/index.d.ts.map +1 -0
- package/dist/ui/WheelColumn/index.js +547 -0
- package/ios/ZKitWheelPicker.h +18 -0
- package/ios/ZKitWheelPicker.mm +230 -0
- package/ios/ZKitWheelPickerLabel.h +10 -0
- package/ios/ZKitWheelPickerLabel.mm +31 -0
- package/ios/ZKitWheelPickerManager.h +5 -0
- package/ios/ZKitWheelPickerManager.mm +53 -0
- package/package.json +75 -0
- package/react-native.config.js +10 -0
- package/src/ComponentLibProvider.tsx +56 -0
- package/src/assets/animations/spinner.json +1 -0
- package/src/assets/icons/check.svg +4 -0
- package/src/assets/icons/toast/error.webp +0 -0
- package/src/assets/icons/toast/success.webp +0 -0
- package/src/assets/icons/toast/warning.webp +0 -0
- package/src/config.ts +65 -0
- package/src/i18n/I18nProvider.tsx +69 -0
- package/src/i18n/locale.ts +108 -0
- package/src/i18n/locales/de.ts +67 -0
- package/src/i18n/locales/en-US.ts +67 -0
- package/src/i18n/locales/index.ts +19 -0
- package/src/i18n/locales/ja.ts +67 -0
- package/src/i18n/locales/zh-CN.ts +67 -0
- package/src/i18n/locales/zh-TW.ts +67 -0
- package/src/i18n/types.ts +21 -0
- package/src/i18n/useI18n.ts +7 -0
- package/src/index.ts +395 -0
- package/src/services/ActionDialogService/ActionDialog.tsx +756 -0
- package/src/services/ActionDialogService/README.md +146 -0
- package/src/services/ActionDialogService/index.tsx +39 -0
- package/src/services/ActionDialogService/service.tsx +355 -0
- package/src/services/ActionDialogService/shared.ts +204 -0
- package/src/services/ActionDialogService/types.ts +197 -0
- package/src/services/CardToastService/README.md +128 -0
- package/src/services/CardToastService/index.tsx +1284 -0
- package/src/services/ImagePreviewService/README.md +67 -0
- package/src/services/ImagePreviewService/index.tsx +2148 -0
- package/src/services/LoadingService/README.md +128 -0
- package/src/services/LoadingService/index.tsx +1113 -0
- package/src/services/PermissionPurposeDialogService/README.md +80 -0
- package/src/services/PermissionPurposeDialogService/index.tsx +449 -0
- package/src/services/PickerService/README.md +154 -0
- package/src/services/PickerService/index.tsx +410 -0
- package/src/theme/ThemeProvider.tsx +40 -0
- package/src/theme/defaultTheme.ts +30 -0
- package/src/theme/mergeTheme.ts +16 -0
- package/src/theme/types.ts +36 -0
- package/src/theme/useTheme.ts +10 -0
- package/src/types/svg.d.ts +9 -0
- package/src/types/vant-area-data.d.ts +19 -0
- package/src/ui/Accordion/README.md +67 -0
- package/src/ui/Accordion/index.tsx +1221 -0
- package/src/ui/AddressCascader/README.md +144 -0
- package/src/ui/AddressCascader/index.tsx +1084 -0
- package/src/ui/BetweenTime/README.md +490 -0
- package/src/ui/BetweenTime/index.tsx +1001 -0
- package/src/ui/Button/README.md +186 -0
- package/src/ui/Button/index.tsx +1356 -0
- package/src/ui/Checkbox/README.md +211 -0
- package/src/ui/Checkbox/index.tsx +1231 -0
- package/src/ui/DatePicker/README.md +117 -0
- package/src/ui/DatePicker/index.tsx +295 -0
- package/src/ui/DatePicker/types.ts +115 -0
- package/src/ui/DatePicker/utils.ts +405 -0
- package/src/ui/LinkedScroll/README.md +55 -0
- package/src/ui/LinkedScroll/index.tsx +809 -0
- package/src/ui/LoadingSpinner/index.tsx +104 -0
- package/src/ui/Picker/README.md +190 -0
- package/src/ui/Picker/actionBar.tsx +70 -0
- package/src/ui/Picker/index.tsx +694 -0
- package/src/ui/Picker/types.ts +94 -0
- package/src/ui/Picker/utils.ts +239 -0
- package/src/ui/Radio/README.md +207 -0
- package/src/ui/Radio/index.tsx +1117 -0
- package/src/ui/Sheet/README.md +82 -0
- package/src/ui/Sheet/index.tsx +1163 -0
- package/src/ui/Sheet/nativeBottom.tsx +683 -0
- package/src/ui/Sheet/nativeBottom.web.tsx +40 -0
- package/src/ui/Sheet/slots.tsx +75 -0
- package/src/ui/Sheet/types.ts +195 -0
- package/src/ui/SliderCaptcha/README.md +61 -0
- package/src/ui/SliderCaptcha/index.tsx +816 -0
- package/src/ui/Switch/README.md +143 -0
- package/src/ui/Switch/index.tsx +1092 -0
- package/src/ui/Text/README.md +157 -0
- package/src/ui/Text/index.tsx +450 -0
- package/src/ui/TextInput/README.md +197 -0
- package/src/ui/TextInput/TextInputPrimitive.tsx +44 -0
- package/src/ui/TextInput/index.tsx +942 -0
- package/src/ui/WheelColumn/README.md +104 -0
- package/src/ui/WheelColumn/ZKitWheelPickerNativeComponent.tsx +68 -0
- package/src/ui/WheelColumn/constants.ts +1 -0
- package/src/ui/WheelColumn/index.tsx +826 -0
- package/zkit-ui.podspec +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# zkit-ui
|
|
2
|
+
|
|
3
|
+
私有 React Native 组件库(Monorepo workspace 包),用于沉淀可复用 UI / 交互 / tokens。
|
|
4
|
+
|
|
5
|
+
## 目标
|
|
6
|
+
|
|
7
|
+
- 组件“可沉淀”:通用、可组合、可测试、可维护
|
|
8
|
+
- 主题可配置:默认主题 + 应用侧覆盖 + 局部覆盖
|
|
9
|
+
- 国际化可注入:默认字典 + 应用侧覆盖 + 缺失策略
|
|
10
|
+
- API 可控:一致的 props 设计与导出方式,避免“每个组件一个风格”
|
|
11
|
+
|
|
12
|
+
## 安装与使用
|
|
13
|
+
|
|
14
|
+
在 workspace 内通过 `workspace:*` 引用即可(本仓库已采用 pnpm workspace)。
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { Button } from 'zkit-ui';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 主题(Theme)
|
|
21
|
+
|
|
22
|
+
### 主题模型
|
|
23
|
+
|
|
24
|
+
主题类型定义在 [types.ts](src/theme/types.ts):
|
|
25
|
+
|
|
26
|
+
- `Theme`:完整主题对象(组件内部使用)
|
|
27
|
+
- `ThemeOverride`:应用侧覆盖对象(Partial + 深层 colors Partial)
|
|
28
|
+
|
|
29
|
+
默认主题在 [defaultTheme.ts](src/theme/defaultTheme.ts)。
|
|
30
|
+
|
|
31
|
+
### 推荐用法:统一 Provider(主题 + i18n + 全局浮层)
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { ComponentLibProvider } from 'zkit-ui';
|
|
35
|
+
|
|
36
|
+
export function AppProviders({ children }: { children: React.ReactNode }) {
|
|
37
|
+
return (
|
|
38
|
+
<ComponentLibProvider
|
|
39
|
+
theme={{ colors: { primary: '#2563EB' } }}
|
|
40
|
+
messages={{ 'button.ok': '确定' }}
|
|
41
|
+
missingKeyPolicy="throw"
|
|
42
|
+
>
|
|
43
|
+
{children}
|
|
44
|
+
</ComponentLibProvider>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 单独使用 ThemeProvider
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { ThemeProvider } from 'zkit-ui';
|
|
53
|
+
|
|
54
|
+
<ThemeProvider theme={{ colors: { primary: '#16A34A' } }}>
|
|
55
|
+
{/* ... */}
|
|
56
|
+
</ThemeProvider>;
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 全局默认配置(不依赖 Provider)
|
|
60
|
+
|
|
61
|
+
如果你的项目希望“即便没包 Provider,也要有一致默认值”,可以在应用启动时配置:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { configureComponentLib } from 'zkit-ui';
|
|
65
|
+
|
|
66
|
+
configureComponentLib({
|
|
67
|
+
theme: { colors: { primary: '#0F172A' } },
|
|
68
|
+
i18n: {
|
|
69
|
+
locale: 'zh-CN',
|
|
70
|
+
messages: { 'checkbox.label': '勾选' },
|
|
71
|
+
missingKeyPolicy: 'throw',
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 国际化(i18n)
|
|
77
|
+
|
|
78
|
+
### 核心概念
|
|
79
|
+
|
|
80
|
+
- 默认 locale 会读取系统语言;内置支持 `zh-CN`、`zh-TW`、`ja`、`en-US`、`de`,不支持的语言回退到 `zh-CN`
|
|
81
|
+
- `messages`:扁平字典 `Record<string, string>`
|
|
82
|
+
- `t(key, params?)`:取文案;支持 `{name}` 这种占位符插值
|
|
83
|
+
- `missingKeyPolicy`:
|
|
84
|
+
- `throw`:缺失 key 直接抛错(更适合开发/测试,及时暴露漏配)
|
|
85
|
+
- `key`:缺失 key 回显 key(更适合线上,避免崩溃)
|
|
86
|
+
|
|
87
|
+
### 使用
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
import { I18nProvider, Text, useI18n } from 'zkit-ui';
|
|
91
|
+
|
|
92
|
+
function Demo() {
|
|
93
|
+
const { t } = useI18n();
|
|
94
|
+
return <Text>{t('greeting.hello', { name: 'Alice' })}</Text>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
<I18nProvider messages={{ 'greeting.hello': '你好,{name}' }} missingKeyPolicy="throw">
|
|
98
|
+
<Demo />
|
|
99
|
+
</I18nProvider>;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 组件编写规范(沉淀收纳标准)
|
|
103
|
+
|
|
104
|
+
## 组件清单
|
|
105
|
+
|
|
106
|
+
- Accordion:手风琴/折叠面板(Reanimated 高度与指示器动画)
|
|
107
|
+
- Checkbox:三端一致的复选框/复选框组(受控/非受控、三态、Reanimated 指示器动画)
|
|
108
|
+
- Radio:三端一致的单选框/单选组(受控/非受控、可清空组、Reanimated 指示器动画)
|
|
109
|
+
- Switch:三端一致的布尔开关(受控/非受控、Reanimated 轨道与 thumb 动画)
|
|
110
|
+
- TextInput / TextInputPrimitive:统一文本输入 Field 与接近 RN 原生能力的薄封装
|
|
111
|
+
- Sheet:通用方向弹层(H5 bottom/top/left/right 自绘,iOS/Android bottom 内部走原生 TrueSheet)
|
|
112
|
+
- LoadingService:全局加载 HUD 服务(handle 状态模型、Promise 绑定、Android 无 elevation 残影路径)
|
|
113
|
+
- ImagePreview:全屏图片预览(声明式 open/value 状态模型 + 全局 imagePreview.open 服务)
|
|
114
|
+
- Picker:底部滚轮选择器(单列/级联、确认提交、iOS 原生 wheel)
|
|
115
|
+
- AddressCascader:省市区级联选择(内置中国数据)
|
|
116
|
+
- DatePicker:年/月/日日期选择(空值、范围、精度与确认提交语义)
|
|
117
|
+
- WheelColumn:单列滚轮选择(iOS 原生 wheel,Android/Web 自绘高性能路径)
|
|
118
|
+
|
|
119
|
+
### Accordion 用法
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
import * as React from 'react';
|
|
123
|
+
import {
|
|
124
|
+
Accordion,
|
|
125
|
+
AccordionContent,
|
|
126
|
+
AccordionItem,
|
|
127
|
+
AccordionTrigger,
|
|
128
|
+
Text,
|
|
129
|
+
} from 'zkit-ui';
|
|
130
|
+
|
|
131
|
+
export function DemoAccordion() {
|
|
132
|
+
const [openItem, setOpenItem] = React.useState<string | null>('item-1');
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<Accordion value={openItem} onChange={setOpenItem} variant="card" size="md">
|
|
136
|
+
<AccordionItem value="item-1">
|
|
137
|
+
<AccordionTrigger title="第一项" description="支持标题、副标题和自定义插槽" />
|
|
138
|
+
<AccordionContent>
|
|
139
|
+
<Text>内容 1</Text>
|
|
140
|
+
</AccordionContent>
|
|
141
|
+
</AccordionItem>
|
|
142
|
+
|
|
143
|
+
<AccordionItem value="item-2">
|
|
144
|
+
<AccordionTrigger title="第二项" />
|
|
145
|
+
<AccordionContent>
|
|
146
|
+
<Text>内容 2</Text>
|
|
147
|
+
</AccordionContent>
|
|
148
|
+
</AccordionItem>
|
|
149
|
+
</Accordion>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
`Accordion` 使用 `value/defaultValue/onChange` 状态模型。默认 `type="single"` 且可折叠,空值为 `null`;`type="multiple"` 时值为数组。内容默认 `mountStrategy="eager"` 以保留内部状态,可按需切到 `lazy` 或 `unmountOnExit`。
|
|
155
|
+
|
|
156
|
+
### Sheet 用法
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import * as React from 'react';
|
|
160
|
+
import { Button, Sheet, Text } from 'zkit-ui';
|
|
161
|
+
|
|
162
|
+
export function DemoSheet() {
|
|
163
|
+
const [open, setOpen] = React.useState(false);
|
|
164
|
+
|
|
165
|
+
return (
|
|
166
|
+
<>
|
|
167
|
+
<Button onPress={() => setOpen(true)}>打开筛选</Button>
|
|
168
|
+
|
|
169
|
+
<Sheet placement="right" open={open} onOpenChange={setOpen} size="md">
|
|
170
|
+
<Sheet.Header title="筛选" description="支持上下左右方向" />
|
|
171
|
+
<Sheet.Content>
|
|
172
|
+
<Text>右侧弹层内容</Text>
|
|
173
|
+
</Sheet.Content>
|
|
174
|
+
</Sheet>
|
|
175
|
+
</>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
`Sheet` 使用 `open/defaultOpen/onOpenChange` 状态模型。iOS / Android 的 `placement="bottom"` 会使用原生 TrueSheet;H5 bottom 与 `top/left/right` 一样使用 Reanimated 自绘路径。底部档位通过根级 `detents/detentIndex/defaultDetentIndex/onDetentChange` 管理,`nativeProps` 只作为原生底部的高级逃生口。
|
|
181
|
+
|
|
182
|
+
### ImagePreview 用法
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
import { ImagePreview, imagePreview } from 'zkit-ui';
|
|
186
|
+
|
|
187
|
+
<ImagePreview
|
|
188
|
+
images={images}
|
|
189
|
+
open={previewOpen}
|
|
190
|
+
value={previewIndex}
|
|
191
|
+
onChange={setPreviewIndex}
|
|
192
|
+
onOpenChange={setPreviewOpen}
|
|
193
|
+
/>;
|
|
194
|
+
|
|
195
|
+
imagePreview.open({ images, index: 0 });
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`ImagePreview` 使用 `open/defaultOpen/onOpenChange` 管理显隐,使用 `value/defaultValue/onChange` 管理当前图片索引。全局 `imagePreview.open()` 返回 handle,可通过 `handle.result` 获取关闭原因和最终索引;`ComponentLibProvider` 已内置 `ImagePreviewProvider`。
|
|
199
|
+
|
|
200
|
+
### 目录与导出
|
|
201
|
+
|
|
202
|
+
- 组件放在 `src/ui/`(一组件一文件为主;复杂组件可拆同名子文件)
|
|
203
|
+
- 业务无关的工具放在 `src/`(例如 `theme/`、`i18n/`)
|
|
204
|
+
- 所有对外导出集中在 [src/index.ts](src/index.ts)
|
|
205
|
+
- 新增组件必须同时导出组件与 props type
|
|
206
|
+
- 不对外导出内部私有工具(除非确定是稳定 API)
|
|
207
|
+
|
|
208
|
+
### Props 设计
|
|
209
|
+
|
|
210
|
+
- 语义优先:优先用 `variant`/`size` 等语义字段;最终样式从 Theme 派生
|
|
211
|
+
- 兜底能力:保留 `style`(容器)与必要的 `*Style`(子元素)作为 escape hatch
|
|
212
|
+
- 默认值规则:
|
|
213
|
+
- 能安全默认的(例如 `variant="primary"`、`shape="square"`)可以给默认值
|
|
214
|
+
- 与业务强相关/配置缺失会导致误用的,不要做“看起来能跑”的兜底
|
|
215
|
+
- 受控/非受控:
|
|
216
|
+
- 交互组件优先支持 `value/checked` + `onChange` 受控
|
|
217
|
+
- 同时支持 `defaultValue/defaultChecked` 非受控
|
|
218
|
+
- 明确 `isControlled` 分支,避免受控/非受控混用导致状态错乱
|
|
219
|
+
- 事件命名:
|
|
220
|
+
- 值变化:`onChange`(对外一般用最终 primitive 值)
|
|
221
|
+
- 语义更强的变化:可以补充 `onCheckedChange` 这类(但要解释差异)
|
|
222
|
+
|
|
223
|
+
### 样式与 tokens
|
|
224
|
+
|
|
225
|
+
- 组件内部禁止写死品牌色,必须来自 `useTheme()`(允许通过 props 单次覆盖)
|
|
226
|
+
- 尺寸类 props 直接接收 number(业务侧可自行传 `wp/sp` 计算后的值)
|
|
227
|
+
- 文字组件统一使用组件库 [Text](src/ui/Text/index.tsx),优先用 `variant` / `size` / `weight` / `tone` 表达语义,`style` 只作为最终 escape hatch
|
|
228
|
+
- 新增 tokens 流程:
|
|
229
|
+
- 先扩展 [Theme](src/theme/types.ts) 的字段
|
|
230
|
+
- 同步补齐 [defaultTheme](src/theme/defaultTheme.ts)
|
|
231
|
+
- 再在组件里通过 `useTheme()` 消费,避免散落常量
|
|
232
|
+
|
|
233
|
+
### i18n key 规范
|
|
234
|
+
|
|
235
|
+
- 统一前缀:`component.<ComponentName>.*`,避免与业务侧 key 冲突
|
|
236
|
+
- key 示例:
|
|
237
|
+
- `component.Button.ok`
|
|
238
|
+
- `component.Checkbox.indeterminate`
|
|
239
|
+
- 默认策略建议:
|
|
240
|
+
- 开发/测试:`missingKeyPolicy="throw"`(及时暴露漏 key)
|
|
241
|
+
- 线上:`missingKeyPolicy="key"`(缺失时不崩溃)
|
|
242
|
+
|
|
243
|
+
### 可访问性(A11y)
|
|
244
|
+
|
|
245
|
+
- 交互组件必须设置 `accessibilityRole`
|
|
246
|
+
- 对应状态必须设置 `accessibilityState`(disabled/checked/selected 等)
|
|
247
|
+
- 必要时补充 `accessibilityLabel`(当 UI 上无可读 label 时)
|
|
248
|
+
|
|
249
|
+
### 测试与可调试性
|
|
250
|
+
|
|
251
|
+
- 交互组件提供 `testID`(或透传 RN 原生 props)
|
|
252
|
+
- 避免在组件内部吞掉错误;配置缺失要更“fail-fast”(尤其是 i18n key)
|
|
253
|
+
|
|
254
|
+
### 新增组件检查清单
|
|
255
|
+
|
|
256
|
+
- 在 `src/ui/<Component>.tsx` 实现组件与 `export type <Component>Props`
|
|
257
|
+
- 使用 `useTheme()` 获取颜色/样式 tokens(不要写死品牌色)
|
|
258
|
+
- 文案通过 `useI18n().t()` 获取(不要写死可见文本)
|
|
259
|
+
- 补齐 `accessibilityRole` 与 `accessibilityState`
|
|
260
|
+
- 需要时提供 `testID`(或透传 RN props)
|
|
261
|
+
- 在 [src/index.ts](src/index.ts) 导出组件与 props type
|
|
262
|
+
|
|
263
|
+
### 组件收纳门槛(什么时候该进组件库)
|
|
264
|
+
|
|
265
|
+
- 至少被 2 个页面/模块复用,且不存在明显业务耦合
|
|
266
|
+
- 视觉/交互有稳定设计来源(设计稿或明确规范),不是临时方案
|
|
267
|
+
- props 可解释、可组合,且对主题/i18n 有清晰依赖边界
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import type { I18nMessages, I18nMissingKeyPolicy } from './i18n/types';
|
|
3
|
+
import { type LoadingDefaults } from './services/LoadingService/index';
|
|
4
|
+
import type { Theme, ThemeOverride } from './theme/types';
|
|
5
|
+
export type ComponentLibProviderProps = {
|
|
6
|
+
baseTheme?: Theme;
|
|
7
|
+
theme?: ThemeOverride;
|
|
8
|
+
locale?: string;
|
|
9
|
+
messages?: I18nMessages;
|
|
10
|
+
missingKeyPolicy?: I18nMissingKeyPolicy;
|
|
11
|
+
loading?: LoadingDefaults;
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
};
|
|
14
|
+
export declare function ComponentLibProvider({ baseTheme, theme, locale, messages, missingKeyPolicy, loading, children, }: ComponentLibProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=ComponentLibProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentLibProvider.d.ts","sourceRoot":"","sources":["../src/ComponentLibProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIvE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIxF,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,MAAM,yBAAyB,GAAG;IAEtC,SAAS,CAAC,EAAE,KAAK,CAAC;IAElB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAKF,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,QAAQ,GACT,EAAE,yBAAyB,2CAoB3B"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ComponentLibProvider = ComponentLibProvider;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const I18nProvider_1 = require("./i18n/I18nProvider");
|
|
6
|
+
const index_1 = require("./services/ActionDialogService/index");
|
|
7
|
+
const index_2 = require("./services/CardToastService/index");
|
|
8
|
+
const index_3 = require("./services/ImagePreviewService/index");
|
|
9
|
+
const index_4 = require("./services/LoadingService/index");
|
|
10
|
+
const index_5 = require("./services/PermissionPurposeDialogService/index");
|
|
11
|
+
const index_6 = require("./services/PickerService/index");
|
|
12
|
+
const ThemeProvider_1 = require("./theme/ThemeProvider");
|
|
13
|
+
// ComponentLibProvider 是组件库推荐的顶层 Provider:
|
|
14
|
+
// - 同时提供 Theme 与 i18n
|
|
15
|
+
// - 避免业务方在 App 里层层包裹多个 Provider
|
|
16
|
+
function ComponentLibProvider({ baseTheme, theme, locale, messages, missingKeyPolicy, loading, children, }) {
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)(ThemeProvider_1.ThemeProvider, { baseTheme: baseTheme, theme: theme, children: (0, jsx_runtime_1.jsx)(I18nProvider_1.I18nProvider, { locale: locale, messages: messages, missingKeyPolicy: missingKeyPolicy, children: (0, jsx_runtime_1.jsx)(index_6.PickerServiceProvider, { children: (0, jsx_runtime_1.jsx)(index_2.ToastProvider, { children: (0, jsx_runtime_1.jsx)(index_1.ActionDialogProvider, { children: (0, jsx_runtime_1.jsx)(index_4.LoadingProvider, { defaults: loading, children: (0, jsx_runtime_1.jsx)(index_5.PermissionPurposeDialogProvider, { children: (0, jsx_runtime_1.jsx)(index_3.ImagePreviewProvider, { children: children }) }) }) }) }) }) }) }));
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"v":"5.7.5","fr":60,"ip":0,"op":61,"w":600,"h":600,"nm":"ios-spinner","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":60,"s":[0]}],"ix":11},"r":{"a":0,"k":-180,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"t":60,"s":[8]}],"ix":11},"r":{"a":0,"k":-150,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":60,"s":[16]}],"ix":11},"r":{"a":0,"k":-120,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[24]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"t":60,"s":[24]}],"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[32]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":60,"s":[32]}],"ix":11},"r":{"a":0,"k":-60,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[100]},{"t":60,"s":[40]}],"ix":11},"r":{"a":0,"k":-30,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[48]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":60,"s":[48]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[56]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"t":60,"s":[56]}],"ix":11},"r":{"a":0,"k":-330,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[64]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":60,"s":[64]}],"ix":11},"r":{"a":0,"k":-300,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[72]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":60,"s":[72]}],"ix":11},"r":{"a":0,"k":-270,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[80]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":60,"s":[80]}],"ix":11},"r":{"a":0,"k":-240,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[88]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":60,"s":[88]}],"ix":11},"r":{"a":0,"k":-210,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[13,22],[13,124]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":40,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[11,-82],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0}],"markers":[]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Theme, ThemeOverride } from './theme/types';
|
|
2
|
+
import type { I18nMessages, I18nMissingKeyPolicy } from './i18n/types';
|
|
3
|
+
export type ComponentLibI18nConfig = {
|
|
4
|
+
locale?: string;
|
|
5
|
+
messages?: I18nMessages;
|
|
6
|
+
missingKeyPolicy?: I18nMissingKeyPolicy;
|
|
7
|
+
};
|
|
8
|
+
export type ComponentLibConfig = {
|
|
9
|
+
theme?: ThemeOverride;
|
|
10
|
+
i18n?: ComponentLibI18nConfig;
|
|
11
|
+
};
|
|
12
|
+
export declare function configureComponentLib(next: ComponentLibConfig): void;
|
|
13
|
+
export declare function getComponentLibConfig(): ComponentLibConfig;
|
|
14
|
+
export declare function getDefaultTheme(): Theme;
|
|
15
|
+
export declare function getDefaultI18nConfig(): Required<ComponentLibI18nConfig>;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAQvE,MAAM,MAAM,sBAAsB,GAAG;IAEnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,QAAQ,CAAC,EAAE,YAAY,CAAC;IAIxB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAE/B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B,CAAC;AAKF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,QAS7D;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,CAE1D;AAMD,wBAAgB,eAAe,IAAI,KAAK,CAEvC;AAKD,wBAAgB,oBAAoB,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAMvE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureComponentLib = configureComponentLib;
|
|
4
|
+
exports.getComponentLibConfig = getComponentLibConfig;
|
|
5
|
+
exports.getDefaultTheme = getDefaultTheme;
|
|
6
|
+
exports.getDefaultI18nConfig = getDefaultI18nConfig;
|
|
7
|
+
const defaultTheme_1 = require("./theme/defaultTheme");
|
|
8
|
+
const mergeTheme_1 = require("./theme/mergeTheme");
|
|
9
|
+
const locale_1 = require("./i18n/locale");
|
|
10
|
+
let componentLibConfig = {};
|
|
11
|
+
// 合并式更新:多次调用会按层级合并(不会把之前的 i18n 整块覆盖掉)
|
|
12
|
+
function configureComponentLib(next) {
|
|
13
|
+
componentLibConfig = {
|
|
14
|
+
...componentLibConfig,
|
|
15
|
+
...next,
|
|
16
|
+
i18n: {
|
|
17
|
+
...componentLibConfig.i18n,
|
|
18
|
+
...next.i18n,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function getComponentLibConfig() {
|
|
23
|
+
return componentLibConfig;
|
|
24
|
+
}
|
|
25
|
+
// getDefaultTheme 用于生成“当前有效的默认主题”:
|
|
26
|
+
// - defaultTheme 作为组件库内置基线
|
|
27
|
+
// - configureComponentLib({ theme }) 提供全局覆盖
|
|
28
|
+
// - ThemeProvider({ theme }) 再做实例级覆盖(优先级更高)
|
|
29
|
+
function getDefaultTheme() {
|
|
30
|
+
return (0, mergeTheme_1.mergeTheme)(defaultTheme_1.defaultTheme, componentLibConfig.theme);
|
|
31
|
+
}
|
|
32
|
+
// getDefaultI18nConfig 用于生成“当前有效的默认 i18n 配置”:
|
|
33
|
+
// - configureComponentLib({ i18n }) 可在应用启动时设定默认 locale/messages
|
|
34
|
+
// - I18nProvider({ ... }) 可在局部覆盖(例如某个子树临时切换语言)
|
|
35
|
+
function getDefaultI18nConfig() {
|
|
36
|
+
var _a, _b, _c, _d, _e, _f;
|
|
37
|
+
return {
|
|
38
|
+
locale: (_b = (_a = componentLibConfig.i18n) === null || _a === void 0 ? void 0 : _a.locale) !== null && _b !== void 0 ? _b : (0, locale_1.resolveSystemBuiltinLocale)(),
|
|
39
|
+
messages: (_d = (_c = componentLibConfig.i18n) === null || _c === void 0 ? void 0 : _c.messages) !== null && _d !== void 0 ? _d : {},
|
|
40
|
+
missingKeyPolicy: (_f = (_e = componentLibConfig.i18n) === null || _e === void 0 ? void 0 : _e.missingKeyPolicy) !== null && _f !== void 0 ? _f : 'key',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { I18nContextValue, I18nMessages, I18nMissingKeyPolicy } from './types';
|
|
3
|
+
export declare const I18nContext: React.Context<I18nContextValue>;
|
|
4
|
+
export type I18nProviderProps = {
|
|
5
|
+
locale?: string;
|
|
6
|
+
messages?: I18nMessages;
|
|
7
|
+
missingKeyPolicy?: I18nMissingKeyPolicy;
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
};
|
|
10
|
+
export declare function I18nProvider({ locale, messages, missingKeyPolicy, children }: I18nProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=I18nProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"I18nProvider.d.ts","sourceRoot":"","sources":["../../src/i18n/I18nProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EAGrB,MAAM,SAAS,CAAC;AAyCjB,eAAO,MAAM,WAAW,iCAEtB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAM/F"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.I18nContext = void 0;
|
|
37
|
+
exports.I18nProvider = I18nProvider;
|
|
38
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
+
const React = __importStar(require("react"));
|
|
40
|
+
const config_1 = require("../config");
|
|
41
|
+
const locale_1 = require("./locale");
|
|
42
|
+
const locales_1 = require("./locales");
|
|
43
|
+
function interpolate(template, params) {
|
|
44
|
+
if (!params)
|
|
45
|
+
return template;
|
|
46
|
+
return template.replace(/\{(\w+)\}/g, (full, key) => {
|
|
47
|
+
const value = params[key];
|
|
48
|
+
if (value === undefined || value === null)
|
|
49
|
+
return full;
|
|
50
|
+
return String(value);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function createTranslator(messages, missingKeyPolicy) {
|
|
54
|
+
return (key, params) => {
|
|
55
|
+
const raw = messages[key];
|
|
56
|
+
if (raw == null) {
|
|
57
|
+
if (missingKeyPolicy === 'throw') {
|
|
58
|
+
throw new Error(`[zkit-ui] Missing i18n key: ${key}`);
|
|
59
|
+
}
|
|
60
|
+
return key;
|
|
61
|
+
}
|
|
62
|
+
return interpolate(raw, params);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function resolveI18nValue(base, override) {
|
|
66
|
+
var _a, _b, _c, _d;
|
|
67
|
+
const locale = (_a = override === null || override === void 0 ? void 0 : override.locale) !== null && _a !== void 0 ? _a : base.locale;
|
|
68
|
+
// 优先级:override.messages > base.messages > 内置语言包
|
|
69
|
+
const builtinMessages = (_b = locales_1.locales[(0, locale_1.resolveBuiltinLocale)(locale)]) !== null && _b !== void 0 ? _b : {};
|
|
70
|
+
const messages = { ...builtinMessages, ...base.messages, ...((_c = override === null || override === void 0 ? void 0 : override.messages) !== null && _c !== void 0 ? _c : {}) };
|
|
71
|
+
const missingKeyPolicy = (_d = override === null || override === void 0 ? void 0 : override.missingKeyPolicy) !== null && _d !== void 0 ? _d : base.missingKeyPolicy;
|
|
72
|
+
const t = createTranslator(messages, missingKeyPolicy);
|
|
73
|
+
return { locale, messages, missingKeyPolicy, t };
|
|
74
|
+
}
|
|
75
|
+
exports.I18nContext = React.createContext({
|
|
76
|
+
...resolveI18nValue((0, config_1.getDefaultI18nConfig)()),
|
|
77
|
+
});
|
|
78
|
+
function I18nProvider({ locale, messages, missingKeyPolicy, children }) {
|
|
79
|
+
const value = React.useMemo(() => {
|
|
80
|
+
const base = (0, config_1.getDefaultI18nConfig)();
|
|
81
|
+
return resolveI18nValue(base, { locale, messages, missingKeyPolicy });
|
|
82
|
+
}, [locale, messages, missingKeyPolicy]);
|
|
83
|
+
return (0, jsx_runtime_1.jsx)(exports.I18nContext.Provider, { value: value, children: children });
|
|
84
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const DEFAULT_I18N_LOCALE = "zh-CN";
|
|
2
|
+
export declare const BUILTIN_I18N_LOCALES: readonly ["zh-CN", "zh-TW", "ja", "en-US", "de"];
|
|
3
|
+
export type BuiltinI18nLocale = (typeof BUILTIN_I18N_LOCALES)[number];
|
|
4
|
+
export declare function resolveBuiltinLocale(locale?: string | null): BuiltinI18nLocale;
|
|
5
|
+
export declare function getSystemLocale(): string | undefined;
|
|
6
|
+
export declare function resolveSystemBuiltinLocale(): "zh-CN" | "zh-TW" | "ja" | "en-US" | "de";
|
|
7
|
+
//# sourceMappingURL=locale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../src/i18n/locale.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C,eAAO,MAAM,oBAAoB,kDAAmD,CAAC;AAGrF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAsEtE,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAE9E;AAiBD,wBAAgB,eAAe,uBAE9B;AAED,wBAAgB,0BAA0B,8CAOzC"}
|