@solostylist/ui-kit-native 1.0.1 → 1.0.3
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/hooks/use-count-down.d.ts +0 -2
- package/dist/hooks/use-count-down.d.ts.map +1 -1
- package/dist/hooks/use-count-down.js +0 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/s-avatar/s-avatar.d.ts +4 -8
- package/dist/s-avatar/s-avatar.d.ts.map +1 -1
- package/dist/s-avatar/s-avatar.js +49 -42
- package/dist/s-button/s-button.d.ts +0 -2
- package/dist/s-button/s-button.d.ts.map +1 -1
- package/dist/s-button/s-button.js +27 -24
- package/dist/s-button-link/s-button-link.d.ts +0 -2
- package/dist/s-button-link/s-button-link.d.ts.map +1 -1
- package/dist/s-button-link/s-button-link.js +21 -26
- package/dist/s-chat-input/index.d.ts +1 -1
- package/dist/s-chat-input/index.d.ts.map +1 -1
- package/dist/s-chat-input/s-chat-input.d.ts +19 -8
- package/dist/s-chat-input/s-chat-input.d.ts.map +1 -1
- package/dist/s-chat-input/s-chat-input.js +115 -46
- package/dist/s-chat-message/s-chat-message.d.ts +5 -7
- package/dist/s-chat-message/s-chat-message.d.ts.map +1 -1
- package/dist/s-chat-message/s-chat-message.js +100 -175
- package/dist/s-checkbox/s-checkbox.d.ts +0 -2
- package/dist/s-checkbox/s-checkbox.d.ts.map +1 -1
- package/dist/s-checkbox/s-checkbox.js +11 -18
- package/dist/s-chip/s-chip.d.ts +0 -2
- package/dist/s-chip/s-chip.d.ts.map +1 -1
- package/dist/s-chip/s-chip.js +35 -54
- package/dist/s-code-block/s-code-block.d.ts +0 -2
- package/dist/s-code-block/s-code-block.d.ts.map +1 -1
- package/dist/s-code-block/s-code-block.js +28 -40
- package/dist/s-comment-message/s-comment-message.d.ts +3 -5
- package/dist/s-comment-message/s-comment-message.d.ts.map +1 -1
- package/dist/s-comment-message/s-comment-message.js +54 -167
- package/dist/s-copyable-text/s-copyable-text.d.ts +0 -2
- package/dist/s-copyable-text/s-copyable-text.d.ts.map +1 -1
- package/dist/s-copyable-text/s-copyable-text.js +20 -45
- package/dist/s-countdown/index.d.ts +0 -1
- package/dist/s-countdown/index.d.ts.map +1 -1
- package/dist/s-countdown/index.js +0 -1
- package/dist/s-countdown/s-count-box.d.ts +5 -3
- package/dist/s-countdown/s-count-box.d.ts.map +1 -1
- package/dist/s-countdown/s-count-box.js +69 -60
- package/dist/s-countdown/s-countdown.d.ts +6 -3
- package/dist/s-countdown/s-countdown.d.ts.map +1 -1
- package/dist/s-countdown/s-countdown.js +11 -10
- package/dist/s-data-table/s-data-table.d.ts +0 -3
- package/dist/s-data-table/s-data-table.d.ts.map +1 -1
- package/dist/s-data-table/s-data-table.js +27 -50
- package/dist/s-date-picker/s-date-picker.d.ts +0 -2
- package/dist/s-date-picker/s-date-picker.d.ts.map +1 -1
- package/dist/s-date-picker/s-date-picker.js +51 -110
- package/dist/s-date-time-picker/s-date-time-picker.d.ts +0 -2
- package/dist/s-date-time-picker/s-date-time-picker.d.ts.map +1 -1
- package/dist/s-date-time-picker/s-date-time-picker.js +111 -203
- package/dist/s-divider/index.d.ts +2 -0
- package/dist/s-divider/index.d.ts.map +1 -0
- package/dist/s-divider/index.js +1 -0
- package/dist/s-divider/s-divider.d.ts +24 -0
- package/dist/s-divider/s-divider.d.ts.map +1 -0
- package/dist/s-divider/s-divider.js +30 -0
- package/dist/s-file-dropzone/s-file-dropzone.d.ts +0 -35
- package/dist/s-file-dropzone/s-file-dropzone.d.ts.map +1 -1
- package/dist/s-file-dropzone/s-file-dropzone.js +46 -120
- package/dist/s-file-icon/s-file-icon.d.ts +0 -2
- package/dist/s-file-icon/s-file-icon.d.ts.map +1 -1
- package/dist/s-file-icon/s-file-icon.js +11 -12
- package/dist/s-form/s-form.d.ts +0 -1
- package/dist/s-form/s-form.d.ts.map +1 -1
- package/dist/s-form/s-form.js +0 -1
- package/dist/s-icon-button/s-icon-button.d.ts +9 -9
- package/dist/s-icon-button/s-icon-button.d.ts.map +1 -1
- package/dist/s-icon-button/s-icon-button.js +38 -4
- package/dist/s-image-comparison/s-image-comparison.d.ts +3 -5
- package/dist/s-image-comparison/s-image-comparison.d.ts.map +1 -1
- package/dist/s-image-comparison/s-image-comparison.js +75 -102
- package/dist/s-label/s-label.d.ts +0 -1
- package/dist/s-label/s-label.d.ts.map +1 -1
- package/dist/s-label/s-label.js +8 -24
- package/dist/s-language-switcher/s-language-switcher.d.ts +2 -5
- package/dist/s-language-switcher/s-language-switcher.d.ts.map +1 -1
- package/dist/s-language-switcher/s-language-switcher.js +14 -25
- package/dist/s-lazy-image/s-lazy-image.d.ts +4 -6
- package/dist/s-lazy-image/s-lazy-image.d.ts.map +1 -1
- package/dist/s-lazy-image/s-lazy-image.js +37 -34
- package/dist/s-moving-border/s-moving-border.d.ts +0 -2
- package/dist/s-moving-border/s-moving-border.d.ts.map +1 -1
- package/dist/s-moving-border/s-moving-border.js +19 -24
- package/dist/s-multi-select/s-multi-select.d.ts +0 -2
- package/dist/s-multi-select/s-multi-select.d.ts.map +1 -1
- package/dist/s-multi-select/s-multi-select.js +54 -105
- package/dist/s-pagination/s-pagination.d.ts +12 -6
- package/dist/s-pagination/s-pagination.d.ts.map +1 -1
- package/dist/s-pagination/s-pagination.js +69 -43
- package/dist/s-rating/s-rating.d.ts +0 -2
- package/dist/s-rating/s-rating.d.ts.map +1 -1
- package/dist/s-rating/s-rating.js +31 -29
- package/dist/s-review/s-review.d.ts +6 -8
- package/dist/s-review/s-review.d.ts.map +1 -1
- package/dist/s-review/s-review.js +66 -153
- package/dist/s-scroll-to-top/s-scroll-to-top.d.ts +0 -2
- package/dist/s-scroll-to-top/s-scroll-to-top.d.ts.map +1 -1
- package/dist/s-scroll-to-top/s-scroll-to-top.js +17 -32
- package/dist/s-select/s-select.d.ts +5 -5
- package/dist/s-select/s-select.d.ts.map +1 -1
- package/dist/s-select/s-select.js +54 -94
- package/dist/s-select-list/s-select-list.d.ts +0 -2
- package/dist/s-select-list/s-select-list.d.ts.map +1 -1
- package/dist/s-select-list/s-select-list.js +24 -38
- package/dist/s-skeleton/index.d.ts +3 -0
- package/dist/s-skeleton/index.d.ts.map +1 -0
- package/dist/s-skeleton/index.js +1 -0
- package/dist/s-skeleton/s-skeleton.d.ts +27 -0
- package/dist/s-skeleton/s-skeleton.d.ts.map +1 -0
- package/dist/s-skeleton/s-skeleton.js +126 -0
- package/dist/s-switch/index.d.ts +3 -0
- package/dist/s-switch/index.d.ts.map +1 -0
- package/dist/s-switch/index.js +1 -0
- package/dist/s-switch/s-switch.d.ts +30 -0
- package/dist/s-switch/s-switch.d.ts.map +1 -0
- package/dist/s-switch/s-switch.js +44 -0
- package/dist/s-text-field/s-text-field.d.ts +0 -2
- package/dist/s-text-field/s-text-field.d.ts.map +1 -1
- package/dist/s-text-field/s-text-field.js +10 -23
- package/dist/s-text-shimmer/s-text-shimmer.d.ts +0 -14
- package/dist/s-text-shimmer/s-text-shimmer.d.ts.map +1 -1
- package/dist/s-text-shimmer/s-text-shimmer.js +28 -46
- package/dist/s-text-truncation/s-text-truncation.d.ts +4 -7
- package/dist/s-text-truncation/s-text-truncation.d.ts.map +1 -1
- package/dist/s-text-truncation/s-text-truncation.js +74 -34
- package/dist/s-tip/s-tip.d.ts +0 -1
- package/dist/s-tip/s-tip.d.ts.map +1 -1
- package/dist/s-tip/s-tip.js +9 -16
- package/dist/s-tooltip/index.d.ts +2 -0
- package/dist/s-tooltip/index.d.ts.map +1 -0
- package/dist/s-tooltip/index.js +1 -0
- package/dist/s-tooltip/s-tooltip.d.ts +23 -0
- package/dist/s-tooltip/s-tooltip.d.ts.map +1 -0
- package/dist/s-tooltip/s-tooltip.js +17 -0
- package/dist/s-zoom-image/s-zoom-image.d.ts +3 -5
- package/dist/s-zoom-image/s-zoom-image.d.ts.map +1 -1
- package/dist/s-zoom-image/s-zoom-image.js +16 -21
- package/dist/theme/theme-primitives.d.ts +10 -0
- package/dist/theme/theme-primitives.d.ts.map +1 -1
- package/dist/theme/theme-primitives.js +11 -0
- package/dist/utils/bytes-to-size.d.ts +0 -1
- package/dist/utils/bytes-to-size.d.ts.map +1 -1
- package/dist/utils/bytes-to-size.js +0 -1
- package/package.json +3 -2
|
@@ -2,7 +2,6 @@ import React from 'react';
|
|
|
2
2
|
import { type StyleProp, type ViewStyle } from 'react-native';
|
|
3
3
|
/**
|
|
4
4
|
* Custom file type that represents a file with basic information
|
|
5
|
-
* Synced with web SFileDropzone from @solostylist/ui-kit
|
|
6
5
|
*/
|
|
7
6
|
export type CustomFile = {
|
|
8
7
|
/** File name with extension */
|
|
@@ -16,7 +15,6 @@ export type CustomFile = {
|
|
|
16
15
|
};
|
|
17
16
|
/**
|
|
18
17
|
* Props interface for SFileDropzone component
|
|
19
|
-
* Synced with web SFileDropzone from @solostylist/ui-kit
|
|
20
18
|
*/
|
|
21
19
|
export interface SFileDropzoneProps {
|
|
22
20
|
/** Additional hint text displayed below the main upload message */
|
|
@@ -56,39 +54,6 @@ export interface SFileDropzoneProps {
|
|
|
56
54
|
* A file dropzone component for React Native with file management and form integration.
|
|
57
55
|
* Since React Native doesn't support drag-and-drop, this component provides a pressable
|
|
58
56
|
* area that can be used with expo-document-picker or similar libraries.
|
|
59
|
-
* Synced with web SFileDropzone from @solostylist/ui-kit for cross-platform consistency.
|
|
60
|
-
*
|
|
61
|
-
* @example
|
|
62
|
-
* ```tsx
|
|
63
|
-
* import * as DocumentPicker from 'expo-document-picker';
|
|
64
|
-
* import { SFileDropzone } from '@solostylist/ui-kit-native';
|
|
65
|
-
*
|
|
66
|
-
* const [files, setFiles] = useState<CustomFile[]>([]);
|
|
67
|
-
*
|
|
68
|
-
* const handlePickFiles = async () => {
|
|
69
|
-
* const result = await DocumentPicker.getDocumentAsync({
|
|
70
|
-
* type: '*\/*',
|
|
71
|
-
* multiple: true,
|
|
72
|
-
* });
|
|
73
|
-
*
|
|
74
|
-
* if (result.type === 'success') {
|
|
75
|
-
* setFiles([...files, {
|
|
76
|
-
* name: result.name,
|
|
77
|
-
* size: result.size,
|
|
78
|
-
* uri: result.uri,
|
|
79
|
-
* type: result.mimeType,
|
|
80
|
-
* }]);
|
|
81
|
-
* }
|
|
82
|
-
* };
|
|
83
|
-
*
|
|
84
|
-
* <SFileDropzone
|
|
85
|
-
* label="Upload Files"
|
|
86
|
-
* files={files}
|
|
87
|
-
* onPress={handlePickFiles}
|
|
88
|
-
* onRemove={(file) => setFiles(files.filter(f => f.name !== file.name))}
|
|
89
|
-
* onRemoveAll={() => setFiles([])}
|
|
90
|
-
* />
|
|
91
|
-
* ```
|
|
92
57
|
*/
|
|
93
58
|
export declare const SFileDropzone: {
|
|
94
59
|
({ hint, label, error, onRemoveAll, onRemove, onPress, onFilesChange, required, isShowBtnRemoveAll, disabled, files, style, enableBuiltInPicker, multiple, accept, }: SFileDropzoneProps): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s-file-dropzone.d.ts","sourceRoot":"","sources":["../../src/s-file-dropzone/s-file-dropzone.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"s-file-dropzone.d.ts","sourceRoot":"","sources":["../../src/s-file-dropzone/s-file-dropzone.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAA+B,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAU3F;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,uCAAuC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC9C,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa;0KAgBvB,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;CA6KxC,CAAC;AAIF,eAAe,aAAa,CAAC"}
|
|
@@ -2,50 +2,19 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
|
3
3
|
import * as DocumentPicker from 'expo-document-picker';
|
|
4
4
|
import { useMemo } from 'react';
|
|
5
|
-
import { Pressable, ScrollView,
|
|
6
|
-
import { Button, Text } from 'react-native-paper';
|
|
5
|
+
import { Pressable, ScrollView, View } from 'react-native';
|
|
7
6
|
import { gray, lightGray } from '@solostylist/core';
|
|
7
|
+
import { SButton } from '../s-button';
|
|
8
8
|
import { SFileIcon } from '../s-file-icon';
|
|
9
9
|
import { SForm } from '../s-form';
|
|
10
|
+
import { SIconButton } from '../s-icon-button';
|
|
11
|
+
import { SText } from '../s-text';
|
|
10
12
|
import { useSTheme } from '../theme';
|
|
11
13
|
import { bytesToSize } from '../utils';
|
|
12
14
|
/**
|
|
13
15
|
* A file dropzone component for React Native with file management and form integration.
|
|
14
16
|
* Since React Native doesn't support drag-and-drop, this component provides a pressable
|
|
15
17
|
* area that can be used with expo-document-picker or similar libraries.
|
|
16
|
-
* Synced with web SFileDropzone from @solostylist/ui-kit for cross-platform consistency.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```tsx
|
|
20
|
-
* import * as DocumentPicker from 'expo-document-picker';
|
|
21
|
-
* import { SFileDropzone } from '@solostylist/ui-kit-native';
|
|
22
|
-
*
|
|
23
|
-
* const [files, setFiles] = useState<CustomFile[]>([]);
|
|
24
|
-
*
|
|
25
|
-
* const handlePickFiles = async () => {
|
|
26
|
-
* const result = await DocumentPicker.getDocumentAsync({
|
|
27
|
-
* type: '*\/*',
|
|
28
|
-
* multiple: true,
|
|
29
|
-
* });
|
|
30
|
-
*
|
|
31
|
-
* if (result.type === 'success') {
|
|
32
|
-
* setFiles([...files, {
|
|
33
|
-
* name: result.name,
|
|
34
|
-
* size: result.size,
|
|
35
|
-
* uri: result.uri,
|
|
36
|
-
* type: result.mimeType,
|
|
37
|
-
* }]);
|
|
38
|
-
* }
|
|
39
|
-
* };
|
|
40
|
-
*
|
|
41
|
-
* <SFileDropzone
|
|
42
|
-
* label="Upload Files"
|
|
43
|
-
* files={files}
|
|
44
|
-
* onPress={handlePickFiles}
|
|
45
|
-
* onRemove={(file) => setFiles(files.filter(f => f.name !== file.name))}
|
|
46
|
-
* onRemoveAll={() => setFiles([])}
|
|
47
|
-
* />
|
|
48
|
-
* ```
|
|
49
18
|
*/
|
|
50
19
|
export const SFileDropzone = ({ hint, label = '', error, onRemoveAll, onRemove, onPress, onFilesChange, required = false, isShowBtnRemoveAll = false, disabled = false, files = [], style, enableBuiltInPicker = true, multiple = true, accept, }) => {
|
|
51
20
|
const { theme } = useSTheme();
|
|
@@ -62,86 +31,6 @@ export const SFileDropzone = ({ hint, label = '', error, onRemoveAll, onRemove,
|
|
|
62
31
|
disabledText: grayPalette[500],
|
|
63
32
|
};
|
|
64
33
|
}, [theme.dark, theme.colors.text.primary]);
|
|
65
|
-
const styles = useMemo(() => StyleSheet.create({
|
|
66
|
-
container: {
|
|
67
|
-
width: '100%',
|
|
68
|
-
},
|
|
69
|
-
dropzoneContainer: {
|
|
70
|
-
alignItems: 'center',
|
|
71
|
-
borderWidth: 1,
|
|
72
|
-
borderStyle: 'dashed',
|
|
73
|
-
borderColor: colors.borderColor,
|
|
74
|
-
borderRadius: theme.borderRadius.md,
|
|
75
|
-
paddingVertical: theme.spacing.xl,
|
|
76
|
-
paddingHorizontal: theme.spacing.md,
|
|
77
|
-
backgroundColor: disabled ? colors.disabledBackground : 'transparent',
|
|
78
|
-
},
|
|
79
|
-
dropzoneContent: {
|
|
80
|
-
flexDirection: 'row',
|
|
81
|
-
alignItems: 'center',
|
|
82
|
-
gap: theme.spacing.sm,
|
|
83
|
-
},
|
|
84
|
-
iconContainer: {
|
|
85
|
-
width: 48,
|
|
86
|
-
height: 48,
|
|
87
|
-
borderRadius: 24,
|
|
88
|
-
borderWidth: 1,
|
|
89
|
-
borderStyle: 'dashed',
|
|
90
|
-
borderColor: colors.borderColor,
|
|
91
|
-
alignItems: 'center',
|
|
92
|
-
justifyContent: 'center',
|
|
93
|
-
backgroundColor: 'transparent',
|
|
94
|
-
},
|
|
95
|
-
textContainer: {
|
|
96
|
-
flex: 1,
|
|
97
|
-
gap: theme.spacing.xs,
|
|
98
|
-
},
|
|
99
|
-
uploadText: {
|
|
100
|
-
fontFamily: theme.typography.fontFamily,
|
|
101
|
-
fontSize: 14,
|
|
102
|
-
color: disabled ? colors.disabledText : colors.textSecondary,
|
|
103
|
-
},
|
|
104
|
-
underlinedText: {
|
|
105
|
-
textDecorationLine: 'underline',
|
|
106
|
-
},
|
|
107
|
-
fileListContainer: {
|
|
108
|
-
marginTop: theme.spacing.sm,
|
|
109
|
-
gap: theme.spacing.sm,
|
|
110
|
-
},
|
|
111
|
-
fileItem: {
|
|
112
|
-
flexDirection: 'row',
|
|
113
|
-
alignItems: 'center',
|
|
114
|
-
gap: theme.spacing.md,
|
|
115
|
-
borderWidth: 1,
|
|
116
|
-
borderColor: colors.borderColor,
|
|
117
|
-
borderRadius: theme.borderRadius.md,
|
|
118
|
-
padding: theme.spacing.sm,
|
|
119
|
-
},
|
|
120
|
-
fileInfoContainer: {
|
|
121
|
-
flex: 1,
|
|
122
|
-
},
|
|
123
|
-
fileName: {
|
|
124
|
-
fontFamily: theme.typography.fontFamily,
|
|
125
|
-
fontSize: 14,
|
|
126
|
-
fontWeight: '600',
|
|
127
|
-
color: colors.textPrimary,
|
|
128
|
-
marginBottom: 2,
|
|
129
|
-
},
|
|
130
|
-
fileSize: {
|
|
131
|
-
fontFamily: theme.typography.fontFamily,
|
|
132
|
-
fontSize: 12,
|
|
133
|
-
color: colors.textSecondary,
|
|
134
|
-
},
|
|
135
|
-
removeButton: {
|
|
136
|
-
padding: theme.spacing.xs,
|
|
137
|
-
},
|
|
138
|
-
actionsContainer: {
|
|
139
|
-
flexDirection: 'row',
|
|
140
|
-
alignItems: 'center',
|
|
141
|
-
justifyContent: 'flex-end',
|
|
142
|
-
marginTop: theme.spacing.sm,
|
|
143
|
-
},
|
|
144
|
-
}), [theme, colors, disabled]);
|
|
145
34
|
const handlePress = async () => {
|
|
146
35
|
if (disabled)
|
|
147
36
|
return;
|
|
@@ -176,14 +65,51 @@ export const SFileDropzone = ({ hint, label = '', error, onRemoveAll, onRemove,
|
|
|
176
65
|
}
|
|
177
66
|
}
|
|
178
67
|
};
|
|
179
|
-
return (_jsxs(View, { style: [
|
|
180
|
-
|
|
68
|
+
return (_jsxs(View, { style: [{ width: '100%' }, style], children: [_jsx(SForm, { error: error, label: label, required: required, hint: hint, children: _jsx(Pressable, { onPress: handlePress, disabled: disabled, style: ({ pressed }) => [
|
|
69
|
+
{
|
|
70
|
+
alignItems: 'center',
|
|
71
|
+
borderWidth: 1,
|
|
72
|
+
borderStyle: 'dashed',
|
|
73
|
+
borderColor: colors.borderColor,
|
|
74
|
+
borderRadius: theme.borderRadius.md,
|
|
75
|
+
paddingVertical: theme.spacing.xl,
|
|
76
|
+
paddingHorizontal: theme.spacing.md,
|
|
77
|
+
backgroundColor: disabled ? colors.disabledBackground : 'transparent',
|
|
78
|
+
},
|
|
181
79
|
pressed && !disabled && { backgroundColor: colors.hoverBackground },
|
|
182
|
-
], android_ripple: !disabled ? { color: colors.hoverBackground } : undefined, children: _jsxs(View, { style:
|
|
80
|
+
], android_ripple: !disabled ? { color: colors.hoverBackground } : undefined, children: _jsxs(View, { style: {
|
|
81
|
+
flexDirection: 'row',
|
|
82
|
+
alignItems: 'center',
|
|
83
|
+
gap: theme.spacing.sm,
|
|
84
|
+
}, children: [_jsx(View, { style: {
|
|
85
|
+
width: 36,
|
|
86
|
+
height: 36,
|
|
87
|
+
borderRadius: 24,
|
|
88
|
+
borderWidth: 1,
|
|
89
|
+
borderStyle: 'dashed',
|
|
90
|
+
borderColor: colors.borderColor,
|
|
91
|
+
alignItems: 'center',
|
|
92
|
+
justifyContent: 'center',
|
|
93
|
+
backgroundColor: 'transparent',
|
|
94
|
+
}, children: _jsx(MaterialCommunityIcons, { name: "cloud-upload-outline", size: 16, color: disabled ? colors.disabledText : colors.iconColor }) }), _jsx(View, { style: { flex: 1, gap: theme.spacing.xs }, children: _jsxs(SText, { color: "text.secondary", children: [_jsx(SText, { style: { textDecorationLine: 'underline' }, children: "Tap to upload" }), " your files here"] }) })] }) }) }), files.length > 0 && (_jsxs(View, { style: { marginTop: theme.spacing.sm, gap: theme.spacing.sm }, children: [_jsx(ScrollView, { children: files.map((file, index) => {
|
|
183
95
|
// Extract file extension for icon display
|
|
184
96
|
const extension = file.name.split('.').pop();
|
|
185
|
-
return (_jsxs(View, { style:
|
|
186
|
-
|
|
97
|
+
return (_jsxs(View, { style: {
|
|
98
|
+
flexDirection: 'row',
|
|
99
|
+
alignItems: 'center',
|
|
100
|
+
gap: theme.spacing.md,
|
|
101
|
+
borderWidth: 1,
|
|
102
|
+
borderColor: colors.borderColor,
|
|
103
|
+
borderRadius: theme.borderRadius.md,
|
|
104
|
+
padding: theme.spacing.sm,
|
|
105
|
+
marginTop: theme.spacing.sm,
|
|
106
|
+
}, children: [_jsx(SFileIcon, { extension: extension, size: 44 }), _jsxs(View, { style: { flex: 1 }, children: [_jsx(SText, { variant: "body1", numberOfLines: 1, children: file.name }), _jsx(SText, { variant: "caption", children: bytesToSize(file.size) })] }), _jsx(SIconButton, { icon: "close", iconColor: colors.iconColor, onPress: () => onRemove?.(file) })] }, `${file.name}-${index}`));
|
|
107
|
+
}) }), isShowBtnRemoveAll && (_jsx(View, { style: {
|
|
108
|
+
flexDirection: 'row',
|
|
109
|
+
alignItems: 'center',
|
|
110
|
+
justifyContent: 'flex-end',
|
|
111
|
+
marginTop: theme.spacing.sm,
|
|
112
|
+
}, children: _jsx(SButton, { variant: "text", onPress: onRemoveAll, children: "Remove all" }) }))] }))] }));
|
|
187
113
|
};
|
|
188
114
|
SFileDropzone.displayName = 'SFileDropzone';
|
|
189
115
|
export default SFileDropzone;
|
|
@@ -2,7 +2,6 @@ import React from 'react';
|
|
|
2
2
|
import { type StyleProp, type ViewStyle } from 'react-native';
|
|
3
3
|
/**
|
|
4
4
|
* Props for the SFileIcon component
|
|
5
|
-
* Synced with web SFileIcon from @solostylist/ui-kit
|
|
6
5
|
*/
|
|
7
6
|
export interface SFileIconProps {
|
|
8
7
|
/** File extension (without dot) to determine which icon to display */
|
|
@@ -15,7 +14,6 @@ export interface SFileIconProps {
|
|
|
15
14
|
/**
|
|
16
15
|
* A file type icon component that displays appropriate icons based on file extensions.
|
|
17
16
|
* Built with @expo/vector-icons MaterialCommunityIcons for React Native.
|
|
18
|
-
* Synced with web SFileIcon from @solostylist/ui-kit for cross-platform consistency.
|
|
19
17
|
*/
|
|
20
18
|
export declare const SFileIcon: {
|
|
21
19
|
({ extension, size, style }: SFileIconProps): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s-file-icon.d.ts","sourceRoot":"","sources":["../../src/s-file-icon/s-file-icon.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"s-file-icon.d.ts","sourceRoot":"","sources":["../../src/s-file-icon/s-file-icon.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAUD;;;GAGG;AACH,eAAO,MAAM,SAAS;iCAAqC,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;CAmF5F,CAAC;AAIF,eAAe,SAAS,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { View } from 'react-native';
|
|
5
5
|
/**
|
|
6
6
|
* A file type icon component that displays appropriate icons based on file extensions.
|
|
7
7
|
* Built with @expo/vector-icons MaterialCommunityIcons for React Native.
|
|
8
|
-
* Synced with web SFileIcon from @solostylist/ui-kit for cross-platform consistency.
|
|
9
8
|
*/
|
|
10
9
|
export const SFileIcon = ({ extension, size = 36, style }) => {
|
|
11
10
|
const iconConfig = useMemo(() => {
|
|
@@ -72,16 +71,16 @@ export const SFileIcon = ({ extension, size = 36, style }) => {
|
|
|
72
71
|
return { name: 'file', color: '#6366F1' };
|
|
73
72
|
}
|
|
74
73
|
}, [extension]);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
74
|
+
return (_jsx(View, { style: [
|
|
75
|
+
{
|
|
76
|
+
alignItems: 'center',
|
|
77
|
+
display: 'flex',
|
|
78
|
+
justifyContent: 'center',
|
|
79
|
+
width: size,
|
|
80
|
+
height: size,
|
|
81
|
+
},
|
|
82
|
+
style,
|
|
83
|
+
], children: _jsx(MaterialCommunityIcons, { name: iconConfig.name, size: size, color: iconConfig.color }) }));
|
|
85
84
|
};
|
|
86
85
|
SFileIcon.displayName = 'SFileIcon';
|
|
87
86
|
export default SFileIcon;
|
package/dist/s-form/s-form.d.ts
CHANGED
|
@@ -16,7 +16,6 @@ export interface SFormProps {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* A form wrapper component that provides consistent labeling, error handling, and help text.
|
|
19
|
-
* Synced with web SForm component from @solostylist/ui-kit.
|
|
20
19
|
*/
|
|
21
20
|
export declare const SForm: {
|
|
22
21
|
({ label, hint, error, required, children }: SFormProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s-form.d.ts","sourceRoot":"","sources":["../../src/s-form/s-form.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED
|
|
1
|
+
{"version":3,"file":"s-form.d.ts","sourceRoot":"","sources":["../../src/s-form/s-form.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,KAAK;iDAAwD,UAAU;;CAkDnF,CAAC;AAIF,eAAe,KAAK,CAAC"}
|
package/dist/s-form/s-form.js
CHANGED
|
@@ -5,7 +5,6 @@ import { SText } from '../s-text';
|
|
|
5
5
|
import { useSTheme } from '../theme';
|
|
6
6
|
/**
|
|
7
7
|
* A form wrapper component that provides consistent labeling, error handling, and help text.
|
|
8
|
-
* Synced with web SForm component from @solostylist/ui-kit.
|
|
9
8
|
*/
|
|
10
9
|
export const SForm = ({ label, hint, error, required = false, children }) => {
|
|
11
10
|
const { theme } = useSTheme();
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type IconButtonProps } from 'react-native-paper';
|
|
3
|
+
import type { SButtonColor } from '../s-button/s-button';
|
|
3
4
|
/**
|
|
4
5
|
* Tooltip options for SIconButton
|
|
5
|
-
* Similar to web version but adapted for React Native
|
|
6
6
|
*/
|
|
7
7
|
export interface SIconButtonTooltipOptions {
|
|
8
8
|
/** Tooltip text content */
|
|
9
9
|
title: string;
|
|
10
|
-
/**
|
|
10
|
+
/** Delay before showing the tooltip (in ms) */
|
|
11
11
|
enterDelay?: number;
|
|
12
|
-
/**
|
|
12
|
+
/** Delay before hiding the tooltip (in ms) */
|
|
13
13
|
leaveDelay?: number;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Props interface for SIconButton component
|
|
17
|
-
* Synced with web SIconButton from @solostylist/ui-kit
|
|
18
17
|
*/
|
|
19
18
|
export interface SIconButtonProps extends Omit<IconButtonProps, 'theme' | 'size'> {
|
|
20
|
-
/** Icon name from Material Community Icons */
|
|
21
|
-
icon:
|
|
19
|
+
/** Icon name from Material Community Icons or an IconComponent */
|
|
20
|
+
icon: IconButtonProps['icon'];
|
|
22
21
|
/** Size of the icon button - matches web MUI sizes */
|
|
23
22
|
size?: 'small' | 'medium' | 'large';
|
|
24
|
-
/**
|
|
23
|
+
/** Theme color of the button */
|
|
24
|
+
color?: SButtonColor;
|
|
25
|
+
/** Icon color (overrides color prop) */
|
|
25
26
|
iconColor?: string;
|
|
26
27
|
/** Container color (background) */
|
|
27
28
|
containerColor?: string;
|
|
@@ -36,10 +37,9 @@ export interface SIconButtonProps extends Omit<IconButtonProps, 'theme' | 'size'
|
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
* An enhanced icon button component with optional tooltip integration.
|
|
39
|
-
* Synced with web SIconButton from @solostylist/ui-kit.
|
|
40
40
|
*/
|
|
41
41
|
export declare const SIconButton: {
|
|
42
|
-
({ icon, size, iconColor, containerColor, disabled, accessibilityLabel, onPress, style, tooltipOptions, ...props }: SIconButtonProps): React.JSX.Element;
|
|
42
|
+
({ icon, size, color, iconColor, containerColor, disabled, accessibilityLabel, onPress, style, tooltipOptions, ...props }: SIconButtonProps): React.JSX.Element;
|
|
43
43
|
displayName: string;
|
|
44
44
|
};
|
|
45
45
|
export default SIconButton;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s-icon-button.d.ts","sourceRoot":"","sources":["../../src/s-icon-button/s-icon-button.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"s-icon-button.d.ts","sourceRoot":"","sources":["../../src/s-icon-button/s-icon-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAgBtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyBD;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/E,kEAAkE;IAClE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,gCAAgC;IAChC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,uFAAuF;IACvF,cAAc,CAAC,EAAE,yBAAyB,CAAC;CAC5C;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;+HAYrB,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;CAgFtC,CAAC;AAIF,eAAe,WAAW,CAAC"}
|
|
@@ -1,12 +1,36 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
2
3
|
import { StyleSheet } from 'react-native';
|
|
3
|
-
import { IconButton
|
|
4
|
+
import { IconButton } from 'react-native-paper';
|
|
5
|
+
import { blue, brand, green, lightBlue, lightBrand, lightGreen, lightOrange, lightPurple, lightRed, orange, purple, red, } from '@solostylist/core';
|
|
6
|
+
import { STooltip } from '../s-tooltip';
|
|
4
7
|
import { useSTheme } from '../theme';
|
|
8
|
+
/**
|
|
9
|
+
* Get color palettes for light and dark modes
|
|
10
|
+
* Copied from SButton to ensure consistency
|
|
11
|
+
*/
|
|
12
|
+
const getColorPalettes = (color) => {
|
|
13
|
+
switch (color) {
|
|
14
|
+
case 'primary':
|
|
15
|
+
return { light: lightBrand, dark: brand };
|
|
16
|
+
case 'secondary':
|
|
17
|
+
return { light: lightPurple, dark: purple };
|
|
18
|
+
case 'success':
|
|
19
|
+
return { light: lightGreen, dark: green };
|
|
20
|
+
case 'error':
|
|
21
|
+
return { light: lightRed, dark: red };
|
|
22
|
+
case 'info':
|
|
23
|
+
return { light: lightBlue, dark: blue };
|
|
24
|
+
case 'warning':
|
|
25
|
+
return { light: lightOrange, dark: orange };
|
|
26
|
+
default:
|
|
27
|
+
return { light: lightBrand, dark: brand };
|
|
28
|
+
}
|
|
29
|
+
};
|
|
5
30
|
/**
|
|
6
31
|
* An enhanced icon button component with optional tooltip integration.
|
|
7
|
-
* Synced with web SIconButton from @solostylist/ui-kit.
|
|
8
32
|
*/
|
|
9
|
-
export const SIconButton = ({ icon, size = 'medium', iconColor, containerColor, disabled = false, accessibilityLabel, onPress, style, tooltipOptions, ...props }) => {
|
|
33
|
+
export const SIconButton = ({ icon, size = 'medium', color, iconColor, containerColor, disabled = false, accessibilityLabel, onPress, style, tooltipOptions, ...props }) => {
|
|
10
34
|
const { theme } = useSTheme();
|
|
11
35
|
// Map size to icon size - matches web MUI sizes
|
|
12
36
|
// small: 12px, medium: 16px, large: 20px
|
|
@@ -33,12 +57,22 @@ export const SIconButton = ({ icon, size = 'medium', iconColor, containerColor,
|
|
|
33
57
|
return 'transparent';
|
|
34
58
|
return 'transparent';
|
|
35
59
|
};
|
|
60
|
+
// Calculate generic color from palette if provided
|
|
61
|
+
const paletteColor = useMemo(() => {
|
|
62
|
+
if (!color)
|
|
63
|
+
return undefined;
|
|
64
|
+
const { light: lightPalette, dark: darkPalette } = getColorPalettes(color);
|
|
65
|
+
const palette = theme.dark ? darkPalette : lightPalette;
|
|
66
|
+
return palette[500];
|
|
67
|
+
}, [color, theme.dark]);
|
|
36
68
|
// Get icon color
|
|
37
69
|
const getIconColor = () => {
|
|
38
70
|
if (iconColor)
|
|
39
71
|
return iconColor;
|
|
40
72
|
if (disabled)
|
|
41
73
|
return theme.colors.text.disabled;
|
|
74
|
+
if (paletteColor)
|
|
75
|
+
return paletteColor;
|
|
42
76
|
return defaultIconColor;
|
|
43
77
|
};
|
|
44
78
|
const styles = StyleSheet.create({
|
|
@@ -49,7 +83,7 @@ export const SIconButton = ({ icon, size = 'medium', iconColor, containerColor,
|
|
|
49
83
|
const iconButton = (_jsx(IconButton, { icon: icon, size: iconSize, iconColor: getIconColor(), containerColor: getContainerColor(), disabled: disabled, onPress: onPress, accessibilityLabel: accessibilityLabel, style: [styles.button, style], ...props }));
|
|
50
84
|
// Wrap with tooltip if tooltipOptions is provided
|
|
51
85
|
if (tooltipOptions) {
|
|
52
|
-
return (_jsx(
|
|
86
|
+
return (_jsx(STooltip, { title: tooltipOptions.title, enterDelay: tooltipOptions.enterDelay ?? 0, leaveDelay: tooltipOptions.leaveDelay ?? 0, children: iconButton }));
|
|
53
87
|
}
|
|
54
88
|
return iconButton;
|
|
55
89
|
};
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { type StyleProp, type ViewStyle } from 'react-native';
|
|
2
|
+
import { type ImageSourcePropType, type StyleProp, type ViewStyle } from 'react-native';
|
|
3
3
|
/**
|
|
4
4
|
* Props interface for SImageComparison component
|
|
5
|
-
* Synced with web SImageComparison from @solostylist/ui-kit
|
|
6
5
|
*/
|
|
7
6
|
export interface SImageComparisonProps {
|
|
8
7
|
/** Left image URL or array of URLs for multiple comparison sources */
|
|
9
|
-
leftImage:
|
|
8
|
+
leftImage: ImageSourcePropType | Array<ImageSourcePropType>;
|
|
10
9
|
/** Right image URL */
|
|
11
|
-
rightImage:
|
|
10
|
+
rightImage: ImageSourcePropType;
|
|
12
11
|
/** Alt text for left image(s) */
|
|
13
12
|
altLeft?: string | string[];
|
|
14
13
|
/** Alt text for right image */
|
|
@@ -27,7 +26,6 @@ export interface SImageComparisonProps {
|
|
|
27
26
|
/**
|
|
28
27
|
* An image comparison component with a draggable slider to compare before/after images.
|
|
29
28
|
* Built with React Native Gesture Handler for smooth drag interactions.
|
|
30
|
-
* Synced with web SImageComparison from @solostylist/ui-kit for cross-platform consistency.
|
|
31
29
|
*/
|
|
32
30
|
export declare const SImageComparison: {
|
|
33
31
|
({ leftImage, rightImage, initialPosition, height, width, style, borderRadius, }: SImageComparisonProps): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s-image-comparison.d.ts","sourceRoot":"","sources":["../../src/s-image-comparison/s-image-comparison.tsx"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"s-image-comparison.d.ts","sourceRoot":"","sources":["../../src/s-image-comparison/s-image-comparison.tsx"],"names":[],"mappings":"AACA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAChD,OAAO,EAKL,KAAK,mBAAmB,EAExB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAKtB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,SAAS,EAAE,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC5D,sBAAsB;IACtB,UAAU,EAAE,mBAAmB,CAAC;IAChC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;sFAQ1B,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;CAoM3C,CAAC;AAIF,eAAe,gBAAgB,CAAC"}
|