diff --git a/aos-shots/v22-mobile-calendar.png b/aos-shots/v22-mobile-calendar.png new file mode 100644 index 0000000..6edeaaa Binary files /dev/null and b/aos-shots/v22-mobile-calendar.png differ diff --git a/aos-shots/v22-mobile-dashboard.png b/aos-shots/v22-mobile-dashboard.png new file mode 100644 index 0000000..96f5890 Binary files /dev/null and b/aos-shots/v22-mobile-dashboard.png differ diff --git a/aos-shots/v22-mobile-leads.png b/aos-shots/v22-mobile-leads.png new file mode 100644 index 0000000..3667895 Binary files /dev/null and b/aos-shots/v22-mobile-leads.png differ diff --git a/aos-shots/v22-mobile-menu.png b/aos-shots/v22-mobile-menu.png new file mode 100644 index 0000000..68ed358 Binary files /dev/null and b/aos-shots/v22-mobile-menu.png differ diff --git a/aos-shots/v22-mobile-projects.png b/aos-shots/v22-mobile-projects.png new file mode 100644 index 0000000..81e06ee Binary files /dev/null and b/aos-shots/v22-mobile-projects.png differ diff --git a/aos-shots/v22-mobile-search.png b/aos-shots/v22-mobile-search.png new file mode 100644 index 0000000..536ba88 Binary files /dev/null and b/aos-shots/v22-mobile-search.png differ diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..b6018e9 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,44 @@ +{ + "name": "AOS — Agency Operating System", + "short_name": "AOS", + "description": "Selbstgehostete Plattform für Software-Agenturen: CRM, Leads, Projekte, Lizenzen, Finanzen — mit EU/DE-Compliance.", + "start_url": "/", + "display": "standalone", + "background_color": "#0a0a0a", + "theme_color": "#0a0a0a", + "orientation": "any", + "categories": ["business", "productivity", "finance"], + "lang": "de", + "dir": "ltr", + "icons": [ + { + "src": "/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ], + "shortcuts": [ + { + "name": "Leads prüfen", + "url": "/?view=leads", + "description": "Leads Finder Review-Queue" + }, + { + "name": "Zeit erfassen", + "url": "/?view=projects", + "description": "Projekt-Zeiterfassung" + }, + { + "name": "Freigaben", + "url": "/?view=dashboard", + "description": "Offene Meilenstein-Freigaben" + } + ] +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2a7ee74..d9dbf41 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -29,8 +29,15 @@ export const metadata: Metadata = { "GoBD", ], authors: [{ name: "Nordlicht Digital GmbH" }], + manifest: "/manifest.json", + appleWebApp: { + capable: true, + title: "AOS", + statusBarStyle: "black", + }, icons: { icon: "https://z-cdn.chatglm.cn/z-ai/static/logo.svg", + apple: "https://z-cdn.chatglm.cn/z-ai/static/logo.svg", }, openGraph: { title: "AOS — Agency Operating System", diff --git a/src/components/aos/app-shell.tsx b/src/components/aos/app-shell.tsx index 5cb7e2e..53585c8 100644 --- a/src/components/aos/app-shell.tsx +++ b/src/components/aos/app-shell.tsx @@ -28,6 +28,7 @@ import { GlobalSettingsView } from './views/global-settings' import { SetupWizardView } from './views/setup-wizard' import { PortalShell } from './portal-shell' import { OnboardingOverlay } from './onboarding-overlay' +import { MobileBottomNav } from './mobile-bottom-nav' export function AppShell() { const { view, sidebarOpen, setSidebarOpen, portalMode } = useAos() @@ -55,7 +56,7 @@ export function AppShell() { {/* Main */}
-
+
{view === 'dashboard' && } {view === 'calendar' && } {view === 'reporting' && } @@ -82,6 +83,7 @@ export function AppShell() { +
) } diff --git a/src/components/aos/mobile-bottom-nav.tsx b/src/components/aos/mobile-bottom-nav.tsx new file mode 100644 index 0000000..07c24d2 --- /dev/null +++ b/src/components/aos/mobile-bottom-nav.tsx @@ -0,0 +1,63 @@ +'use client' + +import { useAos, type ViewId } from '@/store/aos' +import { LayoutDashboard, Radar, FolderKanban, Bell, Menu } from 'lucide-react' +import { cn } from '@/lib/utils' +import { useFetch } from '@/hooks/use-fetch' + +// Mobile bottom navigation bar (PRD §9: "Mobile: usable PWA for time tracking, +// approvals and quick CRM lookups"). Shows on mobile only (md:hidden). +// Provides 5 quick-access destinations optimized for touch. +export function MobileBottomNav() { + const { view, setView, setSidebarOpen, setCommandOpen } = useAos() + const { data } = useFetch<{ stats: { total: number; urgent: number } }>('/api/aos/notifications') + + const urgent = data?.stats.urgent ?? 0 + const total = data?.stats.total ?? 0 + + const items: { id: ViewId | 'search' | 'menu'; label: string; icon: typeof LayoutDashboard; badge?: number }[] = [ + { id: 'dashboard', label: 'Home', icon: LayoutDashboard }, + { id: 'leads', label: 'Leads', icon: Radar }, + { id: 'search', label: 'Suche', icon: Menu }, + { id: 'projects', label: 'Zeit', icon: FolderKanban }, + { id: 'notifications', label: 'Alerts', icon: Bell, badge: urgent > 0 ? urgent : total > 0 ? total : undefined }, + ] + + const handleClick = (id: typeof items[number]['id']) => { + if (id === 'search') setCommandOpen(true) + else if (id === 'notifications') setView('calendar') + else if (id === 'menu') setSidebarOpen(true) + else setView(id as ViewId) + } + + return ( + + ) +}