refactor: update references from Ciphera Analytics to Ciphera Pulse across the application for consistent branding and messaging
This commit is contained in:
@@ -2,12 +2,12 @@ export default function AboutPage() {
|
||||
return (
|
||||
<div className="container mx-auto px-4 py-8 max-w-4xl">
|
||||
<h1 className="text-3xl font-bold mb-6 text-neutral-900 dark:text-white">
|
||||
About Ciphera Analytics
|
||||
About Ciphera Pulse
|
||||
</h1>
|
||||
|
||||
<div className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<p className="text-lg text-neutral-600 dark:text-neutral-400 mb-4">
|
||||
Ciphera Analytics is a privacy-first web analytics platform that provides simple,
|
||||
Ciphera Pulse is a privacy-first web analytics platform that provides simple,
|
||||
intuitive insights without compromising your visitors' privacy.
|
||||
</p>
|
||||
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
export default function FAQPage() {
|
||||
const faqs = [
|
||||
{
|
||||
question: "Is Ciphera Analytics GDPR compliant?",
|
||||
answer: "Yes, Ciphera Analytics is GDPR compliant by design. We don't use cookies, don't collect personal data, and process all data anonymously."
|
||||
question: "Is Ciphera Pulse GDPR compliant?",
|
||||
answer: "Yes, Ciphera Pulse is GDPR compliant by design. We don't use cookies, don't collect personal data, and process all data anonymously."
|
||||
},
|
||||
{
|
||||
question: "Do I need a cookie consent banner?",
|
||||
answer: "No, you don't need a cookie consent banner. Ciphera Analytics doesn't use cookies, so it's exempt from cookie consent requirements under GDPR."
|
||||
answer: "No, you don't need a cookie consent banner. Ciphera Pulse doesn't use cookies, so it's exempt from cookie consent requirements under GDPR."
|
||||
},
|
||||
{
|
||||
question: "How does Ciphera Analytics track visitors?",
|
||||
question: "How does Ciphera Pulse track visitors?",
|
||||
answer: "We use a lightweight JavaScript snippet that sends anonymous pageview events. No cookies, no cross-session identifiers (we use sessionStorage only to group events within a single visit), and no cross-site tracking."
|
||||
},
|
||||
{
|
||||
question: "What data does Ciphera Analytics collect?",
|
||||
question: "What data does Ciphera Pulse collect?",
|
||||
answer: "We collect anonymous pageview data including page path, referrer, device type, browser, and country (derived from IP at request time; the IP itself is not stored). No personal information is collected. If you enable optional session replay, see 'What about session replay?' below."
|
||||
},
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@ export default function LayoutContent({ children }: { children: React.ReactNode
|
||||
appName={
|
||||
<span className="flex items-center">
|
||||
<span className="font-bold">Ciphera</span>
|
||||
<span className="font-light">Analytics</span>
|
||||
<span className="font-light">Pulse</span>
|
||||
</span> as any
|
||||
}
|
||||
/>
|
||||
@@ -25,7 +25,7 @@ export default function LayoutContent({ children }: { children: React.ReactNode
|
||||
</main>
|
||||
<Footer
|
||||
LinkComponent={Link}
|
||||
appName="Ciphera Analytics"
|
||||
appName="Ciphera Pulse"
|
||||
/>
|
||||
</>
|
||||
)
|
||||
|
||||
@@ -13,7 +13,7 @@ const plusJakartaSans = Plus_Jakarta_Sans({
|
||||
})
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'Ciphera Analytics - Privacy-First Web Analytics',
|
||||
title: 'Ciphera Pulse - Privacy-First Web Analytics',
|
||||
description: 'Simple, privacy-focused web analytics. No cookies, no tracking. GDPR compliant.',
|
||||
keywords: ['analytics', 'privacy', 'web analytics', 'ciphera', 'GDPR'],
|
||||
authors: [{ name: 'Ciphera' }],
|
||||
|
||||
@@ -12,7 +12,7 @@ export default function HomePage() {
|
||||
const { user, loading } = useAuth()
|
||||
|
||||
if (loading) {
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Analytics" />
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
@@ -25,7 +25,7 @@ export default function HomePage() {
|
||||
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-brand-orange opacity-75"></span>
|
||||
<span className="relative inline-flex rounded-full h-2 w-2 bg-brand-orange"></span>
|
||||
</span>
|
||||
Privacy-First Analytics
|
||||
Privacy-First Pulse
|
||||
</div>
|
||||
|
||||
<h1 className="text-5xl md:text-7xl font-bold tracking-tight text-neutral-900 dark:text-white">
|
||||
|
||||
@@ -10,7 +10,7 @@ export default function SecurityPage() {
|
||||
Data Protection
|
||||
</h2>
|
||||
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
|
||||
Ciphera Analytics is built with security and privacy as core principles:
|
||||
Ciphera Pulse is built with security and privacy as core principles:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
|
||||
<li>All data is encrypted in transit using TLS/SSL</li>
|
||||
@@ -24,7 +24,7 @@ export default function SecurityPage() {
|
||||
Compliance
|
||||
</h2>
|
||||
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
|
||||
Ciphera Analytics is compliant with:
|
||||
Ciphera Pulse is compliant with:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
|
||||
<li>GDPR (General Data Protection Regulation)</li>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import ProfileSettings from '@/components/settings/ProfileSettings'
|
||||
|
||||
export const metadata = {
|
||||
title: 'Settings - Ciphera Analytics',
|
||||
title: 'Settings - Ciphera Pulse',
|
||||
description: 'Manage your account settings',
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ export default function PublicDashboardPage() {
|
||||
}
|
||||
|
||||
if (loading && !data && !isPasswordProtected) {
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Analytics" />
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
||||
}
|
||||
|
||||
if (isPasswordProtected && !data) {
|
||||
@@ -140,7 +140,7 @@ export default function PublicDashboardPage() {
|
||||
|
||||
if (!data) return null
|
||||
|
||||
const { site, stats, daily_stats, top_pages, entry_pages, exit_pages, top_referrers, countries, cities, regions, browsers, os, devices, screen_resolutions, performance, realtime_visitors } = data
|
||||
const { site, stats, daily_stats, top_pages, entry_pages, exit_pages, top_referrers, countries, cities, regions, browsers, os, devices, screen_resolutions, performance, performance_by_page, realtime_visitors } = data
|
||||
|
||||
// Provide defaults for potentially undefined data
|
||||
const safeDailyStats = daily_stats || []
|
||||
@@ -274,7 +274,7 @@ export default function PublicDashboardPage() {
|
||||
{/* Performance Stats - Only show if enabled */}
|
||||
{performance && data.site?.enable_performance_insights && (
|
||||
<div className="mb-8">
|
||||
<PerformanceStats stats={performance} />
|
||||
<PerformanceStats stats={performance} performanceByPage={performance_by_page} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { useEffect, useState } from 'react'
|
||||
import { useParams, useRouter } from 'next/navigation'
|
||||
import { getSite, type Site } from '@/lib/api/sites'
|
||||
import { getStats, getRealtime, getDailyStats, getTopPages, getTopReferrers, getCountries, getCities, getRegions, getBrowsers, getOS, getDevices, getScreenResolutions, getEntryPages, getExitPages, getDashboard, type Stats, type DailyStat } from '@/lib/api/stats'
|
||||
import { getStats, getRealtime, getDailyStats, getTopPages, getTopReferrers, getCountries, getCities, getRegions, getBrowsers, getOS, getDevices, getScreenResolutions, getEntryPages, getExitPages, getDashboard, getPerformanceByPage, type Stats, type DailyStat, type PerformanceByPageStat } from '@/lib/api/stats'
|
||||
import { formatNumber, formatDuration, getDateRange } from '@/lib/utils/format'
|
||||
import { toast } from 'sonner'
|
||||
import LoadingOverlay from '@/components/LoadingOverlay'
|
||||
@@ -40,6 +40,7 @@ export default function SiteDashboardPage() {
|
||||
const [devices, setDevices] = useState<any[]>([])
|
||||
const [screenResolutions, setScreenResolutions] = useState<any[]>([])
|
||||
const [performance, setPerformance] = useState<{ lcp: number, cls: number, inp: number }>({ lcp: 0, cls: 0, inp: 0 })
|
||||
const [performanceByPage, setPerformanceByPage] = useState<PerformanceByPageStat[] | null>(null)
|
||||
const [dateRange, setDateRange] = useState(getDateRange(30))
|
||||
const [isDatePickerOpen, setIsDatePickerOpen] = useState(false)
|
||||
const [todayInterval, setTodayInterval] = useState<'minute' | 'hour'>('hour')
|
||||
@@ -113,6 +114,7 @@ export default function SiteDashboardPage() {
|
||||
setDevices(Array.isArray(data.devices) ? data.devices : [])
|
||||
setScreenResolutions(Array.isArray(data.screen_resolutions) ? data.screen_resolutions : [])
|
||||
setPerformance(data.performance || { lcp: 0, cls: 0, inp: 0 })
|
||||
setPerformanceByPage(data.performance_by_page ?? null)
|
||||
} catch (error: any) {
|
||||
toast.error('Failed to load data: ' + (error.message || 'Unknown error'))
|
||||
} finally {
|
||||
@@ -130,7 +132,7 @@ export default function SiteDashboardPage() {
|
||||
}
|
||||
|
||||
if (loading) {
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Analytics" />
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
||||
}
|
||||
|
||||
if (!site) {
|
||||
@@ -231,7 +233,14 @@ export default function SiteDashboardPage() {
|
||||
{/* Performance Stats - Only show if enabled */}
|
||||
{site.enable_performance_insights && (
|
||||
<div className="mb-8">
|
||||
<PerformanceStats stats={performance} />
|
||||
<PerformanceStats
|
||||
stats={performance}
|
||||
performanceByPage={performanceByPage}
|
||||
siteId={siteId}
|
||||
startDate={dateRange.start}
|
||||
endDate={dateRange.end}
|
||||
getPerformanceByPage={getPerformanceByPage}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ export default function RealtimePage() {
|
||||
}
|
||||
}
|
||||
|
||||
if (loading) return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Realtime Analytics" />
|
||||
if (loading) return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Realtime" />
|
||||
if (!site) return <div className="p-8">Site not found</div>
|
||||
|
||||
return (
|
||||
|
||||
@@ -230,7 +230,7 @@ export default function SiteSettingsPage() {
|
||||
}
|
||||
|
||||
if (loading) {
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Analytics" />
|
||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
||||
}
|
||||
|
||||
if (!site) {
|
||||
@@ -785,7 +785,7 @@ export default function SiteSettingsPage() {
|
||||
For your privacy policy
|
||||
</h3>
|
||||
<p className="text-sm text-neutral-500 dark:text-neutral-400">
|
||||
Copy the text below into your site's Privacy Policy to describe your use of Ciphera Analytics.
|
||||
Copy the text below into your site's Privacy Policy to describe your use of Ciphera Pulse.
|
||||
It updates automatically based on your saved settings above.
|
||||
</p>
|
||||
<p className="text-xs text-amber-600 dark:text-amber-500">
|
||||
|
||||
Reference in New Issue
Block a user