294 Commits

Author SHA1 Message Date
Usman Baig
9053004e25 fix(search): show skeleton until overview data loads, not just GSC status 2026-03-28 21:26:28 +01:00
Usman Baig
07401a4ce2 fix: use accessible button color tokens for WCAG AA contrast
Swap bg-brand-orange to bg-brand-orange-button on all interactive
buttons with white text. Decorative uses unchanged. Bumps
@ciphera-net/ui to 0.3.6.
2026-03-28 00:48:05 +01:00
Usman Baig
c2b448672c fix: also preserve referrer for pulse and pulse-staging domains 2026-03-27 18:24:15 +01:00
Usman Baig
80ee2fb614 fix: preserve referrer for ciphera.net learn links, keep noreferrer for external 2026-03-27 18:23:40 +01:00
Usman Baig
773e91d490 feat: remap PageSpeed audit links to ciphera.net/learn articles 2026-03-27 17:44:40 +01:00
Usman Baig
952cebc59a perf: lazy-load Chart component — prevents main thread freeze on page load 2026-03-26 11:48:58 +01:00
Usman Baig
cc3047edba refactor: replace legacy settings pages with redirect handlers + delete unused files
- /sites/:id/settings → redirect handler for GSC OAuth callback + deep links
- /org-settings → redirect handler for tab deep links
- Deleted: OrganizationSettings.tsx, SettingsModalWrapper.tsx, settings-modal-context.tsx
2026-03-26 10:50:36 +01:00
Usman Baig
61a106eed6 refactor: replace all legacy settings links with unified modal openers 2026-03-26 10:47:51 +01:00
Usman Baig
294629edfe fix: downsize all page h1 headers — top bar now has primary title 2026-03-25 17:17:12 +01:00
Usman Baig
48b404eb37 fix: remove duplicate h1 from uptime page — title now in top bar 2026-03-25 17:11:48 +01:00
Usman Baig
de10fb5daf fix: use max-w-7xl (1280px) instead of full-width — better readability 2026-03-24 23:21:57 +01:00
Usman Baig
d6627413b8 feat: full-width content — remove max-w-6xl from all site pages and skeletons 2026-03-24 23:16:36 +01:00
Usman Baig
5a03e1f9a5 fix: skeleton loading states match actual page layouts
- PageSpeed: show 4 gauge rings, screenshot, legend, metrics grid, trend chart
- Uptime: match real layout with status card, 90-day bar, 4-col detail grid
- Remove duplicate local skeletons in behavior components, use shared library
- Strip light-mode classes from dark-only app
2026-03-24 21:17:21 +01:00
Usman Baig
a3c1af7c95 fix: frontend consistency audit — 55 files cleaned up
Consistency fixes:
- Extract getThisWeekRange/getThisMonthRange to shared lib/utils/dateRanges.ts
  (removed 4 identical copy-pasted definitions)
- Add error boundaries for behavior, cdn, search, pagespeed pages
  (4 new error.tsx files — previously fell through to generic parent error)
- Add "View setup guide" CTA to empty states on journeys and behavior pages
  (previously showed text with no actionable button)
- Fix non-lazy useState initializer in funnel detail page
- Fix Bot & Spam settings header from text-xl to text-2xl (matches all other sections)
- Add useMinimumLoading to PageSpeed skeleton (consistent with all other pages)

Cleanup:
- Remove 438 redundant dark: class prefixes (app is dark-mode only)
  text-neutral-500 dark:text-neutral-400 → text-neutral-400 (206 occurrences)
  text-neutral-900 dark:text-white → text-white (232 occurrences)
- Remove dead @stripe/react-stripe-js and @stripe/stripe-js packages
  (billing migrated to Polar, no code imports Stripe)
- Remove duplicate motion package (framer-motion is the one actually used)
2026-03-23 19:50:16 +01:00
Usman Baig
645e3e78ef feat(empty-states): add undraw illustrations to empty state screens
Add brand-orange recolored SVG illustrations from undraw to five empty
states: sites list, dashboard chart, funnels, journeys, and behavior.
2026-03-23 15:23:26 +01:00
Usman Baig
cbb7445d74 feat(pagespeed): click score gauges to scroll to diagnostics category 2026-03-23 14:55:05 +01:00
Usman Baig
8c3b77e8e5 Revert "fix(pagespeed): make frequency interactive and show next check time"
This reverts commit 01c50ab971.
2026-03-23 14:46:10 +01:00
Usman Baig
01c50ab971 fix(pagespeed): make frequency interactive and show next check time
- Replace dead frequency badge with inline dropdown selector
- Add "Next in Xh" indicator from next_check_at
- Demote "Disable" button to subtle text link (was competing with Run Check)
- Add cursor-pointer to prev/next history arrows
- Narrow filmstrip fade to avoid covering content
2026-03-23 14:43:41 +01:00
Usman Baig
31471792f8 feat(pagespeed): move frequency selector to site settings
Revert inline frequency toggle from pagespeed page. Add PageSpeed
Monitoring section to site settings under the Data tab with a Select
dropdown for Daily/Weekly/Monthly. Shows "Not enabled" when PSI is off.
2026-03-23 11:58:09 +01:00
Usman Baig
a0ef570137 feat(pagespeed): inline frequency selector in hero footer
Replace static frequency badge with a pill toggle (Daily/Weekly/Monthly)
matching the Mobile/Desktop tab style. Updates config via API on click.
Read-only badge shown for non-admin users.
2026-03-23 11:51:40 +01:00
Usman Baig
8d9a3f3592 feat(pagespeed): add check history navigation with prev/next arrows
Navigate between historical checks using ◀ ▶ arrows in the hero
footer bar. Shows formatted date when viewing historical data,
"Last checked X ago" when on latest. Fetches full audit data via
getPageSpeedCheck when navigating to a historical check.
2026-03-23 11:34:05 +01:00
Usman Baig
d02d8429e2 fix(pagespeed): contain visx chart within card bounds 2026-03-23 11:26:18 +01:00
Usman Baig
98fcce4647 feat(pagespeed): switch trend chart from Recharts to visx for dashboard consistency 2026-03-23 10:54:09 +01:00
Usman Baig
bba25c722a feat(pagespeed): manual check section, consistent dot indicators
- Add "Additional items to manually check" collapsed section
- Replace triangle/square severity icons with consistent filled circles
- Empty circle (border only) for informative/unscored audits
2026-03-22 23:45:36 +01:00
Usman Baig
354331646b fix(pagespeed): order accessibility sub-groups: names/labels → contrast → best practices 2026-03-22 23:38:58 +01:00
Usman Baig
d232a8a6d1 feat(pagespeed): sort audits by severity + insights before diagnostics
Sort order within each sub-group: red → orange → empty → green.
Sub-groups sorted so insights come before diagnostics.
2026-03-22 23:25:11 +01:00
Usman Baig
9d1d2dbb80 fix(pagespeed): issue count excludes informative/unscored audits
Only audits with a real score (non-null) count toward the issue total.
Informative audits (score: null) are shown but not counted.
2026-03-22 22:11:49 +01:00
Usman Baig
98429f82f5 feat(pagespeed): render audit sub-group headers in diagnostics
Group audits within each category by sub-group (e.g., "Names and
Labels", "Contrast") with small uppercase headers, matching the
pagespeed.web.dev layout.
2026-03-22 22:03:13 +01:00
Usman Baig
a0173636d4 fix(pagespeed): show empty circle for unscored/informative audits
Null scores now show ○ (informative) instead of ▲ (poor), matching
pagespeed.web.dev's "Unscored" indicator for informative audits.
2026-03-22 21:08:50 +01:00
Usman Baig
dfcf6bebde fix(pagespeed): show all 4 category cards including those with 0 issues 2026-03-22 20:59:52 +01:00
Usman Baig
5003175305 redesign(pagespeed): equal gauges in hero + category gauges in diagnostics
- Hero: 4 equal 90px ScoreGauges in a row with screenshot on right
- Diagnostics: each category card gets a 56px gauge header with score
  and issue count, matching pagespeed.web.dev's category sections
- Legend and metadata moved to footer bar in hero card
2026-03-22 20:55:55 +01:00
Usman Baig
ab6008daf9 fix(pagespeed): parse markdown links + handle more audit item fields
- AuditDescription: converts [text](url) to clickable links
- AuditItem: handles href, text/linkText, source.url from PSI API
2026-03-22 20:52:50 +01:00
Usman Baig
8b95620ec1 polish(pagespeed): mini gauges, animated tab switcher, filmstrip title
- Replace compact dot+number scores with 64px ScoreGauge circles
- ScoreGauge scales font/stroke/spacing for small sizes
- Add "Page Load Timeline" header to filmstrip section
- Replace pill toggle with animated underline tabs (matches dashboard)
2026-03-22 20:43:11 +01:00
Usman Baig
783530940e polish(pagespeed): design consistency pass
- Filmstrip: dark mode bg fix, consistent card padding, scroll fade
- Metrics: font-semibold to match uptime page
- Hero: tighter compact scores, smaller legend, centered alignment
- Chart: hide x-axis when single day, height matches uptime (h-40)
- Diagnostics: hide categories with zero failures, muted display values
- Skeleton: matches new hero layout
2026-03-22 20:19:07 +01:00
Usman Baig
dd0700cbea fix(pagespeed): poll silently without triggering SWR re-renders
Use direct API fetch for polling instead of mutateLatest() which was
causing the page to flicker and clear data every 5 seconds. SWR cache
is only updated once when new results arrive.
2026-03-22 19:56:00 +01:00
Usman Baig
8649f37bb9 feat(pagespeed): split diagnostics by category (Performance, Accessibility, Best Practices, SEO)
Each Lighthouse category gets its own card with failing audits sorted
by impact and collapsed passed audits. Matches pagespeed.web.dev layout.
2026-03-22 19:52:49 +01:00
Usman Baig
fcbf21b715 feat(pagespeed): render page load filmstrip between hero and metrics
Horizontal scrollable filmstrip showing page rendering progression
with timing labels. Appears between the score hero and metrics card.
2026-03-22 19:43:44 +01:00
Usman Baig
50960d0556 feat(pagespeed): render element screenshots in expandable audit items
Shows node screenshots, labels, HTML snippets, and URLs in audit
detail rows — matching pagespeed.web.dev's failing elements display.
2026-03-22 19:18:03 +01:00
Usman Baig
6b00b8b04a redesign(pagespeed): full page redesign inspired by pagespeed.web.dev
- Hero card: large performance gauge + compact inline scores + screenshot
- Single metrics card with 2x3 grid and colored status dots
- Flat diagnostics list sorted by impact with severity indicators
- ScoreGauge accepts size prop for flexible gauge sizing
- Unicode severity markers (triangle/square/circle) per audit
2026-03-22 19:10:47 +01:00
Usman Baig
b0e6db36a1 feat(pagespeed): add screenshot display and expandable diagnostics
- Page screenshot thumbnail next to score gauges
- Expandable audit rows with description and detail items table
- Shows URLs, HTML snippets, wasted bytes/ms for each failing element
- AuditRow component replaces flat diagnostic rows
2026-03-22 18:54:45 +01:00
Usman Baig
2fd9bf82f1 fix(pagespeed): poll for results after async check trigger
Backend now returns 202 immediately. Frontend polls every 5s for up
to 2 minutes until new results appear, then shows success toast.
2026-03-22 18:35:17 +01:00
Usman Baig
52906344cf feat(pagespeed): add PageSpeed page with gauges, CWV cards, chart, and diagnostics
- ScoreGauge SVG component with color-coded circular arcs
- Full page: disabled state, score overview, CWV metrics, trend chart
- Diagnostics accordion with opportunities/diagnostics/passed groups
- Mobile/desktop strategy toggle, manual check trigger
- Loading skeleton, frequency selector
2026-03-22 18:13:08 +01:00
Usman Baig
6a1698b794 feat: add Notifications section to settings with Reports and Alerts
- Adds purpose field to report schedule API client
- Adds useAlertSchedules SWR hook
- Reorganizes settings: Reports tab becomes Notifications tab
- Groups existing Reports and new Alerts subsections
- Alert channels reuse report delivery infrastructure (email, Slack, Discord, webhooks)
2026-03-22 16:57:04 +01:00
Usman Baig
1d26819727 feat: simplify uptime page to single auto-managed monitor with toggle
Rewrites uptime page from 978 to ~370 lines. Removes all monitor CRUD
UI (modals, monitor list, selection state). Adds enable/disable toggle
and empty state. Reads the single auto-managed monitor.
2026-03-22 16:51:42 +01:00
Usman Baig
b7e92abb40 feat: persist script feature toggles to backend
Features (scroll, 404, outbound, downloads, frustration, storage, ttl)
are saved to site.script_features JSONB column on every toggle change.
Values are read from the site object on load.
2026-03-22 15:31:45 +01:00
Usman Baig
0805bbaeee fix: improve password protection UX with status badge and remove option
- Shows green "Password set" badge when a password is active
- Simplified placeholder to "Enter new password"
- Added helper text explaining current password persists
- Added "Remove password protection" link for easy removal
- Cleaned up dark-mode toggle styling
2026-03-22 13:40:26 +01:00
Usman Baig
3f3d81a41f fix: style bot filter checkboxes with accent-color orange 2026-03-22 13:30:29 +01:00
Usman Baig
0878bde259 fix: redesign session review as card layout instead of cramped table 2026-03-22 13:25:02 +01:00
Usman Baig
42b7363cf9 feat: add Bot & Spam settings tab with session review UI 2026-03-22 13:16:07 +01:00
Usman Baig
6444cec454 fix: use inline styles for Slack SVG fills to prevent CSS override 2026-03-22 01:06:03 +01:00