@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
package/README.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# @demlanide/react-lucky-components
|
|
2
|
+
|
|
3
|
+
Styled React Native components extracted for reuse: **ListCell**, **Tabs** (floating glass tab bar), and tab icons. Built for Expo / React Native with TypeScript.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- **ListCell** – Versatile list-cell row with two trailing modes: **switch** (animated toggle) and **navigation** (detail text + chevron). Also works as a standalone toggle when no title is provided.
|
|
8
|
+
- **Tabs** – Bottom tab navigator with frosted-glass pill design; uses `@react-navigation/bottom-tabs` with a custom tab bar.
|
|
9
|
+
- **Tab icons** – `GroupTabIcon`, `ActivityTabIcon`, `AccountTabIcon` (SVG).
|
|
10
|
+
- **useFloatingTabBarScrollPadding** – Hook for scroll padding above the floating tab bar.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
In your React Native / Expo app:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @demlanide/react-lucky-components
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Peer dependencies (install if not already present):
|
|
21
|
+
|
|
22
|
+
- `react`, `react-native`
|
|
23
|
+
- `@react-navigation/bottom-tabs`
|
|
24
|
+
- `expo-blur`
|
|
25
|
+
- `react-native-reanimated`
|
|
26
|
+
- `react-native-safe-area-context`
|
|
27
|
+
- `react-native-svg`
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
### ListCell
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { ListCell } from '@demlanide/react-lucky-components';
|
|
35
|
+
|
|
36
|
+
// Standalone toggle (no title)
|
|
37
|
+
<ListCell value={on} onValueChange={setOn} />
|
|
38
|
+
|
|
39
|
+
// List cell with switch trailing (default)
|
|
40
|
+
<ListCell
|
|
41
|
+
value={notifications}
|
|
42
|
+
onValueChange={setNotifications}
|
|
43
|
+
title="Notifications"
|
|
44
|
+
subtitle="About transactions, debt, new expenses"
|
|
45
|
+
/>
|
|
46
|
+
|
|
47
|
+
// Navigation with detail text + chevron
|
|
48
|
+
<ListCell
|
|
49
|
+
trailing="navigation"
|
|
50
|
+
title="Preferred Currency"
|
|
51
|
+
detail="£ · GBR"
|
|
52
|
+
onPress={() => navigation.navigate('Currency')}
|
|
53
|
+
/>
|
|
54
|
+
|
|
55
|
+
// Navigation with chevron only
|
|
56
|
+
<ListCell
|
|
57
|
+
trailing="navigation"
|
|
58
|
+
title="Policies and terms"
|
|
59
|
+
onPress={() => navigation.navigate('Policies')}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
> **Migration note:** `Switch` is still exported as an alias for backward
|
|
64
|
+
> compatibility. New code should use `ListCell`.
|
|
65
|
+
|
|
66
|
+
### Tabs
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
import {
|
|
70
|
+
Tabs,
|
|
71
|
+
GroupTabIcon,
|
|
72
|
+
ActivityTabIcon,
|
|
73
|
+
AccountTabIcon,
|
|
74
|
+
useFloatingTabBarScrollPadding,
|
|
75
|
+
} from '@demlanide/react-lucky-components';
|
|
76
|
+
import type { TabItem } from '@demlanide/react-lucky-components';
|
|
77
|
+
|
|
78
|
+
const tabs: TabItem[] = [
|
|
79
|
+
{
|
|
80
|
+
name: 'Groups',
|
|
81
|
+
label: 'Group',
|
|
82
|
+
component: GroupsScreen,
|
|
83
|
+
icon: ({ color, size }) => <GroupTabIcon color={color} size={size} />,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'Activity',
|
|
87
|
+
label: 'Activity',
|
|
88
|
+
component: ActivityScreen,
|
|
89
|
+
icon: ({ color, size }) => <ActivityTabIcon color={color} size={size} />,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'Account',
|
|
93
|
+
label: 'Account',
|
|
94
|
+
component: AccountScreen,
|
|
95
|
+
icon: ({ color, size }) => <AccountTabIcon color={color} size={size} />,
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
function App() {
|
|
100
|
+
return <Tabs tabs={tabs} initialTab="Groups" />;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// In a tab root screen with ScrollView:
|
|
104
|
+
function AccountScreen() {
|
|
105
|
+
const paddingBottom = useFloatingTabBarScrollPadding();
|
|
106
|
+
return (
|
|
107
|
+
<ScrollView contentContainerStyle={{ paddingBottom }}>
|
|
108
|
+
{/* ... */}
|
|
109
|
+
</ScrollView>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Theming
|
|
115
|
+
|
|
116
|
+
Components use a small built-in theme (`colors.primary`, `colors.gray300`, etc.). Override via props where supported (e.g. `activeTintColor`, `inactiveTintColor` on `Tabs`; `activeTrackColor`, `inactiveTrackColor`, `thumbColor` on `ListCell`). The package also exports `colors` and `typography` from `./theme` if you need them.
|
|
117
|
+
|
|
118
|
+
## Repo setup: вынести в отдельный GitHub и публикация в npm
|
|
119
|
+
|
|
120
|
+
### 1. Вынести в отдельный репозиторий
|
|
121
|
+
|
|
122
|
+
1. Создай новый репозиторий на GitHub (например `your-username/react-native-components`).
|
|
123
|
+
2. Скопируй **содержимое** папки `packages/react-native-components` в **корень** нового репо (чтобы в корне лежали `package.json`, `src/`, `README.md`, `.storybook/`, `tsconfig.json`, `tsconfig.build.json`). Папку `node_modules` и `dist` копировать не нужно.
|
|
124
|
+
3. В новом репо в `package.json`:
|
|
125
|
+
- поменяй `"name"` на свой scope или имя (например `"@your-username/react-native-components"` или `"react-native-glass-tabs"`);
|
|
126
|
+
- в `"repository"` укажи URL нового репо.
|
|
127
|
+
|
|
128
|
+
### 2. Сборка и публикация в npm
|
|
129
|
+
|
|
130
|
+
В корне нового репо:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
npm install
|
|
134
|
+
npm run build # собирает dist/ (JS + .d.ts)
|
|
135
|
+
npm publish # для публичного пакета
|
|
136
|
+
# или npm publish --access public если имя со scope (@username/...)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Перед первым `npm publish` нужно залогиниться: `npm login`.
|
|
140
|
+
В npm уходит только то, что указано в `"files": ["dist", "README.md"]` — то есть собранный код и README; исходники и Storybook в пакет не попадают.
|
|
141
|
+
|
|
142
|
+
### 3. Подключить пакет обратно в split-buddy
|
|
143
|
+
|
|
144
|
+
**Вариант A — пакет опубликован в npm**
|
|
145
|
+
|
|
146
|
+
В `mobile/package.json` добавь зависимость:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
"@your-username/react-native-components": "^0.1.0"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Потом замени импорты с `components-pack` на пакет, например:
|
|
153
|
+
|
|
154
|
+
- `from '../../components-pack/Tabs'` → `from '@your-username/react-native-components'`
|
|
155
|
+
- `from '../../components-pack'` (Switch) → `from '@your-username/react-native-components'`
|
|
156
|
+
|
|
157
|
+
Папку/алиас `src/components-pack` в mobile можно удалить (если там только реэкспорт из этого пакета).
|
|
158
|
+
|
|
159
|
+
**Вариант B — разработка до публикации (локально или с GitHub)**
|
|
160
|
+
|
|
161
|
+
Локальная папка (путь относительно `mobile/`):
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
"@your-username/react-native-components": "file:../path/to/react-native-components"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Или с GitHub (пока не опубликовал в npm):
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
"@your-username/react-native-components": "github:your-username/react-native-components#main"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
После смены зависимости выполни в `mobile/`: `npm install`. Если используешь локальный `file:`, после правок в библиотеке нужно в ней запускать `npm run build`, чтобы обновился `dist/`.
|
|
174
|
+
|
|
175
|
+
## Scripts
|
|
176
|
+
|
|
177
|
+
- `npm run type-check` – проверка типов (без сборки).
|
|
178
|
+
- `npm run build` – сборка в `dist/` (JS + декларации). Запускается автоматически перед `npm publish` (`prepublishOnly`).
|
|
179
|
+
- `npm run storybook` – Storybook в браузере (порт 6006).
|
|
180
|
+
- `npm run build-storybook` – статическая сборка Storybook в `storybook-static/`.
|
|
181
|
+
|
|
182
|
+
## License
|
|
183
|
+
|
|
184
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Alert.d.ts","sourceRoot":"","sources":["../../src/Alert/Alert.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAW,EACX,KAAK,EACL,KAAK,EACL,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,IAAa,GACd,EAAE,UAAU,2CA6BZ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Image } from 'react-native';
|
|
3
|
+
import { ALERT_TOKENS } from './constants';
|
|
4
|
+
import { AlertCard, AlertWrapper, ContentContainer, DescriptionText, EmojiContainer, EmojiText, ImageContainer, TitleText, } from './styles';
|
|
5
|
+
export function Alert({ title, description, emoji, image, style, titleStyle, descriptionStyle, type = 'info', }) {
|
|
6
|
+
return (_jsxs(AlertWrapper, { style: style, children: [_jsx(AlertCard, { type: type, children: _jsxs(ContentContainer, { children: [title != null && (_jsx(TitleText, { style: titleStyle, children: title })), description != null && (_jsx(DescriptionText, { style: descriptionStyle, children: description }))] }) }), emoji != null && (_jsx(EmojiContainer, { style: { transform: [{ rotate: ALERT_TOKENS.emoji.rotation }] }, children: _jsx(EmojiText, { children: emoji }) })), image != null && (_jsx(ImageContainer, { children: _jsx(Image, { source: image, style: { width: 85, height: 85 } }) }))] }));
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const ALERT_TOKENS: {
|
|
2
|
+
readonly borderRadius: 24;
|
|
3
|
+
readonly padding: 20;
|
|
4
|
+
readonly titleDescriptionGap: 2;
|
|
5
|
+
readonly backgroundColor: "#E1EEFF";
|
|
6
|
+
readonly backgroundColorError: "#FFE2D5";
|
|
7
|
+
readonly shadowColor: "#FFFFFF";
|
|
8
|
+
readonly shadowOffset: {
|
|
9
|
+
readonly width: 0;
|
|
10
|
+
readonly height: 4;
|
|
11
|
+
};
|
|
12
|
+
readonly shadowOpacity: 1;
|
|
13
|
+
readonly shadowRadius: 20;
|
|
14
|
+
readonly elevation: 4;
|
|
15
|
+
readonly emoji: {
|
|
16
|
+
readonly fontSize: 58;
|
|
17
|
+
readonly lineHeight: 70;
|
|
18
|
+
readonly rotation: "16.92deg";
|
|
19
|
+
readonly topOffset: -27;
|
|
20
|
+
readonly rightOffset: -12;
|
|
21
|
+
};
|
|
22
|
+
readonly titleTypography: {
|
|
23
|
+
readonly fontFamily: "SF Pro";
|
|
24
|
+
readonly fontSize: 16;
|
|
25
|
+
readonly fontWeight: "500";
|
|
26
|
+
readonly lineHeight: 21;
|
|
27
|
+
readonly letterSpacing: -0.31;
|
|
28
|
+
};
|
|
29
|
+
readonly descriptionTypography: {
|
|
30
|
+
readonly fontFamily: "SF Pro";
|
|
31
|
+
readonly fontSize: 16;
|
|
32
|
+
readonly fontWeight: "400";
|
|
33
|
+
readonly lineHeight: 21;
|
|
34
|
+
readonly letterSpacing: -0.31;
|
|
35
|
+
};
|
|
36
|
+
readonly textColor: "#262626";
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/Alert/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCf,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const ALERT_TOKENS = {
|
|
2
|
+
borderRadius: 24,
|
|
3
|
+
padding: 20,
|
|
4
|
+
titleDescriptionGap: 2,
|
|
5
|
+
backgroundColor: '#E1EEFF',
|
|
6
|
+
backgroundColorError: '#FFE2D5',
|
|
7
|
+
shadowColor: '#FFFFFF',
|
|
8
|
+
shadowOffset: { width: 0, height: 4 },
|
|
9
|
+
shadowOpacity: 1,
|
|
10
|
+
shadowRadius: 20,
|
|
11
|
+
elevation: 4,
|
|
12
|
+
emoji: {
|
|
13
|
+
fontSize: 58,
|
|
14
|
+
lineHeight: 70,
|
|
15
|
+
rotation: '16.92deg',
|
|
16
|
+
topOffset: -27,
|
|
17
|
+
rightOffset: -12,
|
|
18
|
+
},
|
|
19
|
+
titleTypography: {
|
|
20
|
+
fontFamily: 'SF Pro',
|
|
21
|
+
fontSize: 16,
|
|
22
|
+
fontWeight: '500',
|
|
23
|
+
lineHeight: 21,
|
|
24
|
+
letterSpacing: -0.31,
|
|
25
|
+
},
|
|
26
|
+
descriptionTypography: {
|
|
27
|
+
fontFamily: 'SF Pro',
|
|
28
|
+
fontSize: 16,
|
|
29
|
+
fontWeight: '400',
|
|
30
|
+
lineHeight: 21,
|
|
31
|
+
letterSpacing: -0.31,
|
|
32
|
+
},
|
|
33
|
+
textColor: '#262626',
|
|
34
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Alert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Alert } from './Alert';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const AlertWrapper: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
2
|
+
export declare const AlertCard: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").ViewProps, {
|
|
3
|
+
type: 'info' | 'error';
|
|
4
|
+
}>>;
|
|
5
|
+
export declare const ContentContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
6
|
+
export declare const TitleText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
7
|
+
export declare const DescriptionText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
8
|
+
export declare const EmojiContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
9
|
+
export declare const EmojiText: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
10
|
+
export declare const ImageContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
11
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/Alert/styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,+KAExB,CAAC;AAEF,eAAO,MAAM,SAAS;UAAuB,MAAM,GAAG,OAAO;GAU5D,CAAC;AAEF,eAAO,MAAM,gBAAgB,+KAE5B,CAAC;AAEF,eAAO,MAAM,SAAS,+KAOrB,CAAC;AAEF,eAAO,MAAM,eAAe,+KAO3B,CAAC;AAEF,eAAO,MAAM,cAAc,+KAI1B,CAAC;AAEF,eAAO,MAAM,SAAS,+KAGrB,CAAC;AAEF,eAAO,MAAM,cAAc,+KAI1B,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import styled from 'styled-components/native';
|
|
2
|
+
import { ALERT_TOKENS } from './constants';
|
|
3
|
+
export const AlertWrapper = styled.View `
|
|
4
|
+
position: relative;
|
|
5
|
+
`;
|
|
6
|
+
export const AlertCard = styled.View `
|
|
7
|
+
background-color: ${({ type }) => type === 'info' ? ALERT_TOKENS.backgroundColor : ALERT_TOKENS.backgroundColorError};
|
|
8
|
+
border-radius: ${ALERT_TOKENS.borderRadius}px;
|
|
9
|
+
padding: ${ALERT_TOKENS.padding}px;
|
|
10
|
+
shadow-color: ${ALERT_TOKENS.shadowColor};
|
|
11
|
+
shadow-offset: ${ALERT_TOKENS.shadowOffset.width}px ${ALERT_TOKENS.shadowOffset.height}px;
|
|
12
|
+
shadow-opacity: ${ALERT_TOKENS.shadowOpacity};
|
|
13
|
+
shadow-radius: ${ALERT_TOKENS.shadowRadius}px;
|
|
14
|
+
elevation: ${ALERT_TOKENS.elevation};
|
|
15
|
+
overflow: visible;
|
|
16
|
+
`;
|
|
17
|
+
export const ContentContainer = styled.View `
|
|
18
|
+
gap: ${ALERT_TOKENS.titleDescriptionGap}px;
|
|
19
|
+
`;
|
|
20
|
+
export const TitleText = styled.Text `
|
|
21
|
+
font-family: ${ALERT_TOKENS.titleTypography.fontFamily};
|
|
22
|
+
font-size: ${ALERT_TOKENS.titleTypography.fontSize}px;
|
|
23
|
+
font-weight: ${ALERT_TOKENS.titleTypography.fontWeight};
|
|
24
|
+
line-height: ${ALERT_TOKENS.titleTypography.lineHeight}px;
|
|
25
|
+
letter-spacing: ${ALERT_TOKENS.titleTypography.letterSpacing}px;
|
|
26
|
+
color: ${ALERT_TOKENS.textColor};
|
|
27
|
+
`;
|
|
28
|
+
export const DescriptionText = styled.Text `
|
|
29
|
+
font-family: ${ALERT_TOKENS.descriptionTypography.fontFamily};
|
|
30
|
+
font-size: ${ALERT_TOKENS.descriptionTypography.fontSize}px;
|
|
31
|
+
font-weight: ${ALERT_TOKENS.descriptionTypography.fontWeight};
|
|
32
|
+
line-height: ${ALERT_TOKENS.descriptionTypography.lineHeight}px;
|
|
33
|
+
letter-spacing: ${ALERT_TOKENS.descriptionTypography.letterSpacing}px;
|
|
34
|
+
color: ${ALERT_TOKENS.textColor};
|
|
35
|
+
`;
|
|
36
|
+
export const EmojiContainer = styled.View `
|
|
37
|
+
position: absolute;
|
|
38
|
+
top: ${ALERT_TOKENS.emoji.topOffset}px;
|
|
39
|
+
right: ${ALERT_TOKENS.emoji.rightOffset}px;
|
|
40
|
+
`;
|
|
41
|
+
export const EmojiText = styled.Text `
|
|
42
|
+
font-size: ${ALERT_TOKENS.emoji.fontSize}px;
|
|
43
|
+
line-height: ${ALERT_TOKENS.emoji.lineHeight}px;
|
|
44
|
+
`;
|
|
45
|
+
export const ImageContainer = styled.View `
|
|
46
|
+
position: absolute;
|
|
47
|
+
top: -45px;
|
|
48
|
+
right: ${ALERT_TOKENS.emoji.rightOffset}px;
|
|
49
|
+
`;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ImageSourcePropType, StyleProp, TextStyle, ViewStyle } from 'react-native';
|
|
2
|
+
export interface AlertProps {
|
|
3
|
+
/** Primary heading text */
|
|
4
|
+
title?: string;
|
|
5
|
+
/** Secondary descriptive text shown below the title */
|
|
6
|
+
description?: string;
|
|
7
|
+
/** Decorative emoji displayed at the top-right corner of the card */
|
|
8
|
+
emoji?: string;
|
|
9
|
+
/** Optional image source */
|
|
10
|
+
image?: ImageSourcePropType;
|
|
11
|
+
/** Optional container style overrides */
|
|
12
|
+
style?: StyleProp<ViewStyle>;
|
|
13
|
+
/** Optional title text style overrides */
|
|
14
|
+
titleStyle?: StyleProp<TextStyle>;
|
|
15
|
+
/** Optional description text style overrides */
|
|
16
|
+
descriptionStyle?: StyleProp<TextStyle>;
|
|
17
|
+
/** Optional type of alert */
|
|
18
|
+
type?: 'info' | 'error';
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/Alert/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzF,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { AvatarProps } from './types';
|
|
2
|
+
export declare function Avatar({ imageSource, name, email, size, style, backgroundColor, textColor, noDetails, shapes, onPhotoChange, testID, accessibilityLabel, }: AvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=Avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../src/Avatar/Avatar.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQtC,wBAAgB,MAAM,CAAC,EACrB,WAAW,EACX,IAAI,EACJ,KAAK,EACL,IAA0B,EAC1B,KAAK,EACL,eAA0C,EAC1C,SAA8B,EAC9B,SAAiB,EACjB,MAAM,EACN,aAAa,EACb,MAAM,EACN,kBAAkB,GACnB,EAAE,WAAW,2CA6Gb"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Alert, Pressable } from 'react-native';
|
|
3
|
+
import { AvatarContent, AvatarEmail, AvatarImage, AvatarInitials, AvatarName, AvatarNameContainer, BottomLeftShape, Container, EditBadge, TopRightShape, Wrapper, } from './styles';
|
|
4
|
+
import { getAvatarInitials, EditPhotoIcon, pickFromGallery, takePhoto } from './utilities';
|
|
5
|
+
import rombShape from './Shapes/romb.png';
|
|
6
|
+
import { AVATAR_COLORS, DEFAULT_AVATAR_SIZE } from './consts';
|
|
7
|
+
export function Avatar({ imageSource, name, email, size = DEFAULT_AVATAR_SIZE, style, backgroundColor = AVATAR_COLORS.background, textColor = AVATAR_COLORS.text, noDetails = false, shapes, onPhotoChange, testID, accessibilityLabel, }) {
|
|
8
|
+
const label = accessibilityLabel ?? (name ? `${name} avatar` : 'User avatar');
|
|
9
|
+
const editBadgeSize = 20;
|
|
10
|
+
const shapesMap = {
|
|
11
|
+
romb: rombShape,
|
|
12
|
+
};
|
|
13
|
+
const shapesNode = shapes && (_jsxs(_Fragment, { children: [_jsx(TopRightShape, { source: shapesMap[shapes], accessible: false, importantForAccessibility: "no-hide-descendants" }), _jsx(BottomLeftShape, { source: shapesMap[shapes], accessible: false, importantForAccessibility: "no-hide-descendants" })] }));
|
|
14
|
+
const avatarContentNode = (_jsx(AvatarContent, { size: size, backgroundColor: backgroundColor, borderColor: AVATAR_COLORS.border, children: imageSource ? (_jsx(AvatarImage, { source: imageSource, size: size })) : (_jsx(AvatarInitials, { size: size, textColor: textColor, children: getAvatarInitials(name) })) }));
|
|
15
|
+
const handleEditPhoto = () => {
|
|
16
|
+
if (!onPhotoChange)
|
|
17
|
+
return;
|
|
18
|
+
Alert.alert('Profile photo', 'Choose an option', [
|
|
19
|
+
{
|
|
20
|
+
text: 'Choose from gallery',
|
|
21
|
+
onPress: () => pickFromGallery(onPhotoChange),
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
text: 'Take photo',
|
|
25
|
+
onPress: () => takePhoto(onPhotoChange),
|
|
26
|
+
},
|
|
27
|
+
{ text: 'Cancel', style: 'cancel' },
|
|
28
|
+
]);
|
|
29
|
+
};
|
|
30
|
+
const avatarNode = (_jsxs(Container, { testID: testID, accessibilityRole: "image", accessibilityLabel: label, size: size, children: [shapesNode, avatarContentNode, onPhotoChange && (_jsx(EditBadge, { as: Pressable, onPress: handleEditPhoto, size: editBadgeSize, accessible: true, accessibilityRole: "button", accessibilityLabel: "Edit profile photo", importantForAccessibility: "no-hide-descendants", testID: "edit-avatar-button", backgroundColor: AVATAR_COLORS.editBadgeBackground, borderColor: AVATAR_COLORS.border, children: _jsx(EditPhotoIcon, { size: editBadgeSize, color: AVATAR_COLORS.editBadgeIcon }) }))] }));
|
|
31
|
+
const nameNode = (_jsxs(AvatarNameContainer, { children: [name && (_jsx(AvatarName, { numberOfLines: 1, children: name })), email && (_jsx(AvatarEmail, { numberOfLines: 1, children: email }))] }));
|
|
32
|
+
return (_jsxs(Wrapper, { style: style, children: [avatarNode, !noDetails && nameNode] }));
|
|
33
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Shapes",
|
|
3
|
+
"path": "react-lucky-components/src/Avatar/Shapes",
|
|
4
|
+
"description": "Folder containing related project files for this area.",
|
|
5
|
+
"generatedAt": "2026-03-02T00:41:04.006Z",
|
|
6
|
+
"scope": {
|
|
7
|
+
"recursive": true,
|
|
8
|
+
"excludedDirectories": [
|
|
9
|
+
"node_modules",
|
|
10
|
+
"Pods",
|
|
11
|
+
"dist",
|
|
12
|
+
"storybook-static",
|
|
13
|
+
"build",
|
|
14
|
+
"coverage",
|
|
15
|
+
".git",
|
|
16
|
+
".next",
|
|
17
|
+
".expo",
|
|
18
|
+
".turbo",
|
|
19
|
+
".gradle",
|
|
20
|
+
"DerivedData"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"entries": [
|
|
24
|
+
{
|
|
25
|
+
"name": "map.json",
|
|
26
|
+
"path": "react-lucky-components/src/Avatar/Shapes/map.json",
|
|
27
|
+
"type": "file",
|
|
28
|
+
"extension": ".json",
|
|
29
|
+
"generated": true,
|
|
30
|
+
"description": "Directory map generated by Codex for this folder."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "romb.png",
|
|
34
|
+
"path": "react-lucky-components/src/Avatar/Shapes/romb.png",
|
|
35
|
+
"type": "file",
|
|
36
|
+
"lastModified": "2026-02-14T04:46:29.289Z",
|
|
37
|
+
"extension": ".png",
|
|
38
|
+
"sizeBytes": 154445,
|
|
39
|
+
"description": "Image asset used by UI or documentation."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const DEFAULT_EDIT_PHOTO_COPY: {
|
|
2
|
+
alertTitle: string;
|
|
3
|
+
alertMessage: string;
|
|
4
|
+
galleryLabel: string;
|
|
5
|
+
takePhotoLabel: string;
|
|
6
|
+
cancelLabel: string;
|
|
7
|
+
permissionLibrary: string;
|
|
8
|
+
permissionCamera: string;
|
|
9
|
+
errorSelect: string;
|
|
10
|
+
errorCapture: string;
|
|
11
|
+
};
|
|
12
|
+
export declare const DEFAULT_AVATAR_SIZE = 40;
|
|
13
|
+
export declare const FALLBACK_INITIALS = "?";
|
|
14
|
+
export declare const AVATAR_COLORS: {
|
|
15
|
+
readonly background: "#E5E5EA";
|
|
16
|
+
readonly text: "#1C1C1E";
|
|
17
|
+
readonly border: "#FFFFFF";
|
|
18
|
+
readonly editBadgeBackground: "#2C2C2C";
|
|
19
|
+
readonly editBadgeIcon: "#FFFFFF";
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/Avatar/consts.tsx"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB;;;;;;;;;;CAUnC,CAAC;AAEF,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const DEFAULT_EDIT_PHOTO_COPY = {
|
|
2
|
+
alertTitle: 'Profile photo',
|
|
3
|
+
alertMessage: 'Choose an option',
|
|
4
|
+
galleryLabel: 'Choose from gallery',
|
|
5
|
+
takePhotoLabel: 'Take photo',
|
|
6
|
+
cancelLabel: 'Cancel',
|
|
7
|
+
permissionLibrary: 'Please allow access to your photo library to choose a profile photo.',
|
|
8
|
+
permissionCamera: 'Please allow camera access to take a profile photo.',
|
|
9
|
+
errorSelect: 'Failed to select photo. Please try again.',
|
|
10
|
+
errorCapture: 'Failed to capture photo. Please try again.',
|
|
11
|
+
};
|
|
12
|
+
export const DEFAULT_AVATAR_SIZE = 40;
|
|
13
|
+
export const FALLBACK_INITIALS = '?';
|
|
14
|
+
export const AVATAR_COLORS = {
|
|
15
|
+
background: '#E5E5EA',
|
|
16
|
+
text: '#1C1C1E',
|
|
17
|
+
border: '#FFFFFF',
|
|
18
|
+
editBadgeBackground: '#2C2C2C',
|
|
19
|
+
editBadgeIcon: '#FFFFFF',
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Avatar } from './Avatar';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const Wrapper: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
2
|
+
export declare const Container: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").ViewProps, {
|
|
3
|
+
size: number;
|
|
4
|
+
}>>;
|
|
5
|
+
export declare const TopRightShape: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ImageProps, never>>;
|
|
6
|
+
export declare const BottomLeftShape: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ImageProps, never>>;
|
|
7
|
+
export declare const AvatarContent: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").ViewProps, {
|
|
8
|
+
size: number;
|
|
9
|
+
backgroundColor: string;
|
|
10
|
+
borderColor: string;
|
|
11
|
+
}>>;
|
|
12
|
+
export declare const AvatarImage: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").ImageProps, {
|
|
13
|
+
size: number;
|
|
14
|
+
}>>;
|
|
15
|
+
export declare const AvatarInitials: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").TextProps, {
|
|
16
|
+
size: number;
|
|
17
|
+
textColor: string;
|
|
18
|
+
}>>;
|
|
19
|
+
export declare const EditBadge: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").Substitute<import("react-native").ViewProps, {
|
|
20
|
+
size: number;
|
|
21
|
+
backgroundColor: string;
|
|
22
|
+
borderColor: string;
|
|
23
|
+
}>>;
|
|
24
|
+
export declare const AvatarNameContainer: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").ViewProps, never>>;
|
|
25
|
+
export declare const AvatarName: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
26
|
+
export declare const AvatarEmail: import("styled-components/native/dist/types").IStyledComponentBase<"native", import("styled-components/native/dist/types").FastOmit<import("react-native").TextProps, never>>;
|
|
27
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/Avatar/styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,+KAEnB,CAAC;AAEF,eAAO,MAAM,SAAS;UAAuB,MAAM;GAIlD,CAAC;AAEF,eAAO,MAAM,aAAa,gLAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,gLAO3B,CAAC;AAEF,eAAO,MAAM,aAAa;UAAuB,MAAM;qBAAmB,MAAM;iBAAe,MAAM;GAQpG,CAAC;AAEF,eAAO,MAAM,WAAW;UAAwB,MAAM;GAGrD,CAAC;AAEF,eAAO,MAAM,cAAc;UAAuB,MAAM;eAAa,MAAM;GAM1E,CAAC;AAEF,eAAO,MAAM,SAAS;UAAuB,MAAM;qBAAmB,MAAM;iBAAe,MAAM;GAYhG,CAAC;AAEF,eAAO,MAAM,mBAAmB,+KAE/B,CAAC;AAEF,eAAO,MAAM,UAAU,+KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,+KASvB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import styled from 'styled-components/native';
|
|
2
|
+
import { typography } from '../theme';
|
|
3
|
+
export const Wrapper = styled.View `
|
|
4
|
+
align-items: center;
|
|
5
|
+
`;
|
|
6
|
+
export const Container = styled.View `
|
|
7
|
+
position: relative;
|
|
8
|
+
width: ${({ size }) => `${size}px`};
|
|
9
|
+
height: ${({ size }) => `${size}px`};
|
|
10
|
+
`;
|
|
11
|
+
export const TopRightShape = styled.Image `
|
|
12
|
+
position: absolute;
|
|
13
|
+
width: 108px;
|
|
14
|
+
height: 109px;
|
|
15
|
+
top: -36px;
|
|
16
|
+
right: -35px;
|
|
17
|
+
z-index: 10;
|
|
18
|
+
`;
|
|
19
|
+
export const BottomLeftShape = styled.Image `
|
|
20
|
+
position: absolute;
|
|
21
|
+
width: 88px;
|
|
22
|
+
height: 89px;
|
|
23
|
+
left: -13px;
|
|
24
|
+
bottom: -13px;
|
|
25
|
+
z-index: 10;
|
|
26
|
+
`;
|
|
27
|
+
export const AvatarContent = styled.View `
|
|
28
|
+
width: ${({ size }) => `${size}px`};
|
|
29
|
+
height: ${({ size }) => `${size}px`};
|
|
30
|
+
border-radius: ${({ size }) => `${size / 2}px`};
|
|
31
|
+
background-color: ${({ backgroundColor }) => backgroundColor};
|
|
32
|
+
border-width: 1px;
|
|
33
|
+
border-color: ${({ borderColor }) => borderColor};
|
|
34
|
+
overflow: hidden;
|
|
35
|
+
`;
|
|
36
|
+
export const AvatarImage = styled.Image `
|
|
37
|
+
width: ${({ size }) => `${size}px`};
|
|
38
|
+
height: ${({ size }) => `${size}px`};
|
|
39
|
+
`;
|
|
40
|
+
export const AvatarInitials = styled.Text `
|
|
41
|
+
font-size: ${({ size }) => `${Math.max(12, Math.floor(size * 0.4))}px`};
|
|
42
|
+
color: ${({ textColor }) => textColor};
|
|
43
|
+
font-weight: ${typography.fontWeight.semibold};
|
|
44
|
+
text-align: center;
|
|
45
|
+
line-height: ${({ size }) => `${size}px`};
|
|
46
|
+
`;
|
|
47
|
+
export const EditBadge = styled.View `
|
|
48
|
+
border-radius: 100%;
|
|
49
|
+
right: 10px;
|
|
50
|
+
bottom: 10px;
|
|
51
|
+
padding: 12px;
|
|
52
|
+
position: absolute;
|
|
53
|
+
z-index: 2;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
align-items: center;
|
|
56
|
+
background-color: ${({ backgroundColor }) => backgroundColor};
|
|
57
|
+
border-width: 1px;
|
|
58
|
+
border-color: ${({ borderColor }) => borderColor};
|
|
59
|
+
`;
|
|
60
|
+
export const AvatarNameContainer = styled.View `
|
|
61
|
+
margin-top: 16px;
|
|
62
|
+
`;
|
|
63
|
+
export const AvatarName = styled.Text `
|
|
64
|
+
overflow: hidden;
|
|
65
|
+
color: #2C2C2C;
|
|
66
|
+
text-overflow: ellipsis;
|
|
67
|
+
text-align: center;
|
|
68
|
+
font-family: "SF Pro";
|
|
69
|
+
font-size: 32px;
|
|
70
|
+
font-weight: 590;
|
|
71
|
+
letter-spacing: 0.16px;
|
|
72
|
+
margin-bottom: 4px;
|
|
73
|
+
`;
|
|
74
|
+
export const AvatarEmail = styled.Text `
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
color: #738295;
|
|
77
|
+
text-align: center;
|
|
78
|
+
text-overflow: ellipsis;
|
|
79
|
+
font-family: "SF Pro";
|
|
80
|
+
font-size: 16px;
|
|
81
|
+
font-weight: 400;
|
|
82
|
+
letter-spacing: 0.08px;
|
|
83
|
+
`;
|