@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.
Files changed (75) hide show
  1. package/README.md +3 -3
  2. package/lib/module/components/ui/CircularProgress/CircularProgress.js +108 -0
  3. package/lib/module/components/ui/CircularProgress/CircularProgress.js.map +1 -0
  4. package/lib/module/components/ui/CircularProgress/index.js +4 -0
  5. package/lib/module/components/ui/CircularProgress/index.js.map +1 -0
  6. package/lib/module/components/ui/CircularProgress/normalizeCircularProgress.js +42 -0
  7. package/lib/module/components/ui/CircularProgress/normalizeCircularProgress.js.map +1 -0
  8. package/lib/module/components/ui/CircularProgress/types.js +4 -0
  9. package/lib/module/components/ui/CircularProgress/types.js.map +1 -0
  10. package/lib/module/components/ui/Ribbon/Ribbon.js +70 -0
  11. package/lib/module/components/ui/Ribbon/Ribbon.js.map +1 -0
  12. package/lib/module/components/ui/Ribbon/index.js +4 -0
  13. package/lib/module/components/ui/Ribbon/index.js.map +1 -0
  14. package/lib/module/components/ui/Ribbon/layout.js +26 -0
  15. package/lib/module/components/ui/Ribbon/layout.js.map +1 -0
  16. package/lib/module/components/ui/Ribbon/styles.js +44 -0
  17. package/lib/module/components/ui/Ribbon/styles.js.map +1 -0
  18. package/lib/module/components/ui/Ribbon/types.js +4 -0
  19. package/lib/module/components/ui/Ribbon/types.js.map +1 -0
  20. package/lib/module/components/ui/Stepper/Stepper.js +12 -2
  21. package/lib/module/components/ui/Stepper/Stepper.js.map +1 -1
  22. package/lib/module/components/ui/Stepper/displayValue.js +6 -0
  23. package/lib/module/components/ui/Stepper/displayValue.js.map +1 -0
  24. package/lib/module/components/ui/Stepper/layout.js +19 -1
  25. package/lib/module/components/ui/Stepper/layout.js.map +1 -1
  26. package/lib/module/components/ui/Stepper/styles.js +9 -1
  27. package/lib/module/components/ui/Stepper/styles.js.map +1 -1
  28. package/lib/module/components/ui/index.js +2 -0
  29. package/lib/module/components/ui/index.js.map +1 -1
  30. package/lib/typescript/src/components/ui/CircularProgress/CircularProgress.d.ts +3 -0
  31. package/lib/typescript/src/components/ui/CircularProgress/CircularProgress.d.ts.map +1 -0
  32. package/lib/typescript/src/components/ui/CircularProgress/index.d.ts +3 -0
  33. package/lib/typescript/src/components/ui/CircularProgress/index.d.ts.map +1 -0
  34. package/lib/typescript/src/components/ui/CircularProgress/normalizeCircularProgress.d.ts +15 -0
  35. package/lib/typescript/src/components/ui/CircularProgress/normalizeCircularProgress.d.ts.map +1 -0
  36. package/lib/typescript/src/components/ui/CircularProgress/types.d.ts +24 -0
  37. package/lib/typescript/src/components/ui/CircularProgress/types.d.ts.map +1 -0
  38. package/lib/typescript/src/components/ui/Ribbon/Ribbon.d.ts +4 -0
  39. package/lib/typescript/src/components/ui/Ribbon/Ribbon.d.ts.map +1 -0
  40. package/lib/typescript/src/components/ui/Ribbon/index.d.ts +3 -0
  41. package/lib/typescript/src/components/ui/Ribbon/index.d.ts.map +1 -0
  42. package/lib/typescript/src/components/ui/Ribbon/layout.d.ts +23 -0
  43. package/lib/typescript/src/components/ui/Ribbon/layout.d.ts.map +1 -0
  44. package/lib/typescript/src/components/ui/Ribbon/styles.d.ts +31 -0
  45. package/lib/typescript/src/components/ui/Ribbon/styles.d.ts.map +1 -0
  46. package/lib/typescript/src/components/ui/Ribbon/types.d.ts +18 -0
  47. package/lib/typescript/src/components/ui/Ribbon/types.d.ts.map +1 -0
  48. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts +1 -1
  49. package/lib/typescript/src/components/ui/Stepper/Stepper.d.ts.map +1 -1
  50. package/lib/typescript/src/components/ui/Stepper/displayValue.d.ts +2 -0
  51. package/lib/typescript/src/components/ui/Stepper/displayValue.d.ts.map +1 -0
  52. package/lib/typescript/src/components/ui/Stepper/layout.d.ts +2 -0
  53. package/lib/typescript/src/components/ui/Stepper/layout.d.ts.map +1 -1
  54. package/lib/typescript/src/components/ui/Stepper/styles.d.ts +2 -1
  55. package/lib/typescript/src/components/ui/Stepper/styles.d.ts.map +1 -1
  56. package/lib/typescript/src/components/ui/Stepper/types.d.ts +4 -2
  57. package/lib/typescript/src/components/ui/Stepper/types.d.ts.map +1 -1
  58. package/lib/typescript/src/components/ui/index.d.ts +4 -0
  59. package/lib/typescript/src/components/ui/index.d.ts.map +1 -1
  60. package/package.json +1 -1
  61. package/src/components/ui/CircularProgress/CircularProgress.tsx +111 -0
  62. package/src/components/ui/CircularProgress/index.ts +2 -0
  63. package/src/components/ui/CircularProgress/normalizeCircularProgress.ts +64 -0
  64. package/src/components/ui/CircularProgress/types.ts +24 -0
  65. package/src/components/ui/Ribbon/Ribbon.tsx +92 -0
  66. package/src/components/ui/Ribbon/index.ts +2 -0
  67. package/src/components/ui/Ribbon/layout.ts +33 -0
  68. package/src/components/ui/Ribbon/styles.ts +33 -0
  69. package/src/components/ui/Ribbon/types.ts +19 -0
  70. package/src/components/ui/Stepper/Stepper.tsx +15 -3
  71. package/src/components/ui/Stepper/displayValue.ts +6 -0
  72. package/src/components/ui/Stepper/layout.ts +28 -9
  73. package/src/components/ui/Stepper/styles.ts +4 -1
  74. package/src/components/ui/Stepper/types.ts +4 -2
  75. 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,4 @@
1
+ import React from 'react';
2
+ import type { RibbonProps } from './types';
3
+ export declare function Ribbon({ label, tone, children, accessibilityLabel, style, testID, }: RibbonProps): React.JSX.Element;
4
+ //# sourceMappingURL=Ribbon.d.ts.map
@@ -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,3 @@
1
+ export { Ribbon } from './Ribbon';
2
+ export type { RibbonProps, RibbonTone } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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;AAiBzC,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,QAAgB,EAChB,MAAM,GACP,EAAE,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAwKlC"}
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,2 @@
1
+ export declare function resolveStepperDisplayValue(value: number, formatValue?: (value: number) => string): number | string;
2
+ //# sourceMappingURL=displayValue.d.ts.map
@@ -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"}
@@ -18,5 +18,7 @@ export declare function resolveStepperLayout({ h, btn, w, }: {
18
18
  h: number;
19
19
  btn: number;
20
20
  w: number;
21
+ }, options?: {
22
+ compact?: boolean;
21
23
  }): ResolvedStepperLayout;
22
24
  //# sourceMappingURL=layout.d.ts.map
@@ -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,CAAC,EACnC,CAAC,EACD,GAAG,EACH,CAAC,GACF,EAAE;IACD,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;CACX,GAAG,qBAAqB,CAmBxB"}
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 尺寸推导:sm(control.sm=`r(28)` 高 / `r(28)` 按钮 / r(40) 值宽 / xs 字)/
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;;6CAE6C;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,CAOA"}
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,mCAAmC;AACnC,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtC,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,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACpC,YAAY,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,aAAa,EACb,SAAS,GACV,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EACV,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,IAAI,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,aAAa,GACd,MAAM,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unif/react-native-design",
3
- "version": "0.27.1",
3
+ "version": "0.29.0",
4
4
  "description": "Unif 设计系统:theme + icons + utils + components",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -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,2 @@
1
+ export { CircularProgress } from './CircularProgress';
2
+ export type { CircularProgressProps } from './types';
@@ -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,2 @@
1
+ export { Ribbon } from './Ribbon';
2
+ export type { RibbonProps, RibbonTone } from './types';
@@ -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
+ }