@ramonclaudio/create-vexpo 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 (174) hide show
  1. package/README.md +50 -0
  2. package/dist/index.js +183 -0
  3. package/dist/templates/default/.eas/workflows/asc-events.yml +84 -0
  4. package/dist/templates/default/.eas/workflows/deploy-production.yml +129 -0
  5. package/dist/templates/default/.eas/workflows/development-builds.yml +19 -0
  6. package/dist/templates/default/.eas/workflows/e2e-tests.yml +42 -0
  7. package/dist/templates/default/.eas/workflows/pr-preview.yml +98 -0
  8. package/dist/templates/default/.eas/workflows/release.yml +44 -0
  9. package/dist/templates/default/.eas/workflows/rollback.yml +86 -0
  10. package/dist/templates/default/.eas/workflows/rollout.yml +84 -0
  11. package/dist/templates/default/.eas/workflows/rotate-apple-jwt.yml +42 -0
  12. package/dist/templates/default/.eas/workflows/testflight.yml +57 -0
  13. package/dist/templates/default/.github/workflows/check.yml +28 -0
  14. package/dist/templates/default/.maestro/launch.yaml +18 -0
  15. package/dist/templates/default/AGENTS.md +79 -0
  16. package/dist/templates/default/DESIGN.md +331 -0
  17. package/dist/templates/default/LICENSE +21 -0
  18. package/dist/templates/default/README.md +153 -0
  19. package/dist/templates/default/SETUP.md +618 -0
  20. package/dist/templates/default/__tests__/convex/constants.test.ts +49 -0
  21. package/dist/templates/default/__tests__/convex/validators.test.ts +23 -0
  22. package/dist/templates/default/__tests__/convex/webhook.test.ts +343 -0
  23. package/dist/templates/default/__tests__/lib/deep-link.test.ts +67 -0
  24. package/dist/templates/default/_easignore +22 -0
  25. package/dist/templates/default/_editorconfig +9 -0
  26. package/dist/templates/default/_env.example +34 -0
  27. package/dist/templates/default/_fingerprintignore +24 -0
  28. package/dist/templates/default/_gitattributes +7 -0
  29. package/dist/templates/default/_gitignore +69 -0
  30. package/dist/templates/default/_oxfmtrc.json +3 -0
  31. package/dist/templates/default/_oxlintrc.json +34 -0
  32. package/dist/templates/default/app/(app)/(tabs)/(home)/index.tsx +50 -0
  33. package/dist/templates/default/app/(app)/(tabs)/(home,search)/_layout.tsx +44 -0
  34. package/dist/templates/default/app/(app)/(tabs)/(search)/index.tsx +247 -0
  35. package/dist/templates/default/app/(app)/(tabs)/_layout.tsx +77 -0
  36. package/dist/templates/default/app/(app)/(tabs)/settings/_layout.tsx +37 -0
  37. package/dist/templates/default/app/(app)/(tabs)/settings/index.tsx +362 -0
  38. package/dist/templates/default/app/(app)/(tabs)/settings/preferences.tsx +184 -0
  39. package/dist/templates/default/app/(app)/_layout.tsx +73 -0
  40. package/dist/templates/default/app/(app)/debug.tsx +389 -0
  41. package/dist/templates/default/app/(app)/help.tsx +254 -0
  42. package/dist/templates/default/app/(app)/linked.tsx +116 -0
  43. package/dist/templates/default/app/(app)/privacy.tsx +159 -0
  44. package/dist/templates/default/app/(app)/profile.tsx +915 -0
  45. package/dist/templates/default/app/(app)/sessions.tsx +191 -0
  46. package/dist/templates/default/app/(app)/welcome.tsx +140 -0
  47. package/dist/templates/default/app/(auth)/_layout.tsx +31 -0
  48. package/dist/templates/default/app/(auth)/forgot-password.tsx +168 -0
  49. package/dist/templates/default/app/(auth)/reset-password.tsx +314 -0
  50. package/dist/templates/default/app/(auth)/sign-in.tsx +453 -0
  51. package/dist/templates/default/app/(auth)/sign-up.tsx +563 -0
  52. package/dist/templates/default/app/+native-intent.tsx +14 -0
  53. package/dist/templates/default/app/+not-found.tsx +51 -0
  54. package/dist/templates/default/app/_layout.tsx +102 -0
  55. package/dist/templates/default/app-store/screenshots/.gitkeep +0 -0
  56. package/dist/templates/default/app-store/screenshots/README.md +13 -0
  57. package/dist/templates/default/app.config.ts +201 -0
  58. package/dist/templates/default/app.json +11 -0
  59. package/dist/templates/default/assets/brand-icon-dark.png +0 -0
  60. package/dist/templates/default/assets/brand-icon-light.png +0 -0
  61. package/dist/templates/default/assets/fonts/Geist-Black.ttf +0 -0
  62. package/dist/templates/default/assets/fonts/Geist-BlackItalic.ttf +0 -0
  63. package/dist/templates/default/assets/fonts/Geist-Bold.ttf +0 -0
  64. package/dist/templates/default/assets/fonts/Geist-BoldItalic.ttf +0 -0
  65. package/dist/templates/default/assets/fonts/Geist-ExtraBold.ttf +0 -0
  66. package/dist/templates/default/assets/fonts/Geist-ExtraBoldItalic.ttf +0 -0
  67. package/dist/templates/default/assets/fonts/Geist-ExtraLight.ttf +0 -0
  68. package/dist/templates/default/assets/fonts/Geist-ExtraLightItalic.ttf +0 -0
  69. package/dist/templates/default/assets/fonts/Geist-Italic.ttf +0 -0
  70. package/dist/templates/default/assets/fonts/Geist-Light.ttf +0 -0
  71. package/dist/templates/default/assets/fonts/Geist-LightItalic.ttf +0 -0
  72. package/dist/templates/default/assets/fonts/Geist-Medium.ttf +0 -0
  73. package/dist/templates/default/assets/fonts/Geist-MediumItalic.ttf +0 -0
  74. package/dist/templates/default/assets/fonts/Geist-Regular.ttf +0 -0
  75. package/dist/templates/default/assets/fonts/Geist-SemiBold.ttf +0 -0
  76. package/dist/templates/default/assets/fonts/Geist-SemiBoldItalic.ttf +0 -0
  77. package/dist/templates/default/assets/fonts/Geist-Thin.ttf +0 -0
  78. package/dist/templates/default/assets/fonts/Geist-ThinItalic.ttf +0 -0
  79. package/dist/templates/default/assets/fonts/Geist-Variable-Italic.ttf +0 -0
  80. package/dist/templates/default/assets/fonts/Geist-Variable.ttf +0 -0
  81. package/dist/templates/default/assets/fonts/GeistMono-Bold.ttf +0 -0
  82. package/dist/templates/default/assets/fonts/GeistMono-BoldItalic.ttf +0 -0
  83. package/dist/templates/default/assets/fonts/GeistMono-Italic.ttf +0 -0
  84. package/dist/templates/default/assets/fonts/GeistMono-Medium.ttf +0 -0
  85. package/dist/templates/default/assets/fonts/GeistMono-MediumItalic.ttf +0 -0
  86. package/dist/templates/default/assets/fonts/GeistMono-Regular.ttf +0 -0
  87. package/dist/templates/default/assets/fonts/GeistPixel-Square.ttf +0 -0
  88. package/dist/templates/default/assets/icon.png +0 -0
  89. package/dist/templates/default/assets/sounds/notification.wav +0 -0
  90. package/dist/templates/default/assets/splash-image-dark.png +0 -0
  91. package/dist/templates/default/assets/splash-image-light.png +0 -0
  92. package/dist/templates/default/bun.lock +1860 -0
  93. package/dist/templates/default/components/auth/otp-verification.tsx +255 -0
  94. package/dist/templates/default/components/auth/password-field.tsx +121 -0
  95. package/dist/templates/default/components/auth/segmented-toggle.tsx +47 -0
  96. package/dist/templates/default/components/ui/convex-error.tsx +32 -0
  97. package/dist/templates/default/components/ui/error-boundary.tsx +57 -0
  98. package/dist/templates/default/components/ui/loading-screen.tsx +31 -0
  99. package/dist/templates/default/components/ui/material.tsx +94 -0
  100. package/dist/templates/default/components/ui/offline-banner.tsx +58 -0
  101. package/dist/templates/default/components/ui/prominent-button.tsx +71 -0
  102. package/dist/templates/default/components/ui/skeleton.tsx +107 -0
  103. package/dist/templates/default/components/ui/status-text.tsx +49 -0
  104. package/dist/templates/default/components/ui/update-banner.tsx +82 -0
  105. package/dist/templates/default/constants/layout.ts +102 -0
  106. package/dist/templates/default/constants/theme.ts +401 -0
  107. package/dist/templates/default/constants/ui.ts +77 -0
  108. package/dist/templates/default/convex/_generated/api.d.ts +77 -0
  109. package/dist/templates/default/convex/_generated/api.js +23 -0
  110. package/dist/templates/default/convex/_generated/dataModel.d.ts +60 -0
  111. package/dist/templates/default/convex/_generated/server.d.ts +143 -0
  112. package/dist/templates/default/convex/_generated/server.js +93 -0
  113. package/dist/templates/default/convex/admin.ts +102 -0
  114. package/dist/templates/default/convex/auth.config.ts +6 -0
  115. package/dist/templates/default/convex/auth.ts +335 -0
  116. package/dist/templates/default/convex/constants.ts +46 -0
  117. package/dist/templates/default/convex/convex.config.ts +11 -0
  118. package/dist/templates/default/convex/crons.ts +42 -0
  119. package/dist/templates/default/convex/email.ts +109 -0
  120. package/dist/templates/default/convex/env.ts +31 -0
  121. package/dist/templates/default/convex/errors.ts +33 -0
  122. package/dist/templates/default/convex/functions.ts +54 -0
  123. package/dist/templates/default/convex/http.ts +176 -0
  124. package/dist/templates/default/convex/log.ts +81 -0
  125. package/dist/templates/default/convex/pushTokens.ts +114 -0
  126. package/dist/templates/default/convex/rateLimit.ts +92 -0
  127. package/dist/templates/default/convex/schema.ts +28 -0
  128. package/dist/templates/default/convex/tsconfig.json +18 -0
  129. package/dist/templates/default/convex/users.ts +279 -0
  130. package/dist/templates/default/convex/validators.ts +74 -0
  131. package/dist/templates/default/convex/webhook.ts +193 -0
  132. package/dist/templates/default/convex.json +6 -0
  133. package/dist/templates/default/eas.json +56 -0
  134. package/dist/templates/default/fingerprint.config.js +9 -0
  135. package/dist/templates/default/hooks/use-debounce.ts +20 -0
  136. package/dist/templates/default/hooks/use-deep-link.ts +43 -0
  137. package/dist/templates/default/hooks/use-navigation-tracking.ts +15 -0
  138. package/dist/templates/default/hooks/use-network.ts +11 -0
  139. package/dist/templates/default/hooks/use-notifications.ts +107 -0
  140. package/dist/templates/default/hooks/use-onboarding.ts +15 -0
  141. package/dist/templates/default/hooks/use-reduced-motion.ts +11 -0
  142. package/dist/templates/default/hooks/use-theme.ts +53 -0
  143. package/dist/templates/default/hooks/use-updates.ts +86 -0
  144. package/dist/templates/default/lib/a11y.ts +5 -0
  145. package/dist/templates/default/lib/app.ts +14 -0
  146. package/dist/templates/default/lib/assets.ts +17 -0
  147. package/dist/templates/default/lib/auth-client.ts +21 -0
  148. package/dist/templates/default/lib/convex-auth.tsx +79 -0
  149. package/dist/templates/default/lib/deep-link.ts +71 -0
  150. package/dist/templates/default/lib/dev-menu.ts +119 -0
  151. package/dist/templates/default/lib/device.ts +40 -0
  152. package/dist/templates/default/lib/dynamic-font.ts +49 -0
  153. package/dist/templates/default/lib/env.ts +10 -0
  154. package/dist/templates/default/lib/haptics.ts +24 -0
  155. package/dist/templates/default/lib/notifications.ts +276 -0
  156. package/dist/templates/default/lib/preferences.ts +45 -0
  157. package/dist/templates/default/lib/schemas.ts +137 -0
  158. package/dist/templates/default/lib/storage.ts +47 -0
  159. package/dist/templates/default/lib/updates.ts +107 -0
  160. package/dist/templates/default/metro.config.js +14 -0
  161. package/dist/templates/default/package.json +129 -0
  162. package/dist/templates/default/patches/PR-368.patch +91 -0
  163. package/dist/templates/default/patches/convex-dev-better-auth-0.12.2.tgz +0 -0
  164. package/dist/templates/default/plugins/README.md +9 -0
  165. package/dist/templates/default/plugins/with-auto-signing.js +45 -0
  166. package/dist/templates/default/plugins/with-pod-deployment-target.js +35 -0
  167. package/dist/templates/default/scripts/README.md +36 -0
  168. package/dist/templates/default/scripts/_run.mjs +77 -0
  169. package/dist/templates/default/scripts/clean.ts +543 -0
  170. package/dist/templates/default/scripts/rotate-apple-jwt.mjs +80 -0
  171. package/dist/templates/default/store.config.json +58 -0
  172. package/dist/templates/default/tsconfig.json +13 -0
  173. package/dist/templates/default/vitest.config.ts +21 -0
  174. package/package.json +69 -0
@@ -0,0 +1,401 @@
1
+ import { DefaultTheme as RNDefaultTheme } from "expo-router";
2
+ import type { Theme as RNTheme } from "expo-router/react-navigation";
3
+ import { DynamicColorIOS } from "react-native";
4
+
5
+ import { FontFamily } from "@/constants/layout";
6
+
7
+ // `DynamicColorIOS` returns an `OpaqueColorValue`. React Native's StyleSheet
8
+ // processor resolves it natively, but several @expo/ui props and our own
9
+ // `as string` call-sites expect a string. The runtime payload behaves like
10
+ // any other ColorValue for RN, so we cast at the boundary instead of
11
+ // littering every call-site with `as unknown as string`.
12
+
13
+ // Shadcn `b1VlJDbW` preset (luma + neutral + Geist + Hugeicons + radius default).
14
+ // Source: shadcn-ui/ui apps/v4/registry/themes.ts, "neutral" entry.
15
+ // OKLCH values converted to sRGB hex via the standard Björn Ottosson matrix.
16
+ // Each token carries a light + dark variant plus a high-contrast pair for the
17
+ // iOS Increase Contrast accessibility setting (HIG: "If you define a custom
18
+ // color, make sure to supply light and dark variants, and an increased
19
+ // contrast option for each variant.").
20
+ type Tone = {
21
+ light: string;
22
+ dark: string;
23
+ highContrastLight: string;
24
+ highContrastDark: string;
25
+ };
26
+
27
+ const tone = (t: Tone): string => DynamicColorIOS(t) as unknown as string;
28
+
29
+ // Shadcn neutral palette in hex. Indexed by Tailwind v4 neutral step.
30
+ const NEUTRAL = {
31
+ white: "#FFFFFF",
32
+ black: "#000000",
33
+ n50: "#FAFAFA", // oklch(0.985)
34
+ n100: "#F5F5F5", // oklch(0.97)
35
+ n150: "#EBEBEB", // contrast bump for n100
36
+ n200: "#E5E5E5", // oklch(0.922)
37
+ n300: "#D4D4D4", // oklch(0.87)
38
+ n400: "#A1A1A1", // oklch(0.708)
39
+ n500: "#737373", // oklch(0.556)
40
+ n600: "#525252", // oklch(0.439)
41
+ n700: "#404040", // oklch(0.371)
42
+ n800: "#262626", // oklch(0.269)
43
+ n850: "#1C1C1C", // contrast bump for n900 in dark mode
44
+ n900: "#171717", // oklch(0.205)
45
+ n950: "#0A0A0A", // oklch(0.145)
46
+ } as const;
47
+
48
+ const DESTRUCTIVE = {
49
+ light: "#E7000B", // oklch(0.577 0.245 27.325)
50
+ dark: "#FF6467", // oklch(0.704 0.191 22.216)
51
+ hcLight: "#B30009",
52
+ hcDark: "#FFA0A2",
53
+ } as const;
54
+
55
+ // shadcn dark `border` is `oklch(1 0 0 / 10%)`, `input` is `15%`. These need
56
+ // the alpha to hover over translucent layers. iOS DynamicColorIOS accepts
57
+ // 8-digit hex, so we encode RGBA inline.
58
+ const ALPHA_DARK = {
59
+ border: "#FFFFFF1A", // 10%
60
+ borderHC: "#FFFFFF40", // ~25% bump for high contrast
61
+ input: "#FFFFFF26", // 15%
62
+ inputHC: "#FFFFFF59", // ~35% bump
63
+ } as const;
64
+
65
+ const t = {
66
+ background: tone({
67
+ light: NEUTRAL.white,
68
+ dark: NEUTRAL.n950,
69
+ highContrastLight: NEUTRAL.white,
70
+ highContrastDark: NEUTRAL.black,
71
+ }),
72
+ foreground: tone({
73
+ light: NEUTRAL.n950,
74
+ dark: NEUTRAL.n50,
75
+ highContrastLight: NEUTRAL.black,
76
+ highContrastDark: NEUTRAL.white,
77
+ }),
78
+ card: tone({
79
+ light: NEUTRAL.white,
80
+ dark: NEUTRAL.n900,
81
+ highContrastLight: NEUTRAL.white,
82
+ highContrastDark: NEUTRAL.n850,
83
+ }),
84
+ cardForeground: tone({
85
+ light: NEUTRAL.n950,
86
+ dark: NEUTRAL.n50,
87
+ highContrastLight: NEUTRAL.black,
88
+ highContrastDark: NEUTRAL.white,
89
+ }),
90
+ popover: tone({
91
+ light: NEUTRAL.white,
92
+ dark: NEUTRAL.n900,
93
+ highContrastLight: NEUTRAL.white,
94
+ highContrastDark: NEUTRAL.n850,
95
+ }),
96
+ popoverForeground: tone({
97
+ light: NEUTRAL.n950,
98
+ dark: NEUTRAL.n50,
99
+ highContrastLight: NEUTRAL.black,
100
+ highContrastDark: NEUTRAL.white,
101
+ }),
102
+ primary: tone({
103
+ light: NEUTRAL.n900,
104
+ dark: NEUTRAL.n200,
105
+ highContrastLight: NEUTRAL.black,
106
+ highContrastDark: NEUTRAL.white,
107
+ }),
108
+ primaryForeground: tone({
109
+ light: NEUTRAL.n50,
110
+ dark: NEUTRAL.n900,
111
+ highContrastLight: NEUTRAL.white,
112
+ highContrastDark: NEUTRAL.black,
113
+ }),
114
+ secondary: tone({
115
+ light: NEUTRAL.n100,
116
+ dark: NEUTRAL.n800,
117
+ highContrastLight: NEUTRAL.n150,
118
+ highContrastDark: NEUTRAL.n850,
119
+ }),
120
+ secondaryForeground: tone({
121
+ light: NEUTRAL.n900,
122
+ dark: NEUTRAL.n50,
123
+ highContrastLight: NEUTRAL.black,
124
+ highContrastDark: NEUTRAL.white,
125
+ }),
126
+ muted: tone({
127
+ light: NEUTRAL.n100,
128
+ dark: NEUTRAL.n800,
129
+ highContrastLight: NEUTRAL.n150,
130
+ highContrastDark: NEUTRAL.n850,
131
+ }),
132
+ mutedForeground: tone({
133
+ light: NEUTRAL.n500,
134
+ dark: NEUTRAL.n400,
135
+ highContrastLight: NEUTRAL.n600,
136
+ highContrastDark: NEUTRAL.n300,
137
+ }),
138
+ accent: tone({
139
+ light: NEUTRAL.n100,
140
+ dark: NEUTRAL.n800,
141
+ highContrastLight: NEUTRAL.n150,
142
+ highContrastDark: NEUTRAL.n850,
143
+ }),
144
+ accentForeground: tone({
145
+ light: NEUTRAL.n900,
146
+ dark: NEUTRAL.n50,
147
+ highContrastLight: NEUTRAL.black,
148
+ highContrastDark: NEUTRAL.white,
149
+ }),
150
+ destructive: tone({
151
+ light: DESTRUCTIVE.light,
152
+ dark: DESTRUCTIVE.dark,
153
+ highContrastLight: DESTRUCTIVE.hcLight,
154
+ highContrastDark: DESTRUCTIVE.hcDark,
155
+ }),
156
+ border: tone({
157
+ light: NEUTRAL.n200,
158
+ dark: ALPHA_DARK.border,
159
+ highContrastLight: NEUTRAL.n400,
160
+ highContrastDark: ALPHA_DARK.borderHC,
161
+ }),
162
+ input: tone({
163
+ light: NEUTRAL.n200,
164
+ dark: ALPHA_DARK.input,
165
+ highContrastLight: NEUTRAL.n400,
166
+ highContrastDark: ALPHA_DARK.inputHC,
167
+ }),
168
+ ring: tone({
169
+ light: NEUTRAL.n400,
170
+ dark: NEUTRAL.n500,
171
+ highContrastLight: NEUTRAL.n500,
172
+ highContrastDark: NEUTRAL.n400,
173
+ }),
174
+
175
+ chart1: tone({
176
+ light: NEUTRAL.n300,
177
+ dark: NEUTRAL.n300,
178
+ highContrastLight: NEUTRAL.n400,
179
+ highContrastDark: NEUTRAL.n200,
180
+ }),
181
+ chart2: tone({
182
+ light: NEUTRAL.n500,
183
+ dark: NEUTRAL.n500,
184
+ highContrastLight: NEUTRAL.n600,
185
+ highContrastDark: NEUTRAL.n400,
186
+ }),
187
+ chart3: tone({
188
+ light: NEUTRAL.n600,
189
+ dark: NEUTRAL.n600,
190
+ highContrastLight: NEUTRAL.n700,
191
+ highContrastDark: NEUTRAL.n500,
192
+ }),
193
+ chart4: tone({
194
+ light: NEUTRAL.n700,
195
+ dark: NEUTRAL.n700,
196
+ highContrastLight: NEUTRAL.n800,
197
+ highContrastDark: NEUTRAL.n600,
198
+ }),
199
+ chart5: tone({
200
+ light: NEUTRAL.n800,
201
+ dark: NEUTRAL.n800,
202
+ highContrastLight: NEUTRAL.n900,
203
+ highContrastDark: NEUTRAL.n700,
204
+ }),
205
+
206
+ sidebar: tone({
207
+ light: NEUTRAL.n50,
208
+ dark: NEUTRAL.n900,
209
+ highContrastLight: NEUTRAL.white,
210
+ highContrastDark: NEUTRAL.n850,
211
+ }),
212
+ sidebarForeground: tone({
213
+ light: NEUTRAL.n950,
214
+ dark: NEUTRAL.n50,
215
+ highContrastLight: NEUTRAL.black,
216
+ highContrastDark: NEUTRAL.white,
217
+ }),
218
+ sidebarPrimary: tone({
219
+ light: NEUTRAL.n900,
220
+ dark: "#1447E6", // oklch(0.488 0.243 264.376), shadcn dark sidebar accent
221
+ highContrastLight: NEUTRAL.black,
222
+ highContrastDark: "#3D6FFA",
223
+ }),
224
+ sidebarPrimaryForeground: tone({
225
+ light: NEUTRAL.n50,
226
+ dark: NEUTRAL.n50,
227
+ highContrastLight: NEUTRAL.white,
228
+ highContrastDark: NEUTRAL.white,
229
+ }),
230
+ sidebarAccent: tone({
231
+ light: NEUTRAL.n100,
232
+ dark: NEUTRAL.n800,
233
+ highContrastLight: NEUTRAL.n150,
234
+ highContrastDark: NEUTRAL.n850,
235
+ }),
236
+ sidebarAccentForeground: tone({
237
+ light: NEUTRAL.n900,
238
+ dark: NEUTRAL.n50,
239
+ highContrastLight: NEUTRAL.black,
240
+ highContrastDark: NEUTRAL.white,
241
+ }),
242
+ sidebarBorder: tone({
243
+ light: NEUTRAL.n200,
244
+ dark: ALPHA_DARK.border,
245
+ highContrastLight: NEUTRAL.n400,
246
+ highContrastDark: ALPHA_DARK.borderHC,
247
+ }),
248
+ sidebarRing: tone({
249
+ light: NEUTRAL.n400,
250
+ dark: NEUTRAL.n500,
251
+ highContrastLight: NEUTRAL.n500,
252
+ highContrastDark: NEUTRAL.n400,
253
+ }),
254
+
255
+ // Translucent fills. Same hue as primary, layered for surface tinting,
256
+ // press states, focus glows.
257
+ primaryFill: tone({
258
+ light: "rgba(23,23,23,0.06)",
259
+ dark: "rgba(229,229,229,0.10)",
260
+ highContrastLight: "rgba(0,0,0,0.10)",
261
+ highContrastDark: "rgba(255,255,255,0.18)",
262
+ }),
263
+ primaryFillEmphasized: tone({
264
+ light: "rgba(23,23,23,0.12)",
265
+ dark: "rgba(229,229,229,0.18)",
266
+ highContrastLight: "rgba(0,0,0,0.20)",
267
+ highContrastDark: "rgba(255,255,255,0.30)",
268
+ }),
269
+ destructiveFill: tone({
270
+ light: "rgba(231,0,11,0.10)",
271
+ dark: "rgba(255,100,103,0.15)",
272
+ highContrastLight: "rgba(179,0,9,0.18)",
273
+ highContrastDark: "rgba(255,160,162,0.25)",
274
+ }),
275
+ destructiveBorder: tone({
276
+ light: "rgba(231,0,11,0.30)",
277
+ dark: "rgba(255,100,103,0.35)",
278
+ highContrastLight: "rgba(179,0,9,0.55)",
279
+ highContrastDark: "rgba(255,160,162,0.55)",
280
+ }),
281
+ shadow: tone({
282
+ light: "rgba(0,0,0,0.06)",
283
+ dark: "rgba(0,0,0,0.40)",
284
+ highContrastLight: "rgba(0,0,0,0.14)",
285
+ highContrastDark: "rgba(0,0,0,0.60)",
286
+ }),
287
+ overlay: tone({
288
+ light: "rgba(0,0,0,0.40)",
289
+ dark: "rgba(0,0,0,0.60)",
290
+ highContrastLight: "rgba(0,0,0,0.55)",
291
+ highContrastDark: "rgba(0,0,0,0.75)",
292
+ }),
293
+ } as const;
294
+
295
+ // Shadcn neutral tokens plus the handful of aliases the app actually
296
+ // references. Add an entry here the first time you need it. don't ship
297
+ // dead palette rows.
298
+ export const Colors = {
299
+ ...t,
300
+
301
+ // Separator is a fork of the border token so navigation chrome can swap
302
+ // it independently without touching shadcn `border`.
303
+ separator: t.border,
304
+
305
+ // Tab bar inactive/active states. Mapped to muted-foreground / primary
306
+ // so the bar reads as part of the navigation chrome.
307
+ tabIconDefault: t.mutedForeground,
308
+ tabIconSelected: t.primary,
309
+
310
+ // Tertiary label (third-rank caption text) sits between muted and
311
+ // background. too faint for body copy, dark enough to read.
312
+ tertiaryLabel: tone({
313
+ light: NEUTRAL.n400,
314
+ dark: NEUTRAL.n500,
315
+ highContrastLight: NEUTRAL.n500,
316
+ highContrastDark: NEUTRAL.n400,
317
+ }),
318
+
319
+ // Inverse of destructive (white text on destructive fill).
320
+ destructiveForeground: tone({
321
+ light: NEUTRAL.white,
322
+ dark: NEUTRAL.n900,
323
+ highContrastLight: NEUTRAL.white,
324
+ highContrastDark: NEUTRAL.black,
325
+ }),
326
+
327
+ // Status green for "available" / "completed" markers (HIG-aligned, not
328
+ // shadcn. shadcn doesn't define a success token).
329
+ success: tone({
330
+ light: "#16A34A",
331
+ dark: "#22C55E",
332
+ highContrastLight: "#15803D",
333
+ highContrastDark: "#4ADE80",
334
+ }),
335
+ } as const;
336
+
337
+ export const HeaderTint = Colors.foreground;
338
+
339
+ export type ColorPalette = typeof Colors;
340
+
341
+ // React Navigation `Theme` consumers (NavigationThemeProvider, header tint,
342
+ // back chevron, screen background) read flat color strings, not
343
+ // DynamicColorIOS values. We export one theme per appearance and pick at
344
+ // the root layout based on `useColorScheme()` so every nav-rendered surface
345
+ // (back chevron, badge, header text) tracks the shadcn neutral palette
346
+ // instead of iOS systemBlue and the React Navigation defaults.
347
+ export const NavigationLight: RNTheme = {
348
+ dark: false,
349
+ colors: {
350
+ primary: NEUTRAL.n900,
351
+ background: NEUTRAL.white,
352
+ card: NEUTRAL.white,
353
+ text: NEUTRAL.n950,
354
+ border: NEUTRAL.n200,
355
+ notification: DESTRUCTIVE.light,
356
+ },
357
+ fonts: RNDefaultTheme.fonts,
358
+ };
359
+
360
+ export const NavigationDark: RNTheme = {
361
+ dark: true,
362
+ colors: {
363
+ primary: NEUTRAL.n200,
364
+ background: NEUTRAL.n950,
365
+ card: NEUTRAL.n900,
366
+ text: NEUTRAL.n50,
367
+ border: ALPHA_DARK.border,
368
+ notification: DESTRUCTIVE.dark,
369
+ },
370
+ fonts: RNDefaultTheme.fonts,
371
+ };
372
+
373
+ // shadcn radius scale, --radius = 0.625rem = 10px.
374
+ // sm = radius * 0.6 = 6
375
+ // md = radius * 0.8 = 8
376
+ // lg = radius * 1.0 = 10 (shadcn default)
377
+ // xl = radius * 1.4 = 14
378
+ // 2xl = radius * 1.8 = 18
379
+ // 3xl = radius * 2.2 = 22
380
+ // 4xl = radius * 2.6 = 26
381
+ const RADIUS_BASE = 10;
382
+ export const Radius = {
383
+ none: 0,
384
+ sm: Math.round(RADIUS_BASE * 0.6),
385
+ md: Math.round(RADIUS_BASE * 0.8),
386
+ DEFAULT: RADIUS_BASE,
387
+ lg: RADIUS_BASE,
388
+ xl: Math.round(RADIUS_BASE * 1.4),
389
+ "2xl": Math.round(RADIUS_BASE * 1.8),
390
+ "3xl": Math.round(RADIUS_BASE * 2.2),
391
+ "4xl": Math.round(RADIUS_BASE * 2.6),
392
+ full: 9999,
393
+ } as const;
394
+
395
+ export const Typography = {
396
+ default: { fontSize: 16, lineHeight: 24, fontFamily: FontFamily.regular },
397
+ defaultSemiBold: { fontSize: 16, lineHeight: 24, fontFamily: FontFamily.semiBold },
398
+ title: { fontSize: 30, lineHeight: 38, fontFamily: FontFamily.bold, letterSpacing: -0.5 },
399
+ subtitle: { fontSize: 20, lineHeight: 26, fontFamily: FontFamily.semiBold },
400
+ link: { fontSize: 16, lineHeight: 24, fontFamily: FontFamily.regular },
401
+ };
@@ -0,0 +1,77 @@
1
+ export const Opacity = {
2
+ pressed: 0.7,
3
+ active: 0.8,
4
+ disabled: 0.5,
5
+ muted: 0.6,
6
+ } as const;
7
+
8
+ export const Material = {
9
+ ultraThin: 20,
10
+ thin: 40,
11
+ regular: 60,
12
+ thick: 80,
13
+ ultraThick: 95,
14
+ bar: 50,
15
+ } as const;
16
+
17
+ export type MaterialLevel = keyof typeof Material;
18
+
19
+ export const Shadow = {
20
+ sm: "0 1px 2px",
21
+ md: "0 2px 4px",
22
+ lg: "0 4px 8px",
23
+ } as const;
24
+
25
+ export const ZIndex = {
26
+ base: 0,
27
+ statusBar: 1,
28
+ dropdown: 10,
29
+ modal: 100,
30
+ toast: 500,
31
+ updateBanner: 999,
32
+ offlineBanner: 1000,
33
+ } as const;
34
+
35
+ export const Duration = {
36
+ instant: 0,
37
+ fast: 150,
38
+ normal: 200,
39
+ slow: 300,
40
+ splash: 1000,
41
+ } as const;
42
+
43
+ export const Size = {
44
+ checkbox: 24,
45
+ iconContainer: 40,
46
+ iconContainerSm: 32,
47
+ divider: 0.5,
48
+ dividerThick: 1,
49
+ dividerMargin: 50,
50
+ dragHandle: { width: 36, height: 5, radius: 3 },
51
+ badge: 32,
52
+ } as const;
53
+
54
+ export const Responsive = {
55
+ header: {
56
+ minHeight: 200,
57
+ maxHeight: 300,
58
+ screenRatio: 0.25,
59
+ },
60
+ avatar: {
61
+ phone: 100,
62
+ tablet: 110,
63
+ desktop: 120,
64
+ },
65
+ } as const;
66
+
67
+ export const Keyboard = {
68
+ verticalOffset: 100,
69
+ } as const;
70
+
71
+ export const Accessibility = {
72
+ maxFontSizeMultiplier: 2,
73
+ } as const;
74
+
75
+ export const EmptyState = {
76
+ paddingVertical: 60,
77
+ } as const;
@@ -0,0 +1,77 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * Generated `api` utility.
4
+ *
5
+ * THIS CODE IS AUTOMATICALLY GENERATED.
6
+ *
7
+ * To regenerate, run `npx convex dev`.
8
+ * @module
9
+ */
10
+
11
+ import type * as admin from "../admin.js";
12
+ import type * as auth from "../auth.js";
13
+ import type * as constants from "../constants.js";
14
+ import type * as crons from "../crons.js";
15
+ import type * as email from "../email.js";
16
+ import type * as env from "../env.js";
17
+ import type * as errors from "../errors.js";
18
+ import type * as functions from "../functions.js";
19
+ import type * as http from "../http.js";
20
+ import type * as pushTokens from "../pushTokens.js";
21
+ import type * as rateLimit from "../rateLimit.js";
22
+ import type * as users from "../users.js";
23
+ import type * as validators from "../validators.js";
24
+
25
+ import type {
26
+ ApiFromModules,
27
+ FilterApi,
28
+ FunctionReference,
29
+ } from "convex/server";
30
+
31
+ declare const fullApi: ApiFromModules<{
32
+ admin: typeof admin;
33
+ auth: typeof auth;
34
+ constants: typeof constants;
35
+ crons: typeof crons;
36
+ email: typeof email;
37
+ env: typeof env;
38
+ errors: typeof errors;
39
+ functions: typeof functions;
40
+ http: typeof http;
41
+ pushTokens: typeof pushTokens;
42
+ rateLimit: typeof rateLimit;
43
+ users: typeof users;
44
+ validators: typeof validators;
45
+ }>;
46
+
47
+ /**
48
+ * A utility for referencing Convex functions in your app's public API.
49
+ *
50
+ * Usage:
51
+ * ```js
52
+ * const myFunctionReference = api.myModule.myFunction;
53
+ * ```
54
+ */
55
+ export declare const api: FilterApi<
56
+ typeof fullApi,
57
+ FunctionReference<any, "public">
58
+ >;
59
+
60
+ /**
61
+ * A utility for referencing Convex functions in your app's internal API.
62
+ *
63
+ * Usage:
64
+ * ```js
65
+ * const myFunctionReference = internal.myModule.myFunction;
66
+ * ```
67
+ */
68
+ export declare const internal: FilterApi<
69
+ typeof fullApi,
70
+ FunctionReference<any, "internal">
71
+ >;
72
+
73
+ export declare const components: {
74
+ betterAuth: import("@convex-dev/better-auth/_generated/component.js").ComponentApi<"betterAuth">;
75
+ resend: import("@convex-dev/resend/_generated/component.js").ComponentApi<"resend">;
76
+ rateLimiter: import("@convex-dev/rate-limiter/_generated/component.js").ComponentApi<"rateLimiter">;
77
+ };
@@ -0,0 +1,23 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * Generated `api` utility.
4
+ *
5
+ * THIS CODE IS AUTOMATICALLY GENERATED.
6
+ *
7
+ * To regenerate, run `npx convex dev`.
8
+ * @module
9
+ */
10
+
11
+ import { anyApi, componentsGeneric } from "convex/server";
12
+
13
+ /**
14
+ * A utility for referencing Convex functions in your app's API.
15
+ *
16
+ * Usage:
17
+ * ```js
18
+ * const myFunctionReference = api.myModule.myFunction;
19
+ * ```
20
+ */
21
+ export const api = anyApi;
22
+ export const internal = anyApi;
23
+ export const components = componentsGeneric();
@@ -0,0 +1,60 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * Generated data model types.
4
+ *
5
+ * THIS CODE IS AUTOMATICALLY GENERATED.
6
+ *
7
+ * To regenerate, run `npx convex dev`.
8
+ * @module
9
+ */
10
+
11
+ import type {
12
+ DataModelFromSchemaDefinition,
13
+ DocumentByName,
14
+ TableNamesInDataModel,
15
+ SystemTableNames,
16
+ } from "convex/server";
17
+ import type { GenericId } from "convex/values";
18
+ import schema from "../schema.js";
19
+
20
+ /**
21
+ * The names of all of your Convex tables.
22
+ */
23
+ export type TableNames = TableNamesInDataModel<DataModel>;
24
+
25
+ /**
26
+ * The type of a document stored in Convex.
27
+ *
28
+ * @typeParam TableName - A string literal type of the table name (like "users").
29
+ */
30
+ export type Doc<TableName extends TableNames> = DocumentByName<
31
+ DataModel,
32
+ TableName
33
+ >;
34
+
35
+ /**
36
+ * An identifier for a document in Convex.
37
+ *
38
+ * Convex documents are uniquely identified by their `Id`, which is accessible
39
+ * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids).
40
+ *
41
+ * Documents can be loaded using `db.get(tableName, id)` in query and mutation functions.
42
+ *
43
+ * IDs are just strings at runtime, but this type can be used to distinguish them from other
44
+ * strings when type checking.
45
+ *
46
+ * @typeParam TableName - A string literal type of the table name (like "users").
47
+ */
48
+ export type Id<TableName extends TableNames | SystemTableNames> =
49
+ GenericId<TableName>;
50
+
51
+ /**
52
+ * A type describing your Convex data model.
53
+ *
54
+ * This type includes information about what tables you have, the type of
55
+ * documents stored in those tables, and the indexes defined on them.
56
+ *
57
+ * This type is used to parameterize methods like `queryGeneric` and
58
+ * `mutationGeneric` to make them type-safe.
59
+ */
60
+ export type DataModel = DataModelFromSchemaDefinition<typeof schema>;