@longzai-intelligence-layout/theming 0.0.0-stage → 0.0.1
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/dist/index.d.ts +295 -0
- package/dist/index.js +1 -0
- package/package.json +59 -4
- package/README.md +0 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { ComponentType } from "react";
|
|
2
|
+
import { StoreApi, UseBoundStore } from "zustand";
|
|
3
|
+
/**
|
|
4
|
+
* 设计语言偏好工具
|
|
5
|
+
*
|
|
6
|
+
* 为界面设计语言提供偏好取值类型、选项条目形态与偏好定义构造,
|
|
7
|
+
* 异常取值一律回落默认设计语言
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 设计语言选项条目
|
|
11
|
+
*
|
|
12
|
+
* @typeParam L - 设计语言名类型
|
|
13
|
+
*/
|
|
14
|
+
type DesignLanguageOption<L extends string> = {
|
|
15
|
+
/**
|
|
16
|
+
* 选项偏好值,与文档根元素 `data-design-language` 属性取值一致
|
|
17
|
+
*/
|
|
18
|
+
value: L;
|
|
19
|
+
/**
|
|
20
|
+
* 选项可访问名称
|
|
21
|
+
*/
|
|
22
|
+
label: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* 设计语言偏好定义形态
|
|
26
|
+
*
|
|
27
|
+
* @typeParam L - 设计语言名类型
|
|
28
|
+
*/
|
|
29
|
+
type DesignLanguagePreferenceDefinition<L extends string> = ReturnType<typeof defineDesignLanguagePreference<L>>;
|
|
30
|
+
/**
|
|
31
|
+
* 构造设计语言偏好定义
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* 仅接受清单内合法取值,键缺失与其余异常取值一律回落默认设计语言,
|
|
35
|
+
* 让首次使用与存储异常都收敛到默认设计语言形态
|
|
36
|
+
* @typeParam L - 设计语言名类型
|
|
37
|
+
* @param languages - 设计语言合法取值清单
|
|
38
|
+
* @param defaultLanguage - 默认设计语言,结构层基座语言形态
|
|
39
|
+
* @param key - 完整存储键名,约定挂消费方命名空间前缀
|
|
40
|
+
* @param tier - 偏好存储层级
|
|
41
|
+
* @returns 设计语言偏好定义
|
|
42
|
+
*/
|
|
43
|
+
declare function defineDesignLanguagePreference<L extends string>(languages: readonly L[], defaultLanguage: L, key: string, tier: 'persistent' | 'session'): import("@longzai-intelligence-layout/preferences").PreferenceDefinition<L>;
|
|
44
|
+
/**
|
|
45
|
+
* 界面设计语言状态形态
|
|
46
|
+
*
|
|
47
|
+
* @typeParam L - 设计语言名类型
|
|
48
|
+
*/
|
|
49
|
+
type DesignLanguageState<L extends string> = {
|
|
50
|
+
/**
|
|
51
|
+
* 当前设计语言偏好,初值读本地存储,缺省为默认设计语言
|
|
52
|
+
*/
|
|
53
|
+
preference: L;
|
|
54
|
+
/**
|
|
55
|
+
* 切换设计语言偏好并记忆到本地存储
|
|
56
|
+
*
|
|
57
|
+
* @param next - 切换后的设计语言偏好
|
|
58
|
+
*/
|
|
59
|
+
setPreference: (next: L) => void;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 设计语言偏好读写绑定形态
|
|
63
|
+
*
|
|
64
|
+
* @typeParam L - 设计语言名类型
|
|
65
|
+
*/
|
|
66
|
+
type DesignLanguagePreferenceBinding<L extends string> = {
|
|
67
|
+
/**
|
|
68
|
+
* 当前设计语言偏好
|
|
69
|
+
*/
|
|
70
|
+
preference: L;
|
|
71
|
+
/**
|
|
72
|
+
* 切换设计语言偏好动作,切换即持久化
|
|
73
|
+
*/
|
|
74
|
+
setPreference: (next: L) => void;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 设计语言控制器形态
|
|
78
|
+
*
|
|
79
|
+
* @typeParam L - 设计语言名类型
|
|
80
|
+
*/
|
|
81
|
+
type DesignLanguageController<L extends string> = {
|
|
82
|
+
/**
|
|
83
|
+
* 全局设计语言偏好 store,切换动作随写随存
|
|
84
|
+
*/
|
|
85
|
+
useStore: UseBoundStore<StoreApi<DesignLanguageState<L>>>;
|
|
86
|
+
/**
|
|
87
|
+
* 设计语言选项表,消费方注入的清单原样保留渲染顺序
|
|
88
|
+
*/
|
|
89
|
+
options: readonly DesignLanguageOption<L>[];
|
|
90
|
+
/**
|
|
91
|
+
* 默认设计语言,该形态下文档根元素不携带 `data-design-language` 属性
|
|
92
|
+
*/
|
|
93
|
+
defaultLanguage: L;
|
|
94
|
+
/**
|
|
95
|
+
* 设计语言应用同步 hook,全局挂载一次,偏好变化时应用到文档根元素
|
|
96
|
+
*/
|
|
97
|
+
useSync: () => void;
|
|
98
|
+
/**
|
|
99
|
+
* 设计语言偏好读写 hook
|
|
100
|
+
*
|
|
101
|
+
* @returns 当前设计语言偏好与切换动作的绑定,切换即持久化
|
|
102
|
+
*/
|
|
103
|
+
usePreference: () => DesignLanguagePreferenceBinding<L>;
|
|
104
|
+
/**
|
|
105
|
+
* 渲染前按 store 当前偏好同步应用设计语言,供应用入口在首次渲染前调用以避免非默认语言用户首帧闪回默认视觉
|
|
106
|
+
*/
|
|
107
|
+
applyFromStorage: () => void;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* 设计语言控制器选项
|
|
111
|
+
*
|
|
112
|
+
* @typeParam L - 设计语言名类型
|
|
113
|
+
*/
|
|
114
|
+
type CreateDesignLanguageControllerOptions<L extends string> = {
|
|
115
|
+
/**
|
|
116
|
+
* 设计语言选项表,渲染顺序即切换控件选项顺序
|
|
117
|
+
*/
|
|
118
|
+
options: readonly DesignLanguageOption<L>[];
|
|
119
|
+
/**
|
|
120
|
+
* 默认设计语言,约定为结构层基座语言,该形态清除根元素属性回落结构层直供
|
|
121
|
+
*/
|
|
122
|
+
defaultLanguage: L;
|
|
123
|
+
/**
|
|
124
|
+
* 设计语言偏好定义
|
|
125
|
+
*/
|
|
126
|
+
preference: DesignLanguagePreferenceDefinition<L>;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* 创建设计语言控制器
|
|
130
|
+
*
|
|
131
|
+
* @typeParam L - 设计语言名类型
|
|
132
|
+
* @param options - 设计语言控制器选项
|
|
133
|
+
* @returns 设计语言控制器实例
|
|
134
|
+
*/
|
|
135
|
+
declare function createDesignLanguageController<L extends string>(options: CreateDesignLanguageControllerOptions<L>): DesignLanguageController<L>;
|
|
136
|
+
/**
|
|
137
|
+
* 设计语言切换组件属性
|
|
138
|
+
*
|
|
139
|
+
* @typeParam L - 设计语言名类型
|
|
140
|
+
*/
|
|
141
|
+
type DesignLanguageSwitcherProps<L extends string> = {
|
|
142
|
+
/**
|
|
143
|
+
* 设计语言控制器实例
|
|
144
|
+
*/
|
|
145
|
+
controller: DesignLanguageController<L>;
|
|
146
|
+
/**
|
|
147
|
+
* 选项图标组件映射,键为选项偏好值,缺省选项回退通用图标
|
|
148
|
+
*/
|
|
149
|
+
icons?: Partial<Record<L, ComponentType<{
|
|
150
|
+
size?: number;
|
|
151
|
+
'aria-hidden'?: boolean;
|
|
152
|
+
}>>>;
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* 设计语言切换组件
|
|
156
|
+
*
|
|
157
|
+
* @typeParam L - 设计语言名类型
|
|
158
|
+
* @param options - 设计语言切换组件属性
|
|
159
|
+
* @param options.controller - 设计语言控制器实例
|
|
160
|
+
* @param options.icons - 选项图标组件映射,未注入映射的选项回退通用图标
|
|
161
|
+
* @returns 多态分段切换控件
|
|
162
|
+
*/
|
|
163
|
+
declare function DesignLanguageSwitcher<L extends string>({ controller, icons }: DesignLanguageSwitcherProps<L>): import("react").JSX.Element;
|
|
164
|
+
/**
|
|
165
|
+
* 主题偏好工具
|
|
166
|
+
*
|
|
167
|
+
* 为界面主题提供偏好取值类型、偏好定义构造与生效暗色判定,
|
|
168
|
+
* 异常取值一律回落跟随系统
|
|
169
|
+
*/
|
|
170
|
+
/**
|
|
171
|
+
* 主题偏好取值
|
|
172
|
+
*/
|
|
173
|
+
type ThemePreference = 'light' | 'dark' | 'system';
|
|
174
|
+
/**
|
|
175
|
+
* 主题偏好定义形态
|
|
176
|
+
*/
|
|
177
|
+
type ThemePreferenceDefinition = ReturnType<typeof defineThemePreference>;
|
|
178
|
+
/**
|
|
179
|
+
* 构造主题偏好定义
|
|
180
|
+
*
|
|
181
|
+
* @remarks
|
|
182
|
+
* 仅接受 `light` 与 `dark` 与 `system` 三个合法取值,键缺失与其余异常取值一律回落 `system`,
|
|
183
|
+
* 让首次使用与存储异常都收敛到跟随系统偏好的形态
|
|
184
|
+
* @param key - 完整存储键名,约定挂消费方命名空间前缀
|
|
185
|
+
* @param tier - 偏好存储层级
|
|
186
|
+
* @returns 主题偏好定义
|
|
187
|
+
*/
|
|
188
|
+
declare function defineThemePreference(key: string, tier: 'persistent' | 'session'): import("@longzai-intelligence-layout/preferences").PreferenceDefinition<ThemePreference>;
|
|
189
|
+
/**
|
|
190
|
+
* 包内默认主题偏好定义
|
|
191
|
+
*
|
|
192
|
+
* @default 键 `layout.theme`,层级 persistent
|
|
193
|
+
*/
|
|
194
|
+
declare const defaultThemePreference: import("@longzai-intelligence-layout/preferences").PreferenceDefinition<ThemePreference>;
|
|
195
|
+
/**
|
|
196
|
+
* 解析主题偏好的生效暗色标记
|
|
197
|
+
*
|
|
198
|
+
* @param preference - 主题偏好
|
|
199
|
+
* @param systemPrefersDark - 系统当前是否偏好暗色
|
|
200
|
+
* @returns 生效主题是否为暗色
|
|
201
|
+
*/
|
|
202
|
+
declare function resolveThemeDark(preference: ThemePreference, systemPrefersDark: boolean): boolean;
|
|
203
|
+
/**
|
|
204
|
+
* 界面主题状态形态
|
|
205
|
+
*/
|
|
206
|
+
type ThemeState = {
|
|
207
|
+
/**
|
|
208
|
+
* 当前主题偏好,初值读本地存储,缺省跟随系统
|
|
209
|
+
*/
|
|
210
|
+
preference: ThemePreference;
|
|
211
|
+
/**
|
|
212
|
+
* 切换主题偏好并记忆到本地存储
|
|
213
|
+
*
|
|
214
|
+
* @param next - 切换后的主题偏好
|
|
215
|
+
*/
|
|
216
|
+
setPreference: (next: ThemePreference) => void;
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* 主题偏好读写绑定形态
|
|
220
|
+
*/
|
|
221
|
+
type ThemePreferenceBinding = {
|
|
222
|
+
/**
|
|
223
|
+
* 当前主题偏好
|
|
224
|
+
*/
|
|
225
|
+
preference: ThemePreference;
|
|
226
|
+
/**
|
|
227
|
+
* 切换主题偏好动作,切换即持久化
|
|
228
|
+
*/
|
|
229
|
+
setPreference: (next: ThemePreference) => void;
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* 主题控制器形态
|
|
233
|
+
*/
|
|
234
|
+
type ThemeController = {
|
|
235
|
+
/**
|
|
236
|
+
* 全局主题偏好 store,切换动作随写随存
|
|
237
|
+
*/
|
|
238
|
+
useStore: UseBoundStore<StoreApi<ThemeState>>;
|
|
239
|
+
/**
|
|
240
|
+
* 订读生效暗色标记
|
|
241
|
+
*
|
|
242
|
+
* @returns 生效主题是否为暗色,系统偏好变化与偏好切换实时更新
|
|
243
|
+
*/
|
|
244
|
+
useResolvedDark: () => boolean;
|
|
245
|
+
/**
|
|
246
|
+
* 主题应用同步 hook,全局挂载一次,生效暗色标记变化时应用到文档根元素
|
|
247
|
+
*/
|
|
248
|
+
useSync: () => void;
|
|
249
|
+
/**
|
|
250
|
+
* 主题偏好读写 hook
|
|
251
|
+
*
|
|
252
|
+
* @returns 当前主题偏好与切换动作的绑定,切换即持久化
|
|
253
|
+
*/
|
|
254
|
+
usePreference: () => ThemePreferenceBinding;
|
|
255
|
+
/**
|
|
256
|
+
* 渲染前按 store 当前偏好同步应用主题,供应用入口在首次渲染前调用以避免暗色用户首帧闪亮
|
|
257
|
+
*/
|
|
258
|
+
applyFromStorage: () => void;
|
|
259
|
+
};
|
|
260
|
+
/**
|
|
261
|
+
* 主题控制器选项
|
|
262
|
+
*/
|
|
263
|
+
type CreateThemeControllerOptions = {
|
|
264
|
+
/**
|
|
265
|
+
* 主题偏好定义
|
|
266
|
+
*
|
|
267
|
+
* @default 包内默认定义,键 `layout.theme`
|
|
268
|
+
*/
|
|
269
|
+
preference?: ThemePreferenceDefinition;
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* 创建主题控制器
|
|
273
|
+
*
|
|
274
|
+
* @param options - 主题控制器选项
|
|
275
|
+
* @returns 主题控制器实例
|
|
276
|
+
*/
|
|
277
|
+
declare function createThemeController(options?: CreateThemeControllerOptions): ThemeController;
|
|
278
|
+
/**
|
|
279
|
+
* 主题切换组件属性
|
|
280
|
+
*/
|
|
281
|
+
type ThemeSwitcherProps = {
|
|
282
|
+
/**
|
|
283
|
+
* 主题控制器实例
|
|
284
|
+
*/
|
|
285
|
+
controller: ThemeController;
|
|
286
|
+
};
|
|
287
|
+
/**
|
|
288
|
+
* 主题切换组件
|
|
289
|
+
*
|
|
290
|
+
* @param options - 主题切换组件属性
|
|
291
|
+
* @param options.controller - 主题控制器实例
|
|
292
|
+
* @returns 三态分段切换控件
|
|
293
|
+
*/
|
|
294
|
+
declare function ThemeSwitcher({ controller }: ThemeSwitcherProps): import("react").JSX.Element;
|
|
295
|
+
export { type CreateDesignLanguageControllerOptions, type CreateThemeControllerOptions, type DesignLanguageController, type DesignLanguageOption, type DesignLanguagePreferenceBinding, type DesignLanguagePreferenceDefinition, type DesignLanguageState, DesignLanguageSwitcher, type DesignLanguageSwitcherProps, type ThemeController, type ThemePreference, type ThemePreferenceBinding, type ThemePreferenceDefinition, type ThemeState, ThemeSwitcher, type ThemeSwitcherProps, createDesignLanguageController, createThemeController, defaultThemePreference, defineDesignLanguagePreference, defineThemePreference, resolveThemeDark };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{definePreference as e,enumCodec as t,readPreference as n,writePreference as r}from"@longzai-intelligence-layout/preferences";import{useEffect as i,useSyncExternalStore as a}from"react";import{create as o}from"zustand";import{Layers as s,Monitor as c,Moon as l,Sun as u}from"lucide-react";import{jsx as d}from"react/jsx-runtime";function f(e,t){t===e?delete document.documentElement.dataset.designLanguage:document.documentElement.dataset.designLanguage=t}function p(e){let t=e.options.map(e=>e.value),a=o(i=>({preference:n(e.preference),setPreference:n=>{t.includes(n)&&(r(e.preference,n),i({preference:n}))}}));function s(){let t=a(e=>e.preference);i(()=>{f(e.defaultLanguage,t)},[t])}function c(){return{preference:a(e=>e.preference),setPreference:a(e=>e.setPreference)}}return{useStore:a,options:e.options,defaultLanguage:e.defaultLanguage,useSync:s,usePreference:c,applyFromStorage:()=>{let t=a.getState().preference;f(e.defaultLanguage,t)}}}function m(n,r,i,a){return e({key:i,tier:a},t(n,r))}function h({controller:e,icons:t={}}){let{preference:n,setPreference:r}=e.usePreference();return/* @__PURE__ */ d(`div`,{role:`group`,"aria-label":`设计语言`,className:`flex shrink-0 overflow-hidden rounded-md border border-input`,children:e.options.map(({value:e,label:i})=>{let a=t[e]??s;return/* @__PURE__ */ d(`button`,{type:`button`,"aria-pressed":n===e,"aria-label":i,title:i,onClick:()=>r(e),className:`flex h-7 w-8 items-center justify-center transition-colors ${n===e?`bg-primary text-primary-foreground`:`bg-card text-muted-foreground hover:bg-accent`}`,children:/* @__PURE__ */ d(a,{size:13,"aria-hidden":!0})},e)})})}const g=[`light`,`dark`,`system`];function _(n,r){return e({key:n,tier:r},t(g,`system`))}const v=_(`layout.theme`,`persistent`);function y(e,t){return e===`dark`||e===`system`&&t}function b(e){document.documentElement.classList.toggle(`dark`,e),document.documentElement.style.colorScheme=e?`dark`:`light`}function x(e){let t=window.matchMedia(`(prefers-color-scheme: dark)`);return t.addEventListener(`change`,e),()=>{t.removeEventListener(`change`,e)}}function S(e={}){let t=e.preference??v,s=o(e=>({preference:n(t),setPreference:n=>{r(t,n),e({preference:n})}}));function c(){return y(s(e=>e.preference),a(x,()=>window.matchMedia(`(prefers-color-scheme: dark)`).matches,()=>!1))}function l(){let e=c();i(()=>{b(e)},[e])}function u(){return{preference:s(e=>e.preference),setPreference:s(e=>e.setPreference)}}return{useStore:s,useResolvedDark:c,useSync:l,usePreference:u,applyFromStorage:()=>{let e=s.getState().preference;b(y(e,window.matchMedia(`(prefers-color-scheme: dark)`).matches))}}}const C=[{value:`light`,label:`浅色主题`,Icon:u},{value:`dark`,label:`深色主题`,Icon:l},{value:`system`,label:`跟随系统`,Icon:c}];function w({controller:e}){let{preference:t,setPreference:n}=e.usePreference();return/* @__PURE__ */ d(`div`,{role:`group`,"aria-label":`界面主题`,className:`flex shrink-0 overflow-hidden rounded-md border border-input`,children:C.map(({value:e,label:r,Icon:i})=>/* @__PURE__ */ d(`button`,{type:`button`,"aria-pressed":t===e,"aria-label":r,title:r,onClick:()=>n(e),className:`flex h-7 w-8 items-center justify-center transition-colors ${t===e?`bg-primary text-primary-foreground`:`bg-card text-muted-foreground hover:bg-accent`}`,children:/* @__PURE__ */ d(i,{size:13,"aria-hidden":!0})},e))})}export{h as DesignLanguageSwitcher,w as ThemeSwitcher,p as createDesignLanguageController,S as createThemeController,v as defaultThemePreference,m as defineDesignLanguagePreference,_ as defineThemePreference,y as resolveThemeDark};
|
package/package.json
CHANGED
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longzai-intelligence-layout/theming",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Longzai Intelligence 双正交轴主题接线包:明暗轴与设计语言轴",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"design-language",
|
|
7
|
+
"layout",
|
|
8
|
+
"longzai-intelligence",
|
|
9
|
+
"theming"
|
|
10
|
+
],
|
|
11
|
+
"license": "UNLICENSED",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"type": "module",
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "lzi-builder",
|
|
27
|
+
"build:prod": "NODE_ENV=production bun run build",
|
|
28
|
+
"prepublishOnly": "bun run build:prod",
|
|
29
|
+
"typecheck": "bun run typecheck:app && bun run typecheck:node && bun run typecheck:test",
|
|
30
|
+
"typecheck:app": "lzi-tsgo typecheck tsconfig/app.json",
|
|
31
|
+
"typecheck:node": "lzi-tsgo typecheck tsconfig/node.json",
|
|
32
|
+
"typecheck:test": "lzi-tsgo typecheck tsconfig/test.json",
|
|
33
|
+
"lint": "oxlint && oxfmt --check",
|
|
34
|
+
"lint:fix": "oxlint --fix && oxfmt",
|
|
35
|
+
"test": "bun test",
|
|
36
|
+
"test:watch": "bun test --watch",
|
|
37
|
+
"test:coverage": "bun test --coverage",
|
|
38
|
+
"test:unit": "bun test src/__tests__/unit/",
|
|
39
|
+
"clean": "lzi-dev-cli clean"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@longzai-intelligence-layout/preferences": "0.0.1",
|
|
43
|
+
"clsx": "^2.1.1",
|
|
44
|
+
"lucide-react": "^1.17.0",
|
|
45
|
+
"tailwind-merge": "^3.6.0",
|
|
46
|
+
"zustand": "^5.0.15"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@happy-dom/global-registrator": "^20.11.2",
|
|
50
|
+
"@testing-library/react": "^16.3.2",
|
|
51
|
+
"@types/react": "^19.2.17",
|
|
52
|
+
"@types/react-dom": "^19.3.0",
|
|
53
|
+
"happy-dom": "^20.11.2",
|
|
54
|
+
"react": "19.2.6",
|
|
55
|
+
"react-dom": "19.2.6"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"react": "^19.2.6",
|
|
59
|
+
"react-dom": "^19.2.6"
|
|
60
|
+
}
|
|
61
|
+
}
|
package/README.md
DELETED