Conversation
Add Statsig experiment best_cta with cta param for hero primary button. Wire SSR bundle, bootstrap, client exposure, and hero_cta URL override. Align desktop nav, mobile header, and custom hero with heroCta from load. Made-with: Cursor
- Implemented `heroCtaIfShortStartBuilding` function to dynamically adjust CTA labels based on the `heroCta` value from the page state. - Updated various components including PreFooter, custom hero, and pricing pages to utilize the new CTA logic, ensuring consistency in messaging. - Enhanced blog mid CTA handling to sync with the latest hero experiment CTA values. - Refactored imports and improved code organization for better readability.
Greptile SummaryThis PR introduces a
Confidence Score: 3/5Not safe to merge as-is — the pricing and cloud-ga pages have a real unconditional copy regression and a silent UI removal. Two P1 findings: (1) CTA text on pricing/cloud-ga/compare-plans pages changes unconditionally from 'Start building' to 'Start building for free' without an experiment running, because those routes never set
Important Files Changed
Reviews (1): Last reviewed commit: "feat: integrate hero CTA updates across ..." | Re-trigger Greptile |
| const navCtaLabel = $derived( | ||
| (page.data as { heroCta?: string | null }).heroCta ?? DEFAULT_HERO_CTA | ||
| ); |
There was a problem hiding this comment.
CTA text changed unconditionally on pricing page
The pricing page has no server load that sets heroCta, so page.data.heroCta is always undefined here. navCtaLabel therefore always resolves to DEFAULT_HERO_CTA ('Start building for free'). Every call to heroCtaIfShortStartBuilding('Start building', navCtaLabel) then returns 'Start building for free', changing all three plan buttons on this page from the previous 'Start building' to 'Start building for free' regardless of whether any Statsig experiment is active. The same issue affects compare-plans.svelte and call-to-action.svelte (cloud-ga route), both of which have no heroCta in their route data.
| </div> | ||
| <div class="web-big-padding-section-level-2 relative !mb-0"> |
There was a problem hiding this comment.
PreFooter silently removed from pricing page
PreFooter is dropped here without explanation. The component renders a pricing-plan card strip and a CTA section that visitors landing on /pricing previously saw. If this removal is intentional (e.g. to avoid duplicating plan cards), it should be documented in the PR description or a comment — as-is it looks like an accidental deletion.
| </script> | ||
|
|
||
| <Button |
There was a problem hiding this comment.
Repeated inline
page.data type cast across 8+ components
The pattern (page.data as { heroCta?: string | null }).heroCta ?? DEFAULT_HERO_CTA is copied verbatim into IsLoggedIn.svelte, PreFooter.svelte, site-header.svelte, pricing.svelte (marketing), pricing/+page.svelte, compare-plans.svelte, call-to-action.svelte, and Post.svelte. A single shared type or a tiny helper (e.g. getPageHeroCta(page)) would make the intent clear and prevent one component from silently drifting if the field is ever renamed.
What does this PR do?
(Provide a description of what this PR does.)
Test Plan
(Write your test plan here. If you changed any code, please provide us with clear instructions on how you verified your changes work.)
Related PRs and Issues
(If this PR is related to any other PR or resolves any issue or related to any issue link all related PR and issues here.)
Have you read the Contributing Guidelines on issues?
(Write your answer here.)