@framingui/react-native 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/components/ActionRow.d.ts +11 -0
  4. package/dist/components/ActionRow.d.ts.map +1 -0
  5. package/dist/components/ActionRow.js +18 -0
  6. package/dist/components/ActionRow.js.map +1 -0
  7. package/dist/components/Avatar.d.ts +9 -0
  8. package/dist/components/Avatar.d.ts.map +1 -0
  9. package/dist/components/Avatar.js +34 -0
  10. package/dist/components/Avatar.js.map +1 -0
  11. package/dist/components/Badge.d.ts +10 -0
  12. package/dist/components/Badge.d.ts.map +1 -0
  13. package/dist/components/Badge.js +38 -0
  14. package/dist/components/Badge.js.map +1 -0
  15. package/dist/components/Button.d.ts +12 -0
  16. package/dist/components/Button.d.ts.map +1 -0
  17. package/dist/components/Button.js +52 -0
  18. package/dist/components/Button.js.map +1 -0
  19. package/dist/components/Card.d.ts +9 -0
  20. package/dist/components/Card.d.ts.map +1 -0
  21. package/dist/components/Card.js +23 -0
  22. package/dist/components/Card.js.map +1 -0
  23. package/dist/components/Checkbox.d.ts +11 -0
  24. package/dist/components/Checkbox.d.ts.map +1 -0
  25. package/dist/components/Checkbox.js +40 -0
  26. package/dist/components/Checkbox.js.map +1 -0
  27. package/dist/components/EmptyState.d.ts +11 -0
  28. package/dist/components/EmptyState.d.ts.map +1 -0
  29. package/dist/components/EmptyState.js +33 -0
  30. package/dist/components/EmptyState.js.map +1 -0
  31. package/dist/components/FormSection.d.ts +12 -0
  32. package/dist/components/FormSection.d.ts.map +1 -0
  33. package/dist/components/FormSection.js +19 -0
  34. package/dist/components/FormSection.js.map +1 -0
  35. package/dist/components/Heading.d.ts +12 -0
  36. package/dist/components/Heading.d.ts.map +1 -0
  37. package/dist/components/Heading.js +6 -0
  38. package/dist/components/Heading.js.map +1 -0
  39. package/dist/components/IconButton.d.ts +13 -0
  40. package/dist/components/IconButton.d.ts.map +1 -0
  41. package/dist/components/IconButton.js +60 -0
  42. package/dist/components/IconButton.js.map +1 -0
  43. package/dist/components/InlineMessage.d.ts +7 -0
  44. package/dist/components/InlineMessage.d.ts.map +1 -0
  45. package/dist/components/InlineMessage.js +29 -0
  46. package/dist/components/InlineMessage.js.map +1 -0
  47. package/dist/components/ListItem.d.ts +12 -0
  48. package/dist/components/ListItem.d.ts.map +1 -0
  49. package/dist/components/ListItem.js +35 -0
  50. package/dist/components/ListItem.js.map +1 -0
  51. package/dist/components/ListSection.d.ts +12 -0
  52. package/dist/components/ListSection.d.ts.map +1 -0
  53. package/dist/components/ListSection.js +15 -0
  54. package/dist/components/ListSection.js.map +1 -0
  55. package/dist/components/Modal.d.ts +11 -0
  56. package/dist/components/Modal.d.ts.map +1 -0
  57. package/dist/components/Modal.js +39 -0
  58. package/dist/components/Modal.js.map +1 -0
  59. package/dist/components/PickerField.d.ts +15 -0
  60. package/dist/components/PickerField.d.ts.map +1 -0
  61. package/dist/components/PickerField.js +45 -0
  62. package/dist/components/PickerField.js.map +1 -0
  63. package/dist/components/RadioGroup.d.ts +17 -0
  64. package/dist/components/RadioGroup.d.ts.map +1 -0
  65. package/dist/components/RadioGroup.js +51 -0
  66. package/dist/components/RadioGroup.js.map +1 -0
  67. package/dist/components/Screen.d.ts +17 -0
  68. package/dist/components/Screen.d.ts.map +1 -0
  69. package/dist/components/Screen.js +38 -0
  70. package/dist/components/Screen.js.map +1 -0
  71. package/dist/components/ScreenHeader.d.ts +9 -0
  72. package/dist/components/ScreenHeader.d.ts.map +1 -0
  73. package/dist/components/ScreenHeader.js +37 -0
  74. package/dist/components/ScreenHeader.js.map +1 -0
  75. package/dist/components/Section.d.ts +12 -0
  76. package/dist/components/Section.d.ts.map +1 -0
  77. package/dist/components/Section.js +27 -0
  78. package/dist/components/Section.js.map +1 -0
  79. package/dist/components/SegmentedControl.d.ts +13 -0
  80. package/dist/components/SegmentedControl.d.ts.map +1 -0
  81. package/dist/components/SegmentedControl.js +37 -0
  82. package/dist/components/SegmentedControl.js.map +1 -0
  83. package/dist/components/Stack.d.ts +13 -0
  84. package/dist/components/Stack.d.ts.map +1 -0
  85. package/dist/components/Stack.js +22 -0
  86. package/dist/components/Stack.js.map +1 -0
  87. package/dist/components/Switch.d.ts +11 -0
  88. package/dist/components/Switch.d.ts.map +1 -0
  89. package/dist/components/Switch.js +29 -0
  90. package/dist/components/Switch.js.map +1 -0
  91. package/dist/components/Text.d.ts +12 -0
  92. package/dist/components/Text.d.ts.map +1 -0
  93. package/dist/components/Text.js +25 -0
  94. package/dist/components/Text.js.map +1 -0
  95. package/dist/components/TextArea.d.ts +11 -0
  96. package/dist/components/TextArea.d.ts.map +1 -0
  97. package/dist/components/TextArea.js +57 -0
  98. package/dist/components/TextArea.js.map +1 -0
  99. package/dist/components/TextField.d.ts +11 -0
  100. package/dist/components/TextField.d.ts.map +1 -0
  101. package/dist/components/TextField.js +58 -0
  102. package/dist/components/TextField.js.map +1 -0
  103. package/dist/components/index.d.ts +26 -0
  104. package/dist/components/index.d.ts.map +1 -0
  105. package/dist/components/index.js +26 -0
  106. package/dist/components/index.js.map +1 -0
  107. package/dist/contracts.d.ts +63 -0
  108. package/dist/contracts.d.ts.map +1 -0
  109. package/dist/contracts.js +61 -0
  110. package/dist/contracts.js.map +1 -0
  111. package/dist/helpers.d.ts +9 -0
  112. package/dist/helpers.d.ts.map +1 -0
  113. package/dist/helpers.js +28 -0
  114. package/dist/helpers.js.map +1 -0
  115. package/dist/index.d.ts +8 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +8 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/layout.d.ts +36 -0
  120. package/dist/layout.d.ts.map +1 -0
  121. package/dist/layout.js +94 -0
  122. package/dist/layout.js.map +1 -0
  123. package/dist/theme.d.ts +39 -0
  124. package/dist/theme.d.ts.map +1 -0
  125. package/dist/theme.js +53 -0
  126. package/dist/theme.js.map +1 -0
  127. package/dist/tokens.d.ts +345 -0
  128. package/dist/tokens.d.ts.map +1 -0
  129. package/dist/tokens.js +126 -0
  130. package/dist/tokens.js.map +1 -0
  131. package/package.json +67 -0
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StyleSheet, Text, View } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ export function InlineMessage({ message, tone = 'info' }) {
5
+ const theme = useTheme();
6
+ const styles = getStyles(theme);
7
+ return (_jsx(View, { style: [styles.base, tone === 'error' && styles.error], children: _jsx(Text, { style: [styles.text, tone === 'error' && styles.errorText], children: message }) }));
8
+ }
9
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
10
+ base: {
11
+ backgroundColor: theme.colors.background.subtle,
12
+ borderRadius: theme.radius.md,
13
+ paddingHorizontal: theme.spacing[3],
14
+ paddingVertical: theme.spacing[3],
15
+ },
16
+ error: {
17
+ backgroundColor: theme.colors.surface.danger,
18
+ borderColor: theme.colors.border.danger,
19
+ borderWidth: 1,
20
+ },
21
+ text: {
22
+ ...theme.typography.caption,
23
+ color: theme.colors.text.primary,
24
+ },
25
+ errorText: {
26
+ color: theme.colors.text.danger,
27
+ },
28
+ }));
29
+ //# sourceMappingURL=InlineMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineMessage.js","sourceRoot":"","sources":["../../src/components/InlineMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAS3D,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,MAAM,EAAsB;IAC1E,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,YAC1D,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,YAAG,OAAO,GAAQ,GAC7E,CACR,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3C,UAAU,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM;QAC/C,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;QAC7B,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAClC;IACD,KAAK,EAAE;QACL,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;QAC5C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;QACvC,WAAW,EAAE,CAAC;KACf;IACD,IAAI,EAAE;QACJ,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO;QAC3B,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;KACjC;IACD,SAAS,EAAE;QACT,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;KAChC;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ export interface ListItemProps {
4
+ title: string;
5
+ description?: string;
6
+ leading?: ReactNode;
7
+ trailing?: ReactNode;
8
+ onPress?: () => void;
9
+ style?: StyleProp<ViewStyle>;
10
+ }
11
+ export declare function ListItem({ title, description, leading, trailing, onPress, style }: ListItemProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=ListItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListItem.d.ts","sourceRoot":"","sources":["../../src/components/ListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAa,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAIjF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,aAAa,2CAuBhG"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Pressable, StyleSheet, View } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ import { Text } from './Text.js';
5
+ export function ListItem({ title, description, leading, trailing, onPress, style }) {
6
+ const theme = useTheme();
7
+ const styles = getStyles(theme);
8
+ const Container = onPress ? Pressable : View;
9
+ return (_jsxs(Container, { accessibilityRole: onPress ? 'button' : undefined, onPress: onPress, style: [styles.base, onPress && styles.pressable, style], children: [leading ? _jsx(View, { style: styles.leading, children: leading }) : null, _jsxs(View, { style: styles.copy, children: [_jsx(Text, { variant: "bodyStrong", children: title }), description ? (_jsx(Text, { tone: "secondary", variant: "caption", children: description })) : null] }), trailing ? _jsx(View, { style: styles.trailing, children: trailing }) : null] }));
10
+ }
11
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
12
+ base: {
13
+ alignItems: 'center',
14
+ flexDirection: 'row',
15
+ gap: theme.spacing[3],
16
+ width: '100%',
17
+ },
18
+ pressable: {
19
+ borderRadius: theme.radius.md,
20
+ paddingVertical: theme.spacing[1],
21
+ },
22
+ leading: {
23
+ alignItems: 'center',
24
+ justifyContent: 'center',
25
+ },
26
+ copy: {
27
+ flex: 1,
28
+ gap: theme.spacing[1],
29
+ },
30
+ trailing: {
31
+ alignItems: 'flex-end',
32
+ justifyContent: 'center',
33
+ },
34
+ }));
35
+ //# sourceMappingURL=ListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListItem.js","sourceRoot":"","sources":["../../src/components/ListItem.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAa,UAAU,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAiB;IAC/F,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7C,OAAO,CACL,MAAC,SAAS,IACR,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACjD,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,KAAkB,CAAC,aAEpE,OAAO,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,OAAO,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC/D,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,aACtB,KAAC,IAAI,IAAC,OAAO,EAAC,YAAY,YAAE,KAAK,GAAQ,EACxC,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,IAAI,IAAC,IAAI,EAAC,WAAW,EAAC,OAAO,EAAC,SAAS,YACrC,WAAW,GACP,CACR,CAAC,CAAC,CAAC,IAAI,IACH,EACN,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,YAAG,QAAQ,GAAQ,CAAC,CAAC,CAAC,IAAI,IACxD,CACb,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3C,UAAU,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,KAAK;QACpB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrB,KAAK,EAAE,MAAM;KACd;IACD,SAAS,EAAE;QACT,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;QAC7B,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAClC;IACD,OAAO,EAAE;QACP,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KACtB;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,UAAU;QACtB,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ import { type SectionGapToken } from '../layout.js';
4
+ export interface ListSectionProps {
5
+ children: ReactNode;
6
+ title?: string;
7
+ description?: string;
8
+ gap?: SectionGapToken;
9
+ style?: StyleProp<ViewStyle>;
10
+ }
11
+ export declare function ListSection({ children, title, description, gap, style, }: ListSectionProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=ListSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListSection.d.ts","sourceRoot":"","sources":["../../src/components/ListSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAIxE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAK,EACL,WAAW,EACX,GAAa,EACb,KAAK,GACN,EAAE,gBAAgB,2CAQlB"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StyleSheet, View } from 'react-native';
3
+ import { getSectionGapStyle } from '../layout.js';
4
+ import { useTheme } from '../theme.js';
5
+ import { Section } from './Section.js';
6
+ export function ListSection({ children, title, description, gap = 'tight', style, }) {
7
+ const theme = useTheme();
8
+ return (_jsx(Section, { description: description, gap: "default", title: title, children: _jsx(View, { style: [styles.list, getSectionGapStyle(gap, theme), style], children: children }) }));
9
+ }
10
+ const styles = StyleSheet.create({
11
+ list: {
12
+ width: '100%',
13
+ },
14
+ });
15
+ //# sourceMappingURL=ListSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListSection.js","sourceRoot":"","sources":["../../src/components/ListSection.tsx"],"names":[],"mappings":";AACA,OAAO,EAAa,UAAU,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAwB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAUvC,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAK,EACL,WAAW,EACX,GAAG,GAAG,OAAO,EACb,KAAK,GACY;IACjB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,OAAO,CACL,KAAC,OAAO,IAAC,WAAW,EAAE,WAAW,EAAE,GAAG,EAAC,SAAS,EAAC,KAAK,EAAE,KAAK,YAC3D,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,YAAG,QAAQ,GAAQ,GAC5E,CACX,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;KACd;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ModalProps {
3
+ visible: boolean;
4
+ title: string;
5
+ description?: string;
6
+ children?: ReactNode;
7
+ footer?: ReactNode;
8
+ onRequestClose?: () => void;
9
+ }
10
+ export declare function Modal({ visible, title, description, children, footer, onRequestClose, }: ModalProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/components/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,EACN,cAAc,GACf,EAAE,UAAU,2CAgCZ"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Modal as ReactNativeModal, StyleSheet, TouchableWithoutFeedback, View, } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ import { Button } from './Button.js';
5
+ import { Text } from './Text.js';
6
+ export function Modal({ visible, title, description, children, footer, onRequestClose, }) {
7
+ const theme = useTheme();
8
+ const styles = getStyles(theme);
9
+ return (_jsx(ReactNativeModal, { onRequestClose: onRequestClose, transparent: true, visible: visible, children: _jsx(TouchableWithoutFeedback, { onPress: onRequestClose, children: _jsx(View, { style: styles.backdrop, children: _jsx(TouchableWithoutFeedback, { children: _jsxs(View, { style: styles.card, children: [_jsxs(View, { style: styles.copy, children: [_jsx(Text, { variant: "sectionTitle", children: title }), description ? (_jsx(Text, { tone: "secondary", variant: "body", children: description })) : null] }), children ? _jsx(View, { style: styles.body, children: children }) : null, footer ? (_jsx(View, { style: styles.footer, children: footer })) : onRequestClose ? (_jsx(View, { style: styles.footer, children: _jsx(Button, { label: "Close", onPress: onRequestClose, variant: "secondary" }) })) : null] }) }) }) }) }));
10
+ }
11
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
12
+ backdrop: {
13
+ alignItems: 'center',
14
+ backgroundColor: 'rgba(17, 17, 17, 0.48)',
15
+ flex: 1,
16
+ justifyContent: 'center',
17
+ padding: theme.spacing[4],
18
+ },
19
+ card: {
20
+ ...theme.shadows.card,
21
+ backgroundColor: theme.colors.surface.base,
22
+ borderRadius: theme.radius.lg,
23
+ gap: theme.spacing[4],
24
+ maxWidth: 520,
25
+ padding: theme.spacing[5],
26
+ width: '100%',
27
+ },
28
+ copy: {
29
+ gap: theme.spacing[2],
30
+ },
31
+ body: {
32
+ gap: theme.spacing[3],
33
+ },
34
+ footer: {
35
+ gap: theme.spacing[3],
36
+ width: '100%',
37
+ },
38
+ }));
39
+ //# sourceMappingURL=Modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../src/components/Modal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { StyleProp, ViewStyle } from 'react-native';
2
+ export interface PickerFieldProps {
3
+ label?: string;
4
+ placeholder: string;
5
+ selectedLabel?: string;
6
+ selected?: boolean;
7
+ invalid?: boolean;
8
+ focused?: boolean;
9
+ disabled?: boolean;
10
+ message?: string;
11
+ onPress?: () => void;
12
+ style?: StyleProp<ViewStyle>;
13
+ }
14
+ export declare function PickerField({ label, placeholder, selectedLabel, selected, invalid, focused, disabled, message, onPress, style, }: PickerFieldProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=PickerField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickerField.d.ts","sourceRoot":"","sources":["../../src/components/PickerField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAIjF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,aAAa,EACb,QAAgB,EAChB,OAAe,EACf,OAAe,EACf,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,KAAK,GACN,EAAE,gBAAgB,2CAgClB"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Pressable, StyleSheet, View } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ import { Text } from './Text.js';
5
+ export function PickerField({ label, placeholder, selectedLabel, selected = false, invalid = false, focused = false, disabled = false, message, onPress, style, }) {
6
+ const theme = useTheme();
7
+ const styles = getStyles(theme);
8
+ const hasSelection = selected || Boolean(selectedLabel);
9
+ return (_jsxs(View, { style: [styles.wrapper, style], children: [label ? _jsx(Text, { variant: "label", children: label }) : null, _jsxs(Pressable, { accessibilityRole: "button", accessibilityState: { disabled, selected: hasSelection }, disabled: disabled, onPress: onPress, style: [
10
+ styles.field,
11
+ focused && styles.fieldFocused,
12
+ invalid && styles.fieldInvalid,
13
+ disabled && styles.fieldDisabled,
14
+ ], children: [_jsx(Text, { tone: hasSelection ? 'primary' : 'tertiary', children: selectedLabel ?? placeholder }), _jsx(Text, { tone: "tertiary", variant: "label", children: "\u25BE" })] }), message ? (_jsx(Text, { tone: invalid ? 'danger' : 'secondary', variant: "caption", children: message })) : null] }));
15
+ }
16
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
17
+ wrapper: {
18
+ gap: theme.spacing[2],
19
+ width: '100%',
20
+ },
21
+ field: {
22
+ alignItems: 'center',
23
+ backgroundColor: theme.colors.surface.muted,
24
+ borderColor: theme.colors.border.default,
25
+ borderRadius: theme.radius.md,
26
+ borderWidth: 1,
27
+ flexDirection: 'row',
28
+ justifyContent: 'space-between',
29
+ minHeight: 52,
30
+ paddingHorizontal: theme.spacing[4],
31
+ paddingVertical: theme.spacing[3],
32
+ width: '100%',
33
+ },
34
+ fieldFocused: {
35
+ borderColor: theme.colors.border.accent,
36
+ ...theme.shadows.focus,
37
+ },
38
+ fieldInvalid: {
39
+ borderColor: theme.colors.border.danger,
40
+ },
41
+ fieldDisabled: {
42
+ opacity: 0.6,
43
+ },
44
+ }));
45
+ //# sourceMappingURL=PickerField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickerField.js","sourceRoot":"","sources":["../../src/components/PickerField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { StyleProp, ViewStyle } from 'react-native';
2
+ export interface RadioOption {
3
+ label: string;
4
+ value: string;
5
+ description?: string;
6
+ disabled?: boolean;
7
+ }
8
+ export interface RadioGroupProps {
9
+ label?: string;
10
+ options: RadioOption[];
11
+ value?: string;
12
+ onValueChange?: (value: string) => void;
13
+ disabled?: boolean;
14
+ style?: StyleProp<ViewStyle>;
15
+ }
16
+ export declare function RadioGroup({ label, options, value, onValueChange, disabled, style, }: RadioGroupProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=RadioGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../src/components/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAIjF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,OAAO,EACP,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,KAAK,GACN,EAAE,eAAe,2CA0CjB"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Pressable, StyleSheet, View } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ import { Text } from './Text.js';
5
+ export function RadioGroup({ label, options, value, onValueChange, disabled = false, style, }) {
6
+ const theme = useTheme();
7
+ const styles = getStyles(theme);
8
+ return (_jsxs(View, { style: [styles.base, style], children: [label ? _jsx(Text, { variant: "label", children: label }) : null, _jsx(View, { style: styles.options, children: options.map(option => {
9
+ const checked = option.value === value;
10
+ const isDisabled = disabled || option.disabled;
11
+ return (_jsxs(Pressable, { accessibilityRole: "radio", accessibilityState: { checked, disabled: isDisabled }, disabled: isDisabled, onPress: () => onValueChange?.(option.value), style: [styles.option, isDisabled && styles.optionDisabled], children: [_jsx(View, { style: [styles.control, checked && styles.controlChecked], children: checked ? (_jsx(Text, { tone: checked ? 'accent' : 'primary', variant: "label", children: "\u25CF" })) : null }), _jsxs(View, { style: styles.copy, children: [_jsx(Text, { variant: "bodyStrong", children: option.label }), option.description ? (_jsx(Text, { tone: "secondary", variant: "caption", children: option.description })) : null] })] }, option.value));
12
+ }) })] }));
13
+ }
14
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
15
+ base: {
16
+ gap: theme.spacing[2],
17
+ width: '100%',
18
+ },
19
+ options: {
20
+ gap: theme.spacing[3],
21
+ width: '100%',
22
+ },
23
+ option: {
24
+ alignItems: 'flex-start',
25
+ flexDirection: 'row',
26
+ gap: theme.spacing[3],
27
+ width: '100%',
28
+ },
29
+ optionDisabled: {
30
+ opacity: 0.6,
31
+ },
32
+ control: {
33
+ alignItems: 'center',
34
+ backgroundColor: theme.colors.surface.base,
35
+ borderColor: theme.colors.border.default,
36
+ borderRadius: theme.radius.full,
37
+ borderWidth: 1,
38
+ height: 24,
39
+ justifyContent: 'center',
40
+ marginTop: 2,
41
+ width: 24,
42
+ },
43
+ controlChecked: {
44
+ borderColor: theme.colors.border.accent,
45
+ },
46
+ copy: {
47
+ flex: 1,
48
+ gap: theme.spacing[1],
49
+ },
50
+ }));
51
+ //# sourceMappingURL=RadioGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.js","sourceRoot":"","sources":["../../src/components/RadioGroup.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ import { type ContentWidthToken, type SafeAreaPresetToken, type ScreenInsetToken } from '../layout.js';
4
+ export interface ScreenProps {
5
+ children: ReactNode;
6
+ scroll?: boolean;
7
+ centered?: boolean;
8
+ padded?: boolean;
9
+ width?: 'full' | 'narrow';
10
+ inset?: ScreenInsetToken;
11
+ safeArea?: SafeAreaPresetToken;
12
+ contentWidth?: ContentWidthToken;
13
+ style?: StyleProp<ViewStyle>;
14
+ contentStyle?: StyleProp<ViewStyle>;
15
+ }
16
+ export declare function Screen({ children, scroll, centered, padded, width, inset, safeArea, contentWidth, style, contentStyle, }: ScreenProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=Screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.d.ts","sourceRoot":"","sources":["../../src/components/Screen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAc,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACrC;AAED,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,MAAa,EACb,QAAgB,EAChB,MAAa,EACb,KAAc,EACd,KAAK,EACL,QAAiB,EACjB,YAAY,EACZ,KAAK,EACL,YAAY,GACb,EAAE,WAAW,2CAmCb"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ScrollView, StyleSheet, View } from 'react-native';
3
+ import { getContentWidthStyle, getSafeAreaPaddingStyle, getScreenInsetStyle, } from '../layout.js';
4
+ import { createThemedStyles, useTheme } from '../theme.js';
5
+ export function Screen({ children, scroll = true, centered = false, padded = true, width = 'full', inset, safeArea = 'none', contentWidth, style, contentStyle, }) {
6
+ const theme = useTheme();
7
+ const styles = getStyles(theme);
8
+ const insetStyle = getScreenInsetStyle(inset ?? (padded ? 'default' : 'none'), theme);
9
+ const contentWidthStyle = getContentWidthStyle(contentWidth ?? (width === 'narrow' ? 'form' : 'full'));
10
+ const safeAreaStyle = getSafeAreaPaddingStyle(safeArea, theme);
11
+ const content = (_jsx(View, { style: [
12
+ styles.content,
13
+ centered && styles.centered,
14
+ insetStyle,
15
+ contentWidthStyle,
16
+ contentStyle,
17
+ ], children: children }));
18
+ if (!scroll) {
19
+ return _jsx(View, { style: [styles.base, safeAreaStyle, style], children: content });
20
+ }
21
+ return (_jsx(ScrollView, { contentContainerStyle: styles.scrollContent, style: [styles.base, safeAreaStyle, style], children: content }));
22
+ }
23
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
24
+ base: {
25
+ backgroundColor: theme.colors.background.canvas,
26
+ flex: 1,
27
+ },
28
+ scrollContent: {
29
+ flexGrow: 1,
30
+ },
31
+ content: {
32
+ width: '100%',
33
+ },
34
+ centered: {
35
+ justifyContent: 'center',
36
+ },
37
+ }));
38
+ //# sourceMappingURL=Screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Screen.js","sourceRoot":"","sources":["../../src/components/Screen.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAa,UAAU,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AAClF,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,GAIpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe3D,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,EACR,MAAM,GAAG,IAAI,EACb,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,IAAI,EACb,KAAK,GAAG,MAAM,EACd,KAAK,EACL,QAAQ,GAAG,MAAM,EACjB,YAAY,EACZ,KAAK,EACL,YAAY,GACA;IACZ,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IACtF,MAAM,iBAAiB,GAAG,oBAAoB,CAC5C,YAAY,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CACvD,CAAC;IACF,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE/D,MAAM,OAAO,GAAG,CACd,KAAC,IAAI,IACH,KAAK,EAAE;YACL,MAAM,CAAC,OAAO;YACd,QAAQ,IAAI,MAAM,CAAC,QAAQ;YAC3B,UAAU;YACV,iBAAiB;YACjB,YAAY;SACb,YAEA,QAAQ,GACJ,CACR,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,YAAG,OAAO,GAAQ,CAAC;IAC5E,CAAC;IAED,OAAO,CACL,KAAC,UAAU,IACT,qBAAqB,EAAE,MAAM,CAAC,aAAa,EAC3C,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,YAEzC,OAAO,GACG,CACd,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3C,UAAU,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM;QAC/C,IAAI,EAAE,CAAC;KACR;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,CAAC;KACZ;IACD,OAAO,EAAE;QACP,KAAK,EAAE,MAAM;KACd;IACD,QAAQ,EAAE;QACR,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ScreenHeaderProps {
3
+ title: string;
4
+ description?: string;
5
+ eyebrow?: string;
6
+ trailing?: ReactNode;
7
+ }
8
+ export declare function ScreenHeader({ title, description, eyebrow, trailing }: ScreenHeaderProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=ScreenHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenHeader.d.ts","sourceRoot":"","sources":["../../src/components/ScreenHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAcxF"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { StyleSheet, Text, View } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ export function ScreenHeader({ title, description, eyebrow, trailing }) {
5
+ const theme = useTheme();
6
+ const styles = getStyles(theme);
7
+ return (_jsxs(View, { style: styles.base, children: [_jsxs(View, { style: styles.copy, children: [eyebrow ? _jsx(Text, { style: styles.eyebrow, children: eyebrow }) : null, _jsx(Text, { style: styles.title, children: title }), description ? _jsx(Text, { style: styles.description, children: description }) : null] }), trailing ? _jsx(View, { style: styles.trailing, children: trailing }) : null] }));
8
+ }
9
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
10
+ base: {
11
+ flexDirection: 'row',
12
+ gap: theme.spacing[4],
13
+ justifyContent: 'space-between',
14
+ width: '100%',
15
+ },
16
+ copy: {
17
+ flex: 1,
18
+ gap: theme.spacing[2],
19
+ },
20
+ eyebrow: {
21
+ ...theme.typography.label,
22
+ color: theme.colors.text.accent,
23
+ },
24
+ title: {
25
+ ...theme.typography.title,
26
+ color: theme.colors.text.primary,
27
+ },
28
+ description: {
29
+ ...theme.typography.body,
30
+ color: theme.colors.text.secondary,
31
+ },
32
+ trailing: {
33
+ alignItems: 'flex-end',
34
+ justifyContent: 'center',
35
+ },
36
+ }));
37
+ //# sourceMappingURL=ScreenHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenHeader.js","sourceRoot":"","sources":["../../src/components/ScreenHeader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAS3D,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAqB;IACvF,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,aACtB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,aACrB,OAAO,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,OAAO,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC/D,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,KAAK,GAAQ,EACxC,WAAW,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,YAAG,WAAW,GAAQ,CAAC,CAAC,CAAC,IAAI,IACtE,EACN,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,YAAG,QAAQ,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC7D,CACR,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3C,UAAU,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,aAAa,EAAE,KAAK;QACpB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrB,cAAc,EAAE,eAAe;QAC/B,KAAK,EAAE,MAAM;KACd;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KACtB;IACD,OAAO,EAAE;QACP,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK;QACzB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;KAChC;IACD,KAAK,EAAE;QACL,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK;QACzB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;KACjC;IACD,WAAW,EAAE;QACX,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI;QACxB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;KACnC;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,UAAU;QACtB,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ import { type SectionGapToken } from '../layout.js';
4
+ export interface SectionProps {
5
+ children: ReactNode;
6
+ title?: string;
7
+ description?: string;
8
+ gap?: SectionGapToken;
9
+ style?: StyleProp<ViewStyle>;
10
+ }
11
+ export declare function Section({ children, title, description, gap, style }: SectionProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=Section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Section.d.ts","sourceRoot":"","sources":["../../src/components/Section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,SAAS,EAA0B,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGxE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAe,EAAE,KAAK,EAAE,EAAE,YAAY,2CAe7F"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { StyleSheet, Text, View } from 'react-native';
3
+ import { getSectionGapStyle } from '../layout.js';
4
+ import { createThemedStyles, useTheme } from '../theme.js';
5
+ export function Section({ children, title, description, gap = 'default', style }) {
6
+ const theme = useTheme();
7
+ const styles = getStyles(theme);
8
+ return (_jsxs(View, { style: [styles.base, getSectionGapStyle(gap, theme), style], children: [title || description ? (_jsxs(View, { style: styles.copy, children: [title ? _jsx(Text, { style: styles.title, children: title }) : null, description ? _jsx(Text, { style: styles.description, children: description }) : null] })) : null, children] }));
9
+ }
10
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
11
+ base: {
12
+ width: '100%',
13
+ },
14
+ copy: {
15
+ gap: theme.spacing[1],
16
+ width: '100%',
17
+ },
18
+ title: {
19
+ ...theme.typography.sectionTitle,
20
+ color: theme.colors.text.primary,
21
+ },
22
+ description: {
23
+ ...theme.typography.body,
24
+ color: theme.colors.text.secondary,
25
+ },
26
+ }));
27
+ //# sourceMappingURL=Section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Section.js","sourceRoot":"","sources":["../../src/components/Section.tsx"],"names":[],"mappings":";AACA,OAAO,EAAa,UAAU,EAAE,IAAI,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAwB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAU3D,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,SAAS,EAAE,KAAK,EAAgB;IAC5F,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,aAC9D,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CACtB,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,aACrB,KAAK,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EACxD,WAAW,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,YAAG,WAAW,GAAQ,CAAC,CAAC,CAAC,IAAI,IACtE,CACR,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,IACJ,CACR,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3C,UAAU,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;KACd;IACD,IAAI,EAAE;QACJ,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrB,KAAK,EAAE,MAAM;KACd;IACD,KAAK,EAAE;QACL,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY;QAChC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;KACjC;IACD,WAAW,EAAE;QACX,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI;QACxB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;KACnC;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { StyleProp, ViewStyle } from 'react-native';
2
+ export interface SegmentOption {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ export interface SegmentedControlProps {
7
+ options: SegmentOption[];
8
+ value: string;
9
+ onValueChange?: (value: string) => void;
10
+ style?: StyleProp<ViewStyle>;
11
+ }
12
+ export declare function SegmentedControl({ options, value, onValueChange, style }: SegmentedControlProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=SegmentedControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../src/components/SegmentedControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAIjF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,qBAAqB,2CAyB/F"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Pressable, StyleSheet, View } from 'react-native';
3
+ import { createThemedStyles, useTheme } from '../theme.js';
4
+ import { Text } from './Text.js';
5
+ export function SegmentedControl({ options, value, onValueChange, style }) {
6
+ const theme = useTheme();
7
+ const styles = getStyles(theme);
8
+ return (_jsx(View, { style: [styles.base, style], children: options.map(option => {
9
+ const selected = option.value === value;
10
+ return (_jsx(Pressable, { accessibilityRole: "button", accessibilityState: { selected }, onPress: () => onValueChange?.(option.value), style: [styles.segment, selected && styles.segmentSelected], children: _jsx(Text, { tone: selected ? 'primary' : 'secondary', variant: "label", children: option.label }) }, option.value));
11
+ }) }));
12
+ }
13
+ const getStyles = createThemedStyles(theme => StyleSheet.create({
14
+ base: {
15
+ backgroundColor: theme.colors.background.subtle,
16
+ borderRadius: theme.radius.full,
17
+ flexDirection: 'row',
18
+ gap: theme.spacing[1],
19
+ padding: theme.spacing[1],
20
+ width: '100%',
21
+ },
22
+ segment: {
23
+ alignItems: 'center',
24
+ borderRadius: theme.radius.full,
25
+ flex: 1,
26
+ justifyContent: 'center',
27
+ minHeight: 40,
28
+ paddingHorizontal: theme.spacing[3],
29
+ paddingVertical: theme.spacing[2],
30
+ },
31
+ segmentSelected: {
32
+ backgroundColor: theme.colors.surface.base,
33
+ borderColor: theme.colors.border.default,
34
+ borderWidth: 1,
35
+ },
36
+ }));
37
+ //# sourceMappingURL=SegmentedControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.js","sourceRoot":"","sources":["../../src/components/SegmentedControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAa,UAAU,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAyB;IAC9F,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;YAExC,OAAO,CACL,KAAC,SAAS,IACR,iBAAiB,EAAC,QAAQ,EAC1B,kBAAkB,EAAE,EAAE,QAAQ,EAAE,EAEhC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,eAAe,CAAC,YAE3D,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,EAAC,OAAO,YAC5D,MAAM,CAAC,KAAK,GACR,IANF,MAAM,CAAC,KAAK,CAOP,CACb,CAAC;QACJ,CAAC,CAAC,GACG,CACR,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC3C,UAAU,CAAC,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM;QAC/C,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;QAC/B,aAAa,EAAE,KAAK;QACpB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACzB,KAAK,EAAE,MAAM;KACd;IACD,OAAO,EAAE;QACP,UAAU,EAAE,QAAQ;QACpB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;QAC/B,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,SAAS,EAAE,EAAE;QACb,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAClC;IACD,eAAe,EAAE;QACf,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;QAC1C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;QACxC,WAAW,EAAE,CAAC;KACf;CACF,CAAC,CACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from 'react';
2
+ import { FlexAlignType, StyleProp, ViewStyle } from 'react-native';
3
+ import { type SpacingToken } from '../tokens.js';
4
+ export interface StackProps {
5
+ children: ReactNode;
6
+ gap?: SpacingToken;
7
+ direction?: 'row' | 'column';
8
+ align?: FlexAlignType;
9
+ justify?: ViewStyle['justifyContent'];
10
+ style?: StyleProp<ViewStyle>;
11
+ }
12
+ export declare function Stack({ children, gap, direction, align, justify, style, }: StackProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=Stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stack.d.ts","sourceRoot":"","sources":["../../src/components/Stack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAErF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,KAAK,CAAC,EACpB,QAAQ,EACR,GAAO,EACP,SAAoB,EACpB,KAAK,EACL,OAAO,EACP,KAAK,GACN,EAAE,UAAU,2CAmBZ"}