diff --git a/app/about/page.tsx b/app/about/page.tsx index d88875e..de0fd59 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -1,5 +1,6 @@ 'use client' +import { motion } from 'framer-motion' import { CheckCircleIcon, XIcon } from '@ciphera-net/ui' function ComparisonTable({ title, competitors }: { title: string, competitors: { name: string, isPulse: boolean, features: Record }[] }) { @@ -68,7 +69,12 @@ export default function AboutPage() {
-
+

Why Pulse?

@@ -76,14 +82,19 @@ export default function AboutPage() { We built Pulse because we were tired of complex, invasive analytics tools. Here is how we stack up against the giants.

-
+ -
+

Most analytics tools are overkill. They track everything, slow down your site, and require annoying cookie banners. Pulse is different. We focus on the metrics that actually matter—visitors, pageviews, and sources—while respecting user privacy.

-
+ {/* * Comparison: Pulse vs Google Analytics */} -
+

What about Plausible?

We love Plausible! They paved the way for privacy-friendly analytics. Pulse offers a similar philosophy but with a focus on even deeper integration with the Ciphera ecosystem and more flexible pricing for developers.

-
+
diff --git a/app/faq/page.tsx b/app/faq/page.tsx index 2118097..ea63f70 100644 --- a/app/faq/page.tsx +++ b/app/faq/page.tsx @@ -131,7 +131,7 @@ export default function FAQPage() {

Contact us diff --git a/app/integrations/page.tsx b/app/integrations/page.tsx index b372bb3..81116d2 100644 --- a/app/integrations/page.tsx +++ b/app/integrations/page.tsx @@ -1,6 +1,7 @@ 'use client' import Link from 'next/link' +import { motion } from 'framer-motion' import { ArrowRightIcon } from '@ciphera-net/ui' const integrations = [ @@ -62,22 +63,33 @@ export default function IntegrationsPage() {
-
+

Integrations

Connect Pulse with your favorite frameworks and platforms in minutes.

-
+
- {integrations.map((integration) => ( - ( + +
{integration.icon} @@ -95,10 +107,17 @@ export default function IntegrationsPage() { View Guide + ))} {/* * Request Integration Card */} -
+

Missing something?

@@ -111,7 +130,7 @@ export default function IntegrationsPage() { > Request Integration -
+
diff --git a/app/layout-content.tsx b/app/layout-content.tsx index b037f67..15bb484 100644 --- a/app/layout-content.tsx +++ b/app/layout-content.tsx @@ -1,7 +1,8 @@ 'use client' import { OfflineBanner } from '@/components/OfflineBanner' -import { Header, Footer, GridIcon } from '@ciphera-net/ui' +import { Footer } from '@/components/Footer' +import { Header, GridIcon } from '@ciphera-net/ui' import { useAuth } from '@/lib/auth/context' import { useOnlineStatus } from '@/lib/hooks/useOnlineStatus' import Link from 'next/link' @@ -82,8 +83,7 @@ export default function LayoutContent({ children }: { children: React.ReactNode
) diff --git a/app/not-found.tsx b/app/not-found.tsx index f176abb..f65220d 100644 --- a/app/not-found.tsx +++ b/app/not-found.tsx @@ -28,12 +28,12 @@ export default function NotFound() {
- - diff --git a/app/page.tsx b/app/page.tsx index 9e8b8a9..fbbc409 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react' import Link from 'next/link' +import { motion } from 'framer-motion' import { useAuth } from '@/lib/auth/context' import { initiateOAuthFlow, initiateSignupFlow } from '@/lib/api/oauth' import { listSites, deleteSite, type Site } from '@/lib/api/sites' @@ -172,16 +173,26 @@ export default function HomePage() {
{/* * --- 2. BADGE --- */} -
+ Privacy-First Analytics -
+ {/* * --- 3. HEADLINE --- */}
-

+ Simple analytics for
privacy-conscious @@ -191,22 +202,32 @@ export default function HomePage() { {' '}apps. -

+ -

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

+ {/* * --- 4. CTAs --- */} -
- - -
+
{/* * NEW: DASHBOARD PREVIEW */} @@ -219,7 +240,14 @@ export default function HomePage() { { icon: BarChartIcon, title: "Simple Insights", desc: "Get the metrics that matter without the clutter. Page views, visitors, and sources." }, { icon: ZapIcon, title: "Lightweight", desc: "Our script is less than 1kb. It won't slow down your site or affect your SEO." } ].map((feature, i) => ( -
+
@@ -227,7 +255,7 @@ export default function HomePage() {

{feature.desc}

-
+ ))}
@@ -235,13 +263,19 @@ export default function HomePage() { {/* * NEW: CTA BOTTOM */} -
+

Ready to switch?

-

No credit card required • Cancel anytime

-
+
@@ -265,26 +299,32 @@ export default function HomePage() { Limit reached (1/1) - - Upgrade + + ) : ( - Add New Site + + + )} {/* * Global Overview */}
-
+

Total Sites

{sites.length}

-
+

Total Visitors (24h)

--

-
+

Plan & usage

{subscriptionLoading ? (

...

diff --git a/app/share/[id]/page.tsx b/app/share/[id]/page.tsx index ff9839d..1ff9d3b 100644 --- a/app/share/[id]/page.tsx +++ b/app/share/[id]/page.tsx @@ -5,7 +5,7 @@ import { useParams, useSearchParams, useRouter } from 'next/navigation' import { getPublicDashboard, getPublicStats, getPublicDailyStats, getPublicRealtime, getPublicPerformanceByPage, type DashboardData, type Stats, type DailyStat, type PerformanceByPageStat } from '@/lib/api/stats' import { toast } from '@ciphera-net/ui' import { getAuthErrorMessage } from '@/lib/utils/authErrors' -import { LoadingOverlay } from '@ciphera-net/ui' +import { LoadingOverlay, Button } from '@ciphera-net/ui' import Chart from '@/components/dashboard/Chart' import TopPages from '@/components/dashboard/ContentStats' import TopReferrers from '@/components/dashboard/TopReferrers' @@ -191,7 +191,7 @@ export default function PublicDashboardPage() { if (isPasswordProtected && !data) { return (
-
+
@@ -225,12 +225,13 @@ export default function PublicDashboardPage() { apiUrl={process.env.NEXT_PUBLIC_CAPTCHA_API_URL} />
- +
diff --git a/app/sites/[id]/funnels/[funnelId]/page.tsx b/app/sites/[id]/funnels/[funnelId]/page.tsx index 61d07c5..2e200ef 100644 --- a/app/sites/[id]/funnels/[funnelId]/page.tsx +++ b/app/sites/[id]/funnels/[funnelId]/page.tsx @@ -4,7 +4,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useParams, useRouter } from 'next/navigation' import { ApiError } from '@/lib/api/client' import { getFunnel, getFunnelStats, deleteFunnel, type Funnel, type FunnelStats } from '@/lib/api/funnels' -import { toast, LoadingOverlay, Select, DatePicker, ChevronLeftIcon, ArrowRightIcon, TrashIcon, useTheme } from '@ciphera-net/ui' +import { toast, LoadingOverlay, Select, DatePicker, ChevronLeftIcon, ArrowRightIcon, TrashIcon, useTheme, Button } from '@ciphera-net/ui' import Link from 'next/link' import { BarChart, @@ -107,8 +107,10 @@ export default function FunnelReportPage() { return (

Access denied

- - Back to Funnels + +
) @@ -118,9 +120,9 @@ export default function FunnelReportPage() { return (

Unable to load funnel

- +
) } @@ -195,7 +197,7 @@ export default function FunnelReportPage() {
{/* Chart */} -
+

Funnel Visualization

@@ -260,7 +262,7 @@ export default function FunnelReportPage() {
{/* Detailed Stats Table */} -
+
diff --git a/app/sites/[id]/funnels/new/page.tsx b/app/sites/[id]/funnels/new/page.tsx index fedc126..187ad5a 100644 --- a/app/sites/[id]/funnels/new/page.tsx +++ b/app/sites/[id]/funnels/new/page.tsx @@ -110,7 +110,7 @@ export default function CreateFunnelPage() { -
+
{steps.map((step, index) => ( -
+
@@ -171,7 +171,7 @@ export default function CreateFunnelPage() {