diff --git a/app/page.tsx b/app/page.tsx index d1afba3..0515920 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -4,9 +4,13 @@ import { useAuth } from '@/lib/auth/context' import { initiateOAuthFlow, initiateSignupFlow } from '@/lib/api/oauth' import LoadingOverlay from '@/components/LoadingOverlay' import SiteList from '@/components/sites/SiteList' +import { Button } from '@ciphera-net/ui' +import { BarChartIcon, LockClosedIcon, LightningBoltIcon } from '@radix-ui/react-icons' +import { useRouter } from 'next/navigation' export default function HomePage() { const { user, loading } = useAuth() + const router = useRouter() if (loading) { return @@ -14,27 +18,72 @@ export default function HomePage() { if (!user) { return ( -
-
-

- Welcome to Ciphera Analytics +
+ {/* Hero Section */} +
+
+ + + + + Privacy-First Analytics +
+ +

+ Simple analytics for
+ privacy-conscious apps.

-

- Privacy-first web analytics. No cookies, no tracking. GDPR compliant. + +

+ Respect your users' privacy while getting the insights you need. + No cookies, no IP tracking, fully GDPR compliant.

-
- - + Create Account + +
+ + {/* Features Grid */} +
+
+
+ +
+

Privacy First

+

+ We don't track personal data. No IP addresses, no fingerprints, no cookies. +

+
+
+
+ +
+

Simple Insights

+

+ Get the metrics that matter without the clutter. Page views, visitors, and sources. +

+
+
+
+ +
+

Lightweight

+

+ Our script is less than 1kb. It won't slow down your site or affect your SEO. +

+
@@ -43,13 +92,18 @@ export default function HomePage() { return (
-
-

- Your Sites -

-

- Manage your analytics sites and view insights -

+
+
+

+ Your Sites +

+

+ Manage your analytics sites and view insights +

+
+
diff --git a/components/LoadingOverlay.tsx b/components/LoadingOverlay.tsx index 26a1781..9649ef9 100644 --- a/components/LoadingOverlay.tsx +++ b/components/LoadingOverlay.tsx @@ -1,28 +1,42 @@ 'use client' -import Image from 'next/image' +import React, { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' interface LoadingOverlayProps { - logoSrc: string - title: string + logoSrc?: string + title?: string } -export default function LoadingOverlay({ logoSrc, title }: LoadingOverlayProps) { - return ( -
-
-
- {title} { + setMounted(true) + return () => setMounted(false) + }, []) + + if (!mounted) return null + + return createPortal( +
+
+
+ {title} + + {title} +
-
-

Loading...

+
-
+
, + document.body ) } diff --git a/components/sites/SiteList.tsx b/components/sites/SiteList.tsx index 591e9ca..3408c9d 100644 --- a/components/sites/SiteList.tsx +++ b/components/sites/SiteList.tsx @@ -5,6 +5,8 @@ import { useRouter } from 'next/navigation' import { listSites, deleteSite, type Site } from '@/lib/api/sites' import { toast } from 'sonner' import LoadingOverlay from '../LoadingOverlay' +import { Button } from '@ciphera-net/ui' +import { BarChartIcon, TrashIcon, PlusIcon } from '@radix-ui/react-icons' export default function SiteList() { const [sites, setSites] = useState([]) @@ -50,12 +52,12 @@ export default function SiteList() { return (

No sites yet. Create your first site to get started.

- +
) } @@ -74,27 +76,29 @@ export default function SiteList() { {site.domain}

- - + +
))}