diff --git a/CHANGELOG.md b/CHANGELOG.md index 792f917..a8948c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ## [Unreleased] +## [0.7.0-alpha] - 2026-02-17 + +### Changed + +- **ciphera-ui consolidation.** Migrated shared components and utilities to @ciphera-net/ui (v0.0.57): SwissFlagIcon, CodeBlock, Spinner, format utilities (formatNumber, formatDuration, formatDate, getDateRange, formatUpdatedAgo, formatRelativeTime), and auth error utilities (getAuthErrorMessage, authMessageFromStatus, authMessageFromErrorType). Removed 6 local duplicate files (LoadingOverlay, SwissFlagIcon, CodeBlock, authErrors.ts, format.ts). +- **Form card border radius.** Login, signup, invite accept, verify, reset-password, forgot-password, and organization create cards now use rounded-2xl to match design system. +- **Hardcoded brand colors.** Uptime page chart uses CSS variable var(--color-brand-orange) instead of #FD5E0F. +- **Selection styling.** Removed redundant selection:bg-brand-orange/20 from page wrappers; relies on ciphera-ui base styles. +- **Inline spinners.** Dashboard widgets (TopReferrers, Locations, TechSpecs, Campaigns, ContentStats), notifications page, and OrganizationSettings now use Spinner from ciphera-ui. + +### Removed + +- **Dead components.** LoadingOverlay.tsx (unused; all usage already from ciphera-ui). + ## [0.6.0-alpha] - 2026-02-13 ### Added @@ -67,7 +81,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.6.0-alpha...HEAD +[Unreleased]: https://github.com/ciphera-net/pulse/compare/v0.7.0-alpha...HEAD +[0.7.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.6.0-alpha...v0.7.0-alpha [0.6.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.5.1-alpha...v0.6.0-alpha [0.5.1-alpha]: https://github.com/ciphera-net/pulse/compare/v0.5.0-alpha...v0.5.1-alpha [0.5.0-alpha]: https://github.com/ciphera-net/pulse/compare/v0.4.0-alpha...v0.5.0-alpha diff --git a/app/about/page.tsx b/app/about/page.tsx index 72e081d..f37e4af 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -57,7 +57,7 @@ function ComparisonTable({ title, competitors }: { title: string, competitors: { export default function AboutPage() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/auth/callback/page.tsx b/app/auth/callback/page.tsx index c3fe5ac..30396c4 100644 --- a/app/auth/callback/page.tsx +++ b/app/auth/callback/page.tsx @@ -5,7 +5,7 @@ import { useRouter, useSearchParams } from 'next/navigation' import { useAuth } from '@/lib/auth/context' import { AUTH_URL, default as apiRequest } from '@/lib/api/client' import { exchangeAuthCode, setSessionAction } from '@/app/actions/auth' -import { authMessageFromErrorType, type AuthErrorType } from '@/lib/utils/authErrors' +import { authMessageFromErrorType, type AuthErrorType } from '@ciphera-net/ui' import { LoadingOverlay } from '@ciphera-net/ui' function AuthCallbackContent() { diff --git a/app/features/page.tsx b/app/features/page.tsx index bb96649..cca6fc3 100644 --- a/app/features/page.tsx +++ b/app/features/page.tsx @@ -106,7 +106,7 @@ const trustSignals = [ export default function FeaturesPage() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/installation/page.tsx b/app/installation/page.tsx index e054635..27ff4d4 100644 --- a/app/installation/page.tsx +++ b/app/installation/page.tsx @@ -4,7 +4,7 @@ import React from 'react' export default function InstallationPage() { return ( -
+
{/* * --- 1. ATMOSPHERE (Background) --- */}
diff --git a/app/integrations/nextjs/page.tsx b/app/integrations/nextjs/page.tsx index 12ec2c4..992f006 100644 --- a/app/integrations/nextjs/page.tsx +++ b/app/integrations/nextjs/page.tsx @@ -5,7 +5,7 @@ import { ArrowLeftIcon } from '@ciphera-net/ui' export default function NextJsIntegrationPage() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/integrations/page.tsx b/app/integrations/page.tsx index cb7b8ed..461cc52 100644 --- a/app/integrations/page.tsx +++ b/app/integrations/page.tsx @@ -90,7 +90,7 @@ export default function IntegrationsPage() { }, []) return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/integrations/react/page.tsx b/app/integrations/react/page.tsx index 18a848a..89b1717 100644 --- a/app/integrations/react/page.tsx +++ b/app/integrations/react/page.tsx @@ -5,7 +5,7 @@ import { ArrowLeftIcon } from '@ciphera-net/ui' export default function ReactIntegrationPage() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/integrations/vue/page.tsx b/app/integrations/vue/page.tsx index 40adb04..4be3bec 100644 --- a/app/integrations/vue/page.tsx +++ b/app/integrations/vue/page.tsx @@ -5,7 +5,7 @@ import { ArrowLeftIcon } from '@ciphera-net/ui' export default function VueIntegrationPage() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/integrations/wordpress/page.tsx b/app/integrations/wordpress/page.tsx index a1db8ef..105de08 100644 --- a/app/integrations/wordpress/page.tsx +++ b/app/integrations/wordpress/page.tsx @@ -5,7 +5,7 @@ import { ArrowLeftIcon } from '@ciphera-net/ui' export default function WordPressIntegrationPage() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
diff --git a/app/not-found.tsx b/app/not-found.tsx index bb4a731..dc993ee 100644 --- a/app/not-found.tsx +++ b/app/not-found.tsx @@ -3,7 +3,7 @@ import { Button } from '@ciphera-net/ui' export default function NotFound() { return ( -
+
{/* * --- ATMOSPHERE (Background) --- */}
{/* * Center Orange Glow */} diff --git a/app/notifications/page.tsx b/app/notifications/page.tsx index b46a912..be979d5 100644 --- a/app/notifications/page.tsx +++ b/app/notifications/page.tsx @@ -13,9 +13,9 @@ import { markAllNotificationsRead, type Notification, } from '@/lib/api/notifications' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { formatTimeAgo, getTypeIcon } from '@/lib/utils/notifications' -import { Button, ArrowLeftIcon } from '@ciphera-net/ui' +import { Button, ArrowLeftIcon, Spinner } from '@ciphera-net/ui' import { toast } from '@ciphera-net/ui' const PAGE_SIZE = 50 @@ -129,7 +129,7 @@ export default function NotificationsPage() { {loading ? (
-
+
) : error ? (
diff --git a/app/onboarding/page.tsx b/app/onboarding/page.tsx index 934c8ff..72b5307 100644 --- a/app/onboarding/page.tsx +++ b/app/onboarding/page.tsx @@ -4,7 +4,7 @@ import { useState } from 'react' import { useRouter } from 'next/navigation' import { createOrganization } from '@/lib/api/organization' import { useAuth } from '@/lib/auth/context' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { LoadingOverlay } from '@ciphera-net/ui' import { Button, Input } from '@ciphera-net/ui' diff --git a/app/page.tsx b/app/page.tsx index c8b58f0..90eed1d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -12,7 +12,7 @@ import SiteList from '@/components/sites/SiteList' import { Button } from '@ciphera-net/ui' import { BarChartIcon, LockIcon, ZapIcon, CheckCircleIcon, XIcon, GlobeIcon } from '@ciphera-net/ui' import { toast } from '@ciphera-net/ui' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' function DashboardPreview() { return ( @@ -172,7 +172,7 @@ export default function HomePage() { if (!user) { return ( -
+
{/* * --- 1. ATMOSPHERE (Background) --- */}
diff --git a/app/share/[id]/page.tsx b/app/share/[id]/page.tsx index 912f158..30dcfbf 100644 --- a/app/share/[id]/page.tsx +++ b/app/share/[id]/page.tsx @@ -4,7 +4,7 @@ import { useCallback, useEffect, useState } from 'react' 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 { getAuthErrorMessage } from '@ciphera-net/ui' import { LoadingOverlay, Button } from '@ciphera-net/ui' import Chart from '@/components/dashboard/Chart' import TopPages from '@/components/dashboard/ContentStats' diff --git a/app/sites/[id]/funnels/[funnelId]/page.tsx b/app/sites/[id]/funnels/[funnelId]/page.tsx index 2e200ef..687e5c4 100644 --- a/app/sites/[id]/funnels/[funnelId]/page.tsx +++ b/app/sites/[id]/funnels/[funnelId]/page.tsx @@ -16,7 +16,7 @@ import { ResponsiveContainer, Cell } from 'recharts' -import { getDateRange } from '@/lib/utils/format' +import { getDateRange } from '@ciphera-net/ui' const CHART_COLORS_LIGHT = { border: '#E5E5E5', diff --git a/app/sites/[id]/page.tsx b/app/sites/[id]/page.tsx index 89ea7db..d541511 100644 --- a/app/sites/[id]/page.tsx +++ b/app/sites/[id]/page.tsx @@ -6,9 +6,9 @@ import { useParams, useRouter } from 'next/navigation' import { motion } from 'framer-motion' import { getSite, type Site } from '@/lib/api/sites' import { getStats, getRealtime, getDailyStats, getTopPages, getTopReferrers, getCountries, getCities, getRegions, getBrowsers, getOS, getDevices, getScreenResolutions, getEntryPages, getExitPages, getDashboard, getCampaigns, getPerformanceByPage, type Stats, type DailyStat, type PerformanceByPageStat } from '@/lib/api/stats' -import { formatNumber, formatDuration, getDateRange } from '@/lib/utils/format' +import { formatNumber, formatDuration, getDateRange } from '@ciphera-net/ui' import { toast } from '@ciphera-net/ui' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } 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' diff --git a/app/sites/[id]/realtime/page.tsx b/app/sites/[id]/realtime/page.tsx index f3be638..78cb713 100644 --- a/app/sites/[id]/realtime/page.tsx +++ b/app/sites/[id]/realtime/page.tsx @@ -5,7 +5,7 @@ import { useParams, useRouter } from 'next/navigation' import { getSite, type Site } from '@/lib/api/sites' import { getRealtimeVisitors, getSessionDetails, type Visitor, type SessionEvent } from '@/lib/api/realtime' import { toast } from '@ciphera-net/ui' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { LoadingOverlay, UserIcon } from '@ciphera-net/ui' import { motion, AnimatePresence } from 'framer-motion' diff --git a/app/sites/[id]/settings/page.tsx b/app/sites/[id]/settings/page.tsx index 32935e2..c537b68 100644 --- a/app/sites/[id]/settings/page.tsx +++ b/app/sites/[id]/settings/page.tsx @@ -5,7 +5,7 @@ import { useParams, useRouter } from 'next/navigation' import { getSite, updateSite, resetSiteData, deleteSite, type Site, type GeoDataLevel } from '@/lib/api/sites' import { listGoals, createGoal, updateGoal, deleteGoal, type Goal } from '@/lib/api/goals' import { toast } from '@ciphera-net/ui' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { LoadingOverlay } from '@ciphera-net/ui' import VerificationModal from '@/components/sites/VerificationModal' import ScriptSetupBlock from '@/components/sites/ScriptSetupBlock' diff --git a/app/sites/[id]/uptime/page.tsx b/app/sites/[id]/uptime/page.tsx index cfff216..49c093a 100644 --- a/app/sites/[id]/uptime/page.tsx +++ b/app/sites/[id]/uptime/page.tsx @@ -19,7 +19,7 @@ import { } from '@/lib/api/uptime' import { toast } from '@ciphera-net/ui' import { useTheme } from '@ciphera-net/ui' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { LoadingOverlay, Button, Modal } from '@ciphera-net/ui' import { AreaChart, @@ -313,7 +313,7 @@ function ResponseTimeChart({ checks }: { checks: UptimeCheck[] }) { }} >
{label}
-
+
{payload[0].value}ms
@@ -330,8 +330,8 @@ function ResponseTimeChart({ checks }: { checks: UptimeCheck[] }) { - - + + diff --git a/app/sites/new/page.tsx b/app/sites/new/page.tsx index 0ca6617..8180b11 100644 --- a/app/sites/new/page.tsx +++ b/app/sites/new/page.tsx @@ -7,7 +7,7 @@ import { createSite, listSites, getSite, type Site } from '@/lib/api/sites' import { getSubscription } from '@/lib/api/billing' import { trackSiteCreatedFromDashboard, trackSiteCreatedScriptCopied } from '@/lib/welcomeAnalytics' import { toast } from '@ciphera-net/ui' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { Button, Input } from '@ciphera-net/ui' import { CheckCircleIcon } from '@ciphera-net/ui' import ScriptSetupBlock from '@/components/sites/ScriptSetupBlock' diff --git a/app/welcome/page.tsx b/app/welcome/page.tsx index 7193206..bab5fbe 100644 --- a/app/welcome/page.tsx +++ b/app/welcome/page.tsx @@ -21,7 +21,7 @@ import { createSite, type Site } from '@/lib/api/sites' import { setSessionAction } from '@/app/actions/auth' import { useAuth } from '@/lib/auth/context' import apiRequest from '@/lib/api/client' -import { getAuthErrorMessage } from '@/lib/utils/authErrors' +import { getAuthErrorMessage } from '@ciphera-net/ui' import { trackWelcomeStepView, trackWelcomeWorkspaceSelected, diff --git a/components/CodeBlock.tsx b/components/CodeBlock.tsx deleted file mode 100644 index 8379a41..0000000 --- a/components/CodeBlock.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @file Reusable code block component for integration guide pages. - * - * Renders a VS-Code-style code block with a filename tab header. - */ - -interface CodeBlockProps { - /** Filename displayed in the tab header */ - filename: string - /** The code string to render inside the block */ - children: string -} - -/** - * Renders a dark-themed code snippet with a filename tab. - */ -export function CodeBlock({ filename, children }: CodeBlockProps) { - return ( -
-
- {filename} -
-
-
{children}
-
-
- ) -} diff --git a/components/Footer.tsx b/components/Footer.tsx index 5c50e76..cf7865a 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -2,8 +2,7 @@ import Link from 'next/link' import Image from 'next/image' -import { GithubIcon, TwitterIcon } from '@ciphera-net/ui' -import SwissFlagIcon from './SwissFlagIcon' +import { GithubIcon, TwitterIcon, SwissFlagIcon } from '@ciphera-net/ui' interface FooterProps { LinkComponent?: any @@ -47,7 +46,7 @@ export function Footer({ LinkComponent = Link, appName = 'Pulse', isAuthenticate if (isAuthenticated) { return (