-
© 2024 ManaChat. Powered by Mana Core.
+
+
+
+
+
100% Kostenlos starten
+
+
+
+
+
Keine Kreditkarte nötig
+
-
+
-
+
+
+
diff --git a/chat/apps/landing/src/styles/global.css b/chat/apps/landing/src/styles/global.css
new file mode 100644
index 000000000..2b440e58d
--- /dev/null
+++ b/chat/apps/landing/src/styles/global.css
@@ -0,0 +1,103 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+/* ManaChat Theme CSS Variables - Sky Blue */
+:root {
+ /* Primary colors - ManaChat Sky Blue */
+ --color-primary: #0ea5e9;
+ --color-primary-hover: #38bdf8;
+ --color-primary-glow: rgba(14, 165, 233, 0.3);
+
+ /* Text colors */
+ --color-text-primary: #f9fafb;
+ --color-text-secondary: #d1d5db;
+ --color-text-muted: #6b7280;
+
+ /* Background colors */
+ --color-background-page: #0c1929;
+ --color-background-card: #142236;
+ --color-background-card-hover: #1e3a50;
+
+ /* Border colors */
+ --color-border: #1e3a50;
+ --color-border-hover: #2d5a73;
+}
+
+/* Base styles */
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: 'Inter', system-ui, sans-serif;
+ background-color: var(--color-background-page);
+ color: var(--color-text-primary);
+ line-height: 1.6;
+}
+
+/* Custom scrollbar */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--color-background-card);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--color-border);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-border-hover);
+}
+
+/* Selection */
+::selection {
+ background-color: var(--color-primary);
+ color: white;
+}
+
+/* Focus styles */
+:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+/* Gradient text */
+.text-gradient {
+ background: linear-gradient(135deg, #0ea5e9 0%, #38bdf8 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+/* Animation utilities */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-fadeIn {
+ animation: fadeIn 0.6s ease-out forwards;
+}
+
+/* Button styles */
+.btn-primary {
+ @apply inline-flex items-center justify-center px-6 py-3 bg-primary text-white font-semibold rounded-lg transition-all duration-200;
+ @apply hover:bg-primary-hover hover:shadow-lg hover:shadow-primary-glow;
+}
+
+.btn-secondary {
+ @apply inline-flex items-center justify-center px-6 py-3 border border-border text-text-primary font-semibold rounded-lg transition-all duration-200;
+ @apply hover:border-border-hover hover:bg-background-card;
+}
diff --git a/chat/apps/landing/tailwind.config.mjs b/chat/apps/landing/tailwind.config.mjs
index c751e832a..f2ab388b1 100644
--- a/chat/apps/landing/tailwind.config.mjs
+++ b/chat/apps/landing/tailwind.config.mjs
@@ -1,28 +1,39 @@
/** @type {import('tailwindcss').Config} */
export default {
- content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
+ content: [
+ './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
+ '../../packages/shared-landing-ui/src/**/*.{astro,html,js,jsx,ts,tsx}'
+ ],
theme: {
extend: {
colors: {
+ // ManaChat Sky Blue Theme
primary: {
- 50: '#eff6ff',
- 100: '#dbeafe',
- 200: '#bfdbfe',
- 300: '#93c5fd',
- 400: '#60a5fa',
- 500: '#0A84FF',
- 600: '#2563eb',
- 700: '#1d4ed8',
- 800: '#1e40af',
- 900: '#1e3a8a',
+ DEFAULT: '#0ea5e9',
+ hover: '#38bdf8',
+ glow: 'rgba(14, 165, 233, 0.3)'
},
- secondary: {
- 500: '#5E5CE6',
+ background: {
+ page: '#0c1929',
+ card: '#142236',
+ 'card-hover': '#1e3a50'
+ },
+ text: {
+ primary: '#f9fafb',
+ secondary: '#d1d5db',
+ muted: '#6b7280'
+ },
+ border: {
+ DEFAULT: '#1e3a50',
+ hover: '#2d5a73'
}
+ },
+ fontFamily: {
+ sans: ['Inter', 'system-ui', 'sans-serif']
}
- },
+ }
},
plugins: [
- require('@tailwindcss/typography'),
- ],
+ require('@tailwindcss/typography')
+ ]
};
diff --git a/news/.env.example b/news/.env.example
new file mode 100644
index 000000000..6e04ee62d
--- /dev/null
+++ b/news/.env.example
@@ -0,0 +1,12 @@
+# Database
+DATABASE_URL=postgresql://news:news_dev_password@localhost:5432/news_hub
+
+# API
+API_PORT=3000
+API_URL=http://localhost:3000
+
+# Better Auth
+BETTER_AUTH_SECRET=your-super-secret-key-change-in-production
+
+# Mobile App
+EXPO_PUBLIC_API_URL=http://localhost:3000
diff --git a/news/.gitignore b/news/.gitignore
new file mode 100644
index 000000000..aafb59caa
--- /dev/null
+++ b/news/.gitignore
@@ -0,0 +1,52 @@
+# Dependencies
+node_modules/
+.pnpm-store/
+
+# Build outputs
+dist/
+build/
+.next/
+.turbo/
+
+# Environment
+.env
+.env.local
+.env.*.local
+
+# IDE
+.idea/
+.vscode/
+*.swp
+*.swo
+.DS_Store
+
+# Logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Testing
+coverage/
+
+# Expo
+.expo/
+*.jks
+*.p8
+*.p12
+*.key
+*.mobileprovision
+*.orig.*
+web-build/
+
+# Native builds
+apps/mobile/ios/
+apps/mobile/android/
+
+# Database
+packages/database/drizzle/
+
+# Misc
+*.tgz
+.cache/
diff --git a/news/MigrationPlan-Unified-App.md b/news/MigrationPlan-Unified-App.md
new file mode 100644
index 000000000..fcbafed6a
--- /dev/null
+++ b/news/MigrationPlan-Unified-App.md
@@ -0,0 +1,1526 @@
+# Migrationsplan: Unified News Hub
+
+## Übersicht
+
+Migration von **ainews** + **kokon** zu einer vereinten App mit:
+- **PostgreSQL** (Docker lokal, später Cloud)
+- **Drizzle ORM** (Type-safe Database)
+- **NestJS** (Backend API)
+- **Better Auth** (Authentication)
+
+---
+
+## Ziel-Architektur
+
+```
+news/
+├── apps/
+│ ├── mobile/ # React Native/Expo App (vereint)
+│ └── api/ # NestJS Backend
+├── packages/
+│ ├── database/ # Drizzle Schema + Migrations
+│ ├── shared/ # Shared Types & Utilities
+│ └── browser-extension/ # Chrome Extension
+├── docker/
+│ └── docker-compose.yml # PostgreSQL + Dev Services
+├── package.json # Monorepo Root (pnpm workspaces)
+└── turbo.json # Turborepo Config (optional)
+```
+
+### Datenfluss
+
+```
+┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
+│ Mobile App │────▶│ NestJS API │────▶│ PostgreSQL │
+│ (Expo/RN) │◀────│ + Better Auth │◀────│ (Docker) │
+└─────────────────┘ └─────────────────┘ └─────────────────┘
+ │ │
+ │ ┌────────┴────────┐
+ │ │ │
+┌────────▼────────┐ │ ┌───────────▼───────────┐
+│ Browser Extension│─────┘ │ Content Extraction │
+│ (Chrome/Firefox) │ │ (Readability) │
+└─────────────────┘ └───────────────────────┘
+```
+
+---
+
+## Phase 1: Monorepo Setup
+
+### 1.1 Projekt-Struktur erstellen
+
+```bash
+# Im news/ Ordner
+pnpm init
+
+# Workspace-Struktur
+mkdir -p apps/mobile apps/api packages/database packages/shared packages/browser-extension docker
+```
+
+### 1.2 Root `package.json`
+
+```json
+{
+ "name": "news-hub",
+ "private": true,
+ "scripts": {
+ "dev": "turbo run dev",
+ "build": "turbo run build",
+ "db:generate": "turbo run db:generate --filter=@news/database",
+ "db:migrate": "turbo run db:migrate --filter=@news/database",
+ "db:studio": "turbo run db:studio --filter=@news/database"
+ },
+ "devDependencies": {
+ "turbo": "^2.0.0",
+ "typescript": "^5.4.0"
+ },
+ "packageManager": "pnpm@9.0.0",
+ "workspaces": [
+ "apps/*",
+ "packages/*"
+ ]
+}
+```
+
+### 1.3 `turbo.json`
+
+```json
+{
+ "$schema": "https://turbo.build/schema.json",
+ "tasks": {
+ "build": {
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**", ".next/**", "build/**"]
+ },
+ "dev": {
+ "cache": false,
+ "persistent": true
+ },
+ "db:generate": {},
+ "db:migrate": {},
+ "db:studio": {
+ "cache": false,
+ "persistent": true
+ }
+ }
+}
+```
+
+---
+
+## Phase 2: Docker Setup
+
+### 2.1 `docker/docker-compose.yml`
+
+```yaml
+version: '3.9'
+
+services:
+ postgres:
+ image: postgres:16-alpine
+ container_name: news-hub-db
+ restart: unless-stopped
+ environment:
+ POSTGRES_USER: news
+ POSTGRES_PASSWORD: news_dev_password
+ POSTGRES_DB: news_hub
+ ports:
+ - "5432:5432"
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ - ./init.sql:/docker-entrypoint-initdb.d/init.sql
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U news -d news_hub"]
+ interval: 5s
+ timeout: 5s
+ retries: 5
+
+ # Optional: pgAdmin für DB-Verwaltung
+ pgadmin:
+ image: dpage/pgadmin4:latest
+ container_name: news-hub-pgadmin
+ restart: unless-stopped
+ environment:
+ PGADMIN_DEFAULT_EMAIL: admin@local.dev
+ PGADMIN_DEFAULT_PASSWORD: admin
+ ports:
+ - "5050:80"
+ depends_on:
+ - postgres
+
+volumes:
+ postgres_data:
+```
+
+### 2.2 `docker/init.sql`
+
+```sql
+-- Extensions
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
+CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- Für Textsuche
+
+-- Grants
+GRANT ALL PRIVILEGES ON DATABASE news_hub TO news;
+```
+
+### 2.3 Start-Script in Root `package.json`
+
+```json
+{
+ "scripts": {
+ "docker:up": "docker-compose -f docker/docker-compose.yml up -d",
+ "docker:down": "docker-compose -f docker/docker-compose.yml down",
+ "docker:logs": "docker-compose -f docker/docker-compose.yml logs -f"
+ }
+}
+```
+
+---
+
+## Phase 3: Database Package (Drizzle)
+
+### 3.1 `packages/database/package.json`
+
+```json
+{
+ "name": "@news/database",
+ "version": "1.0.0",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "scripts": {
+ "build": "tsup src/index.ts --format cjs,esm --dts",
+ "db:generate": "drizzle-kit generate",
+ "db:migrate": "drizzle-kit migrate",
+ "db:push": "drizzle-kit push",
+ "db:studio": "drizzle-kit studio"
+ },
+ "dependencies": {
+ "drizzle-orm": "^0.36.0",
+ "postgres": "^3.4.0"
+ },
+ "devDependencies": {
+ "drizzle-kit": "^0.28.0",
+ "tsup": "^8.0.0",
+ "typescript": "^5.4.0"
+ }
+}
+```
+
+### 3.2 `packages/database/drizzle.config.ts`
+
+```typescript
+import { defineConfig } from 'drizzle-kit';
+
+export default defineConfig({
+ schema: './src/schema/index.ts',
+ out: './drizzle',
+ dialect: 'postgresql',
+ dbCredentials: {
+ url: process.env.DATABASE_URL || 'postgresql://news:news_dev_password@localhost:5432/news_hub',
+ },
+});
+```
+
+### 3.3 `packages/database/src/schema/index.ts`
+
+```typescript
+export * from './users';
+export * from './articles';
+export * from './categories';
+export * from './interactions';
+export * from './auth';
+```
+
+### 3.4 `packages/database/src/schema/users.ts`
+
+```typescript
+import { pgTable, uuid, text, timestamp, boolean, pgEnum } from 'drizzle-orm/pg-core';
+
+export const userTierEnum = pgEnum('user_tier', ['free', 'premium', 'enterprise']);
+export const readingSpeedEnum = pgEnum('reading_speed', ['slow', 'normal', 'fast']);
+
+export const users = pgTable('users', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ email: text('email').notNull().unique(),
+ name: text('name'),
+ avatarUrl: text('avatar_url'),
+
+ // Preferences
+ tier: userTierEnum('tier').default('free').notNull(),
+ readingSpeed: readingSpeedEnum('reading_speed').default('normal').notNull(),
+ preferredCategories: text('preferred_categories').array(),
+ blockedSources: text('blocked_sources').array(),
+
+ // Settings
+ onboardingCompleted: boolean('onboarding_completed').default(false).notNull(),
+ notificationSettings: text('notification_settings'), // JSON string
+
+ // Timestamps
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+export type User = typeof users.$inferSelect;
+export type NewUser = typeof users.$inferInsert;
+```
+
+### 3.5 `packages/database/src/schema/articles.ts`
+
+```typescript
+import { pgTable, uuid, text, timestamp, boolean, integer, real, pgEnum, index } from 'drizzle-orm/pg-core';
+import { users } from './users';
+import { categories } from './categories';
+
+export const articleTypeEnum = pgEnum('article_type', ['feed', 'summary', 'in_depth', 'saved']);
+export const articleSourceEnum = pgEnum('article_source', ['ai', 'user_saved']);
+export const summaryPeriodEnum = pgEnum('summary_period', ['morning', 'noon', 'evening', 'night']);
+
+export const articles = pgTable('articles', {
+ id: uuid('id').primaryKey().defaultRandom(),
+
+ // Core fields
+ type: articleTypeEnum('type').notNull(),
+ sourceOrigin: articleSourceEnum('source_origin').default('ai').notNull(),
+ title: text('title').notNull(),
+ content: text('content').notNull(),
+ summary: text('summary'),
+
+ // For user-saved articles
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }),
+ originalUrl: text('original_url'),
+ parsedContent: text('parsed_content'),
+ isArchived: boolean('is_archived').default(false),
+
+ // Metadata
+ categoryId: uuid('category_id').references(() => categories.id),
+ sourceUrl: text('source_url'),
+ sourceName: text('source_name'),
+ sourceDomain: text('source_domain'),
+ author: text('author'),
+ imageUrl: text('image_url'),
+
+ // AI-generated metadata
+ aiTags: text('ai_tags').array(),
+ sentimentScore: real('sentiment_score'),
+
+ // Reading metrics
+ readingTimeMinutes: integer('reading_time_minutes'),
+ wordCount: integer('word_count'),
+
+ // Summary-specific fields
+ summaryDate: timestamp('summary_date'),
+ summaryPeriod: summaryPeriodEnum('summary_period'),
+ includedArticleIds: uuid('included_article_ids').array(),
+
+ // In-depth specific fields
+ keyInsights: text('key_insights'), // JSON string
+ dataVisualizations: text('data_visualizations'), // JSON string
+ relatedArticleIds: uuid('related_article_ids').array(),
+
+ // Timestamps
+ publishedAt: timestamp('published_at').defaultNow().notNull(),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+}, (table) => ({
+ // Indexes für schnelle Abfragen
+ typeIdx: index('articles_type_idx').on(table.type),
+ userIdx: index('articles_user_idx').on(table.userId),
+ sourceOriginIdx: index('articles_source_origin_idx').on(table.sourceOrigin),
+ publishedAtIdx: index('articles_published_at_idx').on(table.publishedAt),
+ categoryIdx: index('articles_category_idx').on(table.categoryId),
+}));
+
+export type Article = typeof articles.$inferSelect;
+export type NewArticle = typeof articles.$inferInsert;
+```
+
+### 3.6 `packages/database/src/schema/categories.ts`
+
+```typescript
+import { pgTable, uuid, text, timestamp, integer } from 'drizzle-orm/pg-core';
+
+export const categories = pgTable('categories', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ name: text('name').notNull().unique(),
+ displayName: text('display_name').notNull(),
+ description: text('description'),
+ icon: text('icon'),
+ color: text('color'),
+ priority: integer('priority').default(0).notNull(),
+
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+});
+
+export type Category = typeof categories.$inferSelect;
+export type NewCategory = typeof categories.$inferInsert;
+```
+
+### 3.7 `packages/database/src/schema/interactions.ts`
+
+```typescript
+import { pgTable, uuid, timestamp, boolean, real, integer, index, unique } from 'drizzle-orm/pg-core';
+import { users } from './users';
+import { articles } from './articles';
+
+export const userArticleInteractions = pgTable('user_article_interactions', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ articleId: uuid('article_id').references(() => articles.id, { onDelete: 'cascade' }).notNull(),
+
+ // Interaction states
+ isRead: boolean('is_read').default(false).notNull(),
+ isSaved: boolean('is_saved').default(false).notNull(),
+ readProgress: real('read_progress').default(0), // 0.0 to 1.0
+ rating: integer('rating'), // 1-5
+ shareCount: integer('share_count').default(0).notNull(),
+
+ // Timestamps
+ openedAt: timestamp('opened_at'),
+ readAt: timestamp('read_at'),
+ savedAt: timestamp('saved_at'),
+ ratedAt: timestamp('rated_at'),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+}, (table) => ({
+ // Unique constraint: ein User kann nur eine Interaction pro Artikel haben
+ userArticleUnique: unique('user_article_unique').on(table.userId, table.articleId),
+ // Indexes
+ userIdx: index('interactions_user_idx').on(table.userId),
+ articleIdx: index('interactions_article_idx').on(table.articleId),
+}));
+
+export type UserArticleInteraction = typeof userArticleInteractions.$inferSelect;
+export type NewUserArticleInteraction = typeof userArticleInteractions.$inferInsert;
+```
+
+### 3.8 `packages/database/src/schema/auth.ts` (Better Auth)
+
+```typescript
+import { pgTable, uuid, text, timestamp, boolean, integer } from 'drizzle-orm/pg-core';
+import { users } from './users';
+
+// Better Auth Sessions
+export const sessions = pgTable('sessions', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ token: text('token').notNull().unique(),
+ expiresAt: timestamp('expires_at').notNull(),
+ ipAddress: text('ip_address'),
+ userAgent: text('user_agent'),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+// Better Auth Accounts (OAuth providers)
+export const accounts = pgTable('accounts', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ providerId: text('provider_id').notNull(), // 'email', 'google', 'apple', etc.
+ providerAccountId: text('provider_account_id').notNull(),
+ accessToken: text('access_token'),
+ refreshToken: text('refresh_token'),
+ accessTokenExpiresAt: timestamp('access_token_expires_at'),
+ refreshTokenExpiresAt: timestamp('refresh_token_expires_at'),
+ scope: text('scope'),
+ password: text('password'), // Hashed, only for email provider
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+// Better Auth Verification Tokens (Email verification, password reset)
+export const verificationTokens = pgTable('verification_tokens', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ token: text('token').notNull().unique(),
+ type: text('type').notNull(), // 'email_verification', 'password_reset'
+ expiresAt: timestamp('expires_at').notNull(),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+});
+```
+
+### 3.9 `packages/database/src/index.ts`
+
+```typescript
+import { drizzle } from 'drizzle-orm/postgres-js';
+import postgres from 'postgres';
+import * as schema from './schema';
+
+export * from './schema';
+
+const connectionString = process.env.DATABASE_URL || 'postgresql://news:news_dev_password@localhost:5432/news_hub';
+
+// For query purposes
+const queryClient = postgres(connectionString);
+export const db = drizzle(queryClient, { schema });
+
+// For migrations (uses different client settings)
+export const createMigrationClient = () => {
+ const migrationClient = postgres(connectionString, { max: 1 });
+ return drizzle(migrationClient, { schema });
+};
+```
+
+---
+
+## Phase 4: NestJS Backend
+
+### 4.1 `apps/api/package.json`
+
+```json
+{
+ "name": "@news/api",
+ "version": "1.0.0",
+ "scripts": {
+ "build": "nest build",
+ "dev": "nest start --watch",
+ "start": "nest start",
+ "start:prod": "node dist/main"
+ },
+ "dependencies": {
+ "@nestjs/common": "^10.0.0",
+ "@nestjs/core": "^10.0.0",
+ "@nestjs/platform-fastify": "^10.0.0",
+ "@news/database": "workspace:*",
+ "better-auth": "^1.0.0",
+ "@mozilla/readability": "^0.5.0",
+ "jsdom": "^24.0.0",
+ "class-validator": "^0.14.0",
+ "class-transformer": "^0.5.1"
+ },
+ "devDependencies": {
+ "@nestjs/cli": "^10.0.0",
+ "@types/node": "^20.0.0",
+ "typescript": "^5.4.0"
+ }
+}
+```
+
+### 4.2 `apps/api/src/main.ts`
+
+```typescript
+import { NestFactory } from '@nestjs/core';
+import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
+import { ValidationPipe } from '@nestjs/common';
+import { AppModule } from './app.module';
+
+async function bootstrap() {
+ const app = await NestFactory.create
(
+ AppModule,
+ new FastifyAdapter()
+ );
+
+ app.enableCors({
+ origin: [
+ 'http://localhost:8081', // Expo web
+ 'http://localhost:19006', // Expo web alt
+ 'exp://*', // Expo Go
+ ],
+ credentials: true,
+ });
+
+ app.useGlobalPipes(new ValidationPipe({
+ whitelist: true,
+ transform: true,
+ }));
+
+ await app.listen(3000, '0.0.0.0');
+ console.log('API running on http://localhost:3000');
+}
+
+bootstrap();
+```
+
+### 4.3 `apps/api/src/app.module.ts`
+
+```typescript
+import { Module } from '@nestjs/common';
+import { ConfigModule } from '@nestjs/config';
+import { DatabaseModule } from './database/database.module';
+import { AuthModule } from './auth/auth.module';
+import { ArticlesModule } from './articles/articles.module';
+import { CategoriesModule } from './categories/categories.module';
+import { UsersModule } from './users/users.module';
+import { ContentExtractionModule } from './content-extraction/content-extraction.module';
+
+@Module({
+ imports: [
+ ConfigModule.forRoot({ isGlobal: true }),
+ DatabaseModule,
+ AuthModule,
+ ArticlesModule,
+ CategoriesModule,
+ UsersModule,
+ ContentExtractionModule,
+ ],
+})
+export class AppModule {}
+```
+
+### 4.4 `apps/api/src/database/database.module.ts`
+
+```typescript
+import { Module, Global } from '@nestjs/common';
+import { db } from '@news/database';
+
+export const DATABASE_CONNECTION = 'DATABASE_CONNECTION';
+
+@Global()
+@Module({
+ providers: [
+ {
+ provide: DATABASE_CONNECTION,
+ useValue: db,
+ },
+ ],
+ exports: [DATABASE_CONNECTION],
+})
+export class DatabaseModule {}
+```
+
+### 4.5 `apps/api/src/auth/auth.module.ts` (Better Auth)
+
+```typescript
+import { Module } from '@nestjs/common';
+import { AuthController } from './auth.controller';
+import { AuthService } from './auth.service';
+import { BetterAuthService } from './better-auth.service';
+
+@Module({
+ controllers: [AuthController],
+ providers: [AuthService, BetterAuthService],
+ exports: [AuthService, BetterAuthService],
+})
+export class AuthModule {}
+```
+
+### 4.6 `apps/api/src/auth/better-auth.service.ts`
+
+```typescript
+import { Injectable } from '@nestjs/common';
+import { betterAuth } from 'better-auth';
+import { drizzleAdapter } from 'better-auth/adapters/drizzle';
+import { db, users, sessions, accounts, verificationTokens } from '@news/database';
+
+@Injectable()
+export class BetterAuthService {
+ public auth = betterAuth({
+ database: drizzleAdapter(db, {
+ provider: 'pg',
+ schema: {
+ user: users,
+ session: sessions,
+ account: accounts,
+ verification: verificationTokens,
+ },
+ }),
+ emailAndPassword: {
+ enabled: true,
+ requireEmailVerification: false, // Für MVP erstmal aus
+ },
+ session: {
+ expiresIn: 60 * 60 * 24 * 7, // 7 days
+ updateAge: 60 * 60 * 24, // 1 day
+ },
+ // Optional: OAuth providers
+ // socialProviders: {
+ // google: {
+ // clientId: process.env.GOOGLE_CLIENT_ID!,
+ // clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
+ // },
+ // apple: {
+ // clientId: process.env.APPLE_CLIENT_ID!,
+ // clientSecret: process.env.APPLE_CLIENT_SECRET!,
+ // },
+ // },
+ });
+}
+```
+
+### 4.7 `apps/api/src/auth/auth.controller.ts`
+
+```typescript
+import { Controller, Post, Get, Body, Req, Res, UseGuards } from '@nestjs/common';
+import { FastifyRequest, FastifyReply } from 'fastify';
+import { BetterAuthService } from './better-auth.service';
+
+@Controller('auth')
+export class AuthController {
+ constructor(private betterAuth: BetterAuthService) {}
+
+ @Post('signup')
+ async signUp(
+ @Body() body: { email: string; password: string; name?: string },
+ @Req() req: FastifyRequest,
+ @Res() res: FastifyReply,
+ ) {
+ return this.betterAuth.auth.api.signUpEmail({
+ body,
+ headers: req.headers as any,
+ });
+ }
+
+ @Post('signin')
+ async signIn(
+ @Body() body: { email: string; password: string },
+ @Req() req: FastifyRequest,
+ ) {
+ return this.betterAuth.auth.api.signInEmail({
+ body,
+ headers: req.headers as any,
+ });
+ }
+
+ @Post('signout')
+ async signOut(@Req() req: FastifyRequest) {
+ return this.betterAuth.auth.api.signOut({
+ headers: req.headers as any,
+ });
+ }
+
+ @Get('session')
+ async getSession(@Req() req: FastifyRequest) {
+ return this.betterAuth.auth.api.getSession({
+ headers: req.headers as any,
+ });
+ }
+}
+```
+
+### 4.8 `apps/api/src/articles/articles.module.ts`
+
+```typescript
+import { Module } from '@nestjs/common';
+import { ArticlesController } from './articles.controller';
+import { ArticlesService } from './articles.service';
+
+@Module({
+ controllers: [ArticlesController],
+ providers: [ArticlesService],
+ exports: [ArticlesService],
+})
+export class ArticlesModule {}
+```
+
+### 4.9 `apps/api/src/articles/articles.service.ts`
+
+```typescript
+import { Injectable, Inject } from '@nestjs/common';
+import { eq, and, desc, sql } from 'drizzle-orm';
+import { DATABASE_CONNECTION } from '../database/database.module';
+import { db, articles, Article, NewArticle } from '@news/database';
+
+@Injectable()
+export class ArticlesService {
+ constructor(@Inject(DATABASE_CONNECTION) private db: typeof db) {}
+
+ // AI-generierte Artikel (feed, summary, in_depth)
+ async getAIArticles(options: {
+ type?: 'feed' | 'summary' | 'in_depth';
+ categoryId?: string;
+ limit?: number;
+ offset?: number;
+ }): Promise {
+ const { type, categoryId, limit = 20, offset = 0 } = options;
+
+ let query = this.db
+ .select()
+ .from(articles)
+ .where(eq(articles.sourceOrigin, 'ai'))
+ .orderBy(desc(articles.publishedAt))
+ .limit(limit)
+ .offset(offset);
+
+ if (type) {
+ query = query.where(and(
+ eq(articles.sourceOrigin, 'ai'),
+ eq(articles.type, type)
+ ));
+ }
+
+ if (categoryId) {
+ query = query.where(and(
+ eq(articles.sourceOrigin, 'ai'),
+ eq(articles.categoryId, categoryId)
+ ));
+ }
+
+ return query;
+ }
+
+ // User-gespeicherte Artikel
+ async getSavedArticles(userId: string, includeArchived = false): Promise {
+ const conditions = [
+ eq(articles.sourceOrigin, 'user_saved'),
+ eq(articles.userId, userId),
+ ];
+
+ if (!includeArchived) {
+ conditions.push(eq(articles.isArchived, false));
+ }
+
+ return this.db
+ .select()
+ .from(articles)
+ .where(and(...conditions))
+ .orderBy(desc(articles.createdAt));
+ }
+
+ // Artikel speichern (für Content Extraction)
+ async createSavedArticle(data: {
+ userId: string;
+ title: string;
+ content: string;
+ parsedContent: string;
+ originalUrl: string;
+ }): Promise {
+ const [article] = await this.db
+ .insert(articles)
+ .values({
+ type: 'saved',
+ sourceOrigin: 'user_saved',
+ userId: data.userId,
+ title: data.title,
+ content: data.content,
+ parsedContent: data.parsedContent,
+ originalUrl: data.originalUrl,
+ isArchived: false,
+ })
+ .returning();
+
+ return article;
+ }
+
+ // Artikel archivieren
+ async archiveArticle(articleId: string, userId: string): Promise {
+ await this.db
+ .update(articles)
+ .set({ isArchived: true, updatedAt: new Date() })
+ .where(and(
+ eq(articles.id, articleId),
+ eq(articles.userId, userId)
+ ));
+ }
+
+ // Artikel löschen
+ async deleteArticle(articleId: string, userId: string): Promise {
+ await this.db
+ .delete(articles)
+ .where(and(
+ eq(articles.id, articleId),
+ eq(articles.userId, userId)
+ ));
+ }
+
+ // Einzelnen Artikel laden
+ async getArticleById(articleId: string): Promise {
+ const [article] = await this.db
+ .select()
+ .from(articles)
+ .where(eq(articles.id, articleId))
+ .limit(1);
+
+ return article || null;
+ }
+}
+```
+
+### 4.10 `apps/api/src/articles/articles.controller.ts`
+
+```typescript
+import { Controller, Get, Post, Delete, Param, Query, Body, UseGuards, Req } from '@nestjs/common';
+import { ArticlesService } from './articles.service';
+import { AuthGuard } from '../auth/auth.guard';
+
+@Controller('articles')
+export class ArticlesController {
+ constructor(private articlesService: ArticlesService) {}
+
+ // Öffentliche AI-Artikel
+ @Get()
+ async getArticles(
+ @Query('type') type?: 'feed' | 'summary' | 'in_depth',
+ @Query('categoryId') categoryId?: string,
+ @Query('limit') limit?: string,
+ @Query('offset') offset?: string,
+ ) {
+ return this.articlesService.getAIArticles({
+ type,
+ categoryId,
+ limit: limit ? parseInt(limit) : 20,
+ offset: offset ? parseInt(offset) : 0,
+ });
+ }
+
+ // Einzelner Artikel
+ @Get(':id')
+ async getArticle(@Param('id') id: string) {
+ return this.articlesService.getArticleById(id);
+ }
+
+ // Gespeicherte Artikel (Auth required)
+ @Get('saved')
+ @UseGuards(AuthGuard)
+ async getSavedArticles(
+ @Req() req: any,
+ @Query('includeArchived') includeArchived?: string,
+ ) {
+ return this.articlesService.getSavedArticles(
+ req.user.id,
+ includeArchived === 'true'
+ );
+ }
+
+ // Artikel archivieren
+ @Post(':id/archive')
+ @UseGuards(AuthGuard)
+ async archiveArticle(@Param('id') id: string, @Req() req: any) {
+ await this.articlesService.archiveArticle(id, req.user.id);
+ return { success: true };
+ }
+
+ // Artikel löschen
+ @Delete(':id')
+ @UseGuards(AuthGuard)
+ async deleteArticle(@Param('id') id: string, @Req() req: any) {
+ await this.articlesService.deleteArticle(id, req.user.id);
+ return { success: true };
+ }
+}
+```
+
+### 4.11 `apps/api/src/content-extraction/content-extraction.service.ts`
+
+```typescript
+import { Injectable } from '@nestjs/common';
+import { Readability } from '@mozilla/readability';
+import { JSDOM } from 'jsdom';
+import { ArticlesService } from '../articles/articles.service';
+
+export interface ExtractedContent {
+ title: string;
+ content: string; // Plain text
+ htmlContent: string; // Cleaned HTML
+ excerpt?: string;
+ byline?: string;
+ siteName?: string;
+}
+
+@Injectable()
+export class ContentExtractionService {
+ constructor(private articlesService: ArticlesService) {}
+
+ async extractFromUrl(url: string): Promise {
+ // Fetch the page
+ const response = await fetch(url, {
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (compatible; NewsHub/1.0)',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch URL: ${response.status}`);
+ }
+
+ const html = await response.text();
+
+ // Parse with JSDOM
+ const dom = new JSDOM(html, { url });
+ const reader = new Readability(dom.window.document);
+ const article = reader.parse();
+
+ if (!article) {
+ throw new Error('Could not extract article content');
+ }
+
+ return {
+ title: article.title,
+ content: article.textContent,
+ htmlContent: article.content,
+ excerpt: article.excerpt,
+ byline: article.byline,
+ siteName: article.siteName,
+ };
+ }
+
+ async saveArticleFromUrl(userId: string, url: string) {
+ const extracted = await this.extractFromUrl(url);
+
+ return this.articlesService.createSavedArticle({
+ userId,
+ title: extracted.title,
+ content: extracted.content,
+ parsedContent: extracted.htmlContent,
+ originalUrl: url,
+ });
+ }
+}
+```
+
+### 4.12 `apps/api/src/content-extraction/content-extraction.controller.ts`
+
+```typescript
+import { Controller, Post, Body, UseGuards, Req } from '@nestjs/common';
+import { ContentExtractionService } from './content-extraction.service';
+import { AuthGuard } from '../auth/auth.guard';
+
+@Controller('extract')
+export class ContentExtractionController {
+ constructor(private contentExtractionService: ContentExtractionService) {}
+
+ @Post('save')
+ @UseGuards(AuthGuard)
+ async saveFromUrl(@Body('url') url: string, @Req() req: any) {
+ const article = await this.contentExtractionService.saveArticleFromUrl(
+ req.user.id,
+ url
+ );
+
+ return { success: true, article };
+ }
+
+ @Post('preview')
+ async previewUrl(@Body('url') url: string) {
+ const extracted = await this.contentExtractionService.extractFromUrl(url);
+ return extracted;
+ }
+}
+```
+
+---
+
+## Phase 5: Mobile App migrieren
+
+### 5.1 Apps zusammenführen
+
+```bash
+# ainews nach apps/mobile verschieben
+mv ainews apps/mobile
+
+# kokon-spezifische Dateien übernehmen
+cp kokon/hooks/useArticles.ts apps/mobile/hooks/
+cp -r kokon/browser-extension packages/browser-extension
+```
+
+### 5.2 `apps/mobile/package.json` anpassen
+
+```json
+{
+ "name": "@news/mobile",
+ "dependencies": {
+ "@news/shared": "workspace:*",
+ // Supabase entfernen:
+ // "@supabase/supabase-js": "REMOVE",
+ // Stattdessen:
+ "better-auth/client": "^1.0.0"
+ }
+}
+```
+
+### 5.3 Neuer API Client: `apps/mobile/services/api.ts`
+
+```typescript
+const API_URL = process.env.EXPO_PUBLIC_API_URL || 'http://localhost:3000';
+
+class ApiClient {
+ private token: string | null = null;
+
+ setToken(token: string | null) {
+ this.token = token;
+ }
+
+ private async request(
+ endpoint: string,
+ options: RequestInit = {}
+ ): Promise {
+ const headers: HeadersInit = {
+ 'Content-Type': 'application/json',
+ ...options.headers,
+ };
+
+ if (this.token) {
+ headers['Authorization'] = `Bearer ${this.token}`;
+ }
+
+ const response = await fetch(`${API_URL}${endpoint}`, {
+ ...options,
+ headers,
+ });
+
+ if (!response.ok) {
+ const error = await response.json().catch(() => ({}));
+ throw new Error(error.message || `API Error: ${response.status}`);
+ }
+
+ return response.json();
+ }
+
+ // Articles
+ async getArticles(params?: {
+ type?: string;
+ categoryId?: string;
+ limit?: number;
+ offset?: number;
+ }) {
+ const query = new URLSearchParams(params as any).toString();
+ return this.request(`/articles?${query}`);
+ }
+
+ async getArticle(id: string) {
+ return this.request(`/articles/${id}`);
+ }
+
+ async getSavedArticles(includeArchived = false) {
+ return this.request(`/articles/saved?includeArchived=${includeArchived}`);
+ }
+
+ async archiveArticle(id: string) {
+ return this.request(`/articles/${id}/archive`, { method: 'POST' });
+ }
+
+ async deleteArticle(id: string) {
+ return this.request(`/articles/${id}`, { method: 'DELETE' });
+ }
+
+ // Content Extraction
+ async saveArticleFromUrl(url: string) {
+ return this.request('/extract/save', {
+ method: 'POST',
+ body: JSON.stringify({ url }),
+ });
+ }
+
+ // Auth
+ async signUp(email: string, password: string, name?: string) {
+ return this.request('/auth/signup', {
+ method: 'POST',
+ body: JSON.stringify({ email, password, name }),
+ });
+ }
+
+ async signIn(email: string, password: string) {
+ const result = await this.request<{ token: string; user: any }>('/auth/signin', {
+ method: 'POST',
+ body: JSON.stringify({ email, password }),
+ });
+ this.setToken(result.token);
+ return result;
+ }
+
+ async signOut() {
+ await this.request('/auth/signout', { method: 'POST' });
+ this.setToken(null);
+ }
+
+ async getSession() {
+ return this.request('/auth/session');
+ }
+}
+
+export const api = new ApiClient();
+```
+
+### 5.4 Auth Context aktualisieren: `apps/mobile/contexts/AuthContext.tsx`
+
+```typescript
+import React, { createContext, useContext, useEffect, useState } from 'react';
+import AsyncStorage from '@react-native-async-storage/async-storage';
+import { api } from '~/services/api';
+
+interface User {
+ id: string;
+ email: string;
+ name?: string;
+}
+
+interface AuthContextType {
+ user: User | null;
+ isLoading: boolean;
+ signIn: (email: string, password: string) => Promise;
+ signUp: (email: string, password: string, name?: string) => Promise;
+ signOut: () => Promise;
+}
+
+const AuthContext = createContext(null);
+
+const TOKEN_KEY = 'auth_token';
+
+export function AuthProvider({ children }: { children: React.ReactNode }) {
+ const [user, setUser] = useState(null);
+ const [isLoading, setIsLoading] = useState(true);
+
+ useEffect(() => {
+ loadStoredAuth();
+ }, []);
+
+ async function loadStoredAuth() {
+ try {
+ const token = await AsyncStorage.getItem(TOKEN_KEY);
+ if (token) {
+ api.setToken(token);
+ const session = await api.getSession();
+ setUser(session.user);
+ }
+ } catch (error) {
+ console.error('Failed to load auth:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ }
+
+ async function signIn(email: string, password: string) {
+ const result = await api.signIn(email, password);
+ await AsyncStorage.setItem(TOKEN_KEY, result.token);
+ setUser(result.user);
+ }
+
+ async function signUp(email: string, password: string, name?: string) {
+ const result = await api.signUp(email, password, name);
+ await AsyncStorage.setItem(TOKEN_KEY, result.token);
+ setUser(result.user);
+ }
+
+ async function signOut() {
+ await api.signOut();
+ await AsyncStorage.removeItem(TOKEN_KEY);
+ setUser(null);
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useAuth() {
+ const context = useContext(AuthContext);
+ if (!context) {
+ throw new Error('useAuth must be used within AuthProvider');
+ }
+ return context;
+}
+```
+
+### 5.5 Article Store aktualisieren: `apps/mobile/store/articleStore.ts`
+
+```typescript
+import { create } from 'zustand';
+import { api } from '~/services/api';
+
+interface Article {
+ id: string;
+ type: 'feed' | 'summary' | 'in_depth' | 'saved';
+ title: string;
+ content: string;
+ // ... weitere Felder
+}
+
+interface ArticleState {
+ articles: Article[];
+ savedArticles: Article[];
+ isLoading: boolean;
+ isLoadingSaved: boolean;
+
+ loadArticles: (type?: string) => Promise;
+ loadSavedArticles: () => Promise;
+ saveArticleFromUrl: (url: string) => Promise;
+ archiveArticle: (id: string) => Promise;
+}
+
+export const useArticleStore = create((set, get) => ({
+ articles: [],
+ savedArticles: [],
+ isLoading: false,
+ isLoadingSaved: false,
+
+ loadArticles: async (type) => {
+ set({ isLoading: true });
+ try {
+ const articles = await api.getArticles({ type });
+ set({ articles, isLoading: false });
+ } catch (error) {
+ console.error('Failed to load articles:', error);
+ set({ isLoading: false });
+ }
+ },
+
+ loadSavedArticles: async () => {
+ set({ isLoadingSaved: true });
+ try {
+ const savedArticles = await api.getSavedArticles();
+ set({ savedArticles, isLoadingSaved: false });
+ } catch (error) {
+ console.error('Failed to load saved articles:', error);
+ set({ isLoadingSaved: false });
+ }
+ },
+
+ saveArticleFromUrl: async (url: string) => {
+ try {
+ await api.saveArticleFromUrl(url);
+ get().loadSavedArticles();
+ return true;
+ } catch (error) {
+ console.error('Failed to save article:', error);
+ return false;
+ }
+ },
+
+ archiveArticle: async (id: string) => {
+ // Optimistic update
+ set(state => ({
+ savedArticles: state.savedArticles.filter(a => a.id !== id)
+ }));
+
+ try {
+ await api.archiveArticle(id);
+ } catch (error) {
+ // Rollback
+ get().loadSavedArticles();
+ }
+ },
+}));
+```
+
+---
+
+## Phase 6: Browser Extension anpassen
+
+### 6.1 `packages/browser-extension/manifest.json`
+
+```json
+{
+ "manifest_version": 3,
+ "name": "News Hub - Save Article",
+ "version": "1.0.0",
+ "description": "Speichere Artikel in deiner News Hub Bibliothek",
+ "permissions": ["activeTab", "storage"],
+ "host_permissions": ["http://localhost:3000/*"],
+ "action": {
+ "default_popup": "popup.html",
+ "default_title": "In News Hub speichern"
+ },
+ "background": {
+ "service_worker": "background.js"
+ }
+}
+```
+
+### 6.2 `packages/browser-extension/popup.js`
+
+```javascript
+const API_URL = 'http://localhost:3000';
+
+document.addEventListener('DOMContentLoaded', async () => {
+ const pageTitle = document.getElementById('pageTitle');
+ const pageUrl = document.getElementById('pageUrl');
+ const saveButton = document.getElementById('saveButton');
+ const status = document.getElementById('status');
+ const loginNotice = document.getElementById('loginNotice');
+
+ let currentTab = null;
+ let authToken = null;
+
+ // Get current tab
+ const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
+ currentTab = tab;
+ pageTitle.textContent = tab.title || 'Untitled';
+ pageUrl.textContent = tab.url;
+
+ // Check auth from storage
+ const stored = await chrome.storage.local.get(['news_hub_token']);
+ authToken = stored.news_hub_token;
+
+ if (authToken) {
+ saveButton.disabled = false;
+ loginNotice.style.display = 'none';
+ saveArticle();
+ } else {
+ loginNotice.style.display = 'block';
+ saveButton.disabled = true;
+ }
+
+ async function saveArticle() {
+ if (!currentTab || !authToken) return;
+
+ saveButton.disabled = true;
+ status.textContent = 'Speichert...';
+
+ try {
+ const response = await fetch(`${API_URL}/extract/save`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${authToken}`,
+ },
+ body: JSON.stringify({ url: currentTab.url }),
+ });
+
+ if (response.ok) {
+ status.textContent = 'Gespeichert!';
+ setTimeout(() => window.close(), 1500);
+ } else {
+ throw new Error('Failed to save');
+ }
+ } catch (error) {
+ status.textContent = 'Fehler beim Speichern';
+ saveButton.disabled = false;
+ }
+ }
+
+ saveButton.addEventListener('click', saveArticle);
+});
+```
+
+---
+
+## Phase 7: Environment & Scripts
+
+### 7.1 `.env.example` (Root)
+
+```env
+# Database
+DATABASE_URL=postgresql://news:news_dev_password@localhost:5432/news_hub
+
+# API
+API_PORT=3000
+API_URL=http://localhost:3000
+
+# Better Auth
+BETTER_AUTH_SECRET=your-secret-key-here
+
+# Mobile App
+EXPO_PUBLIC_API_URL=http://localhost:3000
+```
+
+### 7.2 Root `package.json` Scripts
+
+```json
+{
+ "scripts": {
+ "dev": "turbo run dev",
+ "dev:api": "turbo run dev --filter=@news/api",
+ "dev:mobile": "turbo run dev --filter=@news/mobile",
+ "build": "turbo run build",
+ "docker:up": "docker-compose -f docker/docker-compose.yml up -d",
+ "docker:down": "docker-compose -f docker/docker-compose.yml down",
+ "db:generate": "pnpm --filter @news/database db:generate",
+ "db:migrate": "pnpm --filter @news/database db:migrate",
+ "db:push": "pnpm --filter @news/database db:push",
+ "db:studio": "pnpm --filter @news/database db:studio"
+ }
+}
+```
+
+---
+
+## Migrations-Checkliste
+
+### Vorbereitung
+- [ ] pnpm installieren (falls nicht vorhanden)
+- [ ] Docker Desktop installiert
+- [ ] Node.js 20+ installiert
+
+### Phase 1: Monorepo
+- [ ] Root package.json erstellt
+- [ ] turbo.json erstellt
+- [ ] Ordnerstruktur angelegt
+- [ ] `pnpm install` erfolgreich
+
+### Phase 2: Docker
+- [ ] docker-compose.yml erstellt
+- [ ] `pnpm docker:up` startet PostgreSQL
+- [ ] pgAdmin erreichbar unter localhost:5050
+
+### Phase 3: Database Package
+- [ ] Drizzle Schema definiert
+- [ ] `pnpm db:generate` erfolgreich
+- [ ] `pnpm db:push` erstellt Tabellen
+- [ ] `pnpm db:studio` zeigt Tabellen
+
+### Phase 4: NestJS Backend
+- [ ] NestJS Projekt erstellt
+- [ ] Better Auth konfiguriert
+- [ ] Auth Endpoints funktionieren
+- [ ] Articles Endpoints funktionieren
+- [ ] Content Extraction funktioniert
+
+### Phase 5: Mobile App
+- [ ] ainews nach apps/mobile verschoben
+- [ ] Supabase-Abhängigkeiten entfernt
+- [ ] API Client erstellt
+- [ ] Auth Context aktualisiert
+- [ ] Store aktualisiert
+- [ ] App startet und verbindet mit API
+
+### Phase 6: Browser Extension
+- [ ] Extension nach packages/browser-extension
+- [ ] API URL angepasst
+- [ ] Funktioniert mit neuem Backend
+
+### Phase 7: Testing
+- [ ] User Registration
+- [ ] User Login
+- [ ] Artikel laden (Feed)
+- [ ] Artikel speichern via URL
+- [ ] Artikel speichern via Extension
+- [ ] Artikel archivieren
+
+---
+
+## Empfohlene Reihenfolge zum Starten
+
+```bash
+# 1. Monorepo initialisieren
+cd news
+pnpm init
+# package.json anpassen (workspaces)
+
+# 2. Docker starten
+pnpm docker:up
+
+# 3. Database Package erstellen & migrieren
+cd packages/database
+pnpm install
+pnpm db:push
+
+# 4. API entwickeln & testen
+cd apps/api
+pnpm install
+pnpm dev
+# Test: curl http://localhost:3000/articles
+
+# 5. Mobile App migrieren
+mv ainews apps/mobile
+cd apps/mobile
+# Supabase entfernen, API Client einbauen
+pnpm dev
+
+# 6. Extension anpassen
+cd packages/browser-extension
+# URLs anpassen, testen
+```
+
+---
+
+## Vorteile der neuen Architektur
+
+| Aspekt | Vorher (Supabase) | Nachher (Eigenes Backend) |
+|--------|-------------------|---------------------------|
+| **Kontrolle** | Abhängig von Supabase | Volle Kontrolle |
+| **Kosten** | Pay-per-use | Fixkosten (oder gratis lokal) |
+| **Flexibilität** | Supabase-Limits | Unbegrenzt skalierbar |
+| **Type Safety** | Manuell generiert | Drizzle: Schema = Types |
+| **Migrations** | Supabase Dashboard | Drizzle-Kit: Versioniert |
+| **Testing** | Schwierig lokal | Docker: Identisch zu Prod |
+| **Auth** | Supabase Auth | Better Auth: Flexibel |
+
+---
+
+## Nächste Schritte
+
+1. **Entscheidung**: Plan OK? Anpassungen nötig?
+2. **Phase 1 starten**: Monorepo Setup
+3. **Parallel**: Docker & Database Package
+
+Soll ich mit der Implementierung beginnen?
diff --git a/news/README.md b/news/README.md
new file mode 100644
index 000000000..d6c5e1f1e
--- /dev/null
+++ b/news/README.md
@@ -0,0 +1,178 @@
+# News Hub
+
+A unified news reading platform combining AI-curated news with personal article saving capabilities.
+
+## Architecture
+
+```
+news/
+├── apps/
+│ ├── mobile/ # React Native/Expo App
+│ └── api/ # NestJS Backend
+├── packages/
+│ ├── database/ # Drizzle ORM Schema
+│ ├── shared/ # Shared utilities
+│ └── browser-extension/ # Chrome Extension
+└── docker/ # PostgreSQL Docker setup
+```
+
+## Tech Stack
+
+| Component | Technology |
+|-----------|------------|
+| **Database** | PostgreSQL 16 (Docker) |
+| **ORM** | Drizzle |
+| **Backend** | NestJS + Fastify |
+| **Auth** | Custom JWT Auth |
+| **Mobile** | React Native / Expo |
+| **State** | Zustand |
+| **Styling** | NativeWind (Tailwind) |
+| **Monorepo** | pnpm workspaces + Turborepo |
+
+## Getting Started
+
+### Prerequisites
+
+- Node.js 20+
+- pnpm 9+
+- Docker Desktop
+
+### Setup
+
+```bash
+# 1. Install dependencies
+pnpm install
+
+# 2. Start PostgreSQL
+pnpm docker:up
+
+# 3. Push database schema
+pnpm db:push
+
+# 4. Start API server
+pnpm dev:api
+
+# 5. Start mobile app (in another terminal)
+pnpm dev:mobile
+```
+
+### Available Scripts
+
+```bash
+# Development
+pnpm dev # Start all services
+pnpm dev:api # Start API only
+pnpm dev:mobile # Start mobile app only
+
+# Database
+pnpm db:push # Push schema to database
+pnpm db:generate # Generate migrations
+pnpm db:migrate # Run migrations
+pnpm db:studio # Open Drizzle Studio
+
+# Docker
+pnpm docker:up # Start PostgreSQL
+pnpm docker:down # Stop PostgreSQL
+pnpm docker:logs # View logs
+
+# Build
+pnpm build # Build all packages
+```
+
+## Environment Variables
+
+Create a `.env` file in the root directory:
+
+```env
+# Database
+DATABASE_URL=postgresql://news:news_dev_password@localhost:5432/news_hub
+
+# API
+API_PORT=3000
+API_URL=http://localhost:3000
+
+# Better Auth Secret
+BETTER_AUTH_SECRET=your-secret-key
+
+# Mobile App
+EXPO_PUBLIC_API_URL=http://localhost:3000
+```
+
+## Features
+
+### News Feed (AI-Generated)
+- **Feed**: Quick news updates with infinite scroll
+- **Summaries**: 4 daily summaries (morning, noon, evening, night)
+- **In-Depth**: Detailed analysis articles
+
+### Personal Library (Read Later)
+- Save articles from any URL
+- Browser extension for one-click saving
+- Content extraction with Readability
+- Archive and organize articles
+
+## API Endpoints
+
+### Auth
+- `POST /auth/signup` - Create account
+- `POST /auth/signin` - Sign in
+- `POST /auth/signout` - Sign out
+- `GET /auth/session` - Get current session
+
+### Articles
+- `GET /articles` - Get AI articles (public)
+- `GET /articles/:id` - Get single article
+- `GET /articles/saved/list` - Get saved articles (auth required)
+- `POST /articles/:id/archive` - Archive article
+- `DELETE /articles/:id` - Delete article
+
+### Content Extraction
+- `POST /extract/save` - Save article from URL (auth required)
+- `POST /extract/preview` - Preview URL extraction (public)
+
+### Categories
+- `GET /categories` - Get all categories
+
+### Users
+- `GET /users/me` - Get current user
+- `PATCH /users/me` - Update profile
+- `PATCH /users/me/onboarding` - Complete onboarding
+
+## Browser Extension
+
+The browser extension is located in `packages/browser-extension/`.
+
+### Installation (Development)
+1. Go to `chrome://extensions/`
+2. Enable "Developer mode"
+3. Click "Load unpacked"
+4. Select the `packages/browser-extension` folder
+
+## Database Schema
+
+### Tables
+- `users` - User accounts and preferences
+- `articles` - All articles (AI-generated and user-saved)
+- `categories` - Article categories
+- `user_article_interactions` - Reading progress, ratings, bookmarks
+- `sessions` - Auth sessions
+- `accounts` - Auth providers
+- `verifications` - Email verification tokens
+
+## Development
+
+### Adding a new API endpoint
+
+1. Create service in `apps/api/src/{module}/{module}.service.ts`
+2. Create controller in `apps/api/src/{module}/{module}.controller.ts`
+3. Add module to `app.module.ts`
+
+### Adding a new database table
+
+1. Create schema in `packages/database/src/schema/{table}.ts`
+2. Export from `packages/database/src/schema/index.ts`
+3. Run `pnpm db:push` to update database
+
+## License
+
+Private
diff --git a/news/apps/api/nest-cli.json b/news/apps/api/nest-cli.json
new file mode 100644
index 000000000..f9aa683b1
--- /dev/null
+++ b/news/apps/api/nest-cli.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/nest-cli",
+ "collection": "@nestjs/schematics",
+ "sourceRoot": "src",
+ "compilerOptions": {
+ "deleteOutDir": true
+ }
+}
diff --git a/news/apps/api/package.json b/news/apps/api/package.json
new file mode 100644
index 000000000..b5c8b5943
--- /dev/null
+++ b/news/apps/api/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "@news/api",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "build": "nest build",
+ "dev": "nest start --watch",
+ "start:dev": "nest start --watch",
+ "start": "nest start",
+ "start:debug": "nest start --debug --watch",
+ "start:prod": "node dist/main",
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
+ },
+ "dependencies": {
+ "@manacore/shared-utils": "workspace:*",
+ "@manacore/shared-types": "workspace:*",
+ "@nestjs/common": "^10.4.0",
+ "@nestjs/config": "^3.3.0",
+ "@nestjs/core": "^10.4.0",
+ "@nestjs/platform-fastify": "^10.4.0",
+ "@manacore/news-database": "workspace:*",
+ "drizzle-orm": "^0.36.0",
+ "postgres": "^3.4.5",
+ "@mozilla/readability": "^0.5.0",
+ "jsdom": "^25.0.0",
+ "class-validator": "^0.14.1",
+ "class-transformer": "^0.5.1",
+ "reflect-metadata": "^0.2.2",
+ "rxjs": "^7.8.1"
+ },
+ "devDependencies": {
+ "@nestjs/cli": "^10.4.0",
+ "@nestjs/schematics": "^10.2.0",
+ "@types/jsdom": "^21.1.0",
+ "@types/node": "^22.0.0",
+ "typescript": "^5.6.0"
+ }
+}
diff --git a/news/apps/api/src/app.module.ts b/news/apps/api/src/app.module.ts
new file mode 100644
index 000000000..d63cf2dfa
--- /dev/null
+++ b/news/apps/api/src/app.module.ts
@@ -0,0 +1,24 @@
+import { Module } from '@nestjs/common';
+import { ConfigModule } from '@nestjs/config';
+import { DatabaseModule } from './database/database.module';
+import { AuthModule } from './auth/auth.module';
+import { ArticlesModule } from './articles/articles.module';
+import { CategoriesModule } from './categories/categories.module';
+import { UsersModule } from './users/users.module';
+import { ContentExtractionModule } from './content-extraction/content-extraction.module';
+
+@Module({
+ imports: [
+ ConfigModule.forRoot({
+ isGlobal: true,
+ envFilePath: '../../.env',
+ }),
+ DatabaseModule,
+ AuthModule,
+ ArticlesModule,
+ CategoriesModule,
+ UsersModule,
+ ContentExtractionModule,
+ ],
+})
+export class AppModule {}
diff --git a/news/apps/api/src/articles/articles.controller.ts b/news/apps/api/src/articles/articles.controller.ts
new file mode 100644
index 000000000..64cf765f5
--- /dev/null
+++ b/news/apps/api/src/articles/articles.controller.ts
@@ -0,0 +1,81 @@
+import {
+ Controller,
+ Get,
+ Post,
+ Delete,
+ Param,
+ Query,
+ UseGuards,
+} from '@nestjs/common';
+import { ArticlesService } from './articles.service';
+import { AuthGuard } from '../common/guards/auth.guard';
+import { CurrentUser } from '../common/decorators/current-user.decorator';
+import { User } from '@manacore/news-database';
+
+@Controller('articles')
+export class ArticlesController {
+ constructor(private articlesService: ArticlesService) {}
+
+ // Public: Get AI-generated articles
+ @Get()
+ async getArticles(
+ @Query('type') type?: 'feed' | 'summary' | 'in_depth',
+ @Query('categoryId') categoryId?: string,
+ @Query('limit') limit?: string,
+ @Query('offset') offset?: string,
+ ) {
+ return this.articlesService.getAIArticles({
+ type,
+ categoryId,
+ limit: limit ? parseInt(limit, 10) : 20,
+ offset: offset ? parseInt(offset, 10) : 0,
+ });
+ }
+
+ // Public: Get single article
+ @Get(':id')
+ async getArticle(@Param('id') id: string) {
+ const article = await this.articlesService.getArticleById(id);
+ if (!article) {
+ return { error: 'Article not found' };
+ }
+ return article;
+ }
+
+ // Protected: Get user's saved articles
+ @Get('saved/list')
+ @UseGuards(AuthGuard)
+ async getSavedArticles(
+ @CurrentUser() user: User,
+ @Query('includeArchived') includeArchived?: string,
+ ) {
+ return this.articlesService.getSavedArticles(
+ user.id,
+ includeArchived === 'true',
+ );
+ }
+
+ // Protected: Archive article
+ @Post(':id/archive')
+ @UseGuards(AuthGuard)
+ async archiveArticle(@Param('id') id: string, @CurrentUser() user: User) {
+ await this.articlesService.archiveArticle(id, user.id);
+ return { success: true };
+ }
+
+ // Protected: Unarchive article
+ @Post(':id/unarchive')
+ @UseGuards(AuthGuard)
+ async unarchiveArticle(@Param('id') id: string, @CurrentUser() user: User) {
+ await this.articlesService.unarchiveArticle(id, user.id);
+ return { success: true };
+ }
+
+ // Protected: Delete article
+ @Delete(':id')
+ @UseGuards(AuthGuard)
+ async deleteArticle(@Param('id') id: string, @CurrentUser() user: User) {
+ await this.articlesService.deleteArticle(id, user.id);
+ return { success: true };
+ }
+}
diff --git a/news/apps/api/src/articles/articles.module.ts b/news/apps/api/src/articles/articles.module.ts
new file mode 100644
index 000000000..13671c5dd
--- /dev/null
+++ b/news/apps/api/src/articles/articles.module.ts
@@ -0,0 +1,12 @@
+import { Module } from '@nestjs/common';
+import { ArticlesController } from './articles.controller';
+import { ArticlesService } from './articles.service';
+import { AuthModule } from '../auth/auth.module';
+
+@Module({
+ imports: [AuthModule],
+ controllers: [ArticlesController],
+ providers: [ArticlesService],
+ exports: [ArticlesService],
+})
+export class ArticlesModule {}
diff --git a/news/apps/api/src/articles/articles.service.ts b/news/apps/api/src/articles/articles.service.ts
new file mode 100644
index 000000000..a33e2c247
--- /dev/null
+++ b/news/apps/api/src/articles/articles.service.ts
@@ -0,0 +1,147 @@
+import { Injectable, Inject, NotFoundException } from '@nestjs/common';
+import { DATABASE_CONNECTION } from '../database/database.module';
+import {
+ Database,
+ articles,
+ Article,
+ eq,
+ and,
+ desc,
+} from '@manacore/news-database';
+
+@Injectable()
+export class ArticlesService {
+ constructor(@Inject(DATABASE_CONNECTION) private database: Database) {}
+
+ // Get AI-generated articles (feed, summary, in_depth)
+ async getAIArticles(options: {
+ type?: 'feed' | 'summary' | 'in_depth';
+ categoryId?: string;
+ limit?: number;
+ offset?: number;
+ }): Promise {
+ const { type, categoryId, limit = 20, offset = 0 } = options;
+
+ const conditions = [eq(articles.sourceOrigin, 'ai')];
+
+ if (type) {
+ conditions.push(eq(articles.type, type));
+ }
+
+ if (categoryId) {
+ conditions.push(eq(articles.categoryId, categoryId));
+ }
+
+ return this.database
+ .select()
+ .from(articles)
+ .where(and(...conditions))
+ .orderBy(desc(articles.publishedAt))
+ .limit(limit)
+ .offset(offset);
+ }
+
+ // Get user-saved articles
+ async getSavedArticles(
+ userId: string,
+ includeArchived = false,
+ ): Promise {
+ const conditions = [
+ eq(articles.sourceOrigin, 'user_saved'),
+ eq(articles.userId, userId),
+ ];
+
+ if (!includeArchived) {
+ conditions.push(eq(articles.isArchived, false));
+ }
+
+ return this.database
+ .select()
+ .from(articles)
+ .where(and(...conditions))
+ .orderBy(desc(articles.createdAt));
+ }
+
+ // Get single article by ID
+ async getArticleById(articleId: string): Promise {
+ const [article] = await this.database
+ .select()
+ .from(articles)
+ .where(eq(articles.id, articleId))
+ .limit(1);
+
+ return article || null;
+ }
+
+ // Create a saved article
+ async createSavedArticle(data: {
+ userId: string;
+ title: string;
+ content: string;
+ parsedContent: string;
+ originalUrl: string;
+ author?: string;
+ imageUrl?: string;
+ }): Promise {
+ const wordCount = data.content.split(/\s+/).length;
+ const readingTimeMinutes = Math.ceil(wordCount / 200);
+
+ const [article] = await this.database
+ .insert(articles)
+ .values({
+ type: 'saved',
+ sourceOrigin: 'user_saved',
+ userId: data.userId,
+ title: data.title,
+ content: data.content,
+ parsedContent: data.parsedContent,
+ originalUrl: data.originalUrl,
+ author: data.author,
+ imageUrl: data.imageUrl,
+ wordCount,
+ readingTimeMinutes,
+ isArchived: false,
+ })
+ .returning();
+
+ return article;
+ }
+
+ // Archive an article
+ async archiveArticle(articleId: string, userId: string): Promise {
+ const result = await this.database
+ .update(articles)
+ .set({ isArchived: true, updatedAt: new Date() })
+ .where(and(eq(articles.id, articleId), eq(articles.userId, userId)))
+ .returning();
+
+ if (result.length === 0) {
+ throw new NotFoundException('Article not found');
+ }
+ }
+
+ // Unarchive an article
+ async unarchiveArticle(articleId: string, userId: string): Promise {
+ const result = await this.database
+ .update(articles)
+ .set({ isArchived: false, updatedAt: new Date() })
+ .where(and(eq(articles.id, articleId), eq(articles.userId, userId)))
+ .returning();
+
+ if (result.length === 0) {
+ throw new NotFoundException('Article not found');
+ }
+ }
+
+ // Delete an article
+ async deleteArticle(articleId: string, userId: string): Promise {
+ const result = await this.database
+ .delete(articles)
+ .where(and(eq(articles.id, articleId), eq(articles.userId, userId)))
+ .returning();
+
+ if (result.length === 0) {
+ throw new NotFoundException('Article not found');
+ }
+ }
+}
diff --git a/news/apps/api/src/auth/auth.controller.ts b/news/apps/api/src/auth/auth.controller.ts
new file mode 100644
index 000000000..2c592fcfd
--- /dev/null
+++ b/news/apps/api/src/auth/auth.controller.ts
@@ -0,0 +1,88 @@
+import { Controller, Post, Get, Body, Headers, UnauthorizedException } from '@nestjs/common';
+import { AuthService } from './auth.service';
+import { IsEmail, IsString, MinLength, IsOptional } from 'class-validator';
+
+class SignUpDto {
+ @IsEmail()
+ email: string;
+
+ @IsString()
+ @MinLength(6)
+ password: string;
+
+ @IsOptional()
+ @IsString()
+ name?: string;
+}
+
+class SignInDto {
+ @IsEmail()
+ email: string;
+
+ @IsString()
+ password: string;
+}
+
+@Controller('auth')
+export class AuthController {
+ constructor(private authService: AuthService) {}
+
+ @Post('signup')
+ async signUp(@Body() body: SignUpDto) {
+ const result = await this.authService.signUp(body.email, body.password, body.name);
+ return {
+ user: {
+ id: result.user.id,
+ email: result.user.email,
+ name: result.user.name,
+ },
+ token: result.token,
+ };
+ }
+
+ @Post('signin')
+ async signIn(@Body() body: SignInDto) {
+ const result = await this.authService.signIn(body.email, body.password);
+ return {
+ user: {
+ id: result.user.id,
+ email: result.user.email,
+ name: result.user.name,
+ },
+ token: result.token,
+ };
+ }
+
+ @Post('signout')
+ async signOut(@Headers('authorization') authHeader: string) {
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
+ throw new UnauthorizedException('No token provided');
+ }
+
+ const token = authHeader.substring(7);
+ await this.authService.signOut(token);
+ return { success: true };
+ }
+
+ @Get('session')
+ async getSession(@Headers('authorization') authHeader: string) {
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
+ throw new UnauthorizedException('No token provided');
+ }
+
+ const token = authHeader.substring(7);
+ const session = await this.authService.getSession(token);
+
+ if (!session) {
+ throw new UnauthorizedException('Invalid or expired session');
+ }
+
+ return {
+ user: {
+ id: session.user.id,
+ email: session.user.email,
+ name: session.user.name,
+ },
+ };
+ }
+}
diff --git a/news/apps/api/src/auth/auth.module.ts b/news/apps/api/src/auth/auth.module.ts
new file mode 100644
index 000000000..679a6f6a3
--- /dev/null
+++ b/news/apps/api/src/auth/auth.module.ts
@@ -0,0 +1,10 @@
+import { Module } from '@nestjs/common';
+import { AuthController } from './auth.controller';
+import { AuthService } from './auth.service';
+
+@Module({
+ controllers: [AuthController],
+ providers: [AuthService],
+ exports: [AuthService],
+})
+export class AuthModule {}
diff --git a/news/apps/api/src/auth/auth.service.ts b/news/apps/api/src/auth/auth.service.ts
new file mode 100644
index 000000000..2790aded1
--- /dev/null
+++ b/news/apps/api/src/auth/auth.service.ts
@@ -0,0 +1,159 @@
+import { Injectable, Inject, UnauthorizedException, ConflictException } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { DATABASE_CONNECTION } from '../database/database.module';
+import {
+ Database,
+ users,
+ sessions,
+ accounts,
+ eq,
+ and,
+ User,
+} from '@manacore/news-database';
+import * as crypto from 'crypto';
+
+@Injectable()
+export class AuthService {
+ constructor(
+ @Inject(DATABASE_CONNECTION) private database: Database,
+ private configService: ConfigService,
+ ) {}
+
+ private hashPassword(password: string): string {
+ const salt = crypto.randomBytes(16).toString('hex');
+ const hash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
+ return `${salt}:${hash}`;
+ }
+
+ private verifyPassword(password: string, storedHash: string): boolean {
+ const [salt, hash] = storedHash.split(':');
+ const verifyHash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
+ return hash === verifyHash;
+ }
+
+ private generateToken(): string {
+ return crypto.randomBytes(32).toString('hex');
+ }
+
+ async signUp(email: string, password: string, name?: string): Promise<{ user: User; token: string }> {
+ // Check if user exists
+ const existingUser = await this.database
+ .select()
+ .from(users)
+ .where(eq(users.email, email.toLowerCase()))
+ .limit(1);
+
+ if (existingUser.length > 0) {
+ throw new ConflictException('User already exists');
+ }
+
+ // Create user
+ const [user] = await this.database
+ .insert(users)
+ .values({
+ email: email.toLowerCase(),
+ name: name || null,
+ })
+ .returning();
+
+ // Create account with password
+ await this.database.insert(accounts).values({
+ userId: user.id,
+ providerId: 'credential',
+ accountId: email.toLowerCase(),
+ password: this.hashPassword(password),
+ });
+
+ // Create session
+ const token = this.generateToken();
+ const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days
+
+ await this.database.insert(sessions).values({
+ userId: user.id,
+ token,
+ expiresAt,
+ });
+
+ return { user, token };
+ }
+
+ async signIn(email: string, password: string): Promise<{ user: User; token: string }> {
+ // Find user
+ const [user] = await this.database
+ .select()
+ .from(users)
+ .where(eq(users.email, email.toLowerCase()))
+ .limit(1);
+
+ if (!user) {
+ throw new UnauthorizedException('Invalid credentials');
+ }
+
+ // Find account
+ const [account] = await this.database
+ .select()
+ .from(accounts)
+ .where(
+ and(
+ eq(accounts.userId, user.id),
+ eq(accounts.providerId, 'credential'),
+ ),
+ )
+ .limit(1);
+
+ if (!account || !account.password) {
+ throw new UnauthorizedException('Invalid credentials');
+ }
+
+ // Verify password
+ if (!this.verifyPassword(password, account.password)) {
+ throw new UnauthorizedException('Invalid credentials');
+ }
+
+ // Create session
+ const token = this.generateToken();
+ const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days
+
+ await this.database.insert(sessions).values({
+ userId: user.id,
+ token,
+ expiresAt,
+ });
+
+ return { user, token };
+ }
+
+ async signOut(token: string): Promise {
+ await this.database.delete(sessions).where(eq(sessions.token, token));
+ }
+
+ async validateSession(token: string): Promise<{ user: User; session: any } | null> {
+ const [session] = await this.database
+ .select()
+ .from(sessions)
+ .where(eq(sessions.token, token))
+ .limit(1);
+
+ if (!session || new Date(session.expiresAt) < new Date()) {
+ return null;
+ }
+
+ const [user] = await this.database
+ .select()
+ .from(users)
+ .where(eq(users.id, session.userId))
+ .limit(1);
+
+ if (!user) {
+ return null;
+ }
+
+ return { user, session };
+ }
+
+ async getSession(token: string): Promise<{ user: User } | null> {
+ const result = await this.validateSession(token);
+ if (!result) return null;
+ return { user: result.user };
+ }
+}
diff --git a/news/apps/api/src/categories/categories.controller.ts b/news/apps/api/src/categories/categories.controller.ts
new file mode 100644
index 000000000..eb3805717
--- /dev/null
+++ b/news/apps/api/src/categories/categories.controller.ts
@@ -0,0 +1,12 @@
+import { Controller, Get } from '@nestjs/common';
+import { CategoriesService } from './categories.service';
+
+@Controller('categories')
+export class CategoriesController {
+ constructor(private categoriesService: CategoriesService) {}
+
+ @Get()
+ async getAllCategories() {
+ return this.categoriesService.getAllCategories();
+ }
+}
diff --git a/news/apps/api/src/categories/categories.module.ts b/news/apps/api/src/categories/categories.module.ts
new file mode 100644
index 000000000..479581306
--- /dev/null
+++ b/news/apps/api/src/categories/categories.module.ts
@@ -0,0 +1,10 @@
+import { Module } from '@nestjs/common';
+import { CategoriesController } from './categories.controller';
+import { CategoriesService } from './categories.service';
+
+@Module({
+ controllers: [CategoriesController],
+ providers: [CategoriesService],
+ exports: [CategoriesService],
+})
+export class CategoriesModule {}
diff --git a/news/apps/api/src/categories/categories.service.ts b/news/apps/api/src/categories/categories.service.ts
new file mode 100644
index 000000000..b004d0f60
--- /dev/null
+++ b/news/apps/api/src/categories/categories.service.ts
@@ -0,0 +1,31 @@
+import { Injectable, Inject } from '@nestjs/common';
+import { DATABASE_CONNECTION } from '../database/database.module';
+import { Database, categories, Category, asc } from '@manacore/news-database';
+
+@Injectable()
+export class CategoriesService {
+ constructor(@Inject(DATABASE_CONNECTION) private database: Database) {}
+
+ async getAllCategories(): Promise {
+ return this.database
+ .select()
+ .from(categories)
+ .orderBy(asc(categories.priority));
+ }
+
+ async createCategory(data: {
+ name: string;
+ displayName: string;
+ description?: string;
+ icon?: string;
+ color?: string;
+ priority?: number;
+ }): Promise {
+ const [category] = await this.database
+ .insert(categories)
+ .values(data)
+ .returning();
+
+ return category;
+ }
+}
diff --git a/news/apps/api/src/common/decorators/current-user.decorator.ts b/news/apps/api/src/common/decorators/current-user.decorator.ts
new file mode 100644
index 000000000..7919497a7
--- /dev/null
+++ b/news/apps/api/src/common/decorators/current-user.decorator.ts
@@ -0,0 +1,8 @@
+import { createParamDecorator, ExecutionContext } from '@nestjs/common';
+
+export const CurrentUser = createParamDecorator(
+ (data: unknown, ctx: ExecutionContext) => {
+ const request = ctx.switchToHttp().getRequest();
+ return request.user;
+ },
+);
diff --git a/news/apps/api/src/common/guards/auth.guard.ts b/news/apps/api/src/common/guards/auth.guard.ts
new file mode 100644
index 000000000..4067589a5
--- /dev/null
+++ b/news/apps/api/src/common/guards/auth.guard.ts
@@ -0,0 +1,31 @@
+import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
+import { AuthService } from '../../auth/auth.service';
+
+@Injectable()
+export class AuthGuard implements CanActivate {
+ constructor(private authService: AuthService) {}
+
+ async canActivate(context: ExecutionContext): Promise {
+ const request = context.switchToHttp().getRequest();
+ const authHeader = request.headers.authorization;
+
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
+ throw new UnauthorizedException('No token provided');
+ }
+
+ const token = authHeader.substring(7);
+
+ try {
+ const session = await this.authService.validateSession(token);
+ if (!session) {
+ throw new UnauthorizedException('Invalid or expired session');
+ }
+
+ request.user = session.user;
+ request.session = session;
+ return true;
+ } catch {
+ throw new UnauthorizedException('Invalid token');
+ }
+ }
+}
diff --git a/news/apps/api/src/content-extraction/content-extraction.controller.ts b/news/apps/api/src/content-extraction/content-extraction.controller.ts
new file mode 100644
index 000000000..57275ed3a
--- /dev/null
+++ b/news/apps/api/src/content-extraction/content-extraction.controller.ts
@@ -0,0 +1,51 @@
+import { Controller, Post, Body, UseGuards } from '@nestjs/common';
+import { ContentExtractionService } from './content-extraction.service';
+import { AuthGuard } from '../common/guards/auth.guard';
+import { CurrentUser } from '../common/decorators/current-user.decorator';
+import { User } from '@manacore/news-database';
+import { IsUrl } from 'class-validator';
+
+class ExtractUrlDto {
+ @IsUrl()
+ url: string;
+}
+
+@Controller('extract')
+export class ContentExtractionController {
+ constructor(private contentExtractionService: ContentExtractionService) {}
+
+ // Protected: Save article from URL
+ @Post('save')
+ @UseGuards(AuthGuard)
+ async saveFromUrl(@Body() body: ExtractUrlDto, @CurrentUser() user: User) {
+ const article = await this.contentExtractionService.saveArticleFromUrl(
+ user.id,
+ body.url,
+ );
+
+ return {
+ success: true,
+ article: {
+ id: article.id,
+ title: article.title,
+ createdAt: article.createdAt,
+ },
+ };
+ }
+
+ // Public: Preview URL extraction (without saving)
+ @Post('preview')
+ async previewUrl(@Body() body: ExtractUrlDto) {
+ const extracted = await this.contentExtractionService.extractFromUrl(
+ body.url,
+ );
+
+ return {
+ title: extracted.title,
+ excerpt: extracted.excerpt,
+ byline: extracted.byline,
+ siteName: extracted.siteName,
+ contentLength: extracted.content.length,
+ };
+ }
+}
diff --git a/news/apps/api/src/content-extraction/content-extraction.module.ts b/news/apps/api/src/content-extraction/content-extraction.module.ts
new file mode 100644
index 000000000..b7da66d87
--- /dev/null
+++ b/news/apps/api/src/content-extraction/content-extraction.module.ts
@@ -0,0 +1,13 @@
+import { Module } from '@nestjs/common';
+import { ContentExtractionController } from './content-extraction.controller';
+import { ContentExtractionService } from './content-extraction.service';
+import { ArticlesModule } from '../articles/articles.module';
+import { AuthModule } from '../auth/auth.module';
+
+@Module({
+ imports: [ArticlesModule, AuthModule],
+ controllers: [ContentExtractionController],
+ providers: [ContentExtractionService],
+ exports: [ContentExtractionService],
+})
+export class ContentExtractionModule {}
diff --git a/news/apps/api/src/content-extraction/content-extraction.service.ts b/news/apps/api/src/content-extraction/content-extraction.service.ts
new file mode 100644
index 000000000..cb3485297
--- /dev/null
+++ b/news/apps/api/src/content-extraction/content-extraction.service.ts
@@ -0,0 +1,79 @@
+import { Injectable, BadRequestException } from '@nestjs/common';
+import { Readability } from '@mozilla/readability';
+import { JSDOM } from 'jsdom';
+import { ArticlesService } from '../articles/articles.service';
+
+export interface ExtractedContent {
+ title: string;
+ content: string;
+ htmlContent: string;
+ excerpt?: string;
+ byline?: string;
+ siteName?: string;
+}
+
+@Injectable()
+export class ContentExtractionService {
+ constructor(private articlesService: ArticlesService) {}
+
+ async extractFromUrl(url: string): Promise {
+ // Validate URL
+ try {
+ new URL(url);
+ } catch {
+ throw new BadRequestException('Invalid URL');
+ }
+
+ // Fetch the page
+ const response = await fetch(url, {
+ headers: {
+ 'User-Agent':
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
+ Accept:
+ 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
+ 'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
+ },
+ });
+
+ if (!response.ok) {
+ throw new BadRequestException(
+ `Failed to fetch URL: ${response.status} ${response.statusText}`,
+ );
+ }
+
+ const html = await response.text();
+
+ // Parse with JSDOM
+ const dom = new JSDOM(html, { url });
+ const reader = new Readability(dom.window.document);
+ const article = reader.parse();
+
+ if (!article) {
+ throw new BadRequestException(
+ 'Could not extract article content from this page',
+ );
+ }
+
+ return {
+ title: article.title || 'Untitled',
+ content: article.textContent || '',
+ htmlContent: article.content || '',
+ excerpt: article.excerpt,
+ byline: article.byline,
+ siteName: article.siteName,
+ };
+ }
+
+ async saveArticleFromUrl(userId: string, url: string) {
+ const extracted = await this.extractFromUrl(url);
+
+ return this.articlesService.createSavedArticle({
+ userId,
+ title: extracted.title,
+ content: extracted.content,
+ parsedContent: extracted.htmlContent,
+ originalUrl: url,
+ author: extracted.byline,
+ });
+ }
+}
diff --git a/news/apps/api/src/database/database.module.ts b/news/apps/api/src/database/database.module.ts
new file mode 100644
index 000000000..2cc70ef85
--- /dev/null
+++ b/news/apps/api/src/database/database.module.ts
@@ -0,0 +1,25 @@
+import { Module, Global } from '@nestjs/common';
+import { ConfigService } from '@nestjs/config';
+import { createDb } from '@manacore/news-database';
+
+export const DATABASE_CONNECTION = 'DATABASE_CONNECTION';
+
+@Global()
+@Module({
+ providers: [
+ {
+ provide: DATABASE_CONNECTION,
+ useFactory: (configService: ConfigService) => {
+ const databaseUrl = configService.get('DATABASE_URL') ||
+ 'postgresql://news:news_dev_password@localhost:5434/news_hub';
+
+ console.log('Connecting to database:', databaseUrl.replace(/:[^:@]+@/, ':****@'));
+
+ return createDb(databaseUrl);
+ },
+ inject: [ConfigService],
+ },
+ ],
+ exports: [DATABASE_CONNECTION],
+})
+export class DatabaseModule {}
diff --git a/news/apps/api/src/main.ts b/news/apps/api/src/main.ts
new file mode 100644
index 000000000..ce723158d
--- /dev/null
+++ b/news/apps/api/src/main.ts
@@ -0,0 +1,37 @@
+import { NestFactory } from '@nestjs/core';
+import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
+import { ValidationPipe } from '@nestjs/common';
+import { AppModule } from './app.module';
+
+async function bootstrap() {
+ const app = await NestFactory.create(
+ AppModule,
+ new FastifyAdapter({ logger: true }),
+ );
+
+ app.enableCors({
+ origin: [
+ 'http://localhost:8081', // Expo web
+ 'http://localhost:19006', // Expo web alt
+ 'http://localhost:3000', // API itself (for testing)
+ /^exp:\/\/.*/, // Expo Go
+ ],
+ credentials: true,
+ });
+
+ app.useGlobalPipes(
+ new ValidationPipe({
+ whitelist: true,
+ transform: true,
+ transformOptions: {
+ enableImplicitConversion: true,
+ },
+ }),
+ );
+
+ const port = process.env.API_PORT || 3000;
+ await app.listen(port, '0.0.0.0');
+ console.log(`API running on http://localhost:${port}`);
+}
+
+bootstrap();
diff --git a/news/apps/api/src/users/users.controller.ts b/news/apps/api/src/users/users.controller.ts
new file mode 100644
index 000000000..61f2d077f
--- /dev/null
+++ b/news/apps/api/src/users/users.controller.ts
@@ -0,0 +1,59 @@
+import { Controller, Get, Patch, Body, UseGuards } from '@nestjs/common';
+import { UsersService } from './users.service';
+import { AuthGuard } from '../common/guards/auth.guard';
+import { CurrentUser } from '../common/decorators/current-user.decorator';
+import { User } from '@manacore/news-database';
+import { IsOptional, IsString, IsArray, IsEnum, IsBoolean } from 'class-validator';
+
+class UpdateUserDto {
+ @IsOptional()
+ @IsString()
+ name?: string;
+
+ @IsOptional()
+ @IsArray()
+ preferredCategories?: string[];
+
+ @IsOptional()
+ @IsArray()
+ blockedSources?: string[];
+
+ @IsOptional()
+ @IsEnum(['slow', 'normal', 'fast'])
+ readingSpeed?: 'slow' | 'normal' | 'fast';
+
+ @IsOptional()
+ @IsString()
+ notificationSettings?: string;
+
+ @IsOptional()
+ @IsBoolean()
+ onboardingCompleted?: boolean;
+}
+
+@Controller('users')
+export class UsersController {
+ constructor(private usersService: UsersService) {}
+
+ @Get('me')
+ @UseGuards(AuthGuard)
+ async getCurrentUser(@CurrentUser() user: User) {
+ return this.usersService.getUserById(user.id);
+ }
+
+ @Patch('me')
+ @UseGuards(AuthGuard)
+ async updateCurrentUser(
+ @CurrentUser() user: User,
+ @Body() body: UpdateUserDto,
+ ) {
+ return this.usersService.updateUser(user.id, body);
+ }
+
+ @Patch('me/onboarding')
+ @UseGuards(AuthGuard)
+ async completeOnboarding(@CurrentUser() user: User) {
+ await this.usersService.completeOnboarding(user.id);
+ return { success: true };
+ }
+}
diff --git a/news/apps/api/src/users/users.module.ts b/news/apps/api/src/users/users.module.ts
new file mode 100644
index 000000000..f45038b5f
--- /dev/null
+++ b/news/apps/api/src/users/users.module.ts
@@ -0,0 +1,12 @@
+import { Module } from '@nestjs/common';
+import { UsersController } from './users.controller';
+import { UsersService } from './users.service';
+import { AuthModule } from '../auth/auth.module';
+
+@Module({
+ imports: [AuthModule],
+ controllers: [UsersController],
+ providers: [UsersService],
+ exports: [UsersService],
+})
+export class UsersModule {}
diff --git a/news/apps/api/src/users/users.service.ts b/news/apps/api/src/users/users.service.ts
new file mode 100644
index 000000000..731941945
--- /dev/null
+++ b/news/apps/api/src/users/users.service.ts
@@ -0,0 +1,51 @@
+import { Injectable, Inject } from '@nestjs/common';
+import { DATABASE_CONNECTION } from '../database/database.module';
+import { Database, users, User, eq } from '@manacore/news-database';
+
+@Injectable()
+export class UsersService {
+ constructor(@Inject(DATABASE_CONNECTION) private database: Database) {}
+
+ async getUserById(userId: string): Promise {
+ const [user] = await this.database
+ .select()
+ .from(users)
+ .where(eq(users.id, userId))
+ .limit(1);
+
+ return user || null;
+ }
+
+ async updateUser(
+ userId: string,
+ data: {
+ name?: string;
+ preferredCategories?: string[];
+ blockedSources?: string[];
+ readingSpeed?: 'slow' | 'normal' | 'fast';
+ notificationSettings?: string;
+ onboardingCompleted?: boolean;
+ },
+ ): Promise {
+ const [user] = await this.database
+ .update(users)
+ .set({
+ ...data,
+ updatedAt: new Date(),
+ })
+ .where(eq(users.id, userId))
+ .returning();
+
+ return user;
+ }
+
+ async completeOnboarding(userId: string): Promise {
+ await this.database
+ .update(users)
+ .set({
+ onboardingCompleted: true,
+ updatedAt: new Date(),
+ })
+ .where(eq(users.id, userId));
+ }
+}
diff --git a/news/apps/api/tsconfig.json b/news/apps/api/tsconfig.json
new file mode 100644
index 000000000..6e928c7ee
--- /dev/null
+++ b/news/apps/api/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "declaration": true,
+ "removeComments": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "target": "ES2022",
+ "sourceMap": true,
+ "outDir": "./dist",
+ "baseUrl": "./",
+ "incremental": true,
+ "skipLibCheck": true,
+ "strictNullChecks": true,
+ "noImplicitAny": true,
+ "strictBindCallApply": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "esModuleInterop": true,
+ "resolveJsonModule": true
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/news/apps/landing/astro.config.mjs b/news/apps/landing/astro.config.mjs
new file mode 100644
index 000000000..139c20a0b
--- /dev/null
+++ b/news/apps/landing/astro.config.mjs
@@ -0,0 +1,11 @@
+import { defineConfig } from 'astro/config';
+import tailwind from '@astrojs/tailwind';
+import sitemap from '@astrojs/sitemap';
+
+export default defineConfig({
+ site: 'https://news.manacore.app',
+ integrations: [
+ tailwind(),
+ sitemap()
+ ]
+});
diff --git a/news/apps/landing/package.json b/news/apps/landing/package.json
new file mode 100644
index 000000000..8e4fbd155
--- /dev/null
+++ b/news/apps/landing/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "@news/landing",
+ "version": "1.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "astro dev",
+ "start": "astro dev",
+ "build": "astro check && astro build",
+ "preview": "astro preview",
+ "astro": "astro",
+ "type-check": "astro check"
+ },
+ "dependencies": {
+ "@astrojs/check": "^0.9.0",
+ "@astrojs/sitemap": "^3.2.1",
+ "@manacore/shared-landing-ui": "workspace:*",
+ "astro": "^5.16.0",
+ "typescript": "^5.0.0"
+ },
+ "devDependencies": {
+ "@astrojs/tailwind": "^6.0.0",
+ "@tailwindcss/typography": "^0.5.16",
+ "tailwindcss": "^3.4.17"
+ }
+}
diff --git a/news/apps/landing/src/components/Footer.astro b/news/apps/landing/src/components/Footer.astro
new file mode 100644
index 000000000..dc25219f9
--- /dev/null
+++ b/news/apps/landing/src/components/Footer.astro
@@ -0,0 +1,80 @@
+---
+const footerLinks = {
+ product: [
+ { href: '#features', label: 'Features' },
+ { href: '#pricing', label: 'Preise' },
+ { href: '#faq', label: 'FAQ' }
+ ],
+ legal: [
+ { href: '/privacy', label: 'Datenschutz' },
+ { href: '/terms', label: 'AGB' },
+ { href: '/imprint', label: 'Impressum' }
+ ]
+};
+
+const currentYear = new Date().getFullYear();
+---
+
+
diff --git a/news/apps/landing/src/components/Navigation.astro b/news/apps/landing/src/components/Navigation.astro
new file mode 100644
index 000000000..82aa381a1
--- /dev/null
+++ b/news/apps/landing/src/components/Navigation.astro
@@ -0,0 +1,86 @@
+---
+const navLinks = [
+ { href: '#features', label: 'Features' },
+ { href: '#how-it-works', label: 'So funktioniert\'s' },
+ { href: '#pricing', label: 'Preise' },
+ { href: '#faq', label: 'FAQ' }
+];
+---
+
+
+
+
diff --git a/news/apps/landing/src/layouts/Layout.astro b/news/apps/landing/src/layouts/Layout.astro
new file mode 100644
index 000000000..73cb4f509
--- /dev/null
+++ b/news/apps/landing/src/layouts/Layout.astro
@@ -0,0 +1,47 @@
+---
+import '../styles/global.css';
+
+interface Props {
+ title: string;
+ description?: string;
+}
+
+const {
+ title,
+ description = 'News Hub - KI-kuratierte Nachrichten, personalisiert für dich'
+} = Astro.props;
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
diff --git a/news/apps/landing/src/pages/index.astro b/news/apps/landing/src/pages/index.astro
new file mode 100644
index 000000000..9ae53a467
--- /dev/null
+++ b/news/apps/landing/src/pages/index.astro
@@ -0,0 +1,259 @@
+---
+import Layout from '../layouts/Layout.astro';
+import Navigation from '../components/Navigation.astro';
+import Footer from '../components/Footer.astro';
+
+// Shared components
+import HeroSection from '@manacore/shared-landing-ui/sections/HeroSection.astro';
+import FeatureSection from '@manacore/shared-landing-ui/sections/FeatureSection.astro';
+import StepsSection from '@manacore/shared-landing-ui/sections/StepsSection.astro';
+import FAQSection from '@manacore/shared-landing-ui/sections/FAQSection.astro';
+import CTASection from '@manacore/shared-landing-ui/sections/CTASection.astro';
+import PricingSection from '@manacore/shared-landing-ui/sections/PricingSection.astro';
+
+// Feature data
+const features = [
+ {
+ icon: '📰',
+ title: 'Feed',
+ description: 'Schnelle News-Updates im Infinite-Scroll Format. Bleib auf dem Laufenden mit kurzen, prägnanten Nachrichten.'
+ },
+ {
+ icon: '📝',
+ title: 'Zusammenfassungen',
+ description: '4 tägliche Zusammenfassungen (Morgen, Mittag, Abend, Nacht) - perfekt für einen schnellen Überblick.'
+ },
+ {
+ icon: '📖',
+ title: 'In-Depth Artikel',
+ description: 'Ausführliche Analysen (5-15 Min. Lesezeit) für tiefes Verständnis komplexer Themen.'
+ },
+ {
+ icon: '🔖',
+ title: 'Artikel speichern',
+ description: 'Speichere interessante Artikel mit der Browser-Extension und lese sie später in der App.'
+ },
+ {
+ icon: '🎯',
+ title: 'Personalisierte Kategorien',
+ description: 'Wähle deine Interessengebiete und erhalte maßgeschneiderte Nachrichten-Empfehlungen.'
+ },
+ {
+ icon: '🔄',
+ title: 'Cross-Platform Sync',
+ description: 'Deine Artikel, Lesefortschritt und Einstellungen werden auf allen Geräten synchronisiert.'
+ }
+];
+
+// Steps data
+const steps = [
+ {
+ number: '1',
+ title: 'App herunterladen',
+ description: 'Lade News Hub kostenlos im App Store oder Google Play Store herunter.',
+ image: '/screenshots/download.png'
+ },
+ {
+ number: '2',
+ title: 'Kategorien wählen',
+ description: 'Wähle deine Interessengebiete für personalisierte Nachrichten.',
+ image: '/screenshots/categories.png'
+ },
+ {
+ number: '3',
+ title: 'Informiert bleiben',
+ description: 'Erhalte täglich kuratierte News im Feed, Zusammenfassungen oder In-Depth Artikeln.',
+ image: '/screenshots/feed.png'
+ }
+];
+
+// Pricing data
+const pricingPlans = [
+ {
+ name: 'Free',
+ price: '0',
+ period: '/Monat',
+ description: 'Perfekt zum Ausprobieren',
+ features: [
+ { text: 'Feed mit allen News', included: true },
+ { text: '2 Zusammenfassungen/Tag', included: true },
+ { text: '5 Artikel speichern', included: true },
+ { text: 'Basis-Kategorien', included: true },
+ { text: 'In-Depth Artikel', included: false },
+ { text: 'Browser Extension', included: false }
+ ],
+ cta: {
+ text: 'Kostenlos starten',
+ href: '#download'
+ }
+ },
+ {
+ name: 'Pro',
+ price: '4,99',
+ period: '/Monat',
+ description: 'Für Nachrichten-Enthusiasten',
+ features: [
+ { text: 'Unbegrenzter Feed', included: true },
+ { text: 'Alle 4 Zusammenfassungen', included: true },
+ { text: 'In-Depth Artikel', included: true },
+ { text: 'Unbegrenzt speichern', included: true },
+ { text: 'Browser Extension', included: true },
+ { text: 'Alle Kategorien', included: true }
+ ],
+ cta: {
+ text: 'Pro werden',
+ href: '#download'
+ },
+ highlighted: true,
+ badge: 'Beliebt'
+ },
+ {
+ name: 'Team',
+ price: '12,99',
+ period: '/Monat',
+ description: 'Für Teams und Unternehmen',
+ features: [
+ { text: 'Alles aus Pro', included: true },
+ { text: 'Team-Verwaltung', included: true },
+ { text: 'Geteilte Sammlungen', included: true },
+ { text: 'Custom Kategorien', included: true },
+ { text: 'API-Zugang', included: true },
+ { text: 'Prioritäts-Support', included: true }
+ ],
+ cta: {
+ text: 'Team starten',
+ href: '#download'
+ }
+ }
+];
+
+// FAQ data
+const faqs = [
+ {
+ question: 'Was macht News Hub anders als andere News-Apps?',
+ answer: 'News Hub nutzt KI um Nachrichten zu kuratieren und in drei Formaten anzubieten: schnelle Feed-Updates, tägliche Zusammenfassungen und ausführliche Analysen. Du entscheidest, wie tief du in ein Thema eintauchen möchtest.'
+ },
+ {
+ question: 'Wie funktionieren die täglichen Zusammenfassungen?',
+ answer: 'Du erhältst 4 Zusammenfassungen pro Tag: Morgen (6 Uhr), Mittag (12 Uhr), Abend (18 Uhr) und Nacht (22 Uhr). Jede Zusammenfassung fasst die wichtigsten Ereignisse der letzten Stunden zusammen.'
+ },
+ {
+ question: 'Kann ich Artikel von anderen Webseiten speichern?',
+ answer: 'Ja! Mit der Browser Extension (Pro) kannst du jeden Artikel von jeder Webseite mit einem Klick speichern. Der Artikel wird automatisch für die App optimiert und ist offline verfügbar.'
+ },
+ {
+ question: 'Sind meine Daten sicher?',
+ answer: 'Absolut. Wir speichern nur das Nötigste und verkaufen keine Nutzerdaten. Die App ist vollständig DSGVO-konform und du kannst deine Daten jederzeit exportieren oder löschen.'
+ },
+ {
+ question: 'Funktioniert News Hub offline?',
+ answer: 'Ja! Bereits geladene Artikel und Zusammenfassungen sind offline verfügbar. Neue Inhalte werden synchronisiert, sobald du wieder online bist.'
+ },
+ {
+ question: 'Kann ich mein Abo jederzeit kündigen?',
+ answer: 'Ja, du kannst dein Pro- oder Team-Abo jederzeit kündigen. Nach der Kündigung hast du noch bis zum Ende des Abrechnungszeitraums Zugang zu allen Premium-Features.'
+ }
+];
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
100% Kostenlos starten
+
+
+
+
+
Keine Kreditkarte nötig
+
+
+
+
+
+
+
diff --git a/news/apps/landing/src/styles/global.css b/news/apps/landing/src/styles/global.css
new file mode 100644
index 000000000..266b27b23
--- /dev/null
+++ b/news/apps/landing/src/styles/global.css
@@ -0,0 +1,103 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+/* News Hub Theme CSS Variables - Purple/Indigo */
+:root {
+ /* Primary colors - News Hub Purple */
+ --color-primary: #6366f1;
+ --color-primary-hover: #818cf8;
+ --color-primary-glow: rgba(99, 102, 241, 0.3);
+
+ /* Text colors */
+ --color-text-primary: #f9fafb;
+ --color-text-secondary: #d1d5db;
+ --color-text-muted: #6b7280;
+
+ /* Background colors */
+ --color-background-page: #0f0f1a;
+ --color-background-card: #1a1a2e;
+ --color-background-card-hover: #252542;
+
+ /* Border colors */
+ --color-border: #252542;
+ --color-border-hover: #3a3a5c;
+}
+
+/* Base styles */
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: 'Inter', system-ui, sans-serif;
+ background-color: var(--color-background-page);
+ color: var(--color-text-primary);
+ line-height: 1.6;
+}
+
+/* Custom scrollbar */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--color-background-card);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--color-border);
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-border-hover);
+}
+
+/* Selection */
+::selection {
+ background-color: var(--color-primary);
+ color: white;
+}
+
+/* Focus styles */
+:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+/* Gradient text */
+.text-gradient {
+ background: linear-gradient(135deg, #6366f1 0%, #818cf8 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+/* Animation utilities */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-fadeIn {
+ animation: fadeIn 0.6s ease-out forwards;
+}
+
+/* Button styles */
+.btn-primary {
+ @apply inline-flex items-center justify-center px-6 py-3 bg-primary text-white font-semibold rounded-lg transition-all duration-200;
+ @apply hover:bg-primary-hover hover:shadow-lg hover:shadow-primary-glow;
+}
+
+.btn-secondary {
+ @apply inline-flex items-center justify-center px-6 py-3 border border-border text-text-primary font-semibold rounded-lg transition-all duration-200;
+ @apply hover:border-border-hover hover:bg-background-card;
+}
diff --git a/news/apps/landing/tailwind.config.mjs b/news/apps/landing/tailwind.config.mjs
new file mode 100644
index 000000000..d7222e3f4
--- /dev/null
+++ b/news/apps/landing/tailwind.config.mjs
@@ -0,0 +1,39 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
+ '../../packages/shared-landing-ui/src/**/*.{astro,html,js,jsx,ts,tsx}'
+ ],
+ theme: {
+ extend: {
+ colors: {
+ // News Hub Purple/Indigo Theme
+ primary: {
+ DEFAULT: '#6366f1',
+ hover: '#818cf8',
+ glow: 'rgba(99, 102, 241, 0.3)'
+ },
+ background: {
+ page: '#0f0f1a',
+ card: '#1a1a2e',
+ 'card-hover': '#252542'
+ },
+ text: {
+ primary: '#f9fafb',
+ secondary: '#d1d5db',
+ muted: '#6b7280'
+ },
+ border: {
+ DEFAULT: '#252542',
+ hover: '#3a3a5c'
+ }
+ },
+ fontFamily: {
+ sans: ['Inter', 'system-ui', 'sans-serif']
+ }
+ }
+ },
+ plugins: [
+ require('@tailwindcss/typography')
+ ]
+};
diff --git a/news/apps/landing/tsconfig.json b/news/apps/landing/tsconfig.json
new file mode 100644
index 000000000..c5450d304
--- /dev/null
+++ b/news/apps/landing/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"]
+ }
+ }
+}
diff --git a/news/apps/web/.env.example b/news/apps/web/.env.example
new file mode 100644
index 000000000..61263d848
--- /dev/null
+++ b/news/apps/web/.env.example
@@ -0,0 +1,2 @@
+# News Hub Web App Configuration
+PUBLIC_NEWS_API_URL=http://localhost:3000
diff --git a/news/apps/web/package.json b/news/apps/web/package.json
new file mode 100644
index 000000000..86f1740fe
--- /dev/null
+++ b/news/apps/web/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "@news/web",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "prepare": "svelte-kit sync || echo ''",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "type-check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json"
+ },
+ "devDependencies": {
+ "@sveltejs/adapter-auto": "^6.0.0",
+ "@sveltejs/kit": "^2.43.2",
+ "@sveltejs/vite-plugin-svelte": "^6.2.0",
+ "@tailwindcss/postcss": "^4.1.17",
+ "@tailwindcss/typography": "^0.5.19",
+ "autoprefixer": "^10.4.21",
+ "postcss": "^8.5.6",
+ "svelte": "^5.39.5",
+ "svelte-check": "^4.3.2",
+ "tailwindcss": "^4.1.17",
+ "typescript": "^5.9.3",
+ "vite": "^7.1.7"
+ },
+ "dependencies": {
+ "@manacore/shared-auth-ui": "workspace:*",
+ "@manacore/shared-branding": "workspace:*",
+ "@manacore/shared-i18n": "workspace:*",
+ "@manacore/shared-icons": "workspace:*",
+ "@manacore/shared-tailwind": "workspace:*",
+ "@manacore/shared-theme": "workspace:*",
+ "@manacore/shared-theme-ui": "workspace:*",
+ "@manacore/shared-ui": "workspace:*",
+ "@manacore/shared-utils": "workspace:*",
+ "marked": "^17.0.0"
+ }
+}
diff --git a/news/apps/web/src/app.css b/news/apps/web/src/app.css
new file mode 100644
index 000000000..d75fc9594
--- /dev/null
+++ b/news/apps/web/src/app.css
@@ -0,0 +1,8 @@
+@import "tailwindcss";
+@import "@manacore/shared-tailwind/themes.css";
+
+/* Scan shared packages for Tailwind classes */
+@source "../../../../packages/shared-ui/src";
+@source "../../../../packages/shared-auth-ui/src";
+@source "../../../../packages/shared-branding/src";
+@source "../../../../packages/shared-theme-ui/src";
diff --git a/news/apps/web/src/app.d.ts b/news/apps/web/src/app.d.ts
new file mode 100644
index 000000000..7410cecc5
--- /dev/null
+++ b/news/apps/web/src/app.d.ts
@@ -0,0 +1,33 @@
+// See https://svelte.dev/docs/kit/types#app.d.ts
+// for information about these interfaces
+
+interface NewsUser {
+ id: string;
+ email: string;
+ name?: string;
+ createdAt: string;
+}
+
+interface NewsSession {
+ token: string;
+ userId: string;
+ expiresAt: string;
+}
+
+declare global {
+ namespace App {
+ // interface Error {}
+ interface Locals {
+ session: NewsSession | null;
+ user: NewsUser | null;
+ }
+ interface PageData {
+ session: NewsSession | null;
+ user: NewsUser | null;
+ }
+ // interface PageState {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/news/apps/web/src/app.html b/news/apps/web/src/app.html
new file mode 100644
index 000000000..e31c3501d
--- /dev/null
+++ b/news/apps/web/src/app.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+ %sveltekit.body%
+
+
diff --git a/news/apps/web/src/lib/services/api.ts b/news/apps/web/src/lib/services/api.ts
new file mode 100644
index 000000000..732b72057
--- /dev/null
+++ b/news/apps/web/src/lib/services/api.ts
@@ -0,0 +1,95 @@
+import { env } from '$env/dynamic/public';
+
+const API_URL = env.PUBLIC_NEWS_API_URL || 'http://localhost:3000';
+
+interface ApiResponse {
+ data?: T;
+ error?: string;
+}
+
+export async function apiRequest(
+ endpoint: string,
+ options: RequestInit = {},
+ token?: string
+): Promise> {
+ try {
+ const headers: Record = {
+ 'Content-Type': 'application/json',
+ ...(options.headers as Record),
+ };
+
+ if (token) {
+ headers['Authorization'] = `Bearer ${token}`;
+ }
+
+ const response = await fetch(`${API_URL}${endpoint}`, {
+ ...options,
+ headers,
+ });
+
+ if (!response.ok) {
+ const errorText = await response.text();
+ return { error: errorText || `HTTP ${response.status}` };
+ }
+
+ const data = await response.json();
+ return { data };
+ } catch (error) {
+ return { error: error instanceof Error ? error.message : 'Unknown error' };
+ }
+}
+
+// Auth endpoints
+export const authApi = {
+ login: (email: string, password: string) =>
+ apiRequest<{ token: string; user: App.Locals['user'] }>('/auth/login', {
+ method: 'POST',
+ body: JSON.stringify({ email, password }),
+ }),
+
+ signup: (email: string, password: string, name?: string) =>
+ apiRequest<{ token: string; user: App.Locals['user'] }>('/auth/signup', {
+ method: 'POST',
+ body: JSON.stringify({ email, password, name }),
+ }),
+
+ logout: (token: string) =>
+ apiRequest('/auth/logout', { method: 'POST' }, token),
+
+ me: (token: string) =>
+ apiRequest('/auth/me', {}, token),
+};
+
+// Articles endpoints
+export const articlesApi = {
+ getArticles: (params?: { type?: string; categoryId?: string; limit?: number; offset?: number }, token?: string) => {
+ const searchParams = new URLSearchParams();
+ if (params?.type) searchParams.set('type', params.type);
+ if (params?.categoryId) searchParams.set('categoryId', params.categoryId);
+ if (params?.limit) searchParams.set('limit', params.limit.toString());
+ if (params?.offset) searchParams.set('offset', params.offset.toString());
+ const query = searchParams.toString();
+ return apiRequest(`/articles${query ? `?${query}` : ''}`, {}, token);
+ },
+
+ getArticle: (id: string, token?: string) =>
+ apiRequest(`/articles/${id}`, {}, token),
+
+ getSavedArticles: (token: string) =>
+ apiRequest('/articles/saved/list', {}, token),
+
+ archiveArticle: (id: string, token: string) =>
+ apiRequest(`/articles/${id}/archive`, { method: 'POST' }, token),
+
+ unarchiveArticle: (id: string, token: string) =>
+ apiRequest(`/articles/${id}/unarchive`, { method: 'POST' }, token),
+
+ deleteArticle: (id: string, token: string) =>
+ apiRequest(`/articles/${id}`, { method: 'DELETE' }, token),
+};
+
+// Categories endpoints
+export const categoriesApi = {
+ getCategories: (token?: string) =>
+ apiRequest('/categories', {}, token),
+};
diff --git a/news/apps/web/src/lib/stores/auth.svelte.ts b/news/apps/web/src/lib/stores/auth.svelte.ts
new file mode 100644
index 000000000..62baba218
--- /dev/null
+++ b/news/apps/web/src/lib/stores/auth.svelte.ts
@@ -0,0 +1,81 @@
+import { authApi } from '$lib/services/api';
+
+class AuthStore {
+ user = $state(null);
+ session = $state(null);
+ loading = $state(false);
+ error = $state(null);
+
+ get isAuthenticated() {
+ return !!this.session && !!this.user;
+ }
+
+ async login(email: string, password: string) {
+ this.loading = true;
+ this.error = null;
+
+ const { data, error } = await authApi.login(email, password);
+
+ if (error) {
+ this.error = error;
+ this.loading = false;
+ return false;
+ }
+
+ if (data) {
+ this.session = { token: data.token, userId: data.user?.id ?? '', expiresAt: '' };
+ this.user = data.user;
+ // Store token in cookie/localStorage
+ if (typeof window !== 'undefined') {
+ document.cookie = `news_session=${data.token}; path=/; max-age=604800`; // 7 days
+ }
+ }
+
+ this.loading = false;
+ return true;
+ }
+
+ async signup(email: string, password: string, name?: string) {
+ this.loading = true;
+ this.error = null;
+
+ const { data, error } = await authApi.signup(email, password, name);
+
+ if (error) {
+ this.error = error;
+ this.loading = false;
+ return false;
+ }
+
+ if (data) {
+ this.session = { token: data.token, userId: data.user?.id ?? '', expiresAt: '' };
+ this.user = data.user;
+ if (typeof window !== 'undefined') {
+ document.cookie = `news_session=${data.token}; path=/; max-age=604800`;
+ }
+ }
+
+ this.loading = false;
+ return true;
+ }
+
+ async logout() {
+ if (this.session?.token) {
+ await authApi.logout(this.session.token);
+ }
+
+ this.session = null;
+ this.user = null;
+
+ if (typeof window !== 'undefined') {
+ document.cookie = 'news_session=; path=/; max-age=0';
+ }
+ }
+
+ setSession(session: App.Locals['session'], user: App.Locals['user']) {
+ this.session = session;
+ this.user = user;
+ }
+}
+
+export const authStore = new AuthStore();
diff --git a/news/apps/web/src/routes/(protected)/+layout.svelte b/news/apps/web/src/routes/(protected)/+layout.svelte
new file mode 100644
index 000000000..881887122
--- /dev/null
+++ b/news/apps/web/src/routes/(protected)/+layout.svelte
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+ {@render children()}
+
+
diff --git a/news/apps/web/src/routes/(protected)/feed/+page.svelte b/news/apps/web/src/routes/(protected)/feed/+page.svelte
new file mode 100644
index 000000000..6da9e306e
--- /dev/null
+++ b/news/apps/web/src/routes/(protected)/feed/+page.svelte
@@ -0,0 +1,80 @@
+
+
+
+ Feed - News Hub
+
+
+
+
+
+ {#if loading}
+
+ {:else if error}
+
+ {error}
+
+ {:else if articles.length === 0}
+
+
+
Noch keine Artikel vorhanden
+
Artikel werden automatisch generiert und erscheinen hier
+
+ {:else}
+
+ {/if}
+
diff --git a/news/apps/web/src/routes/(protected)/in-depth/+page.svelte b/news/apps/web/src/routes/(protected)/in-depth/+page.svelte
new file mode 100644
index 000000000..decf811f2
--- /dev/null
+++ b/news/apps/web/src/routes/(protected)/in-depth/+page.svelte
@@ -0,0 +1,69 @@
+
+
+
+ In-Depth - News Hub
+
+
+
+
+
+ {#if loading}
+
+ {:else if error}
+
+ {error}
+
+ {:else if articles.length === 0}
+
+
Noch keine In-Depth Artikel vorhanden
+
+ {:else}
+
+ {/if}
+
diff --git a/news/apps/web/src/routes/(protected)/saved/+page.svelte b/news/apps/web/src/routes/(protected)/saved/+page.svelte
new file mode 100644
index 000000000..63c91b055
--- /dev/null
+++ b/news/apps/web/src/routes/(protected)/saved/+page.svelte
@@ -0,0 +1,73 @@
+
+
+
+ Gespeicherte Artikel - News Hub
+
+
+
+
+
+ {#if loading}
+
+ {:else if error}
+
+ {error}
+
+ {:else if articles.length === 0}
+
+
+
Noch keine Artikel gespeichert
+
Speichere Artikel mit der Browser-Extension oder aus dem Feed
+
+ {:else}
+
+ {/if}
+
diff --git a/news/apps/web/src/routes/(protected)/summaries/+page.svelte b/news/apps/web/src/routes/(protected)/summaries/+page.svelte
new file mode 100644
index 000000000..9ca59452a
--- /dev/null
+++ b/news/apps/web/src/routes/(protected)/summaries/+page.svelte
@@ -0,0 +1,66 @@
+
+
+
+ Zusammenfassungen - News Hub
+
+
+
+
+
+ {#if loading}
+
+ {:else if error}
+
+ {error}
+
+ {:else if articles.length === 0}
+
+
Noch keine Zusammenfassungen vorhanden
+
+ {:else}
+
+ {/if}
+
diff --git a/news/apps/web/src/routes/+layout.svelte b/news/apps/web/src/routes/+layout.svelte
new file mode 100644
index 000000000..e5c84ad26
--- /dev/null
+++ b/news/apps/web/src/routes/+layout.svelte
@@ -0,0 +1,17 @@
+
+
+
+ {@render children()}
+
diff --git a/news/apps/web/src/routes/+page.svelte b/news/apps/web/src/routes/+page.svelte
new file mode 100644
index 000000000..27cf6026d
--- /dev/null
+++ b/news/apps/web/src/routes/+page.svelte
@@ -0,0 +1,21 @@
+
+
+
diff --git a/news/apps/web/src/routes/auth/login/+page.svelte b/news/apps/web/src/routes/auth/login/+page.svelte
new file mode 100644
index 000000000..6b0a21308
--- /dev/null
+++ b/news/apps/web/src/routes/auth/login/+page.svelte
@@ -0,0 +1,76 @@
+
+
+
+ Login - News Hub
+
+
+
+
+
+
+
News Hub
+
Anmelden
+
+
+
+
+
+ Noch kein Konto?
+ Registrieren
+
+
+
diff --git a/news/apps/web/src/routes/auth/register/+page.svelte b/news/apps/web/src/routes/auth/register/+page.svelte
new file mode 100644
index 000000000..e537a5726
--- /dev/null
+++ b/news/apps/web/src/routes/auth/register/+page.svelte
@@ -0,0 +1,89 @@
+
+
+
+ Registrieren - News Hub
+
+
+
+
+
+
+
News Hub
+
Konto erstellen
+
+
+
+
+
+ Bereits ein Konto?
+ Anmelden
+
+
+
diff --git a/news/apps/web/svelte.config.js b/news/apps/web/svelte.config.js
new file mode 100644
index 000000000..a5b5a02ca
--- /dev/null
+++ b/news/apps/web/svelte.config.js
@@ -0,0 +1,13 @@
+import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ preprocess: vitePreprocess(),
+
+ kit: {
+ adapter: adapter()
+ }
+};
+
+export default config;
diff --git a/news/apps/web/tsconfig.json b/news/apps/web/tsconfig.json
new file mode 100644
index 000000000..43447105a
--- /dev/null
+++ b/news/apps/web/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "moduleResolution": "bundler"
+ }
+}
diff --git a/news/apps/web/vite.config.ts b/news/apps/web/vite.config.ts
new file mode 100644
index 000000000..66c75af49
--- /dev/null
+++ b/news/apps/web/vite.config.ts
@@ -0,0 +1,25 @@
+import { sveltekit } from '@sveltejs/kit/vite';
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+ plugins: [sveltekit()],
+ ssr: {
+ noExternal: [
+ 'marked',
+ '@manacore/shared-theme',
+ '@manacore/shared-auth-ui',
+ '@manacore/shared-branding',
+ '@manacore/shared-ui',
+ '@manacore/shared-theme-ui'
+ ]
+ },
+ optimizeDeps: {
+ exclude: [
+ '@manacore/shared-theme',
+ '@manacore/shared-auth-ui',
+ '@manacore/shared-branding',
+ '@manacore/shared-ui',
+ '@manacore/shared-theme-ui'
+ ]
+ }
+});
diff --git a/news/docker/docker-compose.yml b/news/docker/docker-compose.yml
new file mode 100644
index 000000000..5fcabe9c8
--- /dev/null
+++ b/news/docker/docker-compose.yml
@@ -0,0 +1,36 @@
+
+services:
+ postgres:
+ image: postgres:16-alpine
+ container_name: news-hub-db
+ restart: unless-stopped
+ environment:
+ POSTGRES_USER: news
+ POSTGRES_PASSWORD: news_dev_password
+ POSTGRES_DB: news_hub
+ ports:
+ - "5434:5432"
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ - ./init.sql:/docker-entrypoint-initdb.d/init.sql
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U news -d news_hub"]
+ interval: 5s
+ timeout: 5s
+ retries: 5
+
+ pgadmin:
+ image: dpage/pgadmin4:latest
+ container_name: news-hub-pgadmin
+ restart: unless-stopped
+ environment:
+ PGADMIN_DEFAULT_EMAIL: admin@local.dev
+ PGADMIN_DEFAULT_PASSWORD: admin
+ ports:
+ - "5050:80"
+ depends_on:
+ postgres:
+ condition: service_healthy
+
+volumes:
+ postgres_data:
diff --git a/news/docker/init.sql b/news/docker/init.sql
new file mode 100644
index 000000000..68b4117ef
--- /dev/null
+++ b/news/docker/init.sql
@@ -0,0 +1,6 @@
+-- Extensions
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
+CREATE EXTENSION IF NOT EXISTS "pg_trgm";
+
+-- Grants
+GRANT ALL PRIVILEGES ON DATABASE news_hub TO news;
diff --git a/news/packages/browser-extension/README.md b/news/packages/browser-extension/README.md
new file mode 100644
index 000000000..43aa3a28d
--- /dev/null
+++ b/news/packages/browser-extension/README.md
@@ -0,0 +1,125 @@
+# Kokon Browser Extension
+
+Eine Chrome/Firefox Browser-Erweiterung für die Kokon Read-Later App.
+
+## Features
+
+- **Ein-Klick Speichern**: Speichere jeden Artikel mit einem Klick
+- **Automatische Content-Extraktion**: Nutzt die gleiche Mozilla Readability Engine wie die App
+- **Session-Synchronisation**: Automatische Anmeldeerkennung mit der Web-App
+- **Elegantes Design**: Moderne, responsive Benutzeroberfläche
+- **Fehlerbehandlung**: Intelligente Fehlerbehandlung und Benutzerführung
+
+## Installation (Development)
+
+### Chrome/Edge
+1. Öffne `chrome://extensions/`
+2. Aktiviere "Entwicklermodus" (Developer mode)
+3. Klicke "Ungepackte Erweiterung laden" (Load unpacked)
+4. Wähle den `browser-extension` Ordner aus
+
+### Firefox
+1. Öffne `about:debugging`
+2. Klicke "Dieses Firefox" (This Firefox)
+3. Klicke "Temporäres Add-on laden" (Load Temporary Add-on)
+4. Wähle die `manifest.json` Datei aus
+
+## Verwendung
+
+1. **Erste Einrichtung**:
+ - Installiere die Erweiterung
+ - Logge dich in der Kokon Web-App ein (wird automatisch geöffnet)
+
+2. **Artikel speichern**:
+ - Navigiere zu einem beliebigen Artikel im Web
+ - Klicke auf das Kokon-Symbol in der Browser-Toolbar
+ - Klicke "Save Article"
+ - Der Artikel wird automatisch verarbeitet und in deiner Kokon-Liste gespeichert
+
+## Technische Details
+
+### Architektur
+- **Manifest V3**: Moderne Chrome Extension API
+- **Service Worker**: Background-Verarbeitung für Session-Management
+- **Popup Interface**: Elegant gestaltetes Popup mit Echtzeit-Feedback
+- **Chrome Storage API**: Synchronisation mit Web-App-Sessions
+
+### Sicherheit
+- **Minimale Berechtigungen**: Nur `activeTab` und `storage`
+- **HTTPS Only**: Sichere Kommunikation mit Supabase
+- **Token-basierte Auth**: Nutzt bestehende Supabase-Session
+- **Domain-Validierung**: Verhindert Speichern von Browser-internen Seiten
+
+### Integration
+- Nutzt die gleiche `save-article` Edge Function wie die App
+- Teilt sich die Session mit der Web-App über Chrome Storage
+- Automatische Token-Erneuerung und Logout-Erkennung
+
+## Datei-Struktur
+
+```
+browser-extension/
+├── manifest.json # Extension-Konfiguration (Manifest V3)
+├── popup.html # Popup-Interface HTML
+├── popup.js # Popup-Logik und API-Calls
+├── background.js # Service Worker für Background-Tasks
+├── icons/ # Extension-Icons (TODO: Icons hinzufügen)
+│ ├── icon-16.png
+│ ├── icon-32.png
+│ ├── icon-48.png
+│ └── icon-128.png
+└── README.md # Diese Datei
+```
+
+## TODO: Icons
+
+Die Extension benötigt noch Icons in verschiedenen Größen:
+- 16x16px (Toolbar)
+- 32x32px (Extension-Management)
+- 48x48px (Extension-Management)
+- 128x128px (Chrome Web Store)
+
+Icons sollten das Kokon-Logo (🥥) oder ein ähnliches Design verwenden.
+
+## Chrome Web Store Deployment
+
+Für die Veröffentlichung im Chrome Web Store:
+
+1. **Icons hinzufügen** (siehe TODO oben)
+2. **Version bumpen** in `manifest.json`
+3. **Extension packen**:
+ ```bash
+ zip -r kokon-extension.zip browser-extension/
+ ```
+4. **Chrome Developer Dashboard**: Upload auf [Chrome Web Store Developer Dashboard](https://chrome.google.com/webstore/devconsole)
+
+## Firefox Add-ons Deployment
+
+Für Mozilla Add-ons:
+
+1. **Firefox-spezifische Anpassungen** (falls nötig)
+2. **Signierung** über [Mozilla Add-on Developer Hub](https://addons.mozilla.org/developers/)
+
+## Entwicklung
+
+### Testing
+1. Lade die Extension im Entwicklermodus
+2. Öffne eine beliebige Webseite
+3. Teste das Popup und die Save-Funktionalität
+4. Überprüfe die Browser-Konsole für Fehler
+
+### Debugging
+- **Popup debuggen**: Rechtsklick auf Extension-Icon → "Inspect popup"
+- **Background Script**: In `chrome://extensions/` → "Inspect views: background page"
+- **Storage prüfen**: Chrome DevTools → Application → Storage → Extension
+
+## Kompatibilität
+
+- **Chrome**: Version 88+ (Manifest V3 Support)
+- **Edge**: Version 88+ (Chromium-basiert)
+- **Firefox**: Version 109+ (Manifest V3 Support)
+- **Safari**: Benötigt Anpassungen für Safari Web Extensions
+
+## Lizenz
+
+Teil des Kokon-Projekts - siehe Haupt-Repository für Lizenzdetails.
\ No newline at end of file
diff --git a/news/packages/browser-extension/background.js b/news/packages/browser-extension/background.js
new file mode 100644
index 000000000..a1b35a084
--- /dev/null
+++ b/news/packages/browser-extension/background.js
@@ -0,0 +1,64 @@
+// Background service worker for Kokon Browser Extension
+
+// Installation handler
+chrome.runtime.onInstalled.addListener((details) => {
+ if (details.reason === 'install') {
+ console.log('Kokon extension installed');
+
+ // Optionally open the web app on first install
+ chrome.tabs.create({
+ url: 'http://localhost:8081' // Local Expo web development server
+ });
+ }
+});
+
+// Handle extension icon click (this is mainly handled by the popup, but kept for completeness)
+chrome.action.onClicked.addListener((tab) => {
+ // This won't fire if popup.html is defined in manifest, but keeping for fallback
+ console.log('Extension icon clicked for tab:', tab.url);
+});
+
+// Listen for messages from content scripts (if needed in the future)
+chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
+ console.log('Background received message:', request);
+
+ // Handle any background tasks here
+ if (request.action === 'saveArticle') {
+ // This could be used for context menu integration in the future
+ console.log('Save article request for:', request.url);
+ }
+
+ return true; // Keep message channel open for async response
+});
+
+// Sync storage with web app (for session management)
+chrome.storage.onChanged.addListener((changes, areaName) => {
+ if (areaName === 'local') {
+ console.log('Storage changed:', changes);
+
+ // Monitor auth state changes
+ if (changes['supabase.auth.token']) {
+ const newToken = changes['supabase.auth.token'].newValue;
+ if (newToken) {
+ console.log('User logged in');
+ // Could update badge or perform other actions
+ } else {
+ console.log('User logged out');
+ }
+ }
+ }
+});
+
+// Handle context menu (optional future feature)
+// chrome.contextMenus.create({
+// id: "saveToKokon",
+// title: "Save to Kokon",
+// contexts: ["page", "link"]
+// });
+
+// chrome.contextMenus.onClicked.addListener((info, tab) => {
+// if (info.menuItemId === "saveToKokon") {
+// const url = info.linkUrl || tab.url;
+// // Handle saving the article
+// }
+// });
\ No newline at end of file
diff --git a/news/packages/browser-extension/content.js b/news/packages/browser-extension/content.js
new file mode 100644
index 000000000..2dc0ee47e
--- /dev/null
+++ b/news/packages/browser-extension/content.js
@@ -0,0 +1,85 @@
+// Content script to sync localStorage with Chrome storage
+console.log('🥥 Kokon content script loaded on:', window.location.href);
+
+// Function to sync localStorage to Chrome storage
+function syncToChrome(key, value) {
+ if (chrome && chrome.storage) {
+ chrome.storage.local.set({ [key]: value }).then(() => {
+ console.log('Content script: Successfully synced to Chrome storage:', key);
+ }).catch((error) => {
+ console.error('Content script: Failed to sync to Chrome storage:', error);
+ });
+ }
+}
+
+// Function to sync removal from localStorage to Chrome storage
+function removeFromChrome(key) {
+ if (chrome && chrome.storage) {
+ chrome.storage.local.remove([key]).then(() => {
+ console.log('Content script: Successfully removed from Chrome storage:', key);
+ }).catch((error) => {
+ console.error('Content script: Failed to remove from Chrome storage:', error);
+ });
+ }
+}
+
+// Listen for localStorage changes and sync to Chrome storage
+function setupStorageSync() {
+ console.log('🥥 Setting up storage sync...');
+
+ // The actual Supabase auth token key
+ const SUPABASE_AUTH_KEY = 'sb-hepsjdbvpkumaoabbycd-auth-token';
+
+ // Override localStorage.setItem to sync
+ const originalSetItem = localStorage.setItem;
+ localStorage.setItem = function(key, value) {
+ console.log('🥥 localStorage.setItem called:', key);
+ originalSetItem.call(this, key, value);
+ if (key === SUPABASE_AUTH_KEY) {
+ console.log('🥥 Detected supabase token change, syncing...');
+ // Store with standardized key for extension
+ syncToChrome('supabase.auth.token', value);
+ }
+ };
+
+ // Override localStorage.removeItem to sync
+ const originalRemoveItem = localStorage.removeItem;
+ localStorage.removeItem = function(key) {
+ console.log('🥥 localStorage.removeItem called:', key);
+ originalRemoveItem.call(this, key);
+ if (key === SUPABASE_AUTH_KEY) {
+ console.log('🥥 Detected supabase token removal, syncing...');
+ removeFromChrome('supabase.auth.token');
+ }
+ };
+
+ // Check for existing token on page load
+ const existingToken = localStorage.getItem(SUPABASE_AUTH_KEY);
+ console.log('🥥 Checking for existing token:', existingToken ? 'Found' : 'Not found');
+ if (existingToken) {
+ console.log('🥥 Found existing token, syncing...');
+ syncToChrome('supabase.auth.token', existingToken);
+ }
+
+ // Also check all localStorage keys
+ console.log('🥥 All localStorage keys:', Object.keys(localStorage));
+}
+
+// Set up the sync when the page loads
+if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', setupStorageSync);
+} else {
+ setupStorageSync();
+}
+
+// Also listen for storage events (in case other tabs make changes)
+window.addEventListener('storage', (e) => {
+ if (e.key === 'sb-hepsjdbvpkumaoabbycd-auth-token') {
+ console.log('🥥 Storage event detected for supabase token');
+ if (e.newValue) {
+ syncToChrome('supabase.auth.token', e.newValue);
+ } else {
+ removeFromChrome('supabase.auth.token');
+ }
+ }
+});
\ No newline at end of file
diff --git a/news/packages/browser-extension/debug.html b/news/packages/browser-extension/debug.html
new file mode 100644
index 000000000..a058b9eaa
--- /dev/null
+++ b/news/packages/browser-extension/debug.html
@@ -0,0 +1,28 @@
+
+
+
+ Debug Extension Storage
+
+
+
+ Kokon Extension Debug
+
+
+
+
+
+
+
+
+
Chrome Storage Contents:
+
Loading...
+
+
+
+
+
\ No newline at end of file
diff --git a/news/packages/browser-extension/debug.js b/news/packages/browser-extension/debug.js
new file mode 100644
index 000000000..737807270
--- /dev/null
+++ b/news/packages/browser-extension/debug.js
@@ -0,0 +1,51 @@
+// Debug script for Extension Storage
+
+async function checkStorage() {
+ try {
+ const result = await chrome.storage.local.get(null);
+ document.getElementById('storageContent').textContent = JSON.stringify(result, null, 2);
+ console.log('Chrome Storage contents:', result);
+ } catch (error) {
+ document.getElementById('storageContent').textContent = 'Error: ' + error.message;
+ console.error('Error checking storage:', error);
+ }
+}
+
+async function clearStorage() {
+ try {
+ await chrome.storage.local.clear();
+ document.getElementById('storageContent').textContent = 'Storage cleared';
+ console.log('Chrome Storage cleared');
+ } catch (error) {
+ console.error('Error clearing storage:', error);
+ }
+}
+
+async function setTestData() {
+ try {
+ const testSession = {
+ access_token: 'test-token',
+ expires_at: Math.floor(Date.now() / 1000) + 3600, // 1 hour from now
+ refresh_token: 'test-refresh'
+ };
+
+ await chrome.storage.local.set({
+ 'supabase.auth.token': JSON.stringify(testSession)
+ });
+
+ document.getElementById('storageContent').textContent = 'Test data set';
+ console.log('Test data set in Chrome Storage');
+ } catch (error) {
+ console.error('Error setting test data:', error);
+ }
+}
+
+// Set up event listeners when DOM is loaded
+document.addEventListener('DOMContentLoaded', () => {
+ document.getElementById('checkBtn').addEventListener('click', checkStorage);
+ document.getElementById('clearBtn').addEventListener('click', clearStorage);
+ document.getElementById('testBtn').addEventListener('click', setTestData);
+
+ // Auto-check on load
+ checkStorage();
+});
\ No newline at end of file
diff --git a/news/packages/browser-extension/manifest.json b/news/packages/browser-extension/manifest.json
new file mode 100644
index 000000000..a591f6000
--- /dev/null
+++ b/news/packages/browser-extension/manifest.json
@@ -0,0 +1,35 @@
+{
+ "manifest_version": 3,
+ "name": "News Hub - Save Article",
+ "version": "1.0.0",
+ "description": "Save articles from any website to your News Hub library",
+ "permissions": [
+ "activeTab",
+ "storage"
+ ],
+ "host_permissions": [
+ "http://localhost:3000/*"
+ ],
+ "action": {
+ "default_popup": "popup.html",
+ "default_title": "Save to News Hub"
+ },
+ "background": {
+ "service_worker": "background.js"
+ },
+ "content_scripts": [
+ {
+ "matches": ["http://localhost:*/*"],
+ "js": ["content.js"],
+ "run_at": "document_start"
+ }
+ ],
+ "content_security_policy": {
+ "extension_pages": "script-src 'self'; object-src 'self'"
+ },
+ "icons": {
+ "16": "icons/icon16.png",
+ "48": "icons/icon48.png",
+ "128": "icons/icon128.png"
+ }
+}
diff --git a/news/packages/browser-extension/popup.html b/news/packages/browser-extension/popup.html
new file mode 100644
index 000000000..340df07b7
--- /dev/null
+++ b/news/packages/browser-extension/popup.html
@@ -0,0 +1,165 @@
+
+
+
+
+
+ News Hub - Save Article
+
+
+
+
+
NEWS HUB
+
Save Article to Library
+
+
+
Please log in to News Hub first:
+
+
+
+
+
Loading page info...
+
+
+
+
+
+
+
+
+
+
+
diff --git a/news/packages/browser-extension/popup.js b/news/packages/browser-extension/popup.js
new file mode 100644
index 000000000..e2b2ef3f0
--- /dev/null
+++ b/news/packages/browser-extension/popup.js
@@ -0,0 +1,178 @@
+// Browser Extension Popup Script for News Hub
+document.addEventListener('DOMContentLoaded', async () => {
+ const pageTitle = document.getElementById('pageTitle');
+ const pageUrl = document.getElementById('pageUrl');
+ const saveButton = document.getElementById('saveButton');
+ const buttonText = document.getElementById('buttonText');
+ const status = document.getElementById('status');
+ const loginNotice = document.getElementById('loginNotice');
+ const loginLink = document.getElementById('loginLink');
+
+ // API Configuration
+ const API_URL = 'http://localhost:3000';
+ const APP_URL = 'http://localhost:8081';
+
+ let currentTab = null;
+ let authToken = null;
+
+ // Get current tab info
+ try {
+ const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
+ currentTab = tab;
+
+ pageTitle.textContent = tab.title || 'Untitled Page';
+ pageUrl.textContent = tab.url;
+ } catch (error) {
+ console.error('Error getting tab info:', error);
+ pageTitle.textContent = 'Error loading page info';
+ status.textContent = 'Failed to get page information';
+ status.className = 'status error';
+ return;
+ }
+
+ // Check if user is logged in by looking for stored token in Chrome storage
+ try {
+ const result = await chrome.storage.local.get(['news_hub_auth_token']);
+ authToken = result['news_hub_auth_token'];
+
+ console.log('Checking Chrome storage for token...', authToken ? 'Found' : 'Not found');
+
+ if (authToken) {
+ // Verify token is still valid by calling session endpoint
+ try {
+ const response = await fetch(`${API_URL}/auth/session`, {
+ headers: {
+ Authorization: `Bearer ${authToken}`,
+ },
+ });
+
+ if (response.ok) {
+ saveButton.disabled = false;
+ loginNotice.style.display = 'none';
+ // Auto-save article immediately
+ saveArticle();
+ } else {
+ // Token is invalid
+ await chrome.storage.local.remove(['news_hub_auth_token']);
+ authToken = null;
+ showLoginNotice();
+ }
+ } catch (error) {
+ console.error('Error verifying token:', error);
+ showLoginNotice();
+ }
+ } else {
+ showLoginNotice();
+ }
+ } catch (error) {
+ console.error('Error checking login status:', error);
+ showLoginNotice();
+ }
+
+ function showLoginNotice() {
+ loginNotice.style.display = 'block';
+ saveButton.disabled = true;
+ status.textContent = 'Please log in to News Hub first';
+ status.className = 'status error';
+ }
+
+ // Handle login link click
+ loginLink.addEventListener('click', (e) => {
+ e.preventDefault();
+ chrome.tabs.create({ url: APP_URL });
+ window.close();
+ });
+
+ // Save article function
+ async function saveArticle() {
+ if (!currentTab || !authToken) {
+ status.textContent = 'Please log in first';
+ status.className = 'status error';
+ return;
+ }
+
+ // Validate URL
+ const url = currentTab.url;
+ if (
+ !url ||
+ url.startsWith('chrome://') ||
+ url.startsWith('chrome-extension://') ||
+ url.startsWith('about:')
+ ) {
+ status.textContent = 'Cannot save this type of page';
+ status.className = 'status error';
+ return;
+ }
+
+ // Show loading state
+ saveButton.disabled = true;
+ buttonText.innerHTML = 'Saving...';
+ status.textContent = 'Saving article...';
+ status.className = 'status';
+
+ try {
+ const response = await fetch(`${API_URL}/extract/save`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${authToken}`,
+ },
+ body: JSON.stringify({ url: url }),
+ });
+
+ const result = await response.json();
+
+ if (response.ok && result.success) {
+ status.textContent = 'Article saved!';
+ status.className = 'status success';
+
+ // Show success for a moment, then close
+ setTimeout(() => {
+ window.close();
+ }, 1500);
+ } else {
+ throw new Error(result.message || 'Failed to save article');
+ }
+ } catch (error) {
+ console.error('Error saving article:', error);
+
+ let errorMessage = 'Failed to save article';
+ if (error.message.includes('fetch') || error.message.includes('NetworkError')) {
+ errorMessage = 'Network error - is the API running?';
+ } else if (error.message.includes('401') || error.message.includes('Unauthorized')) {
+ errorMessage = 'Session expired - please log in again';
+ showLoginNotice();
+ } else if (error.message) {
+ errorMessage = error.message;
+ }
+
+ status.textContent = errorMessage;
+ status.className = 'status error';
+ } finally {
+ // Reset button state
+ saveButton.disabled = authToken ? false : true;
+ buttonText.textContent = 'Try Again';
+ }
+ }
+
+ // Handle save button click (manual save if auto-save failed)
+ saveButton.addEventListener('click', saveArticle);
+
+ // Listen for storage changes (if user logs in/out in another tab)
+ chrome.storage.onChanged.addListener((changes, areaName) => {
+ if (areaName === 'local' && changes['news_hub_auth_token']) {
+ const newValue = changes['news_hub_auth_token'].newValue;
+
+ if (newValue) {
+ authToken = newValue;
+ saveButton.disabled = false;
+ loginNotice.style.display = 'none';
+ status.textContent = '';
+ status.className = 'status';
+ } else {
+ authToken = null;
+ showLoginNotice();
+ }
+ }
+ });
+});
diff --git a/package.json b/package.json
index 7d683f4b0..ae6579c01 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "manacore-monorepo",
"version": "1.0.0",
"private": true,
- "description": "Manacore Monorepo containing maerchenzauber, manacore, manadeck, memoro, picture, uload, chat, and nutriphi",
+ "description": "Manacore Monorepo containing maerchenzauber, manacore, manadeck, memoro, picture, uload, chat, nutriphi, and news",
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
@@ -58,7 +58,16 @@
"dev:nutriphi:web": "pnpm --filter @nutriphi/web dev",
"dev:nutriphi:landing": "pnpm --filter @nutriphi/landing dev",
"dev:nutriphi:backend": "pnpm --filter @nutriphi/backend start:dev",
- "dev:nutriphi:app": "turbo run dev --filter=@nutriphi/web --filter=@nutriphi/backend"
+ "dev:nutriphi:app": "turbo run dev --filter=@nutriphi/web --filter=@nutriphi/backend",
+
+ "news:dev": "turbo run dev --filter=news...",
+ "dev:news:mobile": "pnpm --filter @news/mobile dev",
+ "dev:news:web": "pnpm --filter @news/web dev",
+ "dev:news:landing": "pnpm --filter @news/landing dev",
+ "dev:news:api": "pnpm --filter @news/api start:dev",
+ "dev:news:app": "turbo run dev --filter=@news/web --filter=@news/api",
+ "news:db:push": "pnpm --filter @manacore/news-database db:push",
+ "news:db:studio": "pnpm --filter @manacore/news-database db:studio"
},
"devDependencies": {
"prettier": "^3.3.3",
diff --git a/packages/news-database/drizzle.config.ts b/packages/news-database/drizzle.config.ts
new file mode 100644
index 000000000..941da4110
--- /dev/null
+++ b/packages/news-database/drizzle.config.ts
@@ -0,0 +1,15 @@
+import { config } from 'dotenv';
+import { defineConfig } from 'drizzle-kit';
+import { resolve } from 'path';
+
+// Load .env from monorepo root
+config({ path: resolve(__dirname, '../../.env') });
+
+export default defineConfig({
+ schema: './src/schema/index.ts',
+ out: './drizzle',
+ dialect: 'postgresql',
+ dbCredentials: {
+ url: process.env.DATABASE_URL || 'postgresql://news:news_dev_password@localhost:5434/news_hub',
+ },
+});
diff --git a/packages/news-database/package.json b/packages/news-database/package.json
new file mode 100644
index 000000000..5b29ebb67
--- /dev/null
+++ b/packages/news-database/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "@manacore/news-database",
+ "version": "1.0.0",
+ "private": true,
+ "type": "module",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.js",
+ "require": "./dist/index.js",
+ "default": "./dist/index.js"
+ },
+ "./schema": {
+ "types": "./dist/schema/index.d.ts",
+ "import": "./dist/schema/index.js",
+ "require": "./dist/schema/index.js",
+ "default": "./dist/schema/index.js"
+ }
+ },
+ "scripts": {
+ "build": "tsc",
+ "clean": "rm -rf dist",
+ "prepare": "pnpm build",
+ "db:generate": "dotenv -- drizzle-kit generate",
+ "db:migrate": "dotenv -- drizzle-kit migrate",
+ "db:push": "dotenv -- drizzle-kit push --force",
+ "db:studio": "dotenv -- drizzle-kit studio",
+ "type-check": "tsc --noEmit"
+ },
+ "dependencies": {
+ "drizzle-orm": "^0.36.0",
+ "postgres": "^3.4.5"
+ },
+ "devDependencies": {
+ "dotenv-cli": "^7.4.0",
+ "drizzle-kit": "^0.28.0",
+ "tsx": "^4.19.0",
+ "typescript": "^5.6.0",
+ "@types/node": "^22.0.0"
+ }
+}
diff --git a/packages/news-database/src/index.ts b/packages/news-database/src/index.ts
new file mode 100644
index 000000000..c371b526f
--- /dev/null
+++ b/packages/news-database/src/index.ts
@@ -0,0 +1,19 @@
+import { drizzle, PostgresJsDatabase } from 'drizzle-orm/postgres-js';
+import postgres from 'postgres';
+import * as schema from './schema';
+
+// Re-export schema and types
+export * from './schema';
+export { sql, eq, and, or, desc, asc, isNull, isNotNull, inArray } from 'drizzle-orm';
+
+// Export schema for use in drizzle initialization
+export { schema };
+
+// Type for the database instance with schema
+export type Database = PostgresJsDatabase;
+
+// Helper to create a new database connection
+export function createDb(url: string): Database {
+ const client = postgres(url);
+ return drizzle(client, { schema });
+}
diff --git a/packages/news-database/src/schema/articles.ts b/packages/news-database/src/schema/articles.ts
new file mode 100644
index 000000000..7f6f8b095
--- /dev/null
+++ b/packages/news-database/src/schema/articles.ts
@@ -0,0 +1,64 @@
+import { pgTable, uuid, text, timestamp, boolean, integer, real, pgEnum, index } from 'drizzle-orm/pg-core';
+import { users } from './users';
+import { categories } from './categories';
+
+export const articleTypeEnum = pgEnum('article_type', ['feed', 'summary', 'in_depth', 'saved']);
+export const articleSourceEnum = pgEnum('article_source', ['ai', 'user_saved']);
+export const summaryPeriodEnum = pgEnum('summary_period', ['morning', 'noon', 'evening', 'night']);
+
+export const articles = pgTable('articles', {
+ id: uuid('id').primaryKey().defaultRandom(),
+
+ // Core fields
+ type: articleTypeEnum('type').notNull(),
+ sourceOrigin: articleSourceEnum('source_origin').default('ai').notNull(),
+ title: text('title').notNull(),
+ content: text('content').notNull(),
+ summary: text('summary'),
+
+ // For user-saved articles
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }),
+ originalUrl: text('original_url'),
+ parsedContent: text('parsed_content'),
+ isArchived: boolean('is_archived').default(false),
+
+ // Metadata
+ categoryId: uuid('category_id').references(() => categories.id),
+ sourceUrl: text('source_url'),
+ sourceName: text('source_name'),
+ sourceDomain: text('source_domain'),
+ author: text('author'),
+ imageUrl: text('image_url'),
+
+ // AI-generated metadata
+ aiTags: text('ai_tags').array(),
+ sentimentScore: real('sentiment_score'),
+
+ // Reading metrics
+ readingTimeMinutes: integer('reading_time_minutes'),
+ wordCount: integer('word_count'),
+
+ // Summary-specific fields
+ summaryDate: timestamp('summary_date'),
+ summaryPeriod: summaryPeriodEnum('summary_period'),
+ includedArticleIds: uuid('included_article_ids').array(),
+
+ // In-depth specific fields
+ keyInsights: text('key_insights'), // JSON string
+ dataVisualizations: text('data_visualizations'), // JSON string
+ relatedArticleIds: uuid('related_article_ids').array(),
+
+ // Timestamps
+ publishedAt: timestamp('published_at').defaultNow().notNull(),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+}, (table) => [
+ index('articles_type_idx').on(table.type),
+ index('articles_user_idx').on(table.userId),
+ index('articles_source_origin_idx').on(table.sourceOrigin),
+ index('articles_published_at_idx').on(table.publishedAt),
+ index('articles_category_idx').on(table.categoryId),
+]);
+
+export type Article = typeof articles.$inferSelect;
+export type NewArticle = typeof articles.$inferInsert;
diff --git a/packages/news-database/src/schema/auth.ts b/packages/news-database/src/schema/auth.ts
new file mode 100644
index 000000000..8e2613b1a
--- /dev/null
+++ b/packages/news-database/src/schema/auth.ts
@@ -0,0 +1,47 @@
+import { pgTable, uuid, text, timestamp, integer } from 'drizzle-orm/pg-core';
+import { users } from './users';
+
+// Better Auth Sessions
+export const sessions = pgTable('sessions', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ token: text('token').notNull().unique(),
+ expiresAt: timestamp('expires_at').notNull(),
+ ipAddress: text('ip_address'),
+ userAgent: text('user_agent'),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+// Better Auth Accounts (for OAuth providers)
+export const accounts = pgTable('accounts', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ providerId: text('provider_id').notNull(), // 'credential', 'google', 'apple', etc.
+ accountId: text('account_id').notNull(), // Provider's user ID or email for credential
+ accessToken: text('access_token'),
+ refreshToken: text('refresh_token'),
+ accessTokenExpiresAt: timestamp('access_token_expires_at'),
+ refreshTokenExpiresAt: timestamp('refresh_token_expires_at'),
+ scope: text('scope'),
+ password: text('password'), // Hashed, only for credential provider
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+// Better Auth Verification Tokens
+export const verifications = pgTable('verifications', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ identifier: text('identifier').notNull(), // email or other identifier
+ value: text('value').notNull(), // the token
+ expiresAt: timestamp('expires_at').notNull(),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+export type Session = typeof sessions.$inferSelect;
+export type NewSession = typeof sessions.$inferInsert;
+export type Account = typeof accounts.$inferSelect;
+export type NewAccount = typeof accounts.$inferInsert;
+export type Verification = typeof verifications.$inferSelect;
+export type NewVerification = typeof verifications.$inferInsert;
diff --git a/packages/news-database/src/schema/categories.ts b/packages/news-database/src/schema/categories.ts
new file mode 100644
index 000000000..3a47db253
--- /dev/null
+++ b/packages/news-database/src/schema/categories.ts
@@ -0,0 +1,16 @@
+import { pgTable, uuid, text, timestamp, integer } from 'drizzle-orm/pg-core';
+
+export const categories = pgTable('categories', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ name: text('name').notNull().unique(),
+ displayName: text('display_name').notNull(),
+ description: text('description'),
+ icon: text('icon'),
+ color: text('color'),
+ priority: integer('priority').default(0).notNull(),
+
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+});
+
+export type Category = typeof categories.$inferSelect;
+export type NewCategory = typeof categories.$inferInsert;
diff --git a/packages/news-database/src/schema/index.ts b/packages/news-database/src/schema/index.ts
new file mode 100644
index 000000000..32ecd15c6
--- /dev/null
+++ b/packages/news-database/src/schema/index.ts
@@ -0,0 +1,5 @@
+export * from './users';
+export * from './categories';
+export * from './articles';
+export * from './interactions';
+export * from './auth';
diff --git a/packages/news-database/src/schema/interactions.ts b/packages/news-database/src/schema/interactions.ts
new file mode 100644
index 000000000..c79e6adc2
--- /dev/null
+++ b/packages/news-database/src/schema/interactions.ts
@@ -0,0 +1,31 @@
+import { pgTable, uuid, timestamp, boolean, real, integer, index, unique } from 'drizzle-orm/pg-core';
+import { users } from './users';
+import { articles } from './articles';
+
+export const userArticleInteractions = pgTable('user_article_interactions', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ userId: uuid('user_id').references(() => users.id, { onDelete: 'cascade' }).notNull(),
+ articleId: uuid('article_id').references(() => articles.id, { onDelete: 'cascade' }).notNull(),
+
+ // Interaction states
+ isRead: boolean('is_read').default(false).notNull(),
+ isSaved: boolean('is_saved').default(false).notNull(),
+ readProgress: real('read_progress').default(0), // 0.0 to 1.0
+ rating: integer('rating'), // 1-5
+ shareCount: integer('share_count').default(0).notNull(),
+
+ // Timestamps
+ openedAt: timestamp('opened_at'),
+ readAt: timestamp('read_at'),
+ savedAt: timestamp('saved_at'),
+ ratedAt: timestamp('rated_at'),
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+}, (table) => [
+ unique('user_article_unique').on(table.userId, table.articleId),
+ index('interactions_user_idx').on(table.userId),
+ index('interactions_article_idx').on(table.articleId),
+]);
+
+export type UserArticleInteraction = typeof userArticleInteractions.$inferSelect;
+export type NewUserArticleInteraction = typeof userArticleInteractions.$inferInsert;
diff --git a/packages/news-database/src/schema/users.ts b/packages/news-database/src/schema/users.ts
new file mode 100644
index 000000000..95d509f8f
--- /dev/null
+++ b/packages/news-database/src/schema/users.ts
@@ -0,0 +1,29 @@
+import { pgTable, uuid, text, timestamp, boolean, pgEnum } from 'drizzle-orm/pg-core';
+
+export const userTierEnum = pgEnum('user_tier', ['free', 'premium', 'enterprise']);
+export const readingSpeedEnum = pgEnum('reading_speed', ['slow', 'normal', 'fast']);
+
+export const users = pgTable('users', {
+ id: uuid('id').primaryKey().defaultRandom(),
+ email: text('email').notNull().unique(),
+ name: text('name'),
+ avatarUrl: text('avatar_url'),
+ emailVerified: boolean('email_verified').default(false).notNull(),
+
+ // Preferences
+ tier: userTierEnum('tier').default('free').notNull(),
+ readingSpeed: readingSpeedEnum('reading_speed').default('normal').notNull(),
+ preferredCategories: text('preferred_categories').array(),
+ blockedSources: text('blocked_sources').array(),
+
+ // Settings
+ onboardingCompleted: boolean('onboarding_completed').default(false).notNull(),
+ notificationSettings: text('notification_settings'), // JSON string
+
+ // Timestamps
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
+
+export type User = typeof users.$inferSelect;
+export type NewUser = typeof users.$inferInsert;
diff --git a/packages/news-database/tsconfig.json b/packages/news-database/tsconfig.json
new file mode 100644
index 000000000..946490d28
--- /dev/null
+++ b/packages/news-database/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "lib": ["ES2022"],
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 211de8b8c..53a2201d9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -33,14 +33,14 @@ importers:
version: link:../../../packages/shared-landing-ui
astro:
specifier: ^5.16.0
- version: 5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)
+ version: 5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)
typescript:
specifier: ^5.0.0
version: 5.9.3
devDependencies:
'@astrojs/tailwind':
specifier: ^6.0.0
- version: 6.0.2(astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))
+ version: 6.0.2(astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))
'@tailwindcss/typography':
specifier: ^0.5.16
version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))
@@ -70,7 +70,7 @@ importers:
version: 2.81.1
expo:
specifier: ^52.0.39
- version: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ version: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-constants:
specifier: ~17.0.8
version: 17.0.8(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))
@@ -575,7 +575,7 @@ importers:
version: 16.6.1
expo:
specifier: ^54.0.21
- version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-apple-authentication:
specifier: ~8.0.7
version: 8.0.7(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -916,7 +916,7 @@ importers:
version: 2.81.1
expo:
specifier: ^54.0.25
- version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants:
specifier: ~18.0.10
version: 18.0.10(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -1189,7 +1189,7 @@ importers:
version: 0.7.1
expo:
specifier: 54.0.13
- version: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ version: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-apple-authentication:
specifier: ~8.0.7
version: 8.0.7(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -1637,7 +1637,7 @@ importers:
version: 4.1.0
expo:
specifier: ~54.0.0
- version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-apple-authentication:
specifier: ~8.0.7
version: 8.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -1929,6 +1929,289 @@ importers:
specifier: ^7.1.7
version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+ news/apps/api:
+ dependencies:
+ '@manacore/news-database':
+ specifier: workspace:*
+ version: link:../../../packages/news-database
+ '@manacore/shared-types':
+ specifier: workspace:*
+ version: link:../../../packages/shared-types
+ '@manacore/shared-utils':
+ specifier: workspace:*
+ version: link:../../../packages/shared-utils
+ '@mozilla/readability':
+ specifier: ^0.5.0
+ version: 0.5.0
+ '@nestjs/common':
+ specifier: ^10.4.0
+ version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/config':
+ specifier: ^3.3.0
+ version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
+ '@nestjs/core':
+ specifier: ^10.4.0
+ version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/platform-fastify':
+ specifier: ^10.4.0
+ version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20)
+ class-transformer:
+ specifier: ^0.5.1
+ version: 0.5.1
+ class-validator:
+ specifier: ^0.14.1
+ version: 0.14.2
+ drizzle-orm:
+ specifier: ^0.36.0
+ version: 0.36.4(@types/react@19.2.7)(expo-sqlite@15.2.14(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(kysely@0.27.6)(postgres@3.4.7)(react@19.1.0)
+ jsdom:
+ specifier: ^25.0.0
+ version: 25.0.1
+ postgres:
+ specifier: ^3.4.5
+ version: 3.4.7
+ reflect-metadata:
+ specifier: ^0.2.2
+ version: 0.2.2
+ rxjs:
+ specifier: ^7.8.1
+ version: 7.8.2
+ devDependencies:
+ '@nestjs/cli':
+ specifier: ^10.4.0
+ version: 10.4.9(esbuild@0.27.0)
+ '@nestjs/schematics':
+ specifier: ^10.2.0
+ version: 10.2.3(chokidar@3.6.0)(typescript@5.9.3)
+ '@types/jsdom':
+ specifier: ^21.1.0
+ version: 21.1.7
+ '@types/node':
+ specifier: ^22.0.0
+ version: 22.19.1
+ typescript:
+ specifier: ^5.6.0
+ version: 5.9.3
+
+ news/apps/landing:
+ dependencies:
+ '@astrojs/check':
+ specifier: ^0.9.0
+ version: 0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)
+ '@astrojs/sitemap':
+ specifier: ^3.2.1
+ version: 3.6.0
+ '@manacore/shared-landing-ui':
+ specifier: workspace:*
+ version: link:../../../packages/shared-landing-ui
+ astro:
+ specifier: ^5.16.0
+ version: 5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)
+ typescript:
+ specifier: ^5.0.0
+ version: 5.9.3
+ devDependencies:
+ '@astrojs/tailwind':
+ specifier: ^6.0.0
+ version: 6.0.2(astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))
+ '@tailwindcss/typography':
+ specifier: ^0.5.16
+ version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))
+ tailwindcss:
+ specifier: ^3.4.17
+ version: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
+
+ news/apps/mobile:
+ dependencies:
+ '@expo/vector-icons':
+ specifier: ^15.0.2
+ version: 15.0.3(expo-font@14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@manacore/shared-theme':
+ specifier: workspace:*
+ version: link:../../../packages/shared-theme
+ '@manacore/shared-types':
+ specifier: workspace:*
+ version: link:../../../packages/shared-types
+ '@manacore/shared-utils':
+ specifier: workspace:*
+ version: link:../../../packages/shared-utils
+ '@react-native-async-storage/async-storage':
+ specifier: 2.2.0
+ version: 2.2.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ '@react-native-community/netinfo':
+ specifier: ^11.4.1
+ version: 11.4.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ '@react-navigation/native':
+ specifier: ^7.0.3
+ version: 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo:
+ specifier: ^54.0.0
+ version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants:
+ specifier: ~18.0.9
+ version: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ expo-dev-client:
+ specifier: ~6.0.13
+ version: 6.0.18(expo@54.0.25)
+ expo-font:
+ specifier: ~14.0.8
+ version: 14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-linear-gradient:
+ specifier: ~15.0.7
+ version: 15.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-linking:
+ specifier: ~8.0.8
+ version: 8.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-router:
+ specifier: ~6.0.10
+ version: 6.0.15(dqwi7o7m6bfytgfcvdd46s7ysq)
+ expo-status-bar:
+ specifier: ~3.0.8
+ version: 3.0.8(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-system-ui:
+ specifier: ~6.0.7
+ version: 6.0.8(expo@54.0.25)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ expo-web-browser:
+ specifier: ~15.0.8
+ version: 15.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ nativewind:
+ specifier: latest
+ version: 4.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))
+ react:
+ specifier: 19.1.0
+ version: 19.1.0
+ react-dom:
+ specifier: 19.1.0
+ version: 19.1.0(react@19.1.0)
+ react-native:
+ specifier: 0.81.4
+ version: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-gesture-handler:
+ specifier: ~2.28.0
+ version: 2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-reanimated:
+ specifier: ~4.1.1
+ version: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-safe-area-context:
+ specifier: ~5.6.0
+ version: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens:
+ specifier: ~4.16.0
+ version: 4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-web:
+ specifier: ^0.21.0
+ version: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react-native-webview:
+ specifier: ^13.12.0
+ version: 13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-worklets:
+ specifier: 0.5.1
+ version: 0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ zustand:
+ specifier: ^4.5.1
+ version: 4.5.7(@types/react@19.1.17)(react@19.1.0)
+ devDependencies:
+ '@babel/core':
+ specifier: ^7.20.0
+ version: 7.28.5
+ '@types/react':
+ specifier: ~19.1.10
+ version: 19.1.17
+ ajv:
+ specifier: ^8.12.0
+ version: 8.17.1
+ eslint:
+ specifier: ^9.25.1
+ version: 9.39.1(jiti@2.6.1)
+ eslint-config-expo:
+ specifier: ~10.0.0
+ version: 10.0.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ eslint-config-prettier:
+ specifier: ^10.1.2
+ version: 10.1.8(eslint@9.39.1(jiti@2.6.1))
+ prettier:
+ specifier: ^3.2.5
+ version: 3.6.2
+ prettier-plugin-tailwindcss:
+ specifier: ^0.5.11
+ version: 0.5.14(prettier-plugin-astro@0.14.1)(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.43.14))(prettier@3.6.2)
+ tailwindcss:
+ specifier: ^3.4.0
+ version: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
+ typescript:
+ specifier: ~5.9.2
+ version: 5.9.3
+
+ news/apps/web:
+ dependencies:
+ '@manacore/shared-auth-ui':
+ specifier: workspace:*
+ version: link:../../../packages/shared-auth-ui
+ '@manacore/shared-branding':
+ specifier: workspace:*
+ version: link:../../../packages/shared-branding
+ '@manacore/shared-i18n':
+ specifier: workspace:*
+ version: link:../../../packages/shared-i18n
+ '@manacore/shared-icons':
+ specifier: workspace:*
+ version: link:../../../packages/shared-icons
+ '@manacore/shared-tailwind':
+ specifier: workspace:*
+ version: link:../../../packages/shared-tailwind
+ '@manacore/shared-theme':
+ specifier: workspace:*
+ version: link:../../../packages/shared-theme
+ '@manacore/shared-theme-ui':
+ specifier: workspace:*
+ version: link:../../../packages/shared-theme-ui
+ '@manacore/shared-ui':
+ specifier: workspace:*
+ version: link:../../../packages/shared-ui
+ '@manacore/shared-utils':
+ specifier: workspace:*
+ version: link:../../../packages/shared-utils
+ marked:
+ specifier: ^17.0.0
+ version: 17.0.1
+ devDependencies:
+ '@sveltejs/adapter-auto':
+ specifier: ^6.0.0
+ version: 6.1.1(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.14)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.43.14)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)))
+ '@sveltejs/kit':
+ specifier: ^2.43.2
+ version: 2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.14)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.43.14)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^6.2.0
+ version: 6.2.1(svelte@5.43.14)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))
+ '@tailwindcss/postcss':
+ specifier: ^4.1.17
+ version: 4.1.17
+ '@tailwindcss/typography':
+ specifier: ^0.5.19
+ version: 0.5.19(tailwindcss@4.1.17)
+ autoprefixer:
+ specifier: ^10.4.21
+ version: 10.4.22(postcss@8.5.6)
+ postcss:
+ specifier: ^8.5.6
+ version: 8.5.6
+ svelte:
+ specifier: ^5.39.5
+ version: 5.43.14
+ svelte-check:
+ specifier: ^4.3.2
+ version: 4.3.4(picomatch@4.0.3)(svelte@5.43.14)(typescript@5.9.3)
+ tailwindcss:
+ specifier: ^4.1.17
+ version: 4.1.17
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ vite:
+ specifier: ^7.1.7
+ version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+
nutriphi: {}
nutriphi/apps/landing:
@@ -1981,7 +2264,7 @@ importers:
version: 2.81.1
expo:
specifier: ^53.0.11
- version: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ version: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-blur:
specifier: ^14.1.5
version: 14.1.5(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
@@ -2275,6 +2558,31 @@ importers:
specifier: ^5.7.3
version: 5.9.3
+ packages/news-database:
+ dependencies:
+ drizzle-orm:
+ specifier: ^0.36.0
+ version: 0.36.4(@types/react@19.2.7)(expo-sqlite@15.2.14(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(kysely@0.27.6)(postgres@3.4.7)(react@19.1.0)
+ postgres:
+ specifier: ^3.4.5
+ version: 3.4.7
+ devDependencies:
+ '@types/node':
+ specifier: ^22.0.0
+ version: 22.19.1
+ dotenv-cli:
+ specifier: ^7.4.0
+ version: 7.4.4
+ drizzle-kit:
+ specifier: ^0.28.0
+ version: 0.28.1
+ tsx:
+ specifier: ^4.19.0
+ version: 4.20.6
+ typescript:
+ specifier: ^5.6.0
+ version: 5.9.3
+
packages/nutriphi-database:
dependencies:
drizzle-orm:
@@ -2541,7 +2849,7 @@ importers:
dependencies:
expo:
specifier: ~54.0.12
- version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ version: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react:
specifier: 19.1.0
version: 19.1.0
@@ -2645,7 +2953,7 @@ importers:
version: 2.0.5
expo:
specifier: 54.0.12
- version: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ version: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-blur:
specifier: ~15.0.7
version: 15.0.7(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -4369,8 +4677,8 @@ packages:
'@emmetio/css-abbreviation@2.1.8':
resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==}
- '@emmetio/css-parser@git+https://git@github.com:ramya-rao-a/css-parser.git#370c480ac103bd17c7bcfb34bf5d577dc40d3660':
- resolution: {commit: 370c480ac103bd17c7bcfb34bf5d577dc40d3660, repo: git@github.com:ramya-rao-a/css-parser.git, type: git}
+ '@emmetio/css-parser@https://codeload.github.com/ramya-rao-a/css-parser/tar.gz/370c480ac103bd17c7bcfb34bf5d577dc40d3660':
+ resolution: {tarball: https://codeload.github.com/ramya-rao-a/css-parser/tar.gz/370c480ac103bd17c7bcfb34bf5d577dc40d3660}
version: 0.4.0
'@emmetio/html-matcher@1.3.0':
@@ -5487,6 +5795,27 @@ packages:
resolution: {integrity: sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==}
hasBin: true
+ '@fastify/ajv-compiler@3.6.0':
+ resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==}
+
+ '@fastify/cors@9.0.1':
+ resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==}
+
+ '@fastify/error@3.4.1':
+ resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==}
+
+ '@fastify/fast-json-stringify-compiler@4.3.0':
+ resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==}
+
+ '@fastify/formbody@7.4.0':
+ resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==}
+
+ '@fastify/merge-json-schemas@0.1.1':
+ resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==}
+
+ '@fastify/middie@8.3.3':
+ resolution: {integrity: sha512-+WHavMQr9CNTZoy2cjoDxoWp76kZ3JKjAtZj5sXNlxX5XBzHig0TeCPfPc+1+NQmliXtndT3PFwAjrQHE/6wnQ==}
+
'@fontsource/grandstander@5.2.7':
resolution: {integrity: sha512-SBO1jNrp3dBswtIy5LDg4nd8yC9oS1Thq9IvbigYxcWv411UdhiNtWRG44awoPuH9g9hs8KuCQKZ/ZBjEPIWUw==}
@@ -6138,6 +6467,10 @@ packages:
'@mdx-js/mdx@3.1.1':
resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
+ '@mozilla/readability@0.5.0':
+ resolution: {integrity: sha512-Z+CZ3QaosfFaTqvhQsIktyGrjFjSC0Fa4EMph4mqKnWhmyoGICsV/8QK+8HpXut6zV7zwfWwqDmEjtk1Qf6EgQ==}
+ engines: {node: '>=14.0.0'}
+
'@napi-rs/wasm-runtime@0.2.12':
resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
@@ -6264,6 +6597,19 @@ packages:
'@nestjs/common': ^11.0.0
'@nestjs/core': ^11.0.0
+ '@nestjs/platform-fastify@10.4.20':
+ resolution: {integrity: sha512-XnfNNjZ0d0qo7qBQtnK4NPsYlUzy8Y7LlZ4i9YawO37T+dnVQewTv9La+sP8yS38pOwPlKqeWLR5RVwMKcoCCQ==}
+ peerDependencies:
+ '@fastify/static': ^6.0.0 || ^7.0.0
+ '@fastify/view': ^7.0.0 || ^8.0.0
+ '@nestjs/common': ^10.0.0
+ '@nestjs/core': ^10.0.0
+ peerDependenciesMeta:
+ '@fastify/static':
+ optional: true
+ '@fastify/view':
+ optional: true
+
'@nestjs/schematics@10.2.3':
resolution: {integrity: sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==}
peerDependencies:
@@ -6396,6 +6742,9 @@ packages:
'@phosphor-icons/core@2.1.1':
resolution: {integrity: sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==}
+ '@pinojs/redact@0.4.0':
+ resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==}
+
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -8141,6 +8490,9 @@ packages:
'@types/jsdom@20.0.1':
resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
+ '@types/jsdom@21.1.7':
+ resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -8229,6 +8581,9 @@ packages:
'@types/react@19.0.14':
resolution: {integrity: sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw==}
+ '@types/react@19.1.17':
+ resolution: {integrity: sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==}
+
'@types/react@19.2.7':
resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
@@ -8807,6 +9162,9 @@ packages:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'}
+ abstract-logging@2.0.1:
+ resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==}
+
accepts@1.3.8:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
@@ -9098,6 +9456,10 @@ packages:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
+ atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+
autoprefixer@10.4.22:
resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==}
engines: {node: ^10 || ^12 || >=14}
@@ -9109,6 +9471,9 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
+ avvio@8.4.0:
+ resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==}
+
await-lock@2.2.2:
resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==}
@@ -11787,6 +12152,12 @@ packages:
engines: {node: '>= 10.17.0'}
hasBin: true
+ fast-content-type-parse@1.1.0:
+ resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==}
+
+ fast-decode-uri-component@1.0.1:
+ resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -11800,18 +12171,27 @@ packages:
fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ fast-json-stringify@5.16.1:
+ resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==}
+
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fast-loops@1.1.4:
resolution: {integrity: sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==}
+ fast-querystring@1.1.2:
+ resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
+
fast-safe-stringify@2.1.1:
resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
fast-sha256@1.3.0:
resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==}
+ fast-uri@2.4.0:
+ resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==}
+
fast-uri@3.1.0:
resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
@@ -11827,6 +12207,12 @@ packages:
resolution: {integrity: sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==}
hasBin: true
+ fastify-plugin@4.5.1:
+ resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==}
+
+ fastify@4.28.1:
+ resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==}
+
fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
@@ -11914,6 +12300,10 @@ packages:
resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==}
engines: {node: '>=6'}
+ find-my-way@8.2.2:
+ resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==}
+ engines: {node: '>=14'}
+
find-up@3.0.0:
resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
engines: {node: '>=6'}
@@ -13235,6 +13625,15 @@ packages:
canvas:
optional: true
+ jsdom@25.0.1:
+ resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^2.11.2
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
jsdom@26.1.0:
resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
engines: {node: '>=18'}
@@ -13270,6 +13669,9 @@ packages:
json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ json-schema-ref-resolver@1.0.1:
+ resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==}
+
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@@ -13379,6 +13781,12 @@ packages:
libphonenumber-js@1.12.29:
resolution: {integrity: sha512-P2aLrbeqHbmh8+9P35LXQfXOKc7XJ0ymUKl7tyeyQjdRNfzunXWxQXGc4yl3fUf28fqLRfPY+vIVvFXK7KEBTw==}
+ light-my-request@5.14.0:
+ resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==}
+
+ light-my-request@6.3.0:
+ resolution: {integrity: sha512-bWTAPJmeWQH5suJNYwG0f5cs0p6ho9e6f1Ppoxv5qMosY+s9Ir2+ZLvvHcgA7VTDop4zl/NCHhOVVqU+kd++Ow==}
+
lighthouse-logger@1.4.2:
resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==}
@@ -14373,6 +14781,9 @@ packages:
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+ mnemonist@0.39.6:
+ resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==}
+
moment@2.30.1:
resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
@@ -14614,12 +15025,19 @@ packages:
resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
engines: {node: '>= 0.4'}
+ obliterator@2.0.5:
+ resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==}
+
ofetch@1.5.1:
resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
ohash@2.0.11:
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+ on-exit-leak-free@2.1.2:
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
+ engines: {node: '>=14.0.0'}
+
on-finished@2.3.0:
resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
engines: {node: '>= 0.8'}
@@ -14828,6 +15246,9 @@ packages:
path-to-regexp@3.3.0:
resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
path-to-regexp@8.3.0:
resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
@@ -14882,6 +15303,16 @@ packages:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
+ pino-abstract-transport@2.0.0:
+ resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
+
+ pino-std-serializers@7.0.0:
+ resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==}
+
+ pino@9.14.0:
+ resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==}
+ hasBin: true
+
pirates@4.0.7:
resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
engines: {node: '>= 6'}
@@ -15251,6 +15682,15 @@ packages:
resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ process-warning@3.0.0:
+ resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==}
+
+ process-warning@4.0.1:
+ resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==}
+
+ process-warning@5.0.0:
+ resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
+
process@0.11.10:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
engines: {node: '>= 0.6.0'}
@@ -15340,6 +15780,9 @@ packages:
queue@6.0.2:
resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
+ quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
radix3@1.1.2:
resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
@@ -15677,6 +16120,12 @@ packages:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
+ react-native-webview@13.16.0:
+ resolution: {integrity: sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
react-native-worklets-core@1.6.2:
resolution: {integrity: sha512-zw73JfL40ZL/OD2TOil1El4D9ZwS3l6AFPeFfUWXh+V2/dHN8i28jHX8QXlz5DYtAkR+Ju3U1h4yiaODi/igZw==}
peerDependencies:
@@ -15835,6 +16284,10 @@ packages:
readline@1.3.0:
resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==}
+ real-require@0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+
recast@0.21.5:
resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==}
engines: {node: '>= 4'}
@@ -16056,6 +16509,10 @@ packages:
restructure@3.0.2:
resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==}
+ ret@0.4.3:
+ resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==}
+ engines: {node: '>=10'}
+
retext-latin@4.0.0:
resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
@@ -16080,6 +16537,9 @@ packages:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
rimraf@2.6.3:
resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
deprecated: Rimraf versions prior to v4 are no longer supported
@@ -16103,6 +16563,9 @@ packages:
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
engines: {node: '>= 18'}
+ rrweb-cssom@0.7.1:
+ resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
+
rrweb-cssom@0.8.0:
resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
@@ -16153,6 +16616,13 @@ packages:
resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
engines: {node: '>= 0.4'}
+ safe-regex2@3.1.0:
+ resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -16190,6 +16660,9 @@ packages:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
+ secure-json-parse@2.7.0:
+ resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
+
selfsigned@2.4.1:
resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==}
engines: {node: '>=10'}
@@ -16373,6 +16846,9 @@ packages:
snake-case@3.0.4:
resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ sonic-boom@4.2.0:
+ resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -16410,6 +16886,10 @@ packages:
resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==}
engines: {node: '>=6'}
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
@@ -16817,6 +17297,9 @@ packages:
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ thread-stream@3.1.0:
+ resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
+
throat@5.0.0:
resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==}
@@ -16888,6 +17371,10 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
+ toad-cache@3.7.0:
+ resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==}
+ engines: {node: '>=12'}
+
toidentifier@1.0.1:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
@@ -18567,6 +19054,16 @@ snapshots:
transitivePeerDependencies:
- ts-node
+ '@astrojs/tailwind@6.0.2(astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))':
+ dependencies:
+ astro: 5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)
+ autoprefixer: 10.4.22(postcss@8.5.6)
+ postcss: 8.5.6
+ postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))
+ tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - ts-node
+
'@astrojs/tailwind@6.0.2(astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3))':
dependencies:
astro: 5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)
@@ -20057,7 +20554,7 @@ snapshots:
dependencies:
'@emmetio/scanner': 1.0.4
- '@emmetio/css-parser@git+https://git@github.com:ramya-rao-a/css-parser.git#370c480ac103bd17c7bcfb34bf5d577dc40d3660':
+ '@emmetio/css-parser@https://codeload.github.com/ramya-rao-a/css-parser/tar.gz/370c480ac103bd17c7bcfb34bf5d577dc40d3660':
dependencies:
'@emmetio/stream-reader': 2.2.0
'@emmetio/stream-reader-utils': 0.1.0
@@ -20731,7 +21228,7 @@ snapshots:
connect: 3.7.0
debug: 4.4.3
env-editor: 0.4.2
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
freeport-async: 2.0.0
getenv: 2.0.0
@@ -20808,7 +21305,7 @@ snapshots:
connect: 3.7.0
debug: 4.4.3
env-editor: 0.4.2
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
freeport-async: 2.0.0
getenv: 2.0.0
@@ -20850,6 +21347,83 @@ snapshots:
- supports-color
- utf-8-validate
+ '@expo/cli@54.0.16(expo-router@6.0.15)(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))':
+ dependencies:
+ '@0no-co/graphql.web': 1.2.0
+ '@expo/code-signing-certificates': 0.0.5
+ '@expo/config': 12.0.10
+ '@expo/config-plugins': 54.0.2
+ '@expo/devcert': 1.2.0
+ '@expo/env': 2.0.7
+ '@expo/image-utils': 0.8.7
+ '@expo/json-file': 10.0.7
+ '@expo/mcp-tunnel': 0.1.0
+ '@expo/metro': 54.1.0
+ '@expo/metro-config': 54.0.9(expo@54.0.25)
+ '@expo/osascript': 2.3.7
+ '@expo/package-manager': 1.9.8
+ '@expo/plist': 0.4.7
+ '@expo/prebuild-config': 54.0.6(expo@54.0.25)
+ '@expo/schema-utils': 0.1.7
+ '@expo/spawn-async': 1.7.2
+ '@expo/ws-tunnel': 1.0.6
+ '@expo/xcpretty': 4.3.2
+ '@react-native/dev-middleware': 0.81.5
+ '@urql/core': 5.2.0
+ '@urql/exchange-retry': 1.3.2(@urql/core@5.2.0)
+ accepts: 1.3.8
+ arg: 5.0.2
+ better-opn: 3.0.2
+ bplist-creator: 0.1.0
+ bplist-parser: 0.3.2
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ compression: 1.8.1
+ connect: 3.7.0
+ debug: 4.4.3
+ env-editor: 0.4.2
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-server: 1.0.4
+ freeport-async: 2.0.0
+ getenv: 2.0.0
+ glob: 10.5.0
+ lan-network: 0.1.7
+ minimatch: 9.0.5
+ node-forge: 1.3.1
+ npm-package-arg: 11.0.3
+ ora: 3.4.0
+ picomatch: 3.0.1
+ pretty-bytes: 5.6.0
+ pretty-format: 29.7.0
+ progress: 2.0.3
+ prompts: 2.4.2
+ qrcode-terminal: 0.11.0
+ require-from-string: 2.0.2
+ requireg: 0.2.2
+ resolve: 1.22.11
+ resolve-from: 5.0.0
+ resolve.exports: 2.0.3
+ semver: 7.7.3
+ send: 0.19.1
+ slugify: 1.6.6
+ source-map-support: 0.5.21
+ stacktrace-parser: 0.1.11
+ structured-headers: 0.4.1
+ tar: 7.5.2
+ terminal-link: 2.1.1
+ undici: 6.22.0
+ wrap-ansi: 7.0.0
+ ws: 8.18.3
+ optionalDependencies:
+ expo-router: 6.0.15(dqwi7o7m6bfytgfcvdd46s7ysq)
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - '@modelcontextprotocol/sdk'
+ - bufferutil
+ - graphql
+ - supports-color
+ - utf-8-validate
+
'@expo/cli@54.0.16(expo-router@6.0.15)(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))':
dependencies:
'@0no-co/graphql.web': 1.2.0
@@ -20885,7 +21459,7 @@ snapshots:
connect: 3.7.0
debug: 4.4.3
env-editor: 0.4.2
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
freeport-async: 2.0.0
getenv: 2.0.0
@@ -20962,7 +21536,7 @@ snapshots:
connect: 3.7.0
debug: 4.4.3
env-editor: 0.4.2
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
freeport-async: 2.0.0
getenv: 2.0.0
@@ -21134,6 +21708,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ chalk: 4.1.2
+ optionalDependencies:
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
'@expo/devtools@0.1.7(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
chalk: 4.1.2
@@ -21385,7 +21966,7 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -21415,7 +21996,7 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -21445,7 +22026,7 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -21475,7 +22056,7 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -21505,7 +22086,7 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -21522,7 +22103,7 @@ snapshots:
'@expo/metro-runtime@6.1.2(expo@52.0.47)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)':
dependencies:
anser: 1.4.10
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
pretty-format: 29.7.0
react: 18.3.1
react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
@@ -21535,7 +22116,7 @@ snapshots:
'@expo/metro-runtime@6.1.2(expo@53.0.24)(react-dom@19.0.0(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)':
dependencies:
anser: 1.4.10
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
pretty-format: 29.7.0
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
@@ -21548,7 +22129,7 @@ snapshots:
'@expo/metro-runtime@6.1.2(expo@54.0.12)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
anser: 1.4.10
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
pretty-format: 29.7.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -21560,7 +22141,7 @@ snapshots:
'@expo/metro-runtime@6.1.2(expo@54.0.13)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
anser: 1.4.10
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
pretty-format: 29.7.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -21569,10 +22150,22 @@ snapshots:
optionalDependencies:
react-dom: 19.1.0(react@19.1.0)
+ '@expo/metro-runtime@6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ anser: 1.4.10
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ pretty-format: 29.7.0
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ stacktrace-parser: 0.1.11
+ whatwg-fetch: 3.6.20
+ optionalDependencies:
+ react-dom: 19.1.0(react@19.1.0)
+
'@expo/metro-runtime@6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
anser: 1.4.10
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
pretty-format: 29.7.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -21584,7 +22177,7 @@ snapshots:
'@expo/metro-runtime@6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
anser: 1.4.10
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
pretty-format: 29.7.0
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -21672,7 +22265,7 @@ snapshots:
'@expo/json-file': 10.0.7
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
resolve-from: 5.0.0
semver: 7.7.3
xml2js: 0.6.0
@@ -21688,7 +22281,7 @@ snapshots:
'@expo/json-file': 10.0.7
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
resolve-from: 5.0.0
semver: 7.7.3
xml2js: 0.6.0
@@ -21704,7 +22297,7 @@ snapshots:
'@expo/json-file': 10.0.7
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
resolve-from: 5.0.0
semver: 7.7.3
xml2js: 0.6.0
@@ -21802,14 +22395,14 @@ snapshots:
'@expo/ui@0.2.0-beta.7(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
sf-symbols-typescript: 2.1.0
'@expo/ui@0.2.0-beta.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
sf-symbols-typescript: 2.1.0
@@ -21842,6 +22435,12 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ '@expo/vector-icons@15.0.3(expo-font@14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ expo-font: 14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
'@expo/vector-icons@15.0.3(expo-font@14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
expo-font: 14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -21863,6 +22462,39 @@ snapshots:
find-up: 5.0.0
js-yaml: 4.1.1
+ '@fastify/ajv-compiler@3.6.0':
+ dependencies:
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ fast-uri: 2.4.0
+
+ '@fastify/cors@9.0.1':
+ dependencies:
+ fastify-plugin: 4.5.1
+ mnemonist: 0.39.6
+
+ '@fastify/error@3.4.1': {}
+
+ '@fastify/fast-json-stringify-compiler@4.3.0':
+ dependencies:
+ fast-json-stringify: 5.16.1
+
+ '@fastify/formbody@7.4.0':
+ dependencies:
+ fast-querystring: 1.1.2
+ fastify-plugin: 4.5.1
+
+ '@fastify/merge-json-schemas@0.1.1':
+ dependencies:
+ fast-deep-equal: 3.1.3
+
+ '@fastify/middie@8.3.3':
+ dependencies:
+ '@fastify/error': 3.4.1
+ fastify-plugin: 4.5.1
+ path-to-regexp: 6.3.0
+ reusify: 1.1.0
+
'@fontsource/grandstander@5.2.7': {}
'@formatjs/ecma402-abstract@2.3.6':
@@ -22749,6 +23381,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@mozilla/readability@0.5.0': {}
+
'@napi-rs/wasm-runtime@0.2.12':
dependencies:
'@emnapi/core': 1.7.1
@@ -22794,6 +23428,32 @@ snapshots:
- uglify-js
- webpack-cli
+ '@nestjs/cli@10.4.9(esbuild@0.27.0)':
+ dependencies:
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics-cli': 17.3.11(chokidar@3.6.0)
+ '@nestjs/schematics': 10.2.3(chokidar@3.6.0)(typescript@5.7.2)
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cli-table3: 0.6.5
+ commander: 4.1.1
+ fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.7.2)(webpack@5.97.1(esbuild@0.27.0))
+ glob: 10.4.5
+ inquirer: 8.2.6
+ node-emoji: 1.11.0
+ ora: 5.4.1
+ tree-kill: 1.2.2
+ tsconfig-paths: 4.2.0
+ tsconfig-paths-webpack-plugin: 4.2.0
+ typescript: 5.7.2
+ webpack: 5.97.1(esbuild@0.27.0)
+ webpack-node-externals: 3.0.0
+ transitivePeerDependencies:
+ - esbuild
+ - uglify-js
+ - webpack-cli
+
'@nestjs/cli@11.0.12(@types/node@22.19.1)(esbuild@0.27.0)':
dependencies:
'@angular-devkit/core': 19.2.19(chokidar@4.0.3)
@@ -22975,6 +23635,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@nestjs/platform-fastify@10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20)':
+ dependencies:
+ '@fastify/cors': 9.0.1
+ '@fastify/formbody': 7.4.0
+ '@fastify/middie': 8.3.3
+ '@nestjs/common': 10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ fastify: 4.28.1
+ light-my-request: 6.3.0
+ path-to-regexp: 3.3.0
+ tslib: 2.8.1
+
'@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.7.2)':
dependencies:
'@angular-devkit/core': 17.3.11(chokidar@3.6.0)
@@ -23081,6 +23753,8 @@ snapshots:
'@phosphor-icons/core@2.1.1': {}
+ '@pinojs/redact@0.4.0': {}
+
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -23131,6 +23805,18 @@ snapshots:
'@radix-ui/primitive@1.1.3': {}
+ '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.1.0)
@@ -23154,18 +23840,52 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.14
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.1.0)':
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-context@1.1.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.1.0)':
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0)
+ aria-hidden: 1.2.6
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ react-remove-scroll: 2.7.1(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/primitive': 1.1.3
@@ -23188,12 +23908,31 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-direction@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.1.0)':
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/primitive': 1.1.3
@@ -23207,12 +23946,29 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.1.0)':
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.1.0)
@@ -23224,6 +23980,13 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-id@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.1.0)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.1.0)
@@ -23231,6 +23994,16 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -23241,6 +24014,16 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.1.0)
@@ -23251,6 +24034,15 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.1.0)
@@ -23260,6 +24052,23 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/primitive': 1.1.3
@@ -23290,6 +24099,13 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.14
+ '@radix-ui/react-slot@1.2.0(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-slot@1.2.0(@types/react@19.2.7)(react@19.1.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.1.0)
@@ -23297,6 +24113,13 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-slot@1.2.3(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.1.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.1.0)
@@ -23304,6 +24127,22 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 19.2.3(@types/react@19.1.17)
+
'@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/primitive': 1.1.3
@@ -23320,12 +24159,26 @@ snapshots:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.1.0)':
dependencies:
react: 19.1.0
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.1.0)':
dependencies:
'@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.1.0)
@@ -23334,6 +24187,13 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.1.0)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.1.0)
@@ -23341,6 +24201,13 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.1.0)':
dependencies:
'@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.1.0)
@@ -23348,6 +24215,12 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.1.0)':
dependencies:
react: 19.1.0
@@ -23364,6 +24237,11 @@ snapshots:
merge-options: 3.0.4
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
+ '@react-native-async-storage/async-storage@2.2.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))':
+ dependencies:
+ merge-options: 3.0.4
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
'@react-native-async-storage/async-storage@2.2.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))':
dependencies:
merge-options: 3.0.4
@@ -23385,7 +24263,11 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+
+ '@react-native-community/netinfo@11.4.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))':
+ dependencies:
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
'@react-native-community/netinfo@11.4.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))':
dependencies:
@@ -23400,7 +24282,7 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-dom: 19.1.0(react@19.1.0)
'@react-native-google-signin/google-signin@14.0.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
@@ -23408,7 +24290,7 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-dom: 19.1.0(react@19.1.0)
'@react-native-google-signin/google-signin@14.0.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
@@ -23416,7 +24298,7 @@ snapshots:
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-dom: 19.1.0(react@19.1.0)
'@react-native-picker/picker@2.11.1(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
@@ -23982,6 +24864,15 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.14
+ '@react-native/virtualized-lists@0.81.4(@types/react@19.1.17)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ invariant: 2.2.4
+ nullthrows: 1.1.1
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+
'@react-native/virtualized-lists@0.81.4(@types/react@19.2.7)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
invariant: 2.2.4
@@ -24035,6 +24926,19 @@ snapshots:
transitivePeerDependencies:
- '@react-native-masked-view/masked-view'
+ '@react-navigation/bottom-tabs@7.8.6(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/elements': 2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ sf-symbols-typescript: 2.1.0
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+
'@react-navigation/bottom-tabs@7.8.6(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
'@react-navigation/elements': 2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -24114,6 +25018,23 @@ snapshots:
- '@react-native-masked-view/masked-view'
optional: true
+ '@react-navigation/drawer@7.7.4(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/elements': 2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-drawer-layout: 4.2.0(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-gesture-handler: 2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ use-latest-callback: 0.2.6(react@19.1.0)
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+ optional: true
+
'@react-navigation/drawer@7.7.4(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
'@react-navigation/elements': 2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -24200,6 +25121,16 @@ snapshots:
use-latest-callback: 0.2.6(react@19.0.0)
use-sync-external-store: 1.6.0(react@19.0.0)
+ '@react-navigation/elements@2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ use-latest-callback: 0.2.6(react@19.1.0)
+ use-sync-external-store: 1.6.0(react@19.1.0)
+
'@react-navigation/elements@2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
'@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -24248,6 +25179,20 @@ snapshots:
transitivePeerDependencies:
- '@react-native-masked-view/masked-view'
+ '@react-navigation/native-stack@7.7.0(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/elements': 2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ sf-symbols-typescript: 2.1.0
+ warn-once: 0.1.1
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+
'@react-navigation/native-stack@7.7.0(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
'@react-navigation/elements': 2.8.3(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -24296,6 +25241,16 @@ snapshots:
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
use-latest-callback: 0.2.6(react@19.0.0)
+ '@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/core': 7.13.2(react@19.1.0)
+ escape-string-regexp: 4.0.0
+ fast-deep-equal: 3.1.3
+ nanoid: 3.3.11
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ use-latest-callback: 0.2.6(react@19.1.0)
+
'@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)':
dependencies:
'@react-navigation/core': 7.13.2(react@19.1.0)
@@ -24575,7 +25530,7 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- encoding
- supports-color
@@ -25469,6 +26424,19 @@ snapshots:
optionalDependencies:
jest: 29.5.0(@types/node@18.15.11)(ts-node@10.9.2(@types/node@18.15.11)(typescript@5.9.3))
+ '@testing-library/react-native@13.3.3(jest@30.2.0(esbuild-register@3.6.0(esbuild@0.27.0)))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ jest-matcher-utils: 30.2.0
+ picocolors: 1.1.1
+ pretty-format: 30.2.0
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-test-renderer: 19.1.0(react@19.1.0)
+ redent: 3.0.0
+ optionalDependencies:
+ jest: 30.2.0(@types/node@22.19.1)(esbuild-register@3.6.0(esbuild@0.27.0))
+ optional: true
+
'@testing-library/react-native@13.3.3(jest@30.2.0(esbuild-register@3.6.0(esbuild@0.27.0)))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
jest-matcher-utils: 30.2.0
@@ -25686,6 +26654,12 @@ snapshots:
'@types/tough-cookie': 4.0.5
parse5: 7.3.0
+ '@types/jsdom@21.1.7':
+ dependencies:
+ '@types/node': 22.19.1
+ '@types/tough-cookie': 4.0.5
+ parse5: 7.3.0
+
'@types/json-schema@7.0.15': {}
'@types/json5@0.0.29': {}
@@ -25756,6 +26730,11 @@ snapshots:
dependencies:
'@types/react': 18.3.27
+ '@types/react-dom@19.2.3(@types/react@19.1.17)':
+ dependencies:
+ '@types/react': 19.1.17
+ optional: true
+
'@types/react-dom@19.2.3(@types/react@19.2.7)':
dependencies:
'@types/react': 19.2.7
@@ -25773,6 +26752,10 @@ snapshots:
dependencies:
csstype: 3.2.3
+ '@types/react@19.1.17':
+ dependencies:
+ csstype: 3.2.3
+
'@types/react@19.2.7':
dependencies:
csstype: 3.2.3
@@ -26802,6 +27785,8 @@ snapshots:
dependencies:
event-target-shim: 5.0.1
+ abstract-logging@2.0.1: {}
+
accepts@1.3.8:
dependencies:
mime-types: 2.1.35
@@ -27308,6 +28293,108 @@ snapshots:
- uploadthing
- yaml
+ astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1):
+ dependencies:
+ '@astrojs/compiler': 2.13.0
+ '@astrojs/internal-helpers': 0.7.5
+ '@astrojs/markdown-remark': 6.3.9
+ '@astrojs/telemetry': 3.3.0
+ '@capsizecss/unpack': 3.0.1
+ '@oslojs/encoding': 1.1.0
+ '@rollup/pluginutils': 5.3.0(rollup@4.53.3)
+ acorn: 8.15.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ boxen: 8.0.1
+ ci-info: 4.3.1
+ clsx: 2.1.1
+ common-ancestor-path: 1.0.1
+ cookie: 1.0.2
+ cssesc: 3.0.0
+ debug: 4.4.3
+ deterministic-object-hash: 2.0.2
+ devalue: 5.5.0
+ diff: 5.2.0
+ dlv: 1.1.3
+ dset: 3.1.4
+ es-module-lexer: 1.7.0
+ esbuild: 0.25.12
+ estree-walker: 3.0.3
+ flattie: 1.1.1
+ fontace: 0.3.1
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.2.0
+ import-meta-resolve: 4.2.0
+ js-yaml: 4.1.1
+ magic-string: 0.30.21
+ magicast: 0.5.1
+ mrmime: 2.0.1
+ neotraverse: 0.6.18
+ p-limit: 6.2.0
+ p-queue: 8.1.1
+ package-manager-detector: 1.5.0
+ piccolore: 0.1.3
+ picomatch: 4.0.3
+ prompts: 2.4.2
+ rehype: 13.0.2
+ semver: 7.7.3
+ shiki: 3.15.0
+ smol-toml: 1.5.2
+ svgo: 4.0.0
+ tinyexec: 1.0.2
+ tinyglobby: 0.2.15
+ tsconfck: 3.1.6(typescript@5.9.3)
+ ultrahtml: 1.6.0
+ unifont: 0.6.0
+ unist-util-visit: 5.0.0
+ unstorage: 1.17.3(ioredis@5.8.2)
+ vfile: 6.0.3
+ vite: 6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+ vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))
+ xxhash-wasm: 1.1.0
+ yargs-parser: 21.1.1
+ yocto-spinner: 0.2.3
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.0(zod@3.25.76)
+ zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76)
+ optionalDependencies:
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - typescript
+ - uploadthing
+ - yaml
+
astro@5.16.0(@types/node@24.10.1)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1):
dependencies:
'@astrojs/compiler': 2.13.0
@@ -27427,6 +28514,8 @@ snapshots:
at-least-node@1.0.0: {}
+ atomic-sleep@1.0.0: {}
+
autoprefixer@10.4.22(postcss@8.5.6):
dependencies:
browserslist: 4.28.0
@@ -27441,6 +28530,11 @@ snapshots:
dependencies:
possible-typed-array-names: 1.1.0
+ avvio@8.4.0:
+ dependencies:
+ '@fastify/error': 3.4.1
+ fastq: 1.19.1
+
await-lock@2.2.2: {}
axios@1.13.2:
@@ -27663,7 +28757,7 @@ snapshots:
resolve-from: 5.0.0
optionalDependencies:
'@babel/runtime': 7.28.4
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- supports-color
@@ -27695,7 +28789,7 @@ snapshots:
resolve-from: 5.0.0
optionalDependencies:
'@babel/runtime': 7.28.4
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- supports-color
@@ -27727,7 +28821,7 @@ snapshots:
resolve-from: 5.0.0
optionalDependencies:
'@babel/runtime': 7.28.4
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- supports-color
@@ -29991,27 +31085,27 @@ snapshots:
expo-apple-authentication@8.0.7(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-apple-authentication@8.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-apple-authentication@8.0.7(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-application@7.0.7(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-asset@11.0.5(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1):
dependencies:
'@expo/image-utils': 0.6.5
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-constants: 17.0.8(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))
invariant: 2.2.4
md5-file: 3.2.3
@@ -30023,7 +31117,7 @@ snapshots:
expo-asset@11.1.7(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
dependencies:
'@expo/image-utils': 0.7.6
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-constants: 17.1.7(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
@@ -30033,7 +31127,7 @@ snapshots:
expo-asset@12.0.10(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/image-utils': 0.8.7
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -30043,17 +31137,27 @@ snapshots:
expo-asset@12.0.10(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/image-utils': 0.8.7
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
transitivePeerDependencies:
- supports-color
+ expo-asset@12.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@expo/image-utils': 0.8.7
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
expo-asset@12.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/image-utils': 0.8.7
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -30063,7 +31167,7 @@ snapshots:
expo-asset@12.0.10(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/image-utils': 0.8.7
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -30072,14 +31176,14 @@ snapshots:
expo-audio@1.0.15(expo-asset@12.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-asset: 12.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-av@16.0.7(expo@54.0.13)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
@@ -30087,43 +31191,43 @@ snapshots:
expo-blur@14.1.5(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
expo-blur@15.0.7(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-blur@15.0.7(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-blur@15.0.7(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-build-properties@1.0.9(expo@54.0.13):
dependencies:
ajv: 8.17.1
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
semver: 7.7.3
expo-build-properties@1.0.9(expo@54.0.25):
dependencies:
ajv: 8.17.1
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
semver: 7.7.3
expo-camera@16.1.11(expo@53.0.24)(react-native-web@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
invariant: 2.2.4
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
@@ -30132,19 +31236,19 @@ snapshots:
expo-clipboard@8.0.7(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-clipboard@8.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-clipboard@8.0.7(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -30152,7 +31256,7 @@ snapshots:
dependencies:
'@expo/config': 10.0.11
'@expo/env': 0.4.2
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
transitivePeerDependencies:
- supports-color
@@ -30161,7 +31265,7 @@ snapshots:
dependencies:
'@expo/config': 11.0.13
'@expo/env': 1.0.7
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
transitivePeerDependencies:
- supports-color
@@ -30170,7 +31274,7 @@ snapshots:
dependencies:
'@expo/config': 12.0.10
'@expo/env': 2.0.7
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
transitivePeerDependencies:
- supports-color
@@ -30179,16 +31283,25 @@ snapshots:
dependencies:
'@expo/config': 12.0.10
'@expo/env': 2.0.7
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
transitivePeerDependencies:
- supports-color
+ expo-constants@18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ '@expo/config': 12.0.10
+ '@expo/env': 2.0.7
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
expo-constants@18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
'@expo/config': 12.0.10
'@expo/env': 2.0.7
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
transitivePeerDependencies:
- supports-color
@@ -30197,14 +31310,14 @@ snapshots:
dependencies:
'@expo/config': 12.0.10
'@expo/env': 2.0.7
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
transitivePeerDependencies:
- supports-color
expo-dev-client@5.0.20(expo@52.0.47):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-launcher: 5.0.35(expo@52.0.47)
expo-dev-menu: 6.0.25(expo@52.0.47)
expo-dev-menu-interface: 1.9.3(expo@52.0.47)
@@ -30215,7 +31328,7 @@ snapshots:
expo-dev-client@5.2.4(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-dev-launcher: 5.1.16(expo@53.0.24)
expo-dev-menu: 6.1.14(expo@53.0.24)
expo-dev-menu-interface: 1.10.0(expo@53.0.24)
@@ -30226,7 +31339,7 @@ snapshots:
expo-dev-client@6.0.18(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-launcher: 6.0.18(expo@54.0.13)
expo-dev-menu: 7.0.17(expo@54.0.13)
expo-dev-menu-interface: 2.0.0(expo@54.0.13)
@@ -30237,7 +31350,7 @@ snapshots:
expo-dev-client@6.0.18(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-launcher: 6.0.18(expo@54.0.25)
expo-dev-menu: 7.0.17(expo@54.0.25)
expo-dev-menu-interface: 2.0.0(expo@54.0.25)
@@ -30249,7 +31362,7 @@ snapshots:
expo-dev-launcher@5.0.35(expo@52.0.47):
dependencies:
ajv: 8.11.0
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-menu: 6.0.25(expo@52.0.47)
expo-manifests: 0.15.8(expo@52.0.47)
resolve-from: 5.0.0
@@ -30259,7 +31372,7 @@ snapshots:
expo-dev-launcher@5.1.16(expo@53.0.24):
dependencies:
ajv: 8.11.0
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-dev-menu: 6.1.14(expo@53.0.24)
expo-manifests: 0.16.6(expo@53.0.24)
resolve-from: 5.0.0
@@ -30269,7 +31382,7 @@ snapshots:
expo-dev-launcher@5.1.17(expo@52.0.47):
dependencies:
ajv: 8.11.0
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-menu: 6.1.15(expo@52.0.47)
expo-manifests: 0.16.6(expo@52.0.47)
resolve-from: 5.0.0
@@ -30279,7 +31392,7 @@ snapshots:
expo-dev-launcher@5.1.17(expo@53.0.24):
dependencies:
ajv: 8.11.0
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-dev-menu: 6.1.15(expo@53.0.24)
expo-manifests: 0.16.6(expo@53.0.24)
resolve-from: 5.0.0
@@ -30289,7 +31402,7 @@ snapshots:
expo-dev-launcher@5.1.17(expo@54.0.25):
dependencies:
ajv: 8.11.0
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu: 6.1.15(expo@54.0.25)
expo-manifests: 0.16.6(expo@54.0.25)
resolve-from: 5.0.0
@@ -30298,7 +31411,7 @@ snapshots:
expo-dev-launcher@6.0.18(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu: 7.0.17(expo@54.0.13)
expo-manifests: 1.0.9(expo@54.0.13)
transitivePeerDependencies:
@@ -30306,7 +31419,7 @@ snapshots:
expo-dev-launcher@6.0.18(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu: 7.0.17(expo@54.0.25)
expo-manifests: 1.0.9(expo@54.0.25)
transitivePeerDependencies:
@@ -30314,195 +31427,207 @@ snapshots:
expo-dev-menu-interface@1.10.0(expo@52.0.47):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-menu-interface@1.10.0(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-dev-menu-interface@1.10.0(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface@1.9.3(expo@52.0.47):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-menu-interface@2.0.0(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface@2.0.0(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu@6.0.25(expo@52.0.47):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-menu-interface: 1.9.3(expo@52.0.47)
expo-dev-menu@6.1.14(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-dev-menu-interface: 1.10.0(expo@53.0.24)
expo-dev-menu@6.1.15(expo@52.0.47):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-dev-menu-interface: 1.10.0(expo@52.0.47)
expo-dev-menu@6.1.15(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-dev-menu-interface: 1.10.0(expo@53.0.24)
expo-dev-menu@6.1.15(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface: 1.10.0(expo@54.0.25)
expo-dev-menu@7.0.17(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface: 2.0.0(expo@54.0.13)
expo-dev-menu@7.0.17(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface: 2.0.0(expo@54.0.25)
expo-device@8.0.9(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
ua-parser-js: 0.7.41
expo-device@8.0.9(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
ua-parser-js: 0.7.41
expo-document-picker@14.0.7(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-eas-client@1.0.7: {}
expo-file-system@18.0.12(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
web-streams-polyfill: 3.3.3
expo-file-system@18.1.11(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
expo-file-system@19.0.19(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-file-system@19.0.19(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ expo-file-system@19.0.19(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
expo-file-system@19.0.19(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-file-system@19.0.19(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-font@13.0.4(expo@52.0.47)(react@18.3.1):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
fontfaceobserver: 2.3.0
react: 18.3.1
expo-font@13.3.2(expo@53.0.24)(react@19.0.0):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
fontfaceobserver: 2.3.0
react: 19.0.0
expo-font@14.0.9(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
fontfaceobserver: 2.3.0
react: 18.3.1
react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
expo-font@14.0.9(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
fontfaceobserver: 2.3.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-font@14.0.9(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
fontfaceobserver: 2.3.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ expo-font@14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ fontfaceobserver: 2.3.0
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
expo-font@14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
fontfaceobserver: 2.3.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-font@14.0.9(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
fontfaceobserver: 2.3.0
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-haptics@15.0.7(expo@54.0.12):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-haptics@15.0.7(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-image-loader@5.1.0(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-image-loader@6.0.0(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-image-loader@6.0.0(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-image-picker@16.1.4(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-image-loader: 5.1.0(expo@53.0.24)
expo-image-picker@17.0.8(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-image-loader: 6.0.0(expo@54.0.13)
expo-image-picker@17.0.8(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-image-loader: 6.0.0(expo@54.0.25)
expo-image@3.0.10(expo@54.0.12)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
@@ -30510,7 +31635,7 @@ snapshots:
expo-image@3.0.10(expo@54.0.25)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
@@ -30522,44 +31647,50 @@ snapshots:
expo-keep-awake@14.0.3(expo@52.0.47)(react@18.3.1):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
react: 18.3.1
expo-keep-awake@14.1.4(expo@53.0.24)(react@19.0.0):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react: 19.0.0
expo-keep-awake@15.0.7(expo@54.0.12)(react@19.1.0):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
expo-keep-awake@15.0.7(expo@54.0.13)(react@19.1.0):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
expo-keep-awake@15.0.7(expo@54.0.25)(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
expo-linear-gradient@15.0.7(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ expo-linear-gradient@15.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
expo-linear-gradient@15.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-linear-gradient@15.0.7(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
@@ -30603,6 +31734,16 @@ snapshots:
- expo
- supports-color
+ expo-linking@8.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - expo
+ - supports-color
+
expo-linking@8.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -30625,26 +31766,26 @@ snapshots:
expo-localization@17.0.7(expo@54.0.25)(react@19.1.0):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
rtl-detect: 1.1.2
expo-location@18.1.6(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-location@19.0.7(expo@54.0.12):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-location@19.0.7(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-manifests@0.15.8(expo@52.0.47):
dependencies:
'@expo/config': 10.0.11
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-json-utils: 0.14.0
transitivePeerDependencies:
- supports-color
@@ -30652,7 +31793,7 @@ snapshots:
expo-manifests@0.16.6(expo@52.0.47):
dependencies:
'@expo/config': 11.0.13
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-json-utils: 0.15.0
transitivePeerDependencies:
- supports-color
@@ -30660,7 +31801,7 @@ snapshots:
expo-manifests@0.16.6(expo@53.0.24):
dependencies:
'@expo/config': 11.0.13
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-json-utils: 0.15.0
transitivePeerDependencies:
- supports-color
@@ -30668,7 +31809,7 @@ snapshots:
expo-manifests@0.16.6(expo@54.0.25):
dependencies:
'@expo/config': 11.0.13
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-json-utils: 0.15.0
transitivePeerDependencies:
- supports-color
@@ -30676,7 +31817,7 @@ snapshots:
expo-manifests@1.0.9(expo@54.0.13):
dependencies:
'@expo/config': 12.0.10
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-json-utils: 0.15.0
transitivePeerDependencies:
- supports-color
@@ -30684,19 +31825,19 @@ snapshots:
expo-manifests@1.0.9(expo@54.0.25):
dependencies:
'@expo/config': 12.0.10
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-json-utils: 0.15.0
transitivePeerDependencies:
- supports-color
expo-media-library@18.2.0(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-media-library@18.2.0(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-modules-autolinking@2.0.8:
@@ -30766,6 +31907,12 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ expo-modules-core@3.0.26(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
expo-modules-core@3.0.26(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
invariant: 2.2.4
@@ -30787,7 +31934,7 @@ snapshots:
'@react-navigation/native': 7.1.21(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
'@react-navigation/native-stack': 7.7.0(@react-navigation/native@7.1.21(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native-safe-area-context@4.12.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native-screens@4.4.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
client-only: 0.0.1
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-constants: 17.0.8(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))
expo-linking: 7.0.5(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -30818,7 +31965,7 @@ snapshots:
'@react-navigation/native': 7.1.21(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
'@react-navigation/native-stack': 7.7.0(@react-navigation/native@7.1.21(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native-safe-area-context@5.4.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native-screens@4.11.1(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
client-only: 0.0.1
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-constants: 17.1.7(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))
expo-linking: 7.1.7(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
invariant: 2.2.4
@@ -30851,7 +31998,7 @@ snapshots:
client-only: 0.0.1
debug: 4.4.3
escape-string-regexp: 4.0.0
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
expo-linking: 8.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
@@ -30885,6 +32032,52 @@ snapshots:
- '@types/react-dom'
- supports-color
+ expo-router@6.0.15(dqwi7o7m6bfytgfcvdd46s7ysq):
+ dependencies:
+ '@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@expo/schema-utils': 0.1.7
+ '@radix-ui/react-slot': 1.2.0(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@react-navigation/bottom-tabs': 7.8.6(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native-stack': 7.7.0(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ client-only: 0.0.1
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ expo-linking: 8.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-server: 1.0.4
+ fast-deep-equal: 3.1.3
+ invariant: 2.2.4
+ nanoid: 3.3.11
+ query-string: 7.1.3
+ react: 19.1.0
+ react-fast-compare: 3.2.2
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ semver: 7.6.3
+ server-only: 0.0.1
+ sf-symbols-typescript: 2.1.0
+ shallowequal: 1.1.0
+ use-latest-callback: 0.2.6(react@19.1.0)
+ vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ optionalDependencies:
+ '@react-navigation/drawer': 7.7.4(@react-navigation/native@7.1.21(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@testing-library/react-native': 13.3.3(jest@30.2.0(esbuild-register@3.6.0(esbuild@0.27.0)))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)
+ react-dom: 19.1.0(react@19.1.0)
+ react-native-gesture-handler: 2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react-server-dom-webpack: 19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.27.0))
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+ - '@types/react'
+ - '@types/react-dom'
+ - supports-color
+
expo-router@6.0.15(dux2nvtiztnejw7mxzfaajqvh4):
dependencies:
'@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
@@ -30897,7 +32090,7 @@ snapshots:
client-only: 0.0.1
debug: 4.4.3
escape-string-regexp: 4.0.0
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
expo-linking: 8.0.9(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
@@ -30943,7 +32136,7 @@ snapshots:
client-only: 0.0.1
debug: 4.4.3
escape-string-regexp: 4.0.0
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
expo-linking: 8.0.9(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
@@ -30989,7 +32182,7 @@ snapshots:
client-only: 0.0.1
debug: 4.4.3
escape-string-regexp: 4.0.0
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
expo-linking: 8.0.9(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
@@ -31035,7 +32228,7 @@ snapshots:
client-only: 0.0.1
debug: 4.4.3
escape-string-regexp: 4.0.0
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.10(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
expo-linking: 8.0.9(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server: 1.0.4
@@ -31071,40 +32264,40 @@ snapshots:
expo-secure-store@15.0.7(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-secure-store@15.0.7(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-server@1.0.4: {}
expo-sharing@14.0.7(expo@54.0.12):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-speech@14.0.7(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-splash-screen@31.0.11(expo@54.0.25):
dependencies:
'@expo/prebuild-config': 54.0.6(expo@54.0.25)
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- supports-color
expo-sqlite@15.2.14(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
dependencies:
await-lock: 2.2.2
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
expo-sqlite@15.2.14(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
await-lock: 2.2.2
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optional: true
@@ -31121,6 +32314,12 @@ snapshots:
react-native-edge-to-edge: 1.6.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react-native-is-edge-to-edge: 1.2.1(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo-status-bar@3.0.8(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
expo-status-bar@3.0.8(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
@@ -31135,38 +32334,38 @@ snapshots:
expo-store-review@9.0.8(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-structured-headers@5.0.0: {}
expo-symbols@0.4.5(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
sf-symbols-typescript: 2.1.0
expo-symbols@1.0.7(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
sf-symbols-typescript: 2.1.0
expo-symbols@1.0.7(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
sf-symbols-typescript: 2.1.0
expo-symbols@1.0.7(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
sf-symbols-typescript: 2.1.0
expo-symbols@1.0.7(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
sf-symbols-typescript: 2.1.0
@@ -31174,7 +32373,7 @@ snapshots:
dependencies:
'@react-native/normalize-colors': 0.76.8
debug: 4.4.3
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
optionalDependencies:
react-native-web: 0.19.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -31185,7 +32384,7 @@ snapshots:
dependencies:
'@react-native/normalize-colors': 0.79.6
debug: 4.4.3
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
optionalDependencies:
react-native-web: 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -31196,7 +32395,7 @@ snapshots:
dependencies:
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -31207,18 +32406,29 @@ snapshots:
dependencies:
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- supports-color
+ expo-system-ui@6.0.8(expo@54.0.25)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ '@react-native/normalize-colors': 0.81.5
+ debug: 4.4.3
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
expo-system-ui@6.0.8(expo@54.0.25)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -31229,7 +32439,7 @@ snapshots:
dependencies:
'@react-native/normalize-colors': 0.81.5
debug: 4.4.3
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
optionalDependencies:
react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -31238,19 +32448,19 @@ snapshots:
expo-updates-interface@1.0.0(expo@52.0.47):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
expo-updates-interface@1.1.0(expo@53.0.24):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
expo-updates-interface@2.0.0(expo@54.0.13):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-updates-interface@2.0.0(expo@54.0.25):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-updates@29.0.13(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
@@ -31260,7 +32470,7 @@ snapshots:
arg: 4.1.0
chalk: 4.1.2
debug: 4.4.3
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
expo-eas-client: 1.0.7
expo-manifests: 1.0.9(expo@54.0.13)
expo-structured-headers: 5.0.0
@@ -31276,30 +32486,35 @@ snapshots:
expo-web-browser@14.0.2(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)):
dependencies:
- expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
expo-web-browser@14.1.6(expo@53.0.24)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)):
dependencies:
- expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ expo: 53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
expo-web-browser@15.0.9(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
expo-web-browser@15.0.9(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ expo-web-browser@15.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
expo-web-browser@15.0.9(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)):
dependencies:
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
- expo@52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1):
+ expo@52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.28.4
'@expo/cli': 0.22.26
@@ -31323,6 +32538,7 @@ snapshots:
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.2(expo@52.0.47)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
+ react-native-webview: 13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1)
transitivePeerDependencies:
- '@babel/core'
- '@babel/preset-env'
@@ -31334,7 +32550,7 @@ snapshots:
- supports-color
- utf-8-validate
- expo@53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
+ expo@53.0.24(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
dependencies:
'@babel/runtime': 7.28.4
'@expo/cli': 0.24.22
@@ -31357,6 +32573,7 @@ snapshots:
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.2(expo@53.0.24)(react-dom@19.0.0(react@19.0.0))(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
+ react-native-webview: 13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-react-compiler
@@ -31365,7 +32582,7 @@ snapshots:
- supports-color
- utf-8-validate
- expo@54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
+ expo@54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/runtime': 7.28.4
'@expo/cli': 54.0.10(expo-router@6.0.15)(expo@54.0.12)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -31392,6 +32609,7 @@ snapshots:
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.2(expo@54.0.12)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ react-native-webview: 13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- '@modelcontextprotocol/sdk'
@@ -31401,7 +32619,7 @@ snapshots:
- supports-color
- utf-8-validate
- expo@54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
+ expo@54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/runtime': 7.28.4
'@expo/cli': 54.0.11(expo-router@6.0.15)(expo@54.0.13)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -31428,6 +32646,7 @@ snapshots:
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.2(expo@54.0.13)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ react-native-webview: 13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- '@modelcontextprotocol/sdk'
@@ -31437,7 +32656,44 @@ snapshots:
- supports-color
- utf-8-validate
- expo@54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
+ expo@54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@expo/cli': 54.0.16(expo-router@6.0.15)(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ '@expo/config': 12.0.10
+ '@expo/config-plugins': 54.0.2
+ '@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@expo/fingerprint': 0.15.3
+ '@expo/metro': 54.1.0
+ '@expo/metro-config': 54.0.9(expo@54.0.25)
+ '@expo/vector-icons': 15.0.3(expo-font@14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@ungap/structured-clone': 1.3.0
+ babel-preset-expo: 54.0.7(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@54.0.25)(react-refresh@0.14.2)
+ expo-asset: 12.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants: 18.0.10(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ expo-file-system: 19.0.19(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))
+ expo-font: 14.0.9(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-keep-awake: 15.0.7(expo@54.0.25)(react@19.1.0)
+ expo-modules-autolinking: 3.0.22
+ expo-modules-core: 3.0.26(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ pretty-format: 29.7.0
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-refresh: 0.14.2
+ whatwg-url-without-unicode: 8.0.0-3
+ optionalDependencies:
+ '@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-webview: 13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@modelcontextprotocol/sdk'
+ - bufferutil
+ - expo-router
+ - graphql
+ - supports-color
+ - utf-8-validate
+
+ expo@54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/runtime': 7.28.4
'@expo/cli': 54.0.16(expo-router@6.0.15)(expo@54.0.25)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -31464,6 +32720,7 @@ snapshots:
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ react-native-webview: 13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- '@modelcontextprotocol/sdk'
@@ -31473,7 +32730,7 @@ snapshots:
- supports-color
- utf-8-validate
- expo@54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
+ expo@54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/runtime': 7.28.4
'@expo/cli': 54.0.16(expo-router@6.0.15)(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))
@@ -31500,6 +32757,7 @@ snapshots:
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ react-native-webview: 13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- '@modelcontextprotocol/sdk'
@@ -31607,6 +32865,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ fast-content-type-parse@1.1.0: {}
+
+ fast-decode-uri-component@1.0.1: {}
+
fast-deep-equal@3.1.3: {}
fast-diff@1.3.0: {}
@@ -31621,14 +32883,30 @@ snapshots:
fast-json-stable-stringify@2.1.0: {}
+ fast-json-stringify@5.16.1:
+ dependencies:
+ '@fastify/merge-json-schemas': 0.1.1
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ fast-deep-equal: 3.1.3
+ fast-uri: 2.4.0
+ json-schema-ref-resolver: 1.0.1
+ rfdc: 1.4.1
+
fast-levenshtein@2.0.6: {}
fast-loops@1.1.4: {}
+ fast-querystring@1.1.2:
+ dependencies:
+ fast-decode-uri-component: 1.0.1
+
fast-safe-stringify@2.1.1: {}
fast-sha256@1.3.0: {}
+ fast-uri@2.4.0: {}
+
fast-uri@3.1.0: {}
fast-xml-parser@4.5.3:
@@ -31643,6 +32921,27 @@ snapshots:
dependencies:
strnum: 2.1.1
+ fastify-plugin@4.5.1: {}
+
+ fastify@4.28.1:
+ dependencies:
+ '@fastify/ajv-compiler': 3.6.0
+ '@fastify/error': 3.4.1
+ '@fastify/fast-json-stringify-compiler': 4.3.0
+ abstract-logging: 2.0.1
+ avvio: 8.4.0
+ fast-content-type-parse: 1.1.0
+ fast-json-stringify: 5.16.1
+ find-my-way: 8.2.2
+ light-my-request: 5.14.0
+ pino: 9.14.0
+ process-warning: 3.0.0
+ proxy-addr: 2.0.7
+ rfdc: 1.4.1
+ secure-json-parse: 2.7.0
+ semver: 7.7.3
+ toad-cache: 3.7.0
+
fastq@1.19.1:
dependencies:
reusify: 1.1.0
@@ -31771,6 +33070,12 @@ snapshots:
make-dir: 2.1.0
pkg-dir: 3.0.0
+ find-my-way@8.2.2:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-querystring: 1.1.2
+ safe-regex2: 3.1.0
+
find-up@3.0.0:
dependencies:
locate-path: 3.0.0
@@ -31846,6 +33151,23 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
+ fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1(esbuild@0.27.0)):
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cosmiconfig: 8.3.6(typescript@5.7.2)
+ deepmerge: 4.3.1
+ fs-extra: 10.1.0
+ memfs: 3.5.3
+ minimatch: 3.1.2
+ node-abort-controller: 3.1.1
+ schema-utils: 3.3.0
+ semver: 7.7.3
+ tapable: 2.3.0
+ typescript: 5.7.2
+ webpack: 5.97.1(esbuild@0.27.0)
+
fork-ts-checker-webpack-plugin@9.0.2(typescript@5.7.2)(webpack@5.97.1):
dependencies:
'@babel/code-frame': 7.27.1
@@ -33322,7 +34644,7 @@ snapshots:
'@jest/create-cache-key-function': 29.7.0
'@jest/globals': 29.7.0
babel-jest: 29.7.0(@babel/core@7.28.5)
- expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
+ expo: 54.0.25(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)
jest-environment-jsdom: 29.7.0
jest-snapshot: 29.7.0
jest-watch-select-projects: 2.0.0
@@ -33883,6 +35205,34 @@ snapshots:
- supports-color
- utf-8-validate
+ jsdom@25.0.1:
+ dependencies:
+ cssstyle: 4.6.0
+ data-urls: 5.0.0
+ decimal.js: 10.6.0
+ form-data: 4.0.5
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.22
+ parse5: 7.3.0
+ rrweb-cssom: 0.7.1
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 5.1.2
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
+ ws: 8.18.3
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
jsdom@26.1.0:
dependencies:
cssstyle: 4.6.0
@@ -33949,6 +35299,10 @@ snapshots:
json-parse-even-better-errors@2.3.1: {}
+ json-schema-ref-resolver@1.0.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+
json-schema-traverse@0.4.1: {}
json-schema-traverse@1.0.0: {}
@@ -34065,6 +35419,18 @@ snapshots:
libphonenumber-js@1.12.29: {}
+ light-my-request@5.14.0:
+ dependencies:
+ cookie: 0.7.2
+ process-warning: 3.0.0
+ set-cookie-parser: 2.7.2
+
+ light-my-request@6.3.0:
+ dependencies:
+ cookie: 1.0.2
+ process-warning: 4.0.1
+ set-cookie-parser: 2.7.2
+
lighthouse-logger@1.4.2:
dependencies:
debug: 2.6.9
@@ -35816,6 +37182,10 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.1
+ mnemonist@0.39.6:
+ dependencies:
+ obliterator: 2.0.5
+
moment@2.30.1:
optional: true
@@ -35887,6 +37257,20 @@ snapshots:
- react-native-svg
- supports-color
+ nativewind@4.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)):
+ dependencies:
+ comment-json: 4.4.1
+ debug: 4.4.3
+ react-native-css-interop: 0.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))
+ tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - react
+ - react-native
+ - react-native-reanimated
+ - react-native-safe-area-context
+ - react-native-svg
+ - supports-color
+
nativewind@4.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-svg@15.12.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)):
dependencies:
comment-json: 4.4.1
@@ -36095,6 +37479,8 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.1.1
+ obliterator@2.0.5: {}
+
ofetch@1.5.1:
dependencies:
destr: 2.0.5
@@ -36103,6 +37489,8 @@ snapshots:
ohash@2.0.11: {}
+ on-exit-leak-free@2.1.2: {}
+
on-finished@2.3.0:
dependencies:
ee-first: 1.1.1
@@ -36347,6 +37735,8 @@ snapshots:
path-to-regexp@3.3.0: {}
+ path-to-regexp@6.3.0: {}
+
path-to-regexp@8.3.0: {}
path-type@4.0.0: {}
@@ -36377,6 +37767,26 @@ snapshots:
pify@4.0.1: {}
+ pino-abstract-transport@2.0.0:
+ dependencies:
+ split2: 4.2.0
+
+ pino-std-serializers@7.0.0: {}
+
+ pino@9.14.0:
+ dependencies:
+ '@pinojs/redact': 0.4.0
+ atomic-sleep: 1.0.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 2.0.0
+ pino-std-serializers: 7.0.0
+ process-warning: 5.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 4.2.0
+ thread-stream: 3.1.0
+
pirates@4.0.7: {}
pkg-dir@3.0.0:
@@ -36626,6 +38036,12 @@ snapshots:
proc-log@4.2.0: {}
+ process-warning@3.0.0: {}
+
+ process-warning@4.0.1: {}
+
+ process-warning@5.0.0: {}
+
process@0.11.10:
optional: true
@@ -36726,6 +38142,8 @@ snapshots:
dependencies:
inherits: 2.0.4
+ quick-format-unescaped@4.0.4: {}
+
radix3@1.1.2: {}
randombytes@2.1.0:
@@ -36907,6 +38325,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ react-native-css-interop@0.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)):
+ dependencies:
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ debug: 4.4.3
+ lightningcss: 1.27.0
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ semver: 7.7.3
+ tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
+ optionalDependencies:
+ react-native-safe-area-context: 5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
react-native-css-interop@0.2.1(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-svg@15.12.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)):
dependencies:
'@babel/helper-module-imports': 7.27.1
@@ -36988,6 +38423,16 @@ snapshots:
use-latest-callback: 0.2.6(react@19.0.0)
optional: true
+ react-native-drawer-layout@4.2.0(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-gesture-handler: 2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ use-latest-callback: 0.2.6(react@19.1.0)
+ optional: true
+
react-native-drawer-layout@4.2.0(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
color: 4.2.3
@@ -37043,6 +38488,14 @@ snapshots:
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
+ react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@egjs/hammerjs': 2.0.17
+ hoist-non-react-statics: 3.3.2
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@egjs/hammerjs': 2.0.17
@@ -37085,6 +38538,11 @@ snapshots:
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
+ react-native-is-edge-to-edge@1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
react-native-is-edge-to-edge@1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
@@ -37189,6 +38647,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/core': 7.28.5
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-worklets: 0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ semver: 7.7.2
+
react-native-reanimated@4.1.5(@babel/core@7.28.5)(react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/core': 7.28.5
@@ -37240,6 +38707,11 @@ snapshots:
react: 19.0.0
react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
+ react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
react-native-safe-area-context@5.6.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
@@ -37263,6 +38735,14 @@ snapshots:
react-native-is-edge-to-edge: 1.2.1(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0)
warn-once: 0.1.1
+ react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-freeze: 1.0.4(react@19.1.0)
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ warn-once: 0.1.1
+
react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
@@ -37378,12 +38858,70 @@ snapshots:
transitivePeerDependencies:
- encoding
+ react-native-webview@13.16.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1))(react@18.3.1):
+ dependencies:
+ escape-string-regexp: 4.0.0
+ invariant: 2.2.4
+ react: 18.3.1
+ react-native: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(react@18.3.1)
+ optional: true
+
+ react-native-webview@13.16.0(react-native@0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0))(react@19.0.0):
+ dependencies:
+ escape-string-regexp: 4.0.0
+ invariant: 2.2.4
+ react: 19.0.0
+ react-native: 0.79.3(@babel/core@7.28.5)(@types/react@19.0.14)(react@19.0.0)
+ optional: true
+
+ react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ escape-string-regexp: 4.0.0
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+
+ react-native-webview@13.16.0(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ escape-string-regexp: 4.0.0
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ optional: true
+
+ react-native-webview@13.16.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ escape-string-regexp: 4.0.0
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
+ optional: true
+
react-native-worklets-core@1.6.2(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
react: 19.1.0
react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0)
string-hash-64: 1.0.3
+ react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5)
+ '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5)
+ '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5)
+ convert-source-map: 2.0.0
+ react: 19.1.0
+ react-native: 0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0)
+ semver: 7.7.2
+ transitivePeerDependencies:
+ - supports-color
+
react-native-worklets@0.5.1(@babel/core@7.28.5)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/core': 7.28.5
@@ -37574,6 +39112,53 @@ snapshots:
- supports-color
- utf-8-validate
+ react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ '@jest/create-cache-key-function': 29.7.0
+ '@react-native/assets-registry': 0.81.4
+ '@react-native/codegen': 0.81.4(@babel/core@7.28.5)
+ '@react-native/community-cli-plugin': 0.81.4
+ '@react-native/gradle-plugin': 0.81.4
+ '@react-native/js-polyfills': 0.81.4
+ '@react-native/normalize-colors': 0.81.4
+ '@react-native/virtualized-lists': 0.81.4(@types/react@19.1.17)(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ abort-controller: 3.0.0
+ anser: 1.4.10
+ ansi-regex: 5.0.1
+ babel-jest: 29.7.0(@babel/core@7.28.5)
+ babel-plugin-syntax-hermes-parser: 0.29.1
+ base64-js: 1.5.1
+ commander: 12.1.0
+ flow-enums-runtime: 0.0.6
+ glob: 7.2.3
+ invariant: 2.2.4
+ jest-environment-node: 29.7.0
+ memoize-one: 5.2.1
+ metro-runtime: 0.83.3
+ metro-source-map: 0.83.3
+ nullthrows: 1.1.1
+ pretty-format: 29.7.0
+ promise: 8.3.0
+ react: 19.1.0
+ react-devtools-core: 6.1.5
+ react-refresh: 0.14.2
+ regenerator-runtime: 0.13.11
+ scheduler: 0.26.0
+ semver: 7.7.3
+ stacktrace-parser: 0.1.11
+ whatwg-fetch: 3.6.20
+ ws: 6.2.3
+ yargs: 17.7.2
+ optionalDependencies:
+ '@types/react': 19.1.17
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@react-native-community/cli'
+ - '@react-native/metro-config'
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0):
dependencies:
'@jest/create-cache-key-function': 29.7.0
@@ -37719,6 +39304,14 @@ snapshots:
react-refresh@0.17.0: {}
+ react-remove-scroll-bar@2.3.8(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.1.0):
dependencies:
react: 19.1.0
@@ -37727,6 +39320,17 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.7
+ react-remove-scroll@2.7.1(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-remove-scroll-bar: 2.3.8(@types/react@19.1.17)(react@19.1.0)
+ react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.1.17)(react@19.1.0)
+ use-sidecar: 1.1.3(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+
react-remove-scroll@2.7.1(@types/react@19.2.7)(react@19.1.0):
dependencies:
react: 19.1.0
@@ -37757,6 +39361,14 @@ snapshots:
webpack: 5.100.2
webpack-sources: 3.3.3
+ react-style-singleton@2.2.3(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.1.0):
dependencies:
get-nonce: 1.0.1
@@ -37806,6 +39418,8 @@ snapshots:
readline@1.3.0: {}
+ real-require@0.2.0: {}
+
recast@0.21.5:
dependencies:
ast-types: 0.15.2
@@ -38096,6 +39710,8 @@ snapshots:
restructure@3.0.2: {}
+ ret@0.4.3: {}
+
retext-latin@4.0.0:
dependencies:
'@types/nlcst': 2.0.3
@@ -38134,6 +39750,8 @@ snapshots:
reusify@1.1.0: {}
+ rfdc@1.4.1: {}
+
rimraf@2.6.3:
dependencies:
glob: 7.2.3
@@ -38184,6 +39802,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ rrweb-cssom@0.7.1: {}
+
rrweb-cssom@0.8.0: {}
rtl-detect@1.1.2: {}
@@ -38236,6 +39856,12 @@ snapshots:
es-errors: 1.3.0
is-regex: 1.2.1
+ safe-regex2@3.1.0:
+ dependencies:
+ ret: 0.4.3
+
+ safe-stable-stringify@2.5.0: {}
+
safer-buffer@2.1.2: {}
sass-formatter@0.7.9:
@@ -38278,6 +39904,8 @@ snapshots:
extend-shallow: 2.0.1
kind-of: 6.0.3
+ secure-json-parse@2.7.0: {}
+
selfsigned@2.4.1:
dependencies:
'@types/node-forge': 1.3.14
@@ -38537,6 +40165,10 @@ snapshots:
dot-case: 3.0.4
tslib: 2.8.1
+ sonic-boom@4.2.0:
+ dependencies:
+ atomic-sleep: 1.0.0
+
source-map-js@1.2.1: {}
source-map-support@0.5.13:
@@ -38563,6 +40195,8 @@ snapshots:
split-on-first@1.1.0: {}
+ split2@4.2.0: {}
+
sprintf-js@1.0.3: {}
ssri@10.0.6:
@@ -39055,6 +40689,17 @@ snapshots:
optionalDependencies:
esbuild: 0.27.0
+ terser-webpack-plugin@5.3.14(esbuild@0.27.0)(webpack@5.97.1(esbuild@0.27.0)):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ serialize-javascript: 6.0.2
+ terser: 5.44.1
+ webpack: 5.97.1(esbuild@0.27.0)
+ optionalDependencies:
+ esbuild: 0.27.0
+
terser-webpack-plugin@5.3.14(webpack@5.100.2):
dependencies:
'@jridgewell/trace-mapping': 0.3.31
@@ -39102,6 +40747,10 @@ snapshots:
dependencies:
any-promise: 1.3.0
+ thread-stream@3.1.0:
+ dependencies:
+ real-require: 0.2.0
+
throat@5.0.0: {}
through@2.3.8: {}
@@ -39159,6 +40808,8 @@ snapshots:
dependencies:
is-number: 7.0.0
+ toad-cache@3.7.0: {}
+
toidentifier@1.0.1: {}
token-types@6.1.1:
@@ -39804,6 +41455,13 @@ snapshots:
querystringify: 2.2.0
requires-port: 1.0.0
+ use-callback-ref@1.3.3(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.1.0):
dependencies:
react: 19.1.0
@@ -39823,6 +41481,14 @@ snapshots:
dependencies:
react: 19.1.0
+ use-sidecar@1.1.3(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
use-sidecar@1.1.3(@types/react@19.2.7)(react@19.1.0):
dependencies:
detect-node-es: 1.1.0
@@ -39879,6 +41545,15 @@ snapshots:
vary@1.1.2: {}
+ vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -39995,6 +41670,23 @@ snapshots:
tsx: 4.20.6
yaml: 2.8.1
+ vite@6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1):
+ dependencies:
+ esbuild: 0.25.12
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.53.3
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 24.10.1
+ fsevents: 2.3.3
+ jiti: 1.21.7
+ lightningcss: 1.30.2
+ terser: 5.44.1
+ tsx: 4.20.6
+ yaml: 2.8.1
+
vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1):
dependencies:
esbuild: 0.25.12
@@ -40071,6 +41763,10 @@ snapshots:
optionalDependencies:
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+ vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)):
+ optionalDependencies:
+ vite: 6.4.1(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+
vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)):
optionalDependencies:
vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
@@ -40193,7 +41889,7 @@ snapshots:
volar-service-emmet@0.0.66(@volar/language-service@2.4.23):
dependencies:
- '@emmetio/css-parser': git+https://git@github.com:ramya-rao-a/css-parser.git#370c480ac103bd17c7bcfb34bf5d577dc40d3660
+ '@emmetio/css-parser': https://codeload.github.com/ramya-rao-a/css-parser/tar.gz/370c480ac103bd17c7bcfb34bf5d577dc40d3660
'@emmetio/html-matcher': 1.3.0
'@vscode/emmet-helper': 2.11.0
vscode-uri: 3.1.0
@@ -40423,6 +42119,36 @@ snapshots:
- esbuild
- uglify-js
+ webpack@5.97.1(esbuild@0.27.0):
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.8
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.15.0
+ browserslist: 4.28.0
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.18.3
+ es-module-lexer: 1.7.0
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.1
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 3.3.0
+ tapable: 2.3.0
+ terser-webpack-plugin: 5.3.14(esbuild@0.27.0)(webpack@5.97.1(esbuild@0.27.0))
+ watchpack: 2.4.4
+ webpack-sources: 3.3.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
whatwg-encoding@2.0.0:
dependencies:
iconv-lite: 0.6.3
@@ -40693,6 +42419,13 @@ snapshots:
'@types/react': 19.0.14
react: 19.0.0
+ zustand@4.5.7(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ use-sync-external-store: 1.6.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ react: 19.1.0
+
zustand@4.5.7(@types/react@19.2.7)(react@19.1.0):
dependencies:
use-sync-external-store: 1.6.0(react@19.1.0)
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 88e4dccdc..b925c77c1 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -8,6 +8,7 @@ packages:
- 'uload'
- 'chat'
- 'nutriphi'
+ - 'news'
# Sub-apps within projects
- 'maerchenzauber/apps/*'
@@ -24,6 +25,8 @@ packages:
- 'chat/packages/*'
- 'nutriphi/apps/*'
- 'nutriphi/backend'
+ - 'news/apps/*'
+ - 'news/packages/*'
# Shared packages
- 'packages/*'
diff --git a/uload/apps/landing/package.json b/uload/apps/landing/package.json
index 70db703ee..b765c8be2 100644
--- a/uload/apps/landing/package.json
+++ b/uload/apps/landing/package.json
@@ -14,6 +14,7 @@
"@astrojs/mdx": "^4.0.8",
"@astrojs/sitemap": "^3.2.1",
"@astrojs/tailwind": "^6.0.2",
+ "@manacore/shared-landing-ui": "workspace:*",
"astro": "^5.1.1",
"tailwindcss": "^3.4.17"
},
diff --git a/uload/apps/landing/src/components/FeaturesSection.astro b/uload/apps/landing/src/components/FeaturesSection.astro
deleted file mode 100644
index 1785bc3e2..000000000
--- a/uload/apps/landing/src/components/FeaturesSection.astro
+++ /dev/null
@@ -1,76 +0,0 @@
----
-const features = [
- {
- icon: '🔗',
- title: 'URL-Verkürzung',
- description: 'Verwandeln Sie lange URLs in kurze, teilbare Links mit nur einem Klick. Perfekt für Social Media und Marketing.'
- },
- {
- icon: '📊',
- title: 'Detaillierte Analytics',
- description: 'Verfolgen Sie Klicks, geografische Herkunft, Geräte und Engagement Ihrer Links in Echtzeit.'
- },
- {
- icon: '🎨',
- title: 'QR-Code Generator',
- description: 'Erstellen Sie anpassbare QR-Codes in verschiedenen Farben und Formaten für jeden Link.'
- },
- {
- icon: '💳',
- title: 'Digitale Visitenkarten',
- description: 'Erstellen Sie professionelle digitale Visitenkarten mit QR-Codes und Kontaktinformationen.'
- },
- {
- icon: '🔒',
- title: 'Passwortschutz',
- description: 'Schützen Sie Ihre Links mit Passwörtern und setzen Sie Ablaufdaten für zeitlich begrenzte Aktionen.'
- },
- {
- icon: '🏷️',
- title: 'Tag-System',
- description: 'Organisieren Sie Ihre Links mit Tags und Kategorien für eine bessere Übersicht und Filterung.'
- },
- {
- icon: '👥',
- title: 'Team Workspaces',
- description: 'Arbeiten Sie im Team zusammen mit gemeinsamen Workspaces und granularen Berechtigungen.'
- },
- {
- icon: '⚡',
- title: 'Blitzschnell',
- description: 'Unsere Links sind weltweit über ein CDN verteilt für minimale Ladezeiten und maximale Verfügbarkeit.'
- },
- {
- icon: '🔌',
- title: 'API Zugang',
- description: 'Integrieren Sie uLoad in Ihre Anwendungen mit unserer RESTful API für automatisierte Workflows.'
- }
-];
----
-
-
-
-
-
- Alles was du für professionelles Link-Management brauchst
-
-
- Von einfacher URL-Verkürzung bis hin zu Team-Kollaboration – uLoad bietet alle Features die du brauchst.
-
-
-
-
- {features.map(feature => (
-
-
{feature.icon}
-
- {feature.title}
-
-
- {feature.description}
-
-
- ))}
-
-
-
diff --git a/uload/apps/landing/src/components/PricingSection.astro b/uload/apps/landing/src/components/PricingSection.astro
deleted file mode 100644
index c321fa31e..000000000
--- a/uload/apps/landing/src/components/PricingSection.astro
+++ /dev/null
@@ -1,185 +0,0 @@
----
-const appUrl = 'https://app.ulo.ad';
-
-const plans = [
- {
- id: 'free',
- name: 'Free',
- price: 0,
- period: '/Monat',
- description: 'Perfekt zum Ausprobieren',
- features: [
- '10 Links pro Monat',
- 'Basis Analytics',
- 'QR-Code Generator',
- 'Link Anpassung',
- 'Standard Support'
- ],
- cta: 'Kostenlos starten',
- highlighted: false,
- href: `${appUrl}/register`
- },
- {
- id: 'pro-monthly',
- name: 'Pro',
- price: 4.99,
- period: '/Monat',
- description: 'Für Freelancer & Creators',
- features: [
- 'Unbegrenzte Links',
- 'Erweiterte Analytics',
- 'Custom QR Codes',
- 'Link Anpassung',
- 'Priority Support',
- 'API Zugang'
- ],
- cta: 'Pro wählen',
- highlighted: false,
- href: `${appUrl}/register?plan=pro`
- },
- {
- id: 'pro-yearly',
- name: 'Pro Jährlich',
- price: 3.33,
- period: '/Monat',
- description: 'Beste Wahl für Power User',
- features: [
- 'Unbegrenzte Links',
- 'Erweiterte Analytics',
- 'Custom QR Codes',
- 'Link Anpassung',
- 'Priority Support',
- 'API Zugang'
- ],
- cta: 'Jährlich sparen',
- highlighted: true,
- badge: 'Spare 20€/Jahr',
- href: `${appUrl}/register?plan=pro-yearly`
- },
- {
- id: 'lifetime',
- name: 'Pro Lifetime',
- price: 129.99,
- period: 'einmalig',
- description: 'Einmalig zahlen, für immer nutzen',
- features: [
- 'Alle Pro Features',
- 'Lebenslanger Zugang',
- 'Alle zukünftigen Features',
- 'Early Access',
- 'Priority Support'
- ],
- cta: 'Lifetime sichern',
- highlighted: false,
- badge: 'Einmalig',
- href: `${appUrl}/register?plan=lifetime`
- }
-];
-
-function formatPrice(price: number): string {
- return new Intl.NumberFormat('de-DE', {
- style: 'currency',
- currency: 'EUR',
- minimumFractionDigits: price % 1 === 0 ? 0 : 2
- }).format(price);
-}
----
-
-
-
-
-
- Transparente Preise, keine versteckten Kosten
-
-
- Starte kostenlos und upgrade wenn du bereit bist. Jederzeit kündbar.
-
-
-
-
-
- {plans.map(plan => (
-
- {plan.badge && (
-
-
- {plan.badge}
-
-
- )}
-
-
-
{plan.name}
-
{plan.description}
-
-
-
-
- {formatPrice(plan.price)}
-
- {plan.period}
-
-
-
-
- {plan.cta}
-
-
-
-
- Inklusive:
-
- {plan.features.map(feature => (
-
- ))}
-
-
-
- ))}
-
-
-
-
-
-
-
💳 Keine Kreditkarte erforderlich
-
- Starte komplett kostenlos. Upgrade nur wenn du mehr brauchst.
-
-
-
-
🔄 Jederzeit kündbar
-
- Keine Vertragsbindung. Kündige monatlich ohne Probleme.
-
-
-
-
🚀 Sofort startklar
-
- Nach der Anmeldung kannst du sofort alle Features nutzen.
-
-
-
-
-
-
diff --git a/uload/apps/landing/src/pages/index.astro b/uload/apps/landing/src/pages/index.astro
index 03055eb80..c69ce28b4 100644
--- a/uload/apps/landing/src/pages/index.astro
+++ b/uload/apps/landing/src/pages/index.astro
@@ -1,12 +1,223 @@
---
import BaseLayout from '../layouts/BaseLayout.astro';
import HeroSection from '../components/HeroSection.astro';
-import FeaturesSection from '../components/FeaturesSection.astro';
-import PricingSection from '../components/PricingSection.astro';
+
+// Shared components
+import FeatureSection from '@manacore/shared-landing-ui/sections/FeatureSection.astro';
+import StepsSection from '@manacore/shared-landing-ui/sections/StepsSection.astro';
+import FAQSection from '@manacore/shared-landing-ui/sections/FAQSection.astro';
+import CTASection from '@manacore/shared-landing-ui/sections/CTASection.astro';
+import PricingSection from '@manacore/shared-landing-ui/sections/PricingSection.astro';
+
+const appUrl = 'https://app.ulo.ad';
+
+// Feature data
+const features = [
+ {
+ icon: '🔗',
+ title: 'Smart Links',
+ description: 'Kurze URLs mit Tracking, Ablaufdatum, Passwortschutz und UTM-Parametern für professionelles Marketing.'
+ },
+ {
+ icon: '📊',
+ title: 'Detaillierte Analytics',
+ description: 'Verfolge Klicks, geografische Herkunft, Geräte und Referrer in Echtzeit mit übersichtlichen Dashboards.'
+ },
+ {
+ icon: '🎨',
+ title: 'QR-Code Generator',
+ description: 'Erstelle anpassbare QR-Codes in verschiedenen Farben, Formen und mit deinem Logo für jeden Link.'
+ },
+ {
+ icon: '💳',
+ title: 'Profile Cards',
+ description: 'Beeindruckende Profilseiten mit Drag & Drop Builder - deine digitale Visitenkarte.'
+ },
+ {
+ icon: '👥',
+ title: 'Team Workspaces',
+ description: 'Arbeite im Team zusammen mit gemeinsamen Workspaces, Ordnern und granularen Berechtigungen.'
+ },
+ {
+ icon: '🔌',
+ title: 'API & Integrationen',
+ description: 'RESTful API für automatisierte Workflows und Integration in deine bestehenden Tools.'
+ }
+];
+
+// Steps data
+const steps = [
+ {
+ number: '1',
+ title: 'Link einfügen',
+ description: 'Füge deine lange URL ein - egal ob Website, Social Media Post oder Dokument.',
+ image: '/screenshots/paste.png'
+ },
+ {
+ number: '2',
+ title: 'Anpassen',
+ description: 'Wähle einen Custom Slug, setze Ablaufdatum, Passwort oder UTM-Parameter.',
+ image: '/screenshots/customize.png'
+ },
+ {
+ number: '3',
+ title: 'Teilen & Tracken',
+ description: 'Teile deinen kurzen Link und verfolge alle Klicks in Echtzeit.',
+ image: '/screenshots/share.png'
+ }
+];
+
+// Pricing data
+const pricingPlans = [
+ {
+ name: 'Free',
+ price: '0',
+ period: '/Monat',
+ description: 'Perfekt zum Ausprobieren',
+ features: [
+ { text: '10 Links pro Monat', included: true },
+ { text: 'Basis Analytics', included: true },
+ { text: 'QR-Code Generator', included: true },
+ { text: 'Link Anpassung', included: true },
+ { text: 'Unbegrenzte Links', included: false },
+ { text: 'Team Features', included: false }
+ ],
+ cta: {
+ text: 'Kostenlos starten',
+ href: `${appUrl}/register`
+ }
+ },
+ {
+ name: 'Pro',
+ price: '4,99',
+ period: '/Monat',
+ description: 'Für Freelancer & Creators',
+ features: [
+ { text: 'Unbegrenzte Links', included: true },
+ { text: 'Erweiterte Analytics', included: true },
+ { text: 'Custom QR Codes', included: true },
+ { text: 'API Zugang', included: true },
+ { text: 'Priority Support', included: true },
+ { text: 'Passwortschutz', included: true }
+ ],
+ cta: {
+ text: 'Pro wählen',
+ href: `${appUrl}/register?plan=pro`
+ }
+ },
+ {
+ name: 'Pro Jährlich',
+ price: '3,33',
+ period: '/Monat',
+ description: 'Spare 20€ pro Jahr',
+ features: [
+ { text: 'Alle Pro Features', included: true },
+ { text: 'Unbegrenzte Links', included: true },
+ { text: 'Erweiterte Analytics', included: true },
+ { text: 'Custom QR Codes', included: true },
+ { text: 'API Zugang', included: true },
+ { text: 'Priority Support', included: true }
+ ],
+ cta: {
+ text: 'Jährlich sparen',
+ href: `${appUrl}/register?plan=pro-yearly`
+ },
+ highlighted: true,
+ badge: 'Spare 20€'
+ },
+ {
+ name: 'Lifetime',
+ price: '129,99',
+ period: 'einmalig',
+ description: 'Einmal zahlen, für immer nutzen',
+ features: [
+ { text: 'Alle Pro Features', included: true },
+ { text: 'Lebenslanger Zugang', included: true },
+ { text: 'Alle zukünftigen Features', included: true },
+ { text: 'Early Access', included: true },
+ { text: 'Priority Support', included: true },
+ { text: 'Keine Abo-Gebühren', included: true }
+ ],
+ cta: {
+ text: 'Lifetime sichern',
+ href: `${appUrl}/register?plan=lifetime`
+ },
+ badge: 'Einmalig'
+ }
+];
+
+// FAQ data
+const faqs = [
+ {
+ question: 'Wie lange bleiben meine Links aktiv?',
+ answer: 'Im Free-Plan bleiben Links 1 Jahr aktiv. Mit Pro sind alle Links unbegrenzt gültig - es sei denn, du setzt selbst ein Ablaufdatum.'
+ },
+ {
+ question: 'Kann ich meine eigene Domain verwenden?',
+ answer: 'Ja! Mit Pro kannst du deine eigene Domain verbinden und branded Short-Links erstellen (z.B. links.deinefirma.de/kampagne).'
+ },
+ {
+ question: 'Wie funktionieren die Analytics?',
+ answer: 'Wir tracken Klicks, Herkunftsland, Gerät, Browser und Referrer - DSGVO-konform ohne Cookies. Du siehst alle Daten in Echtzeit im Dashboard.'
+ },
+ {
+ question: 'Was sind Profile Cards?',
+ answer: 'Profile Cards sind customizable Landing Pages für deine Links. Perfekt für Bio-Links, digitale Visitenkarten oder Link-in-Bio für Social Media.'
+ },
+ {
+ question: 'Gibt es eine API?',
+ answer: 'Ja! Mit Pro erhältst du vollen API-Zugang. Erstelle Links, rufe Analytics ab und integriere uLoad in deine Workflows programmatisch.'
+ },
+ {
+ question: 'Kann ich mein Abo jederzeit kündigen?',
+ answer: 'Ja, du kannst monatliche Abos jederzeit kündigen. Nach der Kündigung hast du noch bis zum Ende des Abrechnungszeitraums Zugang zu allen Pro-Features.'
+ }
+];
---
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/uload/apps/landing/src/styles/global.css b/uload/apps/landing/src/styles/global.css
index 7bbd1b0a7..37eeaf633 100644
--- a/uload/apps/landing/src/styles/global.css
+++ b/uload/apps/landing/src/styles/global.css
@@ -2,41 +2,84 @@
@tailwind components;
@tailwind utilities;
-@layer base {
- :root {
- --color-primary: #3b82f6;
- --color-primary-dark: #2563eb;
- --color-background: #ffffff;
- --color-background-secondary: #f9fafb;
- --color-text: #111827;
- --color-text-secondary: #6b7280;
- --color-border: #e5e7eb;
- }
+/* uLoad Theme CSS Variables - Professional Blue (Light Theme) */
+:root {
+ /* Primary colors - uLoad Blue */
+ --color-primary: #3b82f6;
+ --color-primary-hover: #2563eb;
+ --color-primary-glow: rgba(59, 130, 246, 0.2);
- .dark {
- --color-background: #111827;
- --color-background-secondary: #1f2937;
- --color-text: #f9fafb;
- --color-text-secondary: #9ca3af;
- --color-border: #374151;
- }
+ /* Text colors (Light theme) */
+ --color-text-primary: #111827;
+ --color-text-secondary: #4b5563;
+ --color-text-muted: #6b7280;
- html {
- scroll-behavior: smooth;
- }
+ /* Background colors (Light theme) */
+ --color-background-page: #ffffff;
+ --color-background-card: #f9fafb;
+ --color-background-card-hover: #f3f4f6;
- body {
- @apply bg-white text-gray-900 antialiased;
+ /* Border colors */
+ --color-border: #e5e7eb;
+ --color-border-hover: #d1d5db;
+}
+
+/* Base styles */
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: 'Inter', system-ui, sans-serif;
+ background-color: var(--color-background-page);
+ color: var(--color-text-primary);
+ line-height: 1.6;
+ -webkit-font-smoothing: antialiased;
+}
+
+/* Selection */
+::selection {
+ background-color: var(--color-primary);
+ color: white;
+}
+
+/* Focus styles */
+:focus-visible {
+ outline: 2px solid var(--color-primary);
+ outline-offset: 2px;
+}
+
+/* Gradient text */
+.text-gradient {
+ background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+/* Animation utilities */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
}
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animate-fadeIn {
+ animation: fadeIn 0.6s ease-out forwards;
}
@layer components {
.btn-primary {
- @apply inline-flex items-center justify-center px-6 py-3 text-base font-medium text-white bg-primary-600 rounded-lg hover:bg-primary-700 transition-colors duration-200;
+ @apply inline-flex items-center justify-center px-6 py-3 text-base font-medium text-white bg-primary-600 rounded-lg hover:bg-primary-700 transition-colors duration-200 shadow-lg hover:shadow-xl;
}
.btn-secondary {
- @apply inline-flex items-center justify-center px-6 py-3 text-base font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors duration-200;
+ @apply inline-flex items-center justify-center px-6 py-3 text-base font-medium text-gray-700 bg-white border-2 border-gray-200 rounded-lg hover:border-primary-500 hover:bg-primary-50 transition-all duration-200;
}
.container-custom {
diff --git a/uload/apps/landing/tailwind.config.mjs b/uload/apps/landing/tailwind.config.mjs
index 382a5e335..941d5e854 100644
--- a/uload/apps/landing/tailwind.config.mjs
+++ b/uload/apps/landing/tailwind.config.mjs
@@ -1,9 +1,13 @@
/** @type {import('tailwindcss').Config} */
export default {
- content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
+ content: [
+ './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}',
+ '../../packages/shared-landing-ui/src/**/*.{astro,html,js,jsx,ts,tsx}'
+ ],
theme: {
extend: {
colors: {
+ // uLoad Professional Blue Theme (Light)
primary: {
50: '#eff6ff',
100: '#dbeafe',
@@ -15,7 +19,24 @@ export default {
700: '#1d4ed8',
800: '#1e40af',
900: '#1e3a8a',
- 950: '#172554'
+ 950: '#172554',
+ DEFAULT: '#3b82f6',
+ hover: '#2563eb',
+ glow: 'rgba(59, 130, 246, 0.2)'
+ },
+ background: {
+ page: '#ffffff',
+ card: '#f9fafb',
+ 'card-hover': '#f3f4f6'
+ },
+ text: {
+ primary: '#111827',
+ secondary: '#4b5563',
+ muted: '#6b7280'
+ },
+ border: {
+ DEFAULT: '#e5e7eb',
+ hover: '#d1d5db'
}
},
fontFamily: {