@demlanide/react-lucky-components 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +184 -0
- package/dist/Alert/Alert.d.ts +3 -0
- package/dist/Alert/Alert.d.ts.map +1 -0
- package/dist/Alert/Alert.js +7 -0
- package/dist/Alert/constants.d.ts +38 -0
- package/dist/Alert/constants.d.ts.map +1 -0
- package/dist/Alert/constants.js +34 -0
- package/dist/Alert/index.d.ts +3 -0
- package/dist/Alert/index.d.ts.map +1 -0
- package/dist/Alert/index.js +1 -0
- package/dist/Alert/styles.d.ts +11 -0
- package/dist/Alert/styles.d.ts.map +1 -0
- package/dist/Alert/styles.js +49 -0
- package/dist/Alert/types.d.ts +20 -0
- package/dist/Alert/types.d.ts.map +1 -0
- package/dist/Alert/types.js +1 -0
- package/dist/Avatar/Avatar.d.ts +3 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -0
- package/dist/Avatar/Avatar.js +33 -0
- package/dist/Avatar/Shapes/.map.json +42 -0
- package/dist/Avatar/Shapes/romb.png +0 -0
- package/dist/Avatar/consts.d.ts +21 -0
- package/dist/Avatar/consts.d.ts.map +1 -0
- package/dist/Avatar/consts.js +20 -0
- package/dist/Avatar/index.d.ts +3 -0
- package/dist/Avatar/index.d.ts.map +1 -0
- package/dist/Avatar/index.js +1 -0
- package/dist/Avatar/styles.d.ts +27 -0
- package/dist/Avatar/styles.d.ts.map +1 -0
- package/dist/Avatar/styles.js +83 -0
- package/dist/Avatar/types.d.ts +31 -0
- package/dist/Avatar/types.d.ts.map +1 -0
- package/dist/Avatar/types.js +1 -0
- package/dist/Avatar/utilities.d.ts +8 -0
- package/dist/Avatar/utilities.d.ts.map +1 -0
- package/dist/Avatar/utilities.js +66 -0
- package/dist/Badge/Badge.d.ts +3 -0
- package/dist/Badge/Badge.d.ts.map +1 -0
- package/dist/Badge/Badge.js +8 -0
- package/dist/Badge/constants.d.ts +20 -0
- package/dist/Badge/constants.d.ts.map +1 -0
- package/dist/Badge/constants.js +32 -0
- package/dist/Badge/index.d.ts +3 -0
- package/dist/Badge/index.d.ts.map +1 -0
- package/dist/Badge/index.js +1 -0
- package/dist/Badge/styles.d.ts +10 -0
- package/dist/Badge/styles.d.ts.map +1 -0
- package/dist/Badge/styles.js +28 -0
- package/dist/Badge/types.d.ts +18 -0
- package/dist/Badge/types.d.ts.map +1 -0
- package/dist/Badge/types.js +1 -0
- package/dist/BigInput/BigInput.d.ts +3 -0
- package/dist/BigInput/BigInput.d.ts.map +1 -0
- package/dist/BigInput/BigInput.js +46 -0
- package/dist/BigInput/constants.d.ts +32 -0
- package/dist/BigInput/constants.d.ts.map +1 -0
- package/dist/BigInput/constants.js +31 -0
- package/dist/BigInput/index.d.ts +3 -0
- package/dist/BigInput/index.d.ts.map +1 -0
- package/dist/BigInput/index.js +1 -0
- package/dist/BigInput/styles.d.ts +14 -0
- package/dist/BigInput/styles.d.ts.map +1 -0
- package/dist/BigInput/styles.js +80 -0
- package/dist/BigInput/types.d.ts +23 -0
- package/dist/BigInput/types.d.ts.map +1 -0
- package/dist/BigInput/types.js +1 -0
- package/dist/Button/Button.d.ts +3 -0
- package/dist/Button/Button.d.ts.map +1 -0
- package/dist/Button/Button.js +7 -0
- package/dist/Button/constants.d.ts +23 -0
- package/dist/Button/constants.d.ts.map +1 -0
- package/dist/Button/constants.js +28 -0
- package/dist/Button/index.d.ts +3 -0
- package/dist/Button/index.d.ts.map +1 -0
- package/dist/Button/index.js +1 -0
- package/dist/Button/styles.d.ts +13 -0
- package/dist/Button/styles.d.ts.map +1 -0
- package/dist/Button/styles.js +34 -0
- package/dist/Button/types.d.ts +20 -0
- package/dist/Button/types.d.ts.map +1 -0
- package/dist/Button/types.js +1 -0
- package/dist/CardStack/BehindCard.d.ts +12 -0
- package/dist/CardStack/BehindCard.d.ts.map +1 -0
- package/dist/CardStack/BehindCard.js +18 -0
- package/dist/CardStack/CardStack.d.ts +3 -0
- package/dist/CardStack/CardStack.d.ts.map +1 -0
- package/dist/CardStack/CardStack.js +77 -0
- package/dist/CardStack/CardStackDots.d.ts +3 -0
- package/dist/CardStack/CardStackDots.d.ts.map +1 -0
- package/dist/CardStack/CardStackDots.js +121 -0
- package/dist/CardStack/StackCard.d.ts +27 -0
- package/dist/CardStack/StackCard.d.ts.map +1 -0
- package/dist/CardStack/StackCard.js +45 -0
- package/dist/CardStack/constants.d.ts +32 -0
- package/dist/CardStack/constants.d.ts.map +1 -0
- package/dist/CardStack/constants.js +31 -0
- package/dist/CardStack/index.d.ts +4 -0
- package/dist/CardStack/index.d.ts.map +1 -0
- package/dist/CardStack/index.js +2 -0
- package/dist/CardStack/types.d.ts +39 -0
- package/dist/CardStack/types.d.ts.map +1 -0
- package/dist/CardStack/types.js +1 -0
- package/dist/CardStack/useSwipeGesture.d.ts +18 -0
- package/dist/CardStack/useSwipeGesture.d.ts.map +1 -0
- package/dist/CardStack/useSwipeGesture.js +70 -0
- package/dist/DatePicker/CalendarModal.d.ts +15 -0
- package/dist/DatePicker/CalendarModal.d.ts.map +1 -0
- package/dist/DatePicker/CalendarModal.js +129 -0
- package/dist/DatePicker/DatePicker.d.ts +3 -0
- package/dist/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/DatePicker/DatePicker.js +57 -0
- package/dist/DatePicker/DayCell.d.ts +14 -0
- package/dist/DatePicker/DayCell.d.ts.map +1 -0
- package/dist/DatePicker/DayCell.js +16 -0
- package/dist/DatePicker/constants.d.ts +46 -0
- package/dist/DatePicker/constants.d.ts.map +1 -0
- package/dist/DatePicker/constants.js +51 -0
- package/dist/DatePicker/icons.d.ts +4 -0
- package/dist/DatePicker/icons.d.ts.map +1 -0
- package/dist/DatePicker/icons.js +12 -0
- package/dist/DatePicker/index.d.ts +3 -0
- package/dist/DatePicker/index.d.ts.map +1 -0
- package/dist/DatePicker/index.js +1 -0
- package/dist/DatePicker/styles.d.ts +40 -0
- package/dist/DatePicker/styles.d.ts.map +1 -0
- package/dist/DatePicker/styles.js +134 -0
- package/dist/DatePicker/types.d.ts +39 -0
- package/dist/DatePicker/types.d.ts.map +1 -0
- package/dist/DatePicker/types.js +1 -0
- package/dist/DatePicker/utils.d.ts +15 -0
- package/dist/DatePicker/utils.d.ts.map +1 -0
- package/dist/DatePicker/utils.js +133 -0
- package/dist/DimmedScrollView/DimmedScrollView.d.ts +5 -0
- package/dist/DimmedScrollView/DimmedScrollView.d.ts.map +1 -0
- package/dist/DimmedScrollView/DimmedScrollView.js +18 -0
- package/dist/DimmedScrollView/index.d.ts +3 -0
- package/dist/DimmedScrollView/index.d.ts.map +1 -0
- package/dist/DimmedScrollView/index.js +1 -0
- package/dist/DimmedScrollView/styles.d.ts +15 -0
- package/dist/DimmedScrollView/styles.d.ts.map +1 -0
- package/dist/DimmedScrollView/styles.js +32 -0
- package/dist/DimmedScrollView/types.d.ts +20 -0
- package/dist/DimmedScrollView/types.d.ts.map +1 -0
- package/dist/DimmedScrollView/types.js +1 -0
- package/dist/FadingEdge/FadingEdge.d.ts +3 -0
- package/dist/FadingEdge/FadingEdge.d.ts.map +1 -0
- package/dist/FadingEdge/FadingEdge.js +30 -0
- package/dist/FadingEdge/index.d.ts +3 -0
- package/dist/FadingEdge/index.d.ts.map +1 -0
- package/dist/FadingEdge/index.js +1 -0
- package/dist/FadingEdge/types.d.ts +14 -0
- package/dist/FadingEdge/types.d.ts.map +1 -0
- package/dist/FadingEdge/types.js +1 -0
- package/dist/Icon/Icon.d.ts +6 -0
- package/dist/Icon/Icon.d.ts.map +1 -0
- package/dist/Icon/Icon.js +16 -0
- package/dist/Icon/defaults.d.ts +7 -0
- package/dist/Icon/defaults.d.ts.map +1 -0
- package/dist/Icon/defaults.js +80 -0
- package/dist/Icon/icons/navigation.d.ts +10 -0
- package/dist/Icon/icons/navigation.d.ts.map +1 -0
- package/dist/Icon/icons/navigation.js +10 -0
- package/dist/Icon/icons/system.d.ts +29 -0
- package/dist/Icon/icons/system.d.ts.map +1 -0
- package/dist/Icon/icons/system.js +29 -0
- package/dist/Icon/icons/tabs.d.ts +6 -0
- package/dist/Icon/icons/tabs.d.ts.map +1 -0
- package/dist/Icon/icons/tabs.js +6 -0
- package/dist/Icon/index.d.ts +3 -0
- package/dist/Icon/index.d.ts.map +1 -0
- package/dist/Icon/index.js +1 -0
- package/dist/Icon/registry.d.ts +3 -0
- package/dist/Icon/registry.d.ts.map +1 -0
- package/dist/Icon/registry.js +43 -0
- package/dist/Icon/types.d.ts +20 -0
- package/dist/Icon/types.d.ts.map +1 -0
- package/dist/Icon/types.js +40 -0
- package/dist/Input/Input.d.ts +5 -0
- package/dist/Input/Input.d.ts.map +1 -0
- package/dist/Input/Input.js +64 -0
- package/dist/Input/constants.d.ts +56 -0
- package/dist/Input/constants.d.ts.map +1 -0
- package/dist/Input/constants.js +61 -0
- package/dist/Input/index.d.ts +3 -0
- package/dist/Input/index.d.ts.map +1 -0
- package/dist/Input/index.js +1 -0
- package/dist/Input/styles.d.ts +23 -0
- package/dist/Input/styles.d.ts.map +1 -0
- package/dist/Input/styles.js +99 -0
- package/dist/Input/types.d.ts +21 -0
- package/dist/Input/types.d.ts.map +1 -0
- package/dist/Input/types.js +1 -0
- package/dist/ListCell/CheckMark.d.ts +10 -0
- package/dist/ListCell/CheckMark.d.ts.map +1 -0
- package/dist/ListCell/CheckMark.js +12 -0
- package/dist/ListCell/Chevron.d.ts +14 -0
- package/dist/ListCell/Chevron.d.ts.map +1 -0
- package/dist/ListCell/Chevron.js +22 -0
- package/dist/ListCell/ListCell.d.ts +3 -0
- package/dist/ListCell/ListCell.d.ts.map +1 -0
- package/dist/ListCell/ListCell.js +120 -0
- package/dist/ListCell/PickerModal.d.ts +13 -0
- package/dist/ListCell/PickerModal.d.ts.map +1 -0
- package/dist/ListCell/PickerModal.js +8 -0
- package/dist/ListCell/RadioButton.d.ts +10 -0
- package/dist/ListCell/RadioButton.d.ts.map +1 -0
- package/dist/ListCell/RadioButton.js +12 -0
- package/dist/ListCell/SwitchTrack.d.ts +19 -0
- package/dist/ListCell/SwitchTrack.d.ts.map +1 -0
- package/dist/ListCell/SwitchTrack.js +8 -0
- package/dist/ListCell/constants.d.ts +30 -0
- package/dist/ListCell/constants.d.ts.map +1 -0
- package/dist/ListCell/constants.js +35 -0
- package/dist/ListCell/index.d.ts +3 -0
- package/dist/ListCell/index.d.ts.map +1 -0
- package/dist/ListCell/index.js +1 -0
- package/dist/ListCell/styles.d.ts +28 -0
- package/dist/ListCell/styles.d.ts.map +1 -0
- package/dist/ListCell/styles.js +111 -0
- package/dist/ListCell/types.d.ts +68 -0
- package/dist/ListCell/types.d.ts.map +1 -0
- package/dist/ListCell/types.js +1 -0
- package/dist/ListCell/useSwitchAnimation.d.ts +12 -0
- package/dist/ListCell/useSwitchAnimation.d.ts.map +1 -0
- package/dist/ListCell/useSwitchAnimation.js +31 -0
- package/dist/ListCell/utilities.d.ts +24 -0
- package/dist/ListCell/utilities.d.ts.map +1 -0
- package/dist/ListCell/utilities.js +29 -0
- package/dist/Picker/Picker.d.ts +3 -0
- package/dist/Picker/Picker.d.ts.map +1 -0
- package/dist/Picker/Picker.js +76 -0
- package/dist/Picker/PickerHeader.d.ts +7 -0
- package/dist/Picker/PickerHeader.d.ts.map +1 -0
- package/dist/Picker/PickerHeader.js +6 -0
- package/dist/Picker/PickerRow.d.ts +9 -0
- package/dist/Picker/PickerRow.d.ts.map +1 -0
- package/dist/Picker/PickerRow.js +9 -0
- package/dist/Picker/SearchField.d.ts +8 -0
- package/dist/Picker/SearchField.d.ts.map +1 -0
- package/dist/Picker/SearchField.js +8 -0
- package/dist/Picker/constants.d.ts +24 -0
- package/dist/Picker/constants.d.ts.map +1 -0
- package/dist/Picker/constants.js +29 -0
- package/dist/Picker/icons.d.ts +3 -0
- package/dist/Picker/icons.d.ts.map +1 -0
- package/dist/Picker/icons.js +9 -0
- package/dist/Picker/index.d.ts +3 -0
- package/dist/Picker/index.d.ts.map +1 -0
- package/dist/Picker/index.js +1 -0
- package/dist/Picker/styles.d.ts +34 -0
- package/dist/Picker/styles.d.ts.map +1 -0
- package/dist/Picker/styles.js +192 -0
- package/dist/Picker/types.d.ts +40 -0
- package/dist/Picker/types.d.ts.map +1 -0
- package/dist/Picker/types.js +1 -0
- package/dist/Picker/useFilteredItems.d.ts +3 -0
- package/dist/Picker/useFilteredItems.d.ts.map +1 -0
- package/dist/Picker/useFilteredItems.js +18 -0
- package/dist/SegmentedTabs/SegmentedTabs.d.ts +3 -0
- package/dist/SegmentedTabs/SegmentedTabs.d.ts.map +1 -0
- package/dist/SegmentedTabs/SegmentedTabs.js +70 -0
- package/dist/SegmentedTabs/index.d.ts +3 -0
- package/dist/SegmentedTabs/index.d.ts.map +1 -0
- package/dist/SegmentedTabs/index.js +1 -0
- package/dist/SegmentedTabs/types.d.ts +10 -0
- package/dist/SegmentedTabs/types.d.ts.map +1 -0
- package/dist/SegmentedTabs/types.js +1 -0
- package/dist/Select/Select.d.ts +3 -0
- package/dist/Select/Select.d.ts.map +1 -0
- package/dist/Select/Select.js +60 -0
- package/dist/Select/index.d.ts +3 -0
- package/dist/Select/index.d.ts.map +1 -0
- package/dist/Select/index.js +1 -0
- package/dist/Select/styles.d.ts +8 -0
- package/dist/Select/styles.d.ts.map +1 -0
- package/dist/Select/styles.js +36 -0
- package/dist/Select/types.d.ts +37 -0
- package/dist/Select/types.d.ts.map +1 -0
- package/dist/Select/types.js +1 -0
- package/dist/Tabs/FloatingTabBar.d.ts +9 -0
- package/dist/Tabs/FloatingTabBar.d.ts.map +1 -0
- package/dist/Tabs/FloatingTabBar.js +55 -0
- package/dist/Tabs/Tabs.d.ts +21 -0
- package/dist/Tabs/Tabs.d.ts.map +1 -0
- package/dist/Tabs/Tabs.js +29 -0
- package/dist/Tabs/constants.d.ts +35 -0
- package/dist/Tabs/constants.d.ts.map +1 -0
- package/dist/Tabs/constants.js +36 -0
- package/dist/Tabs/icons.d.ts +16 -0
- package/dist/Tabs/icons.d.ts.map +1 -0
- package/dist/Tabs/icons.js +8 -0
- package/dist/Tabs/index.d.ts +6 -0
- package/dist/Tabs/index.d.ts.map +1 -0
- package/dist/Tabs/index.js +4 -0
- package/dist/Tabs/styles.d.ts +224 -0
- package/dist/Tabs/styles.d.ts.map +1 -0
- package/dist/Tabs/styles.js +121 -0
- package/dist/Tabs/types.d.ts +61 -0
- package/dist/Tabs/types.d.ts.map +1 -0
- package/dist/Tabs/types.js +4 -0
- package/dist/Tabs/useFloatingTabBarScrollPadding.d.ts +7 -0
- package/dist/Tabs/useFloatingTabBarScrollPadding.d.ts.map +1 -0
- package/dist/Tabs/useFloatingTabBarScrollPadding.js +11 -0
- package/dist/Tabs/utilities.d.ts +7 -0
- package/dist/Tabs/utilities.d.ts.map +1 -0
- package/dist/Tabs/utilities.js +18 -0
- package/dist/ToggleSection/ToggleSection.d.ts +3 -0
- package/dist/ToggleSection/ToggleSection.d.ts.map +1 -0
- package/dist/ToggleSection/ToggleSection.js +18 -0
- package/dist/ToggleSection/index.d.ts +3 -0
- package/dist/ToggleSection/index.d.ts.map +1 -0
- package/dist/ToggleSection/index.js +1 -0
- package/dist/ToggleSection/styles.d.ts +15 -0
- package/dist/ToggleSection/styles.d.ts.map +1 -0
- package/dist/ToggleSection/styles.js +49 -0
- package/dist/ToggleSection/types.d.ts +36 -0
- package/dist/ToggleSection/types.d.ts.map +1 -0
- package/dist/ToggleSection/types.js +1 -0
- package/dist/assets/fonts/.map.json +51 -0
- package/dist/assets/fonts/SB Sans Text.ttf +0 -0
- package/dist/assets/fonts/sf-pro-display/.map.json +114 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYBLACKITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYBOLD.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYHEAVYITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYLIGHTITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYMEDIUM.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYREGULAR.otf +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYSEMIBOLDITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYTHINITALIC.OTF +0 -0
- package/dist/assets/fonts/sf-pro-display/SFPRODISPLAYULTRALIGHTITALIC.OTF +0 -0
- package/dist/fonts.d.ts +6 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +8 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/theme.d.ts +19 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +18 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Button/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Button } from './Button';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { ButtonVariant } from './types';
|
|
3
|
+
export declare const ButtonContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").TouchableOpacityProps & import("react").RefAttributes<import("react-native").View>, {
|
|
4
|
+
$variant: ButtonVariant;
|
|
5
|
+
$isDisabled: boolean;
|
|
6
|
+
$fullWidth: boolean;
|
|
7
|
+
}>>;
|
|
8
|
+
export declare const ContentRow: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
9
|
+
export declare const IconWrap: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
10
|
+
export declare const ButtonLabel: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").TextProps, {
|
|
11
|
+
$variant: ButtonVariant;
|
|
12
|
+
}>>;
|
|
13
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/Button/styles.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,eAAO,MAAM,eAAe;cAChB,aAAa;iBACV,OAAO;gBACR,OAAO;GAgBpB,CAAC;AAEF,eAAO,MAAM,UAAU,+KAKtB,CAAC;AAEF,eAAO,MAAM,QAAQ,+KAGpB,CAAC;AAEF,eAAO,MAAM,WAAW;cAA2B,aAAa;GAO/D,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import styled from 'styled-components/native';
|
|
2
|
+
import { BUTTON_TOKENS, BUTTON_VARIANT_COLORS } from './constants';
|
|
3
|
+
export const ButtonContainer = styled.TouchableOpacity `
|
|
4
|
+
flex-direction: row;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
align-items: center;
|
|
7
|
+
min-height: ${BUTTON_TOKENS.minHeight}px;
|
|
8
|
+
padding: ${BUTTON_TOKENS.paddingVertical}px ${BUTTON_TOKENS.paddingHorizontal}px;
|
|
9
|
+
border-radius: ${BUTTON_TOKENS.borderRadius}px;
|
|
10
|
+
width: ${({ $fullWidth }) => ($fullWidth ? '100%' : 'auto')};
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
background-color: ${({ $variant, $isDisabled }) => $isDisabled
|
|
13
|
+
? BUTTON_VARIANT_COLORS[$variant].disabledBackgroundColor
|
|
14
|
+
: BUTTON_VARIANT_COLORS[$variant].backgroundColor};
|
|
15
|
+
opacity: ${({ $variant, $isDisabled }) => $variant === 'secondary' && $isDisabled ? 0.55 : 1};
|
|
16
|
+
`;
|
|
17
|
+
export const ContentRow = styled.View `
|
|
18
|
+
flex-direction: row;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
gap: ${BUTTON_TOKENS.gap}px;
|
|
22
|
+
`;
|
|
23
|
+
export const IconWrap = styled.View `
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
`;
|
|
27
|
+
export const ButtonLabel = styled.Text `
|
|
28
|
+
font-family: 'SF Pro';
|
|
29
|
+
font-size: ${BUTTON_TOKENS.typography.fontSize}px;
|
|
30
|
+
font-weight: ${BUTTON_TOKENS.typography.fontWeight};
|
|
31
|
+
line-height: ${BUTTON_TOKENS.typography.lineHeight}px;
|
|
32
|
+
letter-spacing: ${BUTTON_TOKENS.typography.letterSpacing}px;
|
|
33
|
+
color: ${({ $variant }) => BUTTON_VARIANT_COLORS[$variant].textColor};
|
|
34
|
+
`;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { StyleProp, TextStyle, TouchableOpacityProps, ViewStyle } from 'react-native';
|
|
3
|
+
export type ButtonVariant = 'primary' | 'secondary';
|
|
4
|
+
export interface ButtonProps extends Omit<TouchableOpacityProps, 'children' | 'style'> {
|
|
5
|
+
/** Button content */
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
/** Visual style variant. Currently only `primary` is supported. */
|
|
8
|
+
variant?: ButtonVariant;
|
|
9
|
+
/** Full width button container */
|
|
10
|
+
fullWidth?: boolean;
|
|
11
|
+
/** Element rendered before the label/content */
|
|
12
|
+
iconLeft?: ReactNode;
|
|
13
|
+
/** Element rendered after the label/content */
|
|
14
|
+
iconRight?: ReactNode;
|
|
15
|
+
/** Optional container style overrides */
|
|
16
|
+
style?: StyleProp<ViewStyle>;
|
|
17
|
+
/** Optional text style overrides for the label */
|
|
18
|
+
textStyle?: StyleProp<TextStyle>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Button/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3F,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;AAEpD,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAAC;IACpF,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,mEAAmE;IACnE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,kDAAkD;IAClD,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Animated from 'react-native-reanimated';
|
|
3
|
+
interface BehindCardProps {
|
|
4
|
+
position: number;
|
|
5
|
+
progress: Animated.SharedValue<number>;
|
|
6
|
+
maxVisible: number;
|
|
7
|
+
style: any;
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function BehindCard({ position, progress, maxVisible, style, children, }: BehindCardProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=BehindCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehindCard.d.ts","sourceRoot":"","sources":["../../src/CardStack/BehindCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAIN,MAAM,yBAAyB,CAAC;AAGjC,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,KAAK,EACL,QAAQ,GACT,EAAE,eAAe,2CAgCjB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import Animated, { Extrapolation, useAnimatedStyle, interpolate, } from 'react-native-reanimated';
|
|
3
|
+
import { CARD_STACK_TOKENS as T } from './constants';
|
|
4
|
+
export function BehindCard({ position, progress, maxVisible, style, children, }) {
|
|
5
|
+
const animStyle = useAnimatedStyle(() => ({
|
|
6
|
+
transform: [
|
|
7
|
+
{
|
|
8
|
+
scale: interpolate(progress.value, [0, 1], [1 - T.scaleStep * position, 1 - T.scaleStep * (position - 1)]),
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
translateY: interpolate(progress.value, [0, 1], [T.offsetStep * position, T.offsetStep * (position - 1)]),
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
opacity: interpolate(progress.value, [0, 0.001], [0, 1], Extrapolation.CLAMP),
|
|
15
|
+
zIndex: maxVisible - position,
|
|
16
|
+
}));
|
|
17
|
+
return (_jsx(Animated.View, { style: [style, animStyle], pointerEvents: "none", children: children }));
|
|
18
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CardStackProps } from './types';
|
|
2
|
+
export declare function CardStack<Item>({ data, activeIndex, onSwipeRelease, onSwiped, showDots, dotsActiveIndex, dotsPosition, onDotPress, dotsStyle, renderCard, keyExtractor, maxVisible, swipeThreshold, swipeVelocity, swipeCommitDuration, style, cardStyle, }: CardStackProps<Item>): import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
+
//# sourceMappingURL=CardStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CardStack.d.ts","sourceRoot":"","sources":["../../src/CardStack/CardStack.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,SAAS,CAAC,IAAI,EAAE,EAC9B,IAAI,EACJ,WAAW,EACX,cAAc,EACd,QAAQ,EACR,QAAgB,EAChB,eAAe,EACf,YAAuB,EACvB,UAAU,EACV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,UAAyB,EACzB,cAAiC,EACjC,aAA+B,EAC/B,mBAA2C,EAC3C,KAAK,EACL,SAAS,GACV,EAAE,cAAc,CAAC,IAAI,CAAC,kDAiFtB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { StyleSheet, View } from 'react-native';
|
|
3
|
+
import { CARD_STACK_TOKENS as T } from './constants';
|
|
4
|
+
import { useSwipeGesture } from './useSwipeGesture';
|
|
5
|
+
import { StackCard } from './StackCard';
|
|
6
|
+
import { CardStackDots } from './CardStackDots';
|
|
7
|
+
export function CardStack({ data, activeIndex, onSwipeRelease, onSwiped, showDots = false, dotsActiveIndex, dotsPosition = 'bottom', onDotPress, dotsStyle, renderCard, keyExtractor, maxVisible = T.maxVisible, swipeThreshold = T.swipeThreshold, swipeVelocity = T.swipeVelocity, swipeCommitDuration = T.swipeCommitDuration, style, cardStyle, }) {
|
|
8
|
+
const canCommitSwipe = data.length > 1;
|
|
9
|
+
const { pan, tx, ty, progress } = useSwipeGesture({
|
|
10
|
+
activeIndex,
|
|
11
|
+
swipeThreshold,
|
|
12
|
+
swipeVelocity,
|
|
13
|
+
swipeCommitDuration,
|
|
14
|
+
maxVisible,
|
|
15
|
+
canCommitSwipe,
|
|
16
|
+
onSwipeRelease,
|
|
17
|
+
onSwiped,
|
|
18
|
+
});
|
|
19
|
+
if (data.length === 0)
|
|
20
|
+
return null;
|
|
21
|
+
const cards = [];
|
|
22
|
+
const dotsIndex = dotsActiveIndex ?? activeIndex;
|
|
23
|
+
const flatCardStyle = cardStyle
|
|
24
|
+
? StyleSheet.flatten([styles.card, cardStyle])
|
|
25
|
+
: styles.card;
|
|
26
|
+
for (let di = 0; di < data.length; di++) {
|
|
27
|
+
const item = data[di];
|
|
28
|
+
const key = keyExtractor(item, di);
|
|
29
|
+
const offset = (di - activeIndex + data.length) % data.length;
|
|
30
|
+
const isTop = offset === 0;
|
|
31
|
+
const isVisible = offset < maxVisible;
|
|
32
|
+
cards.push(_jsx(StackCard, { isTop: isTop, position: offset, visible: isVisible, pan: pan, tx: tx, ty: ty, progress: progress, maxVisible: maxVisible, style: flatCardStyle, children: renderCard(item, { index: di }) }, key));
|
|
33
|
+
}
|
|
34
|
+
const dots = showDots && onDotPress ? (_jsx(CardStackDots, { count: data.length, activeIndex: dotsIndex, onDotPress: onDotPress, position: dotsPosition, style: dotsStyle })) : null;
|
|
35
|
+
const isVerticalDots = dotsPosition === 'left' || dotsPosition === 'right';
|
|
36
|
+
return (_jsxs(View, { style: [styles.stack, style], children: [dots && !isVerticalDots && dotsPosition === 'top' && (_jsx(View, { style: [styles.dotsSlot, styles.dotsTop], children: dots })), _jsxs(View, { style: isVerticalDots ? styles.contentRow : styles.contentColumn, children: [dots && isVerticalDots && dotsPosition === 'left' && (_jsx(View, { style: [styles.dotsSlot, styles.dotsLeft], children: dots })), _jsx(View, { style: styles.cardsViewport, children: cards }), dots && isVerticalDots && dotsPosition === 'right' && (_jsx(View, { style: [styles.dotsSlot, styles.dotsRight], children: dots }))] }), dots && !isVerticalDots && dotsPosition === 'bottom' && (_jsx(View, { style: [styles.dotsSlot, styles.dotsBottom], children: dots }))] }));
|
|
37
|
+
}
|
|
38
|
+
const styles = StyleSheet.create({
|
|
39
|
+
stack: {
|
|
40
|
+
flex: 1,
|
|
41
|
+
},
|
|
42
|
+
contentColumn: {
|
|
43
|
+
flex: 1,
|
|
44
|
+
},
|
|
45
|
+
contentRow: {
|
|
46
|
+
flex: 1,
|
|
47
|
+
flexDirection: 'row',
|
|
48
|
+
},
|
|
49
|
+
cardsViewport: {
|
|
50
|
+
flex: 1,
|
|
51
|
+
position: 'relative',
|
|
52
|
+
},
|
|
53
|
+
dotsSlot: {
|
|
54
|
+
zIndex: T.maxVisible + 1,
|
|
55
|
+
},
|
|
56
|
+
dotsTop: {
|
|
57
|
+
marginBottom: 8,
|
|
58
|
+
alignItems: 'center',
|
|
59
|
+
},
|
|
60
|
+
dotsBottom: {
|
|
61
|
+
marginTop: 8,
|
|
62
|
+
alignItems: 'center',
|
|
63
|
+
},
|
|
64
|
+
dotsLeft: {
|
|
65
|
+
justifyContent: 'center',
|
|
66
|
+
},
|
|
67
|
+
dotsRight: {
|
|
68
|
+
justifyContent: 'center',
|
|
69
|
+
},
|
|
70
|
+
card: {
|
|
71
|
+
position: 'absolute',
|
|
72
|
+
top: 0,
|
|
73
|
+
bottom: 0,
|
|
74
|
+
left: T.cardHorizontalInset,
|
|
75
|
+
right: T.cardHorizontalInset,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CardStackDotsProps } from './types';
|
|
2
|
+
export declare function CardStackDots({ count, activeIndex, onDotPress, position, dotSize, dotGap, dotColor, dotActiveOpacity, dotInactiveOpacity, glassIntensity, glassTint, style, }: CardStackDotsProps): import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
+
//# sourceMappingURL=CardStackDots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CardStackDots.d.ts","sourceRoot":"","sources":["../../src/CardStack/CardStackDots.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,UAAU,EACV,QAAmB,EACnB,OAAmB,EACnB,MAAiB,EACjB,QAAqB,EACrB,gBAAqC,EACrC,kBAAyC,EACzC,cAAiC,EACjC,SAAuB,EACvB,KAAK,GACN,EAAE,kBAAkB,kDAgIpB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { StyleSheet, View, TouchableOpacity } from 'react-native';
|
|
4
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
5
|
+
import Animated, { useSharedValue, useAnimatedStyle, withTiming, runOnJS, } from 'react-native-reanimated';
|
|
6
|
+
import { BlurView } from 'expo-blur';
|
|
7
|
+
import { CARD_STACK_DOTS_TOKENS as D } from './constants';
|
|
8
|
+
export function CardStackDots({ count, activeIndex, onDotPress, position = 'bottom', dotSize = D.dotSize, dotGap = D.dotGap, dotColor = D.dotColor, dotActiveOpacity = D.dotActiveOpacity, dotInactiveOpacity = D.dotInactiveOpacity, glassIntensity = D.glassIntensity, glassTint = D.glassTint, style, }) {
|
|
9
|
+
const isVertical = position === 'left' || position === 'right';
|
|
10
|
+
const containerX = useSharedValue(0);
|
|
11
|
+
const containerY = useSharedValue(0);
|
|
12
|
+
const containerW = useSharedValue(0);
|
|
13
|
+
const containerH = useSharedValue(0);
|
|
14
|
+
const lastPanIdx = useSharedValue(-1);
|
|
15
|
+
const pressing = useSharedValue(0);
|
|
16
|
+
const dotStep = dotSize + dotGap;
|
|
17
|
+
const handleLayout = useCallback((e) => {
|
|
18
|
+
containerW.value = e.nativeEvent.layout.width;
|
|
19
|
+
containerH.value = e.nativeEvent.layout.height;
|
|
20
|
+
e.target.measureInWindow?.((x, y) => {
|
|
21
|
+
containerX.value = x;
|
|
22
|
+
containerY.value = y;
|
|
23
|
+
});
|
|
24
|
+
}, [containerW, containerH, containerX, containerY]);
|
|
25
|
+
const handlePan = useCallback((absoluteX, absoluteY) => {
|
|
26
|
+
'worklet';
|
|
27
|
+
const total = count * dotStep - dotGap;
|
|
28
|
+
const start = isVertical
|
|
29
|
+
? containerY.value + (containerH.value - total) / 2
|
|
30
|
+
: containerX.value + (containerW.value - total) / 2;
|
|
31
|
+
const coord = isVertical ? absoluteY : absoluteX;
|
|
32
|
+
const idx = Math.round((coord - start) / dotStep);
|
|
33
|
+
const clamped = Math.max(0, Math.min(count - 1, idx));
|
|
34
|
+
if (clamped !== lastPanIdx.value) {
|
|
35
|
+
lastPanIdx.value = clamped;
|
|
36
|
+
runOnJS(onDotPress)(clamped);
|
|
37
|
+
}
|
|
38
|
+
}, [
|
|
39
|
+
count,
|
|
40
|
+
dotStep,
|
|
41
|
+
dotGap,
|
|
42
|
+
isVertical,
|
|
43
|
+
containerX,
|
|
44
|
+
containerY,
|
|
45
|
+
containerW,
|
|
46
|
+
containerH,
|
|
47
|
+
lastPanIdx,
|
|
48
|
+
onDotPress,
|
|
49
|
+
]);
|
|
50
|
+
const panGesture = Gesture.Pan()
|
|
51
|
+
.onBegin((e) => {
|
|
52
|
+
pressing.value = withTiming(1, { duration: D.pressAnimateIn });
|
|
53
|
+
lastPanIdx.value = -1;
|
|
54
|
+
handlePan(e.absoluteX, e.absoluteY);
|
|
55
|
+
})
|
|
56
|
+
.onUpdate((e) => {
|
|
57
|
+
handlePan(e.absoluteX, e.absoluteY);
|
|
58
|
+
})
|
|
59
|
+
.onEnd(() => {
|
|
60
|
+
pressing.value = withTiming(0, { duration: D.pressAnimateOut });
|
|
61
|
+
lastPanIdx.value = -1;
|
|
62
|
+
})
|
|
63
|
+
.onFinalize(() => {
|
|
64
|
+
pressing.value = withTiming(0, { duration: D.pressAnimateOut });
|
|
65
|
+
});
|
|
66
|
+
const glassStyle = useAnimatedStyle(() => ({
|
|
67
|
+
opacity: pressing.value * 0.8,
|
|
68
|
+
transform: [{ scale: D.glassRestScale + pressing.value * (1 - D.glassRestScale) }],
|
|
69
|
+
}));
|
|
70
|
+
if (count <= 1)
|
|
71
|
+
return null;
|
|
72
|
+
return (_jsx(View, { style: [
|
|
73
|
+
styles.outerWrap,
|
|
74
|
+
isVertical ? styles.outerWrapVertical : styles.outerWrapHorizontal,
|
|
75
|
+
style,
|
|
76
|
+
], children: _jsx(GestureDetector, { gesture: panGesture, children: _jsxs(View, { style: [
|
|
77
|
+
styles.touchArea,
|
|
78
|
+
isVertical ? styles.touchAreaVertical : styles.touchAreaHorizontal,
|
|
79
|
+
{
|
|
80
|
+
gap: dotGap,
|
|
81
|
+
paddingHorizontal: D.pillHorizontalPadding,
|
|
82
|
+
paddingVertical: D.pillVerticalPadding,
|
|
83
|
+
},
|
|
84
|
+
], onLayout: handleLayout, children: [_jsx(Animated.View, { style: [styles.glassPill, glassStyle], children: _jsx(BlurView, { intensity: glassIntensity, tint: glassTint, style: StyleSheet.absoluteFill }) }), Array.from({ length: count }, (_, i) => (_jsx(TouchableOpacity, { onPress: () => onDotPress(i), hitSlop: { top: 12, bottom: 12, left: 4, right: 4 }, accessibilityRole: "button", accessibilityLabel: `Go to item ${i + 1}`, children: _jsx(View, { style: {
|
|
85
|
+
width: dotSize,
|
|
86
|
+
height: dotSize,
|
|
87
|
+
borderRadius: dotSize / 2,
|
|
88
|
+
backgroundColor: dotColor,
|
|
89
|
+
opacity: i === activeIndex ? dotActiveOpacity : dotInactiveOpacity,
|
|
90
|
+
} }) }, i)))] }) }) }));
|
|
91
|
+
}
|
|
92
|
+
const styles = StyleSheet.create({
|
|
93
|
+
outerWrap: {
|
|
94
|
+
alignItems: 'center',
|
|
95
|
+
},
|
|
96
|
+
outerWrapHorizontal: {
|
|
97
|
+
paddingBottom: 0,
|
|
98
|
+
},
|
|
99
|
+
outerWrapVertical: {
|
|
100
|
+
justifyContent: 'center',
|
|
101
|
+
},
|
|
102
|
+
touchArea: {
|
|
103
|
+
alignItems: 'center',
|
|
104
|
+
justifyContent: 'center',
|
|
105
|
+
minHeight: 28,
|
|
106
|
+
},
|
|
107
|
+
touchAreaHorizontal: {
|
|
108
|
+
flexDirection: 'row',
|
|
109
|
+
},
|
|
110
|
+
touchAreaVertical: {
|
|
111
|
+
flexDirection: 'column',
|
|
112
|
+
minHeight: 0,
|
|
113
|
+
minWidth: 28,
|
|
114
|
+
},
|
|
115
|
+
glassPill: {
|
|
116
|
+
...StyleSheet.absoluteFillObject,
|
|
117
|
+
borderRadius: 50,
|
|
118
|
+
overflow: 'hidden',
|
|
119
|
+
backgroundColor: `rgba(0, 0, 0, ${D.glassBaseOpacity})`,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Gesture } from 'react-native-gesture-handler';
|
|
3
|
+
import { type SharedValue } from 'react-native-reanimated';
|
|
4
|
+
interface StackCardProps {
|
|
5
|
+
isTop: boolean;
|
|
6
|
+
position: number;
|
|
7
|
+
visible: boolean;
|
|
8
|
+
pan: ReturnType<typeof Gesture.Pan>;
|
|
9
|
+
tx: SharedValue<number>;
|
|
10
|
+
ty: SharedValue<number>;
|
|
11
|
+
progress: SharedValue<number>;
|
|
12
|
+
maxVisible: number;
|
|
13
|
+
style: any;
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Unified card wrapper that keeps a stable React identity regardless of
|
|
18
|
+
* whether the card is the active (top) card or a behind/off-screen card.
|
|
19
|
+
*
|
|
20
|
+
* Uses a single useAnimatedStyle for both states so that Reanimated never
|
|
21
|
+
* needs to swap one animated style object for another on the native view,
|
|
22
|
+
* which avoids stale property issues (e.g. opacity: 0 lingering after a
|
|
23
|
+
* card transitions from behind to top).
|
|
24
|
+
*/
|
|
25
|
+
export declare function StackCard({ isTop, position, visible, pan, tx, ty, progress, maxVisible, style, children, }: StackCardProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=StackCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackCard.d.ts","sourceRoot":"","sources":["../../src/CardStack/StackCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiB,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAmB,MAAM,8BAA8B,CAAC;AACxE,OAAiB,EAIf,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAGjC,UAAU,cAAc;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxB,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,GAAG,EACH,EAAE,EACF,EAAE,EACF,QAAQ,EACR,UAAU,EACV,KAAK,EACL,QAAQ,GACT,EAAE,cAAc,2CAkDhB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
4
|
+
import Animated, { Extrapolation, useAnimatedStyle, interpolate, } from 'react-native-reanimated';
|
|
5
|
+
import { CARD_STACK_TOKENS as T } from './constants';
|
|
6
|
+
/**
|
|
7
|
+
* Unified card wrapper that keeps a stable React identity regardless of
|
|
8
|
+
* whether the card is the active (top) card or a behind/off-screen card.
|
|
9
|
+
*
|
|
10
|
+
* Uses a single useAnimatedStyle for both states so that Reanimated never
|
|
11
|
+
* needs to swap one animated style object for another on the native view,
|
|
12
|
+
* which avoids stale property issues (e.g. opacity: 0 lingering after a
|
|
13
|
+
* card transitions from behind to top).
|
|
14
|
+
*/
|
|
15
|
+
export function StackCard({ isTop, position, visible, pan, tx, ty, progress, maxVisible, style, children, }) {
|
|
16
|
+
const noop = useRef(Gesture.Manual()).current;
|
|
17
|
+
const animStyle = useAnimatedStyle(() => {
|
|
18
|
+
if (isTop) {
|
|
19
|
+
return {
|
|
20
|
+
transform: [
|
|
21
|
+
{ translateX: tx.value },
|
|
22
|
+
{ translateY: ty.value },
|
|
23
|
+
{ rotate: `${tx.value * T.rotationPerPx}deg` },
|
|
24
|
+
],
|
|
25
|
+
opacity: 1,
|
|
26
|
+
zIndex: maxVisible,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
transform: [
|
|
31
|
+
{
|
|
32
|
+
scale: interpolate(progress.value, [0, 1], [1 - T.scaleStep * position, 1 - T.scaleStep * (position - 1)]),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
translateY: interpolate(progress.value, [0, 1], [T.offsetStep * position, T.offsetStep * (position - 1)]),
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
opacity: visible
|
|
39
|
+
? interpolate(progress.value, [0, 0.001], [0, 1], Extrapolation.CLAMP)
|
|
40
|
+
: 0,
|
|
41
|
+
zIndex: visible ? maxVisible - position : -1,
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
return (_jsx(GestureDetector, { gesture: isTop ? pan : noop, children: _jsx(Animated.View, { style: [style, animStyle], pointerEvents: isTop ? 'auto' : 'none', children: children }) }));
|
|
45
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const CARD_STACK_TOKENS: {
|
|
2
|
+
readonly swipeThreshold: 120;
|
|
3
|
+
readonly swipeVelocity: 800;
|
|
4
|
+
readonly swipeCommitDuration: 80;
|
|
5
|
+
readonly flyDuration: 800;
|
|
6
|
+
readonly flyDistance: 1500;
|
|
7
|
+
readonly maxVisible: 3;
|
|
8
|
+
readonly scaleStep: 0.05;
|
|
9
|
+
readonly offsetStep: 8;
|
|
10
|
+
readonly rotationPerPx: 0.08;
|
|
11
|
+
readonly peekDeadZone: 0.08;
|
|
12
|
+
readonly peekFadeRange: 0.1;
|
|
13
|
+
readonly springDamping: 20;
|
|
14
|
+
readonly springStiffness: 200;
|
|
15
|
+
readonly cardHorizontalInset: 16;
|
|
16
|
+
};
|
|
17
|
+
export declare const CARD_STACK_DOTS_TOKENS: {
|
|
18
|
+
readonly dotSize: 8;
|
|
19
|
+
readonly dotGap: 8;
|
|
20
|
+
readonly dotColor: "#000000";
|
|
21
|
+
readonly dotActiveOpacity: 1;
|
|
22
|
+
readonly dotInactiveOpacity: 0.3;
|
|
23
|
+
readonly pillVerticalPadding: 8;
|
|
24
|
+
readonly pillHorizontalPadding: 12;
|
|
25
|
+
readonly glassIntensity: 40;
|
|
26
|
+
readonly glassTint: "dark";
|
|
27
|
+
readonly glassBaseOpacity: 0.25;
|
|
28
|
+
readonly glassRestScale: 0.92;
|
|
29
|
+
readonly pressAnimateIn: 120;
|
|
30
|
+
readonly pressAnimateOut: 200;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/CardStack/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;CAepB,CAAC;AAEX,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;CAczB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const CARD_STACK_TOKENS = {
|
|
2
|
+
swipeThreshold: 120,
|
|
3
|
+
swipeVelocity: 800,
|
|
4
|
+
swipeCommitDuration: 80,
|
|
5
|
+
flyDuration: 800,
|
|
6
|
+
flyDistance: 1500,
|
|
7
|
+
maxVisible: 3,
|
|
8
|
+
scaleStep: 0.05,
|
|
9
|
+
offsetStep: 8,
|
|
10
|
+
rotationPerPx: 0.08,
|
|
11
|
+
peekDeadZone: 0.08,
|
|
12
|
+
peekFadeRange: 0.1,
|
|
13
|
+
springDamping: 20,
|
|
14
|
+
springStiffness: 200,
|
|
15
|
+
cardHorizontalInset: 16,
|
|
16
|
+
};
|
|
17
|
+
export const CARD_STACK_DOTS_TOKENS = {
|
|
18
|
+
dotSize: 8,
|
|
19
|
+
dotGap: 8,
|
|
20
|
+
dotColor: '#000000',
|
|
21
|
+
dotActiveOpacity: 1,
|
|
22
|
+
dotInactiveOpacity: 0.3,
|
|
23
|
+
pillVerticalPadding: 8,
|
|
24
|
+
pillHorizontalPadding: 12,
|
|
25
|
+
glassIntensity: 40,
|
|
26
|
+
glassTint: 'dark',
|
|
27
|
+
glassBaseOpacity: 0.25,
|
|
28
|
+
glassRestScale: 0.92,
|
|
29
|
+
pressAnimateIn: 120,
|
|
30
|
+
pressAnimateOut: 200,
|
|
31
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/CardStack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
export type CardStackDotsPosition = 'top' | 'bottom' | 'left' | 'right';
|
|
4
|
+
export interface CardStackProps<T> {
|
|
5
|
+
data: T[];
|
|
6
|
+
activeIndex: number;
|
|
7
|
+
onSwipeRelease?: () => void;
|
|
8
|
+
onSwiped: () => void;
|
|
9
|
+
showDots?: boolean;
|
|
10
|
+
dotsActiveIndex?: number;
|
|
11
|
+
dotsPosition?: CardStackDotsPosition;
|
|
12
|
+
onDotPress?: (index: number) => void;
|
|
13
|
+
dotsStyle?: StyleProp<ViewStyle>;
|
|
14
|
+
renderCard: (item: T, info: {
|
|
15
|
+
index: number;
|
|
16
|
+
}) => ReactNode;
|
|
17
|
+
keyExtractor: (item: T, index: number) => string;
|
|
18
|
+
maxVisible?: number;
|
|
19
|
+
swipeThreshold?: number;
|
|
20
|
+
swipeVelocity?: number;
|
|
21
|
+
swipeCommitDuration?: number;
|
|
22
|
+
style?: StyleProp<ViewStyle>;
|
|
23
|
+
cardStyle?: StyleProp<ViewStyle>;
|
|
24
|
+
}
|
|
25
|
+
export interface CardStackDotsProps {
|
|
26
|
+
count: number;
|
|
27
|
+
activeIndex: number;
|
|
28
|
+
onDotPress: (index: number) => void;
|
|
29
|
+
position?: CardStackDotsPosition;
|
|
30
|
+
dotSize?: number;
|
|
31
|
+
dotGap?: number;
|
|
32
|
+
dotColor?: string;
|
|
33
|
+
dotActiveOpacity?: number;
|
|
34
|
+
dotInactiveOpacity?: number;
|
|
35
|
+
glassIntensity?: number;
|
|
36
|
+
glassTint?: 'light' | 'dark' | 'default';
|
|
37
|
+
style?: StyleProp<ViewStyle>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/CardStack/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAExE,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,SAAS,CAAC;IAC5D,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface UseSwipeGestureOptions {
|
|
2
|
+
activeIndex: number;
|
|
3
|
+
swipeThreshold: number;
|
|
4
|
+
swipeVelocity: number;
|
|
5
|
+
swipeCommitDuration: number;
|
|
6
|
+
maxVisible: number;
|
|
7
|
+
canCommitSwipe: boolean;
|
|
8
|
+
onSwipeRelease?: () => void;
|
|
9
|
+
onSwiped: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function useSwipeGesture({ activeIndex, swipeThreshold, swipeVelocity, swipeCommitDuration, maxVisible, canCommitSwipe, onSwipeRelease, onSwiped, }: UseSwipeGestureOptions): {
|
|
12
|
+
pan: import("react-native-gesture-handler/lib/typescript/handlers/gestures/panGesture").PanGesture;
|
|
13
|
+
tx: import("react-native-reanimated").SharedValue<number>;
|
|
14
|
+
ty: import("react-native-reanimated").SharedValue<number>;
|
|
15
|
+
progress: import("react-native-reanimated").DerivedValue<number>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=useSwipeGesture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSwipeGesture.d.ts","sourceRoot":"","sources":["../../src/CardStack/useSwipeGesture.ts"],"names":[],"mappings":"AAaA,UAAU,sBAAsB;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,cAAc,EACd,QAAQ,GACT,EAAE,sBAAsB;;;;;EAuFxB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useCallback, useRef } from 'react';
|
|
2
|
+
import { Gesture } from 'react-native-gesture-handler';
|
|
3
|
+
import { useSharedValue, useDerivedValue, withTiming, withSpring, runOnJS, Easing, } from 'react-native-reanimated';
|
|
4
|
+
import { CARD_STACK_TOKENS as T } from './constants';
|
|
5
|
+
export function useSwipeGesture({ activeIndex, swipeThreshold, swipeVelocity, swipeCommitDuration, maxVisible, canCommitSwipe, onSwipeRelease, onSwiped, }) {
|
|
6
|
+
const tx = useSharedValue(0);
|
|
7
|
+
const ty = useSharedValue(0);
|
|
8
|
+
const flying = useSharedValue(false);
|
|
9
|
+
const swipeCommitProgress = useSharedValue(0);
|
|
10
|
+
const prevIndex = useRef(activeIndex);
|
|
11
|
+
if (prevIndex.current !== activeIndex) {
|
|
12
|
+
prevIndex.current = activeIndex;
|
|
13
|
+
tx.value = 0;
|
|
14
|
+
ty.value = 0;
|
|
15
|
+
flying.value = false;
|
|
16
|
+
swipeCommitProgress.value = 0;
|
|
17
|
+
}
|
|
18
|
+
const progress = useDerivedValue(() => {
|
|
19
|
+
if (flying.value)
|
|
20
|
+
return 1;
|
|
21
|
+
return Math.min(Math.sqrt(tx.value ** 2 + ty.value ** 2) / swipeThreshold, 1);
|
|
22
|
+
});
|
|
23
|
+
const onSwipeEnd = useCallback(() => {
|
|
24
|
+
onSwiped();
|
|
25
|
+
}, [onSwiped]);
|
|
26
|
+
const onSwipeReleaseStart = useCallback(() => {
|
|
27
|
+
onSwipeRelease?.();
|
|
28
|
+
}, [onSwipeRelease]);
|
|
29
|
+
const pan = Gesture.Pan()
|
|
30
|
+
.activeOffsetX([-10, 10])
|
|
31
|
+
.activeOffsetY([-10, 10])
|
|
32
|
+
.onUpdate((e) => {
|
|
33
|
+
if (flying.value)
|
|
34
|
+
return;
|
|
35
|
+
tx.value = e.translationX;
|
|
36
|
+
ty.value = e.translationY;
|
|
37
|
+
})
|
|
38
|
+
.onEnd((e) => {
|
|
39
|
+
if (flying.value)
|
|
40
|
+
return;
|
|
41
|
+
const dist = Math.sqrt(e.translationX ** 2 + e.translationY ** 2);
|
|
42
|
+
const vel = Math.sqrt(e.velocityX ** 2 + e.velocityY ** 2);
|
|
43
|
+
if (canCommitSwipe && (dist > swipeThreshold || vel > swipeVelocity)) {
|
|
44
|
+
flying.value = true;
|
|
45
|
+
runOnJS(onSwipeReleaseStart)();
|
|
46
|
+
const angle = Math.atan2(e.translationY + e.velocityY * 0.15, e.translationX + e.velocityX * 0.15);
|
|
47
|
+
const targetX = Math.cos(angle) * T.flyDistance;
|
|
48
|
+
const targetY = Math.sin(angle) * T.flyDistance;
|
|
49
|
+
const commitDuration = Math.max(0, Math.min(swipeCommitDuration, T.flyDuration));
|
|
50
|
+
tx.value = withTiming(targetX, { duration: T.flyDuration, easing: Easing.out(Easing.cubic) });
|
|
51
|
+
ty.value = withTiming(targetY, { duration: T.flyDuration, easing: Easing.out(Easing.cubic) });
|
|
52
|
+
swipeCommitProgress.value = 0;
|
|
53
|
+
swipeCommitProgress.value = withTiming(1, { duration: commitDuration, easing: Easing.linear }, (finished) => {
|
|
54
|
+
if (finished)
|
|
55
|
+
runOnJS(onSwipeEnd)();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
tx.value = withSpring(0, {
|
|
60
|
+
damping: T.springDamping,
|
|
61
|
+
stiffness: T.springStiffness,
|
|
62
|
+
});
|
|
63
|
+
ty.value = withSpring(0, {
|
|
64
|
+
damping: T.springDamping,
|
|
65
|
+
stiffness: T.springStiffness,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return { pan, tx, ty, progress };
|
|
70
|
+
}
|