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:
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal 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
3
AGENTS.md
Normal 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
36
CLAUDE.md
Normal 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
21
LICENSE
Normal 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
56
app.json
Normal 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."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
assets/android-icon-background.png
Normal file
BIN
assets/android-icon-background.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
assets/android-icon-foreground.png
Normal file
BIN
assets/android-icon-foreground.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 77 KiB |
BIN
assets/android-icon-monochrome.png
Normal file
BIN
assets/android-icon-monochrome.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
BIN
assets/favicon.png
Normal file
BIN
assets/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/icon.png
Normal file
BIN
assets/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 384 KiB |
BIN
assets/splash-icon.png
Normal file
BIN
assets/splash-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
11
metro.config.js
Normal file
11
metro.config.js
Normal 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
7756
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
42
package.json
Normal file
42
package.json
Normal 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
11
tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"extends": "expo/tsconfig.base",
|
||||||
|
"compilerOptions": {
|
||||||
|
"strict": true,
|
||||||
|
"ignoreDeprecations": "6.0",
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user