@unif/react-native-design 0.27.1 → 0.29.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 +3 -3
- package/lib/module/components/ui/CircularProgress/CircularProgress.js +108 -0
- package/lib/module/components/ui/CircularProgress/CircularProgress.js.map +1 -0
- package/lib/module/components/ui/CircularProgress/index.js +4 -0
- package/lib/module/components/ui/CircularProgress/index.js.map +1 -0
- package/lib/module/components/ui/CircularProgress/normalizeCircularProgress.js +42 -0
- package/lib/module/components/ui/CircularProgress/normalizeCircularProgress.js.map +1 -0
- package/lib/module/components/ui/CircularProgress/types.js +4 -0
- package/lib/module/components/ui/CircularProgress/types.js.map +1 -0
- package/lib/module/components/ui/Ribbon/Ribbon.js +70 -0
- package/lib/module/components/ui/Ribbon/Ribbon.js.map +1 -0
- package/lib/module/components/ui/Ribbon/index.js +4 -0
- package/lib/module/components/ui/Ribbon/index.js.map +1 -0
- package/lib/module/components/ui/Ribbon/layout.js +26 -0
- package/lib/module/components/ui/Ribbon/layout.js.map +1 -0
- package/lib/module/components/ui/Ribbon/styles.js +44 -0
- package/lib/module/components/ui/Ribbon/styles.js.map +1 -0
- package/lib/module/components/ui/Ribbon/types.js +4 -0
- package/lib/module/components/ui/Ribbon/types.js.map +1 -0
- package/lib/module/components/ui/Stepper/Stepper.js +12 -2
- package/lib/module/components/ui/Stepper/Stepper.js.map +1 -1
- package/lib/module/components/ui/Stepper/displayValue.js +6 -0
- package/lib/module/components/ui/Stepper/displayValue.js.map +1 -0
- package/lib/module/components/ui/Stepper/layout.js +19 -1
- package/lib/module/components/ui/Stepper/layout.js.map +1 -1
- package/lib/module/components/ui/Stepper/styles.js +9 -1
- package/lib/module/components/ui/Stepper/styles.js.map +1 -1
- package/lib/module/components/ui/index.js +2 -0
- package/lib/module/components/ui/index.js.map +1 -1
- package/lib/typescript/src/components/ui/CircularProgress/CircularProgress.d.ts +3 -0
- package/lib/typescript/src/components/ui/CircularProgress/CircularProgress.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/CircularProgress/index.d.ts +3 -0
- package/lib/typescript/src/components/ui/CircularProgress/index.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/CircularProgress/normalizeCircularProgress.d.ts +15 -0
- package/lib/typescript/src/components/ui/CircularProgress/normalizeCircularProgress.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/CircularProgress/types.d.ts +24 -0
- package/lib/typescript/src/components/ui/CircularProgress/types.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Ribbon/Ribbon.d.ts +4 -0
- package/lib/typescript/src/components/ui/Ribbon/Ribbon.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Ribbon/index.d.ts +3 -0
- package/lib/typescript/src/components/ui/Ribbon/index.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Ribbon/layout.d.ts +23 -0
- package/lib/typescript/src/components/ui/Ribbon/layout.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Ribbon/styles.d.ts +31 -0
- package/lib/typescript/src/components/ui/Ribbon/styles.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Ribbon/types.d.ts +18 -0
- package/lib/typescript/src/components/ui/Ribbon/types.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts +1 -1
- package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Stepper/displayValue.d.ts +2 -0
- package/lib/typescript/src/components/ui/Stepper/displayValue.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Stepper/layout.d.ts +2 -0
- package/lib/typescript/src/components/ui/Stepper/layout.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Stepper/styles.d.ts +2 -1
- package/lib/typescript/src/components/ui/Stepper/styles.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/Stepper/types.d.ts +4 -2
- package/lib/typescript/src/components/ui/Stepper/types.d.ts.map +1 -1
- package/lib/typescript/src/components/ui/index.d.ts +4 -0
- package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ui/CircularProgress/CircularProgress.tsx +111 -0
- package/src/components/ui/CircularProgress/index.ts +2 -0
- package/src/components/ui/CircularProgress/normalizeCircularProgress.ts +64 -0
- package/src/components/ui/CircularProgress/types.ts +24 -0
- package/src/components/ui/Ribbon/Ribbon.tsx +92 -0
- package/src/components/ui/Ribbon/index.ts +2 -0
- package/src/components/ui/Ribbon/layout.ts +33 -0
- package/src/components/ui/Ribbon/styles.ts +33 -0
- package/src/components/ui/Ribbon/types.ts +19 -0
- package/src/components/ui/Stepper/Stepper.tsx +15 -3
- package/src/components/ui/Stepper/displayValue.ts +6 -0
- package/src/components/ui/Stepper/layout.ts +28 -9
- package/src/components/ui/Stepper/styles.ts +4 -1
- package/src/components/ui/Stepper/types.ts +4 -2
- package/src/components/ui/index.ts +4 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type NormalizedCircularProgress = Readonly<{
|
|
2
|
+
safeValue: number;
|
|
3
|
+
percentage: number;
|
|
4
|
+
safeSize: number;
|
|
5
|
+
safeThickness: number;
|
|
6
|
+
radius: number;
|
|
7
|
+
circumference: number;
|
|
8
|
+
dashOffset: number;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function normalizeCircularProgress(input: {
|
|
11
|
+
value: number;
|
|
12
|
+
size: number;
|
|
13
|
+
thickness: number;
|
|
14
|
+
}): NormalizedCircularProgress;
|
|
15
|
+
//# sourceMappingURL=normalizeCircularProgress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeCircularProgress.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/CircularProgress/normalizeCircularProgress.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAQH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,0BAA0B,CAsC7B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
2
|
+
export type CircularProgressProps = {
|
|
3
|
+
/** 当前进度,使用 0..1;越界值会收敛到边界,非有限值按 0 处理。 */
|
|
4
|
+
value: number;
|
|
5
|
+
/** 圆环直径,默认 32,最小 16。 */
|
|
6
|
+
size?: number;
|
|
7
|
+
/** 圆环描边宽度,默认 2,最大为半径。 */
|
|
8
|
+
thickness?: number;
|
|
9
|
+
/** 进度颜色,默认 c.primary。 */
|
|
10
|
+
color?: string;
|
|
11
|
+
/** 轨道颜色,默认 c.outline。 */
|
|
12
|
+
trackColor?: string;
|
|
13
|
+
/** 是否在圆环中央显示取整后的百分比,默认 false。 */
|
|
14
|
+
showLabel?: boolean;
|
|
15
|
+
/** 百分比文字颜色,默认 c.foreground。 */
|
|
16
|
+
labelColor?: string;
|
|
17
|
+
/** 进度条可访问性名称,默认“进度”。 */
|
|
18
|
+
accessibilityLabel?: string;
|
|
19
|
+
/** 外层布局样式。 */
|
|
20
|
+
style?: StyleProp<ViewStyle>;
|
|
21
|
+
/** E2E / 测试定位。 */
|
|
22
|
+
testID?: string;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/CircularProgress/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG;IAClC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc;IACd,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ribbon.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Ribbon/Ribbon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAgB1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,IAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,KAAK,EACL,MAAM,GACP,EAAE,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkEjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Ribbon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type ResolvedRibbonLayout = {
|
|
2
|
+
overlay: {
|
|
3
|
+
position: 'absolute';
|
|
4
|
+
top: number;
|
|
5
|
+
right: number;
|
|
6
|
+
zIndex: number;
|
|
7
|
+
alignItems: 'flex-end';
|
|
8
|
+
};
|
|
9
|
+
bar: {
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
fold: {
|
|
13
|
+
width: 0;
|
|
14
|
+
height: 0;
|
|
15
|
+
borderWidth: number;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare function resolveRibbonLayout({ top, barHeight, foldSize, }: {
|
|
19
|
+
top: number;
|
|
20
|
+
barHeight: number;
|
|
21
|
+
foldSize: number;
|
|
22
|
+
}): ResolvedRibbonLayout;
|
|
23
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Ribbon/layout.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE;QACP,QAAQ,EAAE,UAAU,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IACF,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,SAAS,EACT,QAAQ,GACT,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,oBAAoB,CAYvB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ColorTokens } from '../../../theme';
|
|
2
|
+
import type { RibbonTone } from './types';
|
|
3
|
+
export declare const makeStyles: (_c: ColorTokens) => Readonly<{
|
|
4
|
+
root: {
|
|
5
|
+
position: "relative";
|
|
6
|
+
};
|
|
7
|
+
visual: {
|
|
8
|
+
alignItems: "flex-end";
|
|
9
|
+
};
|
|
10
|
+
bar: {
|
|
11
|
+
flexDirection: "row";
|
|
12
|
+
alignItems: "center";
|
|
13
|
+
paddingHorizontal: number;
|
|
14
|
+
borderTopLeftRadius: number;
|
|
15
|
+
borderBottomLeftRadius: number;
|
|
16
|
+
};
|
|
17
|
+
text: {
|
|
18
|
+
fontSize: number;
|
|
19
|
+
fontWeight: "500";
|
|
20
|
+
};
|
|
21
|
+
fold: {
|
|
22
|
+
borderRightColor: string;
|
|
23
|
+
borderBottomColor: string;
|
|
24
|
+
};
|
|
25
|
+
}>;
|
|
26
|
+
export declare function paletteFor(tone: RibbonTone, c: ColorTokens): {
|
|
27
|
+
bg: string;
|
|
28
|
+
fg: string;
|
|
29
|
+
fold: string;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Ribbon/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,eAAO,MAAM,UAAU,GAAI,IAAI,WAAW;;;;;;;;;;;;;;;;;;;;;;EAgBtC,CAAC;AAEL,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,CAAC,EAAE,WAAW,GACb;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAO1C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
export type RibbonTone = 'brand' | 'danger';
|
|
4
|
+
export type RibbonProps = {
|
|
5
|
+
/** 右上缎带的可见文案 */
|
|
6
|
+
label: string;
|
|
7
|
+
/** 语义色,默认 'brand' */
|
|
8
|
+
tone?: RibbonTone;
|
|
9
|
+
/** 被缎带标记的内容 */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/** 可选读屏文案;不传时缎带只作为装饰,避免与内容重复播报 */
|
|
12
|
+
accessibilityLabel?: string;
|
|
13
|
+
/** 外层布局样式 */
|
|
14
|
+
style?: StyleProp<ViewStyle>;
|
|
15
|
+
/** E2E / 测试定位 */
|
|
16
|
+
testID?: string;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Ribbon/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,eAAe;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa;IACb,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -7,5 +7,5 @@ import type { StepperProps } from './types';
|
|
|
7
7
|
* 健壮性:value/min/max 的非法或非有限输入均折叠到安全范围;step <=0 或
|
|
8
8
|
* 非有限数时回退 1;min > max 时折叠为 min 的零范围。
|
|
9
9
|
*/
|
|
10
|
-
export declare function Stepper({ value, onChange, accessibilityLabel, min, max, step, size, disabled, testID, }: StepperProps): React.JSX.Element;
|
|
10
|
+
export declare function Stepper({ value, onChange, accessibilityLabel, min, max, step, size, formatValue, disabled, testID, }: StepperProps): React.JSX.Element;
|
|
11
11
|
//# sourceMappingURL=Stepper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/Stepper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Stepper.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/Stepper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAkBzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAO5C;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,GAAG,EACH,GAAG,EACH,IAAI,EACJ,IAAW,EACX,WAAW,EACX,QAAgB,EAChB,MAAM,GACP,EAAE,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkLlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"displayValue.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/displayValue.ts"],"names":[],"mappings":"AAAA,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GACtC,MAAM,GAAG,MAAM,CAEjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/layout.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IACF,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,YAAY,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,wBAAgB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/layout.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IACF,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,YAAY,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,EACE,CAAC,EACD,GAAG,EACH,CAAC,GACF,EAAE;IACD,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;CACX,EACD,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,qBAAqB,CAmCvB"}
|
|
@@ -47,7 +47,8 @@ export declare const makeStyles: (c: ColorTokens) => Readonly<{
|
|
|
47
47
|
fontWeight: "500";
|
|
48
48
|
};
|
|
49
49
|
}>;
|
|
50
|
-
/** Stepper 尺寸推导:
|
|
50
|
+
/** Stepper 尺寸推导:xs(r(24) 高 / r(24) 按钮 / r(40) 值宽 / micro 字)/
|
|
51
|
+
* sm(control.sm=`r(28)` 高 / `r(28)` 按钮 / r(40) 值宽 / xs 字)/
|
|
51
52
|
* md(r(32) 高 / r(32) 按钮 / r(48) 值宽 / sm 字)。
|
|
52
53
|
* 新增 size 在 types.ts 加 union + 这里加 case。 */
|
|
53
54
|
export declare function sizingFor(size: StepperSize): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/styles.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;qEAEqE;AACrE,eAAO,MAAM,UAAU,GAAI,GAAG,WAAW;;;;;;;;;;;;;IAcrC;2DACuD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BvD,CAAC;AAEL
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/styles.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;qEAEqE;AACrE,eAAO,MAAM,UAAU,GAAI,GAAG,WAAW;;;;;;;;;;;;;IAcrC;2DACuD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BvD,CAAC;AAEL;;;6CAG6C;AAC7C,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG;IAC5C,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;CACZ,CASA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** Stepper 尺寸:sm=28px / md=32px */
|
|
2
|
-
export type StepperSize = 'sm' | 'md';
|
|
1
|
+
/** Stepper 尺寸:xs=24px / sm=28px / md=32px */
|
|
2
|
+
export type StepperSize = 'xs' | 'sm' | 'md';
|
|
3
3
|
export type StepperProps = {
|
|
4
4
|
/** 当前值(受控) */
|
|
5
5
|
value: number;
|
|
@@ -15,6 +15,8 @@ export type StepperProps = {
|
|
|
15
15
|
step?: number;
|
|
16
16
|
/** 尺寸,默认 'md' */
|
|
17
17
|
size?: StepperSize;
|
|
18
|
+
/** 自定义中央值的可见文案;数值运算与 adjustable 语义仍使用归一化后的 number */
|
|
19
|
+
formatValue?: (value: number) => string;
|
|
18
20
|
/** 整体禁用(三个操作节点都不暴露 action) */
|
|
19
21
|
disabled?: boolean;
|
|
20
22
|
/** E2E / 测试定位 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/Stepper/types.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc;IACd,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,qDAAqD;IACrD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -14,6 +14,8 @@ export { Checkbox } from './Checkbox';
|
|
|
14
14
|
export type { CheckboxProps } from './Checkbox';
|
|
15
15
|
export { Chip } from './Chip';
|
|
16
16
|
export type { ChipProps } from './Chip';
|
|
17
|
+
export { CircularProgress } from './CircularProgress';
|
|
18
|
+
export type { CircularProgressProps } from './CircularProgress';
|
|
17
19
|
export { confirm, ConfirmHost } from './Confirm';
|
|
18
20
|
export type { ConfirmOptions } from './Confirm';
|
|
19
21
|
export { DrawerHeader } from './DrawerHeader';
|
|
@@ -44,6 +46,8 @@ export { Radio } from './Radio';
|
|
|
44
46
|
export type { GroupProps as RadioGroupProps, RadioProps } from './Radio';
|
|
45
47
|
export { Reveal } from './Reveal';
|
|
46
48
|
export type { RevealProps } from './Reveal';
|
|
49
|
+
export { Ribbon } from './Ribbon';
|
|
50
|
+
export type { RibbonProps, RibbonTone } from './Ribbon';
|
|
47
51
|
export { Search } from './Search';
|
|
48
52
|
export type { SearchProps } from './Search';
|
|
49
53
|
export { Skeleton } from './Skeleton';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Text, View } from 'react-native';
|
|
2
|
+
import type { TextStyle, ViewStyle } from 'react-native';
|
|
3
|
+
import Svg, { Circle } from 'react-native-svg';
|
|
4
|
+
import { r, type, useColors } from '../../../theme';
|
|
5
|
+
import { A11Y_HIDDEN_PROPS } from '../shared/a11y';
|
|
6
|
+
import { normalizeCircularProgress } from './normalizeCircularProgress';
|
|
7
|
+
import type { CircularProgressProps } from './types';
|
|
8
|
+
|
|
9
|
+
const OUTER_CENTER_STYLE = {
|
|
10
|
+
alignItems: 'center',
|
|
11
|
+
justifyContent: 'center',
|
|
12
|
+
} as const satisfies ViewStyle;
|
|
13
|
+
|
|
14
|
+
const VISUAL_CONTAINER_STYLE = {
|
|
15
|
+
position: 'relative',
|
|
16
|
+
} as const satisfies ViewStyle;
|
|
17
|
+
|
|
18
|
+
const LABEL_CENTER_STYLE = {
|
|
19
|
+
fontWeight: '600',
|
|
20
|
+
left: 0,
|
|
21
|
+
position: 'absolute',
|
|
22
|
+
textAlign: 'center',
|
|
23
|
+
top: 0,
|
|
24
|
+
} as const satisfies TextStyle;
|
|
25
|
+
|
|
26
|
+
export function CircularProgress({
|
|
27
|
+
value,
|
|
28
|
+
size = r(32),
|
|
29
|
+
thickness = r(2),
|
|
30
|
+
color,
|
|
31
|
+
trackColor,
|
|
32
|
+
showLabel = false,
|
|
33
|
+
labelColor,
|
|
34
|
+
accessibilityLabel = '进度',
|
|
35
|
+
style,
|
|
36
|
+
testID,
|
|
37
|
+
}: CircularProgressProps): React.JSX.Element {
|
|
38
|
+
const colors = useColors();
|
|
39
|
+
const normalized = normalizeCircularProgress({ value, size, thickness });
|
|
40
|
+
const {
|
|
41
|
+
circumference,
|
|
42
|
+
dashOffset,
|
|
43
|
+
percentage,
|
|
44
|
+
radius,
|
|
45
|
+
safeSize,
|
|
46
|
+
safeThickness,
|
|
47
|
+
} = normalized;
|
|
48
|
+
const center = safeSize / 2;
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<View
|
|
52
|
+
accessible
|
|
53
|
+
accessibilityLabel={accessibilityLabel}
|
|
54
|
+
accessibilityRole="progressbar"
|
|
55
|
+
accessibilityValue={{
|
|
56
|
+
min: 0,
|
|
57
|
+
max: 100,
|
|
58
|
+
now: percentage,
|
|
59
|
+
text: `${percentage}%`,
|
|
60
|
+
}}
|
|
61
|
+
style={[{ height: safeSize, width: safeSize }, style, OUTER_CENTER_STYLE]}
|
|
62
|
+
testID={testID}
|
|
63
|
+
>
|
|
64
|
+
<View
|
|
65
|
+
style={[{ height: safeSize, width: safeSize }, VISUAL_CONTAINER_STYLE]}
|
|
66
|
+
{...A11Y_HIDDEN_PROPS}
|
|
67
|
+
>
|
|
68
|
+
<Svg height={safeSize} width={safeSize}>
|
|
69
|
+
<Circle
|
|
70
|
+
cx={center}
|
|
71
|
+
cy={center}
|
|
72
|
+
fill="none"
|
|
73
|
+
r={radius}
|
|
74
|
+
stroke={trackColor ?? colors.outline}
|
|
75
|
+
strokeWidth={safeThickness}
|
|
76
|
+
/>
|
|
77
|
+
<Circle
|
|
78
|
+
cx={center}
|
|
79
|
+
cy={center}
|
|
80
|
+
fill="none"
|
|
81
|
+
r={radius}
|
|
82
|
+
rotation={-90}
|
|
83
|
+
originX={center}
|
|
84
|
+
originY={center}
|
|
85
|
+
stroke={color ?? colors.primary}
|
|
86
|
+
strokeDasharray={circumference}
|
|
87
|
+
strokeDashoffset={dashOffset}
|
|
88
|
+
strokeLinecap="round"
|
|
89
|
+
strokeWidth={safeThickness}
|
|
90
|
+
/>
|
|
91
|
+
</Svg>
|
|
92
|
+
{showLabel ? (
|
|
93
|
+
<Text
|
|
94
|
+
style={[
|
|
95
|
+
{
|
|
96
|
+
color: labelColor ?? colors.foreground,
|
|
97
|
+
fontSize: type.nano,
|
|
98
|
+
height: safeSize,
|
|
99
|
+
lineHeight: safeSize,
|
|
100
|
+
width: safeSize,
|
|
101
|
+
},
|
|
102
|
+
LABEL_CENTER_STYLE,
|
|
103
|
+
]}
|
|
104
|
+
>
|
|
105
|
+
{`${percentage}%`}
|
|
106
|
+
</Text>
|
|
107
|
+
) : null}
|
|
108
|
+
</View>
|
|
109
|
+
</View>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createLogger } from '../../../utils/logger';
|
|
2
|
+
|
|
3
|
+
const log = createLogger('CircularProgress');
|
|
4
|
+
const warnedKeys = new Set<string>();
|
|
5
|
+
|
|
6
|
+
export type NormalizedCircularProgress = Readonly<{
|
|
7
|
+
safeValue: number;
|
|
8
|
+
percentage: number;
|
|
9
|
+
safeSize: number;
|
|
10
|
+
safeThickness: number;
|
|
11
|
+
radius: number;
|
|
12
|
+
circumference: number;
|
|
13
|
+
dashOffset: number;
|
|
14
|
+
}>;
|
|
15
|
+
|
|
16
|
+
function warnOnce(key: string, message: string): void {
|
|
17
|
+
if (warnedKeys.has(key)) return;
|
|
18
|
+
warnedKeys.add(key);
|
|
19
|
+
log.warn(message);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function normalizeCircularProgress(input: {
|
|
23
|
+
value: number;
|
|
24
|
+
size: number;
|
|
25
|
+
thickness: number;
|
|
26
|
+
}): NormalizedCircularProgress {
|
|
27
|
+
const { value, size, thickness } = input;
|
|
28
|
+
|
|
29
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
30
|
+
warnOnce(
|
|
31
|
+
`value:${value}`,
|
|
32
|
+
`value 应为 0..1 的有限数,传入 ${value},已收敛到安全范围`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (!Number.isFinite(size) || size < 16) {
|
|
36
|
+
warnOnce(`size:${size}`, `size 应为 ≥16 的有限数,传入 ${size},已钳到 16`);
|
|
37
|
+
}
|
|
38
|
+
if (!Number.isFinite(thickness) || thickness <= 0) {
|
|
39
|
+
warnOnce(
|
|
40
|
+
`thickness:${thickness}`,
|
|
41
|
+
`thickness 应为正有限数,传入 ${thickness},已 fallback 为 2`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const safeValue = Number.isFinite(value)
|
|
46
|
+
? Math.min(1, Math.max(0, value))
|
|
47
|
+
: 0;
|
|
48
|
+
const safeSize = Number.isFinite(size) && size >= 16 ? size : 16;
|
|
49
|
+
const fallbackThickness =
|
|
50
|
+
Number.isFinite(thickness) && thickness > 0 ? thickness : 2;
|
|
51
|
+
const safeThickness = Math.min(fallbackThickness, safeSize / 2);
|
|
52
|
+
const radius = (safeSize - safeThickness) / 2;
|
|
53
|
+
const circumference = 2 * Math.PI * radius;
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
safeValue,
|
|
57
|
+
percentage: Math.round(safeValue * 100),
|
|
58
|
+
safeSize,
|
|
59
|
+
safeThickness,
|
|
60
|
+
radius,
|
|
61
|
+
circumference,
|
|
62
|
+
dashOffset: circumference * (1 - safeValue),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
2
|
+
|
|
3
|
+
export type CircularProgressProps = {
|
|
4
|
+
/** 当前进度,使用 0..1;越界值会收敛到边界,非有限值按 0 处理。 */
|
|
5
|
+
value: number;
|
|
6
|
+
/** 圆环直径,默认 32,最小 16。 */
|
|
7
|
+
size?: number;
|
|
8
|
+
/** 圆环描边宽度,默认 2,最大为半径。 */
|
|
9
|
+
thickness?: number;
|
|
10
|
+
/** 进度颜色,默认 c.primary。 */
|
|
11
|
+
color?: string;
|
|
12
|
+
/** 轨道颜色,默认 c.outline。 */
|
|
13
|
+
trackColor?: string;
|
|
14
|
+
/** 是否在圆环中央显示取整后的百分比,默认 false。 */
|
|
15
|
+
showLabel?: boolean;
|
|
16
|
+
/** 百分比文字颜色,默认 c.foreground。 */
|
|
17
|
+
labelColor?: string;
|
|
18
|
+
/** 进度条可访问性名称,默认“进度”。 */
|
|
19
|
+
accessibilityLabel?: string;
|
|
20
|
+
/** 外层布局样式。 */
|
|
21
|
+
style?: StyleProp<ViewStyle>;
|
|
22
|
+
/** E2E / 测试定位。 */
|
|
23
|
+
testID?: string;
|
|
24
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text, View } from 'react-native';
|
|
3
|
+
import {
|
|
4
|
+
r,
|
|
5
|
+
scaleFontMetric,
|
|
6
|
+
space,
|
|
7
|
+
type as t,
|
|
8
|
+
useColors,
|
|
9
|
+
useFontScale,
|
|
10
|
+
useThemedStyles,
|
|
11
|
+
} from '../../../theme';
|
|
12
|
+
import { childTestID } from '../../../utils/testID';
|
|
13
|
+
import { A11Y_HIDDEN_PROPS, A11Y_TEXT_ONLY_STYLE } from '../shared/a11y';
|
|
14
|
+
import { normalizeNonBlankText } from '../shared/accessibilityName';
|
|
15
|
+
import { resolveRibbonLayout } from './layout';
|
|
16
|
+
import { makeStyles, paletteFor } from './styles';
|
|
17
|
+
import type { RibbonProps } from './types';
|
|
18
|
+
|
|
19
|
+
export function Ribbon({
|
|
20
|
+
label,
|
|
21
|
+
tone = 'brand',
|
|
22
|
+
children,
|
|
23
|
+
accessibilityLabel,
|
|
24
|
+
style,
|
|
25
|
+
testID,
|
|
26
|
+
}: RibbonProps): React.JSX.Element {
|
|
27
|
+
const c = useColors();
|
|
28
|
+
const fontScale = useFontScale();
|
|
29
|
+
const styles = useThemedStyles(makeStyles);
|
|
30
|
+
const layout = resolveRibbonLayout({
|
|
31
|
+
top: space['3'],
|
|
32
|
+
barHeight: r(20),
|
|
33
|
+
foldSize: r(3),
|
|
34
|
+
});
|
|
35
|
+
const palette = paletteFor(tone, c);
|
|
36
|
+
const accessibleName = normalizeNonBlankText(accessibilityLabel);
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<View style={[styles.root, style]} testID={testID}>
|
|
40
|
+
{children}
|
|
41
|
+
<View
|
|
42
|
+
pointerEvents="none"
|
|
43
|
+
style={layout.overlay}
|
|
44
|
+
testID={childTestID(testID, 'overlay')}
|
|
45
|
+
>
|
|
46
|
+
<View
|
|
47
|
+
{...A11Y_HIDDEN_PROPS}
|
|
48
|
+
style={styles.visual}
|
|
49
|
+
testID={childTestID(testID, 'visual')}
|
|
50
|
+
>
|
|
51
|
+
<View
|
|
52
|
+
style={[styles.bar, layout.bar, { backgroundColor: palette.bg }]}
|
|
53
|
+
testID={childTestID(testID, 'bar')}
|
|
54
|
+
>
|
|
55
|
+
<Text
|
|
56
|
+
style={[
|
|
57
|
+
styles.text,
|
|
58
|
+
{
|
|
59
|
+
color: palette.fg,
|
|
60
|
+
fontSize: scaleFontMetric(t.micro, fontScale),
|
|
61
|
+
},
|
|
62
|
+
]}
|
|
63
|
+
>
|
|
64
|
+
{label}
|
|
65
|
+
</Text>
|
|
66
|
+
</View>
|
|
67
|
+
<View
|
|
68
|
+
style={[
|
|
69
|
+
styles.fold,
|
|
70
|
+
layout.fold,
|
|
71
|
+
{
|
|
72
|
+
borderTopColor: palette.fold,
|
|
73
|
+
borderLeftColor: palette.fold,
|
|
74
|
+
},
|
|
75
|
+
]}
|
|
76
|
+
testID={childTestID(testID, 'fold')}
|
|
77
|
+
/>
|
|
78
|
+
</View>
|
|
79
|
+
{accessibleName === undefined ? null : (
|
|
80
|
+
<Text
|
|
81
|
+
accessible
|
|
82
|
+
accessibilityLabel={accessibleName}
|
|
83
|
+
style={A11Y_TEXT_ONLY_STYLE}
|
|
84
|
+
testID={childTestID(testID, 'accessibility-label')}
|
|
85
|
+
>
|
|
86
|
+
{accessibleName}
|
|
87
|
+
</Text>
|
|
88
|
+
)}
|
|
89
|
+
</View>
|
|
90
|
+
</View>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type ResolvedRibbonLayout = {
|
|
2
|
+
overlay: {
|
|
3
|
+
position: 'absolute';
|
|
4
|
+
top: number;
|
|
5
|
+
right: number;
|
|
6
|
+
zIndex: number;
|
|
7
|
+
alignItems: 'flex-end';
|
|
8
|
+
};
|
|
9
|
+
bar: { height: number };
|
|
10
|
+
fold: { width: 0; height: 0; borderWidth: number };
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function resolveRibbonLayout({
|
|
14
|
+
top,
|
|
15
|
+
barHeight,
|
|
16
|
+
foldSize,
|
|
17
|
+
}: {
|
|
18
|
+
top: number;
|
|
19
|
+
barHeight: number;
|
|
20
|
+
foldSize: number;
|
|
21
|
+
}): ResolvedRibbonLayout {
|
|
22
|
+
return {
|
|
23
|
+
overlay: {
|
|
24
|
+
position: 'absolute',
|
|
25
|
+
top,
|
|
26
|
+
right: 0,
|
|
27
|
+
zIndex: 1,
|
|
28
|
+
alignItems: 'flex-end',
|
|
29
|
+
},
|
|
30
|
+
bar: { height: barHeight },
|
|
31
|
+
fold: { width: 0, height: 0, borderWidth: foldSize },
|
|
32
|
+
};
|
|
33
|
+
}
|