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 }) {
>
setIsOpen(!isOpen)}
- className="w-full py-6 flex items-center justify-between text-left hover:text-brand-orange transition-colors"
+ className="w-full py-6 flex items-center justify-between text-left hover:text-brand-orange transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2"
>
{faq.question}
@@ -104,7 +104,7 @@ export default function FAQPage() {
className="text-center mb-16"
>
FAQ
-
+
Frequently asked questions
diff --git a/app/integrations/nextjs/page.tsx b/app/integrations/nextjs/page.tsx
index 12ec2c4..270e73a 100644
--- a/app/integrations/nextjs/page.tsx
+++ b/app/integrations/nextjs/page.tsx
@@ -31,7 +31,7 @@ export default function NextJsIntegrationPage() {
-
+
Next.js Integration
diff --git a/app/integrations/page.tsx b/app/integrations/page.tsx
index 81116d2..dabb37e 100644
--- a/app/integrations/page.tsx
+++ b/app/integrations/page.tsx
@@ -88,7 +88,7 @@ export default function IntegrationsPage() {
>
@@ -118,7 +118,7 @@ export default function IntegrationsPage() {
transition={{ duration: 0.5, delay: integrations.length * 0.1 }}
className="p-8 border border-dashed border-neutral-300 dark:border-neutral-700 rounded-2xl flex flex-col items-center justify-center text-center"
>
-
+
Missing something?
@@ -126,7 +126,7 @@ export default function IntegrationsPage() {
Request Integration
diff --git a/app/integrations/react/page.tsx b/app/integrations/react/page.tsx
index 18a848a..d8d07cb 100644
--- a/app/integrations/react/page.tsx
+++ b/app/integrations/react/page.tsx
@@ -32,7 +32,7 @@ export default function ReactIntegrationPage() {
-
+
React Integration
diff --git a/app/integrations/vue/page.tsx b/app/integrations/vue/page.tsx
index 40adb04..f5bd66e 100644
--- a/app/integrations/vue/page.tsx
+++ b/app/integrations/vue/page.tsx
@@ -32,7 +32,7 @@ export default function VueIntegrationPage() {
-
+
Vue.js Integration
diff --git a/app/integrations/wordpress/page.tsx b/app/integrations/wordpress/page.tsx
index a1db8ef..873a2cf 100644
--- a/app/integrations/wordpress/page.tsx
+++ b/app/integrations/wordpress/page.tsx
@@ -31,7 +31,7 @@ export default function WordPressIntegrationPage() {
-
+
WordPress Integration
diff --git a/app/not-found.tsx b/app/not-found.tsx
index f65220d..bb4a731 100644
--- a/app/not-found.tsx
+++ b/app/not-found.tsx
@@ -19,7 +19,7 @@ export default function NotFound() {
404
-
+
Page not found
diff --git a/app/onboarding/page.tsx b/app/onboarding/page.tsx
index 1be720f..934c8ff 100644
--- a/app/onboarding/page.tsx
+++ b/app/onboarding/page.tsx
@@ -44,13 +44,13 @@ export default function OnboardingPage() {
if (loading) return
return (
-
+
-
+
Welcome to Pulse
-
+
To get started, please create an organization for your team.
@@ -80,7 +80,7 @@ export default function OnboardingPage() {
value={slug}
onChange={(e) => setSlug(e.target.value)}
/>
-
+
This will be used in your organization's URL.
diff --git a/app/page.tsx b/app/page.tsx
index fbbc409..a620a5e 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -48,7 +48,7 @@ function ComparisonSection() {
return (
-
Why choose Pulse?
+
Why choose Pulse?
The lightweight, privacy-friendly alternative.
@@ -270,7 +270,7 @@ export default function HomePage() {
transition={{ duration: 0.5 }}
className="text-center mb-20"
>
-
Ready to switch?
+
Ready to switch?
initiateOAuthFlow()} variant="primary" className="px-8 py-4 text-lg shadow-lg shadow-brand-orange/20">
Start your free trial
@@ -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
-
+
-
+
{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() {
- router.push(`/sites/${siteId}`)} className="text-sm text-neutral-500 hover:text-neutral-900 dark:hover:text-white transition-colors">
+ router.push(`/sites/${siteId}`)} className="text-sm text-neutral-500 hover:text-neutral-900 dark:hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded">
← Back to Dashboard
@@ -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 */}
-
+
setActiveTab('general')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'general'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'general'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -328,7 +330,9 @@ export default function SiteSettingsPage() {
setActiveTab('visibility')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'visibility'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'visibility'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -339,7 +343,9 @@ export default function SiteSettingsPage() {
setActiveTab('data')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'data'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'data'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -350,7 +356,9 @@ export default function SiteSettingsPage() {
setActiveTab('goals')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'goals'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'goals'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -381,7 +389,7 @@ export default function SiteSettingsPage() {
-
Tracking Script
+
Tracking Script
Add this script to your website to start tracking visitors.
@@ -455,7 +463,7 @@ export default function SiteSettingsPage() {
setShowVerificationModal(true)}
- className="flex items-center gap-2 px-4 py-2 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-xl hover:bg-neutral-50 dark:hover:bg-neutral-700 transition-all text-sm font-medium"
+ className="flex items-center gap-2 px-4 py-2 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-xl hover:bg-neutral-50 dark:hover:bg-neutral-700 transition-all text-sm font-medium focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2"
>
Verify Installation
@@ -490,9 +498,9 @@ export default function SiteSettingsPage() {
{canEdit && (
-
Danger Zone
+
Danger Zone
Irreversible actions for your site.
-
+
@@ -502,7 +510,7 @@ export default function SiteSettingsPage() {
Reset Data
@@ -515,7 +523,7 @@ export default function SiteSettingsPage() {
Delete Site
@@ -530,7 +538,7 @@ export default function SiteSettingsPage() {
@@ -581,7 +589,7 @@ export default function SiteSettingsPage() {
{linkCopied ? 'Copied!' : 'Copy Link'}
@@ -607,7 +615,7 @@ export default function SiteSettingsPage() {
}}
className="sr-only peer"
/>
-
+
@@ -664,7 +672,7 @@ export default function SiteSettingsPage() {
@@ -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 && (
setIsModalOpen(true)}
- className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors"
+ className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded"
>
View All
)}
-
+
{(['top_pages', 'entry_pages', 'exit_pages'] as Tab[]).map((tab) => (
setActiveTab(tab)}
- className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors ${
+ role="tab"
+ aria-selected={activeTab === tab}
+ className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange ${
activeTab === tab
? 'bg-white dark:bg-neutral-700 text-neutral-900 dark:text-white shadow-sm'
: 'text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white'
diff --git a/components/dashboard/Locations.tsx b/components/dashboard/Locations.tsx
index 98519f1..56df267 100644
--- a/components/dashboard/Locations.tsx
+++ b/components/dashboard/Locations.tsx
@@ -196,18 +196,20 @@ export default function Locations({ countries, cities, regions, geoDataLevel = '
{showViewAll && (
setIsModalOpen(true)}
- className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors"
+ className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded"
>
View All
)}
-
+
{(['map', 'countries', 'regions', 'cities'] as Tab[]).map((tab) => (
setActiveTab(tab)}
- className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors capitalize ${
+ role="tab"
+ aria-selected={activeTab === tab}
+ className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors capitalize focus:outline-none focus:ring-2 focus:ring-brand-orange ${
activeTab === tab
? 'bg-white dark:bg-neutral-700 text-neutral-900 dark:text-white shadow-sm'
: 'text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white'
diff --git a/components/dashboard/TechSpecs.tsx b/components/dashboard/TechSpecs.tsx
index 493c9e0..c0f78ba 100644
--- a/components/dashboard/TechSpecs.tsx
+++ b/components/dashboard/TechSpecs.tsx
@@ -119,18 +119,20 @@ export default function TechSpecs({ browsers, os, devices, screenResolutions, co
{showViewAll && (
setIsModalOpen(true)}
- className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors"
+ className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded"
>
View All
)}
-
+
{(['browsers', 'os', 'devices', 'screens'] as Tab[]).map((tab) => (
setActiveTab(tab)}
- className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors capitalize ${
+ role="tab"
+ aria-selected={activeTab === tab}
+ className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors capitalize focus:outline-none focus:ring-2 focus:ring-brand-orange ${
activeTab === tab
? 'bg-white dark:bg-neutral-700 text-neutral-900 dark:text-white shadow-sm'
: 'text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white'
diff --git a/components/dashboard/TopReferrers.tsx b/components/dashboard/TopReferrers.tsx
index 20a3631..9d43b1c 100644
--- a/components/dashboard/TopReferrers.tsx
+++ b/components/dashboard/TopReferrers.tsx
@@ -63,7 +63,7 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI
{showViewAll && (
setIsModalOpen(true)}
- className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors"
+ className="text-xs font-medium text-neutral-500 hover:text-neutral-900 dark:text-neutral-400 dark:hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded"
>
View All
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 */}
-
+
handleTabChange('general')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'general'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'general'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -375,7 +377,9 @@ export default function OrganizationSettings() {
handleTabChange('members')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'members'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'members'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -386,7 +390,9 @@ export default function OrganizationSettings() {
handleTabChange('billing')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'billing'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'billing'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -397,7 +403,9 @@ export default function OrganizationSettings() {
handleTabChange('audit')}
- className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 ${
+ role="tab"
+ aria-selected={activeTab === 'audit'}
+ className={`w-full flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:ring-offset-2 ${
activeTab === 'audit'
? 'bg-brand-orange/10 text-brand-orange'
: 'text-neutral-600 dark:text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800'
@@ -420,9 +428,9 @@ export default function OrganizationSettings() {
{activeTab === 'general' && (
-
General Information
+
General Information
Basic details about your organization.
-
+