chore: initialize Expo SDK 55 project with TypeScript

React Native + Expo Router setup with strict TypeScript,
path aliases, and dark-first configuration.
This commit is contained in:
Mathis Pruvot
2026-05-28 11:48:49 +00:00
commit 961d29ebe8
16 changed files with 7950 additions and 0 deletions

13
.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
node_modules/
.expo/
android/
ios/
dist/
.env
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/

3
AGENTS.md Normal file
View File

@@ -0,0 +1,3 @@
# Expo HAS CHANGED
Read the exact versioned docs at https://docs.expo.dev/versions/v56.0.0/ before writing any code.

36
CLAUDE.md Normal file
View File

@@ -0,0 +1,36 @@
# Lively — Live Wallpapers App
## Stack
- React Native (Expo SDK 55+, New Architecture)
- TypeScript strict
- Expo Router v4 (file-based routing)
- @shopify/react-native-skia v2.6+ (GPU shaders SkSL)
- react-native-reanimated 3 (animation orchestration)
- react-native-gesture-handler (touch/drag)
- Zustand + MMKV (state + persistence)
- expo-blur (glassmorphism blur backing)
## Architecture
- `app/` — Expo Router screens (file-based)
- `src/components/glass/` — Design system glassmorphism
- `src/shaders/` — SkSL fragment shaders (animations)
- `src/hooks/` — React hooks (animation, gyroscope, export)
- `src/stores/` — Zustand stores (wallpaper, settings)
- `src/services/` — Media access, ML pipeline
- `src/theme/` — Colors, glass constants, typography, spacing
- `src/types/` — TypeScript type definitions
- `modules/` — Expo native modules (Android WallpaperService, iOS Live Photo)
## Conventions
- Imports: `@/` alias pour `src/`
- Named exports partout sauf screens (default export)
- Shaders SkSL compilés via `Skia.RuntimeEffect.Make()`
- Uniforms standard: resolution, time, intensity, speed + spécifiques
- État global: Zustand, pas de Context API sauf providers Expo
## Design System
- Dark-first, glassmorphism
- Blur backing via expo-blur
- Bordures `rgba(255,255,255,0.10)` 1px
- Palette dans `src/theme/colors.ts`
- Teintes dérivées des images utilisateur, pas de couleurs d'accent vives

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

56
app.json Normal file
View File

@@ -0,0 +1,56 @@
{
"expo": {
"name": "Lively",
"slug": "lively",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "dark",
"scheme": "lively",
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.lively.app",
"infoPlist": {
"NSPhotoLibraryUsageDescription": "Lively needs access to your photos to create animated wallpapers.",
"NSPhotoLibraryAddUsageDescription": "Lively needs to save Live Photos to your library.",
"NSMotionUsageDescription": "Lively uses motion data for parallax wallpaper effects."
}
},
"android": {
"package": "com.lively.app",
"adaptiveIcon": {
"backgroundColor": "#0A0A0F",
"foregroundImage": "./assets/android-icon-foreground.png",
"backgroundImage": "./assets/android-icon-background.png",
"monochromeImage": "./assets/android-icon-monochrome.png"
},
"permissions": [
"android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.SET_WALLPAPER"
]
},
"web": {
"favicon": "./assets/favicon.png",
"bundler": "metro"
},
"plugins": [
"expo-router",
"expo-status-bar",
[
"expo-media-library",
{
"photosPermission": "Lively needs access to your photos to create animated wallpapers.",
"savePhotosPermission": "Lively needs to save Live Photos to your library.",
"isAccessMediaLocationEnabled": true
}
],
[
"expo-sensors",
{
"motionPermission": "Lively uses motion data for parallax wallpaper effects."
}
]
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
assets/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

BIN
assets/splash-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

1
index.ts Normal file
View File

@@ -0,0 +1 @@
import "expo-router/entry";

11
metro.config.js Normal file
View File

@@ -0,0 +1,11 @@
const { getDefaultConfig } = require("expo/metro-config");
const path = require("path");
const config = getDefaultConfig(__dirname);
// Path alias: @/ → src/
config.resolver.alias = {
"@": path.resolve(__dirname, "src"),
};
module.exports = config;

7756
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

42
package.json Normal file
View File

@@ -0,0 +1,42 @@
{
"name": "lively",
"version": "1.0.0",
"main": "expo-router/entry",
"dependencies": {
"@react-navigation/bottom-tabs": "^7.16.2",
"@shopify/react-native-skia": "2.6.2",
"expo": "~56.0.6",
"expo-blur": "~56.0.3",
"expo-constants": "~56.0.16",
"expo-file-system": "~56.0.7",
"expo-haptics": "~56.0.3",
"expo-image-manipulator": "~56.0.15",
"expo-image-picker": "~56.0.14",
"expo-linking": "~56.0.12",
"expo-media-library": "~56.0.6",
"expo-router": "~56.2.7",
"expo-sensors": "~56.0.5",
"expo-status-bar": "~56.0.4",
"phosphor-react-native": "^3.0.6",
"react": "19.2.3",
"react-native": "0.85.3",
"react-native-gesture-handler": "~2.31.1",
"react-native-mmkv": "^4.3.1",
"react-native-reanimated": "4.3.1",
"react-native-safe-area-context": "~5.7.0",
"react-native-screens": "4.25.2",
"react-native-svg": "^15.15.5",
"zustand": "^5.0.13"
},
"devDependencies": {
"@types/react": "~19.2.2",
"typescript": "~6.0.3"
},
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web"
},
"private": true
}

11
tsconfig.json Normal file
View File

@@ -0,0 +1,11 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
"ignoreDeprecations": "6.0",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
}