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.
Files changed (282) hide show
  1. package/README.md +929 -0
  2. package/dist/brand/brandConfig.d.ts +48 -0
  3. package/dist/brand/brandConfig.d.ts.map +1 -0
  4. package/dist/brand/brandConfig.js +41 -0
  5. package/dist/brand/brandConfig.js.map +1 -0
  6. package/dist/brand/brandContext.d.ts +10 -0
  7. package/dist/brand/brandContext.d.ts.map +1 -0
  8. package/dist/brand/brandContext.js +16 -0
  9. package/dist/brand/brandContext.js.map +1 -0
  10. package/dist/brand/brandTypes.d.ts +54 -0
  11. package/dist/brand/brandTypes.d.ts.map +1 -0
  12. package/dist/brand/brandTypes.js +2 -0
  13. package/dist/brand/brandTypes.js.map +1 -0
  14. package/dist/brand/index.d.ts +4 -0
  15. package/dist/brand/index.d.ts.map +1 -0
  16. package/dist/brand/index.js +5 -0
  17. package/dist/brand/index.js.map +1 -0
  18. package/dist/components/action/ActionRow.d.ts +25 -0
  19. package/dist/components/action/ActionRow.d.ts.map +1 -0
  20. package/dist/components/action/ActionRow.js +66 -0
  21. package/dist/components/action/ActionRow.js.map +1 -0
  22. package/dist/components/action/index.d.ts +2 -0
  23. package/dist/components/action/index.d.ts.map +1 -0
  24. package/dist/components/action/index.js +3 -0
  25. package/dist/components/action/index.js.map +1 -0
  26. package/dist/components/card/Card.d.ts +11 -0
  27. package/dist/components/card/Card.d.ts.map +1 -0
  28. package/dist/components/card/Card.js +32 -0
  29. package/dist/components/card/Card.js.map +1 -0
  30. package/dist/components/card/index.d.ts +2 -0
  31. package/dist/components/card/index.d.ts.map +1 -0
  32. package/dist/components/card/index.js +2 -0
  33. package/dist/components/card/index.js.map +1 -0
  34. package/dist/components/chat/ChatContainer.d.ts +27 -0
  35. package/dist/components/chat/ChatContainer.d.ts.map +1 -0
  36. package/dist/components/chat/ChatContainer.js +52 -0
  37. package/dist/components/chat/ChatContainer.js.map +1 -0
  38. package/dist/components/chat/ChatInput.d.ts +9 -0
  39. package/dist/components/chat/ChatInput.d.ts.map +1 -0
  40. package/dist/components/chat/ChatInput.js +219 -0
  41. package/dist/components/chat/ChatInput.js.map +1 -0
  42. package/dist/components/chat/ChatMessages.d.ts +9 -0
  43. package/dist/components/chat/ChatMessages.d.ts.map +1 -0
  44. package/dist/components/chat/ChatMessages.js +35 -0
  45. package/dist/components/chat/ChatMessages.js.map +1 -0
  46. package/dist/components/chat/EmptyChat.d.ts +18 -0
  47. package/dist/components/chat/EmptyChat.d.ts.map +1 -0
  48. package/dist/components/chat/EmptyChat.js +64 -0
  49. package/dist/components/chat/EmptyChat.js.map +1 -0
  50. package/dist/components/chat/Message.d.ts +8 -0
  51. package/dist/components/chat/Message.d.ts.map +1 -0
  52. package/dist/components/chat/Message.js +47 -0
  53. package/dist/components/chat/Message.js.map +1 -0
  54. package/dist/components/chat/index.d.ts +6 -0
  55. package/dist/components/chat/index.d.ts.map +1 -0
  56. package/dist/components/chat/index.js +7 -0
  57. package/dist/components/chat/index.js.map +1 -0
  58. package/dist/components/chat/types.d.ts +34 -0
  59. package/dist/components/chat/types.d.ts.map +1 -0
  60. package/dist/components/chat/types.js +2 -0
  61. package/dist/components/chat/types.js.map +1 -0
  62. package/dist/components/form/DropDownSelect.d.ts +12 -0
  63. package/dist/components/form/DropDownSelect.d.ts.map +1 -0
  64. package/dist/components/form/DropDownSelect.js +63 -0
  65. package/dist/components/form/DropDownSelect.js.map +1 -0
  66. package/dist/components/form/EmailSubscriptionForm.d.ts +14 -0
  67. package/dist/components/form/EmailSubscriptionForm.d.ts.map +1 -0
  68. package/dist/components/form/EmailSubscriptionForm.js +58 -0
  69. package/dist/components/form/EmailSubscriptionForm.js.map +1 -0
  70. package/dist/components/form/FormErrors.d.ts +7 -0
  71. package/dist/components/form/FormErrors.d.ts.map +1 -0
  72. package/dist/components/form/FormErrors.js +35 -0
  73. package/dist/components/form/FormErrors.js.map +1 -0
  74. package/dist/components/form/FormInput.d.ts +14 -0
  75. package/dist/components/form/FormInput.d.ts.map +1 -0
  76. package/dist/components/form/FormInput.js +35 -0
  77. package/dist/components/form/FormInput.js.map +1 -0
  78. package/dist/components/form/FormSeparator.d.ts +6 -0
  79. package/dist/components/form/FormSeparator.d.ts.map +1 -0
  80. package/dist/components/form/FormSeparator.js +25 -0
  81. package/dist/components/form/FormSeparator.js.map +1 -0
  82. package/dist/components/form/index.d.ts +6 -0
  83. package/dist/components/form/index.d.ts.map +1 -0
  84. package/dist/components/form/index.js +7 -0
  85. package/dist/components/form/index.js.map +1 -0
  86. package/dist/components/index.d.ts +11 -0
  87. package/dist/components/index.d.ts.map +1 -0
  88. package/dist/components/index.js +12 -0
  89. package/dist/components/index.js.map +1 -0
  90. package/dist/components/layout/Footer.d.ts +3 -0
  91. package/dist/components/layout/Footer.d.ts.map +1 -0
  92. package/dist/components/layout/Footer.js +60 -0
  93. package/dist/components/layout/Footer.js.map +1 -0
  94. package/dist/components/layout/MinimalFooter.d.ts +8 -0
  95. package/dist/components/layout/MinimalFooter.d.ts.map +1 -0
  96. package/dist/components/layout/MinimalFooter.js +57 -0
  97. package/dist/components/layout/MinimalFooter.js.map +1 -0
  98. package/dist/components/layout/MobileFooterBar.d.ts +7 -0
  99. package/dist/components/layout/MobileFooterBar.d.ts.map +1 -0
  100. package/dist/components/layout/MobileFooterBar.js +18 -0
  101. package/dist/components/layout/MobileFooterBar.js.map +1 -0
  102. package/dist/components/layout/ParallaxScrollView.d.ts +11 -0
  103. package/dist/components/layout/ParallaxScrollView.d.ts.map +1 -0
  104. package/dist/components/layout/ParallaxScrollView.js +67 -0
  105. package/dist/components/layout/ParallaxScrollView.js.map +1 -0
  106. package/dist/components/layout/WebPageLayout.d.ts +17 -0
  107. package/dist/components/layout/WebPageLayout.d.ts.map +1 -0
  108. package/dist/components/layout/WebPageLayout.js +103 -0
  109. package/dist/components/layout/WebPageLayout.js.map +1 -0
  110. package/dist/components/layout/index.d.ts +6 -0
  111. package/dist/components/layout/index.d.ts.map +1 -0
  112. package/dist/components/layout/index.js +9 -0
  113. package/dist/components/layout/index.js.map +1 -0
  114. package/dist/components/list/List.d.ts +10 -0
  115. package/dist/components/list/List.d.ts.map +1 -0
  116. package/dist/components/list/List.js +18 -0
  117. package/dist/components/list/List.js.map +1 -0
  118. package/dist/components/list/ListButton.d.ts +13 -0
  119. package/dist/components/list/ListButton.d.ts.map +1 -0
  120. package/dist/components/list/ListButton.js +24 -0
  121. package/dist/components/list/ListButton.js.map +1 -0
  122. package/dist/components/list/ListDivider.d.ts +7 -0
  123. package/dist/components/list/ListDivider.d.ts.map +1 -0
  124. package/dist/components/list/ListDivider.js +23 -0
  125. package/dist/components/list/ListDivider.js.map +1 -0
  126. package/dist/components/list/index.d.ts +4 -0
  127. package/dist/components/list/index.d.ts.map +1 -0
  128. package/dist/components/list/index.js +4 -0
  129. package/dist/components/list/index.js.map +1 -0
  130. package/dist/components/media/Carousel.d.ts +18 -0
  131. package/dist/components/media/Carousel.d.ts.map +1 -0
  132. package/dist/components/media/Carousel.js +60 -0
  133. package/dist/components/media/Carousel.js.map +1 -0
  134. package/dist/components/media/FeatureCard.d.ts +9 -0
  135. package/dist/components/media/FeatureCard.d.ts.map +1 -0
  136. package/dist/components/media/FeatureCard.js +68 -0
  137. package/dist/components/media/FeatureCard.js.map +1 -0
  138. package/dist/components/media/HorizontalCarousel.d.ts +17 -0
  139. package/dist/components/media/HorizontalCarousel.d.ts.map +1 -0
  140. package/dist/components/media/HorizontalCarousel.js +60 -0
  141. package/dist/components/media/HorizontalCarousel.js.map +1 -0
  142. package/dist/components/media/ImageCarousel.d.ts +14 -0
  143. package/dist/components/media/ImageCarousel.d.ts.map +1 -0
  144. package/dist/components/media/ImageCarousel.js +21 -0
  145. package/dist/components/media/ImageCarousel.js.map +1 -0
  146. package/dist/components/media/MediaTile.d.ts +30 -0
  147. package/dist/components/media/MediaTile.d.ts.map +1 -0
  148. package/dist/components/media/MediaTile.js +51 -0
  149. package/dist/components/media/MediaTile.js.map +1 -0
  150. package/dist/components/media/SkeletonMediaTile.d.ts +17 -0
  151. package/dist/components/media/SkeletonMediaTile.d.ts.map +1 -0
  152. package/dist/components/media/SkeletonMediaTile.js +67 -0
  153. package/dist/components/media/SkeletonMediaTile.js.map +1 -0
  154. package/dist/components/media/index.d.ts +7 -0
  155. package/dist/components/media/index.d.ts.map +1 -0
  156. package/dist/components/media/index.js +8 -0
  157. package/dist/components/media/index.js.map +1 -0
  158. package/dist/components/navigation/AppbarWeb.d.ts +18 -0
  159. package/dist/components/navigation/AppbarWeb.d.ts.map +1 -0
  160. package/dist/components/navigation/AppbarWeb.js +70 -0
  161. package/dist/components/navigation/AppbarWeb.js.map +1 -0
  162. package/dist/components/navigation/IconButtonGroup.d.ts +7 -0
  163. package/dist/components/navigation/IconButtonGroup.d.ts.map +1 -0
  164. package/dist/components/navigation/IconButtonGroup.js +33 -0
  165. package/dist/components/navigation/IconButtonGroup.js.map +1 -0
  166. package/dist/components/navigation/Logo.d.ts +16 -0
  167. package/dist/components/navigation/Logo.d.ts.map +1 -0
  168. package/dist/components/navigation/Logo.js +64 -0
  169. package/dist/components/navigation/Logo.js.map +1 -0
  170. package/dist/components/navigation/MobileMenuDrawer.d.ts +13 -0
  171. package/dist/components/navigation/MobileMenuDrawer.d.ts.map +1 -0
  172. package/dist/components/navigation/MobileMenuDrawer.js +184 -0
  173. package/dist/components/navigation/MobileMenuDrawer.js.map +1 -0
  174. package/dist/components/navigation/ScreenHeader.d.ts +30 -0
  175. package/dist/components/navigation/ScreenHeader.d.ts.map +1 -0
  176. package/dist/components/navigation/ScreenHeader.js +127 -0
  177. package/dist/components/navigation/ScreenHeader.js.map +1 -0
  178. package/dist/components/navigation/iconUtils.d.ts +24 -0
  179. package/dist/components/navigation/iconUtils.d.ts.map +1 -0
  180. package/dist/components/navigation/iconUtils.js +53 -0
  181. package/dist/components/navigation/iconUtils.js.map +1 -0
  182. package/dist/components/navigation/index.d.ts +6 -0
  183. package/dist/components/navigation/index.d.ts.map +1 -0
  184. package/dist/components/navigation/index.js +7 -0
  185. package/dist/components/navigation/index.js.map +1 -0
  186. package/dist/components/tile/Tile.d.ts +18 -0
  187. package/dist/components/tile/Tile.d.ts.map +1 -0
  188. package/dist/components/tile/Tile.js +41 -0
  189. package/dist/components/tile/Tile.js.map +1 -0
  190. package/dist/components/tile/index.d.ts +2 -0
  191. package/dist/components/tile/index.d.ts.map +1 -0
  192. package/dist/components/tile/index.js +2 -0
  193. package/dist/components/tile/index.js.map +1 -0
  194. package/dist/components/ui/ArrowButton.d.ts +8 -0
  195. package/dist/components/ui/ArrowButton.d.ts.map +1 -0
  196. package/dist/components/ui/ArrowButton.js +30 -0
  197. package/dist/components/ui/ArrowButton.js.map +1 -0
  198. package/dist/components/ui/BlurButton.d.ts +16 -0
  199. package/dist/components/ui/BlurButton.d.ts.map +1 -0
  200. package/dist/components/ui/BlurButton.js +26 -0
  201. package/dist/components/ui/BlurButton.js.map +1 -0
  202. package/dist/components/ui/Button.d.ts +24 -0
  203. package/dist/components/ui/Button.d.ts.map +1 -0
  204. package/dist/components/ui/Button.js +60 -0
  205. package/dist/components/ui/Button.js.map +1 -0
  206. package/dist/components/ui/ErrorBoundary.d.ts +18 -0
  207. package/dist/components/ui/ErrorBoundary.d.ts.map +1 -0
  208. package/dist/components/ui/ErrorBoundary.js +37 -0
  209. package/dist/components/ui/ErrorBoundary.js.map +1 -0
  210. package/dist/components/ui/IconButton.d.ts +13 -0
  211. package/dist/components/ui/IconButton.d.ts.map +1 -0
  212. package/dist/components/ui/IconButton.js +27 -0
  213. package/dist/components/ui/IconButton.js.map +1 -0
  214. package/dist/components/ui/LoadingIndicator.d.ts +6 -0
  215. package/dist/components/ui/LoadingIndicator.d.ts.map +1 -0
  216. package/dist/components/ui/LoadingIndicator.js +15 -0
  217. package/dist/components/ui/LoadingIndicator.js.map +1 -0
  218. package/dist/components/ui/NotificationBadge.d.ts +8 -0
  219. package/dist/components/ui/NotificationBadge.d.ts.map +1 -0
  220. package/dist/components/ui/NotificationBadge.js +24 -0
  221. package/dist/components/ui/NotificationBadge.js.map +1 -0
  222. package/dist/components/ui/SkeletonCard.d.ts +14 -0
  223. package/dist/components/ui/SkeletonCard.d.ts.map +1 -0
  224. package/dist/components/ui/SkeletonCard.js +50 -0
  225. package/dist/components/ui/SkeletonCard.js.map +1 -0
  226. package/dist/components/ui/StyledText.d.ts +17 -0
  227. package/dist/components/ui/StyledText.d.ts.map +1 -0
  228. package/dist/components/ui/StyledText.js +27 -0
  229. package/dist/components/ui/StyledText.js.map +1 -0
  230. package/dist/components/ui/StyledTextInput.d.ts +10 -0
  231. package/dist/components/ui/StyledTextInput.d.ts.map +1 -0
  232. package/dist/components/ui/StyledTextInput.js +62 -0
  233. package/dist/components/ui/StyledTextInput.js.map +1 -0
  234. package/dist/components/ui/TextLink.d.ts +14 -0
  235. package/dist/components/ui/TextLink.d.ts.map +1 -0
  236. package/dist/components/ui/TextLink.js +25 -0
  237. package/dist/components/ui/TextLink.js.map +1 -0
  238. package/dist/components/ui/ToggleIconButton.d.ts +14 -0
  239. package/dist/components/ui/ToggleIconButton.d.ts.map +1 -0
  240. package/dist/components/ui/ToggleIconButton.js +19 -0
  241. package/dist/components/ui/ToggleIconButton.js.map +1 -0
  242. package/dist/components/ui/index.d.ts +13 -0
  243. package/dist/components/ui/index.d.ts.map +1 -0
  244. package/dist/components/ui/index.js +14 -0
  245. package/dist/components/ui/index.js.map +1 -0
  246. package/dist/context/scrollContext.d.ts +8 -0
  247. package/dist/context/scrollContext.d.ts.map +1 -0
  248. package/dist/context/scrollContext.js +16 -0
  249. package/dist/context/scrollContext.js.map +1 -0
  250. package/dist/hooks/index.d.ts +4 -0
  251. package/dist/hooks/index.d.ts.map +1 -0
  252. package/dist/hooks/index.js +5 -0
  253. package/dist/hooks/index.js.map +1 -0
  254. package/dist/hooks/useDimensions.d.ts +31 -0
  255. package/dist/hooks/useDimensions.d.ts.map +1 -0
  256. package/dist/hooks/useDimensions.js +44 -0
  257. package/dist/hooks/useDimensions.js.map +1 -0
  258. package/dist/hooks/useWindowHeight.d.ts +7 -0
  259. package/dist/hooks/useWindowHeight.d.ts.map +1 -0
  260. package/dist/hooks/useWindowHeight.js +10 -0
  261. package/dist/hooks/useWindowHeight.js.map +1 -0
  262. package/dist/hooks/useWindowWidth.d.ts +20 -0
  263. package/dist/hooks/useWindowWidth.d.ts.map +1 -0
  264. package/dist/hooks/useWindowWidth.js +27 -0
  265. package/dist/hooks/useWindowWidth.js.map +1 -0
  266. package/dist/index.d.ts +6 -0
  267. package/dist/index.d.ts.map +1 -0
  268. package/dist/index.js +9 -0
  269. package/dist/index.js.map +1 -0
  270. package/dist/theme/index.d.ts +3 -0
  271. package/dist/theme/index.d.ts.map +1 -0
  272. package/dist/theme/index.js +4 -0
  273. package/dist/theme/index.js.map +1 -0
  274. package/dist/theme/theme.d.ts +15 -0
  275. package/dist/theme/theme.d.ts.map +1 -0
  276. package/dist/theme/theme.js +38 -0
  277. package/dist/theme/theme.js.map +1 -0
  278. package/dist/theme/themeConfig.d.ts +19 -0
  279. package/dist/theme/themeConfig.d.ts.map +1 -0
  280. package/dist/theme/themeConfig.js +43 -0
  281. package/dist/theme/themeConfig.js.map +1 -0
  282. 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,7 @@
1
+ type FormErrorsProps = {
2
+ error: string | null;
3
+ clearError?: () => void;
4
+ };
5
+ declare function FormErrors({ error, clearError }: FormErrorsProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export { FormErrors };
7
+ //# sourceMappingURL=FormErrors.d.ts.map
@@ -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,6 @@
1
+ type FormSeparatorProps = {
2
+ text?: string;
3
+ };
4
+ declare function FormSeparator({ text }: FormSeparatorProps): import("react/jsx-runtime").JSX.Element;
5
+ export { FormSeparator };
6
+ //# sourceMappingURL=FormSeparator.d.ts.map
@@ -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,3 @@
1
+ declare const Footer: () => import("react/jsx-runtime").JSX.Element;
2
+ export default Footer;
3
+ //# sourceMappingURL=Footer.d.ts.map
@@ -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"}