diff --git a/app/about/page.tsx b/app/about/page.tsx index de0fd59..72e081d 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -165,7 +165,7 @@ export default function AboutPage() { 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" > -

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 diff --git a/app/faq/page.tsx b/app/faq/page.tsx index ea63f70..f7f574b 100644 --- a/app/faq/page.tsx +++ b/app/faq/page.tsx @@ -58,7 +58,7 @@ function FAQItem({ faq, index }: { faq: typeof faqs[0]; index: number }) { > @@ -355,11 +355,11 @@ export default function HomePage() { )}

{subscription.has_payment_method ? ( - + Manage billing ) : ( - + Upgrade )} diff --git a/app/share/[id]/page.tsx b/app/share/[id]/page.tsx index 1ff9d3b..56359e8 100644 --- a/app/share/[id]/page.tsx +++ b/app/share/[id]/page.tsx @@ -270,7 +270,7 @@ export default function PublicDashboardPage() {
Public Dashboard
-

+

{site.name}
-

+

{funnel.name}

{funnel.description && ( diff --git a/app/sites/[id]/page.tsx b/app/sites/[id]/page.tsx index 0cc200c..65361be 100644 --- a/app/sites/[id]/page.tsx +++ b/app/sites/[id]/page.tsx @@ -236,7 +236,7 @@ export default function SiteDashboardPage() {
-

+

{site.name}

diff --git a/app/sites/[id]/realtime/page.tsx b/app/sites/[id]/realtime/page.tsx index 40e9351..f3be638 100644 --- a/app/sites/[id]/realtime/page.tsx +++ b/app/sites/[id]/realtime/page.tsx @@ -98,7 +98,7 @@ export default function RealtimePage() {

-
@@ -108,18 +108,18 @@ export default function RealtimePage() { - + {visitors.length} active now

-
+
{/* Visitors List */} -
+
-

Active Sessions

+

Active Sessions

{visitors.length === 0 ? ( @@ -145,7 +145,7 @@ export default function RealtimePage() { exit={{ opacity: 0, x: -10 }} transition={{ duration: 0.2 }} onClick={() => handleSelectVisitor(visitor)} - className={`w-full text-left p-4 hover:bg-neutral-50 dark:hover:bg-neutral-800/50 transition-colors ${ + className={`w-full text-left p-4 hover:bg-neutral-50 dark:hover:bg-neutral-800/50 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-inset ${ selectedVisitor?.session_id === visitor.session_id ? 'bg-neutral-50 dark:bg-neutral-800/50 ring-1 ring-inset ring-neutral-200 dark:ring-neutral-700' : '' }`} > @@ -181,7 +181,7 @@ export default function RealtimePage() { {/* Session Details */}
-

+

{selectedVisitor ? 'Session Journey' : 'Select a visitor'}

{selectedVisitor && ( diff --git a/app/sites/[id]/settings/page.tsx b/app/sites/[id]/settings/page.tsx index f1fe4d7..8ea491f 100644 --- a/app/sites/[id]/settings/page.tsx +++ b/app/sites/[id]/settings/page.tsx @@ -306,7 +306,7 @@ export default function SiteSettingsPage() {
-

Site Settings

+

Site Settings

Manage settings for {site.domain}

@@ -314,10 +314,12 @@ export default function SiteSettingsPage() {
{/* Sidebar Navigation */} -
@@ -530,7 +538,7 @@ export default function SiteSettingsPage() {
-

Visibility Settings

+

Visibility Settings

Manage who can view your dashboard.

@@ -555,7 +563,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, is_public: e.target.checked })} className="sr-only peer" /> -
+
@@ -581,7 +589,7 @@ export default function SiteSettingsPage() { @@ -607,7 +615,7 @@ export default function SiteSettingsPage() { }} className="sr-only peer" /> -
+
@@ -664,7 +672,7 @@ export default function SiteSettingsPage() {
-

Data & Privacy

+

Data & Privacy

Control what visitor data is collected. Less data = more privacy.

@@ -688,7 +696,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, collect_page_paths: e.target.checked })} className="sr-only peer" /> -
+
@@ -709,7 +717,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, collect_referrers: e.target.checked })} className="sr-only peer" /> -
+
@@ -730,7 +738,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, collect_device_info: e.target.checked })} className="sr-only peer" /> -
+
@@ -775,7 +783,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, collect_screen_resolution: e.target.checked })} className="sr-only peer" /> -
+
@@ -799,7 +807,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, filter_bots: e.target.checked })} className="sr-only peer" /> -
+
@@ -823,7 +831,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, enable_performance_insights: e.target.checked })} className="sr-only peer" /> -
+
@@ -921,7 +929,7 @@ export default function SiteSettingsPage() { {activeTab === 'goals' && (
-

Goals & Events

+

Goals & Events

Define goals to label custom events (e.g. signup, purchase). Track with pulse.track('event_name') in your snippet.

diff --git a/app/sites/new/page.tsx b/app/sites/new/page.tsx index 8cb7715..0350d07 100644 --- a/app/sites/new/page.tsx +++ b/app/sites/new/page.tsx @@ -55,7 +55,7 @@ export default function NewSitePage() { return (
-

+

Create New Site

diff --git a/app/tools/page.tsx b/app/tools/page.tsx index 5904741..e33bf6d 100644 --- a/app/tools/page.tsx +++ b/app/tools/page.tsx @@ -7,7 +7,7 @@ export default function ToolsPage() {

Tools

-

UTM Campaign Builder

+

UTM Campaign Builder

diff --git a/components/Footer.tsx b/components/Footer.tsx index 3fc5060..9c28614 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -51,13 +51,13 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate © 2024-{year} Ciphera. All rights reserved.
- + Why {appName} - + Pricing - + FAQ
@@ -102,7 +102,7 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate href="https://github.com/ciphera-net" target="_blank" rel="noopener noreferrer" - className="w-9 h-9 rounded-lg bg-neutral-100 dark:bg-neutral-800 flex items-center justify-center text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors" + className="w-9 h-9 rounded-lg bg-neutral-100 dark:bg-neutral-800 flex items-center justify-center text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange" aria-label="GitHub" > @@ -111,7 +111,7 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate href="https://x.com/cipheranet" target="_blank" rel="noopener noreferrer" - className="w-9 h-9 rounded-lg bg-neutral-100 dark:bg-neutral-800 flex items-center justify-center text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors" + className="w-9 h-9 rounded-lg bg-neutral-100 dark:bg-neutral-800 flex items-center justify-center text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange" aria-label="X (Twitter)" > @@ -130,14 +130,14 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate href={link.href} target="_blank" rel="noopener noreferrer" - className="text-sm text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors" + className="text-sm text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded" > {link.name} ) : ( {link.name} @@ -158,14 +158,14 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate href={link.href} target="_blank" rel="noopener noreferrer" - className="text-sm text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors" + className="text-sm text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded" > {link.name} ) : ( {link.name} @@ -186,14 +186,14 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate href={link.href} target="_blank" rel="noopener noreferrer" - className="text-sm text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors" + className="text-sm text-neutral-600 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded" > {link.name} ) : ( {link.name} diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx index f1001f1..04d8b1f 100644 --- a/components/PricingSection.tsx +++ b/components/PricingSection.tsx @@ -219,7 +219,7 @@ export default function PricingSection() { transition={{ duration: 0.5 }} className="text-center mb-12" > -

+

Transparent Pricing

diff --git a/components/dashboard/ContentStats.tsx b/components/dashboard/ContentStats.tsx index c19277d..7f6852b 100644 --- a/components/dashboard/ContentStats.tsx +++ b/components/dashboard/ContentStats.tsx @@ -96,18 +96,20 @@ export default function ContentStats({ topPages, entryPages, exitPages, domain, {showViewAll && ( )}

-
+
{(['top_pages', 'entry_pages', 'exit_pages'] as Tab[]).map((tab) => ( )}
-
+
{(['map', 'countries', 'regions', 'cities'] as Tab[]).map((tab) => ( )}
-
+
{(['browsers', 'os', 'devices', 'screens'] as Tab[]).map((tab) => ( diff --git a/components/settings/OrganizationSettings.tsx b/components/settings/OrganizationSettings.tsx index 3a6eea7..03b8ac4 100644 --- a/components/settings/OrganizationSettings.tsx +++ b/components/settings/OrganizationSettings.tsx @@ -353,7 +353,7 @@ export default function OrganizationSettings() { return (
-

Organization Settings

+

Organization Settings

Manage your organization workspace and members.

@@ -361,10 +361,12 @@ export default function OrganizationSettings() {
{/* Sidebar Navigation */} -