zero-to-app 3.2.1 → 3.2.2

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 (213) hide show
  1. package/dist/brand/brand-config.d.ts +65 -0
  2. package/dist/brand/brand-config.d.ts.map +1 -0
  3. package/dist/brand/brand-config.js +68 -0
  4. package/dist/brand/brand-config.js.map +1 -0
  5. package/dist/brand/brand-context.d.ts +55 -0
  6. package/dist/brand/brand-context.d.ts.map +1 -0
  7. package/dist/brand/brand-context.js +76 -0
  8. package/dist/brand/brand-context.js.map +1 -0
  9. package/dist/brand/brand-types.d.ts +92 -0
  10. package/dist/brand/brand-types.d.ts.map +1 -0
  11. package/dist/brand/brand-types.js +2 -0
  12. package/dist/brand/brand-types.js.map +1 -0
  13. package/dist/brand/default-brand.d.ts +11 -0
  14. package/dist/brand/default-brand.d.ts.map +1 -0
  15. package/dist/brand/default-brand.js +32 -0
  16. package/dist/brand/default-brand.js.map +1 -0
  17. package/dist/brand/index.d.ts +6 -0
  18. package/dist/brand/index.d.ts.map +1 -0
  19. package/dist/brand/index.js +8 -0
  20. package/dist/brand/index.js.map +1 -0
  21. package/dist/brand/palette-generator.d.ts +64 -0
  22. package/dist/brand/palette-generator.d.ts.map +1 -0
  23. package/dist/brand/palette-generator.js +292 -0
  24. package/dist/brand/palette-generator.js.map +1 -0
  25. package/dist/components/index.d.ts +3 -0
  26. package/dist/components/index.d.ts.map +1 -0
  27. package/dist/components/index.js +3 -0
  28. package/dist/components/index.js.map +1 -0
  29. package/dist/components/navigation/app-tabs/app-tabs.d.ts +63 -0
  30. package/dist/components/navigation/app-tabs/app-tabs.d.ts.map +1 -0
  31. package/dist/components/navigation/app-tabs/app-tabs.js +13 -0
  32. package/dist/components/navigation/app-tabs/app-tabs.js.map +1 -0
  33. package/dist/components/navigation/app-tabs/app-tabs.web.d.ts +47 -0
  34. package/dist/components/navigation/app-tabs/app-tabs.web.d.ts.map +1 -0
  35. package/dist/components/navigation/app-tabs/app-tabs.web.js +104 -0
  36. package/dist/components/navigation/app-tabs/app-tabs.web.js.map +1 -0
  37. package/dist/components/navigation/app-tabs/index.d.ts +3 -0
  38. package/dist/components/navigation/app-tabs/index.d.ts.map +1 -0
  39. package/dist/components/navigation/app-tabs/index.js +3 -0
  40. package/dist/components/navigation/app-tabs/index.js.map +1 -0
  41. package/dist/components/navigation/drawer/drawer.d.ts +24 -0
  42. package/dist/components/navigation/drawer/drawer.d.ts.map +1 -0
  43. package/dist/components/navigation/drawer/drawer.js +82 -0
  44. package/dist/components/navigation/drawer/drawer.js.map +1 -0
  45. package/dist/components/navigation/index.d.ts +10 -0
  46. package/dist/components/navigation/index.d.ts.map +1 -0
  47. package/dist/components/navigation/index.js +11 -0
  48. package/dist/components/navigation/index.js.map +1 -0
  49. package/dist/components/navigation/native-header.d.ts +25 -0
  50. package/dist/components/navigation/native-header.d.ts.map +1 -0
  51. package/dist/components/navigation/native-header.js +32 -0
  52. package/dist/components/navigation/native-header.js.map +1 -0
  53. package/dist/components/navigation/shared/sidebar-styles.d.ts +34 -0
  54. package/dist/components/navigation/shared/sidebar-styles.d.ts.map +1 -0
  55. package/dist/components/navigation/shared/sidebar-styles.js +34 -0
  56. package/dist/components/navigation/shared/sidebar-styles.js.map +1 -0
  57. package/dist/components/navigation/sidebar/index.d.ts +10 -0
  58. package/dist/components/navigation/sidebar/index.d.ts.map +1 -0
  59. package/dist/components/navigation/sidebar/index.js +7 -0
  60. package/dist/components/navigation/sidebar/index.js.map +1 -0
  61. package/dist/components/navigation/sidebar/sidebar-footer.d.ts +18 -0
  62. package/dist/components/navigation/sidebar/sidebar-footer.d.ts.map +1 -0
  63. package/dist/components/navigation/sidebar/sidebar-footer.js +27 -0
  64. package/dist/components/navigation/sidebar/sidebar-footer.js.map +1 -0
  65. package/dist/components/navigation/sidebar/sidebar-header.d.ts +26 -0
  66. package/dist/components/navigation/sidebar/sidebar-header.d.ts.map +1 -0
  67. package/dist/components/navigation/sidebar/sidebar-header.js +38 -0
  68. package/dist/components/navigation/sidebar/sidebar-header.js.map +1 -0
  69. package/dist/components/navigation/sidebar/sidebar-item.d.ts +36 -0
  70. package/dist/components/navigation/sidebar/sidebar-item.d.ts.map +1 -0
  71. package/dist/components/navigation/sidebar/sidebar-item.js +63 -0
  72. package/dist/components/navigation/sidebar/sidebar-item.js.map +1 -0
  73. package/dist/components/navigation/sidebar/sidebar-section.d.ts +34 -0
  74. package/dist/components/navigation/sidebar/sidebar-section.d.ts.map +1 -0
  75. package/dist/components/navigation/sidebar/sidebar-section.js +56 -0
  76. package/dist/components/navigation/sidebar/sidebar-section.js.map +1 -0
  77. package/dist/components/navigation/sidebar/sidebar.d.ts +2 -0
  78. package/dist/components/navigation/sidebar/sidebar.d.ts.map +1 -0
  79. package/dist/components/navigation/sidebar/sidebar.js +4 -0
  80. package/dist/components/navigation/sidebar/sidebar.js.map +1 -0
  81. package/dist/components/navigation/sidebar/sidebar.native.d.ts +23 -0
  82. package/dist/components/navigation/sidebar/sidebar.native.d.ts.map +1 -0
  83. package/dist/components/navigation/sidebar/sidebar.native.js +80 -0
  84. package/dist/components/navigation/sidebar/sidebar.native.js.map +1 -0
  85. package/dist/components/navigation/sidebar/sidebar.web.d.ts +26 -0
  86. package/dist/components/navigation/sidebar/sidebar.web.d.ts.map +1 -0
  87. package/dist/components/navigation/sidebar/sidebar.web.js +90 -0
  88. package/dist/components/navigation/sidebar/sidebar.web.js.map +1 -0
  89. package/dist/components/navigation/themed-stack.d.ts +25 -0
  90. package/dist/components/navigation/themed-stack.d.ts.map +1 -0
  91. package/dist/components/navigation/themed-stack.js +37 -0
  92. package/dist/components/navigation/themed-stack.js.map +1 -0
  93. package/dist/components/shared/index.d.ts +3 -0
  94. package/dist/components/shared/index.d.ts.map +1 -0
  95. package/dist/components/shared/index.js +2 -0
  96. package/dist/components/shared/index.js.map +1 -0
  97. package/dist/components/shared/types.d.ts +82 -0
  98. package/dist/components/shared/types.d.ts.map +1 -0
  99. package/dist/components/shared/types.js +2 -0
  100. package/dist/components/shared/types.js.map +1 -0
  101. package/dist/components/shared/utils.d.ts +19 -0
  102. package/dist/components/shared/utils.d.ts.map +1 -0
  103. package/dist/components/shared/utils.js +23 -0
  104. package/dist/components/shared/utils.js.map +1 -0
  105. package/dist/components/ui/button.d.ts +132 -0
  106. package/dist/components/ui/button.d.ts.map +1 -0
  107. package/dist/components/ui/button.js +252 -0
  108. package/dist/components/ui/button.js.map +1 -0
  109. package/dist/components/ui/chip.d.ts +88 -0
  110. package/dist/components/ui/chip.d.ts.map +1 -0
  111. package/dist/components/ui/chip.js +129 -0
  112. package/dist/components/ui/chip.js.map +1 -0
  113. package/dist/components/ui/collapsible.d.ts +88 -0
  114. package/dist/components/ui/collapsible.d.ts.map +1 -0
  115. package/dist/components/ui/collapsible.js +66 -0
  116. package/dist/components/ui/collapsible.js.map +1 -0
  117. package/dist/components/ui/container.d.ts +31 -0
  118. package/dist/components/ui/container.d.ts.map +1 -0
  119. package/dist/components/ui/container.js +46 -0
  120. package/dist/components/ui/container.js.map +1 -0
  121. package/dist/components/ui/fab.d.ts +51 -0
  122. package/dist/components/ui/fab.d.ts.map +1 -0
  123. package/dist/components/ui/fab.js +142 -0
  124. package/dist/components/ui/fab.js.map +1 -0
  125. package/dist/components/ui/index.d.ts +23 -0
  126. package/dist/components/ui/index.d.ts.map +1 -0
  127. package/dist/components/ui/index.js +22 -0
  128. package/dist/components/ui/index.js.map +1 -0
  129. package/dist/components/ui/screen.d.ts +40 -0
  130. package/dist/components/ui/screen.d.ts.map +1 -0
  131. package/dist/components/ui/screen.js +57 -0
  132. package/dist/components/ui/screen.js.map +1 -0
  133. package/dist/components/ui/slider.d.ts +47 -0
  134. package/dist/components/ui/slider.d.ts.map +1 -0
  135. package/dist/components/ui/slider.js +41 -0
  136. package/dist/components/ui/slider.js.map +1 -0
  137. package/dist/components/ui/themed-image.d.ts +7 -0
  138. package/dist/components/ui/themed-image.d.ts.map +1 -0
  139. package/dist/components/ui/themed-image.js +9 -0
  140. package/dist/components/ui/themed-image.js.map +1 -0
  141. package/dist/components/ui/themed-view.d.ts +20 -0
  142. package/dist/components/ui/themed-view.d.ts.map +1 -0
  143. package/dist/components/ui/themed-view.js +75 -0
  144. package/dist/components/ui/themed-view.js.map +1 -0
  145. package/dist/components/ui/typography.d.ts +110 -0
  146. package/dist/components/ui/typography.d.ts.map +1 -0
  147. package/dist/components/ui/typography.js +69 -0
  148. package/dist/components/ui/typography.js.map +1 -0
  149. package/dist/context/layout-context.d.ts +66 -0
  150. package/dist/context/layout-context.d.ts.map +1 -0
  151. package/dist/context/layout-context.js +83 -0
  152. package/dist/context/layout-context.js.map +1 -0
  153. package/dist/context/scroll-context.d.ts +8 -0
  154. package/dist/context/scroll-context.d.ts.map +1 -0
  155. package/dist/context/scroll-context.js +16 -0
  156. package/dist/context/scroll-context.js.map +1 -0
  157. package/dist/context/sidebar-context.d.ts +74 -0
  158. package/dist/context/sidebar-context.d.ts.map +1 -0
  159. package/dist/context/sidebar-context.js +95 -0
  160. package/dist/context/sidebar-context.js.map +1 -0
  161. package/dist/hooks/index.d.ts +4 -0
  162. package/dist/hooks/index.d.ts.map +1 -0
  163. package/dist/hooks/index.js +5 -0
  164. package/dist/hooks/index.js.map +1 -0
  165. package/dist/hooks/use-breakpoint.d.ts +8 -0
  166. package/dist/hooks/use-breakpoint.d.ts.map +1 -0
  167. package/dist/hooks/use-breakpoint.js +10 -0
  168. package/dist/hooks/use-breakpoint.js.map +1 -0
  169. package/dist/hooks/use-dimensions.d.ts +31 -0
  170. package/dist/hooks/use-dimensions.d.ts.map +1 -0
  171. package/dist/hooks/use-dimensions.js +44 -0
  172. package/dist/hooks/use-dimensions.js.map +1 -0
  173. package/dist/hooks/use-route-navigation.d.ts +19 -0
  174. package/dist/hooks/use-route-navigation.d.ts.map +1 -0
  175. package/dist/hooks/use-route-navigation.js +25 -0
  176. package/dist/hooks/use-route-navigation.js.map +1 -0
  177. package/dist/icons/icon-utils.d.ts +24 -0
  178. package/dist/icons/icon-utils.d.ts.map +1 -0
  179. package/dist/icons/icon-utils.js +57 -0
  180. package/dist/icons/icon-utils.js.map +1 -0
  181. package/dist/icons/index.d.ts +13 -0
  182. package/dist/icons/index.d.ts.map +1 -0
  183. package/dist/icons/index.js +12 -0
  184. package/dist/icons/index.js.map +1 -0
  185. package/dist/index.d.ts +9 -0
  186. package/dist/index.d.ts.map +1 -0
  187. package/dist/index.js +12 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/theme/high-contrast-theme.d.ts +19 -0
  190. package/dist/theme/high-contrast-theme.d.ts.map +1 -0
  191. package/dist/theme/high-contrast-theme.js +257 -0
  192. package/dist/theme/high-contrast-theme.js.map +1 -0
  193. package/dist/theme/index.d.ts +5 -0
  194. package/dist/theme/index.d.ts.map +1 -0
  195. package/dist/theme/index.js +6 -0
  196. package/dist/theme/index.js.map +1 -0
  197. package/dist/theme/theme-config.d.ts +150 -0
  198. package/dist/theme/theme-config.d.ts.map +1 -0
  199. package/dist/theme/theme-config.js +318 -0
  200. package/dist/theme/theme-config.js.map +1 -0
  201. package/dist/theme/theme.d.ts +106 -0
  202. package/dist/theme/theme.d.ts.map +1 -0
  203. package/dist/theme/theme.js +135 -0
  204. package/dist/theme/theme.js.map +1 -0
  205. package/dist/utils/contrast-checker.d.ts +51 -0
  206. package/dist/utils/contrast-checker.d.ts.map +1 -0
  207. package/dist/utils/contrast-checker.js +97 -0
  208. package/dist/utils/contrast-checker.js.map +1 -0
  209. package/dist/utils/index.d.ts +2 -0
  210. package/dist/utils/index.d.ts.map +1 -0
  211. package/dist/utils/index.js +3 -0
  212. package/dist/utils/index.js.map +1 -0
  213. package/package.json +1 -1
@@ -0,0 +1,88 @@
1
+ import React from 'react';
2
+ import { View, type ViewProps } from 'react-native';
3
+ import { type IconLibrary } from '../../icons';
4
+ /**
5
+ * Props for the Collapsible component.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * // Basic usage
10
+ * <Collapsible title="More details">
11
+ * <Typography>Hidden content that can be expanded</Typography>
12
+ * </Collapsible>
13
+ * ```
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * // Controlled state
18
+ * const [open, setOpen] = useState(false);
19
+ * <Collapsible title="Settings" open={open} onToggle={setOpen}>
20
+ * <Typography>Settings content</Typography>
21
+ * </Collapsible>
22
+ * ```
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * // Custom styling
27
+ * <Collapsible
28
+ * title="FAQ Item"
29
+ * headerVariant="surfaceContainer"
30
+ * contentVariant="surface"
31
+ * >
32
+ * <Typography>Answer to the question</Typography>
33
+ * </Collapsible>
34
+ * ```
35
+ */
36
+ export interface CollapsibleProps extends Omit<ViewProps, 'children'> {
37
+ /** Title text displayed in the header */
38
+ title: string;
39
+ /** Content to show when expanded */
40
+ children: React.ReactNode;
41
+ /**
42
+ * Controlled open state. If provided, component becomes controlled.
43
+ */
44
+ open?: boolean;
45
+ /**
46
+ * Whether the collapsible starts expanded (uncontrolled mode).
47
+ * @default false
48
+ */
49
+ defaultOpen?: boolean;
50
+ /**
51
+ * Callback when the open state changes.
52
+ */
53
+ onToggle?: (isOpen: boolean) => void;
54
+ /**
55
+ * ThemedView variant for the icon button background.
56
+ * @default 'surfaceContainer'
57
+ */
58
+ headerVariant?: 'surface' | 'surfaceContainer' | 'card' | 'primary';
59
+ /**
60
+ * ThemedView variant for the content area.
61
+ * @default 'surfaceContainer'
62
+ */
63
+ contentVariant?: 'surface' | 'surfaceContainer' | 'card';
64
+ /**
65
+ * Icon library to use for the chevron.
66
+ * @default 'Feather'
67
+ */
68
+ iconLibrary?: IconLibrary;
69
+ /**
70
+ * Custom icon name for the chevron.
71
+ * @default 'chevron-right'
72
+ */
73
+ iconName?: string;
74
+ /** Test ID for testing */
75
+ testID?: string;
76
+ }
77
+ /**
78
+ * Collapsible component for expandable/collapsible content sections.
79
+ *
80
+ * Features:
81
+ * - Animated expand/collapse with rotation and fade
82
+ * - Controlled and uncontrolled modes
83
+ * - Customizable header and content styling
84
+ * - Accessible with proper press states
85
+ */
86
+ declare const Collapsible: React.ForwardRefExoticComponent<CollapsibleProps & React.RefAttributes<View>>;
87
+ export { Collapsible };
88
+ //# sourceMappingURL=collapsible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible.d.ts","sourceRoot":"","sources":["../../../components/ui/collapsible.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAyB,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAW3E,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACnE,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAAC;IACpE;;;OAGG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,kBAAkB,GAAG,MAAM,CAAC;IACzD;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD;;;;;;;;GAQG;AACH,QAAA,MAAM,WAAW,+EAgFhB,CAAC;AAuBF,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // 1. IMPORTS
3
+ import { forwardRef, useEffect, useState } from 'react';
4
+ import { Pressable, StyleSheet, View } from 'react-native';
5
+ import Animated, { FadeIn, FadeOut, useAnimatedStyle, useSharedValue, withTiming, } from 'react-native-reanimated';
6
+ import { Typography } from './typography';
7
+ import { ThemedView } from './themed-view';
8
+ import { useTheme } from '../../theme';
9
+ import { renderIcon } from '../../icons';
10
+ // Icon button dimension — also used to indent the content panel beneath the text
11
+ const ICON_BUTTON_SIZE = 32;
12
+ // 3. COMPONENT
13
+ /**
14
+ * Collapsible component for expandable/collapsible content sections.
15
+ *
16
+ * Features:
17
+ * - Animated expand/collapse with rotation and fade
18
+ * - Controlled and uncontrolled modes
19
+ * - Customizable header and content styling
20
+ * - Accessible with proper press states
21
+ */
22
+ const Collapsible = forwardRef(({ title, children, open: controlledOpen, defaultOpen = false, onToggle, headerVariant = 'surfaceContainer', contentVariant = 'surfaceContainer', iconLibrary = 'Feather', iconName = 'chevron-right', testID, style, ...rest }, ref) => {
23
+ const theme = useTheme();
24
+ // Support both controlled and uncontrolled modes
25
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
26
+ const isControlled = controlledOpen !== undefined;
27
+ const isOpen = isControlled ? controlledOpen : internalOpen;
28
+ // Animation value for chevron rotation
29
+ const rotation = useSharedValue(isOpen ? 90 : 0);
30
+ // Sync rotation whenever isOpen changes (handles both controlled and uncontrolled modes)
31
+ useEffect(() => {
32
+ rotation.value = withTiming(isOpen ? 90 : 0, { duration: 200 });
33
+ }, [isOpen]);
34
+ const handlePress = () => {
35
+ const newState = !isOpen;
36
+ if (!isControlled) {
37
+ setInternalOpen(newState);
38
+ }
39
+ onToggle?.(newState);
40
+ };
41
+ const animatedIconStyle = useAnimatedStyle(() => ({
42
+ transform: [{ rotate: `${rotation.value}deg` }],
43
+ }));
44
+ return (_jsxs(View, { ref: ref, style: style, testID: testID, ...rest, children: [_jsxs(Pressable, { style: ({ pressed }) => [styles.heading, { gap: theme.spacing.sm }, pressed && styles.pressedHeading], onPress: handlePress, accessibilityRole: "button", accessibilityState: { expanded: isOpen }, accessibilityLabel: `${title}, ${isOpen ? 'expanded' : 'collapsed'}`, children: [_jsx(ThemedView, { variant: headerVariant, style: [styles.iconButton, { borderRadius: theme.shape.surfaceBorderRadius }], children: _jsx(Animated.View, { style: animatedIconStyle, children: renderIcon({ name: iconName }, iconLibrary, 14, theme.onSurface) }) }), _jsx(Typography, { variant: "labelLarge", children: title })] }), isOpen && (_jsx(Animated.View, { entering: FadeIn.duration(200), exiting: FadeOut.duration(150), children: _jsx(ThemedView, { variant: contentVariant, style: [styles.content, { marginTop: theme.spacing.md, marginLeft: ICON_BUTTON_SIZE, padding: theme.spacing.lg, borderRadius: theme.shape.surfaceBorderRadius }], children: children }) }))] }));
45
+ });
46
+ Collapsible.displayName = 'Collapsible';
47
+ // 4. STYLES
48
+ const styles = StyleSheet.create({
49
+ heading: {
50
+ flexDirection: 'row',
51
+ alignItems: 'center',
52
+ },
53
+ pressedHeading: {
54
+ opacity: 0.7,
55
+ },
56
+ iconButton: {
57
+ width: ICON_BUTTON_SIZE,
58
+ height: ICON_BUTTON_SIZE,
59
+ justifyContent: 'center',
60
+ alignItems: 'center',
61
+ },
62
+ content: {},
63
+ });
64
+ // 5. EXPORTS
65
+ export { Collapsible };
66
+ //# sourceMappingURL=collapsible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible.js","sourceRoot":"","sources":["../../../components/ui/collapsible.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { type ThemedViewProps } from './themed-view';
3
+ export interface ContainerProps extends ThemedViewProps {
4
+ /** Maximum width in pixels. @default 1000 */
5
+ maxWidth?: number;
6
+ }
7
+ /**
8
+ * Container component that constrains content width for better readability on large screens.
9
+ * Centers content horizontally and applies consistent padding.
10
+ *
11
+ * Common for web layouts, marketing pages, and content-heavy screens.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <Screen scrollable>
16
+ * <Container>
17
+ * <Typography>Constrained content</Typography>
18
+ * </Container>
19
+ * </Screen>
20
+ * ```
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * // Custom max-width
25
+ * <Container maxWidth={800}>
26
+ * <Typography>Narrower content</Typography>
27
+ * </Container>
28
+ * ```
29
+ */
30
+ export declare const Container: React.FC<ContainerProps>;
31
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../components/ui/container.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGjE,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAwB9C,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StyleSheet } from 'react-native';
3
+ import { ThemedView } from './themed-view';
4
+ import { useTheme } from '../../theme';
5
+ /**
6
+ * Container component that constrains content width for better readability on large screens.
7
+ * Centers content horizontally and applies consistent padding.
8
+ *
9
+ * Common for web layouts, marketing pages, and content-heavy screens.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <Screen scrollable>
14
+ * <Container>
15
+ * <Typography>Constrained content</Typography>
16
+ * </Container>
17
+ * </Screen>
18
+ * ```
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * // Custom max-width
23
+ * <Container maxWidth={800}>
24
+ * <Typography>Narrower content</Typography>
25
+ * </Container>
26
+ * ```
27
+ */
28
+ export const Container = ({ children, maxWidth = 1000, style, ...rest }) => {
29
+ const theme = useTheme();
30
+ return (_jsx(ThemedView, { style: [
31
+ styles.container,
32
+ {
33
+ maxWidth,
34
+ paddingHorizontal: theme.spacing.xl,
35
+ },
36
+ style,
37
+ ], rounded: false, ...rest, children: children }));
38
+ };
39
+ Container.displayName = 'Container';
40
+ const styles = StyleSheet.create({
41
+ container: {
42
+ width: '100%',
43
+ alignSelf: 'center',
44
+ },
45
+ });
46
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../components/ui/container.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAwB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAClD,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,KAAK,EACL,GAAG,IAAI,EACR,EAAE,EAAE;IACH,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,OAAO,CACL,KAAC,UAAU,IACT,KAAK,EAAE;YACL,MAAM,CAAC,SAAS;YAChB;gBACE,QAAQ;gBACR,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;aACpC;YACD,KAAK;SACN,EACD,OAAO,EAAE,KAAK,KACV,IAAI,YAEP,QAAQ,GACE,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { GestureResponderEvent, View } from 'react-native';
3
+ import type { InteractiveComponentProps } from '../shared/types';
4
+ import type { IconConfig } from './button';
5
+ /** FAB variant controlling color scheme */
6
+ export type FABVariant = 'primary' | 'secondary' | 'tertiary' | 'surface';
7
+ /** FAB size controlling dimensions */
8
+ export type FABSize = 'small' | 'medium' | 'large';
9
+ /**
10
+ * Props for the FAB (Floating Action Button) component.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Standard FAB
15
+ * <FAB icon={{ name: 'plus' }} onPress={() => {}} />
16
+ *
17
+ * // Extended FAB with label
18
+ * <FAB icon={{ name: 'edit-2' }} label="Compose" onPress={() => {}} />
19
+ *
20
+ * // Small surface FAB
21
+ * <FAB icon={{ name: 'arrow-up' }} variant="surface" size="small" onPress={() => {}} />
22
+ * ```
23
+ */
24
+ export interface FABProps extends Omit<InteractiveComponentProps, 'onPress'> {
25
+ /** Required icon configuration */
26
+ icon: IconConfig;
27
+ /** Optional label for extended FAB */
28
+ label?: string;
29
+ /**
30
+ * Color variant following M3 FAB spec.
31
+ * @default 'primary'
32
+ */
33
+ variant?: FABVariant;
34
+ /**
35
+ * Size variant controlling dimensions and icon size.
36
+ * @default 'medium'
37
+ */
38
+ size?: FABSize;
39
+ /** Press handler */
40
+ onPress?: (event?: GestureResponderEvent) => void;
41
+ }
42
+ /**
43
+ * Material Design 3 Floating Action Button (FAB)
44
+ * https://m3.material.io/components/floating-action-button
45
+ *
46
+ * Supports four color variants and three sizes.
47
+ * When a `label` is provided, renders as an Extended FAB.
48
+ */
49
+ declare const FAB: React.ForwardRefExoticComponent<FABProps & React.RefAttributes<View>>;
50
+ export { FAB };
51
+ //# sourceMappingURL=fab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fab.d.ts","sourceRoot":"","sources":["../../../components/ui/fab.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAC/D,OAAO,EACL,qBAAqB,EAIrB,IAAI,EAIL,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAE1E,sCAAsC;AACtC,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAC;IAC1E,kCAAkC;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACnD;AAWD;;;;;;GAMG;AACH,QAAA,MAAM,GAAG,uEAyJP,CAAC;AAqBH,OAAO,EAAE,GAAG,EAAE,CAAC"}
@@ -0,0 +1,142 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // 1. IMPORTS
3
+ import { forwardRef, useEffect, useState } from 'react';
4
+ import { Platform, Pressable, StyleSheet, View, } from 'react-native';
5
+ import { Typography } from './typography';
6
+ import { useTheme } from '../../theme';
7
+ import { renderIcon } from '../../icons';
8
+ import { blurOnWeb } from '../shared/utils';
9
+ // Size configuration (borderRadius resolved from theme at render time)
10
+ const SIZE_CONFIG = {
11
+ small: { dimension: 40, iconSize: 20, radiusKey: 'md' },
12
+ medium: { dimension: 56, iconSize: 24, radiusKey: 'lg' },
13
+ large: { dimension: 96, iconSize: 36, radiusKey: 'xl' },
14
+ };
15
+ // 3. COMPONENT
16
+ /**
17
+ * Material Design 3 Floating Action Button (FAB)
18
+ * https://m3.material.io/components/floating-action-button
19
+ *
20
+ * Supports four color variants and three sizes.
21
+ * When a `label` is provided, renders as an Extended FAB.
22
+ */
23
+ const FAB = forwardRef(({ icon, label, variant = 'primary', size = 'medium', disabled = false, onPress, style, testID, accessibilityLabel, accessibilityHint, }, ref) => {
24
+ const theme = useTheme();
25
+ const tokens = theme.tokens;
26
+ const [hovered, setHovered] = useState(false);
27
+ const [reduceMotionEnabled, setReduceMotionEnabled] = useState(false);
28
+ useEffect(() => {
29
+ let mounted = true;
30
+ try {
31
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
32
+ const { AccessibilityInfo } = require('react-native');
33
+ AccessibilityInfo?.isReduceMotionEnabled?.().then((enabled) => {
34
+ if (mounted)
35
+ setReduceMotionEnabled(!!enabled);
36
+ });
37
+ }
38
+ catch (e) {
39
+ // ignore if not available
40
+ }
41
+ return () => { mounted = false; };
42
+ }, []);
43
+ const sizeConfig = SIZE_CONFIG[size];
44
+ const isExtended = !!label;
45
+ // Color mapping per variant
46
+ const getColors = () => {
47
+ if (disabled) {
48
+ return {
49
+ bg: theme.onSurface + '1F', // 12% opacity
50
+ fg: theme.onSurface + '61', // 38% opacity
51
+ };
52
+ }
53
+ switch (variant) {
54
+ case 'primary':
55
+ return { bg: theme.primaryContainer, fg: theme.onPrimaryContainer };
56
+ case 'secondary':
57
+ return { bg: theme.secondaryContainer, fg: theme.onSecondaryContainer };
58
+ case 'tertiary':
59
+ return { bg: theme.tertiaryContainer, fg: theme.onTertiaryContainer };
60
+ case 'surface':
61
+ return { bg: theme.surface, fg: theme.primary };
62
+ }
63
+ };
64
+ const colors = getColors();
65
+ const getContainerStyle = ({ pressed }) => {
66
+ const elevation = pressed ? tokens.elevation.level1 : tokens.elevation.level3;
67
+ const baseStyle = [
68
+ styles.container,
69
+ {
70
+ backgroundColor: colors.bg,
71
+ borderRadius: theme.borderRadius[sizeConfig.radiusKey],
72
+ },
73
+ ];
74
+ if (isExtended) {
75
+ baseStyle.push({
76
+ height: sizeConfig.dimension,
77
+ paddingHorizontal: theme.spacing.lg,
78
+ minWidth: sizeConfig.dimension,
79
+ });
80
+ }
81
+ else {
82
+ baseStyle.push({
83
+ width: sizeConfig.dimension,
84
+ height: sizeConfig.dimension,
85
+ });
86
+ }
87
+ if (disabled) {
88
+ baseStyle.push(styles.disabled);
89
+ }
90
+ // Elevation shadow
91
+ if (!disabled && elevation > 0) {
92
+ baseStyle.push({
93
+ shadowColor: theme.shadow,
94
+ shadowOffset: { width: 0, height: Math.max(1, Math.floor(elevation / 2)) },
95
+ shadowOpacity: 0.08,
96
+ shadowRadius: Math.max(1, Math.floor(elevation / 2)),
97
+ elevation: elevation,
98
+ });
99
+ }
100
+ // Hover/press transforms
101
+ if (!reduceMotionEnabled) {
102
+ if (pressed) {
103
+ baseStyle.push({ transform: [{ scale: 0.997 }] });
104
+ }
105
+ else if (hovered && Platform.OS === 'web') {
106
+ baseStyle.push({ transform: [{ translateY: -1 }, { scale: 1.02 }] });
107
+ }
108
+ }
109
+ if (style) {
110
+ baseStyle.push(style);
111
+ }
112
+ return baseStyle;
113
+ };
114
+ const iconSize = icon.size || sizeConfig.iconSize;
115
+ const iconLibrary = icon.library || 'Feather';
116
+ const iconColor = icon.color || colors.fg;
117
+ return (_jsx(Pressable, { ref: ref, testID: testID, onPress: disabled ? undefined : (e) => {
118
+ blurOnWeb(e);
119
+ onPress?.(e);
120
+ }, disabled: disabled, style: getContainerStyle, onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false), accessibilityRole: "button", accessibilityLabel: accessibilityLabel ?? label ?? icon.name, accessibilityHint: accessibilityHint, accessibilityState: { disabled }, android_ripple: !disabled && Platform.OS === 'android'
121
+ ? { color: colors.fg + '40', borderless: false }
122
+ : undefined, children: _jsxs(View, { style: [styles.content, { gap: theme.spacing.sm }], children: [renderIcon(icon, iconLibrary, iconSize, iconColor), isExtended && (_jsx(Typography, { variant: "labelLarge", weight: "medium", color: colors.fg, numberOfLines: 1, children: label }))] }) }));
123
+ });
124
+ FAB.displayName = 'FAB';
125
+ // 4. STYLES
126
+ const styles = StyleSheet.create({
127
+ container: {
128
+ alignItems: 'center',
129
+ justifyContent: 'center',
130
+ },
131
+ content: {
132
+ flexDirection: 'row',
133
+ alignItems: 'center',
134
+ justifyContent: 'center',
135
+ },
136
+ disabled: {
137
+ opacity: 0.38,
138
+ },
139
+ });
140
+ // 5. EXPORTS
141
+ export { FAB };
142
+ //# sourceMappingURL=fab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fab.js","sourceRoot":"","sources":["../../../components/ui/fab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export { Button } from './button';
2
+ export type { ButtonProps, ButtonVariant, IconConfig } from './button';
3
+ export { ButtonVariants } from './button';
4
+ export { Chip } from './chip';
5
+ export type { ChipProps, ChipVariant, ChipIconConfig } from './chip';
6
+ export { ChipVariants } from './chip';
7
+ export { FAB } from './fab';
8
+ export type { FABProps, FABVariant, FABSize } from './fab';
9
+ export { Collapsible } from './collapsible';
10
+ export type { CollapsibleProps } from './collapsible';
11
+ export { Typography } from './typography';
12
+ export type { TypographyProps, TypographyVariant, TypographyWeight, TypographyAlign } from './typography';
13
+ export { ThemedView } from './themed-view';
14
+ export type { ThemedViewProps, ThemedViewVariant } from './themed-view';
15
+ export { Screen } from './screen';
16
+ export type { ScreenProps } from './screen';
17
+ export { Container } from './container';
18
+ export type { ContainerProps } from './container';
19
+ export { ThemedImage } from './themed-image';
20
+ export type { ThemedImageProps } from './themed-image';
21
+ export { Slider } from './slider';
22
+ export type { SliderProps } from './slider';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../components/ui/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGxE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,22 @@
1
+ // UI components
2
+ export { Button } from './button';
3
+ export { ButtonVariants } from './button';
4
+ // Chip
5
+ export { Chip } from './chip';
6
+ export { ChipVariants } from './chip';
7
+ // FAB
8
+ export { FAB } from './fab';
9
+ // Collapsible
10
+ export { Collapsible } from './collapsible';
11
+ // Typography
12
+ export { Typography } from './typography';
13
+ export { ThemedView } from './themed-view';
14
+ // Screen
15
+ export { Screen } from './screen';
16
+ // Container
17
+ export { Container } from './container';
18
+ // ThemedImage
19
+ export { ThemedImage } from './themed-image';
20
+ // Slider
21
+ export { Slider } from './slider';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/ui/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO;AACP,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM;AACN,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ import { type Edge } from 'react-native-safe-area-context';
4
+ import { type ThemedViewVariant } from './themed-view';
5
+ export interface ScreenProps {
6
+ /** Screen content */
7
+ children: React.ReactNode;
8
+ /** Whether to wrap content in ScrollView. @default false */
9
+ scrollable?: boolean;
10
+ /** Themed background variant. @default 'background' */
11
+ variant?: ThemedViewVariant;
12
+ /** Which safe area edges to respect. @default ['bottom'] */
13
+ edges?: Edge[];
14
+ /** Styles for the ScrollView content container (only applies if scrollable=true) */
15
+ contentContainerStyle?: StyleProp<ViewStyle>;
16
+ /** Styles for the outer container */
17
+ style?: StyleProp<ViewStyle>;
18
+ /** Test ID for testing */
19
+ testID?: string;
20
+ /** Whether to show vertical scroll indicator. @default true */
21
+ showsVerticalScrollIndicator?: boolean;
22
+ /**
23
+ * Whether to apply default top padding. @default true
24
+ * Set to false for full-bleed layouts (e.g. hero images at the top).
25
+ * Bottom padding is always applied when edges includes 'bottom'.
26
+ */
27
+ padded?: boolean;
28
+ }
29
+ /**
30
+ * Screen component providing consistent layout with safe areas and optional scrolling.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <Screen scrollable>
35
+ * <Typography>Content</Typography>
36
+ * </Screen>
37
+ * ```
38
+ */
39
+ export declare const Screen: React.FC<ScreenProps>;
40
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../../components/ui/screen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAA0B,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAChG,OAAO,EAAgB,KAAK,IAAI,EAAqB,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,oFAAoF;IACpF,qBAAqB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7C,qCAAqC;IACrC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAwDxC,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ScrollView, StyleSheet, Platform } from 'react-native';
3
+ import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
4
+ import { ThemedView } from './themed-view';
5
+ import { useTheme } from '../../theme';
6
+ /**
7
+ * Screen component providing consistent layout with safe areas and optional scrolling.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <Screen scrollable>
12
+ * <Typography>Content</Typography>
13
+ * </Screen>
14
+ * ```
15
+ */
16
+ export const Screen = ({ children, scrollable = false, variant = 'background', edges = ['bottom'], contentContainerStyle, style, testID, showsVerticalScrollIndicator = true, padded = true, }) => {
17
+ const insets = useSafeAreaInsets();
18
+ const theme = useTheme();
19
+ // Strip 'bottom' from SafeAreaView edges — we manage bottom padding directly.
20
+ // With NativeTabs on Android, insets.bottom inside a tab screen is 0 (the native tab bar
21
+ // already constrains the content frame), so SafeAreaView's 'bottom' edge would double-apply
22
+ // the nav bar inset. Stripping it and using 0 on Android fixes that bug.
23
+ // On iOS, insets.bottom does not reflect the tab bar height, so we use a fixed 80dp to clear
24
+ // the standard tab bar (~46dp) + home indicator (~34dp).
25
+ const safeAreaEdges = edges.filter((e) => e !== 'bottom');
26
+ const bottomPadding = edges.includes('bottom') ? (Platform.OS === 'ios' ? 100 : 24) : 0;
27
+ return (_jsx(ThemedView, { variant: variant, rounded: false, style: styles.container, children: _jsx(SafeAreaView, { style: styles.safeArea, edges: safeAreaEdges, testID: testID, children: scrollable ? (_jsx(ScrollView, { style: styles.scrollView, contentContainerStyle: [
28
+ styles.scrollContent,
29
+ padded && { paddingTop: theme.spacing.xxl },
30
+ { paddingBottom: bottomPadding },
31
+ contentContainerStyle,
32
+ ], showsVerticalScrollIndicator: showsVerticalScrollIndicator, children: children })) : (_jsx(ThemedView, { variant: variant, rounded: false, style: [
33
+ styles.content,
34
+ padded && { paddingTop: theme.spacing.xxl },
35
+ { paddingBottom: bottomPadding },
36
+ style,
37
+ ], children: children })) }) }));
38
+ };
39
+ Screen.displayName = 'Screen';
40
+ const styles = StyleSheet.create({
41
+ container: {
42
+ flex: 1,
43
+ },
44
+ safeArea: {
45
+ flex: 1,
46
+ },
47
+ scrollView: {
48
+ flex: 1,
49
+ },
50
+ scrollContent: {
51
+ flexGrow: 1,
52
+ },
53
+ content: {
54
+ flex: 1,
55
+ },
56
+ });
57
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../../components/ui/screen.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAkC,QAAQ,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,YAAY,EAAa,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,UAAU,EAA0B,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2BvC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAC5C,QAAQ,EACR,UAAU,GAAG,KAAK,EAClB,OAAO,GAAG,YAAY,EACtB,KAAK,GAAG,CAAC,QAAQ,CAAC,EAClB,qBAAqB,EACrB,KAAK,EACL,MAAM,EACN,4BAA4B,GAAG,IAAI,EACnC,MAAM,GAAG,IAAI,GACd,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,8EAA8E;IAC9E,yFAAyF;IACzF,4FAA4F;IAC5F,yEAAyE;IACzE,6FAA6F;IAC7F,yDAAyD;IACzD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;IAEzF,OAAO,CACL,KAAC,UAAU,IAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,YACnE,KAAC,YAAY,IAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YACvE,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,UAAU,IACT,KAAK,EAAE,MAAM,CAAC,UAAU,EACxB,qBAAqB,EAAE;oBACrB,MAAM,CAAC,aAAa;oBACpB,MAAM,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC3C,EAAE,aAAa,EAAE,aAAa,EAAE;oBAChC,qBAAqB;iBACtB,EACD,4BAA4B,EAAE,4BAA4B,YAEzD,QAAQ,GACE,CACd,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,KAAK,EACd,KAAK,EAAE;oBACL,MAAM,CAAC,OAAO;oBACd,MAAM,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC3C,EAAE,aAAa,EAAE,aAAa,EAAE;oBAChC,KAAK;iBACN,YAEA,QAAQ,GACE,CACd,GACY,GACJ,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;AAE9B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;KACR;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC;KACR;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC;KACR;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,CAAC;KACZ;IACD,OAAO,EAAE;QACP,IAAI,EAAE,CAAC;KACR;CACF,CAAC,CAAC"}