diff --git a/.env.development b/.env.development index 70fadafcc..d8e3e2ad6 100644 --- a/.env.development +++ b/.env.development @@ -123,6 +123,23 @@ PICTURE_SUPABASE_ANON_KEY=your-supabase-anon-key PICTURE_GOOGLE_CLIENT_ID= PICTURE_APPLE_CLIENT_ID= +# ============================================ +# NUTRIPHI PROJECT +# ============================================ + +NUTRIPHI_BACKEND_PORT=3002 +NUTRIPHI_DATABASE_URL=postgresql://nutriphi:nutriphi_dev_password@localhost:5435/nutriphi +NUTRIPHI_APP_ID=nutriphi +NUTRIPHI_GEMINI_API_KEY=your-gemini-api-key-here + +# S3 Storage (Hetzner Object Storage) +NUTRIPHI_S3_ENDPOINT=https://fsn1.your-objectstorage.com +NUTRIPHI_S3_ACCESS_KEY_ID=your-access-key-id +NUTRIPHI_S3_SECRET_ACCESS_KEY=your-secret-access-key +NUTRIPHI_S3_BUCKET_NAME=nutriphi-meals +NUTRIPHI_S3_REGION=fsn1 +NUTRIPHI_S3_PUBLIC_URL=https://nutriphi-meals.fsn1.your-objectstorage.com + # ============================================ # ZITARE PROJECT # ============================================ diff --git a/apps/nutriphi/apps/web/src/lib/components/AppSlider.svelte b/apps/nutriphi/apps/web/src/lib/components/AppSlider.svelte new file mode 100644 index 000000000..ac8bb846d --- /dev/null +++ b/apps/nutriphi/apps/web/src/lib/components/AppSlider.svelte @@ -0,0 +1,32 @@ + + + diff --git a/apps/nutriphi/apps/web/src/routes/(public)/forgot-password/+page.svelte b/apps/nutriphi/apps/web/src/routes/(public)/forgot-password/+page.svelte new file mode 100644 index 000000000..111eb3032 --- /dev/null +++ b/apps/nutriphi/apps/web/src/routes/(public)/forgot-password/+page.svelte @@ -0,0 +1,48 @@ + + + + Passwort zurücksetzen | Nutriphi + + + + {#snippet appSlider()} + + {/snippet} + diff --git a/apps/nutriphi/apps/web/src/routes/(public)/login/+page.svelte b/apps/nutriphi/apps/web/src/routes/(public)/login/+page.svelte index 8844c7194..2a158d4b8 100644 --- a/apps/nutriphi/apps/web/src/routes/(public)/login/+page.svelte +++ b/apps/nutriphi/apps/web/src/routes/(public)/login/+page.svelte @@ -1,113 +1,65 @@ -
-
-
-
- 🥗 -
-

Anmelden

-

Willkommen zurück bei Nutriphi

-
+ + Anmelden | Nutriphi + - {#if error} -
- {error} -
- {/if} - -
-
- - -
- -
- - -
- - -
- -
-

- Noch kein Konto? - - Registrieren - -

-
- - -
-
+ + {#snippet appSlider()} + + {/snippet} + diff --git a/apps/nutriphi/apps/web/src/routes/(public)/register/+page.svelte b/apps/nutriphi/apps/web/src/routes/(public)/register/+page.svelte index 7e1a59779..2947b0b57 100644 --- a/apps/nutriphi/apps/web/src/routes/(public)/register/+page.svelte +++ b/apps/nutriphi/apps/web/src/routes/(public)/register/+page.svelte @@ -1,168 +1,56 @@ -
-
-
-
- 🥗 -
-

Registrieren

-

Erstelle dein Nutriphi Konto

-
+ + Registrieren | Nutriphi + - {#if needsVerification} -
-

Bestätige deine E-Mail

-

- Wir haben dir eine Bestätigungs-E-Mail gesendet. Bitte klicke auf den Link in der E-Mail, - um dein Konto zu aktivieren. -

- - Zur Anmeldung - -
- {:else} - {#if error} -
- {error} -
- {/if} - -
-
- - -
- -
- - -
- -
- - -
- - -
- -
-

- Bereits ein Konto? - - Anmelden - -

-
- {/if} - - -
-
+ + {#snippet appSlider()} + + {/snippet} + diff --git a/apps/nutriphi/apps/web/vite.config.ts b/apps/nutriphi/apps/web/vite.config.ts index fce9e8704..8615d1e0f 100644 --- a/apps/nutriphi/apps/web/vite.config.ts +++ b/apps/nutriphi/apps/web/vite.config.ts @@ -3,4 +3,24 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [sveltekit()], + ssr: { + noExternal: [ + '@manacore/shared-theme', + '@manacore/shared-auth-ui', + '@manacore/shared-branding', + '@manacore/shared-ui', + '@manacore/shared-theme-ui', + '@manacore/shared-i18n', + ], + }, + optimizeDeps: { + exclude: [ + '@manacore/shared-theme', + '@manacore/shared-auth-ui', + '@manacore/shared-branding', + '@manacore/shared-ui', + '@manacore/shared-theme-ui', + '@manacore/shared-i18n', + ], + }, }); diff --git a/packages/shared-branding/src/app-icons.ts b/packages/shared-branding/src/app-icons.ts index aee1c59ab..487915d39 100644 --- a/packages/shared-branding/src/app-icons.ts +++ b/packages/shared-branding/src/app-icons.ts @@ -44,6 +44,9 @@ const wisekeepSvg = ``; +// Nutriphi icon (nutrition/heart with gradient) +const nutriphiSvg = ``; + /** * App icons as data URLs * Use these directly in or CSS background-image @@ -60,6 +63,7 @@ export const APP_ICONS = { zitare: svgToDataUrl(zitareSvg), wisekeep: svgToDataUrl(wisekeepSvg), moodlit: svgToDataUrl(moodlitSvg), + nutriphi: svgToDataUrl(nutriphiSvg), } as const; export type AppIconId = keyof typeof APP_ICONS; diff --git a/packages/shared-branding/src/config.ts b/packages/shared-branding/src/config.ts index 73e955cf1..7326209a4 100644 --- a/packages/shared-branding/src/config.ts +++ b/packages/shared-branding/src/config.ts @@ -92,6 +92,19 @@ export const APP_BRANDING: Record = { logoStroke: true, logoStrokeWidth: 1.5, }, + nutriphi: { + id: 'nutriphi', + name: 'Nutriphi', + tagline: 'AI Nutrition Tracker', + primaryColor: '#10b981', + secondaryColor: '#34d399', + // Heart with sparkle for healthy nutrition + logoPath: + 'M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z', + logoViewBox: '0 0 24 24', + logoStroke: true, + logoStrokeWidth: 1.5, + }, }; /** diff --git a/packages/shared-branding/src/logos/NutriPhiLogo.svelte b/packages/shared-branding/src/logos/NutriPhiLogo.svelte new file mode 100644 index 000000000..2d3d571ad --- /dev/null +++ b/packages/shared-branding/src/logos/NutriPhiLogo.svelte @@ -0,0 +1,13 @@ + + + diff --git a/packages/shared-branding/src/logos/index.ts b/packages/shared-branding/src/logos/index.ts index 728cedf2e..9f19f4e33 100644 --- a/packages/shared-branding/src/logos/index.ts +++ b/packages/shared-branding/src/logos/index.ts @@ -9,3 +9,4 @@ export { default as StorytellerLogo } from './StorytellerLogo.svelte'; export { default as UloadLogo } from './UloadLogo.svelte'; export { default as ChatLogo } from './ChatLogo.svelte'; export { default as PresiLogo } from './PresiLogo.svelte'; +export { default as NutriPhiLogo } from './NutriPhiLogo.svelte'; diff --git a/packages/shared-branding/src/mana-apps.ts b/packages/shared-branding/src/mana-apps.ts index 59ed6cb61..00bdfa1da 100644 --- a/packages/shared-branding/src/mana-apps.ts +++ b/packages/shared-branding/src/mana-apps.ts @@ -158,6 +158,22 @@ export const MANA_APPS: ManaApp[] = [ comingSoon: true, status: 'planning', }, + { + id: 'nutriphi', + name: 'Nutriphi', + description: { + de: 'KI Ernährungstracker', + en: 'AI Nutrition Tracker', + }, + longDescription: { + de: 'Tracke deine Ernährung mit KI-gestützter Foto-Analyse und erhalte detaillierte Nährwertinformationen.', + en: 'Track your nutrition with AI-powered photo analysis and get detailed nutritional information.', + }, + icon: APP_ICONS.nutriphi, + color: '#10b981', + comingSoon: false, + status: 'development', + }, ]; /** diff --git a/packages/shared-branding/src/types.ts b/packages/shared-branding/src/types.ts index f5892d078..89b145b29 100644 --- a/packages/shared-branding/src/types.ts +++ b/packages/shared-branding/src/types.ts @@ -1,7 +1,7 @@ /** * App identifiers for branding */ -export type AppId = 'memoro' | 'manacore' | 'manadeck' | 'maerchenzauber' | 'uload' | 'chat' | 'presi'; +export type AppId = 'memoro' | 'manacore' | 'manadeck' | 'maerchenzauber' | 'uload' | 'chat' | 'presi' | 'nutriphi'; /** * App branding configuration diff --git a/scripts/generate-env.mjs b/scripts/generate-env.mjs index a979d835f..77c1e7ec6 100644 --- a/scripts/generate-env.mjs +++ b/scripts/generate-env.mjs @@ -249,6 +249,34 @@ const APP_CONFIGS = [ }, }, + // Nutriphi Backend (NestJS) + { + path: 'apps/nutriphi/apps/backend/.env', + vars: { + NODE_ENV: () => 'development', + PORT: (env) => env.NUTRIPHI_BACKEND_PORT || '3002', + DATABASE_URL: (env) => env.NUTRIPHI_DATABASE_URL, + MANACORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, + GEMINI_API_KEY: (env) => env.NUTRIPHI_GEMINI_API_KEY, + S3_ENDPOINT: (env) => env.NUTRIPHI_S3_ENDPOINT, + S3_ACCESS_KEY_ID: (env) => env.NUTRIPHI_S3_ACCESS_KEY_ID, + S3_SECRET_ACCESS_KEY: (env) => env.NUTRIPHI_S3_SECRET_ACCESS_KEY, + S3_BUCKET_NAME: (env) => env.NUTRIPHI_S3_BUCKET_NAME, + S3_REGION: (env) => env.NUTRIPHI_S3_REGION, + S3_PUBLIC_URL: (env) => env.NUTRIPHI_S3_PUBLIC_URL, + }, + }, + + // Nutriphi Web (SvelteKit) + { + path: 'apps/nutriphi/apps/web/.env', + vars: { + PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.NUTRIPHI_BACKEND_PORT || '3002'}`, + PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, + PUBLIC_MIDDLEWARE_APP_ID: (env) => env.NUTRIPHI_APP_ID || 'nutriphi', + }, + }, + // Zitare Backend (NestJS) { path: 'apps/zitare/apps/backend/.env',