ferns-ui 1.14.0 → 1.16.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/Accordion.js +7 -2
- package/dist/Accordion.js.map +1 -1
- package/dist/Common.d.ts +6 -2
- package/dist/Common.js.map +1 -1
- package/dist/EmailField.js +17 -37
- package/dist/EmailField.js.map +1 -1
- package/dist/Modal.d.ts +1 -1
- package/dist/Modal.js +22 -12
- package/dist/Modal.js.map +1 -1
- package/dist/NumberField.js +8 -2
- package/dist/NumberField.js.map +1 -1
- package/package.json +1 -1
- package/src/Accordion.tsx +7 -1
- package/src/Common.ts +7 -2
- package/src/EmailField.tsx +22 -42
- package/src/Modal.tsx +31 -17
- package/src/NumberField.tsx +8 -2
package/dist/Accordion.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Heading } from "./Heading";
|
|
|
5
5
|
import { InfoModalIcon } from "./InfoModalIcon";
|
|
6
6
|
import { Text } from "./Text";
|
|
7
7
|
import { useTheme } from "./Theme";
|
|
8
|
-
export const Accordion = ({ children, isCollapsed = false, title, subtitle, includeInfoModal = false, infoModalChildren, infoModalSubtitle, infoModalText, infoModalTitle, }) => {
|
|
8
|
+
export const Accordion = ({ children, isCollapsed = false, title, subtitle, includeInfoModal = false, infoModalChildren, infoModalSubtitle, infoModalText, infoModalTitle, onToggle, }) => {
|
|
9
9
|
const { theme } = useTheme();
|
|
10
10
|
const [collapsed, setCollapsed] = useState(false);
|
|
11
11
|
// The external collapse state should override the internal collapse state.
|
|
@@ -27,7 +27,12 @@ export const Accordion = ({ children, isCollapsed = false, title, subtitle, incl
|
|
|
27
27
|
includeInfoModal && infoModalTitle && (React.createElement(InfoModalIcon, { infoModalChildren: infoModalChildren, infoModalSubtitle: infoModalSubtitle, infoModalText: infoModalText, infoModalTitle: infoModalTitle }))),
|
|
28
28
|
subtitle && React.createElement(Text, null, subtitle)),
|
|
29
29
|
React.createElement(View, null,
|
|
30
|
-
React.createElement(Pressable, { "aria-role": "button", hitSlop: { top: 20, bottom: 20, left: 20, right: 20 }, testID: "accordion-toggle", onPress: () =>
|
|
30
|
+
React.createElement(Pressable, { "aria-role": "button", hitSlop: { top: 20, bottom: 20, left: 20, right: 20 }, testID: "accordion-toggle", onPress: () => {
|
|
31
|
+
setCollapsed(!collapsed);
|
|
32
|
+
if (onToggle) {
|
|
33
|
+
onToggle(!collapsed);
|
|
34
|
+
}
|
|
35
|
+
} },
|
|
31
36
|
React.createElement(FontAwesome6, { color: theme.text.link, name: collapsed ? "chevron-down" : "chevron-up", selectable: undefined, size: 16 })))),
|
|
32
37
|
collapsed ? null : React.createElement(View, { style: { marginTop: 8 } }, children)));
|
|
33
38
|
};
|
package/dist/Accordion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.js","sourceRoot":"","sources":["../src/Accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAK,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACrD,OAAO,EAAC,SAAS,EAAE,IAAI,EAAC,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,EAC5C,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,KAAK,EACL,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,cAAc,
|
|
1
|
+
{"version":3,"file":"Accordion.js","sourceRoot":"","sources":["../src/Accordion.tsx"],"names":[],"mappings":"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"}
|
package/dist/Common.d.ts
CHANGED
|
@@ -45,6 +45,10 @@ export interface AccordionProps extends InfoModalIconProps {
|
|
|
45
45
|
* The title of the accordion.
|
|
46
46
|
*/
|
|
47
47
|
title: string;
|
|
48
|
+
/**
|
|
49
|
+
* * Callback fired when the accordion is toggled.
|
|
50
|
+
* */
|
|
51
|
+
onToggle?: (isCollapse: boolean) => void;
|
|
48
52
|
}
|
|
49
53
|
export interface BaseProfile {
|
|
50
54
|
email: string;
|
|
@@ -316,11 +320,11 @@ export type TextFieldType = "date" | "datetime" | "decimal" | "decimalRange" | "
|
|
|
316
320
|
export type IconSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
|
|
317
321
|
export declare const iconSizeToNumber: (size?: IconSize) => number;
|
|
318
322
|
export type TextSize = "sm" | "md" | "lg" | "xl" | "2xl";
|
|
319
|
-
export
|
|
323
|
+
export interface ValueMappingItem {
|
|
320
324
|
value: number;
|
|
321
325
|
label: string;
|
|
322
326
|
size?: IconSize;
|
|
323
|
-
}
|
|
327
|
+
}
|
|
324
328
|
export type IconPrefix = "far" | "fas";
|
|
325
329
|
export interface LayerProps {
|
|
326
330
|
children: ReactChildren;
|
package/dist/Common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Common.js","sourceRoot":"","sources":["../src/Common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Common.js","sourceRoot":"","sources":["../src/Common.ts"],"names":[],"mappings":"AAoXA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,CAAC;IACJ,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;CACP,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,WAAW,CAAC,OAAyB,CAAC,CAAC;AAChD,CAAC;AAqBD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAe,EAAE,EAAE;IAClD,OAAO;QACL,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,EAAE;KACV,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAClB,CAAC,CAAC;AA+RF,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,GAAG;IACZ,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/EmailField.js
CHANGED
|
@@ -14,7 +14,10 @@ import { TextField } from "./TextField";
|
|
|
14
14
|
export const EmailField = (_a) => {
|
|
15
15
|
var { errorText, iconName, placeholder, value, onChange, onBlur } = _a, rest = __rest(_a, ["errorText", "iconName", "placeholder", "value", "onChange", "onBlur"]);
|
|
16
16
|
const [localValue, setLocalValue] = useState(value || "");
|
|
17
|
-
|
|
17
|
+
// Sync local state with incoming prop values
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
setLocalValue(value || "");
|
|
20
|
+
}, [value]);
|
|
18
21
|
const validateEmail = useCallback((email) => {
|
|
19
22
|
if (email.trim() === "") {
|
|
20
23
|
return undefined;
|
|
@@ -25,43 +28,20 @@ export const EmailField = (_a) => {
|
|
|
25
28
|
}
|
|
26
29
|
return undefined;
|
|
27
30
|
}, []);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
setError(undefined);
|
|
31
|
+
const localOnChange = useCallback((e) => {
|
|
32
|
+
setLocalValue(e);
|
|
33
|
+
const err = validateEmail(e);
|
|
34
|
+
if (!err && onChange) {
|
|
35
|
+
onChange(e);
|
|
36
|
+
}
|
|
37
|
+
}, [onChange, validateEmail, setLocalValue]);
|
|
38
|
+
const localOnBlur = useCallback((e) => {
|
|
39
|
+
setLocalValue(e);
|
|
40
|
+
const err = validateEmail(e);
|
|
41
|
+
if (!err && onBlur) {
|
|
42
|
+
onBlur(e);
|
|
43
43
|
}
|
|
44
44
|
}, [onBlur, validateEmail]);
|
|
45
|
-
|
|
46
|
-
setLocalValue(email);
|
|
47
|
-
const validationError = validateEmail(email);
|
|
48
|
-
if (error && !validationError) {
|
|
49
|
-
setError(undefined);
|
|
50
|
-
}
|
|
51
|
-
if (!validationError) {
|
|
52
|
-
onChange(email);
|
|
53
|
-
}
|
|
54
|
-
}, [onChange, error, validateEmail]);
|
|
55
|
-
return (React.createElement(TextField, Object.assign({ errorText: error, iconName: iconName, placeholder: placeholder, type: "email", value: localValue, onBlur: (e) => {
|
|
56
|
-
handleBlur(e);
|
|
57
|
-
if (onBlur) {
|
|
58
|
-
onBlur(value || "");
|
|
59
|
-
}
|
|
60
|
-
}, onChange: (e) => {
|
|
61
|
-
handleChange(e);
|
|
62
|
-
if (onChange) {
|
|
63
|
-
onChange;
|
|
64
|
-
}
|
|
65
|
-
} }, rest)));
|
|
45
|
+
return (React.createElement(TextField, Object.assign({ errorText: errorText || validateEmail(localValue), iconName: iconName, placeholder: placeholder, type: "email", value: localValue, onBlur: localOnBlur, onChange: localOnChange }, rest)));
|
|
66
46
|
};
|
|
67
47
|
//# sourceMappingURL=EmailField.js.map
|
package/dist/EmailField.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailField.js","sourceRoot":"","sources":["../src/EmailField.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAQ/C,EAAE,EAAE;QAR2C,EAC9C,SAAS,EACT,QAAQ,EACR,WAAW,EACX,KAAK,EACL,QAAQ,EACR,MAAM,OAEP,EADI,IAAI,cAPuC,uEAQ/C,CADQ;IAEP,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,KAAK,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"EmailField.js","sourceRoot":"","sources":["../src/EmailField.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAwB,CAAC,EAQ/C,EAAE,EAAE;QAR2C,EAC9C,SAAS,EACT,QAAQ,EACR,WAAW,EACX,KAAK,EACL,QAAQ,EACR,MAAM,OAEP,EADI,IAAI,cAPuC,uEAQ/C,CADQ;IAEP,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,KAAK,IAAI,EAAE,CAAC,CAAC;IAElE,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,KAAa,EAAsB,EAAE;QACtE,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,UAAU,GAAG,4BAA4B,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,8BAA8B,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAS,EAAE,EAAE;QACZ,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC;YACrB,QAAQ,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CACzC,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,CAAS,EAAE,EAAE;QACZ,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,aAAa,CAAC,CACxB,CAAC;IACF,OAAO,CACL,oBAAC,SAAS,kBACR,SAAS,EAAE,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC,EACjD,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,aAAa,IACnB,IAAI,EACR,CACH,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/Modal.d.ts
CHANGED
package/dist/Modal.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React, { useEffect, useRef } from "react";
|
|
2
2
|
import { Dimensions, Pressable, Modal as RNModal, View } from "react-native";
|
|
3
3
|
import ActionSheet from "react-native-actions-sheet";
|
|
4
|
-
import {
|
|
4
|
+
import { Gesture, GestureDetector } from "react-native-gesture-handler";
|
|
5
|
+
import { runOnJS } from "react-native-reanimated";
|
|
5
6
|
import { Button } from "./Button";
|
|
6
7
|
import { Heading } from "./Heading";
|
|
7
8
|
import { Icon } from "./Icon";
|
|
@@ -47,7 +48,11 @@ const ModalContent = ({ children, title, subtitle, text, primaryButtonText, prim
|
|
|
47
48
|
React.createElement(Text, { size: "lg" }, subtitle))),
|
|
48
49
|
text && (React.createElement(View, { accessibilityHint: "Modal body text", "aria-label": text, "aria-role": "text", style: { marginVertical: text ? 12 : 0, alignSelf: "flex-start" } },
|
|
49
50
|
React.createElement(Text, null, text))),
|
|
50
|
-
children && (React.createElement(View, { style: {
|
|
51
|
+
children && (React.createElement(View, { style: {
|
|
52
|
+
marginTop: text ? 0 : 12,
|
|
53
|
+
width: "100%",
|
|
54
|
+
flex: isMobile ? undefined : 1,
|
|
55
|
+
} }, children)),
|
|
51
56
|
React.createElement(View, { style: {
|
|
52
57
|
marginTop: text && !children ? 20 : 32,
|
|
53
58
|
flexDirection: "row",
|
|
@@ -75,11 +80,12 @@ export const Modal = ({ children, persistOnBackgroundClick = false, primaryButto
|
|
|
75
80
|
return secondaryButtonOnClick(value);
|
|
76
81
|
}
|
|
77
82
|
};
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
handleDismiss
|
|
83
|
+
const dragToClose = Gesture.Pan().onEnd((event) => {
|
|
84
|
+
if (event.translationY > 20) {
|
|
85
|
+
// Gesture callbacks run on the UI thread, runOnJS is required to safely invoke handleDismiss on the JS thread
|
|
86
|
+
runOnJS(handleDismiss)();
|
|
81
87
|
}
|
|
82
|
-
};
|
|
88
|
+
});
|
|
83
89
|
// Open the action sheet ref when the visible prop changes.
|
|
84
90
|
useEffect(() => {
|
|
85
91
|
if (actionSheetRef.current) {
|
|
@@ -104,10 +110,14 @@ export const Modal = ({ children, persistOnBackgroundClick = false, primaryButto
|
|
|
104
110
|
isMobile,
|
|
105
111
|
};
|
|
106
112
|
if (isMobile) {
|
|
107
|
-
return (React.createElement(ActionSheet, { ref: actionSheetRef,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
return (React.createElement(ActionSheet, { ref: actionSheetRef, closeOnTouchBackdrop: !persistOnBackgroundClick,
|
|
114
|
+
// Disable ActionSheet's built-in gestures to avoid conflicts with scrolling
|
|
115
|
+
gestureEnabled: false, onClose: handleDismiss },
|
|
116
|
+
React.createElement(View, null,
|
|
117
|
+
React.createElement(GestureDetector, { gesture: dragToClose },
|
|
118
|
+
React.createElement(View, { accessibilityHint: "Pull down to close the modal", "aria-label": "Pull down bar", "aria-role": "adjustable",
|
|
119
|
+
// add hitSlop to make the bar easier to hit since it's small
|
|
120
|
+
hitSlop: { top: 20, bottom: 20, left: 50, right: 50 }, style: {
|
|
111
121
|
justifyContent: "center",
|
|
112
122
|
alignItems: "center",
|
|
113
123
|
alignSelf: "center",
|
|
@@ -117,8 +127,8 @@ export const Modal = ({ children, persistOnBackgroundClick = false, primaryButto
|
|
|
117
127
|
width: "30%",
|
|
118
128
|
height: 3,
|
|
119
129
|
marginTop: 10,
|
|
120
|
-
} }),
|
|
121
|
-
|
|
130
|
+
} })),
|
|
131
|
+
React.createElement(ModalContent, Object.assign({}, modalContentProps), children))));
|
|
122
132
|
}
|
|
123
133
|
else {
|
|
124
134
|
return (React.createElement(RNModal, { animationType: "slide", transparent: true, visible: visible, onRequestClose: handleDismiss },
|
package/dist/Modal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../src/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAK,SAAS,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AACnD,OAAO,EAAC,UAAU,EAAkB,SAAS,EAAE,KAAK,IAAI,OAAO,EAAE,IAAI,EAAC,MAAM,cAAc,CAAC;AAC3F,OAAO,WAA6B,MAAM,4BAA4B,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../src/Modal.tsx"],"names":[],"mappings":"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"}
|
package/dist/NumberField.js
CHANGED
|
@@ -42,12 +42,18 @@ export const NumberField = (_a) => {
|
|
|
42
42
|
const error = errorText || getError(value);
|
|
43
43
|
// Only return the value if it is a valid number
|
|
44
44
|
const localOnChange = useCallback((v) => {
|
|
45
|
-
|
|
45
|
+
if (type === "decimal" && v === ".") {
|
|
46
|
+
// if type is decimal and dot is the first character add 0 before it
|
|
47
|
+
setValue("0.");
|
|
48
|
+
rest.onChange("0.");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
46
51
|
const err = getError(v);
|
|
47
52
|
if (!err) {
|
|
53
|
+
setValue(v);
|
|
48
54
|
rest.onChange(v);
|
|
49
55
|
}
|
|
50
|
-
}, [getError, rest]);
|
|
56
|
+
}, [getError, rest, type]);
|
|
51
57
|
return React.createElement(TextField, Object.assign({}, rest, { errorText: error, value: value, onChange: localOnChange }));
|
|
52
58
|
};
|
|
53
59
|
//# sourceMappingURL=NumberField.js.map
|
package/dist/NumberField.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.js","sourceRoot":"","sources":["../src/NumberField.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,EAO/B,EAAE,EAAE;QAP2B,EAChD,SAAS,EACT,KAAK,EAAE,SAAS,EAChB,GAAG,EACH,GAAG,EACH,IAAI,OAEa,EADd,IAAI,cANyC,4CAOjD,CADQ;IAEP,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,CAAC;IAEpD,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAa,EAAE,EAAE;QAChB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YAC3E,OAAO,0BAA0B,CAAC;QACpC,CAAC;aAAM,IACL,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;YACpD,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACjC,CAAC;YACD,OAAO,yBAAyB,CAAC;QACnC,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YAC1C,OAAO,uCAAuC,GAAG,EAAE,CAAC;QACtD,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YAC1C,OAAO,0CAA0C,GAAG,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CACjB,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE3C,gDAAgD;IAChD,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAS,EAAE,EAAE;QACZ,QAAQ,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NumberField.js","sourceRoot":"","sources":["../src/NumberField.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAK,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAGlE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,EAO/B,EAAE,EAAE;QAP2B,EAChD,SAAS,EACT,KAAK,EAAE,SAAS,EAChB,GAAG,EACH,GAAG,EACH,IAAI,OAEa,EADd,IAAI,cANyC,4CAOjD,CADQ;IAEP,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,CAAC;IAEpD,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAa,EAAE,EAAE;QAChB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YAC3E,OAAO,0BAA0B,CAAC;QACpC,CAAC;aAAM,IACL,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;YACpD,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EACjC,CAAC;YACD,OAAO,yBAAyB,CAAC;QACnC,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YAC1C,OAAO,uCAAuC,GAAG,EAAE,CAAC;QACtD,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YAC1C,OAAO,0CAA0C,GAAG,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CACjB,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE3C,gDAAgD;IAChD,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAS,EAAE,EAAE;QACZ,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,oEAAoE;YACpE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CACvB,CAAC;IAEF,OAAO,oBAAC,SAAS,oBAAK,IAAI,IAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,IAAI,CAAC;AAC1F,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/Accordion.tsx
CHANGED
|
@@ -18,6 +18,7 @@ export const Accordion: FC<AccordionProps> = ({
|
|
|
18
18
|
infoModalSubtitle,
|
|
19
19
|
infoModalText,
|
|
20
20
|
infoModalTitle,
|
|
21
|
+
onToggle,
|
|
21
22
|
}) => {
|
|
22
23
|
const {theme} = useTheme();
|
|
23
24
|
const [collapsed, setCollapsed] = useState(false);
|
|
@@ -58,7 +59,12 @@ export const Accordion: FC<AccordionProps> = ({
|
|
|
58
59
|
aria-role="button"
|
|
59
60
|
hitSlop={{top: 20, bottom: 20, left: 20, right: 20}}
|
|
60
61
|
testID="accordion-toggle"
|
|
61
|
-
onPress={() =>
|
|
62
|
+
onPress={() => {
|
|
63
|
+
setCollapsed(!collapsed);
|
|
64
|
+
if (onToggle) {
|
|
65
|
+
onToggle(!collapsed);
|
|
66
|
+
}
|
|
67
|
+
}}
|
|
62
68
|
>
|
|
63
69
|
<FontAwesome6
|
|
64
70
|
color={theme.text.link}
|
package/src/Common.ts
CHANGED
|
@@ -64,6 +64,11 @@ export interface AccordionProps extends InfoModalIconProps {
|
|
|
64
64
|
* The title of the accordion.
|
|
65
65
|
*/
|
|
66
66
|
title: string;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* * Callback fired when the accordion is toggled.
|
|
70
|
+
* */
|
|
71
|
+
onToggle?: (isCollapse: boolean) => void;
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
export interface BaseProfile {
|
|
@@ -420,11 +425,11 @@ export const iconSizeToNumber = (size?: IconSize) => {
|
|
|
420
425
|
|
|
421
426
|
export type TextSize = "sm" | "md" | "lg" | "xl" | "2xl";
|
|
422
427
|
|
|
423
|
-
export
|
|
428
|
+
export interface ValueMappingItem {
|
|
424
429
|
value: number;
|
|
425
430
|
label: string;
|
|
426
431
|
size?: IconSize;
|
|
427
|
-
}
|
|
432
|
+
}
|
|
428
433
|
|
|
429
434
|
export type IconPrefix = "far" | "fas";
|
|
430
435
|
|
package/src/EmailField.tsx
CHANGED
|
@@ -13,7 +13,11 @@ export const EmailField: FC<EmailFieldProps> = ({
|
|
|
13
13
|
...rest
|
|
14
14
|
}) => {
|
|
15
15
|
const [localValue, setLocalValue] = useState<string>(value || "");
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
// Sync local state with incoming prop values
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
setLocalValue(value || "");
|
|
20
|
+
}, [value]);
|
|
17
21
|
|
|
18
22
|
const validateEmail = useCallback((email: string): string | undefined => {
|
|
19
23
|
if (email.trim() === "") {
|
|
@@ -26,60 +30,36 @@ export const EmailField: FC<EmailFieldProps> = ({
|
|
|
26
30
|
return undefined;
|
|
27
31
|
}, []);
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const handleBlur = useCallback(
|
|
36
|
-
(email: string) => {
|
|
37
|
-
if (onBlur) {
|
|
38
|
-
onBlur(email);
|
|
39
|
-
}
|
|
40
|
-
const validationError = validateEmail(email);
|
|
41
|
-
if (validationError) {
|
|
42
|
-
setError(validationError);
|
|
43
|
-
} else {
|
|
44
|
-
setError(undefined);
|
|
33
|
+
const localOnChange = useCallback(
|
|
34
|
+
(e: string) => {
|
|
35
|
+
setLocalValue(e);
|
|
36
|
+
const err = validateEmail(e);
|
|
37
|
+
if (!err && onChange) {
|
|
38
|
+
onChange(e);
|
|
45
39
|
}
|
|
46
40
|
},
|
|
47
|
-
[
|
|
41
|
+
[onChange, validateEmail, setLocalValue]
|
|
48
42
|
);
|
|
49
43
|
|
|
50
|
-
const
|
|
51
|
-
(
|
|
52
|
-
setLocalValue(
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
if (!validationError) {
|
|
58
|
-
onChange(email);
|
|
44
|
+
const localOnBlur = useCallback(
|
|
45
|
+
(e: string) => {
|
|
46
|
+
setLocalValue(e);
|
|
47
|
+
const err = validateEmail(e);
|
|
48
|
+
if (!err && onBlur) {
|
|
49
|
+
onBlur(e);
|
|
59
50
|
}
|
|
60
51
|
},
|
|
61
|
-
[
|
|
52
|
+
[onBlur, validateEmail]
|
|
62
53
|
);
|
|
63
|
-
|
|
64
54
|
return (
|
|
65
55
|
<TextField
|
|
66
|
-
errorText={
|
|
56
|
+
errorText={errorText || validateEmail(localValue)}
|
|
67
57
|
iconName={iconName}
|
|
68
58
|
placeholder={placeholder}
|
|
69
59
|
type="email"
|
|
70
60
|
value={localValue}
|
|
71
|
-
onBlur={
|
|
72
|
-
|
|
73
|
-
if (onBlur) {
|
|
74
|
-
onBlur(value || "");
|
|
75
|
-
}
|
|
76
|
-
}}
|
|
77
|
-
onChange={(e) => {
|
|
78
|
-
handleChange(e);
|
|
79
|
-
if (onChange) {
|
|
80
|
-
onChange;
|
|
81
|
-
}
|
|
82
|
-
}}
|
|
61
|
+
onBlur={localOnBlur}
|
|
62
|
+
onChange={localOnChange}
|
|
83
63
|
{...rest}
|
|
84
64
|
/>
|
|
85
65
|
);
|
package/src/Modal.tsx
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import React, {FC, useEffect, useRef} from "react";
|
|
2
2
|
import {Dimensions, DimensionValue, Pressable, Modal as RNModal, View} from "react-native";
|
|
3
3
|
import ActionSheet, {ActionSheetRef} from "react-native-actions-sheet";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
PanGestureHandlerStateChangeEvent,
|
|
7
|
-
State,
|
|
8
|
-
} from "react-native-gesture-handler";
|
|
4
|
+
import {Gesture, GestureDetector} from "react-native-gesture-handler";
|
|
5
|
+
import {runOnJS} from "react-native-reanimated";
|
|
9
6
|
|
|
10
7
|
import {Button} from "./Button";
|
|
11
|
-
import {ModalProps} from "./Common";
|
|
8
|
+
import type {ModalProps} from "./Common";
|
|
12
9
|
import {Heading} from "./Heading";
|
|
13
10
|
import {Icon} from "./Icon";
|
|
14
11
|
import {isMobileDevice} from "./MediaQuery";
|
|
@@ -129,7 +126,13 @@ const ModalContent: FC<{
|
|
|
129
126
|
</View>
|
|
130
127
|
)}
|
|
131
128
|
{children && (
|
|
132
|
-
<View
|
|
129
|
+
<View
|
|
130
|
+
style={{
|
|
131
|
+
marginTop: text ? 0 : 12,
|
|
132
|
+
width: "100%",
|
|
133
|
+
flex: isMobile ? undefined : 1,
|
|
134
|
+
}}
|
|
135
|
+
>
|
|
133
136
|
{children}
|
|
134
137
|
</View>
|
|
135
138
|
)}
|
|
@@ -201,11 +204,12 @@ export const Modal: FC<ModalProps> = ({
|
|
|
201
204
|
}
|
|
202
205
|
};
|
|
203
206
|
|
|
204
|
-
const
|
|
205
|
-
if (
|
|
206
|
-
handleDismiss
|
|
207
|
+
const dragToClose = Gesture.Pan().onEnd((event) => {
|
|
208
|
+
if (event.translationY > 20) {
|
|
209
|
+
// Gesture callbacks run on the UI thread, runOnJS is required to safely invoke handleDismiss on the JS thread
|
|
210
|
+
runOnJS(handleDismiss)();
|
|
207
211
|
}
|
|
208
|
-
};
|
|
212
|
+
});
|
|
209
213
|
|
|
210
214
|
// Open the action sheet ref when the visible prop changes.
|
|
211
215
|
useEffect(() => {
|
|
@@ -235,13 +239,22 @@ export const Modal: FC<ModalProps> = ({
|
|
|
235
239
|
|
|
236
240
|
if (isMobile) {
|
|
237
241
|
return (
|
|
238
|
-
<ActionSheet
|
|
239
|
-
|
|
240
|
-
|
|
242
|
+
<ActionSheet
|
|
243
|
+
ref={actionSheetRef}
|
|
244
|
+
closeOnTouchBackdrop={!persistOnBackgroundClick}
|
|
245
|
+
// Disable ActionSheet's built-in gestures to avoid conflicts with scrolling
|
|
246
|
+
gestureEnabled={false}
|
|
247
|
+
onClose={handleDismiss}
|
|
248
|
+
>
|
|
249
|
+
<View>
|
|
250
|
+
{/* Attach our own swipe-to-dismiss gesture to the top handle */}
|
|
251
|
+
<GestureDetector gesture={dragToClose}>
|
|
241
252
|
<View
|
|
242
253
|
accessibilityHint="Pull down to close the modal"
|
|
243
254
|
aria-label="Pull down bar"
|
|
244
255
|
aria-role="adjustable"
|
|
256
|
+
// add hitSlop to make the bar easier to hit since it's small
|
|
257
|
+
hitSlop={{top: 20, bottom: 20, left: 50, right: 50}}
|
|
245
258
|
style={{
|
|
246
259
|
justifyContent: "center",
|
|
247
260
|
alignItems: "center",
|
|
@@ -254,9 +267,10 @@ export const Modal: FC<ModalProps> = ({
|
|
|
254
267
|
marginTop: 10,
|
|
255
268
|
}}
|
|
256
269
|
/>
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
270
|
+
</GestureDetector>
|
|
271
|
+
|
|
272
|
+
<ModalContent {...modalContentProps}>{children}</ModalContent>
|
|
273
|
+
</View>
|
|
260
274
|
</ActionSheet>
|
|
261
275
|
);
|
|
262
276
|
} else {
|
package/src/NumberField.tsx
CHANGED
|
@@ -47,13 +47,19 @@ export const NumberField: FC<NumberFieldProps> = ({
|
|
|
47
47
|
// Only return the value if it is a valid number
|
|
48
48
|
const localOnChange = useCallback(
|
|
49
49
|
(v: string) => {
|
|
50
|
-
|
|
50
|
+
if (type === "decimal" && v === ".") {
|
|
51
|
+
// if type is decimal and dot is the first character add 0 before it
|
|
52
|
+
setValue("0.");
|
|
53
|
+
rest.onChange("0.");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
51
56
|
const err = getError(v);
|
|
52
57
|
if (!err) {
|
|
58
|
+
setValue(v);
|
|
53
59
|
rest.onChange(v);
|
|
54
60
|
}
|
|
55
61
|
},
|
|
56
|
-
[getError, rest]
|
|
62
|
+
[getError, rest, type]
|
|
57
63
|
);
|
|
58
64
|
|
|
59
65
|
return <TextField {...rest} errorText={error} value={value} onChange={localOnChange} />;
|