@bacon-pos/ui 0.8.0 → 0.9.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 (45) hide show
  1. package/lib/commonjs/components/Icon/icons.generated.js +1 -0
  2. package/lib/commonjs/components/Icon/icons.generated.js.map +1 -1
  3. package/lib/commonjs/components/ProgressBar/ProgressBar.js +114 -0
  4. package/lib/commonjs/components/ProgressBar/ProgressBar.js.map +1 -0
  5. package/lib/commonjs/components/ProgressBar/ProgressBar.stories.js +93 -0
  6. package/lib/commonjs/components/ProgressBar/ProgressBar.stories.js.map +1 -0
  7. package/lib/commonjs/components/ProgressBar/ProgressBar.test.js +70 -0
  8. package/lib/commonjs/components/ProgressBar/ProgressBar.test.js.map +1 -0
  9. package/lib/commonjs/components/ProgressBar/index.js +13 -0
  10. package/lib/commonjs/components/ProgressBar/index.js.map +1 -0
  11. package/lib/commonjs/components/index.js +20 -9
  12. package/lib/commonjs/components/index.js.map +1 -1
  13. package/lib/module/components/Icon/icons.generated.js +1 -0
  14. package/lib/module/components/Icon/icons.generated.js.map +1 -1
  15. package/lib/module/components/ProgressBar/ProgressBar.js +110 -0
  16. package/lib/module/components/ProgressBar/ProgressBar.js.map +1 -0
  17. package/lib/module/components/ProgressBar/ProgressBar.stories.js +89 -0
  18. package/lib/module/components/ProgressBar/ProgressBar.stories.js.map +1 -0
  19. package/lib/module/components/ProgressBar/ProgressBar.test.js +70 -0
  20. package/lib/module/components/ProgressBar/ProgressBar.test.js.map +1 -0
  21. package/lib/module/components/ProgressBar/index.js +4 -0
  22. package/lib/module/components/ProgressBar/index.js.map +1 -0
  23. package/lib/module/components/index.js +1 -0
  24. package/lib/module/components/index.js.map +1 -1
  25. package/lib/typescript/commonjs/components/Icon/icons.generated.d.ts +1 -0
  26. package/lib/typescript/commonjs/components/Icon/icons.generated.d.ts.map +1 -1
  27. package/lib/typescript/commonjs/components/ProgressBar/ProgressBar.d.ts +37 -0
  28. package/lib/typescript/commonjs/components/ProgressBar/ProgressBar.d.ts.map +1 -0
  29. package/lib/typescript/commonjs/components/ProgressBar/index.d.ts +3 -0
  30. package/lib/typescript/commonjs/components/ProgressBar/index.d.ts.map +1 -0
  31. package/lib/typescript/commonjs/components/index.d.ts +1 -0
  32. package/lib/typescript/commonjs/components/index.d.ts.map +1 -1
  33. package/lib/typescript/module/components/Icon/icons.generated.d.ts +1 -0
  34. package/lib/typescript/module/components/Icon/icons.generated.d.ts.map +1 -1
  35. package/lib/typescript/module/components/ProgressBar/ProgressBar.d.ts +37 -0
  36. package/lib/typescript/module/components/ProgressBar/ProgressBar.d.ts.map +1 -0
  37. package/lib/typescript/module/components/ProgressBar/index.d.ts +3 -0
  38. package/lib/typescript/module/components/ProgressBar/index.d.ts.map +1 -0
  39. package/lib/typescript/module/components/index.d.ts +1 -0
  40. package/lib/typescript/module/components/index.d.ts.map +1 -1
  41. package/package.json +1 -1
  42. package/src/components/Icon/icons.generated.ts +1 -0
  43. package/src/components/ProgressBar/ProgressBar.tsx +135 -0
  44. package/src/components/ProgressBar/index.ts +2 -0
  45. package/src/components/index.ts +1 -0
@@ -0,0 +1,135 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { Animated, Easing, View, type StyleProp, type ViewStyle } from 'react-native';
3
+ import { useTheme } from '../../theme';
4
+ import { Text } from '../Text/Text';
5
+
6
+ export interface ProgressBarProps {
7
+ /** Progress from 0 to 1. Drive it from whatever is loading (e.g. a download). */
8
+ progress: number;
9
+ /** Left-side label. Defaults to "Downloading...". */
10
+ label?: string;
11
+ /** Show the label + percentage row under the bar. Defaults to true. */
12
+ showSupporting?: boolean;
13
+ /** Show the percentage on the right. Defaults to true. */
14
+ showValue?: boolean;
15
+ /** Format the right-side value. Defaults to `47%`. */
16
+ formatValue?: (progress: number) => string;
17
+ /** Bar height. Defaults to 32 (Figma). */
18
+ height?: number;
19
+ /** Fixed width. Omit to fill the parent. */
20
+ width?: number;
21
+ /** Fill color. Defaults to `action.primary` (lime). */
22
+ color?: string;
23
+ /** Track background. Defaults to `background.subtle`. */
24
+ trackColor?: string;
25
+ /** Track border color. Defaults to `border.default`. */
26
+ borderColor?: string;
27
+ /** Animate width changes. Defaults to true. */
28
+ animated?: boolean;
29
+ /** Override the container style. */
30
+ style?: StyleProp<ViewStyle>;
31
+ /** Accessibility label. Defaults to `label`. */
32
+ accessibilityLabel?: string;
33
+ }
34
+
35
+ const clamp01 = (n: number) => (n < 0 ? 0 : n > 1 ? 1 : n);
36
+
37
+ /**
38
+ * Determinate progress bar — the Figma "Loader". Drive it with a `progress`
39
+ * (0–1) prop from whatever is loading; the fill animates to match. A supporting
40
+ * row underneath shows a customizable `label` (default "Downloading...") on the
41
+ * left and the percentage on the right. Colors, height and width are tokens/props.
42
+ */
43
+ export function ProgressBar({
44
+ progress,
45
+ label = 'Downloading...',
46
+ showSupporting = true,
47
+ showValue = true,
48
+ formatValue,
49
+ height = 32,
50
+ width,
51
+ color,
52
+ trackColor,
53
+ borderColor,
54
+ animated = true,
55
+ style,
56
+ accessibilityLabel,
57
+ }: ProgressBarProps) {
58
+ const theme = useTheme();
59
+ const value = clamp01(progress);
60
+ const percent = Math.round(value * 100);
61
+
62
+ const anim = useRef(new Animated.Value(value)).current;
63
+ useEffect(() => {
64
+ if (animated) {
65
+ Animated.timing(anim, {
66
+ toValue: value,
67
+ duration: 240,
68
+ easing: Easing.out(Easing.ease),
69
+ useNativeDriver: false, // width can't use the native driver
70
+ }).start();
71
+ } else {
72
+ anim.setValue(value);
73
+ }
74
+ }, [value, animated, anim]);
75
+
76
+ const fillWidth = anim.interpolate({
77
+ inputRange: [0, 1],
78
+ outputRange: ['0%', '100%'],
79
+ extrapolate: 'clamp',
80
+ });
81
+
82
+ const inset = 2.5;
83
+
84
+ return (
85
+ <View
86
+ style={[{ gap: 12, width: width ?? undefined, alignSelf: width != null ? 'flex-start' : 'stretch' }, style]}
87
+ accessibilityRole="progressbar"
88
+ accessibilityLabel={accessibilityLabel ?? label}
89
+ accessibilityValue={{ min: 0, max: 100, now: percent }}
90
+ >
91
+ <View
92
+ style={{
93
+ height,
94
+ borderRadius: height / 2,
95
+ borderWidth: 1.5,
96
+ borderColor: borderColor ?? theme.colors.border.default,
97
+ backgroundColor: trackColor ?? theme.colors.background.subtle,
98
+ padding: inset,
99
+ justifyContent: 'center',
100
+ overflow: 'hidden',
101
+ }}
102
+ >
103
+ <Animated.View
104
+ style={{
105
+ width: fillWidth,
106
+ height: '100%',
107
+ borderRadius: height / 2,
108
+ backgroundColor: color ?? theme.colors.action.primary,
109
+ }}
110
+ />
111
+ </View>
112
+
113
+ {showSupporting ? (
114
+ <View
115
+ style={{
116
+ flexDirection: 'row',
117
+ alignItems: 'center',
118
+ justifyContent: 'space-between',
119
+ paddingHorizontal: 8,
120
+ gap: 8,
121
+ }}
122
+ >
123
+ <Text variant="bodyLarge" color="secondary" numberOfLines={1} style={{ flexShrink: 1 }}>
124
+ {label}
125
+ </Text>
126
+ {showValue ? (
127
+ <Text variant="bodyLarge" color="secondary" numberOfLines={1}>
128
+ {formatValue ? formatValue(value) : `${percent}%`}
129
+ </Text>
130
+ ) : null}
131
+ </View>
132
+ ) : null}
133
+ </View>
134
+ );
135
+ }
@@ -0,0 +1,2 @@
1
+ export { ProgressBar } from './ProgressBar';
2
+ export type { ProgressBarProps } from './ProgressBar';
@@ -16,6 +16,7 @@ export * from './Keypad';
16
16
  export * from './LinkButton';
17
17
  export * from './Menu';
18
18
  export * from './ProductCard';
19
+ export * from './ProgressBar';
19
20
  export * from './QuantityStepper';
20
21
  export * from './Radio';
21
22
  export * from './Select';