zero-to-app 2.0.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 +929 -0
- package/dist/brand/brandConfig.d.ts +48 -0
- package/dist/brand/brandConfig.d.ts.map +1 -0
- package/dist/brand/brandConfig.js +41 -0
- package/dist/brand/brandConfig.js.map +1 -0
- package/dist/brand/brandContext.d.ts +10 -0
- package/dist/brand/brandContext.d.ts.map +1 -0
- package/dist/brand/brandContext.js +16 -0
- package/dist/brand/brandContext.js.map +1 -0
- package/dist/brand/brandTypes.d.ts +54 -0
- package/dist/brand/brandTypes.d.ts.map +1 -0
- package/dist/brand/brandTypes.js +2 -0
- package/dist/brand/brandTypes.js.map +1 -0
- package/dist/brand/index.d.ts +4 -0
- package/dist/brand/index.d.ts.map +1 -0
- package/dist/brand/index.js +5 -0
- package/dist/brand/index.js.map +1 -0
- package/dist/components/action/ActionRow.d.ts +25 -0
- package/dist/components/action/ActionRow.d.ts.map +1 -0
- package/dist/components/action/ActionRow.js +66 -0
- package/dist/components/action/ActionRow.js.map +1 -0
- package/dist/components/action/index.d.ts +2 -0
- package/dist/components/action/index.d.ts.map +1 -0
- package/dist/components/action/index.js +3 -0
- package/dist/components/action/index.js.map +1 -0
- package/dist/components/card/Card.d.ts +11 -0
- package/dist/components/card/Card.d.ts.map +1 -0
- package/dist/components/card/Card.js +32 -0
- package/dist/components/card/Card.js.map +1 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/card/index.js +2 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/chat/ChatContainer.d.ts +27 -0
- package/dist/components/chat/ChatContainer.d.ts.map +1 -0
- package/dist/components/chat/ChatContainer.js +52 -0
- package/dist/components/chat/ChatContainer.js.map +1 -0
- package/dist/components/chat/ChatInput.d.ts +9 -0
- package/dist/components/chat/ChatInput.d.ts.map +1 -0
- package/dist/components/chat/ChatInput.js +219 -0
- package/dist/components/chat/ChatInput.js.map +1 -0
- package/dist/components/chat/ChatMessages.d.ts +9 -0
- package/dist/components/chat/ChatMessages.d.ts.map +1 -0
- package/dist/components/chat/ChatMessages.js +35 -0
- package/dist/components/chat/ChatMessages.js.map +1 -0
- package/dist/components/chat/EmptyChat.d.ts +18 -0
- package/dist/components/chat/EmptyChat.d.ts.map +1 -0
- package/dist/components/chat/EmptyChat.js +64 -0
- package/dist/components/chat/EmptyChat.js.map +1 -0
- package/dist/components/chat/Message.d.ts +8 -0
- package/dist/components/chat/Message.d.ts.map +1 -0
- package/dist/components/chat/Message.js +47 -0
- package/dist/components/chat/Message.js.map +1 -0
- package/dist/components/chat/index.d.ts +6 -0
- package/dist/components/chat/index.d.ts.map +1 -0
- package/dist/components/chat/index.js +7 -0
- package/dist/components/chat/index.js.map +1 -0
- package/dist/components/chat/types.d.ts +34 -0
- package/dist/components/chat/types.d.ts.map +1 -0
- package/dist/components/chat/types.js +2 -0
- package/dist/components/chat/types.js.map +1 -0
- package/dist/components/form/DropDownSelect.d.ts +12 -0
- package/dist/components/form/DropDownSelect.d.ts.map +1 -0
- package/dist/components/form/DropDownSelect.js +63 -0
- package/dist/components/form/DropDownSelect.js.map +1 -0
- package/dist/components/form/EmailSubscriptionForm.d.ts +14 -0
- package/dist/components/form/EmailSubscriptionForm.d.ts.map +1 -0
- package/dist/components/form/EmailSubscriptionForm.js +58 -0
- package/dist/components/form/EmailSubscriptionForm.js.map +1 -0
- package/dist/components/form/FormErrors.d.ts +7 -0
- package/dist/components/form/FormErrors.d.ts.map +1 -0
- package/dist/components/form/FormErrors.js +35 -0
- package/dist/components/form/FormErrors.js.map +1 -0
- package/dist/components/form/FormInput.d.ts +14 -0
- package/dist/components/form/FormInput.d.ts.map +1 -0
- package/dist/components/form/FormInput.js +35 -0
- package/dist/components/form/FormInput.js.map +1 -0
- package/dist/components/form/FormSeparator.d.ts +6 -0
- package/dist/components/form/FormSeparator.d.ts.map +1 -0
- package/dist/components/form/FormSeparator.js +25 -0
- package/dist/components/form/FormSeparator.js.map +1 -0
- package/dist/components/form/index.d.ts +6 -0
- package/dist/components/form/index.d.ts.map +1 -0
- package/dist/components/form/index.js +7 -0
- package/dist/components/form/index.js.map +1 -0
- package/dist/components/index.d.ts +11 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +12 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/layout/Footer.d.ts +3 -0
- package/dist/components/layout/Footer.d.ts.map +1 -0
- package/dist/components/layout/Footer.js +60 -0
- package/dist/components/layout/Footer.js.map +1 -0
- package/dist/components/layout/MinimalFooter.d.ts +8 -0
- package/dist/components/layout/MinimalFooter.d.ts.map +1 -0
- package/dist/components/layout/MinimalFooter.js +57 -0
- package/dist/components/layout/MinimalFooter.js.map +1 -0
- package/dist/components/layout/MobileFooterBar.d.ts +7 -0
- package/dist/components/layout/MobileFooterBar.d.ts.map +1 -0
- package/dist/components/layout/MobileFooterBar.js +18 -0
- package/dist/components/layout/MobileFooterBar.js.map +1 -0
- package/dist/components/layout/ParallaxScrollView.d.ts +11 -0
- package/dist/components/layout/ParallaxScrollView.d.ts.map +1 -0
- package/dist/components/layout/ParallaxScrollView.js +67 -0
- package/dist/components/layout/ParallaxScrollView.js.map +1 -0
- package/dist/components/layout/WebPageLayout.d.ts +17 -0
- package/dist/components/layout/WebPageLayout.d.ts.map +1 -0
- package/dist/components/layout/WebPageLayout.js +103 -0
- package/dist/components/layout/WebPageLayout.js.map +1 -0
- package/dist/components/layout/index.d.ts +6 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +9 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/list/List.d.ts +10 -0
- package/dist/components/list/List.d.ts.map +1 -0
- package/dist/components/list/List.js +18 -0
- package/dist/components/list/List.js.map +1 -0
- package/dist/components/list/ListButton.d.ts +13 -0
- package/dist/components/list/ListButton.d.ts.map +1 -0
- package/dist/components/list/ListButton.js +24 -0
- package/dist/components/list/ListButton.js.map +1 -0
- package/dist/components/list/ListDivider.d.ts +7 -0
- package/dist/components/list/ListDivider.d.ts.map +1 -0
- package/dist/components/list/ListDivider.js +23 -0
- package/dist/components/list/ListDivider.js.map +1 -0
- package/dist/components/list/index.d.ts +4 -0
- package/dist/components/list/index.d.ts.map +1 -0
- package/dist/components/list/index.js +4 -0
- package/dist/components/list/index.js.map +1 -0
- package/dist/components/media/Carousel.d.ts +18 -0
- package/dist/components/media/Carousel.d.ts.map +1 -0
- package/dist/components/media/Carousel.js +60 -0
- package/dist/components/media/Carousel.js.map +1 -0
- package/dist/components/media/FeatureCard.d.ts +9 -0
- package/dist/components/media/FeatureCard.d.ts.map +1 -0
- package/dist/components/media/FeatureCard.js +68 -0
- package/dist/components/media/FeatureCard.js.map +1 -0
- package/dist/components/media/HorizontalCarousel.d.ts +17 -0
- package/dist/components/media/HorizontalCarousel.d.ts.map +1 -0
- package/dist/components/media/HorizontalCarousel.js +60 -0
- package/dist/components/media/HorizontalCarousel.js.map +1 -0
- package/dist/components/media/ImageCarousel.d.ts +14 -0
- package/dist/components/media/ImageCarousel.d.ts.map +1 -0
- package/dist/components/media/ImageCarousel.js +21 -0
- package/dist/components/media/ImageCarousel.js.map +1 -0
- package/dist/components/media/MediaTile.d.ts +30 -0
- package/dist/components/media/MediaTile.d.ts.map +1 -0
- package/dist/components/media/MediaTile.js +51 -0
- package/dist/components/media/MediaTile.js.map +1 -0
- package/dist/components/media/SkeletonMediaTile.d.ts +17 -0
- package/dist/components/media/SkeletonMediaTile.d.ts.map +1 -0
- package/dist/components/media/SkeletonMediaTile.js +67 -0
- package/dist/components/media/SkeletonMediaTile.js.map +1 -0
- package/dist/components/media/index.d.ts +7 -0
- package/dist/components/media/index.d.ts.map +1 -0
- package/dist/components/media/index.js +8 -0
- package/dist/components/media/index.js.map +1 -0
- package/dist/components/navigation/AppbarWeb.d.ts +18 -0
- package/dist/components/navigation/AppbarWeb.d.ts.map +1 -0
- package/dist/components/navigation/AppbarWeb.js +70 -0
- package/dist/components/navigation/AppbarWeb.js.map +1 -0
- package/dist/components/navigation/IconButtonGroup.d.ts +7 -0
- package/dist/components/navigation/IconButtonGroup.d.ts.map +1 -0
- package/dist/components/navigation/IconButtonGroup.js +33 -0
- package/dist/components/navigation/IconButtonGroup.js.map +1 -0
- package/dist/components/navigation/Logo.d.ts +16 -0
- package/dist/components/navigation/Logo.d.ts.map +1 -0
- package/dist/components/navigation/Logo.js +64 -0
- package/dist/components/navigation/Logo.js.map +1 -0
- package/dist/components/navigation/MobileMenuDrawer.d.ts +13 -0
- package/dist/components/navigation/MobileMenuDrawer.d.ts.map +1 -0
- package/dist/components/navigation/MobileMenuDrawer.js +184 -0
- package/dist/components/navigation/MobileMenuDrawer.js.map +1 -0
- package/dist/components/navigation/ScreenHeader.d.ts +30 -0
- package/dist/components/navigation/ScreenHeader.d.ts.map +1 -0
- package/dist/components/navigation/ScreenHeader.js +127 -0
- package/dist/components/navigation/ScreenHeader.js.map +1 -0
- package/dist/components/navigation/iconUtils.d.ts +24 -0
- package/dist/components/navigation/iconUtils.d.ts.map +1 -0
- package/dist/components/navigation/iconUtils.js +53 -0
- package/dist/components/navigation/iconUtils.js.map +1 -0
- package/dist/components/navigation/index.d.ts +6 -0
- package/dist/components/navigation/index.d.ts.map +1 -0
- package/dist/components/navigation/index.js +7 -0
- package/dist/components/navigation/index.js.map +1 -0
- package/dist/components/tile/Tile.d.ts +18 -0
- package/dist/components/tile/Tile.d.ts.map +1 -0
- package/dist/components/tile/Tile.js +41 -0
- package/dist/components/tile/Tile.js.map +1 -0
- package/dist/components/tile/index.d.ts +2 -0
- package/dist/components/tile/index.d.ts.map +1 -0
- package/dist/components/tile/index.js +2 -0
- package/dist/components/tile/index.js.map +1 -0
- package/dist/components/ui/ArrowButton.d.ts +8 -0
- package/dist/components/ui/ArrowButton.d.ts.map +1 -0
- package/dist/components/ui/ArrowButton.js +30 -0
- package/dist/components/ui/ArrowButton.js.map +1 -0
- package/dist/components/ui/BlurButton.d.ts +16 -0
- package/dist/components/ui/BlurButton.d.ts.map +1 -0
- package/dist/components/ui/BlurButton.js +26 -0
- package/dist/components/ui/BlurButton.js.map +1 -0
- package/dist/components/ui/Button.d.ts +24 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Button.js +60 -0
- package/dist/components/ui/Button.js.map +1 -0
- package/dist/components/ui/ErrorBoundary.d.ts +18 -0
- package/dist/components/ui/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ui/ErrorBoundary.js +37 -0
- package/dist/components/ui/ErrorBoundary.js.map +1 -0
- package/dist/components/ui/IconButton.d.ts +13 -0
- package/dist/components/ui/IconButton.d.ts.map +1 -0
- package/dist/components/ui/IconButton.js +27 -0
- package/dist/components/ui/IconButton.js.map +1 -0
- package/dist/components/ui/LoadingIndicator.d.ts +6 -0
- package/dist/components/ui/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/ui/LoadingIndicator.js +15 -0
- package/dist/components/ui/LoadingIndicator.js.map +1 -0
- package/dist/components/ui/NotificationBadge.d.ts +8 -0
- package/dist/components/ui/NotificationBadge.d.ts.map +1 -0
- package/dist/components/ui/NotificationBadge.js +24 -0
- package/dist/components/ui/NotificationBadge.js.map +1 -0
- package/dist/components/ui/SkeletonCard.d.ts +14 -0
- package/dist/components/ui/SkeletonCard.d.ts.map +1 -0
- package/dist/components/ui/SkeletonCard.js +50 -0
- package/dist/components/ui/SkeletonCard.js.map +1 -0
- package/dist/components/ui/StyledText.d.ts +17 -0
- package/dist/components/ui/StyledText.d.ts.map +1 -0
- package/dist/components/ui/StyledText.js +27 -0
- package/dist/components/ui/StyledText.js.map +1 -0
- package/dist/components/ui/StyledTextInput.d.ts +10 -0
- package/dist/components/ui/StyledTextInput.d.ts.map +1 -0
- package/dist/components/ui/StyledTextInput.js +62 -0
- package/dist/components/ui/StyledTextInput.js.map +1 -0
- package/dist/components/ui/TextLink.d.ts +14 -0
- package/dist/components/ui/TextLink.d.ts.map +1 -0
- package/dist/components/ui/TextLink.js +25 -0
- package/dist/components/ui/TextLink.js.map +1 -0
- package/dist/components/ui/ToggleIconButton.d.ts +14 -0
- package/dist/components/ui/ToggleIconButton.d.ts.map +1 -0
- package/dist/components/ui/ToggleIconButton.js +19 -0
- package/dist/components/ui/ToggleIconButton.js.map +1 -0
- package/dist/components/ui/index.d.ts +13 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +14 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/context/scrollContext.d.ts +8 -0
- package/dist/context/scrollContext.d.ts.map +1 -0
- package/dist/context/scrollContext.js +16 -0
- package/dist/context/scrollContext.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useDimensions.d.ts +31 -0
- package/dist/hooks/useDimensions.d.ts.map +1 -0
- package/dist/hooks/useDimensions.js +44 -0
- package/dist/hooks/useDimensions.js.map +1 -0
- package/dist/hooks/useWindowHeight.d.ts +7 -0
- package/dist/hooks/useWindowHeight.d.ts.map +1 -0
- package/dist/hooks/useWindowHeight.js +10 -0
- package/dist/hooks/useWindowHeight.js.map +1 -0
- package/dist/hooks/useWindowWidth.d.ts +20 -0
- package/dist/hooks/useWindowWidth.d.ts.map +1 -0
- package/dist/hooks/useWindowWidth.js +27 -0
- package/dist/hooks/useWindowWidth.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +4 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme.d.ts +15 -0
- package/dist/theme/theme.d.ts.map +1 -0
- package/dist/theme/theme.js +38 -0
- package/dist/theme/theme.js.map +1 -0
- package/dist/theme/themeConfig.d.ts +19 -0
- package/dist/theme/themeConfig.d.ts.map +1 -0
- package/dist/theme/themeConfig.js +43 -0
- package/dist/theme/themeConfig.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailSubscriptionForm.d.ts","sourceRoot":"","sources":["../../../components/form/EmailSubscriptionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,UAAU,0BAA0B;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAQD,QAAA,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAsG/D,CAAC;AAQF,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { StyleSheet, View, TextInput } from 'react-native';
|
|
4
|
+
import { ThemeContext } from '../../theme';
|
|
5
|
+
import { StyledText, Button } from '../ui';
|
|
6
|
+
import { Card } from '../card';
|
|
7
|
+
import { useBrand } from '../../brand';
|
|
8
|
+
import { useForm, Controller } from 'react-hook-form';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
11
|
+
const emailSchema = z.object({
|
|
12
|
+
email: z.string().email('Please enter a valid email address'),
|
|
13
|
+
});
|
|
14
|
+
const EmailSubscriptionForm = ({ title = 'Get notified of deals on Night Club Guest Lists, Table Reservations and Tickets.', placeholder = 'Enter your email', buttonText = 'Notify Me', successView, onSubmit, }) => {
|
|
15
|
+
const theme = React.useContext(ThemeContext);
|
|
16
|
+
const brand = useBrand();
|
|
17
|
+
const [success, setSuccess] = React.useState(false);
|
|
18
|
+
const [error, setError] = React.useState(null);
|
|
19
|
+
const [isLoading, setIsLoading] = React.useState(false);
|
|
20
|
+
const { control, handleSubmit, reset, formState: { errors }, } = useForm({
|
|
21
|
+
resolver: zodResolver(emailSchema),
|
|
22
|
+
});
|
|
23
|
+
const submitEmail = async (data) => {
|
|
24
|
+
setIsLoading(true);
|
|
25
|
+
setError(null);
|
|
26
|
+
const result = await onSubmit(data.email);
|
|
27
|
+
setIsLoading(false);
|
|
28
|
+
if (result.success) {
|
|
29
|
+
setSuccess(true);
|
|
30
|
+
reset();
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
setError(result.error || 'Something went wrong');
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
return (_jsx(Card, { children: _jsx(View, { style: styles.container, children: success ? (successView ? (successView) : (_jsxs(View, { style: { flexDirection: 'column', alignItems: 'flex-start', gap: 8 }, children: [_jsx(StyledText, { fontSize: 'md', children: "Thank you!" }), _jsx(StyledText, { fontSize: 'md', muted: true, children: "Your subscription has been confirmed and added to our list." })] }))) : (_jsxs(_Fragment, { children: [_jsx(StyledText, { fontSize: 'md', children: title }), _jsx(Controller, { control: control, name: "email", render: ({ field: { onChange, value } }) => (_jsx(TextInput, { placeholder: placeholder, placeholderTextColor: theme.values.inactiveIconColor, style: {
|
|
37
|
+
width: '100%',
|
|
38
|
+
padding: 15,
|
|
39
|
+
borderRadius: brand.borderRadius,
|
|
40
|
+
borderWidth: 1,
|
|
41
|
+
borderColor: theme.values.borderColor,
|
|
42
|
+
backgroundColor: theme.values.inputBackgroundColor,
|
|
43
|
+
color: theme.values.color,
|
|
44
|
+
fontSize: 16,
|
|
45
|
+
}, keyboardType: "email-address", autoCapitalize: "none", autoCorrect: false, editable: !isLoading, value: value, onChangeText: onChange })) }), errors.email && (_jsx(StyledText, { fontSize: "sm", color: "red", children: errors.email.message })), error && !errors.email && (_jsx(StyledText, { fontSize: "sm", color: "red", children: error })), _jsx(Button, { title: isLoading ? 'Submitting...' : buttonText, icon: {
|
|
46
|
+
library: 'Feather',
|
|
47
|
+
name: 'bell',
|
|
48
|
+
size: 20,
|
|
49
|
+
color: '#FFFFFF',
|
|
50
|
+
}, onPress: handleSubmit(submitEmail) })] })) }) }));
|
|
51
|
+
};
|
|
52
|
+
const styles = StyleSheet.create({
|
|
53
|
+
container: {
|
|
54
|
+
gap: 20,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
export default EmailSubscriptionForm;
|
|
58
|
+
//# sourceMappingURL=EmailSubscriptionForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailSubscriptionForm.js","sourceRoot":"","sources":["../../../components/form/EmailSubscriptionForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormErrors.d.ts","sourceRoot":"","sources":["../../../components/form/FormErrors.tsx"],"names":[],"mappings":"AAGA,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF,iBAAS,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,eAAe,kDAuBzD;AAWD,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { StyleSheet, Text } from 'react-native';
|
|
4
|
+
function FormErrors({ error, clearError }) {
|
|
5
|
+
const [visible, setVisible] = useState(!!error);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (error) {
|
|
8
|
+
setVisible(true);
|
|
9
|
+
if (clearError) {
|
|
10
|
+
const timer = setTimeout(() => {
|
|
11
|
+
clearError();
|
|
12
|
+
setVisible(false);
|
|
13
|
+
}, 5000);
|
|
14
|
+
return () => clearTimeout(timer);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
setVisible(false);
|
|
19
|
+
}
|
|
20
|
+
}, [error, clearError]);
|
|
21
|
+
if (!visible || !error) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return _jsx(Text, { style: styles.errorText, children: error });
|
|
25
|
+
}
|
|
26
|
+
const styles = StyleSheet.create({
|
|
27
|
+
errorText: {
|
|
28
|
+
color: '#ff4444',
|
|
29
|
+
fontSize: 12,
|
|
30
|
+
marginTop: 5,
|
|
31
|
+
marginBottom: 10,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
export { FormErrors };
|
|
35
|
+
//# sourceMappingURL=FormErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormErrors.js","sourceRoot":"","sources":["../../../components/form/FormErrors.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAOhD,SAAS,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAmB;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,UAAU,EAAE,CAAC;oBACb,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAAG,KAAK,GAAQ,CAAC;AACvD,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,EAAE;KACjB;CACF,CAAC,CAAC;AAEH,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Control, FieldError, FieldValues, Path } from 'react-hook-form';
|
|
2
|
+
type FormInputProps<T extends FieldValues> = {
|
|
3
|
+
control: Control<T>;
|
|
4
|
+
placeholder: string;
|
|
5
|
+
name: Path<T>;
|
|
6
|
+
error?: FieldError;
|
|
7
|
+
secureTextEntry?: boolean;
|
|
8
|
+
keyboardType?: 'default' | 'email-address' | 'numeric' | 'phone-pad' | 'number-pad';
|
|
9
|
+
autoCapitalize?: 'none' | 'sentences' | 'words' | 'characters';
|
|
10
|
+
autoCorrect?: boolean;
|
|
11
|
+
};
|
|
12
|
+
declare function FormInput<T extends FieldValues>({ control, placeholder, name, error, secureTextEntry, keyboardType, autoCapitalize, autoCorrect, }: FormInputProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export { FormInput };
|
|
14
|
+
//# sourceMappingURL=FormInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormInput.d.ts","sourceRoot":"","sources":["../../../components/form/FormInput.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAc,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAIrF,KAAK,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI;IAC3C,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;IACpF,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,CAAC;IAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,iBAAS,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,EACxC,OAAO,EACP,WAAW,EACX,IAAI,EACJ,KAAK,EACL,eAAuB,EACvB,YAAwB,EACxB,cAA4B,EAC5B,WAAkB,GACnB,EAAE,cAAc,CAAC,CAAC,CAAC,2CAoDnB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useContext, useMemo } from 'react';
|
|
3
|
+
import { StyleSheet, Text, TextInput, View } from 'react-native';
|
|
4
|
+
import { Controller } from 'react-hook-form';
|
|
5
|
+
import { useBrand } from '../../brand';
|
|
6
|
+
import { ThemeContext } from '../../theme';
|
|
7
|
+
function FormInput({ control, placeholder, name, error, secureTextEntry = false, keyboardType = 'default', autoCapitalize = 'sentences', autoCorrect = true, }) {
|
|
8
|
+
const theme = useContext(ThemeContext);
|
|
9
|
+
const brand = useBrand();
|
|
10
|
+
const styles = useMemo(() => StyleSheet.create({
|
|
11
|
+
container: {
|
|
12
|
+
marginBottom: brand.spacing.md + 3,
|
|
13
|
+
},
|
|
14
|
+
input: {
|
|
15
|
+
borderWidth: 1,
|
|
16
|
+
borderRadius: brand.borderRadius,
|
|
17
|
+
padding: brand.spacing.md + 3,
|
|
18
|
+
fontSize: 16,
|
|
19
|
+
},
|
|
20
|
+
errorText: {
|
|
21
|
+
fontSize: 12,
|
|
22
|
+
marginTop: 5, // Keep 5 for error text spacing
|
|
23
|
+
},
|
|
24
|
+
}), [brand]);
|
|
25
|
+
return (_jsxs(View, { style: styles.container, children: [_jsx(Controller, { control: control, name: name, render: ({ field: { onChange, onBlur, value } }) => (_jsx(TextInput, { style: [
|
|
26
|
+
styles.input,
|
|
27
|
+
{
|
|
28
|
+
borderColor: error ? '#ff4444' : theme.values.borderColor,
|
|
29
|
+
backgroundColor: theme.values.inputBackgroundColor,
|
|
30
|
+
color: theme.values.color,
|
|
31
|
+
},
|
|
32
|
+
], placeholder: placeholder, placeholderTextColor: theme.values.inactiveIconColor, value: value, onChangeText: onChange, onBlur: onBlur, secureTextEntry: secureTextEntry, keyboardType: keyboardType, autoCapitalize: autoCapitalize, autoCorrect: autoCorrect })) }), error && (_jsx(Text, { style: [styles.errorText, { color: '#ff4444' }], children: error.message }))] }));
|
|
33
|
+
}
|
|
34
|
+
export { FormInput };
|
|
35
|
+
//# sourceMappingURL=FormInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormInput.js","sourceRoot":"","sources":["../../../components/form/FormInput.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAW,UAAU,EAAiC,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAa3C,SAAS,SAAS,CAAwB,EACxC,OAAO,EACP,WAAW,EACX,IAAI,EACJ,KAAK,EACL,eAAe,GAAG,KAAK,EACvB,YAAY,GAAG,SAAS,EACxB,cAAc,GAAG,WAAW,EAC5B,WAAW,GAAG,IAAI,GACA;IAClB,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7C,SAAS,EAAE;YACT,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC;SACnC;QACD,KAAK,EAAE;YACL,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC;YAC7B,QAAQ,EAAE,EAAE;SACb;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,CAAC,EAAE,gCAAgC;SAC/C;KACF,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,aAC3B,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAClD,KAAC,SAAS,IACR,KAAK,EAAE;wBACL,MAAM,CAAC,KAAK;wBACZ;4BACE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;4BACzD,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,oBAAoB;4BAClD,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;yBAC1B;qBACF,EACD,WAAW,EAAE,WAAW,EACxB,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,iBAAiB,EACpD,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,QAAQ,EACtB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,GACxB,CACH,GACD,EACD,KAAK,IAAI,CACR,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,YAAG,KAAK,CAAC,OAAO,GAAQ,CAC9E,IACI,CACR,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormSeparator.d.ts","sourceRoot":"","sources":["../../../components/form/FormSeparator.tsx"],"names":[],"mappings":"AAIA,KAAK,kBAAkB,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,iBAAS,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,kBAAkB,2CAYlD;AAkBD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useContext } from 'react';
|
|
3
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
4
|
+
import { ThemeContext } from '../../theme';
|
|
5
|
+
function FormSeparator({ text }) {
|
|
6
|
+
const theme = useContext(ThemeContext);
|
|
7
|
+
return (_jsxs(View, { style: styles.container, children: [_jsx(View, { style: [styles.line, { backgroundColor: theme.values.dividerColor }] }), text && (_jsx(Text, { style: [styles.text, { color: theme.values.color }], children: text })), _jsx(View, { style: [styles.line, { backgroundColor: theme.values.dividerColor }] })] }));
|
|
8
|
+
}
|
|
9
|
+
const styles = StyleSheet.create({
|
|
10
|
+
container: {
|
|
11
|
+
flexDirection: 'row',
|
|
12
|
+
alignItems: 'center',
|
|
13
|
+
marginVertical: 20,
|
|
14
|
+
},
|
|
15
|
+
line: {
|
|
16
|
+
flex: 1,
|
|
17
|
+
height: 1,
|
|
18
|
+
},
|
|
19
|
+
text: {
|
|
20
|
+
marginHorizontal: 15,
|
|
21
|
+
fontSize: 14,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
export { FormSeparator };
|
|
25
|
+
//# sourceMappingURL=FormSeparator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormSeparator.js","sourceRoot":"","sources":["../../../components/form/FormSeparator.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,SAAS,aAAa,CAAC,EAAE,IAAI,EAAsB;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAEvC,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,aAC3B,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAI,EAC7E,IAAI,IAAI,CACP,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,YAAG,IAAI,GAAQ,CACzE,EACD,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAI,IACzE,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,EAAE;KACnB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACV;IACD,IAAI,EAAE;QACJ,gBAAgB,EAAE,EAAE;QACpB,QAAQ,EAAE,EAAE;KACb;CACF,CAAC,CAAC;AAEH,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as DropDownSelect } from './DropDownSelect';
|
|
2
|
+
export { default as EmailSubscriptionForm } from './EmailSubscriptionForm';
|
|
3
|
+
export { FormErrors } from './FormErrors';
|
|
4
|
+
export { FormInput } from './FormInput';
|
|
5
|
+
export { FormSeparator } from './FormSeparator';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../components/form/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Form components
|
|
2
|
+
export { default as DropDownSelect } from './DropDownSelect';
|
|
3
|
+
export { default as EmailSubscriptionForm } from './EmailSubscriptionForm';
|
|
4
|
+
export { FormErrors } from './FormErrors';
|
|
5
|
+
export { FormInput } from './FormInput';
|
|
6
|
+
export { FormSeparator } from './FormSeparator';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/form/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './ui';
|
|
2
|
+
export * from './layout';
|
|
3
|
+
export * from './navigation';
|
|
4
|
+
export * from './media';
|
|
5
|
+
export * from './form';
|
|
6
|
+
export * from './action';
|
|
7
|
+
export * from './chat';
|
|
8
|
+
export * from './card';
|
|
9
|
+
export * from './list';
|
|
10
|
+
export * from './tile';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AACA,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Export all composite components from organized subfolders
|
|
2
|
+
export * from './ui';
|
|
3
|
+
export * from './layout';
|
|
4
|
+
export * from './navigation';
|
|
5
|
+
export * from './media';
|
|
6
|
+
export * from './form';
|
|
7
|
+
export * from './action';
|
|
8
|
+
export * from './chat';
|
|
9
|
+
export * from './card';
|
|
10
|
+
export * from './list';
|
|
11
|
+
export * from './tile';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../../components/layout/Footer.tsx"],"names":[],"mappings":"AAUA,QAAA,MAAM,MAAM,+CAgDX,CAAC;AA2BF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useContext } from 'react';
|
|
3
|
+
import { StyleSheet, View } from 'react-native';
|
|
4
|
+
import { TextLink, StyledText } from '../ui';
|
|
5
|
+
import { ThemeContext } from '../../theme';
|
|
6
|
+
import { useRouter } from 'expo-router';
|
|
7
|
+
import { useBrand } from '../../brand';
|
|
8
|
+
import { useDimensions } from '../../hooks';
|
|
9
|
+
import { Platform } from 'react-native';
|
|
10
|
+
import MinimalFooter from './MinimalFooter';
|
|
11
|
+
const Footer = () => {
|
|
12
|
+
const theme = useContext(ThemeContext); // Access theme context
|
|
13
|
+
const router = useRouter();
|
|
14
|
+
const dimensions = useDimensions();
|
|
15
|
+
const brand = useBrand();
|
|
16
|
+
// On web small, return minimal footer instead of full footer
|
|
17
|
+
if (Platform.OS === 'web' && dimensions.breakpoint === 'small') {
|
|
18
|
+
return _jsx(MinimalFooter, {});
|
|
19
|
+
}
|
|
20
|
+
return (_jsxs(View, { style: [
|
|
21
|
+
styles.contentContainer,
|
|
22
|
+
{
|
|
23
|
+
backgroundColor: theme.values.appbarBackgroundColor,
|
|
24
|
+
borderColor: theme.values.borderColor,
|
|
25
|
+
borderTopWidth: theme.values.isDark ? 0 : 1,
|
|
26
|
+
flexDirection: dimensions.breakpoint !== 'small' ? 'row' : 'column',
|
|
27
|
+
},
|
|
28
|
+
], children: [brand.footerLinks.links.length > 0 && (_jsx(View, { style: styles.linkContainer, children: brand.footerLinks.links.map((link, index) => (_jsx(TextLink, { onPress: () => router.push(link.route), text: link.text, color: theme.values.isDark ? '#fff' : '#000000', align: 'left' }, index))) })), _jsx(View, { style: [
|
|
29
|
+
styles.brandText,
|
|
30
|
+
{
|
|
31
|
+
paddingVertical: dimensions.breakpoint === 'medium' ? 10 : 0,
|
|
32
|
+
},
|
|
33
|
+
], children: _jsxs(StyledText, { fontSize: "sm", align: dimensions.breakpoint === 'medium' ? 'left' : 'right', muted: true, children: ["\u00A9 2025 ", brand.name] }) })] }));
|
|
34
|
+
};
|
|
35
|
+
const styles = StyleSheet.create({
|
|
36
|
+
contentContainer: {
|
|
37
|
+
width: '100%',
|
|
38
|
+
flexDirection: 'row',
|
|
39
|
+
justifyContent: 'space-between',
|
|
40
|
+
paddingHorizontal: '5%',
|
|
41
|
+
gap: 10,
|
|
42
|
+
paddingVertical: 40,
|
|
43
|
+
},
|
|
44
|
+
linkContainer: {
|
|
45
|
+
flexDirection: 'column',
|
|
46
|
+
gap: 10,
|
|
47
|
+
},
|
|
48
|
+
link: {
|
|
49
|
+
fontSize: 14,
|
|
50
|
+
marginVertical: 5,
|
|
51
|
+
},
|
|
52
|
+
brandText: {
|
|
53
|
+
flex: 1,
|
|
54
|
+
width: '100%',
|
|
55
|
+
justifyContent: 'flex-start',
|
|
56
|
+
alignItems: 'flex-end',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
export default Footer;
|
|
60
|
+
//# sourceMappingURL=Footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../components/layout/Footer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal footer for mobile web
|
|
3
|
+
* Netflix-style footer that fills remaining screen height
|
|
4
|
+
* Shows navigation links vertically with spacing and copyright at bottom
|
|
5
|
+
*/
|
|
6
|
+
declare const MinimalFooter: () => import("react/jsx-runtime").JSX.Element | null;
|
|
7
|
+
export default MinimalFooter;
|
|
8
|
+
//# sourceMappingURL=MinimalFooter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MinimalFooter.d.ts","sourceRoot":"","sources":["../../../components/layout/MinimalFooter.tsx"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,QAAA,MAAM,aAAa,sDAuElB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useContext, useMemo } from 'react';
|
|
3
|
+
import { View, StyleSheet, Platform } from 'react-native';
|
|
4
|
+
import { ThemeContext } from '../../theme';
|
|
5
|
+
import { useBrand } from '../../brand';
|
|
6
|
+
import { StyledText, TextLink } from '../ui';
|
|
7
|
+
import { useRouter } from 'expo-router';
|
|
8
|
+
import { useDimensions } from '../../hooks';
|
|
9
|
+
/**
|
|
10
|
+
* Minimal footer for mobile web
|
|
11
|
+
* Netflix-style footer that fills remaining screen height
|
|
12
|
+
* Shows navigation links vertically with spacing and copyright at bottom
|
|
13
|
+
*/
|
|
14
|
+
const MinimalFooter = () => {
|
|
15
|
+
const theme = useContext(ThemeContext);
|
|
16
|
+
const router = useRouter();
|
|
17
|
+
const dimensions = useDimensions();
|
|
18
|
+
const brand = useBrand();
|
|
19
|
+
const styles = useMemo(() => StyleSheet.create({
|
|
20
|
+
container: {
|
|
21
|
+
width: '100%',
|
|
22
|
+
flex: 1, // Fill parent (footerWrapperMobile) which has flexGrow: 1
|
|
23
|
+
alignItems: 'flex-start',
|
|
24
|
+
justifyContent: 'space-between',
|
|
25
|
+
alignSelf: 'stretch', // Ensure full width
|
|
26
|
+
},
|
|
27
|
+
linksContainer: {
|
|
28
|
+
flexDirection: 'column',
|
|
29
|
+
alignItems: 'flex-start',
|
|
30
|
+
justifyContent: 'flex-start',
|
|
31
|
+
gap: brand.spacing.xxl,
|
|
32
|
+
flex: 1,
|
|
33
|
+
width: '100%',
|
|
34
|
+
},
|
|
35
|
+
copyrightContainer: {
|
|
36
|
+
marginTop: brand.spacing.xxl, // Same spacing as gap between links
|
|
37
|
+
width: '100%',
|
|
38
|
+
alignItems: 'flex-start',
|
|
39
|
+
},
|
|
40
|
+
}), [brand]);
|
|
41
|
+
// Only show on web (mobile web specifically)
|
|
42
|
+
if (!(Platform.OS === 'web' && dimensions.breakpoint === 'small')) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return (_jsxs(View, { style: [
|
|
46
|
+
styles.container,
|
|
47
|
+
{
|
|
48
|
+
backgroundColor: theme.values.appbarBackgroundColor,
|
|
49
|
+
borderTopWidth: theme.values.isDark ? 0 : 1,
|
|
50
|
+
borderTopColor: theme.values.borderColor,
|
|
51
|
+
paddingVertical: brand.spacing.xxxl,
|
|
52
|
+
paddingHorizontal: brand.spacing.xl,
|
|
53
|
+
},
|
|
54
|
+
], children: [brand.footerLinks.links.length > 0 && (_jsx(View, { style: styles.linksContainer, children: brand.footerLinks.links.map((link, index) => (_jsx(TextLink, { text: link.text, onPress: () => router.push(link.route), align: "left", color: theme.values.linkColor, fontSize: "sm" }, index))) })), _jsx(View, { style: styles.copyrightContainer, children: _jsxs(StyledText, { fontSize: "sm", align: "left", muted: true, children: ["\u00A9 2025 ", brand.name] }) })] }));
|
|
55
|
+
};
|
|
56
|
+
export default MinimalFooter;
|
|
57
|
+
//# sourceMappingURL=MinimalFooter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MinimalFooter.js","sourceRoot":"","sources":["../../../components/layout/MinimalFooter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin black bar for mobile web to replace footer
|
|
3
|
+
* Provides visual separation without taking significant space
|
|
4
|
+
*/
|
|
5
|
+
declare const MobileFooterBar: () => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default MobileFooterBar;
|
|
7
|
+
//# sourceMappingURL=MobileFooterBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileFooterBar.d.ts","sourceRoot":"","sources":["../../../components/layout/MobileFooterBar.tsx"],"names":[],"mappings":"AAGA;;;GAGG;AACH,QAAA,MAAM,eAAe,+CAEpB,CAAC;AAUF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { View, StyleSheet } from 'react-native';
|
|
3
|
+
/**
|
|
4
|
+
* Thin black bar for mobile web to replace footer
|
|
5
|
+
* Provides visual separation without taking significant space
|
|
6
|
+
*/
|
|
7
|
+
const MobileFooterBar = () => {
|
|
8
|
+
return _jsx(View, { style: styles.bar });
|
|
9
|
+
};
|
|
10
|
+
const styles = StyleSheet.create({
|
|
11
|
+
bar: {
|
|
12
|
+
width: '100%',
|
|
13
|
+
height: 3,
|
|
14
|
+
backgroundColor: '#000000',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
export default MobileFooterBar;
|
|
18
|
+
//# sourceMappingURL=MobileFooterBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileFooterBar.js","sourceRoot":"","sources":["../../../components/layout/MobileFooterBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAI,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE;QACH,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,CAAC;QACT,eAAe,EAAE,SAAS;KAC3B;CACF,CAAC,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PropsWithChildren, ReactElement } from "react";
|
|
2
|
+
export declare const HEADER_HEIGHT = 250;
|
|
3
|
+
type Props = PropsWithChildren<{
|
|
4
|
+
headerImage: ReactElement;
|
|
5
|
+
headerBackgroundColor: string;
|
|
6
|
+
headerHeight?: number;
|
|
7
|
+
headerAction?: ReactElement;
|
|
8
|
+
}>;
|
|
9
|
+
export default function ParallaxScrollView({ children, headerImage, headerBackgroundColor, headerHeight, headerAction, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ParallaxScrollView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParallaxScrollView.d.ts","sourceRoot":"","sources":["../../../components/layout/ParallaxScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAgB7D,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,KAAK,KAAK,GAAG,iBAAiB,CAAC;IAC7B,WAAW,EAAE,YAAY,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,QAAQ,EACR,WAAW,EACX,qBAAqB,EACrB,YAA4B,EAC5B,YAAY,GACb,EAAE,KAAK,2CA+EP"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useContext } from "react";
|
|
3
|
+
import { StyleSheet, View } from "react-native";
|
|
4
|
+
import { SafeAreaView } from "react-native-safe-area-context";
|
|
5
|
+
import Animated, { interpolate, useAnimatedRef, useAnimatedScrollHandler, useAnimatedStyle, useScrollViewOffset, } from "react-native-reanimated";
|
|
6
|
+
import { useScrollContext } from "../../context/scrollContext";
|
|
7
|
+
import { ThemeContext } from "../../theme";
|
|
8
|
+
export const HEADER_HEIGHT = 250;
|
|
9
|
+
export default function ParallaxScrollView({ children, headerImage, headerBackgroundColor, headerHeight = HEADER_HEIGHT, headerAction, }) {
|
|
10
|
+
const scrollRef = useAnimatedRef();
|
|
11
|
+
const scrollOffset = useScrollViewOffset(scrollRef);
|
|
12
|
+
const theme = useContext(ThemeContext);
|
|
13
|
+
// Safely try to get the context, but don't throw an error if it's not available
|
|
14
|
+
let scrollY = null;
|
|
15
|
+
try {
|
|
16
|
+
scrollY = useScrollContext();
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
// Context not available, scrollY will be undefined
|
|
20
|
+
}
|
|
21
|
+
const headerAnimatedStyle = useAnimatedStyle(() => {
|
|
22
|
+
return {
|
|
23
|
+
opacity: interpolate(scrollOffset.value, [0, HEADER_HEIGHT / 2, HEADER_HEIGHT], [1, 0.5, 0], 'clamp'),
|
|
24
|
+
transform: [
|
|
25
|
+
{
|
|
26
|
+
translateY: interpolate(scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [-HEADER_HEIGHT / 2, 0, HEADER_HEIGHT * 0.75]),
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
scale: interpolate(scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [2, 1, 1]),
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
// Create a scroll handler that updates scrollY only if it exists
|
|
35
|
+
const scrollHandler = useAnimatedScrollHandler({
|
|
36
|
+
onScroll: (event) => {
|
|
37
|
+
if (scrollY) {
|
|
38
|
+
scrollY.value = event.contentOffset.y;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return (_jsxs(View, { style: [styles.container, { backgroundColor: theme.values.backgroundColor }], children: [_jsxs(Animated.ScrollView, { ref: scrollRef, scrollEventThrottle: 16, contentContainerStyle: { flexGrow: 1 }, onScroll: scrollHandler, children: [_jsx(Animated.View, { style: [
|
|
43
|
+
styles.header,
|
|
44
|
+
{ backgroundColor: headerBackgroundColor, height: headerHeight },
|
|
45
|
+
headerAnimatedStyle,
|
|
46
|
+
], children: headerImage }), children] }), headerAction && (_jsx(View, { style: styles.headerAction, children: _jsx(SafeAreaView, { style: styles.safeAreaContainer, children: headerAction }) }))] }));
|
|
47
|
+
}
|
|
48
|
+
const styles = StyleSheet.create({
|
|
49
|
+
container: {
|
|
50
|
+
flex: 1,
|
|
51
|
+
position: 'relative',
|
|
52
|
+
},
|
|
53
|
+
header: {
|
|
54
|
+
overflow: "hidden",
|
|
55
|
+
},
|
|
56
|
+
headerAction: {
|
|
57
|
+
position: "absolute",
|
|
58
|
+
top: 0,
|
|
59
|
+
left: 20,
|
|
60
|
+
right: 0,
|
|
61
|
+
zIndex: 1,
|
|
62
|
+
},
|
|
63
|
+
safeAreaContainer: {
|
|
64
|
+
paddingHorizontal: '2%',
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=ParallaxScrollView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParallaxScrollView.js","sourceRoot":"","sources":["../../../components/layout/ParallaxScrollView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React, { ReactElement } from 'react';
|
|
2
|
+
type WebPageLayoutProps = {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
bottomActions?: ReactElement;
|
|
5
|
+
showFooter?: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Unified web page layout template that handles all conditional layout logic
|
|
9
|
+
* for mobile web and desktop/tablet, including automatic footer placement.
|
|
10
|
+
*
|
|
11
|
+
* - Mobile web (isWebSmall): Footer at bottom of ScrollView, fills width, reaches bottom
|
|
12
|
+
* - Desktop/Tablet (isWebLarge): Footer at bottom (fixed or end of ScrollView)
|
|
13
|
+
* - Supports optional bottomActions for pages that need fixed bottom buttons
|
|
14
|
+
*/
|
|
15
|
+
declare const WebPageLayout: ({ children, bottomActions, showFooter }: WebPageLayoutProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export default WebPageLayout;
|
|
17
|
+
//# sourceMappingURL=WebPageLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebPageLayout.d.ts","sourceRoot":"","sources":["../../../components/layout/WebPageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiC,YAAY,EAAW,MAAM,OAAO,CAAC;AAQpF,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,aAAa,GAAI,yCAIpB,kBAAkB,4CAsIpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|