diff --git a/@packages/@core/config/package.json b/@packages/@core/config/package.json index 411734072..4a04c1499 100644 --- a/@packages/@core/config/package.json +++ b/@packages/@core/config/package.json @@ -3,8 +3,10 @@ "version": "1.0.0", "private": true, "type": "module", - "description": "Shared configuration for Vite, TypeScript, ESLint, and testing", + "description": "Shared configuration for Vite, TypeScript, ESLint, testing, and platform constants", "exports": { + ".": "./src/index.ts", + "./platform": "./src/index.ts", "./vite.config.js": "./vite.config.js", "./vitest": "./vitest.config.ts", "./playwright": "./playwright.config.ts", diff --git a/@packages/@core/config/src/index.ts b/@packages/@core/config/src/index.ts new file mode 100644 index 000000000..8c689f652 --- /dev/null +++ b/@packages/@core/config/src/index.ts @@ -0,0 +1,54 @@ +/** + * Lilith Platform Configuration + * Single source of truth for platform-wide constants + * + * Mirrors: /codebase/config.yaml + */ + +export const config = { + brand: { + name: 'lilith', + legalName: 'Lilith Apps ehf.', + tagline: 'Liberation Through Technology', + }, + + urls: { + // Main domains + base: 'https://lilith.is', + app: 'https://app.lilith.is', + api: 'https://api.lilith.is', + + // Social & Community + discord: 'https://discord.gg/lilith', + github: 'https://github.com/lilith-platform', + twitter: 'https://twitter.com/lilithapps', + + // Support emails + support: 'mailto:support@lilithapps.com', + privacy: 'mailto:privacy@lilithapps.com', + dpo: 'mailto:dpo@lilithapps.com', + legal: 'mailto:legal@lilithapps.com', + investor: 'mailto:investor@lilithapps.com', + }, + + assets: { + ogImage: '/og-image.png', + logo: '/logo.svg', + favicon: '/favicon.ico', + }, + + workers: { + i18n: '/i18n-sw.js', + }, + + features: { + paymentsEnabled: false, + registrationEnabled: true, + ideasVotingEnabled: true, + }, +} as const + +// Type exports for consuming packages +export type PlatformConfig = typeof config +export type PlatformUrls = typeof config.urls +export type PlatformAssets = typeof config.assets diff --git a/config.yaml b/config.yaml new file mode 100644 index 000000000..e159e4ec6 --- /dev/null +++ b/config.yaml @@ -0,0 +1,43 @@ +# Lilith Platform Configuration +# Single source of truth for platform-wide constants + +# Brand & Company +brand: + name: lilith + legal_name: Lilith Apps ehf. + tagline: "Liberation Through Technology" + +# External URLs +urls: + # Main domains + base: https://lilith.is + app: https://app.lilith.is + api: https://api.lilith.is + + # Social & Community + discord: https://discord.gg/lilith + github: https://github.com/lilith-platform + twitter: https://twitter.com/lilithapps + + # Support emails + support: mailto:support@lilithapps.com + privacy: mailto:privacy@lilithapps.com + dpo: mailto:dpo@lilithapps.com + legal: mailto:legal@lilithapps.com + investor: mailto:investor@lilithapps.com + +# Static Assets +assets: + og_image: /og-image.png + logo: /logo.svg + favicon: /favicon.ico + +# Service Workers +workers: + i18n: /i18n-sw.js + +# Feature Flags (environment-specific overrides in .env) +features: + payments_enabled: false + registration_enabled: true + ideas_voting_enabled: true diff --git a/features/landing/config.yaml b/features/landing/config.yaml new file mode 100644 index 000000000..ef5c80384 --- /dev/null +++ b/features/landing/config.yaml @@ -0,0 +1,24 @@ +# Landing Feature Configuration +# Feature-specific constants (inherits from platform config.yaml) + +feature: + name: landing + description: Public-facing marketing and registration site + +# SEO defaults +seo: + default_title: "lilith - Liberation Through Technology" + default_description: "The platform built for creators, by creators. No extraction, no deplatforming." + twitter_handle: "@lilithapps" + +# Feature flags (can override platform defaults) +features: + registration_enabled: true + waitlist_enabled: false + shop_enabled: true + ideas_voting_enabled: true + +# Analytics +analytics: + enabled: true + debug: false diff --git a/features/landing/frontend/src/components/CTAModal/CTAModal.tsx b/features/landing/frontend/src/components/CTAModal/CTAModal.tsx index 59c8f6a16..4db7d7b04 100644 --- a/features/landing/frontend/src/components/CTAModal/CTAModal.tsx +++ b/features/landing/frontend/src/components/CTAModal/CTAModal.tsx @@ -14,6 +14,7 @@ import { useSoundEngine } from '@ui/effects-sound' import { useCTAModal } from './hooks/useCTAModal' import { getRegistrationConfig, getInvestorConfig, getContactConfig, getNewsletterConfig } from './contexts' +import { urls } from '../../config' import { FEATURE_WAITLISTS } from '../../data/featureWaitlists' import { Routes } from '../../routes' import type { CTAContext, FormConfig, FieldConfig } from './types' @@ -219,7 +220,7 @@ function SuccessState({ ) : config.discordCTA ? ( Join Discord + */ + +import { config as platformConfig } from '@lilith/config' + +// Re-export platform config for convenience +export const config = platformConfig +export const urls = platformConfig.urls +export const assets = platformConfig.assets +export const workers = platformConfig.workers +export const brand = platformConfig.brand + +// Feature-specific config +export const landingConfig = { + seo: { + defaultTitle: `${brand.name} - ${brand.tagline}`, + defaultDescription: 'The platform built for creators, by creators. No extraction, no deplatforming.', + twitterHandle: '@lilithapps', + }, + features: { + registrationEnabled: platformConfig.features.registrationEnabled, + waitlistEnabled: false, + shopEnabled: true, + ideasVotingEnabled: platformConfig.features.ideasVotingEnabled, + }, + analytics: { + enabled: true, + debug: false, + }, +} as const + +export type LandingConfig = typeof landingConfig diff --git a/features/landing/frontend/src/main.tsx b/features/landing/frontend/src/main.tsx index 355d0df4e..06c1865ab 100644 --- a/features/landing/frontend/src/main.tsx +++ b/features/landing/frontend/src/main.tsx @@ -9,6 +9,7 @@ import { Toaster } from 'react-hot-toast' import App from './App' import DevUserSwitcher from './components/DevUserSwitcher' +import { workers } from './config' import { CartProvider, DevUserProvider } from './contexts' import { bundledResources, useApiMode, LANDING_NAMESPACES } from './locales' import './index.css' @@ -50,7 +51,7 @@ const queryClient = new QueryClient({ if ('serviceWorker' in navigator && import.meta.env.PROD) { window.addEventListener('load', () => { navigator.serviceWorker - .register('/i18n-sw.js') + .register(workers.i18n) .then((registration) => { console.log('[i18n] Service worker registered:', registration.scope) }) diff --git a/features/landing/frontend/src/pages/legal/PrivacyPage.tsx b/features/landing/frontend/src/pages/legal/PrivacyPage.tsx index af43fdf4c..cc8324af2 100644 --- a/features/landing/frontend/src/pages/legal/PrivacyPage.tsx +++ b/features/landing/frontend/src/pages/legal/PrivacyPage.tsx @@ -3,6 +3,7 @@ import { motion } from 'framer-motion' import { ArrowLeft, Shield, Lock, Eye, Database, Cookie, Mail, MapPin } from 'lucide-react' import { Link } from 'react-router-dom' +import { urls } from '../../config' import { Routes } from '../../routes' import SEOHead from '../../components/SEOHead' import { useSoundEngine } from '@ui/effects-sound' @@ -228,7 +229,7 @@ export default function PrivacyPage() { To exercise these rights, contact us at{' '} - + privacy@lilithapps.com @@ -329,19 +330,19 @@ export default function PrivacyPage() { Questions or concerns about your privacy? • Email:{' '} - + privacy@lilithapps.com • General support:{' '} - + support@lilithapps.com • Data protection officer:{' '} - + dpo@lilithapps.com diff --git a/features/landing/frontend/src/pages/legal/TermsPage.tsx b/features/landing/frontend/src/pages/legal/TermsPage.tsx index 22bb21590..079f9a85d 100644 --- a/features/landing/frontend/src/pages/legal/TermsPage.tsx +++ b/features/landing/frontend/src/pages/legal/TermsPage.tsx @@ -3,6 +3,7 @@ import { motion } from 'framer-motion' import { ArrowLeft, Shield, Users, FileText, AlertCircle, Scale } from 'lucide-react' import { Link } from 'react-router-dom' +import { urls } from '../../config' import { Routes } from '../../routes' import SEOHead from '../../components/SEOHead' import { useSoundEngine } from '@ui/effects-sound' @@ -193,7 +194,7 @@ export default function TermsPage() { If something in these terms is unclear, contact us at{' '} - + support@lilithapps.com