From 9361d0a7440cb0c925434a056345d3673a11722e Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Thu, 5 Feb 2026 16:05:56 +0100 Subject: [PATCH 01/16] Phase 1: Standardize button styling across Pulse frontend --- app/page.tsx | 18 ++++++++++++------ components/PricingSection.tsx | 7 ++----- components/sites/SiteList.tsx | 10 ++++++---- styles/globals.css | 2 ++ 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 9e8b8a9..5ff6ab6 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -200,10 +200,10 @@ export default function HomePage() { {/* * --- 4. CTAs --- */}
- -
@@ -237,7 +237,7 @@ export default function HomePage() { {/* * NEW: CTA BOTTOM */}

Ready to switch?

-

No credit card required • Cancel anytime

@@ -265,12 +265,18 @@ export default function HomePage() { Limit reached (1/1) - - Upgrade + +
) : ( - Add New Site + + + )} diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx index 5eba5a9..b773a6c 100644 --- a/components/PricingSection.tsx +++ b/components/PricingSection.tsx @@ -331,11 +331,8 @@ export default function PricingSection() { diff --git a/components/sites/SiteList.tsx b/components/sites/SiteList.tsx index b548a26..986832d 100644 --- a/components/sites/SiteList.tsx +++ b/components/sites/SiteList.tsx @@ -2,7 +2,7 @@ import Link from 'next/link' import { Site } from '@/lib/api/sites' -import { BarChartIcon, SettingsIcon, BookOpenIcon, ExternalLinkIcon } from '@ciphera-net/ui' +import { BarChartIcon, SettingsIcon, BookOpenIcon, ExternalLinkIcon, Button } from '@ciphera-net/ui' import { useAuth } from '@/lib/auth/context' interface SiteListProps { @@ -94,10 +94,12 @@ export default function SiteList({ sites, loading, onDelete }: SiteListProps) {
- - View Dashboard + {(user?.role === 'owner' || user?.role === 'admin') && ( - diff --git a/app/share/[id]/page.tsx b/app/share/[id]/page.tsx index ff9839d..d9a330d 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' @@ -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..2eae2e1 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

- +
) } diff --git a/app/sites/[id]/funnels/new/page.tsx b/app/sites/[id]/funnels/new/page.tsx index fedc126..a6438a2 100644 --- a/app/sites/[id]/funnels/new/page.tsx +++ b/app/sites/[id]/funnels/new/page.tsx @@ -215,16 +215,15 @@ export default function CreateFunnelPage() {
- - Cancel + + diff --git a/app/sites/[id]/funnels/page.tsx b/app/sites/[id]/funnels/page.tsx index b799d94..1ea02b0 100644 --- a/app/sites/[id]/funnels/page.tsx +++ b/app/sites/[id]/funnels/page.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useState } from 'react' import { useParams, useRouter } from 'next/navigation' import { listFunnels, deleteFunnel, type Funnel } from '@/lib/api/funnels' -import { toast, LoadingOverlay, PlusIcon, ArrowRightIcon, ChevronLeftIcon, TrashIcon } from '@ciphera-net/ui' +import { toast, LoadingOverlay, PlusIcon, ArrowRightIcon, ChevronLeftIcon, TrashIcon, Button } from '@ciphera-net/ui' import Link from 'next/link' export default function FunnelsPage() { @@ -66,12 +66,11 @@ export default function FunnelsPage() {

- - - Create Funnel + +
@@ -87,12 +86,11 @@ export default function FunnelsPage() {

Create a funnel to track how users move through your site and where they drop off.

- - - Create Funnel + + ) : ( diff --git a/app/sites/[id]/page.tsx b/app/sites/[id]/page.tsx index 154a206..176b669 100644 --- a/app/sites/[id]/page.tsx +++ b/app/sites/[id]/page.tsx @@ -8,7 +8,7 @@ import { getStats, getRealtime, getDailyStats, getTopPages, getTopReferrers, get import { formatNumber, formatDuration, getDateRange } from '@/lib/utils/format' 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 { Select, DatePicker, DownloadIcon } from '@ciphera-net/ui' import ExportModal from '@/components/dashboard/ExportModal' import ContentStats from '@/components/dashboard/ContentStats' @@ -297,19 +297,21 @@ export default function SiteDashboardPage() { { value: 'custom', label: 'Custom' }, ]} /> - + {canEdit && ( - + )} From e9476219b170035b43ffab453c55b2f7203790ff Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Thu, 5 Feb 2026 16:41:31 +0100 Subject: [PATCH 04/16] Phase 2: Enhance footer with conditional comprehensive layout --- app/layout-content.tsx | 6 +- components/Footer.tsx | 225 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 213 insertions(+), 18 deletions(-) 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