From e8e304e2381ae476ffe855b69731c9d9fa8bc910 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 22:29:26 +0100 Subject: [PATCH 01/15] style: update heading sizes across various pages for improved typography consistency --- app/changelog/page.tsx | 2 +- app/features/page.tsx | 12 ++++++------ app/integrations/nextjs/page.tsx | 2 +- app/integrations/react/page.tsx | 2 +- app/integrations/vue/page.tsx | 2 +- app/integrations/wordpress/page.tsx | 2 +- app/welcome/page.tsx | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/changelog/page.tsx b/app/changelog/page.tsx index a085324..c0b9c84 100644 --- a/app/changelog/page.tsx +++ b/app/changelog/page.tsx @@ -18,7 +18,7 @@ export default function ChangelogPage() { return (
-

+

Changelog

diff --git a/app/features/page.tsx b/app/features/page.tsx index cca6fc3..646801d 100644 --- a/app/features/page.tsx +++ b/app/features/page.tsx @@ -129,7 +129,7 @@ export default function FeaturesPage() { Product Tour -

+

Everything you need.
Nothing you don't.

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

+

Powerful analytics, simplified

@@ -215,7 +215,7 @@ export default function FeaturesPage() { >

-

+

Content that performs

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

-

+

Built for trust

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

-

+

Up and running in 3 minutes

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

+

Ready to see it in action?

diff --git a/app/integrations/nextjs/page.tsx b/app/integrations/nextjs/page.tsx index 992f006..8d5269a 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/react/page.tsx b/app/integrations/react/page.tsx index 89b1717..b7565bc 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 4be3bec..5fccc84 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 105de08..1fe2fca 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/welcome/page.tsx b/app/welcome/page.tsx index bab5fbe..083cff9 100644 --- a/app/welcome/page.tsx +++ b/app/welcome/page.tsx @@ -485,7 +485,7 @@ function WelcomeContent() {
-

+

Name your organization

@@ -556,7 +556,7 @@ function WelcomeContent() {

-

+

{showPendingCheckoutInStep3 ? 'Complete your plan' : "You're on the free plan"}

@@ -641,7 +641,7 @@ function WelcomeContent() {

-

+

Add your first site

From 23ba5f77a98efd31f4bb32f2b239b8bac6c8daf7 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 22:41:43 +0100 Subject: [PATCH 02/15] refactor: replace button elements with a unified Button component in SiteSettingsPage and VerificationModal for consistency and improved styling --- app/sites/[id]/settings/page.tsx | 54 +++++--------------------- components/sites/VerificationModal.tsx | 32 +++++---------- 2 files changed, 19 insertions(+), 67 deletions(-) diff --git a/app/sites/[id]/settings/page.tsx b/app/sites/[id]/settings/page.tsx index 778ea6b..9270b83 100644 --- a/app/sites/[id]/settings/page.tsx +++ b/app/sites/[id]/settings/page.tsx @@ -495,21 +495,9 @@ export default function SiteSettingsPage() {

{canEdit && ( - + )}
@@ -666,21 +654,9 @@ export default function SiteSettingsPage() {
{canEdit && ( - + )}
@@ -976,21 +952,9 @@ export default function SiteSettingsPage() {
{canEdit && ( - + )}
diff --git a/components/sites/VerificationModal.tsx b/components/sites/VerificationModal.tsx index 1ba4564..1b360f1 100644 --- a/components/sites/VerificationModal.tsx +++ b/components/sites/VerificationModal.tsx @@ -11,7 +11,7 @@ import { } from '@ciphera-net/ui' import { Site } from '@/lib/api/sites' import { getRealtime } from '@/lib/api/stats' -import { toast } from '@ciphera-net/ui' +import { toast, Button } from '@ciphera-net/ui' interface VerificationModalProps { isOpen: boolean @@ -130,15 +130,12 @@ export default function VerificationModal({ isOpen, onClose, site }: Verificatio - + )} @@ -172,12 +169,9 @@ export default function VerificationModal({ isOpen, onClose, site }: Verificatio We are successfully receiving data from your website.

- + )} @@ -205,18 +199,12 @@ export default function VerificationModal({ isOpen, onClose, site }: Verificatio
- - + +
)} From 72c06816fea8aacc22ddbdef6bef2d8dd43fb1e3 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 22:53:26 +0100 Subject: [PATCH 03/15] style: update layout of multiple pages to use consistent max-width and padding for improved responsiveness --- app/notifications/page.tsx | 4 ++-- app/org-settings/page.tsx | 4 ++-- app/settings/page.tsx | 2 +- app/sites/[id]/page.tsx | 2 +- app/sites/[id]/settings/page.tsx | 6 +++--- app/sites/new/page.tsx | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/notifications/page.tsx b/app/notifications/page.tsx index be979d5..33a0746 100644 --- a/app/notifications/page.tsx +++ b/app/notifications/page.tsx @@ -90,7 +90,7 @@ export default function NotificationsPage() { if (!user?.org_id) { return ( -
+

Switch to an organization to view notifications.

@@ -102,7 +102,7 @@ export default function NotificationsPage() { } return ( -
+
-
+
+
Loading...
}> diff --git a/app/settings/page.tsx b/app/settings/page.tsx index 012f348..f56e3d2 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -7,7 +7,7 @@ export const metadata = { export default function SettingsPage() { return ( -
+
) diff --git a/app/sites/[id]/page.tsx b/app/sites/[id]/page.tsx index d541511..eb5665d 100644 --- a/app/sites/[id]/page.tsx +++ b/app/sites/[id]/page.tsx @@ -221,7 +221,7 @@ export default function SiteDashboardPage() { if (!site) { return ( -
+

Site not found

) diff --git a/app/sites/[id]/settings/page.tsx b/app/sites/[id]/settings/page.tsx index 9270b83..723e8a2 100644 --- a/app/sites/[id]/settings/page.tsx +++ b/app/sites/[id]/settings/page.tsx @@ -323,15 +323,15 @@ export default function SiteSettingsPage() { if (!site) { return ( -
+

Site not found

) } return ( -
-
+
+

Site Settings

diff --git a/app/sites/new/page.tsx b/app/sites/new/page.tsx index 9d73e53..062d978 100644 --- a/app/sites/new/page.tsx +++ b/app/sites/new/page.tsx @@ -106,7 +106,7 @@ export default function NewSitePage() { // * Step 2: Framework picker + script (same as /welcome after adding first site) if (createdSite) { return ( -

+
@@ -172,7 +172,7 @@ export default function NewSitePage() { // * Step 1: Name & domain form return ( -
+

Create New Site

From f1e6d5a48eaa0daebf238b10875532e36cb71b85 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 23:09:34 +0100 Subject: [PATCH 04/15] style: refactor chart color variables across multiple components to use CSS variables for improved theming consistency --- app/sites/[id]/funnels/[funnelId]/page.tsx | 16 +++++------ app/sites/[id]/uptime/page.tsx | 22 +++++++-------- components/dashboard/Chart.tsx | 32 +++++++++++----------- components/dashboard/WorldMap.tsx | 6 ++-- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/app/sites/[id]/funnels/[funnelId]/page.tsx b/app/sites/[id]/funnels/[funnelId]/page.tsx index 687e5c4..4772751 100644 --- a/app/sites/[id]/funnels/[funnelId]/page.tsx +++ b/app/sites/[id]/funnels/[funnelId]/page.tsx @@ -19,20 +19,20 @@ import { import { getDateRange } from '@ciphera-net/ui' const CHART_COLORS_LIGHT = { - border: '#E5E5E5', - axis: '#A3A3A3', + border: 'var(--color-neutral-200)', + axis: 'var(--color-neutral-400)', tooltipBg: '#ffffff', - tooltipBorder: '#E5E5E5', + tooltipBorder: 'var(--color-neutral-200)', } const CHART_COLORS_DARK = { - border: '#404040', - axis: '#737373', - tooltipBg: '#262626', - tooltipBorder: '#404040', + border: 'var(--color-neutral-700)', + axis: 'var(--color-neutral-500)', + tooltipBg: 'var(--color-neutral-800)', + tooltipBorder: 'var(--color-neutral-700)', } -const BRAND_ORANGE = '#FD5E0F' +const BRAND_ORANGE = 'var(--color-brand-orange)' export default function FunnelReportPage() { const params = useParams() diff --git a/app/sites/[id]/uptime/page.tsx b/app/sites/[id]/uptime/page.tsx index 49c093a..0d70560 100644 --- a/app/sites/[id]/uptime/page.tsx +++ b/app/sites/[id]/uptime/page.tsx @@ -34,20 +34,20 @@ import type { TooltipProps } from 'recharts' // * Chart theme colors (consistent with main Pulse chart) const CHART_COLORS_LIGHT = { - border: '#E5E5E5', - text: '#171717', - textMuted: '#737373', - axis: '#A3A3A3', + border: 'var(--color-neutral-200)', + text: 'var(--color-neutral-900)', + textMuted: 'var(--color-neutral-500)', + axis: 'var(--color-neutral-400)', tooltipBg: '#ffffff', - tooltipBorder: '#E5E5E5', + tooltipBorder: 'var(--color-neutral-200)', } const CHART_COLORS_DARK = { - border: '#404040', - text: '#fafafa', - textMuted: '#a3a3a3', - axis: '#737373', - tooltipBg: '#262626', - tooltipBorder: '#404040', + border: 'var(--color-neutral-700)', + text: 'var(--color-neutral-50)', + textMuted: 'var(--color-neutral-400)', + axis: 'var(--color-neutral-500)', + tooltipBg: 'var(--color-neutral-800)', + tooltipBorder: 'var(--color-neutral-700)', } // * Status color mapping diff --git a/components/dashboard/Chart.tsx b/components/dashboard/Chart.tsx index f5c08e5..0c192b9 100644 --- a/components/dashboard/Chart.tsx +++ b/components/dashboard/Chart.tsx @@ -18,27 +18,27 @@ import { ArrowUpRightIcon, ArrowDownRightIcon, BarChartIcon, Select, Button, Dow import { Checkbox } from '@ciphera-net/ui' const COLORS = { - brand: '#FD5E0F', - success: '#10B981', // Emerald-500 - danger: '#EF4444', // Red-500 + brand: 'var(--color-brand-orange)', + success: 'var(--color-success)', + danger: 'var(--color-error)', } const CHART_COLORS_LIGHT = { - border: '#E5E5E5', - text: '#171717', - textMuted: '#737373', - axis: '#A3A3A3', + border: 'var(--color-neutral-200)', + text: 'var(--color-neutral-900)', + textMuted: 'var(--color-neutral-500)', + axis: 'var(--color-neutral-400)', tooltipBg: '#ffffff', - tooltipBorder: '#E5E5E5', + tooltipBorder: 'var(--color-neutral-200)', } const CHART_COLORS_DARK = { - border: '#404040', - text: '#fafafa', - textMuted: '#a3a3a3', - axis: '#737373', - tooltipBg: '#262626', - tooltipBorder: '#404040', + border: 'var(--color-neutral-700)', + text: 'var(--color-neutral-50)', + textMuted: 'var(--color-neutral-400)', + axis: 'var(--color-neutral-500)', + tooltipBg: 'var(--color-neutral-800)', + tooltipBorder: 'var(--color-neutral-700)', } export interface DailyStat { @@ -282,7 +282,7 @@ export default function Chart({ const { toPng } = await import('html-to-image') const dataUrl = await toPng(chartContainerRef.current, { cacheBust: true, - backgroundColor: resolvedTheme === 'dark' ? '#171717' : '#ffffff', + backgroundColor: resolvedTheme === 'dark' ? 'var(--color-neutral-900)' : '#ffffff', }) const link = document.createElement('a') link.download = `chart-${dateRange.start}-${dateRange.end}.png` @@ -694,7 +694,7 @@ export default function Chart({ activeDot={{ r: 5, strokeWidth: 2, - fill: resolvedTheme === 'dark' ? '#262626' : '#ffffff', + fill: resolvedTheme === 'dark' ? 'var(--color-neutral-800)' : '#ffffff', stroke: activeMetric.color, }} isAnimationActive diff --git a/components/dashboard/WorldMap.tsx b/components/dashboard/WorldMap.tsx index 9172b10..c18d30f 100644 --- a/components/dashboard/WorldMap.tsx +++ b/components/dashboard/WorldMap.tsx @@ -35,9 +35,9 @@ const WorldMap = ({ data }: WorldMapProps) => { // Plausible-like colors based on provided SVG snippet const isDark = resolvedTheme === 'dark' - const defaultFill = isDark ? "#262626" : "#f5f5f5" // neutral-800 / neutral-100 - const defaultStroke = isDark ? "#171717" : "#ffffff" // neutral-900 / white - const brandOrange = "#FD5E0F" + const defaultFill = isDark ? "var(--color-neutral-800)" : "var(--color-neutral-100)" + const defaultStroke = isDark ? "var(--color-neutral-900)" : "#ffffff" + const brandOrange = "var(--color-brand-orange)" return (
From 65ba7ccba231c79ff349ee26a1d6a1bc7083b479 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 23:13:52 +0100 Subject: [PATCH 05/15] style: enhance dark mode support by updating text colors across multiple components for improved readability --- app/sites/[id]/funnels/[funnelId]/page.tsx | 10 +++---- app/sites/[id]/settings/page.tsx | 8 +++--- components/PricingSection.tsx | 10 +++---- components/settings/OrganizationSettings.tsx | 28 ++++++++++---------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/sites/[id]/funnels/[funnelId]/page.tsx b/app/sites/[id]/funnels/[funnelId]/page.tsx index 4772751..fa2fbae 100644 --- a/app/sites/[id]/funnels/[funnelId]/page.tsx +++ b/app/sites/[id]/funnels/[funnelId]/page.tsx @@ -267,10 +267,10 @@ export default function FunnelReportPage() { - - - - + + + + @@ -283,7 +283,7 @@ export default function FunnelReportPage() {

{step.step.name}

-

{step.step.value}

+

{step.step.value}

diff --git a/app/sites/[id]/settings/page.tsx b/app/sites/[id]/settings/page.tsx index 723e8a2..4c8e376 100644 --- a/app/sites/[id]/settings/page.tsx +++ b/app/sites/[id]/settings/page.tsx @@ -487,7 +487,7 @@ export default function SiteSettingsPage() { Verify Installation -

+

Check if your site is sending data correctly.

@@ -601,7 +601,7 @@ export default function SiteSettingsPage() { {linkCopied ? 'Copied!' : 'Copy Link'} -

+

Share this link with others to view the dashboard.

@@ -640,7 +640,7 @@ export default function SiteSettingsPage() { onChange={(e) => setFormData({ ...formData, password: e.target.value })} placeholder={site.has_password ? "Change password (leave empty to keep current)" : "Set a password"} /> -

+

Visitors will need to enter this password to view the dashboard.

@@ -941,7 +941,7 @@ export default function SiteSettingsPage() { {snippetCopied ? ( ) : ( - + diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx index 2624e72..2c7b1b3 100644 --- a/components/PricingSection.tsx +++ b/components/PricingSection.tsx @@ -238,7 +238,7 @@ export default function PricingSection() { {/* Top Toolbar */}
-
+
10k Up to {currentTraffic.label} monthly pageviews @@ -310,7 +310,7 @@ export default function PricingSection() {

{plan.name}

-

{plan.description}

+

{plan.description}

{priceDetails ? ( isYearly ? ( @@ -319,7 +319,7 @@ export default function PricingSection() { €{priceDetails.yearlyTotal} - /year + /year
@@ -335,7 +335,7 @@ export default function PricingSection() { €{priceDetails.baseMonthly} - /mo + /mo
) ) : ( @@ -370,7 +370,7 @@ export default function PricingSection() {

Enterprise

-

For high volume sites and custom needs

+

For high volume sites and custom needs

Custom
diff --git a/components/settings/OrganizationSettings.tsx b/components/settings/OrganizationSettings.tsx index 0febe51..7bb98db 100644 --- a/components/settings/OrganizationSettings.tsx +++ b/components/settings/OrganizationSettings.tsx @@ -320,7 +320,7 @@ export default function OrganizationSettings() { // If no org ID, we are in personal organization context, so don't show org settings if (!currentOrgId) { return ( -
+

You are in your personal context. Switch to an Organization to manage its settings.

) @@ -606,7 +606,7 @@ export default function OrganizationSettings() { minLength={2} maxLength={50} disabled={!isEditing} - className={`bg-white dark:bg-neutral-900 ${!isEditing ? 'text-neutral-500' : ''}`} + className={`bg-white dark:bg-neutral-900 ${!isEditing ? 'text-neutral-500 dark:text-neutral-400' : ''}`} />
@@ -615,7 +615,7 @@ export default function OrganizationSettings() { Organization Slug
- + drop.ciphera.net/
-

+

Changing the slug will change your organization's URL.

@@ -737,14 +737,14 @@ export default function OrganizationSettings() { {/* Members List */}
-

Active Members

+

Active Members

{isLoadingMembers ? (
) : members.length === 0 ? ( -
No members found.
+
No members found.
) : ( members.map((member) => (
@@ -756,7 +756,7 @@ export default function OrganizationSettings() {
{member.user_email || 'Unknown User'}
-
+
Joined {new Date(member.joined_at).toLocaleDateString()}
@@ -781,7 +781,7 @@ export default function OrganizationSettings() { {/* Pending Invitations */} {invitations.length > 0 && (
-

Pending Invitations

+

Pending Invitations

{invitations.map((invite) => (
@@ -793,7 +793,7 @@ export default function OrganizationSettings() {
{invite.email}
-
+
Invited as {invite.role} • Expires {new Date(invite.expires_at).toLocaleDateString()}
@@ -826,7 +826,7 @@ export default function OrganizationSettings() {
) : !subscription ? (
-

Could not load subscription details.

+

Could not load subscription details.

) : ( @@ -1050,7 +1050,7 @@ export default function OrganizationSettings() {
) : invoices.length === 0 ? ( -
No invoices found.
+
No invoices found.
) : ( <> {invoices.map((invoice) => ( @@ -1122,7 +1122,7 @@ export default function OrganizationSettings() {
) : (
-

Notification categories

+

Notification categories

{notificationCategories.map((cat) => (
auditPageSize && (
- + {auditPage * auditPageSize + 1}–{Math.min((auditPage + 1) * auditPageSize, auditTotal)} of {auditTotal}
From fb3490feb979b50e249ba7739c40b2b7d310c6be Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 23:25:00 +0100 Subject: [PATCH 06/15] refactor: replace anchor tag with Button component in PricingSection for improved styling and consistency --- components/PricingSection.tsx | 9 +++++---- docs/DESIGN_SYSTEM.md | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx index 2c7b1b3..d1d0b7b 100644 --- a/components/PricingSection.tsx +++ b/components/PricingSection.tsx @@ -376,12 +376,13 @@ export default function PricingSection() {
- { window.location.href = 'mailto:business@ciphera.net?subject=Enterprise%20Plan%20Inquiry' }} > Contact us - +
    {[ diff --git a/docs/DESIGN_SYSTEM.md b/docs/DESIGN_SYSTEM.md index 030103d..321547b 100644 --- a/docs/DESIGN_SYSTEM.md +++ b/docs/DESIGN_SYSTEM.md @@ -973,7 +973,6 @@ presets: [ **Dashboard:** Chart, TopPages, TopReferrers, Locations, TechSpecs, Campaigns, Goals, Performance **Settings:** OrganizationSettings, ProfileSettings **Sites:** SiteList, VerificationModal -**Tools:** UtmBuilder --- From 8f8761ed3d4e72e373abafbde303c89eedbf109f Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 23:29:50 +0100 Subject: [PATCH 07/15] style: standardize padding across multiple components for improved layout consistency --- app/features/page.tsx | 2 +- app/integrations/page.tsx | 4 ++-- app/notifications/page.tsx | 4 ++-- app/page.tsx | 4 ++-- app/share/[id]/page.tsx | 2 +- app/sites/[id]/settings/page.tsx | 18 +++++++++--------- app/sites/new/page.tsx | 2 +- app/welcome/page.tsx | 2 +- components/dashboard/PerformanceStats.tsx | 2 +- components/settings/OrganizationSettings.tsx | 12 ++++++------ 10 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/features/page.tsx b/app/features/page.tsx index 646801d..c985bb6 100644 --- a/app/features/page.tsx +++ b/app/features/page.tsx @@ -147,7 +147,7 @@ export default function FeaturesPage() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: i * 0.1 }} - className="card-glass p-8 hover:-translate-y-1 hover:shadow-xl transition-all duration-300 group" + className="card-glass p-6 hover:-translate-y-1 hover:shadow-xl transition-all duration-300 group" >
    diff --git a/app/integrations/page.tsx b/app/integrations/page.tsx index 461cc52..dd1506d 100644 --- a/app/integrations/page.tsx +++ b/app/integrations/page.tsx @@ -285,7 +285,7 @@ export default function IntegrationsPage() { >
    @@ -351,7 +351,7 @@ export default function IntegrationsPage() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5 }} - className="max-w-md mx-auto mt-12 p-8 border border-dashed border-neutral-300 dark:border-neutral-700 rounded-2xl flex flex-col items-center justify-center text-center" + className="max-w-md mx-auto mt-12 p-6 border border-dashed border-neutral-300 dark:border-neutral-700 rounded-2xl flex flex-col items-center justify-center text-center" >

    Missing something? diff --git a/app/notifications/page.tsx b/app/notifications/page.tsx index 33a0746..0635cf5 100644 --- a/app/notifications/page.tsx +++ b/app/notifications/page.tsx @@ -132,11 +132,11 @@ export default function NotificationsPage() {

    ) : error ? ( -
    +
    {error}
    ) : notifications.length === 0 ? ( -
    +

    No notifications yet

    Manage which notifications you receive in{' '} diff --git a/app/page.tsx b/app/page.tsx index 651227f..02d85b4 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -264,7 +264,7 @@ export default function HomePage() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: i * 0.1 }} - className="card-glass p-8 hover:-translate-y-1 hover:shadow-xl transition-all duration-300 group" + className="card-glass p-6 hover:-translate-y-1 hover:shadow-xl transition-all duration-300 group" >

    @@ -439,7 +439,7 @@ export default function HomePage() {
    {!sitesLoading && sites.length === 0 && ( -
    +
    diff --git a/app/share/[id]/page.tsx b/app/share/[id]/page.tsx index 30dcfbf..c408fa2 100644 --- a/app/share/[id]/page.tsx +++ b/app/share/[id]/page.tsx @@ -199,7 +199,7 @@ export default function PublicDashboardPage() { if (isPasswordProtected && !data) { return (
    -
    +
    diff --git a/app/sites/[id]/settings/page.tsx b/app/sites/[id]/settings/page.tsx index 4c8e376..fc30439 100644 --- a/app/sites/[id]/settings/page.tsx +++ b/app/sites/[id]/settings/page.tsx @@ -549,7 +549,7 @@ export default function SiteSettingsPage() {

    Manage who can view your dashboard.

    -
    +
    @@ -676,7 +676,7 @@ export default function SiteSettingsPage() {

    Data Collection

    {/* Page Paths Toggle */} -
    +

    Page Paths

    @@ -697,7 +697,7 @@ export default function SiteSettingsPage() {
    {/* Referrers Toggle */} -
    +

    Referrers

    @@ -718,7 +718,7 @@ export default function SiteSettingsPage() {
    {/* Device Info Toggle */} -
    +

    Device Info

    @@ -739,7 +739,7 @@ export default function SiteSettingsPage() {
    {/* Geographic Data Dropdown */} -
    +

    Geographic Data

    @@ -763,7 +763,7 @@ export default function SiteSettingsPage() {
    {/* Screen Resolution Toggle */} -
    +

    Screen Resolution

    @@ -787,7 +787,7 @@ export default function SiteSettingsPage() { {/* Bot and noise filtering */}

    Filtering

    -
    +

    Filter bots and referrer spam

    @@ -811,7 +811,7 @@ export default function SiteSettingsPage() { {/* Performance Insights Toggle */}

    Performance Insights

    -
    +

    Performance Insights (Add-on)

    @@ -849,7 +849,7 @@ export default function SiteSettingsPage() {
    )} -
    +

    Keep raw event data for

    diff --git a/app/sites/new/page.tsx b/app/sites/new/page.tsx index 062d978..ba5f37c 100644 --- a/app/sites/new/page.tsx +++ b/app/sites/new/page.tsx @@ -107,7 +107,7 @@ export default function NewSitePage() { if (createdSite) { return (
    -
    +
    diff --git a/app/welcome/page.tsx b/app/welcome/page.tsx index 083cff9..42194b9 100644 --- a/app/welcome/page.tsx +++ b/app/welcome/page.tsx @@ -332,7 +332,7 @@ function WelcomeContent() { } const cardClass = - 'bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-800 rounded-2xl shadow-sm p-8 max-w-lg mx-auto' + 'bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-800 rounded-2xl shadow-sm p-6 max-w-lg mx-auto' return (
    diff --git a/components/dashboard/PerformanceStats.tsx b/components/dashboard/PerformanceStats.tsx index 78ca72e..6b9b184 100644 --- a/components/dashboard/PerformanceStats.tsx +++ b/components/dashboard/PerformanceStats.tsx @@ -108,7 +108,7 @@ export default function PerformanceStats({ stats, performanceByPage, siteId, sta const summaryText = `LCP ${Math.round(stats.lcp)} ms · CLS ${Number(stats.cls.toFixed(3))} · INP ${Math.round(stats.inp)} ms` return ( -
    +
    {/* * One-line summary: Performance score + metric summary. Click to expand. */}
    @@ -834,7 +834,7 @@ export default function OrganizationSettings() { {/* Trial notice */} {subscription.subscription_status === 'trialing' && ( -
    +

    Your free trial ends on{' '} @@ -854,7 +854,7 @@ export default function OrganizationSettings() { {/* Past due notice */} {subscription.subscription_status === 'past_due' && ( -

    +

    Payment past due @@ -877,7 +877,7 @@ export default function OrganizationSettings() { {/* Cancel-at-period-end notice */} {subscription.cancel_at_period_end && ( -

    +

    Your subscription will end on{' '} From fb47cb0c8643f5d9b5f5c00f7f54c743d0776842 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 23:36:54 +0100 Subject: [PATCH 08/15] style: update padding in integration pages and IntegrationGuide component for improved layout consistency --- app/integrations/nextjs/page.tsx | 2 +- app/integrations/react/page.tsx | 2 +- app/integrations/vue/page.tsx | 2 +- app/integrations/wordpress/page.tsx | 2 +- components/IntegrationGuide.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/integrations/nextjs/page.tsx b/app/integrations/nextjs/page.tsx index 8d5269a..90100fc 100644 --- a/app/integrations/nextjs/page.tsx +++ b/app/integrations/nextjs/page.tsx @@ -16,7 +16,7 @@ export default function NextJsIntegrationPage() { />

    -
    +
    -
    +
    -
    +
    -
    +
    -
    +
    Date: Sat, 21 Feb 2026 23:39:29 +0100 Subject: [PATCH 09/15] style: standardize min-width values across multiple components for improved layout consistency --- app/integrations/page.tsx | 2 +- app/sites/[id]/uptime/page.tsx | 6 +++--- app/sites/new/page.tsx | 4 ++-- app/welcome/page.tsx | 4 ++-- components/PricingSection.tsx | 2 +- components/dashboard/Chart.tsx | 4 ++-- components/dashboard/WorldMap.tsx | 2 +- components/settings/OrganizationSettings.tsx | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/integrations/page.tsx b/app/integrations/page.tsx index dd1506d..6a4db55 100644 --- a/app/integrations/page.tsx +++ b/app/integrations/page.tsx @@ -158,7 +158,7 @@ export default function IntegrationsPage() { ) : (
    - + /
    diff --git a/app/sites/[id]/uptime/page.tsx b/app/sites/[id]/uptime/page.tsx index 0d70560..cc652e0 100644 --- a/app/sites/[id]/uptime/page.tsx +++ b/app/sites/[id]/uptime/page.tsx @@ -189,7 +189,7 @@ function StatusBarTooltip({ className="fixed z-50 pointer-events-none" style={{ left: position.x, top: position.y - 10, transform: 'translate(-50%, -100%)' }} > -
    +
    {formattedDate}
    {stat && stat.total_checks > 0 ? (
    @@ -256,7 +256,7 @@ function UptimeStatusBar({ className="relative" onMouseLeave={() => setHoveredDay(null)} > -
    +
    {dateRange.map((date) => { const stat = statsMap.get(date) const barColor = getDayBarColor(stat) @@ -264,7 +264,7 @@ function UptimeStatusBar({ return (
    handleMouseEnter(e, date, stat)} onMouseLeave={() => setHoveredDay(null)} /> diff --git a/app/sites/new/page.tsx b/app/sites/new/page.tsx index ba5f37c..cdcd4d1 100644 --- a/app/sites/new/page.tsx +++ b/app/sites/new/page.tsx @@ -152,10 +152,10 @@ export default function NewSitePage() {
    - -
    diff --git a/app/welcome/page.tsx b/app/welcome/page.tsx index 42194b9..51f3a6b 100644 --- a/app/welcome/page.tsx +++ b/app/welcome/page.tsx @@ -759,11 +759,11 @@ function WelcomeContent() { )}
    - {createdSite && ( - )} diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx index d1d0b7b..41e346f 100644 --- a/components/PricingSection.tsx +++ b/components/PricingSection.tsx @@ -259,7 +259,7 @@ export default function PricingSection() {
    - + Get 1 month free with yearly
    diff --git a/components/dashboard/Chart.tsx b/components/dashboard/Chart.tsx index 0c192b9..f53b2c8 100644 --- a/components/dashboard/Chart.tsx +++ b/components/dashboard/Chart.tsx @@ -570,7 +570,7 @@ export default function Chart({
    {!hasData ? ( -
    +

    No data for this period @@ -578,7 +578,7 @@ export default function Chart({

    Try a different date range

    ) : !hasAnyNonZero ? ( -
    +

    No {metricLabel.toLowerCase()} data for this period diff --git a/components/dashboard/WorldMap.tsx b/components/dashboard/WorldMap.tsx index c18d30f..6602d51 100644 --- a/components/dashboard/WorldMap.tsx +++ b/components/dashboard/WorldMap.tsx @@ -97,7 +97,7 @@ const WorldMap = ({ data }: WorldMapProps) => { {tooltipContent && (

    {tooltipContent.content} diff --git a/components/settings/OrganizationSettings.tsx b/components/settings/OrganizationSettings.tsx index 93d2e17..a6bccb4 100644 --- a/components/settings/OrganizationSettings.tsx +++ b/components/settings/OrganizationSettings.tsx @@ -1502,7 +1502,7 @@ export default function OrganizationSettings() { {plan.sites} {isCurrentPlan && ( - + Current )} From d08c8f00a00d3c00b2e839477702441023fe01eb Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sat, 21 Feb 2026 23:42:12 +0100 Subject: [PATCH 10/15] style: add transition effects to shadow properties across multiple components for improved visual feedback --- app/share/[id]/page.tsx | 2 +- app/sites/[id]/funnels/[funnelId]/page.tsx | 2 +- app/sites/[id]/uptime/page.tsx | 6 +++--- components/OfflineBanner.tsx | 2 +- components/dashboard/Chart.tsx | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/share/[id]/page.tsx b/app/share/[id]/page.tsx index c408fa2..5ed4452 100644 --- a/app/share/[id]/page.tsx +++ b/app/share/[id]/page.tsx @@ -199,7 +199,7 @@ export default function PublicDashboardPage() { if (isPasswordProtected && !data) { return (
    -
    +
    diff --git a/app/sites/[id]/funnels/[funnelId]/page.tsx b/app/sites/[id]/funnels/[funnelId]/page.tsx index fa2fbae..3695f52 100644 --- a/app/sites/[id]/funnels/[funnelId]/page.tsx +++ b/app/sites/[id]/funnels/[funnelId]/page.tsx @@ -225,7 +225,7 @@ export default function FunnelReportPage() { const data = payload[0].payload; return (
    -
    +
    {formattedDate}
    {stat && stat.total_checks > 0 ? (
    @@ -305,7 +305,7 @@ function ResponseTimeChart({ checks }: { checks: UptimeCheck[] }) { if (!active || !payload?.length) return null return (
    {showProtocolDropdown && ( -
    +
    {hasPrev && ( -
    +
    vs {formatValue(prev as number)} {prevPeriodLabel ? `(${prevPeriodLabel})` : 'prev'} {delta !== null && ( @@ -540,7 +540,7 @@ export default function Chart({
    {prevData?.length ? ( -
    +
    Export chart diff --git a/components/dashboard/GoalStats.tsx b/components/dashboard/GoalStats.tsx index 6c0571f..f3f6b06 100644 --- a/components/dashboard/GoalStats.tsx +++ b/components/dashboard/GoalStats.tsx @@ -52,7 +52,7 @@ export default function GoalStats({ goalCounts }: GoalStatsProps) {

    Read documentation diff --git a/components/notifications/NotificationCenter.tsx b/components/notifications/NotificationCenter.tsx index dad2ca4..19f9a4c 100644 --- a/components/notifications/NotificationCenter.tsx +++ b/components/notifications/NotificationCenter.tsx @@ -235,7 +235,7 @@ export default function NotificationCenter() { setOpen(false)} - className="flex items-center gap-1.5 text-sm text-neutral-500 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors" + className="flex items-center gap-2 text-sm text-neutral-500 dark:text-neutral-400 hover:text-brand-orange dark:hover:text-brand-orange transition-colors" > Manage settings diff --git a/components/settings/OrganizationSettings.tsx b/components/settings/OrganizationSettings.tsx index 2579b83..8e17bea 100644 --- a/components/settings/OrganizationSettings.tsx +++ b/components/settings/OrganizationSettings.tsx @@ -1024,7 +1024,7 @@ export default function OrganizationSettings() { type="button" onClick={handleManageSubscription} disabled={isRedirectingToPortal} - className="inline-flex items-center gap-1.5 text-sm text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white transition-colors disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded" + className="inline-flex items-center gap-2 text-sm text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white transition-colors disabled:opacity-50 focus:outline-none focus:ring-2 focus:ring-brand-orange focus:rounded" > Payment method & invoices @@ -1034,7 +1034,7 @@ export default function OrganizationSettings() { @@ -1077,14 +1077,14 @@ export default function OrganizationSettings() { {invoice.invoice_pdf && ( + className="inline-flex items-center gap-2 px-2.5 py-1.5 text-xs font-medium text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white hover:bg-neutral-100 dark:hover:bg-neutral-800 rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-brand-orange" title="Download PDF"> Download PDF )} {invoice.hosted_invoice_url && ( Date: Sat, 21 Feb 2026 23:58:39 +0100 Subject: [PATCH 14/15] chore: update package versions and dependencies for improved functionality --- components/settings/OrganizationSettings.tsx | 2 +- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/settings/OrganizationSettings.tsx b/components/settings/OrganizationSettings.tsx index 8e17bea..327c857 100644 --- a/components/settings/OrganizationSettings.tsx +++ b/components/settings/OrganizationSettings.tsx @@ -497,7 +497,7 @@ export default function OrganizationSettings() { // handleTabChange is defined above return ( -
    +

    Organization Settings

    diff --git a/package-lock.json b/package-lock.json index 9c1256e..eb8f7d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,14 @@ { "name": "pulse-frontend", - "version": "0.7.0-alpha", + "version": "0.9.0-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pulse-frontend", - "version": "0.7.0-alpha", + "version": "0.9.0-alpha", "dependencies": { - "@ciphera-net/ui": "^0.0.57", + "@ciphera-net/ui": "^0.0.58", "@ducanh2912/next-pwa": "^10.2.9", "@radix-ui/react-icons": "^1.3.0", "@stripe/react-stripe-js": "^5.6.0", @@ -1541,9 +1541,9 @@ } }, "node_modules/@ciphera-net/ui": { - "version": "0.0.57", - "resolved": "https://npm.pkg.github.com/download/@ciphera-net/ui/0.0.57/1839d6ea6184b8aefa921ceeaa1d1d50d532e6a8", - "integrity": "sha512-sgdBajwBgmZnqnZ/kJ1PYpb4XR2j/yPXw1xHyMpNaLa/wLYXqylJ1ffQ3aRE7BB37IkGgDO+fzeQVjYnJvHSBA==", + "version": "0.0.58", + "resolved": "https://npm.pkg.github.com/download/@ciphera-net/ui/0.0.58/ac48a989da2db79880ce2fa7f89b63a62e2b68c9", + "integrity": "sha512-cvptYjs+E72EQvM5YGx5pp4SOiyJ7t5qv5NSRfoFxtcTCwR4sKUN4SoZUA+HV3tLlq4qXXHAB98E7qgbBRIn+Q==", "dependencies": { "@radix-ui/react-icons": "^1.3.0", "clsx": "^2.1.0", diff --git a/package.json b/package.json index 8ed7d8a..e9f00aa 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "@ciphera-net/ui": "^0.0.57", + "@ciphera-net/ui": "^0.0.58", "@ducanh2912/next-pwa": "^10.2.9", "@radix-ui/react-icons": "^1.3.0", "@stripe/react-stripe-js": "^5.6.0", From 1a970279b52cf56ed659c7d9fda917b1794460cf Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sun, 22 Feb 2026 00:06:26 +0100 Subject: [PATCH 15/15] chore: release version 0.10.0-alpha with design consistency improvements across various components --- CHANGELOG.md | 18 +++++++++++++++++- package.json | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 310086d..3b66357 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ## [Unreleased] +## [0.10.0-alpha] - 2026-02-21 + +### Changed + +- **Design consistency (PULSE-59).** Pulse now feels more cohesive across all pages — headings, buttons, and layout are consistent. +- **Headings.** Marketing and integration pages use the same heading sizes for a clearer visual hierarchy. +- **Buttons.** Settings pages and the verification modal use consistent button styles. The Enterprise "Contact us" button on pricing now matches the rest. +- **Settings layout.** Profile settings, Organization Settings, and Site Settings now span the full width of the page, matching the dashboard. +- **Charts and maps.** Analytics charts, funnel views, and the uptime map now use Pulse's brand colors correctly in both light and dark mode. +- **Integration guides.** Code examples in the integration and installation guides look cleaner and work better in dark mode. +- **Dark mode.** Text and backgrounds across settings, pricing, and funnels are easier to read when you switch themes. +- **Cards and panels.** All cards use consistent padding for a more even layout. +- **Integration pages.** Integration setup guides have more comfortable spacing at the top. +- **Org slug.** The organization URL prefix correctly shows `pulse.ciphera.net/` instead of the wrong domain. + ## [0.9.0-alpha] - 2026-02-21 ### Added @@ -112,7 +127,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), --- -[Unreleased]: https://github.com/ciphera-net/pulse/compare/v0.9.0-alpha...HEAD +[Unreleased]: https://github.com/ciphera-net/pulse/compare/v0.10.0-alpha...HEAD +[0.10.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.9.0-alpha...v0.10.0-alpha [0.9.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.8.0-alpha...v0.9.0-alpha [0.8.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.7.0-alpha...v0.8.0-alpha [0.7.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.6.0-alpha...v0.7.0-alpha diff --git a/package.json b/package.json index e9f00aa..10fb548 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulse-frontend", - "version": "0.9.0-alpha", + "version": "0.10.0-alpha", "private": true, "scripts": { "dev": "next dev",

StepVisitorsDrop-offConversionStepVisitorsDrop-offConversion