From 3710f081a6f52dfabc15fad17f93c7ff86529bb4 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Mar 2026 19:39:01 +0100 Subject: [PATCH] feat: dark-only cleanup for marketing pages and authenticated landing view --- app/about/page.tsx | 34 +++++------ app/features/page.tsx | 58 +++++++++---------- app/installation/page.tsx | 14 ++--- app/integrations/nextjs/page.tsx | 16 ++--- app/integrations/page.tsx | 54 ++++++++--------- app/integrations/react/page.tsx | 14 ++--- app/integrations/vue/page.tsx | 14 ++--- app/integrations/wordpress/page.tsx | 14 ++--- app/not-found.tsx | 8 +-- app/page.tsx | 90 ++++++++++++++--------------- app/pricing/page.tsx | 4 +- components/IntegrationGuide.tsx | 24 ++++---- components/PricingSection.tsx | 66 ++++++++++----------- 13 files changed, 205 insertions(+), 205 deletions(-) diff --git a/app/about/page.tsx b/app/about/page.tsx index 4e4c649..6ffa4bd 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -15,23 +15,23 @@ function ComparisonTable({ title, competitors }: { title: string, competitors: { return (
-

{title}

-
+

{title}

+
- + {competitors.map((comp) => ( - ))} - + {allFeatures.map((feature) => ( - - + + {competitors.map((comp) => { const val = comp.features[feature] return ( @@ -41,7 +41,7 @@ function ComparisonTable({ title, competitors }: { title: string, competitors: { ) : val === false ? ( ) : ( - {val} + {val} )} ) @@ -60,9 +60,9 @@ export default function AboutPage() {
{/* * --- ATMOSPHERE (Background) --- */}
-
+
@@ -74,10 +74,10 @@ export default function AboutPage() { transition={{ duration: 0.5 }} className="text-center mb-16" > -

+

Why Pulse?

-

+

We built Pulse because we were tired of complex, invasive analytics tools. Here is how we stack up against the giants.

@@ -87,9 +87,9 @@ export default function AboutPage() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5, delay: 0.1 }} - className="prose prose-neutral dark:prose-invert max-w-none mb-16" + className="prose prose-invert max-w-none mb-16" > -

+

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.

@@ -162,10 +162,10 @@ export default function AboutPage() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5 }} - className="mt-8 p-6 bg-neutral-100 dark:bg-neutral-800/50 rounded-xl border border-neutral-200 dark:border-neutral-800" + className="mt-8 p-6 bg-neutral-800/50 rounded-xl border border-neutral-800" > -

What about Plausible?

-

+

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/features/page.tsx b/app/features/page.tsx index 700ea6d..39fd2db 100644 --- a/app/features/page.tsx +++ b/app/features/page.tsx @@ -109,9 +109,9 @@ export default function FeaturesPage() {

{/* * --- ATMOSPHERE (Background) --- */}
-
+
@@ -128,11 +128,11 @@ export default function FeaturesPage() { Product Tour -

+

Everything you need.
Nothing you don't.

-

+

Pulse gives you meaningful analytics without the complexity, the cookies, or the privacy trade-offs.

@@ -151,10 +151,10 @@ export default function FeaturesPage() {
-

+

{feature.title}

-

+

{feature.description}

@@ -170,10 +170,10 @@ export default function FeaturesPage() { className="mb-28" >
-

+

Powerful analytics, simplified

-

+

Everything from real-time dashboards to conversion funnels — without the bloat.

@@ -192,10 +192,10 @@ export default function FeaturesPage() { {cap.icon}
-

+

{cap.title}

-

+

{cap.description}

@@ -210,14 +210,14 @@ export default function FeaturesPage() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5 }} - className="mb-28 p-10 md:p-14 bg-white/50 dark:bg-neutral-900/50 backdrop-blur-sm border border-neutral-200 dark:border-neutral-800 rounded-2xl" + className="mb-28 p-10 md:p-14 bg-neutral-900/50 backdrop-blur-sm border border-neutral-800 rounded-2xl" >
-

+

Content that performs

-

+

See which pages drive the most traffic, where visitors enter your site, and where they leave. Use data to double down on what works.

Feature + {comp.name}
{feature}
{feature}
- + - + {[ { feature: "Cookie Banner Required", pulse: false, ga: true }, { feature: "GDPR Compliant", pulse: true, ga: "Complex" }, { feature: "Script Size", pulse: "< 1 KB", ga: "45 KB+" }, { feature: "Data Ownership", pulse: "Yours", ga: "Google's" }, ].map((row) => ( - - + +
Feature Pulse Google Analytics
{row.feature}
{row.feature} {row.pulse === true ? ( @@ -237,10 +237,10 @@ export default function HomePage() { {/* * --- 1. ATMOSPHERE (Background) --- */}
{/* * Bottom-right Neutral Glow */} -
+
{/* * Grid Pattern with Radial Mask */}
@@ -266,7 +266,7 @@ export default function HomePage() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5, delay: 0.1 }} - className="text-5xl md:text-7xl font-bold tracking-tight text-neutral-900 dark:text-white mb-6" + className="text-5xl md:text-7xl font-bold tracking-tight text-white mb-6" > Simple analytics for
@@ -283,7 +283,7 @@ export default function HomePage() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5, delay: 0.2 }} - className="text-xl text-neutral-600 dark:text-neutral-400 max-w-2xl mx-auto mb-10 leading-relaxed" + className="text-xl text-neutral-400 max-w-2xl mx-auto mb-10 leading-relaxed" > Respect your users' privacy while getting the insights you need. No cookies, no IP tracking, fully GDPR compliant. @@ -326,8 +326,8 @@ export default function HomePage() {
-

{feature.title}

-

+

{feature.title}

+

{feature.desc}

@@ -345,7 +345,7 @@ export default function HomePage() { transition={{ duration: 0.5 }} className="text-center mb-20" > -

Ready to switch?

+

Ready to switch?

@@ -365,8 +365,8 @@ export default function HomePage() { return (
{showFinishSetupBanner && ( -
-

+

+

Finish setting up your workspace and add your first site.

@@ -381,7 +381,7 @@ export default function HomePage() { if (typeof window !== 'undefined') localStorage.setItem('pulse_welcome_completed', 'true') setShowFinishSetupBanner(false) }} - className="text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-400 p-1 rounded" + className="text-neutral-500 hover:text-neutral-400 p-1 rounded" aria-label="Dismiss" > @@ -392,8 +392,8 @@ export default function HomePage() {
-

Your Sites

-

Manage your analytics sites and view insights.

+

Your Sites

+

Manage your analytics sites and view insights.

{(() => { const siteLimit = getSitesLimitForPlan(subscription?.plan_id) @@ -401,7 +401,7 @@ export default function HomePage() { return atLimit ? (
- + Limit reached ({sites.length}/{siteLimit}) @@ -411,7 +411,7 @@ export default function HomePage() {
{deletedSites.length > 0 && ( -

+

You have a site pending deletion. Restore it or permanently delete it to free the slot.

)} @@ -428,26 +428,26 @@ export default function HomePage() { {/* * Global Overview - min-h ensures no layout shift when Plan & usage loads */}
-
-

Total Sites

-

{sites.length}

+
+

Total Sites

+

{sites.length}

-
-

Total Visitors (24h)

-

+

+

Total Visitors (24h)

+

{sites.length === 0 || Object.keys(siteStats).length < sites.length ? '--' : Object.values(siteStats).reduce((sum, { stats }) => sum + (stats?.visitors ?? 0), 0).toLocaleString()}

-
+

Plan & usage

{subscriptionLoading ? (
-
-
-
-
+
+
+
+
) : subscription ? ( <> @@ -464,7 +464,7 @@ export default function HomePage() { })()}

{(typeof subscription.sites_count === 'number' || (subscription.pageview_limit > 0 && typeof subscription.pageview_usage === 'number') || (subscription.next_invoice_amount_due != null && subscription.next_invoice_currency && !subscription.cancel_at_period_end && (subscription.subscription_status === 'active' || subscription.subscription_status === 'trialing'))) && ( -

+

{typeof subscription.sites_count === 'number' && ( Sites: {(() => { const limit = getSitesLimitForPlan(subscription.plan_id) @@ -512,12 +512,12 @@ export default function HomePage() {

{!sitesLoading && sites.length === 0 && ( -
+
-

Add your first site

-

+

Add your first site

+

Connect a domain to start collecting privacy-friendly analytics. You can add more sites later from the dashboard.

@@ -553,31 +553,31 @@ export default function HomePage() { {deletedSites.length > 0 && (
-

Scheduled for Deletion

+

Scheduled for Deletion

{deletedSites.map((site) => { const purgeAt = site.deleted_at ? new Date(new Date(site.deleted_at).getTime() + 7 * 24 * 60 * 60 * 1000) : null const daysLeft = purgeAt ? Math.max(0, Math.ceil((purgeAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24))) : 0 return ( -
+
- {site.name} + {site.name} {site.domain} - + Deleting in {daysLeft} day{daysLeft !== 1 ? 's' : ''}
diff --git a/app/pricing/page.tsx b/app/pricing/page.tsx index f31aa18..5ff3cbe 100644 --- a/app/pricing/page.tsx +++ b/app/pricing/page.tsx @@ -19,8 +19,8 @@ export default function PricingPage() {
-
-
+
+
diff --git a/components/IntegrationGuide.tsx b/components/IntegrationGuide.tsx index c309f63..390ce92 100644 --- a/components/IntegrationGuide.tsx +++ b/components/IntegrationGuide.tsx @@ -39,9 +39,9 @@ export function IntegrationGuide({ integration, children }: IntegrationGuideProp
{/* * --- ATMOSPHERE (Background) --- */}
-
+
@@ -56,18 +56,18 @@ export function IntegrationGuide({ integration, children }: IntegrationGuideProp
-
+
{headerIcon}
-

+

{integration.name} Integration

-
+
{children} -
+

Optional: Frustration Tracking

Detect rage clicks and dead clicks by adding the frustration tracking @@ -82,8 +82,8 @@ export function IntegrationGuide({ integration, children }: IntegrationGuideProp {/* * --- Related Integrations --- */} {relatedIntegrations.length > 0 && ( -

-

+
+

Related Integrations

@@ -91,16 +91,16 @@ export function IntegrationGuide({ integration, children }: IntegrationGuideProp -
+
{related.icon}
- + {related.name} - + {related.description}
diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx index 8205816..51f5ef8 100644 --- a/components/PricingSection.tsx +++ b/components/PricingSection.tsx @@ -219,10 +219,10 @@ export default function PricingSection() { transition={{ duration: 0.5 }} className="text-center mb-12" > -

+

Transparent Pricing

-

+

Scale with your traffic. No hidden fees.

@@ -232,13 +232,13 @@ export default function PricingSection() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.5, delay: 0.1 }} - className="max-w-6xl mx-auto border border-neutral-200 dark:border-neutral-800 rounded-2xl bg-white/50 dark:bg-neutral-900/50 backdrop-blur-xl shadow-sm overflow-hidden mb-20" + className="max-w-6xl mx-auto border border-neutral-800 rounded-2xl bg-neutral-900/50 backdrop-blur-xl shadow-sm overflow-hidden mb-20" > {/* Top Toolbar */} -
+
-
+
10k Up to {currentTraffic.label} monthly pageviews @@ -254,23 +254,23 @@ export default function PricingSection() { onChange={(e) => setSliderIndex(parseInt(e.target.value))} aria-label="Monthly pageview limit" aria-valuetext={`${currentTraffic.label} pageviews per month`} - className="w-full h-2 bg-neutral-200 rounded-lg appearance-none cursor-pointer dark:bg-neutral-700 accent-brand-orange focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2" + className="w-full h-2 bg-neutral-700 rounded-lg appearance-none cursor-pointer accent-brand-orange focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2" />
- + Get 1 month free with yearly -
+
{/* Pricing Grid */} -
+
{/* Free Plan */} -
+
-

Free

-

For trying Pulse on a personal project

+

Free

+

For trying Pulse on a personal project

- €0 - /forever + €0 + /forever
@@ -320,7 +320,7 @@ export default function PricingSection() {
    {['1 site', '5k monthly pageviews', '6 months data retention', '100% Data ownership'].map((feature) => ( -
  • +
  • {feature}
  • @@ -333,7 +333,7 @@ export default function PricingSection() { const isTeam = plan.id === 'team' return ( -
    +
    {isTeam && ( <>
    @@ -344,17 +344,17 @@ export default function PricingSection() { )}
    -

    {plan.name}

    -

    {plan.description}

    +

    {plan.name}

    +

    {plan.description}

    {priceDetails ? ( isYearly ? (
    - + €{priceDetails.yearlyTotal} - /year + /year
    @@ -367,14 +367,14 @@ export default function PricingSection() {
    ) : (
    - + €{priceDetails.baseMonthly} - /mo + /mo
    ) ) : ( -
    +
    Custom
    )} @@ -391,7 +391,7 @@ export default function PricingSection() {
      {plan.features.map((feature) => ( -
    • +
    • {feature}
    • @@ -402,11 +402,11 @@ export default function PricingSection() { })} {/* Enterprise Section */} -
      +
      -

      Enterprise

      -

      For high volume sites and custom needs

      -
      +

      Enterprise

      +

      For high volume sites and custom needs

      +
      Custom
      @@ -428,7 +428,7 @@ export default function PricingSection() { 'Managed Proxy', 'Raw data export' ].map((feature) => ( -
    • +
    • {feature}