@0610studio/zs-ui 0.18.0 → 0.18.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/build/ZsUiModule.d.ts.map +1 -1
- package/build/ZsUiModule.js +0 -2
- package/build/ZsUiModule.js.map +1 -1
- package/build/assets/SvgExclamation.d.ts.map +1 -1
- package/build/assets/SvgExclamation.js.map +1 -1
- package/build/context/OverlayContext.d.ts.map +1 -1
- package/build/context/OverlayContext.js +11 -14
- package/build/context/OverlayContext.js.map +1 -1
- package/build/context/ThemeContext.d.ts +9 -0
- package/build/context/ThemeContext.d.ts.map +1 -1
- package/build/context/ThemeContext.js +8 -11
- package/build/context/ThemeContext.js.map +1 -1
- package/build/index.d.ts +2 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -7
- package/build/index.js.map +1 -1
- package/build/model/globalOverlay.d.ts +0 -8
- package/build/model/globalOverlay.d.ts.map +1 -1
- package/build/model/globalOverlay.js +0 -9
- package/build/model/globalOverlay.js.map +1 -1
- package/build/model/types.d.ts +1 -1
- package/build/model/types.d.ts.map +1 -1
- package/build/model/types.js.map +1 -1
- package/build/model/useKeyboard.d.ts.map +1 -1
- package/build/model/useKeyboard.js +8 -4
- package/build/model/useKeyboard.js.map +1 -1
- package/build/model/utils.d.ts +1 -1
- package/build/model/utils.d.ts.map +1 -1
- package/build/model/utils.js +2 -1
- package/build/model/utils.js.map +1 -1
- package/build/overlay/AlertOverlay/index.d.ts.map +1 -1
- package/build/overlay/AlertOverlay/index.js +2 -2
- package/build/overlay/AlertOverlay/index.js.map +1 -1
- package/build/overlay/BottomSheetOverlay/index.d.ts.map +1 -1
- package/build/overlay/BottomSheetOverlay/index.js +18 -8
- package/build/overlay/BottomSheetOverlay/index.js.map +1 -1
- package/build/overlay/Modality/index.d.ts.map +1 -1
- package/build/overlay/Modality/index.js +3 -9
- package/build/overlay/Modality/index.js.map +1 -1
- package/build/overlay/PopOver/PopOverMenu.d.ts.map +1 -1
- package/build/overlay/PopOver/PopOverMenu.js +3 -6
- package/build/overlay/PopOver/PopOverMenu.js.map +1 -1
- package/build/overlay/SnackbarNotify/index.d.ts +3 -3
- package/build/overlay/SnackbarNotify/index.d.ts.map +1 -1
- package/build/overlay/SnackbarNotify/index.js +5 -4
- package/build/overlay/SnackbarNotify/index.js.map +1 -1
- package/build/overlay/SnackbarNotify/ui/SnackbarItem.d.ts +3 -3
- package/build/overlay/SnackbarNotify/ui/SnackbarItem.d.ts.map +1 -1
- package/build/overlay/SnackbarNotify/ui/SnackbarItem.js +5 -5
- package/build/overlay/SnackbarNotify/ui/SnackbarItem.js.map +1 -1
- package/build/overlay/ZSPortal/index.d.ts.map +1 -1
- package/build/overlay/ZSPortal/index.js +15 -4
- package/build/overlay/ZSPortal/index.js.map +1 -1
- package/build/overlay/ui/ModalBackground.js.map +1 -1
- package/build/theme/elevation.d.ts +94 -10
- package/build/theme/elevation.d.ts.map +1 -1
- package/build/theme/elevation.js +39 -35
- package/build/theme/elevation.js.map +1 -1
- package/build/theme/palette.d.ts +1 -5
- package/build/theme/palette.d.ts.map +1 -1
- package/build/theme/palette.js +3 -12
- package/build/theme/palette.js.map +1 -1
- package/build/theme/resolveColor.d.ts +4 -0
- package/build/theme/resolveColor.d.ts.map +1 -0
- package/build/theme/resolveColor.js +29 -0
- package/build/theme/resolveColor.js.map +1 -0
- package/build/ui/ZSBlockButton/index.d.ts +4 -2
- package/build/ui/ZSBlockButton/index.d.ts.map +1 -1
- package/build/ui/ZSBlockButton/index.js +31 -79
- package/build/ui/ZSBlockButton/index.js.map +1 -1
- package/build/ui/ZSContainer/index.d.ts +20 -0
- package/build/ui/ZSContainer/index.d.ts.map +1 -1
- package/build/ui/ZSContainer/index.js +28 -15
- package/build/ui/ZSContainer/index.js.map +1 -1
- package/build/ui/ZSPressable/index.d.ts.map +1 -1
- package/build/ui/ZSPressable/index.js +0 -2
- package/build/ui/ZSPressable/index.js.map +1 -1
- package/build/ui/ZSRadioGroup/index.d.ts +3 -2
- package/build/ui/ZSRadioGroup/index.d.ts.map +1 -1
- package/build/ui/ZSRadioGroup/index.js +64 -52
- package/build/ui/ZSRadioGroup/index.js.map +1 -1
- package/build/ui/ZSSkeleton/index.d.ts +2 -1
- package/build/ui/ZSSkeleton/index.d.ts.map +1 -1
- package/build/ui/ZSSkeleton/index.js +2 -2
- package/build/ui/ZSSkeleton/index.js.map +1 -1
- package/build/ui/ZSSkeletonBox/index.d.ts +2 -1
- package/build/ui/ZSSkeletonBox/index.d.ts.map +1 -1
- package/build/ui/ZSSkeletonBox/index.js +7 -5
- package/build/ui/ZSSkeletonBox/index.js.map +1 -1
- package/build/ui/ZSSwitch/index.d.ts +2 -1
- package/build/ui/ZSSwitch/index.d.ts.map +1 -1
- package/build/ui/ZSSwitch/index.js +2 -2
- package/build/ui/ZSSwitch/index.js.map +1 -1
- package/build/ui/ZSText/index.d.ts +3 -2
- package/build/ui/ZSText/index.d.ts.map +1 -1
- package/build/ui/ZSText/index.js +5 -16
- package/build/ui/ZSText/index.js.map +1 -1
- package/build/ui/ZSTextField/index.d.ts.map +1 -1
- package/build/ui/ZSTextField/index.js +41 -28
- package/build/ui/ZSTextField/index.js.map +1 -1
- package/build/ui/ZSView/index.d.ts +3 -2
- package/build/ui/ZSView/index.d.ts.map +1 -1
- package/build/ui/ZSView/index.js +7 -8
- package/build/ui/ZSView/index.js.map +1 -1
- package/build/ui/atoms/AnimatedWrapper.d.ts.map +1 -1
- package/build/ui/atoms/AnimatedWrapper.js +33 -40
- package/build/ui/atoms/AnimatedWrapper.js.map +1 -1
- package/build/ui/atoms/TextAtom.d.ts +1 -2
- package/build/ui/atoms/TextAtom.d.ts.map +1 -1
- package/build/ui/atoms/TextAtom.js.map +1 -1
- package/build/ui/atoms/ViewAtom.d.ts +1 -2
- package/build/ui/atoms/ViewAtom.d.ts.map +1 -1
- package/build/ui/atoms/ViewAtom.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo } from "react";
|
|
2
3
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
3
4
|
import { StyleSheet, View } from "react-native";
|
|
4
5
|
import SnackbarItem from "./ui/SnackbarItem";
|
|
@@ -7,10 +8,10 @@ import { Z_INDEX_VALUE } from "../../model/utils";
|
|
|
7
8
|
const SnackbarNotify = ({ customSnackbar }) => {
|
|
8
9
|
const { snackItemStack, hideSnackBar } = useSnackbar();
|
|
9
10
|
const { top } = useSafeAreaInsets();
|
|
10
|
-
|
|
11
|
-
if (!snackItemStack)
|
|
11
|
+
const containerStyle = useMemo(() => [styles.container, { paddingTop: top }], [top]);
|
|
12
|
+
if (!snackItemStack?.length)
|
|
12
13
|
return null;
|
|
13
|
-
return (_jsx(View, { style:
|
|
14
|
+
return (_jsx(View, { style: containerStyle, children: snackItemStack.map((snackItem) => {
|
|
14
15
|
return (_jsx(SnackbarItem, { customSnackbar: customSnackbar, snackItem: snackItem, hideSnackBar: hideSnackBar }, snackItem.index));
|
|
15
16
|
}) }));
|
|
16
17
|
};
|
|
@@ -22,5 +23,5 @@ const styles = StyleSheet.create({
|
|
|
22
23
|
position: 'absolute',
|
|
23
24
|
},
|
|
24
25
|
});
|
|
25
|
-
export default SnackbarNotify;
|
|
26
|
+
export default memo(SnackbarNotify);
|
|
26
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/overlay/SnackbarNotify/index.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/overlay/SnackbarNotify/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAa,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,cAAc,GAAG,CAAC,EACtB,cAAc,EAGf,EAAE,EAAE;IACH,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAAC;IACvD,MAAM,EAAE,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAErF,IAAI,CAAC,cAAc,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzC,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,cAAc,YAEvB,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,OAAO,CACL,KAAC,YAAY,IAEX,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,IAHrB,SAAS,CAAC,KAAK,CAIpB,CACH,CAAC;QACJ,CAAC,CAAC,GAEC,CACR,CAAA;AACH,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,MAAM,EAAE,aAAa,CAAC,QAAQ;QAC9B,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,UAAU;KACrB;CACF,CAAC,CAAC;AAEH,eAAe,IAAI,CAAC,cAAc,CAAC,CAAC","sourcesContent":["import React, { ReactNode, memo, useMemo } from \"react\";\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { StyleSheet, View } from \"react-native\";\nimport { CustomSnackbarProps } from \"../../model/types\";\nimport SnackbarItem from \"./ui/SnackbarItem\";\nimport { useSnackbar } from \"../../model/useOverlay\";\nimport { Z_INDEX_VALUE } from \"../../model/utils\";\n\nconst SnackbarNotify = ({\n customSnackbar\n}: {\n customSnackbar?: (props: CustomSnackbarProps) => ReactNode\n}) => {\n const { snackItemStack, hideSnackBar } = useSnackbar();\n const { top } = useSafeAreaInsets();\n const containerStyle = useMemo(() => [styles.container, { paddingTop: top }], [top]);\n\n if (!snackItemStack?.length) return null;\n\n return (\n <View style={containerStyle}>\n {\n snackItemStack.map((snackItem) => {\n return (\n <SnackbarItem\n key={snackItem.index}\n customSnackbar={customSnackbar}\n snackItem={snackItem}\n hideSnackBar={hideSnackBar}\n />\n );\n })\n }\n </View>\n )\n};\n\nconst styles = StyleSheet.create({\n container: {\n zIndex: Z_INDEX_VALUE.SNACKBAR,\n width: '100%',\n alignItems: 'center',\n position: 'absolute',\n },\n});\n\nexport default memo(SnackbarNotify);\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, { ReactNode } from "react";
|
|
2
2
|
import { CustomSnackbarProps, SnackItem } from "../../../model/types";
|
|
3
|
-
declare const
|
|
3
|
+
declare const _default: React.MemoExoticComponent<({ customSnackbar, snackItem, hideSnackBar, }: {
|
|
4
4
|
customSnackbar?: (props: CustomSnackbarProps) => ReactNode;
|
|
5
5
|
snackItem: SnackItem;
|
|
6
6
|
hideSnackBar: (index: number) => void;
|
|
7
|
-
}) => React.JSX.Element
|
|
8
|
-
export default
|
|
7
|
+
}) => React.JSX.Element>;
|
|
8
|
+
export default _default;
|
|
9
9
|
//# sourceMappingURL=SnackbarItem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarItem.d.ts","sourceRoot":"","sources":["../../../../src/overlay/SnackbarNotify/ui/SnackbarItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"SnackbarItem.d.ts","sourceRoot":"","sources":["../../../../src/overlay/SnackbarNotify/ui/SnackbarItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAgC,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;iGASnE;IACD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC3D,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAoED,wBAA8B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useCallback } from "react";
|
|
2
|
+
import { memo, useEffect, useCallback } from "react";
|
|
3
3
|
import { StyleSheet, TouchableOpacity } from "react-native";
|
|
4
|
-
import Animated, { FadeInUp, FadeOutUp } from "react-native-reanimated";
|
|
4
|
+
import Animated, { FadeInUp, FadeOutUp, LinearTransition } from "react-native-reanimated";
|
|
5
5
|
import ViewAtom from "../../../ui/atoms/ViewAtom";
|
|
6
6
|
import { useTheme } from "../../../context/ThemeContext";
|
|
7
7
|
import ZSText from "../../../ui/ZSText";
|
|
@@ -14,8 +14,8 @@ const Snackbar = ({ customSnackbar, snackItem, hideSnackBar, }) => {
|
|
|
14
14
|
useEffect(() => {
|
|
15
15
|
const closeTimeout = setTimeout(closeSnackbar, snackbarDuration);
|
|
16
16
|
return () => clearTimeout(closeTimeout);
|
|
17
|
-
}, []);
|
|
18
|
-
return (_jsx(Animated.View, { style: [styles.snackbarWrapper], entering: FadeInUp, exiting: FadeOutUp, children: _jsx(TouchableOpacity, { style: [styles.container], activeOpacity: 1, onPress: closeSnackbar, children: customSnackbar ? (customSnackbar({ snackType: type, snackMessage: message })) : (_jsx(ViewAtom, { style: [
|
|
17
|
+
}, [closeSnackbar, snackbarDuration]);
|
|
18
|
+
return (_jsx(Animated.View, { style: [styles.snackbarWrapper], entering: FadeInUp.duration(250), exiting: FadeOutUp.duration(250), layout: LinearTransition.duration(250), children: _jsx(TouchableOpacity, { style: [styles.container], activeOpacity: 1, onPress: closeSnackbar, children: customSnackbar ? (customSnackbar({ snackType: type, snackMessage: message })) : (_jsx(ViewAtom, { style: [
|
|
19
19
|
styles.snackBar,
|
|
20
20
|
{ backgroundColor: type === "error" ? palette.background.danger : palette.background.success },
|
|
21
21
|
], children: _jsx(ViewAtom, { style: styles.messageContainer, children: _jsx(ZSText, { children: message }) }) })) }) }));
|
|
@@ -43,5 +43,5 @@ const styles = StyleSheet.create({
|
|
|
43
43
|
marginLeft: 10,
|
|
44
44
|
},
|
|
45
45
|
});
|
|
46
|
-
export default Snackbar;
|
|
46
|
+
export default memo(Snackbar);
|
|
47
47
|
//# sourceMappingURL=SnackbarItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarItem.js","sourceRoot":"","sources":["../../../../src/overlay/SnackbarNotify/ui/SnackbarItem.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAa,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SnackbarItem.js","sourceRoot":"","sources":["../../../../src/overlay/SnackbarNotify/ui/SnackbarItem.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAa,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE1F,OAAO,QAAQ,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,MAAM,QAAQ,GAAG,CAAC,EAChB,cAAc,EACd,SAAS,EACT,YAAY,GAKb,EAAE,EAAE;IACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE/B,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACjE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEtC,OAAO,CACL,KAAC,QAAQ,CAAC,IAAI,IACZ,KAAK,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAChC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAChC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,YAEtC,KAAC,gBAAgB,IACf,KAAK,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EACzB,aAAa,EAAE,CAAC,EAChB,OAAO,EAAE,aAAa,YAErB,cAAc,CAAC,CAAC,CAAC,CAChB,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAC3D,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IACP,KAAK,EAAE;oBACL,MAAM,CAAC,QAAQ;oBACf,EAAE,eAAe,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;iBAC/F,YAED,KAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,CAAC,gBAAgB,YACtC,KAAC,MAAM,cAAE,OAAO,GAAU,GACjB,GACF,CACZ,GACgB,GACL,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,MAAM;KACd;IACD,eAAe,EAAE;QACf,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,CAAC;KACb;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,EAAE;QAChB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,MAAM;KACd;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC;QACP,aAAa,EAAE,QAAQ;QACvB,UAAU,EAAE,EAAE;KACf;CACF,CAAC,CAAC;AAEH,eAAe,IAAI,CAAC,QAAQ,CAAC,CAAC","sourcesContent":["import React, { ReactNode, memo, useEffect, useCallback } from \"react\";\nimport { StyleSheet, TouchableOpacity } from \"react-native\";\nimport Animated, { FadeInUp, FadeOutUp, LinearTransition } from \"react-native-reanimated\";\nimport { CustomSnackbarProps, SnackItem } from \"../../../model/types\";\nimport ViewAtom from \"../../../ui/atoms/ViewAtom\";\nimport { useTheme } from \"../../../context/ThemeContext\";\nimport ZSText from \"../../../ui/ZSText\";\n\nconst Snackbar = ({\n customSnackbar,\n snackItem,\n hideSnackBar,\n}: {\n customSnackbar?: (props: CustomSnackbarProps) => ReactNode;\n snackItem: SnackItem;\n hideSnackBar: (index: number) => void;\n}) => {\n const { type, message, snackbarDuration } = snackItem;\n const { palette } = useTheme();\n\n const closeSnackbar = useCallback(() => {\n hideSnackBar(snackItem.index);\n }, [hideSnackBar, snackItem.index]);\n\n useEffect(() => {\n const closeTimeout = setTimeout(closeSnackbar, snackbarDuration);\n return () => clearTimeout(closeTimeout);\n }, [closeSnackbar, snackbarDuration]);\n\n return (\n <Animated.View\n style={[styles.snackbarWrapper]}\n entering={FadeInUp.duration(250)}\n exiting={FadeOutUp.duration(250)}\n layout={LinearTransition.duration(250)}\n >\n <TouchableOpacity\n style={[styles.container]}\n activeOpacity={1}\n onPress={closeSnackbar}\n >\n {customSnackbar ? (\n customSnackbar({ snackType: type, snackMessage: message })\n ) : (\n <ViewAtom\n style={[\n styles.snackBar,\n { backgroundColor: type === \"error\" ? palette.background.danger : palette.background.success },\n ]}\n >\n <ViewAtom style={styles.messageContainer}>\n <ZSText>{message}</ZSText>\n </ViewAtom>\n </ViewAtom>\n )}\n </TouchableOpacity>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n borderRadius: 16,\n width: \"100%\",\n },\n snackbarWrapper: {\n width: \"96%\",\n marginTop: 8,\n },\n snackBar: {\n borderRadius: 16,\n paddingHorizontal: 10,\n paddingVertical: 18,\n flexDirection: \"row\",\n alignItems: \"center\",\n width: \"100%\",\n },\n messageContainer: {\n flex: 1,\n flexDirection: \"column\",\n marginLeft: 10,\n },\n});\n\nexport default memo(Snackbar);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/overlay/ZSPortal/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/overlay/ZSPortal/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAA6D,SAAS,EAAa,MAAM,OAAO,CAAC;AAY/G,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAwCxD,CAAC;AAcF,UAAU,WAAW;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAqB1C,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, useState, useCallback, useEffect } from 'react';
|
|
2
|
+
import { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';
|
|
3
|
+
import { StyleSheet } from 'react-native';
|
|
3
4
|
import Animated, { FadeInDown, FadeOutDown } from 'react-native-reanimated';
|
|
4
5
|
import { Z_INDEX_VALUE } from '../../model/utils';
|
|
5
6
|
const PortalContext = createContext(null);
|
|
@@ -7,7 +8,6 @@ export const PortalProvider = ({ children }) => {
|
|
|
7
8
|
const [portals, setPortals] = useState(new Map());
|
|
8
9
|
const registerPortal = useCallback((id, element) => {
|
|
9
10
|
setPortals(prev => {
|
|
10
|
-
// 동일한 요소가 이미 등록되어 있다면 업데이트하지 않음
|
|
11
11
|
if (prev.get(id) === element) {
|
|
12
12
|
return prev;
|
|
13
13
|
}
|
|
@@ -18,7 +18,6 @@ export const PortalProvider = ({ children }) => {
|
|
|
18
18
|
}, []);
|
|
19
19
|
const unregisterPortal = useCallback((id) => {
|
|
20
20
|
setPortals(prev => {
|
|
21
|
-
// 해당 ID가 존재하지 않으면 상태를 변경하지 않음
|
|
22
21
|
if (!prev.has(id)) {
|
|
23
22
|
return prev;
|
|
24
23
|
}
|
|
@@ -27,8 +26,20 @@ export const PortalProvider = ({ children }) => {
|
|
|
27
26
|
return newMap;
|
|
28
27
|
});
|
|
29
28
|
}, []);
|
|
30
|
-
|
|
29
|
+
const contextValue = useMemo(() => ({ registerPortal, unregisterPortal }), [registerPortal, unregisterPortal]);
|
|
30
|
+
return (_jsxs(PortalContext.Provider, { value: contextValue, children: [children, Array.from(portals.entries()).map(([id, element]) => (_jsx(Animated.View, { entering: FadeInDown, exiting: FadeOutDown, style: styles.portalLayer, children: element }, id)))] }));
|
|
31
31
|
};
|
|
32
|
+
const styles = StyleSheet.create({
|
|
33
|
+
portalLayer: {
|
|
34
|
+
position: 'absolute',
|
|
35
|
+
top: 0,
|
|
36
|
+
left: 0,
|
|
37
|
+
right: 0,
|
|
38
|
+
bottom: 0,
|
|
39
|
+
pointerEvents: 'box-none',
|
|
40
|
+
zIndex: Z_INDEX_VALUE.ABOVE_KEYBOARD,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
32
43
|
export const ZSPortal = ({ children, isFocused = true }) => {
|
|
33
44
|
const context = useContext(PortalContext);
|
|
34
45
|
const [portalId] = useState(() => `portal_${Date.now()}_${Math.random()}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/overlay/ZSPortal/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAa,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/overlay/ZSPortal/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useContext, useState, useCallback, useMemo, ReactNode, useEffect } from 'react';\nimport { StyleSheet } from 'react-native';\nimport Animated, { FadeInDown, FadeOutDown } from 'react-native-reanimated';\nimport { Z_INDEX_VALUE } from '../../model/utils';\n\ninterface PortalContextType {\n registerPortal: (id: string, element: ReactNode) => void;\n unregisterPortal: (id: string) => void;\n}\n\nconst PortalContext = createContext<PortalContextType | null>(null);\n\ninterface PortalProviderProps {\n children: ReactNode;\n}\n\nexport const PortalProvider: React.FC<PortalProviderProps> = ({ children }) => {\n const [portals, setPortals] = useState<Map<string, ReactNode>>(new Map());\n\n const registerPortal = useCallback((id: string, element: ReactNode) => {\n setPortals(prev => {\n if (prev.get(id) === element) {\n return prev;\n }\n const newMap = new Map(prev);\n newMap.set(id, element);\n return newMap;\n });\n }, []);\n\n const unregisterPortal = useCallback((id: string) => {\n setPortals(prev => {\n if (!prev.has(id)) {\n return prev;\n }\n const newMap = new Map(prev);\n newMap.delete(id);\n return newMap;\n });\n }, []);\n\n const contextValue = useMemo(\n () => ({ registerPortal, unregisterPortal }),\n [registerPortal, unregisterPortal]\n );\n\n return (\n <PortalContext.Provider value={contextValue}>\n {children}\n {Array.from(portals.entries()).map(([id, element]) => (\n <Animated.View entering={FadeInDown} exiting={FadeOutDown} key={id} style={styles.portalLayer}>\n {element}\n </Animated.View>\n ))}\n </PortalContext.Provider>\n );\n};\n\nconst styles = StyleSheet.create({\n portalLayer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'box-none',\n zIndex: Z_INDEX_VALUE.ABOVE_KEYBOARD,\n },\n});\n\ninterface PortalProps {\n children: ReactNode;\n isFocused?: boolean;\n}\n\nexport const ZSPortal: React.FC<PortalProps> = ({ children, isFocused = true }) => {\n const context = useContext(PortalContext);\n const [portalId] = useState(() => `portal_${Date.now()}_${Math.random()}`);\n\n useEffect(() => {\n if (!context) return;\n if (isFocused) {\n context.registerPortal(portalId, children);\n } else {\n context.unregisterPortal(portalId);\n }\n }, [isFocused, children]);\n\n useEffect(() => {\n return () => {\n if (!context) return;\n context.unregisterPortal(portalId);\n };\n }, []);\n\n return null;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModalBackground.js","sourceRoot":"","sources":["../../../src/overlay/ui/ModalBackground.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAUlD,SAAS,eAAe,CAAC,EAAE,YAAY,EAAE,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAwB;IACrI,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzE,OAAO,CACL,MAAC,QAAQ,CAAC,IAAI,IACZ,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,KAAK,QAAQ,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,KAAK,MAAM,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,KAAK,OAAO,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAC7Q,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC7B,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,aAE7B,KAAC,SAAS,IACR,KAAK,EAAE,MAAM,CAAC,UAAU,EACxB,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAErB,EAEX,QAAQ,IACK,CACjB,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,YAAoB,EAAE,EAAE,CAC5C,UAAU,CAAC,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,eAAe,EAAE,YAAY;QAC7B,GAAG,UAAU,CAAC,YAAY;KAC3B;IACD,UAAU,EAAE;QACV,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,GAAG,UAAU,CAAC,YAAY;KAC3B;CACF,CAAC,CAAC;AAEL,eAAe,eAAe,CAAC","sourcesContent":["import React, { useMemo } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport Animated, { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { Z_INDEX_VALUE } from '../../model/utils';\n\ninterface ModalBackgroundProps {\n zIndex?: number;\n modalBgColor: string;\n position?: 'center' | 'left' | 'right' | 'pop'
|
|
1
|
+
{"version":3,"file":"ModalBackground.js","sourceRoot":"","sources":["../../../src/overlay/ui/ModalBackground.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAUlD,SAAS,eAAe,CAAC,EAAE,YAAY,EAAE,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAwB;IACrI,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzE,OAAO,CACL,MAAC,QAAQ,CAAC,IAAI,IACZ,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,KAAK,QAAQ,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,KAAK,MAAM,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,QAAQ,KAAK,OAAO,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAC7Q,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC7B,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,aAE7B,KAAC,SAAS,IACR,KAAK,EAAE,MAAM,CAAC,UAAU,EACxB,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAErB,EAEX,QAAQ,IACK,CACjB,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,YAAoB,EAAE,EAAE,CAC5C,UAAU,CAAC,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,eAAe,EAAE,YAAY;QAC7B,GAAG,UAAU,CAAC,YAAY;KAC3B;IACD,UAAU,EAAE;QACV,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,GAAG,UAAU,CAAC,YAAY;KAC3B;CACF,CAAC,CAAC;AAEL,eAAe,eAAe,CAAC","sourcesContent":["import React, { useMemo } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport Animated, { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { Z_INDEX_VALUE } from '../../model/utils';\n\ninterface ModalBackgroundProps {\n zIndex?: number;\n modalBgColor: string;\n position?: 'center' | 'left' | 'right' | 'pop';\n children: React.ReactNode;\n onPress?: () => void;\n}\n\nfunction ModalBackground({ modalBgColor, position = 'center', children, onPress, zIndex = Z_INDEX_VALUE.DEFAULT }: ModalBackgroundProps) {\n const styles = useMemo(() => createStyles(modalBgColor), [modalBgColor]);\n\n return (\n <Animated.View\n style={[styles.modalBg, { zIndex }, position === 'center' && { justifyContent: 'center', alignItems: 'center' }, position === 'left' && { justifyContent: 'flex-start', alignItems: 'center' }, position === 'right' && { justifyContent: 'flex-end', alignItems: 'center' }]}\n entering={FadeIn.duration(50)}\n exiting={FadeOut.duration(50)}\n >\n <Pressable\n style={styles.fullScreen}\n onPress={onPress ?? (() => { })}\n >\n </Pressable>\n\n {children}\n </Animated.View>\n );\n}\n\nconst createStyles = (modalBgColor: string) =>\n StyleSheet.create({\n modalBg: {\n backgroundColor: modalBgColor,\n ...StyleSheet.absoluteFill,\n },\n fullScreen: {\n width: '100%',\n height: '100%',\n ...StyleSheet.absoluteFill,\n },\n });\n\nexport default ModalBackground;\n"]}
|
|
@@ -1,18 +1,102 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BoxShadowValue } from "react-native";
|
|
2
|
+
import { ShadowLevel } from "./types";
|
|
2
3
|
import { Theme } from "./types";
|
|
3
|
-
export declare const IOS_SHADOW: readonly
|
|
4
|
+
export declare const IOS_SHADOW: readonly [{
|
|
5
|
+
readonly shadowOffset: {
|
|
6
|
+
readonly width: 0;
|
|
7
|
+
readonly height: 0;
|
|
8
|
+
};
|
|
9
|
+
readonly shadowOpacity: 0;
|
|
10
|
+
readonly shadowRadius: 0;
|
|
11
|
+
}, {
|
|
12
|
+
readonly shadowOffset: {
|
|
13
|
+
readonly width: 0;
|
|
14
|
+
readonly height: 1;
|
|
15
|
+
};
|
|
16
|
+
readonly shadowOpacity: 0.2;
|
|
17
|
+
readonly shadowRadius: 1;
|
|
18
|
+
}, {
|
|
19
|
+
readonly shadowOffset: {
|
|
20
|
+
readonly width: 0;
|
|
21
|
+
readonly height: 1;
|
|
22
|
+
};
|
|
23
|
+
readonly shadowOpacity: 0.2;
|
|
24
|
+
readonly shadowRadius: 1.41;
|
|
25
|
+
}, {
|
|
26
|
+
readonly shadowOffset: {
|
|
27
|
+
readonly width: 0;
|
|
28
|
+
readonly height: 1;
|
|
29
|
+
};
|
|
30
|
+
readonly shadowOpacity: 0.2;
|
|
31
|
+
readonly shadowRadius: 2.22;
|
|
32
|
+
}, {
|
|
33
|
+
readonly shadowOffset: {
|
|
34
|
+
readonly width: 0;
|
|
35
|
+
readonly height: 2;
|
|
36
|
+
};
|
|
37
|
+
readonly shadowOpacity: 0.2;
|
|
38
|
+
readonly shadowRadius: 2.62;
|
|
39
|
+
}, {
|
|
40
|
+
readonly shadowOffset: {
|
|
41
|
+
readonly width: 0;
|
|
42
|
+
readonly height: 2;
|
|
43
|
+
};
|
|
44
|
+
readonly shadowOpacity: 0.2;
|
|
45
|
+
readonly shadowRadius: 3.84;
|
|
46
|
+
}, {
|
|
47
|
+
readonly shadowOffset: {
|
|
48
|
+
readonly width: 0;
|
|
49
|
+
readonly height: 3;
|
|
50
|
+
};
|
|
51
|
+
readonly shadowOpacity: 0.2;
|
|
52
|
+
readonly shadowRadius: 4.65;
|
|
53
|
+
}, {
|
|
54
|
+
readonly shadowOffset: {
|
|
55
|
+
readonly width: 0;
|
|
56
|
+
readonly height: 4;
|
|
57
|
+
};
|
|
58
|
+
readonly shadowOpacity: 0.25;
|
|
59
|
+
readonly shadowRadius: 4.65;
|
|
60
|
+
}, {
|
|
61
|
+
readonly shadowOffset: {
|
|
62
|
+
readonly width: 0;
|
|
63
|
+
readonly height: 6;
|
|
64
|
+
};
|
|
65
|
+
readonly shadowOpacity: 0.25;
|
|
66
|
+
readonly shadowRadius: 4.65;
|
|
67
|
+
}, {
|
|
68
|
+
readonly shadowOffset: {
|
|
69
|
+
readonly width: 0;
|
|
70
|
+
readonly height: 8;
|
|
71
|
+
};
|
|
72
|
+
readonly shadowOpacity: 0.25;
|
|
73
|
+
readonly shadowRadius: 5.8;
|
|
74
|
+
}, {
|
|
75
|
+
readonly shadowOffset: {
|
|
76
|
+
readonly width: 0;
|
|
77
|
+
readonly height: 10;
|
|
78
|
+
};
|
|
79
|
+
readonly shadowOpacity: 0.25;
|
|
80
|
+
readonly shadowRadius: 6.5;
|
|
81
|
+
}];
|
|
4
82
|
export interface ElevationProps {
|
|
5
|
-
|
|
6
|
-
shadowOffset?: {
|
|
7
|
-
width: number;
|
|
8
|
-
height: number;
|
|
9
|
-
};
|
|
10
|
-
shadowOpacity?: number;
|
|
11
|
-
shadowRadius?: number;
|
|
12
|
-
elevation?: number;
|
|
83
|
+
boxShadow?: BoxShadowValue[];
|
|
13
84
|
}
|
|
14
85
|
export type ElevationStyles = {
|
|
15
86
|
[key in ShadowLevel]: ElevationProps;
|
|
16
87
|
};
|
|
88
|
+
export interface ColorChannels {
|
|
89
|
+
r: number;
|
|
90
|
+
g: number;
|
|
91
|
+
b: number;
|
|
92
|
+
a: number;
|
|
93
|
+
}
|
|
94
|
+
/** `rgb()`/`rgba()` 색상 문자열에서 r·g·b·a 채널을 추출한다. 파싱 실패 시 불투명 검정으로 폴백. */
|
|
95
|
+
export declare function parseColorChannels(color: string): ColorChannels;
|
|
96
|
+
/**
|
|
97
|
+
* IOS_SHADOW 의 레벨별 오프셋·블러와 elevationShadow 색상을 합쳐 cross-platform boxShadow 를 만든다.
|
|
98
|
+
* 기존 iOS 그림자와 동일하게 최종 불투명도는 색상 alpha × shadowOpacity 로 계산한다.
|
|
99
|
+
*/
|
|
100
|
+
export declare function createBoxShadow(level: ShadowLevel, shadowColor: string): BoxShadowValue[];
|
|
17
101
|
export default function elevation(palette: Theme): ElevationStyles;
|
|
18
102
|
//# sourceMappingURL=elevation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevation.d.ts","sourceRoot":"","sources":["../../src/theme/elevation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"elevation.d.ts","sourceRoot":"","sources":["../../src/theme/elevation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYoB,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GAAG;KAC3B,GAAG,IAAI,WAAW,GAAG,cAAc;CACrC,CAAC;AAIF,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAY/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAkBzF;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,EAAE,KAAK,GAAG,eAAe,CAKjE"}
|
package/build/theme/elevation.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Platform } from "react-native";
|
|
2
1
|
export const IOS_SHADOW = [
|
|
3
2
|
{ shadowOffset: { width: 0, height: 0 }, shadowOpacity: 0, shadowRadius: 0 },
|
|
4
3
|
{ shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.2, shadowRadius: 1.0 },
|
|
@@ -12,41 +11,46 @@ export const IOS_SHADOW = [
|
|
|
12
11
|
{ shadowOffset: { width: 0, height: 8 }, shadowOpacity: 0.25, shadowRadius: 5.8 },
|
|
13
12
|
{ shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.25, shadowRadius: 6.5 },
|
|
14
13
|
];
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const
|
|
14
|
+
const SHADOW_LEVELS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
15
|
+
/** `rgb()`/`rgba()` 색상 문자열에서 r·g·b·a 채널을 추출한다. 파싱 실패 시 불투명 검정으로 폴백. */
|
|
16
|
+
export function parseColorChannels(color) {
|
|
17
|
+
const group = color.match(/rgba?\(([^)]+)\)/i)?.[1];
|
|
18
|
+
if (!group) {
|
|
19
|
+
return { r: 0, g: 0, b: 0, a: 1 };
|
|
20
|
+
}
|
|
21
|
+
const [r, g, b, a] = group.split(',').map((part) => parseFloat(part.trim()));
|
|
19
22
|
return {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
1:
|
|
24
|
-
? { ...IOS_SHADOW[1], shadowColor: palette.elevationShadow[1] }
|
|
25
|
-
: { elevation: 1, shadowColor: palette.elevationShadow[1] },
|
|
26
|
-
2: useShadowStyle
|
|
27
|
-
? { ...IOS_SHADOW[2], shadowColor: palette.elevationShadow[2] }
|
|
28
|
-
: { elevation: 2, shadowColor: palette.elevationShadow[2] },
|
|
29
|
-
3: useShadowStyle
|
|
30
|
-
? { ...IOS_SHADOW[3], shadowColor: palette.elevationShadow[3] }
|
|
31
|
-
: { elevation: 3, shadowColor: palette.elevationShadow[3] },
|
|
32
|
-
4: useShadowStyle
|
|
33
|
-
? { ...IOS_SHADOW[4], shadowColor: palette.elevationShadow[4] }
|
|
34
|
-
: { elevation: 4, shadowColor: palette.elevationShadow[4] },
|
|
35
|
-
5: useShadowStyle
|
|
36
|
-
? { ...IOS_SHADOW[5], shadowColor: palette.elevationShadow[5] }
|
|
37
|
-
: { elevation: 5, shadowColor: palette.elevationShadow[5] },
|
|
38
|
-
6: useShadowStyle
|
|
39
|
-
? { ...IOS_SHADOW[6], shadowColor: palette.elevationShadow[6] }
|
|
40
|
-
: { elevation: 6, shadowColor: palette.elevationShadow[6] },
|
|
41
|
-
7: useShadowStyle
|
|
42
|
-
? { ...IOS_SHADOW[7], shadowColor: palette.elevationShadow[7] }
|
|
43
|
-
: { elevation: 7, shadowColor: palette.elevationShadow[7] },
|
|
44
|
-
8: useShadowStyle
|
|
45
|
-
? { ...IOS_SHADOW[8], shadowColor: palette.elevationShadow[8] }
|
|
46
|
-
: { elevation: 8, shadowColor: palette.elevationShadow[8] },
|
|
47
|
-
9: useShadowStyle
|
|
48
|
-
? { ...IOS_SHADOW[9], shadowColor: palette.elevationShadow[9] }
|
|
49
|
-
: { elevation: 9, shadowColor: palette.elevationShadow[9] },
|
|
23
|
+
r: r ?? 0,
|
|
24
|
+
g: g ?? 0,
|
|
25
|
+
b: b ?? 0,
|
|
26
|
+
a: a === undefined || Number.isNaN(a) ? 1 : a,
|
|
50
27
|
};
|
|
51
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* IOS_SHADOW 의 레벨별 오프셋·블러와 elevationShadow 색상을 합쳐 cross-platform boxShadow 를 만든다.
|
|
31
|
+
* 기존 iOS 그림자와 동일하게 최종 불투명도는 색상 alpha × shadowOpacity 로 계산한다.
|
|
32
|
+
*/
|
|
33
|
+
export function createBoxShadow(level, shadowColor) {
|
|
34
|
+
const shadow = IOS_SHADOW[level];
|
|
35
|
+
const { r, g, b, a } = parseColorChannels(shadowColor);
|
|
36
|
+
const alpha = a * shadow.shadowOpacity;
|
|
37
|
+
if (alpha <= 0) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
return [
|
|
41
|
+
{
|
|
42
|
+
offsetX: shadow.shadowOffset.width,
|
|
43
|
+
offsetY: shadow.shadowOffset.height,
|
|
44
|
+
blurRadius: shadow.shadowRadius,
|
|
45
|
+
spreadDistance: 0,
|
|
46
|
+
color: `rgba(${r}, ${g}, ${b}, ${alpha})`,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
export default function elevation(palette) {
|
|
51
|
+
return SHADOW_LEVELS.reduce((styles, level) => {
|
|
52
|
+
styles[level] = { boxShadow: createBoxShadow(level, palette.elevationShadow[level] ?? '') };
|
|
53
|
+
return styles;
|
|
54
|
+
}, {});
|
|
55
|
+
}
|
|
52
56
|
//# sourceMappingURL=elevation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevation.js","sourceRoot":"","sources":["../../src/theme/elevation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"elevation.js","sourceRoot":"","sources":["../../src/theme/elevation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BoxShadowValue } from \"react-native\";\nimport { ShadowLevel, ShadowStyle } from \"./types\";\nimport { Theme } from \"./types\";\n\nexport const IOS_SHADOW = [\n { shadowOffset: { width: 0, height: 0 }, shadowOpacity: 0, shadowRadius: 0 },\n { shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.2, shadowRadius: 1.0 },\n { shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.2, shadowRadius: 1.41 },\n { shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.2, shadowRadius: 2.22 },\n { shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.2, shadowRadius: 2.62 },\n { shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.2, shadowRadius: 3.84 },\n { shadowOffset: { width: 0, height: 3 }, shadowOpacity: 0.2, shadowRadius: 4.65 },\n { shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.25, shadowRadius: 4.65 },\n { shadowOffset: { width: 0, height: 6 }, shadowOpacity: 0.25, shadowRadius: 4.65 },\n { shadowOffset: { width: 0, height: 8 }, shadowOpacity: 0.25, shadowRadius: 5.8 },\n { shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.25, shadowRadius: 6.5 },\n] as const satisfies readonly ShadowStyle[];\n\nexport interface ElevationProps {\n boxShadow?: BoxShadowValue[];\n}\n\nexport type ElevationStyles = {\n [key in ShadowLevel]: ElevationProps;\n};\n\nconst SHADOW_LEVELS: readonly ShadowLevel[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] as const;\n\nexport interface ColorChannels {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/** `rgb()`/`rgba()` 색상 문자열에서 r·g·b·a 채널을 추출한다. 파싱 실패 시 불투명 검정으로 폴백. */\nexport function parseColorChannels(color: string): ColorChannels {\n const group = color.match(/rgba?\\(([^)]+)\\)/i)?.[1];\n if (!group) {\n return { r: 0, g: 0, b: 0, a: 1 };\n }\n const [r, g, b, a] = group.split(',').map((part) => parseFloat(part.trim()));\n return {\n r: r ?? 0,\n g: g ?? 0,\n b: b ?? 0,\n a: a === undefined || Number.isNaN(a) ? 1 : a,\n };\n}\n\n/**\n * IOS_SHADOW 의 레벨별 오프셋·블러와 elevationShadow 색상을 합쳐 cross-platform boxShadow 를 만든다.\n * 기존 iOS 그림자와 동일하게 최종 불투명도는 색상 alpha × shadowOpacity 로 계산한다.\n */\nexport function createBoxShadow(level: ShadowLevel, shadowColor: string): BoxShadowValue[] {\n const shadow = IOS_SHADOW[level];\n const { r, g, b, a } = parseColorChannels(shadowColor);\n const alpha = a * shadow.shadowOpacity;\n\n if (alpha <= 0) {\n return [];\n }\n\n return [\n {\n offsetX: shadow.shadowOffset.width,\n offsetY: shadow.shadowOffset.height,\n blurRadius: shadow.shadowRadius,\n spreadDistance: 0,\n color: `rgba(${r}, ${g}, ${b}, ${alpha})`,\n },\n ];\n}\n\nexport default function elevation(palette: Theme): ElevationStyles {\n return SHADOW_LEVELS.reduce((styles, level) => {\n styles[level] = { boxShadow: createBoxShadow(level, palette.elevationShadow[level] ?? '') };\n return styles;\n }, {} as ElevationStyles);\n}\n"]}
|
package/build/theme/palette.d.ts
CHANGED
|
@@ -65,11 +65,7 @@ export interface ThemeFactoryConfig {
|
|
|
65
65
|
light?: ThemeFactoryColors;
|
|
66
66
|
dark?: ThemeFactoryColors;
|
|
67
67
|
}
|
|
68
|
-
/**
|
|
69
|
-
* 테마 팩토리 함수 - SEMANTIC_LIGHT_COLORS와 SEMANTIC_DARK_COLORS를 재정의할 수 있는 기능을 제공합니다.
|
|
70
|
-
* @param config - 라이트/다크 모드별로 색상을 재정의할 수 있는 설정 객체
|
|
71
|
-
* @returns 재정의된 SEMANTIC_LIGHT_COLORS와 SEMANTIC_DARK_COLORS를 포함한 팩토리 함수
|
|
72
|
-
*/
|
|
68
|
+
/** 라이트/다크 시맨틱 색상을 재정의해 커스텀 팔레트 함수를 생성한다. */
|
|
73
69
|
export declare function themeFactory(config?: ThemeFactoryConfig): ({ mode, themeColors, }?: {
|
|
74
70
|
mode?: "light" | "dark";
|
|
75
71
|
themeColors?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/theme/palette.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDxB,CAAC;
|
|
1
|
+
{"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/theme/palette.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDxB,CAAC;AAsMF,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,MAAM,GAAE,kBAAuB,IAwC5B,yBAG3B;IACD,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC;CAC1C,KAAG,KAAK,CA+Ff;AAED,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,IAAc,EACd,WAAgB,GACjB,GAAE;IACD,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC;CAC1C,GAAG,KAAK,CAqBb"}
|
package/build/theme/palette.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BLACK, PRIMITIVE_BLUE, PRIMITIVE_GREEN, PRIMITIVE_GREY, PRIMITIVE_GREY_DARK, PRIMITIVE_ORANGE, PRIMITIVE_RED, PRIMITIVE_TEAL, PRIMITIVE_YELLOW, SHADOW_COLORS, WHITE } from "./primitive";
|
|
2
2
|
export const transparency = {
|
|
3
|
-
'0%': '00',
|
|
3
|
+
'0%': '00',
|
|
4
4
|
'2%': '05',
|
|
5
5
|
'4%': '0A',
|
|
6
6
|
'6%': '0F',
|
|
@@ -50,7 +50,7 @@ export const transparency = {
|
|
|
50
50
|
'94%': 'F0',
|
|
51
51
|
'96%': 'F5',
|
|
52
52
|
'98%': 'FA',
|
|
53
|
-
'100%': 'FF'
|
|
53
|
+
'100%': 'FF'
|
|
54
54
|
};
|
|
55
55
|
const MODAL_BG_COLOR = {
|
|
56
56
|
light: PRIMITIVE_GREY[90] + transparency['52%'],
|
|
@@ -242,13 +242,8 @@ const SEMANTIC_BACKGROUND_COLORS = {
|
|
|
242
242
|
information: SEMANTIC_DARK_COLORS.information[80],
|
|
243
243
|
},
|
|
244
244
|
};
|
|
245
|
-
/**
|
|
246
|
-
* 테마 팩토리 함수 - SEMANTIC_LIGHT_COLORS와 SEMANTIC_DARK_COLORS를 재정의할 수 있는 기능을 제공합니다.
|
|
247
|
-
* @param config - 라이트/다크 모드별로 색상을 재정의할 수 있는 설정 객체
|
|
248
|
-
* @returns 재정의된 SEMANTIC_LIGHT_COLORS와 SEMANTIC_DARK_COLORS를 포함한 팩토리 함수
|
|
249
|
-
*/
|
|
245
|
+
/** 라이트/다크 시맨틱 색상을 재정의해 커스텀 팔레트 함수를 생성한다. */
|
|
250
246
|
export function themeFactory(config = {}) {
|
|
251
|
-
// 기본 색상들을 깊은 복사로 생성
|
|
252
247
|
const createCustomLightColors = () => {
|
|
253
248
|
const customColors = { ...SEMANTIC_LIGHT_COLORS };
|
|
254
249
|
if (config.light) {
|
|
@@ -281,10 +276,8 @@ export function themeFactory(config = {}) {
|
|
|
281
276
|
};
|
|
282
277
|
const customLightColors = createCustomLightColors();
|
|
283
278
|
const customDarkColors = createCustomDarkColors();
|
|
284
|
-
// 재정의된 색상으로 새로운 팔레트 함수 반환
|
|
285
279
|
return function createPalette({ mode = 'light', themeColors = {}, } = {}) {
|
|
286
280
|
const colors = mode === 'light' ? customLightColors : customDarkColors;
|
|
287
|
-
// 재정의된 색상을 기반으로 동적으로 색상 매핑 생성
|
|
288
281
|
const customTextColors = {
|
|
289
282
|
light: {
|
|
290
283
|
primary: colors.primary.main,
|
|
@@ -364,7 +357,6 @@ export function themeFactory(config = {}) {
|
|
|
364
357
|
modalBgColor: MODAL_BG_COLOR[mode],
|
|
365
358
|
mainColor: customMainColors[mode]
|
|
366
359
|
};
|
|
367
|
-
// 사용자 정의 테마 컬러가 있을 경우 병합
|
|
368
360
|
if (themeColors?.[mode]) {
|
|
369
361
|
return {
|
|
370
362
|
...theme,
|
|
@@ -385,7 +377,6 @@ export default function palette({ mode = 'light', themeColors = {}, } = {}) {
|
|
|
385
377
|
modalBgColor: MODAL_BG_COLOR[mode],
|
|
386
378
|
mainColor: MAIN_COLORS[mode]
|
|
387
379
|
};
|
|
388
|
-
// 사용자 정의 테마 컬러가 있을 경우 병합
|
|
389
380
|
if (themeColors?.[mode]) {
|
|
390
381
|
return {
|
|
391
382
|
...theme,
|