From 8528bcf01e2d85bff5971d8ffdfdb2d853e203f4 Mon Sep 17 00:00:00 2001 From: Palash Awasthi Date: Sat, 16 May 2026 01:32:21 -0700 Subject: [PATCH] reflex-site-shared: canonical override + Try-for-free primary CTA Two small changes to reflex-site-shared for the Streamlit migration PR series: 1. create_meta_tags grows an optional canonical kwarg. When set, the rendered , og:url, and twitter:url all point at that URL instead of the page's own url, so search engines and social crawlers index the same target. Default behavior unchanged when the kwarg is omitted. 2. cta_card (bottom CTA on every marketing page) swaps Try-for-free into the primary slot and demotes Book a Demo to the ghost variant secondary. Affects every marketing-templated page across the three apps once their reflex-site-shared lockfiles are bumped. Pairs with: - reflex-dev/marketing PR adding the /migration/streamlit lander. - reflex-dev/blog PR refreshing /blog/reflex-streamlit with a frontmatter canonical override pointing at the new lander. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/reflex_site_shared/meta/meta.py | 17 ++++++++++++++--- .../src/reflex_site_shared/views/cta_card.py | 14 +++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/reflex-site-shared/src/reflex_site_shared/meta/meta.py b/packages/reflex-site-shared/src/reflex_site_shared/meta/meta.py index 1e73dbc3157..85536790068 100644 --- a/packages/reflex-site-shared/src/reflex_site_shared/meta/meta.py +++ b/packages/reflex-site-shared/src/reflex_site_shared/meta/meta.py @@ -126,7 +126,11 @@ def to_cdn_image_url(image: str | None) -> str: def create_meta_tags( - title: str, description: str, image: str | None, url: str | None = None + title: str, + description: str, + image: str | None, + url: str | None = None, + canonical: str | None = None, ) -> list[dict[str, str] | rx.Component]: """Create meta tags for a page. @@ -135,11 +139,18 @@ def create_meta_tags( description: The page description. image: The image path for social media previews (None to omit). url: The page URL (optional, defaults to REFLEX_DOMAIN_URL). + canonical: Override for the canonical link. Use when one page should + consolidate SEO signals to a different URL (for example, a blog + post that canonicalizes to a dedicated comparison lander). When + set, ``og:url`` and ``twitter:url`` also follow the canonical so + social crawlers index the same target as search engines. Leave + None to canonicalize to ``url``. Returns: A list of meta tag dictionaries. """ page_url = url or REFLEX_DOMAIN_URL + canonical_url = canonical if canonical is not None else page_url image_url = to_cdn_image_url(image) if image else None return [ @@ -147,9 +158,9 @@ def create_meta_tags( title=title, description=description, image=image_url, - url=page_url, + url=canonical_url, ), - rx.el.link(rel="canonical", href=page_url), + rx.el.link(rel="canonical", href=canonical_url), ] diff --git a/packages/reflex-site-shared/src/reflex_site_shared/views/cta_card.py b/packages/reflex-site-shared/src/reflex_site_shared/views/cta_card.py index 16803ae025e..b47c4a9ba97 100644 --- a/packages/reflex-site-shared/src/reflex_site_shared/views/cta_card.py +++ b/packages/reflex-site-shared/src/reflex_site_shared/views/cta_card.py @@ -26,21 +26,21 @@ def cta_card(): class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-medium", ), rx.el.div( - demo_form_dialog( - trigger=marketing_button( - "Book a Demo", - variant="primary", - ), - ), rx.el.elements.a( marketing_button( "Try for free", ui.icon("ArrowRight01Icon"), - variant="ghost", + variant="primary", ), href=REFLEX_BUILD_URL, target="_blank", ), + demo_form_dialog( + trigger=marketing_button( + "Book a Demo", + variant="ghost", + ), + ), class_name="flex flex-row gap-4 items-center", ), class_name="flex flex-col gap-6 justify-center max-w-[29.25rem]",