Skip to content

Update library landing pages and refresh shared site components - #1075

Merged
tannerlinsley merged 3 commits into
mainfrom
codex/update-library-landing-pages
Aug 1, 2026
Merged

Update library landing pages and refresh shared site components#1075
tannerlinsley merged 3 commits into
mainfrom
codex/update-library-landing-pages

Conversation

@Abeuty

@Abeuty Abeuty commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Refresh library landing pages, navigation, overlays, and supporting content sections
  • Update shared UI components and design-system routes
  • Add refreshed brand assets, favicons, and hero motion media
  • Improve maintainers, partners, stats, social proof, newsletter, and support experiences

Testing

Not run (not requested)

Summary by CodeRabbit

  • New Features

    • Added a redesigned responsive navigation experience with mobile panels, search, AI access, and library navigation.
    • Added a structured multi-column footer with legal and social links.
    • Added maintainer cards and a new design-system maintainers showcase.
    • Added expanded brand asset galleries, blog post cards, library status badges, and improved library overlay back navigation.
    • Added a video-enabled hero with playback controls and reduced-motion support.
  • Improvements

    • Refined buttons, badges, themes, icons, typography, menus, and responsive layouts.
    • Updated design-system documentation with light/dark previews and new component examples.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 29, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
tanstack-com ff7e2a0 Commit Preview URL

Branch Preview URL
Aug 01 2026, 05:11 PM

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR refreshes design-system components, responsive navigation, maintainer and library views, homepage sections, brand assets, and application interfaces. It adds shared UI contracts for badges, buttons, descriptions, blog cards, and navigation flows.

Changes

Site and design-system refresh

Layer / File(s) Summary
Design-system components and previews
src/components/ds/*, src/components/ds/ui/*, src/ui/*, src/routes/ds.*, src/styles/app.css
Adds shared description, badge, button, blog-card, and brand-gallery components. Updates design-system previews, typography specimens, statistics, and theme tokens.
Maintainer, library, and documentation routes
src/components/MaintainerCard.tsx, src/components/LibraryStatusBadge.tsx, src/components/MaintainersSection.tsx, src/routes/ds.maintainers.tsx, src/routeTree.gen.ts
Reworks maintainer cards, adds reusable library badges, and adds the /ds/maintainers route.
Responsive navigation and overlay flow
src/components/Navbar.tsx, src/components/LibrariesOverlay.tsx, src/contexts/LibrariesOverlayContext.tsx, src/components/SearchButton.tsx
Replaces mobile navigation with a two-panel flow and adds library-overlay back navigation, updated utility controls, blog cards, and menu animations.
Homepage and landing presentation
src/routes/index.tsx, src/components/home/*, src/components/landing/*, src/routes/__root.tsx
Adds video hero media with reduced-motion handling, updates newsletter and social-proof sections, adjusts landing tokens, and adds theme-specific favicons.
Application and supporting UI
src/components/ApplicationStarter.tsx, src/components/Footer.tsx, src/components/Partners*.tsx, src/components/application-builder/*
Updates application-starter styling and icons, restructures the footer, updates partner actions, and narrows migration repository input visibility.

Estimated code review effort: 5 (Critical) | ~90+ minutes

Possibly related PRs

  • TanStack/tanstack.com#1074: Both PRs modify the homepage hero in src/routes/index.tsx, including video playback and reduced-motion handling.

Suggested reviewers: tannerlinsley

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the library landing page updates and broad refresh of shared site components.
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.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/update-library-landing-pages

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (4)
src/components/MaintainerCard.tsx (2)

395-395: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

MaintainerCardProps still declares libraryId and hideLibraries, which are now ignored.

Callers can keep passing them with no effect. Trim the type (or keep the props and honor them) so the contract matches the behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/MaintainerCard.tsx` at line 395, Update MaintainerCardProps
and the MaintainerCard API to remove the unused libraryId and hideLibraries
props, ensuring the declared contract matches the component’s current behavior;
alternatively, implement their intended behavior if those props must remain
supported.

190-199: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

slice(0, 2) picks social links by object key order.

Which platforms surface on the card depends on the declaration order in src/libraries/maintainers.ts per maintainer, so cards are inconsistent and linkedIn/website can silently disappear. Consider an explicit priority list (e.g. ['twitter', 'bluesky', 'website']) instead of positional truncation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/MaintainerCard.tsx` around lines 190 - 199, Update the card
branch in MaintainerCard’s socialEntries construction to select links using an
explicit platform-priority list rather than Object.entries(...).slice(0, 2).
Preserve the existing GitHub entry and ensure prioritized platforms such as
twitter, bluesky, and website are selected consistently without being dropped
due to object key order.
src/components/ds/DsKit.tsx (1)

22-28: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Class concatenation in DsDescription makes caller overrides order-dependent. DsDescription joins its role classes with the incoming className instead of merging them, so any caller utility that conflicts with a role default (margins, text size, color) coexists with it and resolution falls back to CSS source order.

  • src/components/ds/DsKit.tsx#L22-L28: replace the array join(' ') with the already-imported twMerge(descriptionStyles[role], className).
  • src/routes/ds.typography.tsx#L343-L345: after the merge fix, className="mt-2" will reliably override the role's mt-3/mt-1; no change needed here beyond confirming the intended spacing.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/ds/DsKit.tsx` around lines 22 - 28, Update DsDescription in
src/components/ds/DsKit.tsx:22-28 to use the imported twMerge with
descriptionStyles[role] and className instead of array joining, so caller
utilities reliably override role defaults. In
src/routes/ds.typography.tsx:343-345, make no code change; only confirm the
existing mt-2 spacing override remains intended.
src/components/ds/BrandAssets.tsx (1)

124-157: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Consider loading="lazy" / explicit dimensions on the preview <img>.

The gallery renders a dozen-plus square previews; lazy loading and intrinsic sizing would avoid layout shift and unnecessary fetches on this catalog page.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/ds/BrandAssets.tsx` around lines 124 - 157, Update the preview
img in AssetCard to use lazy loading and explicit square dimensions matching the
gallery layout, while preserving asset.preview, asset.alt, and asset.imgClass.
Ensure the intrinsic sizing prevents layout shift and offscreen previews are not
fetched unnecessarily.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/MaintainerCard.tsx`:
- Around line 397-399: The MaintainerCard wrapper div’s aria-label is
ineffective without an accessible role. Remove this redundant aria-label, or
assign an appropriate role such as group/listitem and connect it to the existing
maintainer-name-${maintainer.github} element via aria-labelledby.
- Around line 401-408: Update the GitHub profile anchor in MaintainerCard to
render maintainer.avatar when it is present, while retaining the gray background
as the fallback for missing avatars. Preserve the existing link, accessibility
attributes, and layout styling.

In `@src/routes/ds.typography.tsx`:
- Around line 343-345: Remove the hardcoded mt-2 class from the DsDescription
usage in the role-based typography rendering, allowing the role defaults (mt-3
for page and mt-1 for section) to apply without conflicting margin utilities.

In `@src/styles/app.css`:
- Around line 580-628: Add the missing light-mode declarations to .ds-mode-light
for every token overridden by html.dark: --color-icon-*,
--color-action-primary*, --color-status-*, --color-background-elevated,
--color-border-error/success, --color-text-accent, --color-input-bg-hover,
--color-menu-item-pressed, and --color-divider-*. Reuse the existing light-theme
token values so components such as ButtonMode and text-icon-muted remain fully
light-themed inside previews.

---

Nitpick comments:
In `@src/components/ds/BrandAssets.tsx`:
- Around line 124-157: Update the preview img in AssetCard to use lazy loading
and explicit square dimensions matching the gallery layout, while preserving
asset.preview, asset.alt, and asset.imgClass. Ensure the intrinsic sizing
prevents layout shift and offscreen previews are not fetched unnecessarily.

In `@src/components/ds/DsKit.tsx`:
- Around line 22-28: Update DsDescription in src/components/ds/DsKit.tsx:22-28
to use the imported twMerge with descriptionStyles[role] and className instead
of array joining, so caller utilities reliably override role defaults. In
src/routes/ds.typography.tsx:343-345, make no code change; only confirm the
existing mt-2 spacing override remains intended.

In `@src/components/MaintainerCard.tsx`:
- Line 395: Update MaintainerCardProps and the MaintainerCard API to remove the
unused libraryId and hideLibraries props, ensuring the declared contract matches
the component’s current behavior; alternatively, implement their intended
behavior if those props must remain supported.
- Around line 190-199: Update the card branch in MaintainerCard’s socialEntries
construction to select links using an explicit platform-priority list rather
than Object.entries(...).slice(0, 2). Preserve the existing GitHub entry and
ensure prioritized platforms such as twitter, bluesky, and website are selected
consistently without being dropped due to object key order.
🪄 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 Plus

Run ID: 81b49e90-b99f-4803-94ab-27611ecc13fb

📥 Commits

Reviewing files that changed from the base of the PR and between c5da990 and bda5417.

⛔ Files ignored due to path filters (11)
  • public/favicon-dark.svg is excluded by !**/*.svg
  • public/favicon-light.svg is excluded by !**/*.svg
  • public/images/brand/social/mark-dark.svg is excluded by !**/*.svg
  • public/images/brand/social/mark-dark@2x.png is excluded by !**/*.png
  • public/images/brand/social/mark-light.svg is excluded by !**/*.svg
  • public/images/brand/social/mark-light@2x.png is excluded by !**/*.png
  • public/images/brand/social/stacked-dark.svg is excluded by !**/*.svg
  • public/images/brand/social/stacked-dark@2x.png is excluded by !**/*.png
  • public/images/brand/social/stacked-light.svg is excluded by !**/*.svg
  • public/images/brand/social/stacked-light@2x.png is excluded by !**/*.png
  • public/images/hero-palm-motion.mp4 is excluded by !**/*.mp4
📒 Files selected for processing (48)
  • src/components/ApplicationStarter.tsx
  • src/components/ButtonGroup.tsx
  • src/components/CopyPageDropdown.tsx
  • src/components/Footer.tsx
  • src/components/LibrariesOverlay.tsx
  • src/components/LibraryStatusBadge.tsx
  • src/components/MaintainerCard.tsx
  • src/components/MaintainersSection.tsx
  • src/components/MegaMenuItem.tsx
  • src/components/Navbar.tsx
  • src/components/NavbarAuthControls.tsx
  • src/components/NavbarCartButton.tsx
  • src/components/OpenSourceStats.tsx
  • src/components/PartnersSection.tsx
  • src/components/PartnersSponsorsSection.tsx
  • src/components/SearchButton.tsx
  • src/components/ThemeToggle.tsx
  • src/components/application-builder/useApplicationBuilder.tsx
  • src/components/ds/BrandAssets.tsx
  • src/components/ds/DsKit.tsx
  • src/components/ds/ds-nav.ts
  • src/components/ds/ui/BlogPostCard.tsx
  • src/components/ds/ui/StatsSection.tsx
  • src/components/ds/ui/index.tsx
  • src/components/home/HomeCommunitySection.tsx
  • src/components/home/HomeNewsletterSection.tsx
  • src/components/home/HomeSocialProofSection.tsx
  • src/components/home/HomeStatsSection.tsx
  • src/components/landing/DevtoolsLanding.tsx
  • src/components/landing/HighlightLanding.tsx
  • src/components/landing/LibraryLanding.tsx
  • src/components/landing/MarkdownLanding.tsx
  • src/components/stack/CategoryArticle.tsx
  • src/contexts/LibrariesOverlayContext.tsx
  • src/routeTree.gen.ts
  • src/routes/__root.tsx
  • src/routes/ds.badges.tsx
  • src/routes/ds.buttons.tsx
  • src/routes/ds.cards.tsx
  • src/routes/ds.logos.tsx
  • src/routes/ds.maintainers.tsx
  • src/routes/ds.typography.tsx
  • src/routes/index.tsx
  • src/routes/maintainers.tsx
  • src/routes/paid-support.tsx
  • src/styles/app.css
  • src/ui/Badge.tsx
  • src/ui/Tooltip.tsx

Comment on lines 397 to 399
<div
className="group bg-white dark:bg-gray-900 rounded-lg overflow-hidden shadow-xs border border-gray-200 dark:border-gray-800"
className="group flex w-full max-w-[252px] flex-col items-center rounded-[26px] corner-squircle p-1.5 transition-colors duration-200 hover:bg-[#f2f2f2] focus-within:bg-[#f2f2f2] active:bg-[#e5e5e5] motion-reduce:transition-none dark:hover:bg-[#262626] dark:focus-within:bg-[#262626] dark:active:bg-[#404040]"
aria-label={`Maintainer card for ${maintainer.name}`}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

aria-label on a generic <div> isn't exposed to assistive tech.

Without a role, the label is dropped. Either drop it (the inner link already carries a descriptive label) or give the wrapper a role such as group/listitem — the existing id={maintainer-name-${maintainer.github}} on Line 412 could then serve as aria-labelledby.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/MaintainerCard.tsx` around lines 397 - 399, The MaintainerCard
wrapper div’s aria-label is ineffective without an accessible role. Remove this
redundant aria-label, or assign an appropriate role such as group/listitem and
connect it to the existing maintainer-name-${maintainer.github} element via
aria-labelledby.

Comment on lines 401 to +408
<a
href={`https://github.com/${maintainer.github}`}
target="_blank"
rel="noopener noreferrer"
aria-label={`View ${maintainer.name}'s GitHub profile`}
className="relative h-64 overflow-hidden block"
className="block aspect-square w-full overflow-hidden rounded-[22px] corner-squircle bg-[#d9d9d9] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus"
tabIndex={0}
>
<img
alt={`Avatar of ${maintainer.name}`}
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500"
src={maintainer.avatar}
loading="lazy"
decoding="async"
style={{
aspectRatio: '1/1',
objectFit: 'cover',
}}
/>
<div className="absolute inset-0 bg-linear-to-t from-black/60 via-black/30 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
<div className="absolute inset-0 p-4 flex flex-col justify-end opacity-0 group-hover:opacity-100 transition-opacity duration-300">
<div className="space-y-2">
{maintainer.frameworkExpertise &&
maintainer.frameworkExpertise.length > 0 && (
<div className="flex flex-wrap gap-2 mb-2">
{maintainer.frameworkExpertise.map((framework) => (
<FrameworkChip key={framework} framework={framework} />
))}
</div>
)}
{maintainer.specialties && maintainer.specialties.length > 0 && (
<div className="flex flex-wrap gap-2">
{maintainer.specialties.map((specialty) => (
<SpecialtyChip key={specialty} specialty={specialty} />
))}
</div>
)}
</div>
</div>
</a>
<div className="p-3 space-y-2">
<div className="flex items-center justify-between">
<span
className="text-base font-bold"
id={`maintainer-name-${maintainer.github}`}
>
{maintainer.name}
</span>
<div className="flex items-center gap-2">
{libraryId && (
<RoleBadge maintainer={maintainer} libraryId={libraryId} />
)}
</div>
</div>
{!hideLibraries && !libraryId && libraries.length > 0 && (
<div className="flex flex-wrap gap-1.5 pt-1">
{libraries
.slice(0, showAllLibraries ? undefined : 2)
.map((library) => (
<LibraryBadge key={library.id} library={library} />
))}
{!showAllLibraries && libraries.length > 2 && (
<button
onClick={(e) => {
e.preventDefault()
e.stopPropagation()
setShowAllLibraries(true)
}}
className="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-colors focus:outline-none focus:ring-2 focus:ring-blue-400"
aria-label={`Show ${libraries.length - 2} more libraries`}
tabIndex={0}
type="button"
>
+{libraries.length - 2} more
</button>
)}
</div>
)}
<MaintainerSocialLinks maintainer={maintainer} />
/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

The avatar is never rendered — every card shows the bare gray placeholder.

The anchor has no children and maintainer.avatar is no longer read anywhere in this component, so bg-[#d9d9d9] is the permanent visual for real maintainers on /maintainers, /paid-support, MaintainersSection, and HomeCommunitySection. If the placeholder is intentional for the DS preview only, the image should still render when maintainer.avatar is present.

🐛 Proposed fix
         className="block aspect-square w-full overflow-hidden rounded-[22px] corner-squircle bg-[`#d9d9d9`] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus"
         tabIndex={0}
-      />
+      >
+        {maintainer.avatar ? (
+          <img
+            src={maintainer.avatar}
+            alt=""
+            loading="lazy"
+            className="h-full w-full object-cover"
+          />
+        ) : null}
+      </a>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a
href={`https://github.com/${maintainer.github}`}
target="_blank"
rel="noopener noreferrer"
aria-label={`View ${maintainer.name}'s GitHub profile`}
className="relative h-64 overflow-hidden block"
className="block aspect-square w-full overflow-hidden rounded-[22px] corner-squircle bg-[#d9d9d9] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus"
tabIndex={0}
>
<img
alt={`Avatar of ${maintainer.name}`}
className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-500"
src={maintainer.avatar}
loading="lazy"
decoding="async"
style={{
aspectRatio: '1/1',
objectFit: 'cover',
}}
/>
<div className="absolute inset-0 bg-linear-to-t from-black/60 via-black/30 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
<div className="absolute inset-0 p-4 flex flex-col justify-end opacity-0 group-hover:opacity-100 transition-opacity duration-300">
<div className="space-y-2">
{maintainer.frameworkExpertise &&
maintainer.frameworkExpertise.length > 0 && (
<div className="flex flex-wrap gap-2 mb-2">
{maintainer.frameworkExpertise.map((framework) => (
<FrameworkChip key={framework} framework={framework} />
))}
</div>
)}
{maintainer.specialties && maintainer.specialties.length > 0 && (
<div className="flex flex-wrap gap-2">
{maintainer.specialties.map((specialty) => (
<SpecialtyChip key={specialty} specialty={specialty} />
))}
</div>
)}
</div>
</div>
</a>
<div className="p-3 space-y-2">
<div className="flex items-center justify-between">
<span
className="text-base font-bold"
id={`maintainer-name-${maintainer.github}`}
>
{maintainer.name}
</span>
<div className="flex items-center gap-2">
{libraryId && (
<RoleBadge maintainer={maintainer} libraryId={libraryId} />
)}
</div>
</div>
{!hideLibraries && !libraryId && libraries.length > 0 && (
<div className="flex flex-wrap gap-1.5 pt-1">
{libraries
.slice(0, showAllLibraries ? undefined : 2)
.map((library) => (
<LibraryBadge key={library.id} library={library} />
))}
{!showAllLibraries && libraries.length > 2 && (
<button
onClick={(e) => {
e.preventDefault()
e.stopPropagation()
setShowAllLibraries(true)
}}
className="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-colors focus:outline-none focus:ring-2 focus:ring-blue-400"
aria-label={`Show ${libraries.length - 2} more libraries`}
tabIndex={0}
type="button"
>
+{libraries.length - 2} more
</button>
)}
</div>
)}
<MaintainerSocialLinks maintainer={maintainer} />
/>
<a
href={`https://github.com/${maintainer.github}`}
target="_blank"
rel="noopener noreferrer"
aria-label={`View ${maintainer.name}'s GitHub profile`}
className="block aspect-square w-full overflow-hidden rounded-[22px] corner-squircle bg-[`#d9d9d9`] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus"
tabIndex={0}
>
{maintainer.avatar ? (
<img
src={maintainer.avatar}
alt=""
loading="lazy"
className="h-full w-full object-cover"
/>
) : null}
</a>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/MaintainerCard.tsx` around lines 401 - 408, Update the GitHub
profile anchor in MaintainerCard to render maintainer.avatar when it is present,
while retaining the gray background as the fallback for missing avatars.
Preserve the existing link, accessibility attributes, and layout styling.

Comment thread src/routes/ds.typography.tsx Outdated
Comment thread src/styles/app.css
Comment on lines +580 to +628
.ds-mode-light {
color-scheme: light;
--color-text-primary: var(--color-ds-neutral-500);
--color-text-secondary: var(--color-ds-neutral-400);
--color-text-muted: var(--color-ds-neutral-300);
--color-text-inverse: #ffffff;
--color-background-default: #ffffff;
--color-background-surface: #ffffff;
--color-background-subtle: #fafafa;
--color-background-inverse: var(--color-ds-neutral-500);
--color-border-default: var(--color-ds-neutral-200);
--color-border-subtle: var(--color-ds-neutral-100);
--color-border-strong: var(--color-ds-neutral-400);
--color-border-focus: var(--color-ds-blue-400);
--color-action-secondary: var(--color-ds-neutral-100);
--color-action-secondary-hover: var(--color-ds-neutral-200);
--color-category-framework: var(--color-ds-green-400);
--color-category-data: var(--color-ds-terracotta-400);
--color-category-ui: var(--color-ds-blue-400);
--color-category-performance: var(--color-ds-amber-400);
--color-category-tooling: var(--color-ds-neutral-400);
--color-surface-state-hover: #1111110f;
--color-surface-state-pressed: #1111111f;
}

.ds-mode-dark {
color-scheme: dark;
--color-text-primary: #ffffff;
--color-text-secondary: #aea691;
--color-text-muted: #756c5b;
--color-text-inverse: #111111;
--color-background-default: #111111;
--color-background-surface: #1f1f1f;
--color-background-subtle: #1b1b1b;
--color-background-inverse: #ffffff;
--color-border-default: #2d2d2d;
--color-border-subtle: #232323;
--color-border-strong: #aea691;
--color-border-focus: #61adbf;
--color-action-secondary: #2b2b2b;
--color-action-secondary-hover: #3a3a3a;
--color-category-framework: var(--color-ds-green-300);
--color-category-data: var(--color-ds-terracotta-300);
--color-category-ui: var(--color-ds-blue-300);
--color-category-performance: var(--color-ds-amber-300);
--color-category-tooling: var(--color-ds-neutral-200);
--color-surface-state-hover: #ffffff1f;
--color-surface-state-pressed: #ffffff29;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

.ds-mode-light doesn't mirror every token html.dark overrides, so dark values bleed into light specimens.

html.dark overrides --color-icon-*, --color-action-primary*, --color-status-*, --color-background-elevated, --color-border-error/success, --color-text-accent, --color-input-bg-hover, --color-menu-item-pressed, and --color-divider-*; .ds-mode-light re-declares only a subset. When the site is in dark mode, a .ds-mode-light preview (e.g. ButtonMode mode="light" in src/routes/ds.buttons.tsx, or icon links using text-icon-muted) still resolves those to the dark values on a white surface. Worth adding the remaining overrides so previews are truly self-contained.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/styles/app.css` around lines 580 - 628, Add the missing light-mode
declarations to .ds-mode-light for every token overridden by html.dark:
--color-icon-*, --color-action-primary*, --color-status-*,
--color-background-elevated, --color-border-error/success, --color-text-accent,
--color-input-bg-hover, --color-menu-item-pressed, and --color-divider-*. Reuse
the existing light-theme token values so components such as ButtonMode and
text-icon-muted remain fully light-themed inside previews.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (3)
src/components/Navbar.tsx (1)

688-705: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Trap focus in the mobile menu and close it cleanly.

The mobile menu overlay does not make data-site-content inert, so keyboard users can tab from MobileNavigation into blurred page content behind it. Add a focus trap/inert behavior for the page content when mobileMenuOpen, and restore focus to the menu trigger when the menu closes. The existing Collapsible implementation only controls the CSS-expanded content, not accessible modal focus management.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/Navbar.tsx` around lines 688 - 705, Update the mobile menu
flow in Navbar and its MobileNavigation trigger handling to treat the open
overlay as a modal: make the data-site-content region inert and excluded from
keyboard focus while mobileMenuOpen, trap focus within the menu, and return
focus to the menu trigger when it closes. Do not rely on the existing
Collapsible behavior, since it only controls visual expansion.
src/styles/app.css (2)

121-122: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the font fallback casing to pass Stylelint.

Stylelint reports SFMono-Regular and Menlo on Line 122 for value-keyword-case. Lowercase these unquoted identifiers.

Proposed fix
-  --font-shop-mono: 'DM Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
+  --font-shop-mono: 'DM Mono', ui-monospace, sfmono-regular, menlo, monospace;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/styles/app.css` around lines 121 - 122, Update the --font-shop-mono
declaration to lowercase the unquoted SFMono-Regular and Menlo fallback
identifiers, preserving the existing font stack and other fallback values.

Source: Linters/SAST tools


1064-1077: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Cover the focus path in reduced-motion mode.

The media query overrides only the :hover selectors. It does not override the :focus-within selectors at Lines 1031-1056. Keyboard activation can therefore retain the normal opacity and blur transitions. Add matching zero-duration rules for :focus-within.

Proposed fix
+  body:has(
+      .ts-mega-trigger-wrap:not([data-menu-dismissed='true']):focus-within
+        > .ts-mega-dropdown
+    )
+    [data-site-menu-tint] {
+    transition: opacity 0s linear 0s;
+  }
+
+  body:has(
+      .ts-mega-trigger-wrap:not([data-menu-dismissed='true']):focus-within
+        > .ts-mega-dropdown
+    )
+    [data-site-content] {
+    transition: filter 0s linear 0s;
+  }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/styles/app.css` around lines 1064 - 1077, Extend the reduced-motion
media-query overrides for the mega menu to include the corresponding
:focus-within selectors alongside the existing :hover selectors. Add
zero-duration transition rules for both [data-site-menu-tint] and
[data-site-content], preserving the existing open-delay behavior and matching
the hover path.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/components/Navbar.tsx`:
- Around line 688-705: Update the mobile menu flow in Navbar and its
MobileNavigation trigger handling to treat the open overlay as a modal: make the
data-site-content region inert and excluded from keyboard focus while
mobileMenuOpen, trap focus within the menu, and return focus to the menu trigger
when it closes. Do not rely on the existing Collapsible behavior, since it only
controls visual expansion.

In `@src/styles/app.css`:
- Around line 121-122: Update the --font-shop-mono declaration to lowercase the
unquoted SFMono-Regular and Menlo fallback identifiers, preserving the existing
font stack and other fallback values.
- Around line 1064-1077: Extend the reduced-motion media-query overrides for the
mega menu to include the corresponding :focus-within selectors alongside the
existing :hover selectors. Add zero-duration transition rules for both
[data-site-menu-tint] and [data-site-content], preserving the existing
open-delay behavior and matching the hover path.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fd0c7e2e-7a10-4a20-9a80-fa6463da4d12

📥 Commits

Reviewing files that changed from the base of the PR and between bda5417 and ff7e2a0.

📒 Files selected for processing (11)
  • src/components/ApplicationStarter.tsx
  • src/components/Navbar.tsx
  • src/components/application-builder/useApplicationBuilder.tsx
  • src/components/ds/DsKit.tsx
  • src/components/ds/ui/index.tsx
  • src/components/landing/LibraryLanding.tsx
  • src/routeTree.gen.ts
  • src/routes/__root.tsx
  • src/routes/ds.typography.tsx
  • src/routes/maintainers.tsx
  • src/styles/app.css
🚧 Files skipped from review as they are similar to previous changes (8)
  • src/routes/maintainers.tsx
  • src/components/application-builder/useApplicationBuilder.tsx
  • src/components/landing/LibraryLanding.tsx
  • src/routes/__root.tsx
  • src/routes/ds.typography.tsx
  • src/components/ds/ui/index.tsx
  • src/components/ApplicationStarter.tsx
  • src/routeTree.gen.ts

@tannerlinsley
tannerlinsley merged commit 7a66e51 into main Aug 1, 2026
7 checks passed
@tannerlinsley
tannerlinsley deleted the codex/update-library-landing-pages branch August 1, 2026 18:08
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.

2 participants