Skip to content

Propose landing UI refresh#601

Open
riderx wants to merge 9 commits into
mainfrom
codex/ui-page-refresh
Open

Propose landing UI refresh#601
riderx wants to merge 9 commits into
mainfrom
codex/ui-page-refresh

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented May 1, 2026

Summary

  • Refreshes the shared site header with a sticky glass treatment, clearer register/star controls, larger mobile tap targets, and expanded-state accessibility.
  • Tightens the homepage hero by reducing background-logo noise on mobile, improving headline/CTA hierarchy, and simplifying the feature panel frame.
  • Reworks the plugins directory above the fold so stats, search, sorting, and first cards are visible sooner.
  • Simplifies pricing cards by replacing emoji plan markers with initial badges, moving the popular badge into the card, and reducing heavy shadows.

Screenshots

1. Shared header + homepage hero

Before After
Before homepage desktop After homepage desktop

2. Mobile hero readability

Before After
Before homepage mobile After homepage mobile

3. Plugins directory density

Before After
Before plugins page After plugins page

4. Pricing card hierarchy

Before After
Before pricing page After pricing page

5. Shared header on solution pages

Before After
Before solution page After solution page

6. Shared header on tools pages

Before After
Before tools page After tools page

Validation

  • bunx prettier --write apps/web/src/layouts/Layout.astro apps/web/src/components/Header.astro apps/web/src/components/Hero.astro apps/web/src/components/pricing/Plans.astro apps/web/src/pages/plugins.astro apps/web/src/pages/pricing.astro
  • bun run build:web
  • bun run check passed. Web: 0 errors. Docs: 0 errors, 1 existing hint in apps/docs/src/components/doc/CopyPage.astro.

Summary by CodeRabbit

  • Style

    • Refreshed header (sticky, dark blur), hero visuals, grid/card/icon sizing, CTA and pricing card styling; updated plans and plugin page layout and badge presentation; minor root/layout rendering tweak.
  • Bug Fixes / Accessibility

    • Improved keyboard/mouse behavior for dropdowns and mobile menus, added ARIA attributes, focus-visible rings, accessible SVG attributes, no-JS fallback for desktop menus, and safer external link rel attrs; pricing now exposes live status and tabular numbers.
  • Localization

    • Spanish copyright wording shortened to "Derechos reservados."

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 1, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Header gains JS-driven accessible dropdowns and sticky blurred styling; hero, pricing, plans and plugins UIs receive visual and accessibility tweaks; layout adds stacking/antialiasing adjustments; Spanish copyright string wording updated.

Changes

Cohort / File(s) Summary
Header Navigation & Interactivity
apps/web/src/components/Header.astro
Made header sticky with translucent blur; converted desktop dropdowns from CSS hover to DOM/ARIA-controlled toggles (IDs, aria-haspopup/aria-controls/aria-expanded, aria-hidden), added keyboard handlers (Enter/Space toggle, Escape closes + returns focus), hover/focus open, focusout/mouseleave close, outside-click close, centralized dropdown state logic, improved mobile hamburger ARIA, and SVG accessibility attributes.
Hero Presentation
apps/web/src/components/Hero.astro
Standardized background grid tile containers and image class ordering; adjusted blur/opacity, padding, typography (font-semibold, text-balance, text-pretty), CTA styling (removed radial overlay, added shadow/ring and focus-visible styles), and normalized specific logo tiles including oneclick_logo.webp.
Pricing / Plans
apps/web/src/components/pricing/Plans.astro, apps/web/src/pages/pricing.astro
Replaced emoji-logic with planInitial(plan.name) badge; updated plan grid/card spacing, borders, shadows, and "most popular" marker; added role="status"/aria-live and tabular-nums for price UI; separated monthly/yearly price elements for JS switching; reformatted FAQ JSON-LD objects; inline SVGs marked aria-hidden/focusable.
Plugins Page & Layout
apps/web/src/pages/plugins.astro, apps/web/src/layouts/Layout.astro
Adjusted plugins spacing, heading constraints, typography (text-balance/text-pretty, font-semibold), numeric stability (tabular-nums), hover animation changes (hover:-translate-y-1), and added antialiased to <html> plus isolate to main wrapper.
Localization
messages/es.json
Updated Spanish copyright_notice value from uppercase "TODOS LOS DERECHOS RESERVADOS." to "Derechos reservados.".

Sequence Diagram(s)

sequenceDiagram
    participant User as User
    participant HeaderUI as Header UI (buttons/menus)
    participant Script as Header Script (state manager)
    participant Document as Document

    User->>HeaderUI: click/tap toggle or hover/focus
    HeaderUI->>Script: dispatch toggle/open/focus event (id)
    Script->>HeaderUI: update `aria-expanded` / `aria-hidden` and visibility classes
    HeaderUI->>User: menu shown/hidden
    User->>Document: press Escape or click outside
    Document->>Script: document key/click handler
    Script->>HeaderUI: close menus, update ARIA states, return focus if needed
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰
I nudged the header, crisp and bright,
Toggles whisper, menus take flight,
Badges bloom from names so plucky,
Tiles aligned and focus lucky,
A tiny hop for accessible delight. 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Propose landing UI refresh' accurately summarizes the main changes across the PR: refreshing header styling, hero section improvements, plugins page layout adjustments, and pricing card redesign.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/ui-page-refresh

Comment @coderabbitai help to get the list of available commands and usage tips.

@riderx riderx marked this pull request as ready for review May 1, 2026 10:56
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/web/src/components/pricing/Plans.astro (1)

90-105: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Announce pricing changes when billing mode toggles.

The price and billing text are updated dynamically, but there is no live region around this content, so assistive tech may not announce the change.

Suggested fix
-            <div class="flex items-end">
+            <div class="flex items-end" role="status" aria-live="polite" aria-atomic="true">

As per coding guidelines: **/*.{astro,jsx,tsx,js,ts}: Dynamic content must use aria-live regions for accessibility.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/components/pricing/Plans.astro` around lines 90 - 105, The price
and billing text updates aren’t announced to assistive tech; wrap the dynamic
elements (the price output from priceDisplay and the blocks with data-price,
data-yearly-price, data-monthly-price) in an accessible live region (e.g., a
container with aria-live="polite" and aria-atomic="true" or role="status") so
changes when the yearly toggle (yearly) flips are announced; ensure the
month/billed strings rendered via m.month and m.billed_annually_at and the
numeric output from numberWithSpaces(plan.price_y) remain inside that region and
that any hidden variants use aria-hidden appropriately so only the visible text
is read.
apps/web/src/components/Hero.astro (1)

214-325: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Decorative feature/stat icons are exposed to assistive tech.

These SVGs are visual-only and should be hidden from the accessibility tree to avoid noisy announcements.

Suggested fix pattern (apply to all decorative SVGs in this section)
-<svg class="h-8 w-8 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+<svg class="h-8 w-8 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true" focusable="false">

As per coding guidelines: **/*.{astro,jsx,tsx}: Decorative SVGs must have aria-hidden="true".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/components/Hero.astro` around lines 214 - 325, Add
aria-hidden="true" to all decorative SVG elements in Hero.astro so they are
removed from the accessibility tree: update each <svg> with classes like "h-8
w-8 text-gray-400", the two app-store SVGs (class "h-6 w-6"), the lock/check SVG
for end_to_end_encryption, and the stats icons (class "h-5 w-5 text-blue-500"
and similar) to include aria-hidden="true" (and optionally focusable="false") to
prevent assistive tech from announcing these purely visual icons.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/web/src/components/Header.astro`:
- Around line 49-61: The desktop flyout is currently mouse-only because the
"group" wrapper and the submenu div rely solely on Tailwind's group-hover
classes; make the products button and submenu keyboard-accessible by: (1)
turning the button (the element with aria-label={m.products(...)} and the
chevron SVG) into a proper menu toggle with aria-haspopup="true" and
aria-expanded state, (2) replace group-hover visibility rules on the submenu div
with focus/focus-within (or toggle a visible CSS class) so the submenu becomes
visible when the button or any submenu item receives focus, and (3) add minimal
keyboard handlers to the toggle (handle Enter/Space to open/close and Escape to
close) and ensure submenu links are reachable (no permanent invisible/opacity
while focused) and update aria-hidden accordingly; apply the same changes to the
other flyout block referenced around the later menu.
- Around line 33-34: The decorative SVG elements (e.g., the <svg class="size-7"
...> instances used for header icons) should be hidden from screen readers; add
aria-hidden="true" to each decorative SVG (the ones at the top-level header
icons and the other same-pattern SVGs) so they are not announced by assistive
tech.

In `@apps/web/src/pages/pricing.astro`:
- Around line 244-250: The decorative SVGs in pricing.astro (the <svg> elements
used for the premium-support icons) are currently exposed to assistive tech; add
aria-hidden="true" to each decorative <svg> (the one with class "h-10 w-10
text-orange-600" shown in the diff and the similar SVG at lines ~267-269) so
they are excluded from the accessibility tree, ensuring only meaningful content
is announced.

---

Outside diff comments:
In `@apps/web/src/components/Hero.astro`:
- Around line 214-325: Add aria-hidden="true" to all decorative SVG elements in
Hero.astro so they are removed from the accessibility tree: update each <svg>
with classes like "h-8 w-8 text-gray-400", the two app-store SVGs (class "h-6
w-6"), the lock/check SVG for end_to_end_encryption, and the stats icons (class
"h-5 w-5 text-blue-500" and similar) to include aria-hidden="true" (and
optionally focusable="false") to prevent assistive tech from announcing these
purely visual icons.

In `@apps/web/src/components/pricing/Plans.astro`:
- Around line 90-105: The price and billing text updates aren’t announced to
assistive tech; wrap the dynamic elements (the price output from priceDisplay
and the blocks with data-price, data-yearly-price, data-monthly-price) in an
accessible live region (e.g., a container with aria-live="polite" and
aria-atomic="true" or role="status") so changes when the yearly toggle (yearly)
flips are announced; ensure the month/billed strings rendered via m.month and
m.billed_annually_at and the numeric output from numberWithSpaces(plan.price_y)
remain inside that region and that any hidden variants use aria-hidden
appropriately so only the visible text is read.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cc2b09a8-68fb-4739-90d4-b95bef83974e

📥 Commits

Reviewing files that changed from the base of the PR and between 4ccb033 and 8a82d61.

⛔ Files ignored due to path filters (12)
  • .github/pr-assets/ui-refresh/after/home-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/after/home-mobile.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/after/plugins-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/after/pricing-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/after/solution-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/after/tools-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/before/home-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/before/home-mobile.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/before/plugins-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/before/pricing-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/before/solution-desktop.png is excluded by !**/*.png
  • .github/pr-assets/ui-refresh/before/tools-desktop.png is excluded by !**/*.png
📒 Files selected for processing (6)
  • apps/web/src/components/Header.astro
  • apps/web/src/components/Hero.astro
  • apps/web/src/components/pricing/Plans.astro
  • apps/web/src/layouts/Layout.astro
  • apps/web/src/pages/plugins.astro
  • apps/web/src/pages/pricing.astro

Comment thread apps/web/src/components/Header.astro Outdated
Comment thread apps/web/src/components/Header.astro Outdated
Comment thread apps/web/src/pages/pricing.astro Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: aeda446585

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/web/src/components/Header.astro Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/web/src/components/Header.astro`:
- Around line 362-375: Anchors in Header.astro that use target="_blank" (e.g.,
the login link that calls m.login(...) and the register link that uses
getRelativeLocaleUrl(...)) are missing rel="noopener noreferrer"; update each
<a> with target="_blank" to include rel="noopener noreferrer" to prevent
window.opener exploitation (apply the same change for the other occurrences
around lines referenced, e.g., the other anchors at ~600-610 that open new
tabs).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4ee816a5-333d-4d46-a246-5e0ddbcc9d39

📥 Commits

Reviewing files that changed from the base of the PR and between 8a82d61 and cf2d982.

📒 Files selected for processing (4)
  • apps/web/src/components/Header.astro
  • apps/web/src/components/Hero.astro
  • apps/web/src/components/pricing/Plans.astro
  • apps/web/src/pages/pricing.astro
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/src/pages/pricing.astro

Comment thread apps/web/src/components/Header.astro Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/web/src/components/Header.astro`:
- Around line 73-74: The desktop flyout panels are initially hidden with
"invisible opacity-0" so if JS fails their links are unreachable; remove those
initial hiding classes from the desktop flyouts (refer to the elements with
id="desktop-products-menu" and the corresponding desktop solutions menu around
the other occurrences) so the menus are visible and keyboard-focusable without
JS, and instead implement the open/closed visual state purely via your script or
CSS (e.g., add/remove a JS-controlled class or use media-query-specific hiding
for mobile only); ensure the same change is applied to the other instances
called out (around lines 124-125 and 664-700) so interactive elements remain
keyboard accessible per the guideline.
- Around line 371-377: Remove the incorrect ARIA role by deleting the
role="button" attribute on the register CTA anchor element (the <a> that calls
getRelativeLocaleUrl(Astro.locals.locale, 'register') and uses m.register with
Astro.locals.locale); keep it as a normal link that opens in a new tab
(target="_blank" rel="noopener noreferrer") so assistive tech sees it as a link
instead of a button.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7f53cf12-7a83-4a23-89d5-53851b1206d0

📥 Commits

Reviewing files that changed from the base of the PR and between c22666e and b8fb40b.

📒 Files selected for processing (1)
  • apps/web/src/components/Header.astro

Comment thread apps/web/src/components/Header.astro Outdated
Comment thread apps/web/src/components/Header.astro Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b7b52a828d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/web/src/components/Header.astro Outdated
@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 1, 2026

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7e5ed96bf0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

dropdown.wrapper.addEventListener('mouseleave', () => {
if (!dropdown.wrapper?.contains(document.activeElement)) setDesktopDropdownOpen(dropdown, false)
})
dropdown.wrapper.addEventListener('focusin', () => setDesktopDropdownOpen(dropdown, true))
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Prevent Escape from immediately reopening dropdown menus

The desktop dropdown wrapper always reopens on any focusin, so pressing Escape inside the menu does not actually dismiss it: the menu handler closes it and calls toggle.focus(), then the focus shift bubbles a focusin to the wrapper and setDesktopDropdownOpen(..., true) runs again. This makes Escape ineffective for keyboard users in the menu-close flow.

Useful? React with 👍 / 👎.

@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 1, 2026

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bdb8afddc5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread package.json
"gray-matter": "^4.0.3",
"js-yaml": "^4.1.1",
"langchain": "^0.3.37",
"langchain": "^1.3.5",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Migrate legacy LangChain imports before upgrading to v1

This bump upgrades langchain to ^1.3.5, but repository scripts still use v0-era import paths like langchain/chains/..., langchain/chat_models/openai, and langchain/document (see scripts/generateTutorials.mjs and scripts/trainOpenAI.mjs). In LangChain v1, legacy APIs moved out of these paths (to packages such as @langchain/classic / @langchain/openai), so these scripts will fail at startup with module-resolution errors when run, breaking the tutorial/training automation workflows.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant