@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,18 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
export function useFilteredItems(items, query) {
|
|
3
|
+
return useMemo(() => {
|
|
4
|
+
if (!query)
|
|
5
|
+
return items;
|
|
6
|
+
const lowerQuery = query.toLowerCase();
|
|
7
|
+
return items.filter((item) => Object.keys(item).some((key) => {
|
|
8
|
+
const value = item[key];
|
|
9
|
+
if (typeof value === 'string') {
|
|
10
|
+
return value.toLowerCase().includes(lowerQuery);
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
return value.some((v) => typeof v === 'string' && v.toLowerCase().includes(lowerQuery));
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}));
|
|
17
|
+
}, [items, query]);
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentedTabs.d.ts","sourceRoot":"","sources":["../../src/SegmentedTabs/SegmentedTabs.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAQlD,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,2CAmC/F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { Pressable, View } from 'react-native';
|
|
4
|
+
import Animated, { Easing, useAnimatedStyle, useSharedValue, withTiming, } from 'react-native-reanimated';
|
|
5
|
+
import styled from 'styled-components/native';
|
|
6
|
+
const TRACK_BG = '#EFF4F7';
|
|
7
|
+
const ACTIVE_TEXT = '#262626';
|
|
8
|
+
const INACTIVE_TEXT = '#738295';
|
|
9
|
+
const TIMING = { duration: 200, easing: Easing.out(Easing.ease) };
|
|
10
|
+
export function SegmentedTabs({ tabs, value, onChange }) {
|
|
11
|
+
const trackWidth = useSharedValue(0);
|
|
12
|
+
const activeIndex = useSharedValue(tabs.findIndex(t => t.value === value));
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const index = tabs.findIndex(t => t.value === value);
|
|
15
|
+
activeIndex.value = withTiming(index, TIMING);
|
|
16
|
+
}, [value]);
|
|
17
|
+
const pillStyle = useAnimatedStyle(() => {
|
|
18
|
+
const pillWidth = trackWidth.value / tabs.length;
|
|
19
|
+
return {
|
|
20
|
+
width: pillWidth,
|
|
21
|
+
transform: [{ translateX: activeIndex.value * pillWidth }],
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
return (_jsxs(Track, { onLayout: e => { trackWidth.value = e.nativeEvent.layout.width; }, children: [_jsx(Pill, { style: pillStyle }), tabs.map((tab, index) => {
|
|
25
|
+
const isActive = tab.value === value;
|
|
26
|
+
const nextIsActive = index + 1 < tabs.length && tabs[index + 1].value === value;
|
|
27
|
+
const showDivider = !isActive && index < tabs.length - 1 && !nextIsActive;
|
|
28
|
+
return (_jsx(Tab, { onPress: () => onChange(tab.value), children: _jsx(LabelBox, { "$showDivider": showDivider, children: _jsx(Label, { "$active": isActive, children: tab.label }) }) }, tab.value));
|
|
29
|
+
})] }));
|
|
30
|
+
}
|
|
31
|
+
const Track = styled(View) `
|
|
32
|
+
background-color: ${TRACK_BG};
|
|
33
|
+
border-radius: 8px;
|
|
34
|
+
flex-direction: row;
|
|
35
|
+
height: 40px;
|
|
36
|
+
width: 90%;
|
|
37
|
+
align-self: center;
|
|
38
|
+
`;
|
|
39
|
+
const Pill = styled(Animated.View) `
|
|
40
|
+
position: absolute;
|
|
41
|
+
top: 0;
|
|
42
|
+
bottom: 0;
|
|
43
|
+
left: 0;
|
|
44
|
+
background-color: #ffffff;
|
|
45
|
+
border-radius: 8px;
|
|
46
|
+
border-width: 2px;
|
|
47
|
+
border-color: ${TRACK_BG};
|
|
48
|
+
`;
|
|
49
|
+
const Tab = styled(Pressable) `
|
|
50
|
+
flex: 1;
|
|
51
|
+
align-items: center;
|
|
52
|
+
justify-content: center;
|
|
53
|
+
`;
|
|
54
|
+
const LabelBox = styled(View) `
|
|
55
|
+
width: 100%;
|
|
56
|
+
flex-direction: row;
|
|
57
|
+
align-items: center;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
padding-horizontal: 12px;
|
|
60
|
+
border-right-width: ${({ $showDivider }) => ($showDivider ? 1 : 0)}px;
|
|
61
|
+
border-right-color: #ffffff;
|
|
62
|
+
`;
|
|
63
|
+
const Label = styled.Text `
|
|
64
|
+
font-size: 14px;
|
|
65
|
+
font-weight: 500;
|
|
66
|
+
line-height: 18px;
|
|
67
|
+
letter-spacing: -0.28px;
|
|
68
|
+
color: ${({ $active }) => ($active ? ACTIVE_TEXT : INACTIVE_TEXT)};
|
|
69
|
+
text-align: center;
|
|
70
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SegmentedTabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SegmentedTabs } from './SegmentedTabs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/SegmentedTabs/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;IAC5C,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { SelectProps } from './types';
|
|
2
|
+
export declare function Select({ items, selectedValue, onValueChange, placeholder, required, helperText, errorText, disabled, sheetTitle, searchable, searchPlaceholder, showSave, containerStyle, inputWrapperStyle, testID, closeModalOnValueChange, }: SelectProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/Select/Select.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAS3C,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,aAAa,EACb,aAAa,EACb,WAAW,EACX,QAAgB,EAChB,UAAU,EACV,SAAS,EACT,QAAgB,EAChB,UAAU,EACV,UAAiB,EACjB,iBAAiB,EACjB,QAAe,EACf,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,uBAA+B,GAChC,EAAE,WAAW,2CAmHb"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { Keyboard, Modal, Platform } from 'react-native';
|
|
4
|
+
import { Input } from '../Input/Input';
|
|
5
|
+
import { Icon } from '../Icon';
|
|
6
|
+
import { Picker } from '../Picker/Picker';
|
|
7
|
+
import { KeyboardInsetFill, ModalContainer, Overlay, Pressable, SheetBackdrop, } from './styles';
|
|
8
|
+
export function Select({ items, selectedValue, onValueChange, placeholder, required = false, helperText, errorText, disabled = false, sheetTitle, searchable = true, searchPlaceholder, showSave = true, containerStyle, inputWrapperStyle, testID, closeModalOnValueChange = false, }) {
|
|
9
|
+
const [visible, setVisible] = useState(false);
|
|
10
|
+
const [pendingValue, setPendingValue] = useState(selectedValue);
|
|
11
|
+
const [keyboardInset, setKeyboardInset] = useState(0);
|
|
12
|
+
const selectedLabel = useMemo(() => {
|
|
13
|
+
if (selectedValue == null)
|
|
14
|
+
return '';
|
|
15
|
+
const item = items.find((i) => i.value === selectedValue);
|
|
16
|
+
return item?.label ?? '';
|
|
17
|
+
}, [items, selectedValue]);
|
|
18
|
+
const open = useCallback(() => {
|
|
19
|
+
if (disabled)
|
|
20
|
+
return;
|
|
21
|
+
Keyboard.dismiss();
|
|
22
|
+
setPendingValue(selectedValue);
|
|
23
|
+
setVisible(true);
|
|
24
|
+
}, [disabled, selectedValue]);
|
|
25
|
+
const close = useCallback(() => {
|
|
26
|
+
setVisible(false);
|
|
27
|
+
setKeyboardInset(0);
|
|
28
|
+
}, []);
|
|
29
|
+
const handlePickerChange = useCallback((value) => {
|
|
30
|
+
setPendingValue(value);
|
|
31
|
+
onValueChange?.(value);
|
|
32
|
+
if (closeModalOnValueChange) {
|
|
33
|
+
setVisible(false);
|
|
34
|
+
}
|
|
35
|
+
}, []);
|
|
36
|
+
const handleSave = useCallback(() => setVisible(false), []);
|
|
37
|
+
const handleBack = useCallback(() => {
|
|
38
|
+
setVisible(false);
|
|
39
|
+
setKeyboardInset(0);
|
|
40
|
+
}, []);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!visible)
|
|
43
|
+
return;
|
|
44
|
+
const handleShow = (event) => {
|
|
45
|
+
setKeyboardInset(Math.round(event.endCoordinates.height));
|
|
46
|
+
};
|
|
47
|
+
const handleHide = () => {
|
|
48
|
+
setKeyboardInset(0);
|
|
49
|
+
};
|
|
50
|
+
const showEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow';
|
|
51
|
+
const hideEvent = Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide';
|
|
52
|
+
const showSubscription = Keyboard.addListener(showEvent, handleShow);
|
|
53
|
+
const hideSubscription = Keyboard.addListener(hideEvent, handleHide);
|
|
54
|
+
return () => {
|
|
55
|
+
showSubscription.remove();
|
|
56
|
+
hideSubscription.remove();
|
|
57
|
+
};
|
|
58
|
+
}, [visible]);
|
|
59
|
+
return (_jsxs(_Fragment, { children: [_jsx(Pressable, { onPress: open, disabled: disabled, accessibilityRole: "button", accessibilityState: { disabled }, testID: testID, children: _jsx(Input, { placeholder: placeholder, required: required, value: selectedLabel, helperText: helperText, errorText: errorText, editable: false, rightIcon: _jsx(Icon, { name: "chevron-down" }), containerStyle: containerStyle, inputWrapperStyle: inputWrapperStyle, pointerEvents: "none" }) }), _jsx(Modal, { visible: visible, animationType: "slide", transparent: true, onRequestClose: close, children: _jsxs(SheetBackdrop, { children: [_jsx(Overlay, { onPress: close }), _jsx(ModalContainer, { children: _jsx(Picker, { items: items, selectedValue: pendingValue, onValueChange: handlePickerChange, title: sheetTitle ?? placeholder, onBack: handleBack, onSave: showSave ? handleSave : undefined, searchable: searchable, searchPlaceholder: searchPlaceholder, grabber: true, fitContent: true, keyboardInset: keyboardInset }) }), _jsx(KeyboardInsetFill, { style: { height: keyboardInset } })] }) })] }));
|
|
60
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Select/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Select } from './Select';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const Pressable: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, never>>;
|
|
3
|
+
export declare const SheetBackdrop: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
4
|
+
export declare const Overlay: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").PressableProps & import("react").RefAttributes<import("react-native").View>, never>>;
|
|
5
|
+
export declare const ModalContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
6
|
+
export declare const KeyboardInsetFill: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
7
|
+
export declare const ValueText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
8
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/Select/styles.ts"],"names":[],"mappings":";AAIA,eAAO,MAAM,SAAS,iPAErB,CAAC;AAEF,eAAO,MAAM,aAAa,+KAGzB,CAAC;AAEF,eAAO,MAAM,OAAO,iPAOnB,CAAC;AAEF,eAAO,MAAM,cAAc,+KAK1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,+KAG7B,CAAC;AAEF,eAAO,MAAM,SAAS,+KAOrB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Platform } from 'react-native';
|
|
2
|
+
import styled from 'styled-components/native';
|
|
3
|
+
import { INPUT_TOKENS } from '../Input/constants';
|
|
4
|
+
export const Pressable = styled.Pressable `
|
|
5
|
+
width: 100%;
|
|
6
|
+
`;
|
|
7
|
+
export const SheetBackdrop = styled.View `
|
|
8
|
+
flex: 1;
|
|
9
|
+
justify-content: flex-end;
|
|
10
|
+
`;
|
|
11
|
+
export const Overlay = styled.Pressable `
|
|
12
|
+
position: absolute;
|
|
13
|
+
top: 0;
|
|
14
|
+
left: 0;
|
|
15
|
+
right: 0;
|
|
16
|
+
bottom: 0;
|
|
17
|
+
background-color: rgba(0, 0, 0, 0.4);
|
|
18
|
+
`;
|
|
19
|
+
export const ModalContainer = styled.View `
|
|
20
|
+
background-color: ${INPUT_TOKENS.backgroundColor.default};
|
|
21
|
+
border-top-left-radius: 16px;
|
|
22
|
+
border-top-right-radius: 16px;
|
|
23
|
+
overflow: hidden;
|
|
24
|
+
`;
|
|
25
|
+
export const KeyboardInsetFill = styled.View `
|
|
26
|
+
width: 100%;
|
|
27
|
+
background-color: ${Platform.OS === 'ios' ? '#D1D2D8' : INPUT_TOKENS.backgroundColor.default};
|
|
28
|
+
`;
|
|
29
|
+
export const ValueText = styled.Text `
|
|
30
|
+
font-family: ${INPUT_TOKENS.input.fontFamily};
|
|
31
|
+
font-size: ${INPUT_TOKENS.input.fontSize}px;
|
|
32
|
+
font-weight: ${INPUT_TOKENS.input.fontWeight};
|
|
33
|
+
line-height: ${INPUT_TOKENS.input.lineHeight}px;
|
|
34
|
+
letter-spacing: ${INPUT_TOKENS.input.letterSpacing}px;
|
|
35
|
+
color: ${INPUT_TOKENS.input.color};
|
|
36
|
+
`;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
2
|
+
import type { PickerItem } from '../Picker/types';
|
|
3
|
+
export interface SelectProps {
|
|
4
|
+
/** List of selectable options */
|
|
5
|
+
items: PickerItem[];
|
|
6
|
+
/** Currently selected value */
|
|
7
|
+
selectedValue?: string;
|
|
8
|
+
/** Called with the new value when selection changes */
|
|
9
|
+
onValueChange?: (value: string) => void;
|
|
10
|
+
/** Floating placeholder text (e.g. "Currency") */
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
/** Show red asterisk after placeholder */
|
|
13
|
+
required?: boolean;
|
|
14
|
+
/** Helper text shown below the field */
|
|
15
|
+
helperText?: string;
|
|
16
|
+
/** Error text — highlights border red */
|
|
17
|
+
errorText?: string;
|
|
18
|
+
/** Disabled state */
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
/** Title shown in the bottom sheet header */
|
|
21
|
+
sheetTitle?: string;
|
|
22
|
+
/** Show search field in the sheet. @default true */
|
|
23
|
+
searchable?: boolean;
|
|
24
|
+
/** Placeholder for the search field */
|
|
25
|
+
searchPlaceholder?: string;
|
|
26
|
+
/** Show Save button in the sheet. @default true */
|
|
27
|
+
showSave?: boolean;
|
|
28
|
+
/** Style for the outer container */
|
|
29
|
+
containerStyle?: StyleProp<ViewStyle>;
|
|
30
|
+
/** Style for the input wrapper */
|
|
31
|
+
inputWrapperStyle?: StyleProp<ViewStyle>;
|
|
32
|
+
/** Forwarded to the root View */
|
|
33
|
+
testID?: string;
|
|
34
|
+
/** Close the modal when the value changes */
|
|
35
|
+
closeModalOnValueChange?: boolean;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Select/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FloatingTabBar
|
|
3
|
+
*
|
|
4
|
+
* Custom tab bar renderer with frosted-glass pill design.
|
|
5
|
+
* Used internally by the Tabs component via the `tabBar` prop.
|
|
6
|
+
*/
|
|
7
|
+
import type { FloatingTabBarProps } from './types';
|
|
8
|
+
export declare function FloatingTabBar({ state, navigation, tabs, activeColor, inactiveColor, showLabels, containerStyle, }: FloatingTabBarProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=FloatingTabBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FloatingTabBar.d.ts","sourceRoot":"","sources":["../../src/Tabs/FloatingTabBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AA6BnD,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,UAAU,EACV,IAAI,EACJ,WAAW,EACX,aAAa,EACb,UAAU,EACV,cAAc,GACf,EAAE,mBAAmB,2CAwGrB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* FloatingTabBar
|
|
4
|
+
*
|
|
5
|
+
* Custom tab bar renderer with frosted-glass pill design.
|
|
6
|
+
* Used internally by the Tabs component via the `tabBar` prop.
|
|
7
|
+
*/
|
|
8
|
+
import { useEffect } from 'react';
|
|
9
|
+
import { Platform } from 'react-native';
|
|
10
|
+
import { BlurView } from 'expo-blur';
|
|
11
|
+
import { useSharedValue, useAnimatedStyle, withTiming, Easing, } from 'react-native-reanimated';
|
|
12
|
+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
13
|
+
import { TAB_WIDTH, ICON_SIZE, BLUR_INTENSITY, } from './constants';
|
|
14
|
+
import { Badge, BadgeText, BlurLayer, GlassEdge, GlassOverlay, IconContainer, Indicator, LabelText, OuterContainer, Pill, PillShadow, SpecularHighlight, TabButton, } from './styles';
|
|
15
|
+
import { formatBadgeValue, getBottomPadding, getTabAccessibilityLabel, getTabTintColor, hasBadge, } from './utilities';
|
|
16
|
+
export function FloatingTabBar({ state, navigation, tabs, activeColor, inactiveColor, showLabels, containerStyle, }) {
|
|
17
|
+
const insets = useSafeAreaInsets();
|
|
18
|
+
// Animated horizontal position of the selection indicator
|
|
19
|
+
const translateX = useSharedValue(state.index * TAB_WIDTH);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
translateX.value = withTiming(state.index * TAB_WIDTH, {
|
|
22
|
+
duration: 250,
|
|
23
|
+
easing: Easing.bezier(0.25, 0.1, 0.25, 1),
|
|
24
|
+
});
|
|
25
|
+
}, [state.index, translateX]);
|
|
26
|
+
const indicatorStyle = useAnimatedStyle(() => ({
|
|
27
|
+
transform: [{ translateX: translateX.value }],
|
|
28
|
+
}));
|
|
29
|
+
// Bottom padding: use device safe-area or a minimum for devices without a home indicator
|
|
30
|
+
const bottomPadding = getBottomPadding(insets.bottom);
|
|
31
|
+
return (_jsx(OuterContainer, { style: containerStyle, "$bottomPadding": bottomPadding, pointerEvents: "box-none", children: _jsx(PillShadow, { children: _jsxs(Pill, { children: [_jsx(BlurLayer, { children: _jsx(BlurView, { intensity: BLUR_INTENSITY, tint: Platform.OS === 'ios' ? 'systemChromeMaterialLight' : 'light', style: { flex: 1 } }) }), _jsx(GlassOverlay, {}), _jsx(GlassEdge, {}), _jsx(SpecularHighlight, {}), _jsx(Indicator, { style: indicatorStyle }), state.routes.map((route, index) => {
|
|
32
|
+
const isFocused = state.index === index;
|
|
33
|
+
const tab = tabs[index];
|
|
34
|
+
if (!tab)
|
|
35
|
+
return null;
|
|
36
|
+
const tintColor = getTabTintColor(isFocused, activeColor, inactiveColor);
|
|
37
|
+
const onPress = () => {
|
|
38
|
+
const event = navigation.emit({
|
|
39
|
+
type: 'tabPress',
|
|
40
|
+
target: route.key,
|
|
41
|
+
canPreventDefault: true,
|
|
42
|
+
});
|
|
43
|
+
if (!isFocused && !event.defaultPrevented) {
|
|
44
|
+
navigation.navigate(route.name, route.params);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const onLongPress = () => {
|
|
48
|
+
navigation.emit({
|
|
49
|
+
type: 'tabLongPress',
|
|
50
|
+
target: route.key,
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
return (_jsxs(TabButton, { onPress: onPress, onLongPress: onLongPress, accessibilityRole: "tab", accessibilityState: { selected: isFocused }, accessibilityLabel: getTabAccessibilityLabel(tab), testID: tab.testID ?? `tab-${tab.name}`, children: [tab.icon && (_jsxs(IconContainer, { children: [tab.icon({ color: tintColor, size: ICON_SIZE, focused: isFocused }), hasBadge(tab.badge) && (_jsx(Badge, { children: _jsx(BadgeText, { children: formatBadgeValue(tab.badge) }) }))] })), showLabels && (_jsx(LabelText, { "$color": tintColor, "$focused": isFocused, numberOfLines: 1, children: tab.label }))] }, route.key));
|
|
54
|
+
})] }) }) }));
|
|
55
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabs Component
|
|
3
|
+
*
|
|
4
|
+
* Floating glass-effect bottom tab navigator matching the iOS-style Figma design
|
|
5
|
+
* (node 27-746 / Tab Bar – iPhone). Built on @react-navigation/bottom-tabs with
|
|
6
|
+
* a fully custom tab bar renderer.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* import { Tabs, GroupTabIcon } from '@demlanide/react-lucky-components';
|
|
11
|
+
*
|
|
12
|
+
* const tabs: TabItem[] = [
|
|
13
|
+
* { name: 'GroupsTab', label: 'Group', component: GroupsNav, icon: ({ color, size }) => <GroupTabIcon color={color} size={size} /> },
|
|
14
|
+
* ];
|
|
15
|
+
*
|
|
16
|
+
* <Tabs tabs={tabs} />
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import type { TabsProps } from './types';
|
|
20
|
+
export declare function Tabs({ tabs, initialTab, tabBarStyle, activeTintColor, inactiveTintColor, showLabels, screenOptions, testID, }: TabsProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=Tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/Tabs/Tabs.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMzC,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,UAAU,EACV,WAAW,EACX,eAAsC,EACtC,iBAA0C,EAC1C,UAAiB,EACjB,aAAa,EACb,MAAM,GACP,EAAE,SAAS,2CA8BX"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Tabs Component
|
|
4
|
+
*
|
|
5
|
+
* Floating glass-effect bottom tab navigator matching the iOS-style Figma design
|
|
6
|
+
* (node 27-746 / Tab Bar – iPhone). Built on @react-navigation/bottom-tabs with
|
|
7
|
+
* a fully custom tab bar renderer.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { Tabs, GroupTabIcon } from '@demlanide/react-lucky-components';
|
|
12
|
+
*
|
|
13
|
+
* const tabs: TabItem[] = [
|
|
14
|
+
* { name: 'GroupsTab', label: 'Group', component: GroupsNav, icon: ({ color, size }) => <GroupTabIcon color={color} size={size} /> },
|
|
15
|
+
* ];
|
|
16
|
+
*
|
|
17
|
+
* <Tabs tabs={tabs} />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
|
21
|
+
import { DEFAULT_ACTIVE_COLOR, DEFAULT_INACTIVE_COLOR } from './constants';
|
|
22
|
+
import { FloatingTabBar } from './FloatingTabBar';
|
|
23
|
+
const Tab = createBottomTabNavigator();
|
|
24
|
+
export function Tabs({ tabs, initialTab, tabBarStyle, activeTintColor = DEFAULT_ACTIVE_COLOR, inactiveTintColor = DEFAULT_INACTIVE_COLOR, showLabels = true, screenOptions, testID, }) {
|
|
25
|
+
return (_jsx(Tab.Navigator, { id: testID, initialRouteName: initialTab, tabBar: (props) => (_jsx(FloatingTabBar, { ...props, tabs: tabs, activeColor: activeTintColor, inactiveColor: inactiveTintColor, showLabels: showLabels, containerStyle: tabBarStyle })), screenOptions: {
|
|
26
|
+
headerShown: false,
|
|
27
|
+
...screenOptions,
|
|
28
|
+
}, children: tabs.map((tab) => (_jsx(Tab.Screen, { name: tab.name, component: tab.component, options: tab.options }, tab.name))) }));
|
|
29
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabs design tokens (from Figma node 27-746)
|
|
3
|
+
*/
|
|
4
|
+
/** Width of each individual tab button (px), tuned to match reference proportions */
|
|
5
|
+
export declare const TAB_WIDTH = 86;
|
|
6
|
+
/** Border-radius of the pill container – Figma: rounded-[296px] (fully rounded) */
|
|
7
|
+
export declare const PILL_RADIUS = 100;
|
|
8
|
+
/** Active tab tint – Figma: --accents/blue #08f → mapped to app primary */
|
|
9
|
+
export declare const DEFAULT_ACTIVE_COLOR: "#007AFF";
|
|
10
|
+
/** Inactive tab tint – Figma: --labels---vibrant---controls/primary #404040 */
|
|
11
|
+
export declare const DEFAULT_INACTIVE_COLOR = "#404040";
|
|
12
|
+
/** Selected tab background – Figma: --fills---vibrant/tertiary #ededed */
|
|
13
|
+
export declare const SELECTED_TAB_BACKGROUND = "#EDEDED";
|
|
14
|
+
/** Label font size – Figma: 10px */
|
|
15
|
+
export declare const LABEL_SIZE = 10;
|
|
16
|
+
/** Default icon size passed to the icon render function */
|
|
17
|
+
export declare const ICON_SIZE = 24;
|
|
18
|
+
/** Inner inset around the tab row inside the main glass capsule */
|
|
19
|
+
export declare const PILL_INSET = 4;
|
|
20
|
+
/** Blur intensity for liquid glass – higher so content silhouettes show through (0-100) */
|
|
21
|
+
export declare const BLUR_INTENSITY = 56;
|
|
22
|
+
/** Total height of the pill including the capsule inset */
|
|
23
|
+
export declare const PILL_HEIGHT: number;
|
|
24
|
+
/** Vertical padding above the pill in the tab bar container – Figma: pt-[16px] */
|
|
25
|
+
export declare const TAB_BAR_TOP_PADDING = 16;
|
|
26
|
+
/** Minimum bottom padding below the pill (when safe area is small) */
|
|
27
|
+
export declare const TAB_BAR_BOTTOM_MIN = 12;
|
|
28
|
+
/**
|
|
29
|
+
* Bottom inset for scroll content so the last item can scroll above the floating pill.
|
|
30
|
+
* Use in ScrollView contentContainerStyle.paddingBottom when the screen is a tab root.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getFloatingTabBarScrollPadding(insets: {
|
|
33
|
+
bottom: number;
|
|
34
|
+
}): number;
|
|
35
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/Tabs/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qFAAqF;AACrF,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,mFAAmF;AACnF,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,WAAiB,CAAC;AAEnD,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAEhD,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD,oCAAoC;AACpC,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,2DAA2D;AAC3D,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,mEAAmE;AACnE,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,2FAA2F;AAC3F,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,2DAA2D;AAC3D,eAAO,MAAM,WAAW,QAAgD,CAAC;AAEzE,kFAAkF;AAClF,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGjF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tabs design tokens (from Figma node 27-746)
|
|
3
|
+
*/
|
|
4
|
+
import { colors } from '../theme';
|
|
5
|
+
/** Width of each individual tab button (px), tuned to match reference proportions */
|
|
6
|
+
export const TAB_WIDTH = 86;
|
|
7
|
+
/** Border-radius of the pill container – Figma: rounded-[296px] (fully rounded) */
|
|
8
|
+
export const PILL_RADIUS = 100;
|
|
9
|
+
/** Active tab tint – Figma: --accents/blue #08f → mapped to app primary */
|
|
10
|
+
export const DEFAULT_ACTIVE_COLOR = colors.primary; // #007AFF
|
|
11
|
+
/** Inactive tab tint – Figma: --labels---vibrant---controls/primary #404040 */
|
|
12
|
+
export const DEFAULT_INACTIVE_COLOR = '#404040';
|
|
13
|
+
/** Selected tab background – Figma: --fills---vibrant/tertiary #ededed */
|
|
14
|
+
export const SELECTED_TAB_BACKGROUND = '#EDEDED';
|
|
15
|
+
/** Label font size – Figma: 10px */
|
|
16
|
+
export const LABEL_SIZE = 10;
|
|
17
|
+
/** Default icon size passed to the icon render function */
|
|
18
|
+
export const ICON_SIZE = 24;
|
|
19
|
+
/** Inner inset around the tab row inside the main glass capsule */
|
|
20
|
+
export const PILL_INSET = 4;
|
|
21
|
+
/** Blur intensity for liquid glass – higher so content silhouettes show through (0-100) */
|
|
22
|
+
export const BLUR_INTENSITY = 56;
|
|
23
|
+
/** Total height of the pill including the capsule inset */
|
|
24
|
+
export const PILL_HEIGHT = PILL_INSET + 6 + 28 + 1 + 12 + 7 + PILL_INSET; // 62
|
|
25
|
+
/** Vertical padding above the pill in the tab bar container – Figma: pt-[16px] */
|
|
26
|
+
export const TAB_BAR_TOP_PADDING = 16;
|
|
27
|
+
/** Minimum bottom padding below the pill (when safe area is small) */
|
|
28
|
+
export const TAB_BAR_BOTTOM_MIN = 12;
|
|
29
|
+
/**
|
|
30
|
+
* Bottom inset for scroll content so the last item can scroll above the floating pill.
|
|
31
|
+
* Use in ScrollView contentContainerStyle.paddingBottom when the screen is a tab root.
|
|
32
|
+
*/
|
|
33
|
+
export function getFloatingTabBarScrollPadding(insets) {
|
|
34
|
+
const bottomPadding = Math.max(insets.bottom, TAB_BAR_BOTTOM_MIN);
|
|
35
|
+
return TAB_BAR_TOP_PADDING + PILL_HEIGHT + bottomPadding + 8; // +8 so content isn't flush to pill
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Diamond / rhombus with soft rounded corners – "Group" tab (radius ~4) */
|
|
2
|
+
export declare const GroupTabIcon: ({ color, size }: {
|
|
3
|
+
color: string;
|
|
4
|
+
size: number;
|
|
5
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
/** Filled circle – "Activity" tab (already round) */
|
|
7
|
+
export declare const ActivityTabIcon: ({ color, size }: {
|
|
8
|
+
color: string;
|
|
9
|
+
size: number;
|
|
10
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
/** Triangle with soft rounded corners – "Account" tab (radius ~3.5) */
|
|
12
|
+
export declare const AccountTabIcon: ({ color, size }: {
|
|
13
|
+
color: string;
|
|
14
|
+
size: number;
|
|
15
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/Tabs/icons.tsx"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,eAAO,MAAM,YAAY;WAA8B,MAAM;UAAQ,MAAM;6CAE1E,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,eAAe;WAA8B,MAAM;UAAQ,MAAM;6CAE7E,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,cAAc;WAA8B,MAAM;UAAQ,MAAM;6CAE5E,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from '../Icon';
|
|
3
|
+
/** Diamond / rhombus with soft rounded corners – "Group" tab (radius ~4) */
|
|
4
|
+
export const GroupTabIcon = ({ color, size }) => (_jsx(Icon, { name: "tab-group", color: color, size: size }));
|
|
5
|
+
/** Filled circle – "Activity" tab (already round) */
|
|
6
|
+
export const ActivityTabIcon = ({ color, size }) => (_jsx(Icon, { name: "tab-activity", color: color, size: size }));
|
|
7
|
+
/** Triangle with soft rounded corners – "Account" tab (radius ~3.5) */
|
|
8
|
+
export const AccountTabIcon = ({ color, size }) => (_jsx(Icon, { name: "tab-account", color: color, size: size }));
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Tabs } from './Tabs';
|
|
2
|
+
export { FloatingTabBar } from './FloatingTabBar';
|
|
3
|
+
export { useFloatingTabBarScrollPadding } from './useFloatingTabBarScrollPadding';
|
|
4
|
+
export { GroupTabIcon, ActivityTabIcon, AccountTabIcon } from './icons';
|
|
5
|
+
export type { TabsProps, TabItem, TabIcon } from './types';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
|