From 8873c372f068fedba8adc36f23d298b674a4a56e Mon Sep 17 00:00:00 2001 From: Kenneth Date: Sun, 11 Jan 2026 18:10:27 +0000 Subject: [PATCH] feat(companion): initial rn port scaffold --- aris/.gitignore | 24 + aris/app.json | 44 + aris/app/(tabs)/_layout.tsx | 81 ++ aris/app/(tabs)/index.tsx | 22 + aris/app/(tabs)/orchestrator.tsx | 22 + aris/app/(tabs)/settings.tsx | 22 + aris/app/(tabs)/stocks.tsx | 22 + aris/app/(tabs)/todos.tsx | 22 + aris/app/+html.tsx | 46 + aris/app/+not-found.tsx | 26 + aris/app/_layout.tsx | 15 + aris/app/details.tsx | 23 + aris/assets/adaptive-icon.png | Bin 0 -> 17547 bytes aris/assets/favicon.png | Bin 0 -> 1466 bytes aris/assets/icon.png | Bin 0 -> 22380 bytes aris/assets/splash.png | Bin 0 -> 47346 bytes aris/babel.config.js | 12 + aris/bun.lock | 2062 ++++++++++++++++++++++++++++ aris/cesconfig.jsonc | 42 + aris/components.json | 19 + aris/components/Button.tsx | 24 + aris/components/Container.tsx | 9 + aris/components/EditScreenInfo.tsx | 29 + aris/components/ScreenContent.tsx | 26 + aris/components/ui/button.tsx | 108 ++ aris/components/ui/card.tsx | 52 + aris/components/ui/text.tsx | 89 ++ aris/eslint.config.js | 15 + aris/global.css | 58 + aris/lib/theme.ts | 81 ++ aris/lib/utils.ts | 6 + aris/metro.config.js | 13 + aris/nativewind-env.d.ts | 2 + aris/package.json | 54 + aris/prettier.config.js | 10 + aris/store/store.ts | 15 + aris/tailwind.config.js | 73 + aris/tsconfig.json | 11 + 38 files changed, 3179 insertions(+) create mode 100644 aris/.gitignore create mode 100644 aris/app.json create mode 100644 aris/app/(tabs)/_layout.tsx create mode 100644 aris/app/(tabs)/index.tsx create mode 100644 aris/app/(tabs)/orchestrator.tsx create mode 100644 aris/app/(tabs)/settings.tsx create mode 100644 aris/app/(tabs)/stocks.tsx create mode 100644 aris/app/(tabs)/todos.tsx create mode 100644 aris/app/+html.tsx create mode 100644 aris/app/+not-found.tsx create mode 100644 aris/app/_layout.tsx create mode 100644 aris/app/details.tsx create mode 100644 aris/assets/adaptive-icon.png create mode 100644 aris/assets/favicon.png create mode 100644 aris/assets/icon.png create mode 100644 aris/assets/splash.png create mode 100644 aris/babel.config.js create mode 100644 aris/bun.lock create mode 100644 aris/cesconfig.jsonc create mode 100644 aris/components.json create mode 100644 aris/components/Button.tsx create mode 100644 aris/components/Container.tsx create mode 100644 aris/components/EditScreenInfo.tsx create mode 100644 aris/components/ScreenContent.tsx create mode 100644 aris/components/ui/button.tsx create mode 100644 aris/components/ui/card.tsx create mode 100644 aris/components/ui/text.tsx create mode 100644 aris/eslint.config.js create mode 100644 aris/global.css create mode 100644 aris/lib/theme.ts create mode 100644 aris/lib/utils.ts create mode 100644 aris/metro.config.js create mode 100644 aris/nativewind-env.d.ts create mode 100644 aris/package.json create mode 100644 aris/prettier.config.js create mode 100644 aris/store/store.ts create mode 100644 aris/tailwind.config.js create mode 100644 aris/tsconfig.json diff --git a/aris/.gitignore b/aris/.gitignore new file mode 100644 index 0000000..2ff55da --- /dev/null +++ b/aris/.gitignore @@ -0,0 +1,24 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ +# expo router +expo-env.d.ts + + + +ios +android + +# macOS +.DS_Store + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* \ No newline at end of file diff --git a/aris/app.json b/aris/app.json new file mode 100644 index 0000000..80ee23c --- /dev/null +++ b/aris/app.json @@ -0,0 +1,44 @@ +{ + "expo": { + "name": "aris", + "slug": "aris", + "version": "1.0.0", + + "scheme": "aris", + "platforms": ["ios", "android"], + "web": { + "bundler": "metro", + "output": "static", + "favicon": "./assets/favicon.png" + }, + "plugins": ["expo-router"], + "experiments": { + "typedRoutes": true, + + "tsconfigPaths": true + }, + + "orientation": "portrait", + "icon": "./assets/icon.png", + + "userInterfaceStyle": "light", + + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "assetBundlePatterns": ["**/*"], + "ios": { + "supportsTablet": true, + "bundleIdentifier": "sh.nym.aris" + }, + "android": { + "package": "sh.nym.aris", + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#ffffff" + } + } + } +} diff --git a/aris/app/(tabs)/_layout.tsx b/aris/app/(tabs)/_layout.tsx new file mode 100644 index 0000000..ba04a8d --- /dev/null +++ b/aris/app/(tabs)/_layout.tsx @@ -0,0 +1,81 @@ +import { Ionicons } from "@expo/vector-icons"; +import { Tabs } from "expo-router"; + +const iconSize = 22; + +export default function TabLayout() { + return ( + + ( + + ), + }} + /> + ( + + ), + }} + /> + ( + + ), + }} + /> + ( + + ), + }} + /> + ( + + ), + }} + /> + + ); +} diff --git a/aris/app/(tabs)/index.tsx b/aris/app/(tabs)/index.tsx new file mode 100644 index 0000000..5b09c48 --- /dev/null +++ b/aris/app/(tabs)/index.tsx @@ -0,0 +1,22 @@ +import { View } from "react-native"; + +import { Container } from "@/components/Container"; +import { Text } from "@/components/ui/text"; + +export default function BleScreen() { + return ( + + + BLE + + Port of SwiftUI BleStatusView will live here. + + + + ); +} + +const styles = { + container: "flex flex-1 bg-white", + subtitle: "mt-2 text-sm text-muted-foreground", +}; diff --git a/aris/app/(tabs)/orchestrator.tsx b/aris/app/(tabs)/orchestrator.tsx new file mode 100644 index 0000000..22219cf --- /dev/null +++ b/aris/app/(tabs)/orchestrator.tsx @@ -0,0 +1,22 @@ +import { View } from "react-native"; + +import { Container } from "@/components/Container"; +import { Text } from "@/components/ui/text"; + +export default function OrchestratorScreen() { + return ( + + + Orchestrator + + Port of SwiftUI OrchestratorView will live here. + + + + ); +} + +const styles = { + container: "flex flex-1 bg-white", + subtitle: "mt-2 text-sm text-muted-foreground", +}; diff --git a/aris/app/(tabs)/settings.tsx b/aris/app/(tabs)/settings.tsx new file mode 100644 index 0000000..00141a6 --- /dev/null +++ b/aris/app/(tabs)/settings.tsx @@ -0,0 +1,22 @@ +import { View } from "react-native"; + +import { Container } from "@/components/Container"; +import { Text } from "@/components/ui/text"; + +export default function SettingsScreen() { + return ( + + + Settings + + Port of SwiftUI SettingsView will live here. + + + + ); +} + +const styles = { + container: "flex flex-1 bg-white", + subtitle: "mt-2 text-sm text-muted-foreground", +}; diff --git a/aris/app/(tabs)/stocks.tsx b/aris/app/(tabs)/stocks.tsx new file mode 100644 index 0000000..8bdf744 --- /dev/null +++ b/aris/app/(tabs)/stocks.tsx @@ -0,0 +1,22 @@ +import { View } from "react-native"; + +import { Container } from "@/components/Container"; +import { Text } from "@/components/ui/text"; + +export default function StocksScreen() { + return ( + + + Stocks + + Port of SwiftUI StockSettingsView will live here. + + + + ); +} + +const styles = { + container: "flex flex-1 bg-white", + subtitle: "mt-2 text-sm text-muted-foreground", +}; diff --git a/aris/app/(tabs)/todos.tsx b/aris/app/(tabs)/todos.tsx new file mode 100644 index 0000000..4d31647 --- /dev/null +++ b/aris/app/(tabs)/todos.tsx @@ -0,0 +1,22 @@ +import { View } from "react-native"; + +import { Container } from "@/components/Container"; +import { Text } from "@/components/ui/text"; + +export default function TodosScreen() { + return ( + + + Todos + + Port of SwiftUI TodosView will live here. + + + + ); +} + +const styles = { + container: "flex flex-1 bg-white", + subtitle: "mt-2 text-sm text-muted-foreground", +}; diff --git a/aris/app/+html.tsx b/aris/app/+html.tsx new file mode 100644 index 0000000..2fe2848 --- /dev/null +++ b/aris/app/+html.tsx @@ -0,0 +1,46 @@ +import { ScrollViewStyleReset } from 'expo-router/html'; + +// This file is web-only and used to configure the root HTML for every +// web page during static rendering. +// The contents of this function only run in Node.js environments and +// do not have access to the DOM or browser APIs. +export default function Root({ children }: { children: React.ReactNode }) { + return ( + + + + + + {/* + This viewport disables scaling which makes the mobile website act more like a native app. + However this does reduce built-in accessibility. If you want to enable scaling, use this instead: + + */} + + {/* + Disable body scrolling on web. This makes ScrollView components work closer to how they do on native. + However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line. + */} + + + {/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */} +