@cachly-dev/mcp-server 0.10.64 → 0.10.66

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 (270) hide show
  1. package/dist/src/handlers/brain.js +1 -1
  2. package/dist/src/index.js +1 -1
  3. package/package.json +7 -1
  4. package/server.json +2 -2
  5. package/.env.test.example +0 -23
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -50
  7. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -25
  9. package/.github/workflows/eas-build-android.yml +0 -58
  10. package/.github/workflows/eas-update.yml +0 -55
  11. package/.github/workflows/publish.yml +0 -72
  12. package/BENCH.md +0 -91
  13. package/CHANGELOG.md +0 -604
  14. package/CHANGELOG.md.tmp +0 -0
  15. package/Dockerfile +0 -16
  16. package/LAUNCH_TEXTS.md +0 -182
  17. package/PROGRESS.md +0 -137
  18. package/STRATEGY.md +0 -228
  19. package/VISION_10X.md +0 -133
  20. package/apps/travel-chaos-organizer/.env.example +0 -49
  21. package/apps/travel-chaos-organizer/DEPLOY.md +0 -328
  22. package/apps/travel-chaos-organizer/Makefile +0 -57
  23. package/apps/travel-chaos-organizer/README.md +0 -159
  24. package/apps/travel-chaos-organizer/backend/.env.example +0 -10
  25. package/apps/travel-chaos-organizer/backend/Dockerfile +0 -25
  26. package/apps/travel-chaos-organizer/backend/alembic/env.py +0 -56
  27. package/apps/travel-chaos-organizer/backend/alembic/script.py.mako +0 -24
  28. package/apps/travel-chaos-organizer/backend/alembic/versions/.gitkeep +0 -0
  29. package/apps/travel-chaos-organizer/backend/alembic/versions/0001_stripe_customer_id.py +0 -24
  30. package/apps/travel-chaos-organizer/backend/alembic/versions/0002_telegram_chat_id.py +0 -24
  31. package/apps/travel-chaos-organizer/backend/alembic.ini +0 -39
  32. package/apps/travel-chaos-organizer/backend/app/__init__.py +0 -0
  33. package/apps/travel-chaos-organizer/backend/app/auth/__init__.py +0 -0
  34. package/apps/travel-chaos-organizer/backend/app/auth/keycloak.py +0 -81
  35. package/apps/travel-chaos-organizer/backend/app/config.py +0 -66
  36. package/apps/travel-chaos-organizer/backend/app/db/__init__.py +0 -0
  37. package/apps/travel-chaos-organizer/backend/app/db/database.py +0 -20
  38. package/apps/travel-chaos-organizer/backend/app/db/migrations/001_init.sql +0 -71
  39. package/apps/travel-chaos-organizer/backend/app/db/migrations/002_telemetry_freemium.sql +0 -31
  40. package/apps/travel-chaos-organizer/backend/app/db/migrations/003_telegram_chat_id.sql +0 -4
  41. package/apps/travel-chaos-organizer/backend/app/db/migrations/004_stripe_and_email.sql +0 -5
  42. package/apps/travel-chaos-organizer/backend/app/limiter.py +0 -4
  43. package/apps/travel-chaos-organizer/backend/app/logging_config.py +0 -25
  44. package/apps/travel-chaos-organizer/backend/app/main.py +0 -77
  45. package/apps/travel-chaos-organizer/backend/app/models/__init__.py +0 -0
  46. package/apps/travel-chaos-organizer/backend/app/models/schemas.py +0 -142
  47. package/apps/travel-chaos-organizer/backend/app/routers/__init__.py +0 -0
  48. package/apps/travel-chaos-organizer/backend/app/routers/admin.py +0 -237
  49. package/apps/travel-chaos-organizer/backend/app/routers/cache.py +0 -13
  50. package/apps/travel-chaos-organizer/backend/app/routers/events.py +0 -29
  51. package/apps/travel-chaos-organizer/backend/app/routers/export.py +0 -122
  52. package/apps/travel-chaos-organizer/backend/app/routers/inbox.py +0 -122
  53. package/apps/travel-chaos-organizer/backend/app/routers/items.py +0 -130
  54. package/apps/travel-chaos-organizer/backend/app/routers/mail.py +0 -108
  55. package/apps/travel-chaos-organizer/backend/app/routers/parse.py +0 -303
  56. package/apps/travel-chaos-organizer/backend/app/routers/payments.py +0 -179
  57. package/apps/travel-chaos-organizer/backend/app/routers/trips.py +0 -134
  58. package/apps/travel-chaos-organizer/backend/app/routers/users.py +0 -169
  59. package/apps/travel-chaos-organizer/backend/app/routers/waitlist.py +0 -37
  60. package/apps/travel-chaos-organizer/backend/app/services/__init__.py +0 -0
  61. package/apps/travel-chaos-organizer/backend/app/services/cache.py +0 -131
  62. package/apps/travel-chaos-organizer/backend/app/services/drip.py +0 -128
  63. package/apps/travel-chaos-organizer/backend/app/services/email.py +0 -61
  64. package/apps/travel-chaos-organizer/backend/app/services/errors.py +0 -44
  65. package/apps/travel-chaos-organizer/backend/app/services/notifier.py +0 -10
  66. package/apps/travel-chaos-organizer/backend/app/services/ollama.py +0 -101
  67. package/apps/travel-chaos-organizer/backend/app/services/parser.py +0 -22
  68. package/apps/travel-chaos-organizer/backend/app/services/quota.py +0 -85
  69. package/apps/travel-chaos-organizer/backend/app/services/sentry.py +0 -11
  70. package/apps/travel-chaos-organizer/backend/app/services/telemetry.py +0 -35
  71. package/apps/travel-chaos-organizer/backend/pytest.ini +0 -4
  72. package/apps/travel-chaos-organizer/backend/requirements-dev.txt +0 -6
  73. package/apps/travel-chaos-organizer/backend/requirements.txt +0 -25
  74. package/apps/travel-chaos-organizer/backend/tests/__init__.py +0 -0
  75. package/apps/travel-chaos-organizer/backend/tests/conftest.py +0 -223
  76. package/apps/travel-chaos-organizer/backend/tests/test_admin.py +0 -99
  77. package/apps/travel-chaos-organizer/backend/tests/test_cache.py +0 -142
  78. package/apps/travel-chaos-organizer/backend/tests/test_drip.py +0 -32
  79. package/apps/travel-chaos-organizer/backend/tests/test_e2e_chain.py +0 -121
  80. package/apps/travel-chaos-organizer/backend/tests/test_export.py +0 -48
  81. package/apps/travel-chaos-organizer/backend/tests/test_inbox.py +0 -107
  82. package/apps/travel-chaos-organizer/backend/tests/test_items.py +0 -138
  83. package/apps/travel-chaos-organizer/backend/tests/test_mail.py +0 -113
  84. package/apps/travel-chaos-organizer/backend/tests/test_ollama.py +0 -145
  85. package/apps/travel-chaos-organizer/backend/tests/test_parse_url.py +0 -98
  86. package/apps/travel-chaos-organizer/backend/tests/test_parser.py +0 -72
  87. package/apps/travel-chaos-organizer/backend/tests/test_payments.py +0 -163
  88. package/apps/travel-chaos-organizer/backend/tests/test_quota.py +0 -46
  89. package/apps/travel-chaos-organizer/backend/tests/test_search.py +0 -67
  90. package/apps/travel-chaos-organizer/backend/tests/test_trips.py +0 -123
  91. package/apps/travel-chaos-organizer/backend/tests/test_users.py +0 -52
  92. package/apps/travel-chaos-organizer/backups/.gitkeep +0 -0
  93. package/apps/travel-chaos-organizer/caddy/Caddyfile +0 -27
  94. package/apps/travel-chaos-organizer/docker-compose.node1.yml +0 -31
  95. package/apps/travel-chaos-organizer/docker-compose.override.yml +0 -14
  96. package/apps/travel-chaos-organizer/docker-compose.yml +0 -128
  97. package/apps/travel-chaos-organizer/frontend/.env.example +0 -13
  98. package/apps/travel-chaos-organizer/frontend/app/(app)/_layout.tsx +0 -80
  99. package/apps/travel-chaos-organizer/frontend/app/(app)/inbox.tsx +0 -166
  100. package/apps/travel-chaos-organizer/frontend/app/(app)/search.tsx +0 -130
  101. package/apps/travel-chaos-organizer/frontend/app/(app)/settings.tsx +0 -381
  102. package/apps/travel-chaos-organizer/frontend/app/(app)/trips/[id].tsx +0 -346
  103. package/apps/travel-chaos-organizer/frontend/app/(app)/trips.tsx +0 -363
  104. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/cancel.tsx +0 -34
  105. package/apps/travel-chaos-organizer/frontend/app/(app)/upgrade/success.tsx +0 -35
  106. package/apps/travel-chaos-organizer/frontend/app/(auth)/login.tsx +0 -91
  107. package/apps/travel-chaos-organizer/frontend/app/_layout.tsx +0 -71
  108. package/apps/travel-chaos-organizer/frontend/app/auth.tsx +0 -29
  109. package/apps/travel-chaos-organizer/frontend/app/index.tsx +0 -16
  110. package/apps/travel-chaos-organizer/frontend/app/onboarding.tsx +0 -119
  111. package/apps/travel-chaos-organizer/frontend/app.config.ts +0 -54
  112. package/apps/travel-chaos-organizer/frontend/assets/adaptive-icon.svg +0 -66
  113. package/apps/travel-chaos-organizer/frontend/assets/icon.svg +0 -79
  114. package/apps/travel-chaos-organizer/frontend/assets/splash.svg +0 -15
  115. package/apps/travel-chaos-organizer/frontend/components/BottomSheet.tsx +0 -102
  116. package/apps/travel-chaos-organizer/frontend/components/ConfettiCannon.tsx +0 -107
  117. package/apps/travel-chaos-organizer/frontend/components/ConfirmDialog.tsx +0 -109
  118. package/apps/travel-chaos-organizer/frontend/components/ErrorBoundary.tsx +0 -45
  119. package/apps/travel-chaos-organizer/frontend/components/FileUploadButton.tsx +0 -19
  120. package/apps/travel-chaos-organizer/frontend/components/ImportSheet.tsx +0 -155
  121. package/apps/travel-chaos-organizer/frontend/components/OfflineBadge.tsx +0 -55
  122. package/apps/travel-chaos-organizer/frontend/components/QRCodeViewer.tsx +0 -80
  123. package/apps/travel-chaos-organizer/frontend/components/ScoreRing.tsx +0 -39
  124. package/apps/travel-chaos-organizer/frontend/components/Screen.tsx +0 -39
  125. package/apps/travel-chaos-organizer/frontend/components/Skeleton.tsx +0 -70
  126. package/apps/travel-chaos-organizer/frontend/components/SwipeableInboxItem.tsx +0 -121
  127. package/apps/travel-chaos-organizer/frontend/components/SwipeableTimelineItem.tsx +0 -70
  128. package/apps/travel-chaos-organizer/frontend/components/TimelineItem.tsx +0 -73
  129. package/apps/travel-chaos-organizer/frontend/components/TimelineItemDetail.tsx +0 -130
  130. package/apps/travel-chaos-organizer/frontend/components/Toast.tsx +0 -60
  131. package/apps/travel-chaos-organizer/frontend/components/ToastContext.tsx +0 -42
  132. package/apps/travel-chaos-organizer/frontend/components/TripCard.tsx +0 -146
  133. package/apps/travel-chaos-organizer/frontend/components/TripQRModal.tsx +0 -70
  134. package/apps/travel-chaos-organizer/frontend/components/UpgradeBanner.tsx +0 -44
  135. package/apps/travel-chaos-organizer/frontend/eas.json +0 -22
  136. package/apps/travel-chaos-organizer/frontend/hooks/useInbox.ts +0 -24
  137. package/apps/travel-chaos-organizer/frontend/hooks/useNetworkSync.ts +0 -60
  138. package/apps/travel-chaos-organizer/frontend/hooks/useTrips.ts +0 -112
  139. package/apps/travel-chaos-organizer/frontend/lib/api.ts +0 -223
  140. package/apps/travel-chaos-organizer/frontend/lib/auth.ts +0 -93
  141. package/apps/travel-chaos-organizer/frontend/lib/db.ts +0 -86
  142. package/apps/travel-chaos-organizer/frontend/lib/fileCache.ts +0 -54
  143. package/apps/travel-chaos-organizer/frontend/lib/haptics.ts +0 -13
  144. package/apps/travel-chaos-organizer/frontend/lib/notifications.ts +0 -112
  145. package/apps/travel-chaos-organizer/frontend/lib/offlineQueue.ts +0 -145
  146. package/apps/travel-chaos-organizer/frontend/lib/quota.tsx +0 -43
  147. package/apps/travel-chaos-organizer/frontend/lib/sentry.ts +0 -28
  148. package/apps/travel-chaos-organizer/frontend/lib/shareIntent.ts +0 -44
  149. package/apps/travel-chaos-organizer/frontend/package-lock.json +0 -13221
  150. package/apps/travel-chaos-organizer/frontend/package.json +0 -44
  151. package/apps/travel-chaos-organizer/frontend/tsconfig.json +0 -23
  152. package/apps/travel-chaos-organizer/keycloak/realm-export.json +0 -59
  153. package/apps/travel-chaos-organizer/landing/index.html +0 -773
  154. package/apps/travel-chaos-organizer/scripts/backup.sh +0 -14
  155. package/apps/travel-chaos-organizer/scripts/configure-env.sh +0 -82
  156. package/apps/travel-chaos-organizer/scripts/deploy.sh +0 -54
  157. package/apps/travel-chaos-organizer/scripts/health-check.sh +0 -36
  158. package/apps/travel-chaos-organizer/scripts/migrate.sh +0 -7
  159. package/apps/travel-chaos-organizer/scripts/server-setup.sh +0 -85
  160. package/apps/travel-chaos-organizer/scripts/smoke-test.sh +0 -29
  161. package/apps/travel-chaos-organizer/scripts/verify-tracking.sh +0 -71
  162. package/apps/travel-chaos-organizer/telegram-bot/.env.example +0 -3
  163. package/apps/travel-chaos-organizer/telegram-bot/Dockerfile +0 -6
  164. package/apps/travel-chaos-organizer/telegram-bot/bot.py +0 -504
  165. package/apps/travel-chaos-organizer/telegram-bot/requirements.txt +0 -3
  166. package/dist/src/__tests__/auth.test.d.ts +0 -1
  167. package/dist/src/__tests__/auth.test.js +0 -107
  168. package/dist/src/__tests__/auth.test.js.map +0 -1
  169. package/dist/src/__tests__/brain-flow.test.d.ts +0 -12
  170. package/dist/src/__tests__/brain-flow.test.js +0 -1241
  171. package/dist/src/__tests__/brain-flow.test.js.map +0 -1
  172. package/dist/src/__tests__/confidence.test.d.ts +0 -13
  173. package/dist/src/__tests__/confidence.test.js +0 -233
  174. package/dist/src/__tests__/confidence.test.js.map +0 -1
  175. package/dist/src/__tests__/e2e/api-auth.test.d.ts +0 -7
  176. package/dist/src/__tests__/e2e/api-auth.test.js +0 -162
  177. package/dist/src/__tests__/e2e/api-auth.test.js.map +0 -1
  178. package/dist/src/__tests__/e2e/api-health.test.d.ts +0 -7
  179. package/dist/src/__tests__/e2e/api-health.test.js +0 -95
  180. package/dist/src/__tests__/e2e/api-health.test.js.map +0 -1
  181. package/dist/src/__tests__/e2e/cli.test.d.ts +0 -10
  182. package/dist/src/__tests__/e2e/cli.test.js +0 -204
  183. package/dist/src/__tests__/e2e/cli.test.js.map +0 -1
  184. package/dist/src/__tests__/e2e/config.d.ts +0 -35
  185. package/dist/src/__tests__/e2e/config.js +0 -53
  186. package/dist/src/__tests__/e2e/config.js.map +0 -1
  187. package/dist/src/__tests__/e2e/funnel.test.d.ts +0 -13
  188. package/dist/src/__tests__/e2e/funnel.test.js +0 -90
  189. package/dist/src/__tests__/e2e/funnel.test.js.map +0 -1
  190. package/dist/src/__tests__/e2e/mcp-tools.test.d.ts +0 -7
  191. package/dist/src/__tests__/e2e/mcp-tools.test.js +0 -129
  192. package/dist/src/__tests__/e2e/mcp-tools.test.js.map +0 -1
  193. package/dist/src/__tests__/e2e/provisioning.test.d.ts +0 -15
  194. package/dist/src/__tests__/e2e/provisioning.test.js +0 -123
  195. package/dist/src/__tests__/e2e/provisioning.test.js.map +0 -1
  196. package/dist/src/__tests__/handlers-unit.test.d.ts +0 -12
  197. package/dist/src/__tests__/handlers-unit.test.js +0 -505
  198. package/dist/src/__tests__/handlers-unit.test.js.map +0 -1
  199. package/dist/src/__tests__/namespace.test.d.ts +0 -1
  200. package/dist/src/__tests__/namespace.test.js +0 -114
  201. package/dist/src/__tests__/namespace.test.js.map +0 -1
  202. package/dist/src/__tests__/rerank.test.d.ts +0 -1
  203. package/dist/src/__tests__/rerank.test.js +0 -115
  204. package/dist/src/__tests__/rerank.test.js.map +0 -1
  205. package/dist/src/__tests__/utils.test.d.ts +0 -1
  206. package/dist/src/__tests__/utils.test.js +0 -83
  207. package/dist/src/__tests__/utils.test.js.map +0 -1
  208. package/dist/src/bench/cachly-bench.d.ts +0 -35
  209. package/dist/src/bench/cachly-bench.js +0 -182
  210. package/dist/src/bench/cachly-bench.js.map +0 -1
  211. package/dist/src/bench/fixtures.d.ts +0 -37
  212. package/dist/src/bench/fixtures.js +0 -225
  213. package/dist/src/bench/fixtures.js.map +0 -1
  214. package/dist/src/search.test.d.ts +0 -1
  215. package/dist/src/search.test.js +0 -713
  216. package/dist/src/search.test.js.map +0 -1
  217. package/eslint.config.js +0 -16
  218. package/glama.json +0 -36
  219. package/llms.txt +0 -155
  220. package/packages/telegram-notify/SPLIT_PLAN.md +0 -106
  221. package/packages/telegram-notify/client.ts +0 -88
  222. package/packages/telegram-notify/emojis.json +0 -22
  223. package/packages/telegram-notify/pyproject.toml +0 -17
  224. package/packages/telegram-notify/telegram_notify/__init__.py +0 -3
  225. package/packages/telegram-notify/telegram_notify/client.py +0 -87
  226. package/packages/telegram-notify/telegram_notify/emojis.json +0 -22
  227. package/scripts/e2e-run.sh +0 -160
  228. package/scripts/generate-icons.js +0 -28
  229. package/smithery.yaml +0 -45
  230. package/src/__tests__/auth.test.ts +0 -147
  231. package/src/__tests__/brain-flow.test.ts +0 -1472
  232. package/src/__tests__/confidence.test.ts +0 -285
  233. package/src/__tests__/e2e/api-auth.test.ts +0 -182
  234. package/src/__tests__/e2e/api-health.test.ts +0 -103
  235. package/src/__tests__/e2e/cli.test.ts +0 -228
  236. package/src/__tests__/e2e/config.ts +0 -53
  237. package/src/__tests__/e2e/funnel.test.ts +0 -99
  238. package/src/__tests__/e2e/mcp-tools.test.ts +0 -191
  239. package/src/__tests__/e2e/provisioning.test.ts +0 -128
  240. package/src/__tests__/handlers-unit.test.ts +0 -677
  241. package/src/__tests__/namespace.test.ts +0 -126
  242. package/src/__tests__/rerank.test.ts +0 -130
  243. package/src/__tests__/utils.test.ts +0 -81
  244. package/src/auth.ts +0 -46
  245. package/src/bench/cachly-bench.ts +0 -217
  246. package/src/bench/fixtures.ts +0 -256
  247. package/src/ckg.ts +0 -103
  248. package/src/confidence.ts +0 -38
  249. package/src/embeddings.ts +0 -217
  250. package/src/handlers/advanced.ts +0 -647
  251. package/src/handlers/brain.ts +0 -2622
  252. package/src/handlers/cache.ts +0 -633
  253. package/src/handlers/context.ts +0 -222
  254. package/src/handlers/fedbrain.ts +0 -1232
  255. package/src/handlers/instances.ts +0 -180
  256. package/src/handlers/roadmap.ts +0 -201
  257. package/src/handlers/syndicate.ts +0 -460
  258. package/src/handlers/tco.ts +0 -345
  259. package/src/handlers/team.ts +0 -1249
  260. package/src/index.ts +0 -2815
  261. package/src/namespace.ts +0 -128
  262. package/src/notifier.ts +0 -5
  263. package/src/rerank.ts +0 -148
  264. package/src/search.test.ts +0 -848
  265. package/src/search.ts +0 -1781
  266. package/src/tools.ts +0 -2056
  267. package/src/utils.ts +0 -90
  268. package/test-features.cjs +0 -23
  269. package/tsconfig.json +0 -16
  270. package/vitest.config.ts +0 -14
@@ -1,119 +0,0 @@
1
- import { useRef, useState } from "react";
2
- import {
3
- Animated, Dimensions, FlatList, StyleSheet, Text,
4
- TouchableOpacity, View,
5
- } from "react-native";
6
- import { useRouter } from "expo-router";
7
- import AsyncStorage from "@react-native-async-storage/async-storage";
8
- import { haptics } from "../lib/haptics";
9
-
10
- const { width } = Dimensions.get("window");
11
- const ONBOARDING_KEY = "tco_onboarding_done";
12
-
13
- const SLIDES = [
14
- {
15
- icon: "✈️",
16
- title: "Reisechaos ade",
17
- body: "Alle Buchungen, Tickets und Dokumente an einem Ort — automatisch sortiert.",
18
- },
19
- {
20
- icon: "📸",
21
- title: "Einfach scannen",
22
- body: "Screenshot machen, PDF teilen oder E-Mail einfügen. KI erkennt alle Details automatisch.",
23
- },
24
- {
25
- icon: "📶",
26
- title: "Offline verfügbar",
27
- body: "Deine Tickets und QR-Codes sind auch ohne Internet abrufbar — am Gate, im Zug, überall.",
28
- },
29
- {
30
- icon: "🔐",
31
- title: "Deine Daten, dein Server",
32
- body: "Alles läuft auf deiner eigenen Infrastruktur. Keine Cloud, kein Tracking.",
33
- },
34
- ];
35
-
36
- export async function isOnboardingDone(): Promise<boolean> {
37
- return (await AsyncStorage.getItem(ONBOARDING_KEY)) === "done";
38
- }
39
-
40
- export default function OnboardingScreen() {
41
- const router = useRouter();
42
- const [index, setIndex] = useState(0);
43
- const scrollX = useRef(new Animated.Value(0)).current;
44
- const listRef = useRef<FlatList>(null);
45
-
46
- async function next() {
47
- await haptics.tap();
48
- if (index < SLIDES.length - 1) {
49
- listRef.current?.scrollToIndex({ index: index + 1, animated: true });
50
- setIndex(index + 1);
51
- } else {
52
- await finish();
53
- }
54
- }
55
-
56
- async function finish() {
57
- await AsyncStorage.setItem(ONBOARDING_KEY, "done");
58
- await haptics.success();
59
- router.replace("/(auth)/login");
60
- }
61
-
62
- return (
63
- <View style={s.container}>
64
- <TouchableOpacity style={s.skip} onPress={finish}>
65
- <Text style={s.skipText}>Überspringen</Text>
66
- </TouchableOpacity>
67
-
68
- <Animated.FlatList
69
- ref={listRef}
70
- data={SLIDES}
71
- horizontal
72
- pagingEnabled
73
- showsHorizontalScrollIndicator={false}
74
- scrollEnabled={false}
75
- onScroll={Animated.event([{ nativeEvent: { contentOffset: { x: scrollX } } }], { useNativeDriver: false })}
76
- keyExtractor={(_, i) => String(i)}
77
- renderItem={({ item }) => (
78
- <View style={[s.slide, { width }]}>
79
- <Text style={s.icon}>{item.icon}</Text>
80
- <Text style={s.title}>{item.title}</Text>
81
- <Text style={s.body}>{item.body}</Text>
82
- </View>
83
- )}
84
- />
85
-
86
- <View style={s.footer}>
87
- <View style={s.dots}>
88
- {SLIDES.map((_, i) => {
89
- const inputRange = [(i - 1) * width, i * width, (i + 1) * width];
90
- const dotWidth = scrollX.interpolate({ inputRange, outputRange: [8, 24, 8], extrapolate: "clamp" });
91
- const opacity = scrollX.interpolate({ inputRange, outputRange: [0.3, 1, 0.3], extrapolate: "clamp" });
92
- return <Animated.View key={i} style={[s.dot, { width: dotWidth, opacity }]} />;
93
- })}
94
- </View>
95
-
96
- <TouchableOpacity style={s.button} onPress={next}>
97
- <Text style={s.buttonText}>
98
- {index < SLIDES.length - 1 ? "Weiter" : "Los geht's"}
99
- </Text>
100
- </TouchableOpacity>
101
- </View>
102
- </View>
103
- );
104
- }
105
-
106
- const s = StyleSheet.create({
107
- container: { flex: 1, backgroundColor: "#0f0f1a" },
108
- skip: { position: "absolute", top: 56, right: 24, zIndex: 10 },
109
- skipText: { color: "#4a4a7a", fontSize: 14 },
110
- slide: { flex: 1, alignItems: "center", justifyContent: "center", padding: 40, gap: 24 },
111
- icon: { fontSize: 88 },
112
- title: { fontSize: 30, fontWeight: "800", color: "#fff", textAlign: "center", lineHeight: 36 },
113
- body: { fontSize: 16, color: "#8888aa", textAlign: "center", lineHeight: 24, maxWidth: 300 },
114
- footer: { padding: 32, gap: 24, alignItems: "center" },
115
- dots: { flexDirection: "row", gap: 6, alignItems: "center" },
116
- dot: { height: 8, borderRadius: 4, backgroundColor: "#4f46e5" },
117
- button: { backgroundColor: "#4f46e5", paddingVertical: 16, borderRadius: 14, width: "100%", alignItems: "center" },
118
- buttonText: { color: "#fff", fontSize: 17, fontWeight: "700" },
119
- });
@@ -1,54 +0,0 @@
1
- import { ExpoConfig } from "expo/config";
2
-
3
- const config: ExpoConfig = {
4
- name: "Travel Chaos Organizer",
5
- slug: "travel-chaos-organizer",
6
- version: "0.1.0",
7
- scheme: "tco",
8
- runtimeVersion: {
9
- policy: "appVersion",
10
- },
11
- orientation: "portrait",
12
- icon: "./assets/icon.png",
13
- splash: {
14
- image: "./assets/splash.png",
15
- backgroundColor: "#0f0f1a",
16
- },
17
- updates: {
18
- url: "https://u.expo.dev/ed92c1f4-4f25-411f-a945-3c77f58d8550",
19
- enabled: true,
20
- fallbackToCacheTimeout: 3000,
21
- checkAutomatically: "ON_LOAD",
22
- },
23
- ios: {
24
- bundleIdentifier: "dev.cachly.tco",
25
- supportsTablet: true,
26
- },
27
- android: {
28
- package: "dev.cachly.tco",
29
- adaptiveIcon: {
30
- foregroundImage: "./assets/adaptive-icon.png",
31
- backgroundColor: "#0f0f1a",
32
- },
33
- },
34
- plugins: [
35
- "expo-router",
36
- "expo-sqlite",
37
- "expo-updates",
38
- ["expo-image-picker", { photosPermission: "Allow TCO to access your photos for travel document scanning." }],
39
- ["expo-document-picker", {}],
40
- [
41
- "expo-notifications",
42
- {
43
- icon: "./assets/icon.png",
44
- color: "#4f46e5",
45
- sounds: [],
46
- },
47
- ],
48
- ],
49
- extra: {
50
- eas: { projectId: "ed92c1f4-4f25-411f-a945-3c77f58d8550" },
51
- },
52
- };
53
-
54
- export default config;
@@ -1,66 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024">
2
- <defs>
3
- <radialGradient id="glow" cx="50%" cy="43%" r="27%" fx="50%" fy="43%">
4
- <stop offset="0%" stop-color="#4f46e5" stop-opacity="0.25"/>
5
- <stop offset="100%" stop-color="#4f46e5" stop-opacity="0"/>
6
- </radialGradient>
7
- <filter id="planeShadow" x="-20%" y="-20%" width="140%" height="140%">
8
- <feDropShadow dx="0" dy="8" stdDeviation="16" flood-color="#4f46e5" flood-opacity="0.4"/>
9
- </filter>
10
- </defs>
11
-
12
- <!-- Radial glow behind plane -->
13
- <ellipse cx="512" cy="440" rx="300" ry="280" fill="url(#glow)"/>
14
-
15
- <!-- Paper plane group, centered ~(512, 420) -->
16
- <g filter="url(#planeShadow)">
17
- <!-- Main wing body -->
18
- <polygon
19
- points="192,540 512,270 832,420 512,480"
20
- fill="#ffffff"
21
- opacity="0.97"
22
- />
23
- <!-- Lower wing / tail -->
24
- <polygon
25
- points="192,540 512,480 400,620"
26
- fill="#c7c4f0"
27
- opacity="0.85"
28
- />
29
- <!-- Nose crease highlight -->
30
- <polygon
31
- points="512,270 832,420 512,380"
32
- fill="#e8e6ff"
33
- opacity="0.6"
34
- />
35
- <!-- Tail fold accent -->
36
- <polygon
37
- points="400,620 512,480 512,560"
38
- fill="#9d9ae8"
39
- opacity="0.7"
40
- />
41
- </g>
42
-
43
- <!-- TCO text -->
44
- <text
45
- x="512"
46
- y="692"
47
- font-family="system-ui, -apple-system, sans-serif"
48
- font-size="140"
49
- font-weight="700"
50
- fill="#ffffff"
51
- text-anchor="middle"
52
- letter-spacing="12"
53
- >TCO</text>
54
-
55
- <!-- Subtitle text -->
56
- <text
57
- x="512"
58
- y="778"
59
- font-family="system-ui, -apple-system, sans-serif"
60
- font-size="52"
61
- font-weight="400"
62
- fill="#6666aa"
63
- text-anchor="middle"
64
- letter-spacing="3"
65
- >Travel Chaos Organizer</text>
66
- </svg>
@@ -1,79 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="1024" height="1024">
2
- <defs>
3
- <radialGradient id="glow" cx="50%" cy="43%" r="27%" fx="50%" fy="43%">
4
- <stop offset="0%" stop-color="#4f46e5" stop-opacity="0.25"/>
5
- <stop offset="100%" stop-color="#4f46e5" stop-opacity="0"/>
6
- </radialGradient>
7
- <radialGradient id="bgGlow" cx="50%" cy="50%" r="60%">
8
- <stop offset="0%" stop-color="#1a1535"/>
9
- <stop offset="100%" stop-color="#0f0f1a"/>
10
- </radialGradient>
11
- <filter id="planeShadow" x="-20%" y="-20%" width="140%" height="140%">
12
- <feDropShadow dx="0" dy="8" stdDeviation="16" flood-color="#4f46e5" flood-opacity="0.4"/>
13
- </filter>
14
- </defs>
15
-
16
- <!-- Background -->
17
- <rect width="1024" height="1024" rx="220" fill="url(#bgGlow)"/>
18
-
19
- <!-- Subtle top highlight -->
20
- <rect width="1024" height="1024" rx="220" fill="url(#bgGlow)" opacity="0"/>
21
-
22
- <!-- Accent border glow -->
23
- <rect width="1024" height="1024" rx="220" fill="none" stroke="#4f46e5" stroke-width="2" stroke-opacity="0.15"/>
24
-
25
- <!-- Radial glow behind plane -->
26
- <ellipse cx="512" cy="440" rx="300" ry="280" fill="url(#glow)"/>
27
-
28
- <!-- Paper plane group, centered ~(512, 420) -->
29
- <g filter="url(#planeShadow)">
30
- <!-- Main wing body: large right-pointing shape -->
31
- <polygon
32
- points="192,540 512,270 832,420 512,480"
33
- fill="#ffffff"
34
- opacity="0.97"
35
- />
36
- <!-- Lower wing / tail -->
37
- <polygon
38
- points="192,540 512,480 400,620"
39
- fill="#c7c4f0"
40
- opacity="0.85"
41
- />
42
- <!-- Nose crease highlight -->
43
- <polygon
44
- points="512,270 832,420 512,380"
45
- fill="#e8e6ff"
46
- opacity="0.6"
47
- />
48
- <!-- Tail fold accent -->
49
- <polygon
50
- points="400,620 512,480 512,560"
51
- fill="#9d9ae8"
52
- opacity="0.7"
53
- />
54
- </g>
55
-
56
- <!-- TCO text -->
57
- <text
58
- x="512"
59
- y="692"
60
- font-family="system-ui, -apple-system, sans-serif"
61
- font-size="140"
62
- font-weight="700"
63
- fill="#ffffff"
64
- text-anchor="middle"
65
- letter-spacing="12"
66
- >TCO</text>
67
-
68
- <!-- Subtitle text -->
69
- <text
70
- x="512"
71
- y="778"
72
- font-family="system-ui, -apple-system, sans-serif"
73
- font-size="52"
74
- font-weight="400"
75
- fill="#6666aa"
76
- text-anchor="middle"
77
- letter-spacing="3"
78
- >Travel Chaos Organizer</text>
79
- </svg>
@@ -1,15 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="1284" height="2778" viewBox="0 0 1284 2778">
2
- <rect width="1284" height="2778" fill="#0f0f1a"/>
3
- <radialGradient id="g" cx="642" cy="1389" r="400" gradientUnits="userSpaceOnUse">
4
- <stop offset="0" stop-color="#4f46e5" stop-opacity="0.25"/>
5
- <stop offset="1" stop-color="#4f46e5" stop-opacity="0"/>
6
- </radialGradient>
7
- <circle cx="642" cy="1389" r="400" fill="url(#g)"/>
8
- <g transform="translate(642,1330)">
9
- <polygon points="-110,-80 160,0 -110,80 -40,0" fill="#ffffff"/>
10
- <polygon points="-110,80 -40,0 -110,20" fill="#a5b4fc"/>
11
- <polygon points="-110,-80 -40,0 20,-60" fill="#e0e7ff" opacity="0.6"/>
12
- </g>
13
- <text x="642" y="1510" font-family="system-ui,-apple-system,sans-serif" font-size="120" font-weight="700" fill="#ffffff" text-anchor="middle" letter-spacing="12">TCO</text>
14
- <text x="642" y="1590" font-family="system-ui,-apple-system,sans-serif" font-size="40" fill="#6666aa" text-anchor="middle" letter-spacing="3">Travel Chaos Organizer</text>
15
- </svg>
@@ -1,102 +0,0 @@
1
- /**
2
- * Native-feel bottom sheet — replaces Modal for most action sheets.
3
- * Animated slide-up, backdrop tap to dismiss, safe-area aware.
4
- */
5
- import { ReactNode, useEffect, useRef } from "react";
6
- import {
7
- Animated, Dimensions, KeyboardAvoidingView, Platform, Pressable, ScrollView, StyleSheet, View,
8
- } from "react-native";
9
- import { useSafeAreaInsets } from "react-native-safe-area-context";
10
-
11
- const { height: SCREEN_HEIGHT } = Dimensions.get("window");
12
-
13
- type Props = {
14
- visible: boolean;
15
- onClose: () => void;
16
- children?: ReactNode;
17
- /** Sheet takes up this fraction of screen height (default 0.5) */
18
- heightFraction?: number;
19
- /** Set true when sheet contains text inputs so keyboard doesn't cover them */
20
- hasInputs?: boolean;
21
- };
22
-
23
- export default function BottomSheet({ visible, onClose, children, heightFraction = 0.5, hasInputs = false }: Props) {
24
- const insets = useSafeAreaInsets();
25
- const translateY = useRef(new Animated.Value(SCREEN_HEIGHT)).current;
26
- const backdropOpacity = useRef(new Animated.Value(0)).current;
27
-
28
- useEffect(() => {
29
- if (visible) {
30
- Animated.parallel([
31
- Animated.spring(translateY, { toValue: 0, useNativeDriver: true, damping: 20, stiffness: 200 }),
32
- Animated.timing(backdropOpacity, { toValue: 1, duration: 200, useNativeDriver: true }),
33
- ]).start();
34
- } else {
35
- Animated.parallel([
36
- Animated.timing(translateY, { toValue: SCREEN_HEIGHT, duration: 250, useNativeDriver: true }),
37
- Animated.timing(backdropOpacity, { toValue: 0, duration: 200, useNativeDriver: true }),
38
- ]).start();
39
- }
40
- }, [visible]);
41
-
42
- if (!visible && (translateY as any).__getValue() === SCREEN_HEIGHT) return null;
43
-
44
- return (
45
- <View style={StyleSheet.absoluteFill} pointerEvents={visible ? "auto" : "none"}>
46
- <Animated.View style={[s.backdrop, { opacity: backdropOpacity }]}>
47
- <Pressable style={StyleSheet.absoluteFill} onPress={onClose} />
48
- </Animated.View>
49
-
50
- <Animated.View
51
- style={[
52
- s.sheet,
53
- {
54
- height: SCREEN_HEIGHT * heightFraction,
55
- paddingBottom: insets.bottom + 16,
56
- transform: [{ translateY }],
57
- },
58
- ]}
59
- >
60
- <View style={s.handle} />
61
- {hasInputs ? (
62
- <KeyboardAvoidingView
63
- style={{ flex: 1 }}
64
- behavior={Platform.OS === "ios" ? "padding" : "height"}
65
- keyboardVerticalOffset={16}
66
- >
67
- <ScrollView
68
- keyboardShouldPersistTaps="handled"
69
- showsVerticalScrollIndicator={false}
70
- contentContainerStyle={{ flexGrow: 1 }}
71
- >
72
- {children}
73
- </ScrollView>
74
- </KeyboardAvoidingView>
75
- ) : children}
76
- </Animated.View>
77
- </View>
78
- );
79
- }
80
-
81
- const s = StyleSheet.create({
82
- backdrop: { ...StyleSheet.absoluteFillObject, backgroundColor: "#000000bb" },
83
- sheet: {
84
- position: "absolute",
85
- bottom: 0,
86
- left: 0,
87
- right: 0,
88
- backgroundColor: "#1a1a2e",
89
- borderTopLeftRadius: 24,
90
- borderTopRightRadius: 24,
91
- paddingTop: 12,
92
- paddingHorizontal: 20,
93
- },
94
- handle: {
95
- width: 40,
96
- height: 4,
97
- borderRadius: 2,
98
- backgroundColor: "#3a3a5e",
99
- alignSelf: "center",
100
- marginBottom: 20,
101
- },
102
- });
@@ -1,107 +0,0 @@
1
- import { useEffect, useRef } from "react";
2
- import { Animated, Dimensions, StyleSheet, View } from "react-native";
3
-
4
- type Props = {
5
- visible: boolean;
6
- };
7
-
8
- const COLORS = ["#4f46e5", "#a5b4fc", "#818cf8", "#c7d2fe", "#f59e0b", "#10b981"];
9
- const COUNT = 24;
10
- const { width } = Dimensions.get("window");
11
-
12
- function rand(min: number, max: number) {
13
- return Math.random() * (max - min) + min;
14
- }
15
-
16
- type Particle = {
17
- x: Animated.Value;
18
- y: Animated.Value;
19
- opacity: Animated.Value;
20
- scale: Animated.Value;
21
- color: string;
22
- startX: number;
23
- };
24
-
25
- export default function ConfettiCannon({ visible }: Props) {
26
- const particles = useRef<Particle[]>(
27
- Array.from({ length: COUNT }, (_, i) => ({
28
- x: new Animated.Value(0),
29
- y: new Animated.Value(0),
30
- opacity: new Animated.Value(0),
31
- scale: new Animated.Value(1),
32
- color: COLORS[i % COLORS.length],
33
- startX: rand(0, width),
34
- }))
35
- ).current;
36
-
37
- useEffect(() => {
38
- if (!visible) return;
39
-
40
- particles.forEach((p) => {
41
- p.x.setValue(0);
42
- p.y.setValue(0);
43
- p.opacity.setValue(1);
44
- p.scale.setValue(1);
45
- });
46
-
47
- const animations = particles.map((p) => {
48
- const duration = rand(900, 1200);
49
- const tx = rand(-150, 150);
50
- const ty = rand(-300, -50);
51
-
52
- return Animated.parallel([
53
- Animated.timing(p.x, { toValue: tx, duration, useNativeDriver: true }),
54
- Animated.timing(p.y, { toValue: ty, duration, useNativeDriver: true }),
55
- Animated.timing(p.scale, { toValue: 0.3, duration, useNativeDriver: true }),
56
- Animated.sequence([
57
- Animated.delay(duration * 0.6),
58
- Animated.timing(p.opacity, { toValue: 0, duration: duration * 0.4, useNativeDriver: true }),
59
- ]),
60
- ]);
61
- });
62
-
63
- Animated.parallel(animations).start();
64
- }, [visible]);
65
-
66
- if (!visible) return null;
67
-
68
- return (
69
- <View style={s.container} pointerEvents="none">
70
- {particles.map((p, i) => (
71
- <Animated.View
72
- key={i}
73
- style={[
74
- s.particle,
75
- { backgroundColor: p.color, left: p.startX - 4 },
76
- {
77
- opacity: p.opacity,
78
- transform: [
79
- { translateX: p.x },
80
- { translateY: p.y },
81
- { scale: p.scale },
82
- ],
83
- },
84
- ]}
85
- />
86
- ))}
87
- </View>
88
- );
89
- }
90
-
91
- const s = StyleSheet.create({
92
- container: {
93
- position: "absolute",
94
- bottom: 80,
95
- left: 0,
96
- right: 0,
97
- zIndex: 100,
98
- pointerEvents: "none",
99
- } as any,
100
- particle: {
101
- position: "absolute",
102
- width: 10,
103
- height: 10,
104
- borderRadius: 5,
105
- bottom: 0,
106
- },
107
- });
@@ -1,109 +0,0 @@
1
- import React, { useEffect, useRef } from "react";
2
- import { Animated, Pressable, StyleSheet, Text, TouchableOpacity, View } from "react-native";
3
-
4
- type Action = {
5
- label: string;
6
- style?: "default" | "cancel" | "destructive";
7
- onPress?: () => void;
8
- };
9
-
10
- type Props = {
11
- visible: boolean;
12
- title: string;
13
- message?: string;
14
- actions: Action[];
15
- };
16
-
17
- export default function ConfirmDialog({ visible, title, message, actions }: Props) {
18
- const opacity = useRef(new Animated.Value(0)).current;
19
- const scale = useRef(new Animated.Value(0.92)).current;
20
-
21
- useEffect(() => {
22
- if (visible) {
23
- Animated.parallel([
24
- Animated.timing(opacity, { toValue: 1, duration: 180, useNativeDriver: true }),
25
- Animated.spring(scale, { toValue: 1, useNativeDriver: true, damping: 18, stiffness: 280 }),
26
- ]).start();
27
- } else {
28
- Animated.parallel([
29
- Animated.timing(opacity, { toValue: 0, duration: 140, useNativeDriver: true }),
30
- Animated.timing(scale, { toValue: 0.92, duration: 140, useNativeDriver: true }),
31
- ]).start();
32
- }
33
- }, [visible]);
34
-
35
- if (!visible) return null;
36
-
37
- return (
38
- <View style={s.overlay} pointerEvents="box-none">
39
- <Pressable style={StyleSheet.absoluteFill} />
40
- <Animated.View style={[s.backdrop, { opacity }]} />
41
- <Animated.View style={[s.card, { opacity, transform: [{ scale }] }]}>
42
- <Text style={s.title}>{title}</Text>
43
- {message ? <Text style={s.message}>{message}</Text> : null}
44
- <View style={s.actions}>
45
- {actions.map((a, i) => (
46
- <TouchableOpacity
47
- key={i}
48
- style={[
49
- s.btn,
50
- a.style === "destructive" && s.btnDestructive,
51
- a.style === "cancel" && s.btnCancel,
52
- ]}
53
- onPress={a.onPress}
54
- activeOpacity={0.75}
55
- accessibilityRole="button"
56
- accessibilityLabel={a.label}
57
- >
58
- <Text
59
- style={[
60
- s.btnText,
61
- a.style === "destructive" && s.btnTextDestructive,
62
- a.style === "cancel" && s.btnTextCancel,
63
- ]}
64
- >
65
- {a.label}
66
- </Text>
67
- </TouchableOpacity>
68
- ))}
69
- </View>
70
- </Animated.View>
71
- </View>
72
- );
73
- }
74
-
75
- const s = StyleSheet.create({
76
- overlay: {
77
- ...StyleSheet.absoluteFillObject,
78
- alignItems: "center",
79
- justifyContent: "center",
80
- zIndex: 9999,
81
- },
82
- backdrop: {
83
- ...StyleSheet.absoluteFillObject,
84
- backgroundColor: "#000000bb",
85
- },
86
- card: {
87
- backgroundColor: "#1a1a2e",
88
- borderRadius: 20,
89
- padding: 24,
90
- width: 300,
91
- borderWidth: 1,
92
- borderColor: "#2a2a4a",
93
- gap: 8,
94
- },
95
- title: { color: "#fff", fontSize: 17, fontWeight: "700" },
96
- message: { color: "#9999cc", fontSize: 14, lineHeight: 20 },
97
- actions: { flexDirection: "column", gap: 8, marginTop: 8 },
98
- btn: {
99
- backgroundColor: "#4f46e5",
100
- borderRadius: 12,
101
- paddingVertical: 12,
102
- alignItems: "center",
103
- },
104
- btnCancel: { backgroundColor: "transparent", borderWidth: 1, borderColor: "#2a2a4a" },
105
- btnDestructive: { backgroundColor: "#7f1d1d" },
106
- btnText: { color: "#fff", fontWeight: "700", fontSize: 15 },
107
- btnTextCancel: { color: "#9999cc" },
108
- btnTextDestructive: { color: "#fca5a5" },
109
- });