Commit Graph

1077 Commits

Author SHA1 Message Date
Usman Baig
2474d6558f feat: Linear-style sidebar with explicit toggle
Rewrite sidebar from scratch: 256px expanded, 56px collapsed via
click toggle + [ keyboard shortcut. Two-phase CSS transitions (labels
fade then width contracts). Contextual ContentHeader replaces
UtilityBar (no logo, just actions). Remove framer-motion sidebar
primitive, hover-to-expand, and sidebar-context.
2026-03-18 16:33:35 +01:00
Usman Baig
db5cd4cbcb feat: replace sidebar with 21st.dev hover-to-expand component
Use framer-motion animated sidebar from 21st.dev — collapses to icons,
expands on hover. Phosphor icons instead of lucide. Remove old manual
collapse/expand and sidebar-context. Top bar has Pulse logo + user
actions, sidebar below with site picker and nav groups.
2026-03-18 16:20:32 +01:00
Usman Baig
66a70f676f fix: full-width top bar with logo, sidebar below
Restructure layout: top bar spans full width (Pulse logo left, user
actions right) with continuous bottom border. Sidebar sits below with
no vertical border collision. Remove logo from sidebar. Remove all
transition-colors from nav items to prevent white flash on click.
2026-03-18 16:12:20 +01:00
Usman Baig
d00d2e5592 fix: sidebar polish — logo, scrollbar, utility bar height, icon flash
- Fix stretched logo with object-contain
- Remove border below logo
- Add overflow-hidden to prevent scrollbar flash during transition
- Match utility bar height to old header (py-3.5)
- Remove transition-colors from active nav items to prevent white flash
2026-03-18 16:04:50 +01:00
Usman Baig
1d25368292 feat: Dokploy-style sidebar layout for site pages
Sidebar takes full viewport height with Pulse logo at top. No Header
on site pages — UtilityBar in content area provides theme toggle, app
launcher, notifications, and user menu. Non-site authenticated pages
keep static Header. No footer on dashboard pages.
2026-03-18 15:58:06 +01:00
Usman Baig
7ae5facd0c fix: proper dashboard layout — header + sidebar + content fill viewport
Use h-screen overflow-hidden on the root container for authenticated
views. Sidebar and content fill the remaining height below the header.
Remove footer from dashboard pages. Content scrolls inside its own
container, sidebar stays fixed in place.
2026-03-18 15:38:58 +01:00
Usman Baig
61ce505ee5 fix: pin sidebar to viewport with sticky positioning
Sidebar was scrolling with page content. Fix by adding sticky top-0
h-screen. Widen collapsed width to 68px to prevent icon clipping.
2026-03-18 15:34:48 +01:00
Usman Baig
80ae8311dc feat: static header + collapsible sidebar navigation
Replace floating pill header with static variant for authenticated
views. Add collapsible sidebar with site picker, grouped navigation
(Analytics/Infrastructure), and mobile overlay drawer. Remove
horizontal SiteNav tab bar.
2026-03-18 15:30:27 +01:00
Usman
9f7987fe07 Merge pull request #56 from ciphera-net/feat/funnels-v2
Funnels V2: event steps, edit UI, filters, trends, breakdowns
2026-03-18 14:41:10 +01:00
Usman Baig
94112161f0 docs: update changelog for funnels v2 2026-03-18 14:38:01 +01:00
Usman Baig
4c7ed858f7 feat(funnels): add step-level breakdown drawer with dimension tabs 2026-03-18 14:34:07 +01:00
Usman Baig
efd0c144b5 feat(funnels): add conversion trends line chart with per-step toggles 2026-03-18 14:33:25 +01:00
Usman Baig
585cb4fd88 feat(funnels): add edit funnel page with pre-populated form 2026-03-18 14:27:45 +01:00
Usman Baig
2811945d3e feat(funnels): add filter bar and exit path display to funnel detail 2026-03-18 14:26:26 +01:00
Usman Baig
18e66917d3 feat(funnels): extract reusable FunnelForm with category toggle, property filters, and conversion window 2026-03-18 14:23:25 +01:00
Usman Baig
d5b594d6f9 feat(funnels): update frontend types and API client for funnels v2 2026-03-18 14:20:15 +01:00
Usman
ff58ba5953 Merge pull request #55 from ciphera-net/staging
feat: soft-delete sites with 7-day grace period
2026-03-18 11:26:59 +01:00
Usman Baig
311f546261 fix: improve code quality in soft-delete frontend (loading state, imports, confirm dialog) 2026-03-18 11:15:14 +01:00
Usman Baig
ad1c8c5420 fix: address spec compliance gaps in soft-delete frontend 2026-03-18 11:15:14 +01:00
Usman Baig
51723bea5d feat: replace prompt() delete with DeleteSiteModal on settings page 2026-03-18 11:15:14 +01:00
Usman Baig
d7f374472a feat: integrate delete modal and soft-deleted sites list on dashboard 2026-03-18 11:15:14 +01:00
Usman Baig
7a0f106bc3 feat: add DeleteSiteModal with soft-delete and permanent-delete options 2026-03-18 11:15:14 +01:00
Usman Baig
10ad276c38 feat: add soft-delete API functions and deleted_at to Site type 2026-03-18 11:15:14 +01:00
Usman Baig
e4fa320b39 Merge remote-tracking branch 'origin/main' into staging 2026-03-17 23:10:11 +01:00
Usman Baig
78fed269db fix: replace developer jargon with user-friendly labels in visitor identity settings
Storage/TTL labels used implementation terms (localStorage, sessionStorage, TTL)
that only make sense to developers. Replaced with plain language and added a
description explaining the privacy trade-off.
2026-03-17 23:07:11 +01:00
Usman Baig
90944ce6bd fix: use screen.width fallback in trackCustomEvent to prevent bot filter false positives
window.innerWidth is 0 in hidden/minimized tabs, causing the heuristic bot
scorer (added in #40) to drop legitimate custom events with a score of 5.
Use window.screen.width as fallback, matching the existing trackPageview logic.
2026-03-17 22:32:56 +01:00
Usman Baig
d97818dfd7 fix: use screen.width fallback in trackCustomEvent to prevent bot filter false positives
window.innerWidth is 0 in hidden/minimized tabs, causing the heuristic bot
scorer (added in #40) to drop legitimate custom events with a score of 5.
Use window.screen.width as fallback, matching the existing trackPageview logic.
2026-03-17 22:32:45 +01:00
Usman
fa9fa26a1f Merge pull request #54 from ciphera-net/staging
chore: bump @ciphera-net/ui to ^0.2.8
2026-03-17 22:27:59 +01:00
Usman Baig
3aaf199a19 chore: bump @ciphera-net/ui to ^0.2.8 2026-03-17 19:47:54 +01:00
Usman
431128f4ad Merge pull request #53 from ciphera-net/staging
Slim tracking script: send raw browser state, let server handle normalization
2026-03-17 12:35:57 +01:00
Usman Baig
dedb55b113 docs: add thin client changes to changelog 2026-03-17 12:32:53 +01:00
Usman Baig
c833a759f4 refactor: slim tracking script, move logic server-side 2026-03-17 12:28:23 +01:00
Usman
553b44328e Merge pull request #52 from ciphera-net/staging
BunnyCDN, Search tab, journeys redesign, and dashboard polish
2026-03-17 11:08:26 +01:00
Usman Baig
81e2e8bd6c chore: consolidate unreleased changelog entries
Merge duplicate section headers, remove duplicate visit duration entry,
trim granular sub-features into parent entries, and reorder sections to
follow Keep a Changelog convention (Added → Improved → Removed → Fixed).
2026-03-17 11:03:17 +01:00
Usman Baig
109aca62c0 docs: add bot filtering and script improvements to changelog 2026-03-17 10:24:44 +01:00
Usman Baig
e7ebe2a923 refactor: remove client-side 0x0 screen check, handled server-side
IsSuspiciousEvent already scores 0x0 screens as +5 (bot threshold).
Keeping the check client-side hides bot traffic from analysis and
is trivially bypassable.
2026-03-17 10:20:52 +01:00
Usman Baig
ebd25770b4 revert: remove client-side bot detection from tracking script
Server-side heuristic scoring already catches these patterns via
IsSuspiciousEvent. Client-side checks are trivially bypassable
(script is public) and add payload weight for all real users.
2026-03-17 10:19:29 +01:00
Usman Baig
d45d39aa60 feat: add client-side headless browser detection
Skip events from headless Chrome (empty plugins, missing chrome
runtime), hidden browsers (zero outer dimensions), and known bot
viewports (1024x1024).
2026-03-17 10:17:21 +01:00
Usman Baig
01222bf0a9 fix: bump dark mode inline bar opacity from 25% to 40% — less brown, more orange 2026-03-16 23:14:07 +01:00
Usman Baig
1ba6f6609d fix: step numbering starts at 1 after Entry column 2026-03-16 22:27:11 +01:00
Usman Baig
b16f01bd7f fix: rename Step 1 to Entry in columns view, max depth to 6 2026-03-16 22:08:14 +01:00
Usman Baig
52427fea93 fix: change journey depth default to 4, max to 5 2026-03-16 22:02:29 +01:00
Usman Baig
17f2bdc9e9 feat: rewrite sankey chart with D3 — thin bars, labels beside nodes, proper hover
Replace @nivo/sankey with custom D3 implementation:
- 30px thin node bars with labels positioned beside them
- Links at 0.3 opacity, 0.6 on hover with full path highlighting
- Colors based on first URL segment for visual grouping
- Dynamic height based on tallest column
- Responsive width via ResizeObserver
- Click nodes to filter, hover for tooltips
- Invisible wider hit areas for easier link hovering
- Remove @nivo/sankey dependency, add d3
2026-03-16 21:56:22 +01:00
Usman Baig
4007056e44 feat: redesign sankey to block-style nodes with inside labels
- nodeThickness 8 → 100 (wide blocks like Rybbit)
- Labels inside nodes with white text instead of outside
- Margins 90px → 16px (labels no longer need outside space)
- Dynamic chart height based on max nodes per step
- Tighter nodeSpacing (4px) and subtle link opacity
- nodeBorderRadius 4 for rounded block corners
2026-03-16 21:45:08 +01:00
Usman Baig
bec61c599e fix: reduce sankey margins from 160px to 90px — less wasted space 2026-03-16 21:30:09 +01:00
Usman Baig
40f223cf38 fix: make sankey chart responsive — no horizontal scrolling
Replace fixed numSteps*250 width calculation with ResizeObserver
that measures the container and fits the chart within it.
2026-03-16 21:25:21 +01:00
Usman Baig
e9ec86b10b fix: polish ScriptSetupBlock — orange accent bar, terminal dots, tighter storage/TTL, framework icons
- Add gradient orange accent bar and macOS-style terminal dots to code block
- Copy button uses brand-orange styling instead of plain gray
- Storage and TTL selects sit side-by-side tightly instead of spread apart
- TTL options shortened (24h, 48h, 7d, 30d)
- Replace framework dropdown with compact icon+label buttons (logos visible)
- Add "All integrations" link in section header
2026-03-16 17:20:27 +01:00
Usman Baig
16020a166c feat: redesign ScriptSetupBlock with feature toggles and dynamic script builder
Replace framework grid + static code block with:
- Dark terminal-style code block that updates in real-time
- Feature toggle switches (scroll depth, 404, outbound, downloads)
- Frustration tracking toggle (visually distinct as add-on)
- Storage mode + TTL dropdowns (TTL hides when per-tab selected)
- Compact framework dropdown replacing 10-button grid
2026-03-16 17:14:13 +01:00
Usman Baig
e444985295 refactor: extract frustration tracking into separate add-on script
Move rage click and dead click detection (35% of script.js) into
script.frustration.js as an optional add-on. Core script drops from
8.1KB to 5.7KB gzipped. Add-on auto-discovers core via window.pulse
polling and supports opt-out via data-no-rage/data-no-dead attributes.

- Expose cleanPath on window.pulse for add-on consumption
- Add script.frustration.js to middleware PUBLIC_ROUTES
- Update integration guides, ScriptSetupBlock, and FrustrationTable
  empty state to reference the add-on script
2026-03-16 16:59:37 +01:00
Usman Baig
f797d89131 fix: restyle sankey to match reference - thinner nodes, all labels, scrollable
- Switch to fixed-width Sankey with horizontal scroll (250px per step)
- Thinner nodes (8px), tighter spacing (8px)
- Labels on all columns, not just first/last
- Lower link opacity (0.15) for cleaner look
- Increased node cap to 25 per step
2026-03-16 14:22:06 +01:00