@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.
- package/README.md +50 -0
- package/dist/index.js +183 -0
- package/dist/templates/default/.eas/workflows/asc-events.yml +84 -0
- package/dist/templates/default/.eas/workflows/deploy-production.yml +129 -0
- package/dist/templates/default/.eas/workflows/development-builds.yml +19 -0
- package/dist/templates/default/.eas/workflows/e2e-tests.yml +42 -0
- package/dist/templates/default/.eas/workflows/pr-preview.yml +98 -0
- package/dist/templates/default/.eas/workflows/release.yml +44 -0
- package/dist/templates/default/.eas/workflows/rollback.yml +86 -0
- package/dist/templates/default/.eas/workflows/rollout.yml +84 -0
- package/dist/templates/default/.eas/workflows/rotate-apple-jwt.yml +42 -0
- package/dist/templates/default/.eas/workflows/testflight.yml +57 -0
- package/dist/templates/default/.github/workflows/check.yml +28 -0
- package/dist/templates/default/.maestro/launch.yaml +18 -0
- package/dist/templates/default/AGENTS.md +79 -0
- package/dist/templates/default/DESIGN.md +331 -0
- package/dist/templates/default/LICENSE +21 -0
- package/dist/templates/default/README.md +153 -0
- package/dist/templates/default/SETUP.md +618 -0
- package/dist/templates/default/__tests__/convex/constants.test.ts +49 -0
- package/dist/templates/default/__tests__/convex/validators.test.ts +23 -0
- package/dist/templates/default/__tests__/convex/webhook.test.ts +343 -0
- package/dist/templates/default/__tests__/lib/deep-link.test.ts +67 -0
- package/dist/templates/default/_easignore +22 -0
- package/dist/templates/default/_editorconfig +9 -0
- package/dist/templates/default/_env.example +34 -0
- package/dist/templates/default/_fingerprintignore +24 -0
- package/dist/templates/default/_gitattributes +7 -0
- package/dist/templates/default/_gitignore +69 -0
- package/dist/templates/default/_oxfmtrc.json +3 -0
- package/dist/templates/default/_oxlintrc.json +34 -0
- package/dist/templates/default/app/(app)/(tabs)/(home)/index.tsx +50 -0
- package/dist/templates/default/app/(app)/(tabs)/(home,search)/_layout.tsx +44 -0
- package/dist/templates/default/app/(app)/(tabs)/(search)/index.tsx +247 -0
- package/dist/templates/default/app/(app)/(tabs)/_layout.tsx +77 -0
- package/dist/templates/default/app/(app)/(tabs)/settings/_layout.tsx +37 -0
- package/dist/templates/default/app/(app)/(tabs)/settings/index.tsx +362 -0
- package/dist/templates/default/app/(app)/(tabs)/settings/preferences.tsx +184 -0
- package/dist/templates/default/app/(app)/_layout.tsx +73 -0
- package/dist/templates/default/app/(app)/debug.tsx +389 -0
- package/dist/templates/default/app/(app)/help.tsx +254 -0
- package/dist/templates/default/app/(app)/linked.tsx +116 -0
- package/dist/templates/default/app/(app)/privacy.tsx +159 -0
- package/dist/templates/default/app/(app)/profile.tsx +915 -0
- package/dist/templates/default/app/(app)/sessions.tsx +191 -0
- package/dist/templates/default/app/(app)/welcome.tsx +140 -0
- package/dist/templates/default/app/(auth)/_layout.tsx +31 -0
- package/dist/templates/default/app/(auth)/forgot-password.tsx +168 -0
- package/dist/templates/default/app/(auth)/reset-password.tsx +314 -0
- package/dist/templates/default/app/(auth)/sign-in.tsx +453 -0
- package/dist/templates/default/app/(auth)/sign-up.tsx +563 -0
- package/dist/templates/default/app/+native-intent.tsx +14 -0
- package/dist/templates/default/app/+not-found.tsx +51 -0
- package/dist/templates/default/app/_layout.tsx +102 -0
- package/dist/templates/default/app-store/screenshots/.gitkeep +0 -0
- package/dist/templates/default/app-store/screenshots/README.md +13 -0
- package/dist/templates/default/app.config.ts +201 -0
- package/dist/templates/default/app.json +11 -0
- package/dist/templates/default/assets/brand-icon-dark.png +0 -0
- package/dist/templates/default/assets/brand-icon-light.png +0 -0
- package/dist/templates/default/assets/fonts/Geist-Black.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-BlackItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Bold.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-BoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraBold.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraBoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraLight.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ExtraLightItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Italic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Light.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-LightItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Medium.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-MediumItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Regular.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-SemiBold.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-SemiBoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Thin.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-ThinItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Variable-Italic.ttf +0 -0
- package/dist/templates/default/assets/fonts/Geist-Variable.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Bold.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-BoldItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Italic.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Medium.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-MediumItalic.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistMono-Regular.ttf +0 -0
- package/dist/templates/default/assets/fonts/GeistPixel-Square.ttf +0 -0
- package/dist/templates/default/assets/icon.png +0 -0
- package/dist/templates/default/assets/sounds/notification.wav +0 -0
- package/dist/templates/default/assets/splash-image-dark.png +0 -0
- package/dist/templates/default/assets/splash-image-light.png +0 -0
- package/dist/templates/default/bun.lock +1860 -0
- package/dist/templates/default/components/auth/otp-verification.tsx +255 -0
- package/dist/templates/default/components/auth/password-field.tsx +121 -0
- package/dist/templates/default/components/auth/segmented-toggle.tsx +47 -0
- package/dist/templates/default/components/ui/convex-error.tsx +32 -0
- package/dist/templates/default/components/ui/error-boundary.tsx +57 -0
- package/dist/templates/default/components/ui/loading-screen.tsx +31 -0
- package/dist/templates/default/components/ui/material.tsx +94 -0
- package/dist/templates/default/components/ui/offline-banner.tsx +58 -0
- package/dist/templates/default/components/ui/prominent-button.tsx +71 -0
- package/dist/templates/default/components/ui/skeleton.tsx +107 -0
- package/dist/templates/default/components/ui/status-text.tsx +49 -0
- package/dist/templates/default/components/ui/update-banner.tsx +82 -0
- package/dist/templates/default/constants/layout.ts +102 -0
- package/dist/templates/default/constants/theme.ts +401 -0
- package/dist/templates/default/constants/ui.ts +77 -0
- package/dist/templates/default/convex/_generated/api.d.ts +77 -0
- package/dist/templates/default/convex/_generated/api.js +23 -0
- package/dist/templates/default/convex/_generated/dataModel.d.ts +60 -0
- package/dist/templates/default/convex/_generated/server.d.ts +143 -0
- package/dist/templates/default/convex/_generated/server.js +93 -0
- package/dist/templates/default/convex/admin.ts +102 -0
- package/dist/templates/default/convex/auth.config.ts +6 -0
- package/dist/templates/default/convex/auth.ts +335 -0
- package/dist/templates/default/convex/constants.ts +46 -0
- package/dist/templates/default/convex/convex.config.ts +11 -0
- package/dist/templates/default/convex/crons.ts +42 -0
- package/dist/templates/default/convex/email.ts +109 -0
- package/dist/templates/default/convex/env.ts +31 -0
- package/dist/templates/default/convex/errors.ts +33 -0
- package/dist/templates/default/convex/functions.ts +54 -0
- package/dist/templates/default/convex/http.ts +176 -0
- package/dist/templates/default/convex/log.ts +81 -0
- package/dist/templates/default/convex/pushTokens.ts +114 -0
- package/dist/templates/default/convex/rateLimit.ts +92 -0
- package/dist/templates/default/convex/schema.ts +28 -0
- package/dist/templates/default/convex/tsconfig.json +18 -0
- package/dist/templates/default/convex/users.ts +279 -0
- package/dist/templates/default/convex/validators.ts +74 -0
- package/dist/templates/default/convex/webhook.ts +193 -0
- package/dist/templates/default/convex.json +6 -0
- package/dist/templates/default/eas.json +56 -0
- package/dist/templates/default/fingerprint.config.js +9 -0
- package/dist/templates/default/hooks/use-debounce.ts +20 -0
- package/dist/templates/default/hooks/use-deep-link.ts +43 -0
- package/dist/templates/default/hooks/use-navigation-tracking.ts +15 -0
- package/dist/templates/default/hooks/use-network.ts +11 -0
- package/dist/templates/default/hooks/use-notifications.ts +107 -0
- package/dist/templates/default/hooks/use-onboarding.ts +15 -0
- package/dist/templates/default/hooks/use-reduced-motion.ts +11 -0
- package/dist/templates/default/hooks/use-theme.ts +53 -0
- package/dist/templates/default/hooks/use-updates.ts +86 -0
- package/dist/templates/default/lib/a11y.ts +5 -0
- package/dist/templates/default/lib/app.ts +14 -0
- package/dist/templates/default/lib/assets.ts +17 -0
- package/dist/templates/default/lib/auth-client.ts +21 -0
- package/dist/templates/default/lib/convex-auth.tsx +79 -0
- package/dist/templates/default/lib/deep-link.ts +71 -0
- package/dist/templates/default/lib/dev-menu.ts +119 -0
- package/dist/templates/default/lib/device.ts +40 -0
- package/dist/templates/default/lib/dynamic-font.ts +49 -0
- package/dist/templates/default/lib/env.ts +10 -0
- package/dist/templates/default/lib/haptics.ts +24 -0
- package/dist/templates/default/lib/notifications.ts +276 -0
- package/dist/templates/default/lib/preferences.ts +45 -0
- package/dist/templates/default/lib/schemas.ts +137 -0
- package/dist/templates/default/lib/storage.ts +47 -0
- package/dist/templates/default/lib/updates.ts +107 -0
- package/dist/templates/default/metro.config.js +14 -0
- package/dist/templates/default/package.json +129 -0
- package/dist/templates/default/patches/PR-368.patch +91 -0
- package/dist/templates/default/patches/convex-dev-better-auth-0.12.2.tgz +0 -0
- package/dist/templates/default/plugins/README.md +9 -0
- package/dist/templates/default/plugins/with-auto-signing.js +45 -0
- package/dist/templates/default/plugins/with-pod-deployment-target.js +35 -0
- package/dist/templates/default/scripts/README.md +36 -0
- package/dist/templates/default/scripts/_run.mjs +77 -0
- package/dist/templates/default/scripts/clean.ts +543 -0
- package/dist/templates/default/scripts/rotate-apple-jwt.mjs +80 -0
- package/dist/templates/default/store.config.json +58 -0
- package/dist/templates/default/tsconfig.json +13 -0
- package/dist/templates/default/vitest.config.ts +21 -0
- 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>;
|