Skip to content

feat(docs): redesign docs site with dark-first brand theme#1178

Open
f-trycua wants to merge 2 commits intomainfrom
docs-redesign
Open

feat(docs): redesign docs site with dark-first brand theme#1178
f-trycua wants to merge 2 commits intomainfrom
docs-redesign

Conversation

@f-trycua
Copy link
Collaborator

@f-trycua f-trycua commented Mar 15, 2026

Summary

  • New dark-first design system: Introduces CDS (Cua Design System) CSS variables for colors, surfaces, and typography — replaces the old sky/emerald Tailwind theme with a cohesive dark-mode palette (--bg-base, --ink-strong, --brand-500, etc.)
  • Redesigned landing page: Updated hero section with glassy shell, grid overlay, GitHub stars badge, gradient CTA buttons ("Get started" / "Try Cua Cloud"), and refreshed nav cards and featured examples
  • Overhauled header & footer: Header is now dark-glass with animated underline nav links and a separated logo-home / docs-switcher UX; footer expanded to a full multi-column layout with brand mark, social links, Y Combinator badge, and site navigation
  • Updated hero component & global styles: Prose typography, sidebar, TOC, code blocks, blockquotes, tables, search dialog, and Radix popover/dialog all re-themed for dark mode consistency
  • New assets: Updated favicon, apple-touch-icon, accent logo SVG, social icons (LinkedIn, X), and hero image; removed old bg-dark/bg-light JPGs
  • Dark mode default: RootProvider now defaults to dark theme; ThemeToggle removed from header

Test plan

  • Verify landing page renders correctly in dark mode (default)
  • Check header navigation links, dropdown switcher, and mobile hamburger
  • Confirm footer layout, social links, and column navigation
  • Test docs content pages — prose styling, code blocks, blockquotes, tables
  • Verify sidebar active states and hover styles
  • Check search dialog styling
  • Test on mobile viewports
  • Confirm favicon and apple-touch-icon display correctly

Summary by CodeRabbit

  • New Features

    • Dark mode set as default theme
    • Redesigned landing page with updated hero section and gradient styling
    • Enhanced footer with new navigation and brand sections
  • Style

    • Updated design system with refined colors, typography, and spacing
    • Improved header styling and navigation appearance
    • Enhanced visual hierarchy and decorative elements across components

Overhaul the docs landing page, header, footer, hero component, and
global CSS to introduce the new Cua Design System (CDS) visual
language — dark-first palette, glassy surfaces, gradient CTAs,
and refined typography.
@vercel
Copy link
Contributor

vercel bot commented Mar 15, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview, Comment Mar 17, 2026 2:33pm

Request Review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 15, 2026

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: aa27c60a-3e30-40a1-8c2f-155da1c48f67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

These changes implement a comprehensive design system overhaul for the documentation site, introducing a dark-mode-first CSS variable system, redesigning the landing page with gradient-driven hero and updated navigation components, refactoring the header with improved dropdown interactions, expanding the footer layout, and establishing consistent border-radius standards across UI elements.

Changes

Cohort / File(s) Summary
Landing & Hero Components
docs/src/app/(landing)/page.tsx, docs/src/components/hero.tsx
Major landing page restructure with simplified gradient-driven hero, updated nav cards and featured examples sections, new CTAs ("Get started", "Try Cua Cloud"), and revised container styling. Hero component replaces SVG patterns and glow elements with decorative blurred elements and new shell container classes.
Design System & Typography
docs/src/app/global.css, docs/src/app/layout.tsx
Comprehensive CSS variable system introduction with dark-mode theming, updated interactive element styling, rich component rules for CDS elements (cards, buttons, code blocks, dropdowns, pills), prose formatting, and expanded Urbanist font configuration with weights and italic styles.
Navigation & Header Components
docs/src/components/custom-header.tsx, docs/src/components/footer.tsx
Header restructured with redesigned docs switcher, new dropdown interactions, refreshed right-side controls, and icon button styling updates. Footer completely refactored into branded left section, multi-column layout (Product, Resources, Company), social icons, and bottom information bar.
Component Styling Polish
docs/src/providers/copilotkit-provider.tsx
Border-radius consistency adjustments across Copilot UI elements, copy buttons, chat input, popup panels, and scroll controls, standardizing radii to 10px and 16px values.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 A hop through the design system's grand hall,
CSS variables now answer the call!
Dark modes and gradients, a footer so tall,
Fresh headers and heroes—we've refactored it all!
With border-radius whispers, our UI stands proud,
The docs are redesigned, oh what a crowd!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: a comprehensive redesign of the docs site implementing a dark-first design system with new branding.

✏️ 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 docs-redesign
📝 Coding Plan
  • Generate coding plan for human review comments

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 and usage tips.

Tip

You can validate your CodeRabbit configuration file in your editor.

If your editor has YAML language server, you can enable auto-completion and validation by adding # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json at the top of your CodeRabbit configuration file.

Copy link
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

Caution

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

⚠️ Outside diff range comments (1)
docs/src/components/custom-header.tsx (1)

216-278: ⚠️ Potential issue | 🟡 Minor

Add keyboard accessibility for dropdown menu.

The dropdown opens on click and closes when clicking outside, but lacks keyboard support:

  • No Escape key handler to close the dropdown
  • No focus trapping within the dropdown when open
  • No aria-expanded attribute on the trigger button

Consider adding these accessibility enhancements:

♿ Proposed accessibility improvements
 <button
   onClick={() => setIsOpen(!isOpen)}
+  aria-expanded={isOpen}
+  aria-haspopup="true"
   className="ml-0.5 flex h-7 w-7 items-center justify-center rounded-lg border border-transparent text-[var(--ink-muted)] transition-colors hover:border-white/10 hover:bg-white/5 hover:text-white"
   aria-label="Switch docs site"
 >

And add an effect to handle Escape key:

useEffect(() => {
  function handleKeyDown(event: KeyboardEvent) {
    if (event.key === 'Escape' && isOpen) {
      setIsOpen(false);
    }
  }
  document.addEventListener('keydown', handleKeyDown);
  return () => document.removeEventListener('keydown', handleKeyDown);
}, [isOpen]);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/components/custom-header.tsx` around lines 216 - 278, The dropdown
lacks keyboard accessibility: add an Escape key handler, focus trapping while
open, and aria-expanded on the toggle. Implement a useEffect that adds a keydown
listener which calls setIsOpen(false) when event.key === 'Escape' and isOpen is
true (attach/detach on mount/unmount and when isOpen changes), add refs for the
trigger button and dropdown container and on open move focus to the first
focusable element in the dropdown, then intercept Tab/Shift+Tab keydowns inside
the dropdown to cycle focus (wrap to first/last) to create a simple focus trap,
and set aria-expanded={isOpen} on the toggle button that opens the menu (the
same element that toggles isOpen). Ensure all listeners and refs are cleaned up
and use the existing isOpen and setIsOpen symbols to close the menu.
🧹 Nitpick comments (4)
docs/src/providers/copilotkit-provider.tsx (1)

561-577: Fragile CSS selectors for CopilotKit components.

Several selectors rely on class name substring matching (e.g., [class*="copilotKitPopup"], [class*="ScrollToBottom"]) which may break if CopilotKit updates its internal class naming conventions. Consider adding a comment noting this coupling to aid future maintainers.

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

In `@docs/src/providers/copilotkit-provider.tsx` around lines 561 - 577, The CSS
uses fragile substring class selectors like [class*="copilotKitPopup"],
[class*="ScrollToBottom"], and [class*="scrollToBottom"] which couple our styles
to CopilotKit internal class names; update the file to add a clear comment above
the block referencing .copilotKitPopup, .copilotKitButton, and the scroll
selectors explaining this coupling and the risk of breakage if CopilotKit
renames classes, and include guidance to prefer using a stable hook or wrapper
class (or to re-evaluate after any CopilotKit upgrade) so future maintainers
know why these selectors exist and what to change if they break.
docs/src/app/layout.tsx (1)

22-27: Consider reducing font weight variants to optimize bundle size.

Loading 6 weights (100, 300, 400, 500, 600, 700) plus italic styles significantly increases the font payload. If the design only uses a subset (e.g., 400, 500, 600, 700 appear most common in the PR), consider trimming unused weights.

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

In `@docs/src/app/layout.tsx` around lines 22 - 27, The Urbanist font import is
currently loading many weight and style variants which bloats payload; update
the Urbanist(...) call (the urbanist constant created via Urbanist) to only
include the weights and styles actually used (e.g., reduce weight list to
['400','500','600','700'] and remove unused styles like 'italic' if not used) so
the font bundle is trimmed; adjust the variable '--font-urbanist' usage remains
unchanged and verify any components relying on lighter weights still render
correctly after removing unused variants.
docs/src/app/global.css (1)

104-113: High z-index on noise overlay may cause accessibility issues.

The fixed overlay with z-index: 9999 could potentially cover interactive elements like modals, tooltips, or the CopilotKit popup (which uses z-index: 9999 in copilotkit-provider.tsx). Consider lowering to a more reasonable value like z-index: 1 since pointer-events: none ensures it won't block interactions, but stacking context issues could still arise.

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

In `@docs/src/app/global.css` around lines 104 - 113, The overlay created by the
.dark body::after selector uses z-index: 9999 which can conflict with
interactive components (e.g., CopilotKit popup that also uses z-index: 9999 in
copilotkit-provider.tsx); lower the overlay z-index to a much smaller value (for
example z-index: 1 or 0) while keeping pointer-events: none and position: fixed
so it visually sits behind UI elements but still shows the noise texture without
affecting stacking of modals/tooltips/popups.
docs/src/app/(landing)/page.tsx (1)

110-113: Hardcoded GitHub star count will become stale.

The star count 13.1k is hardcoded. Consider fetching this dynamically via GitHub API or removing it to avoid displaying outdated information.

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

In `@docs/src/app/`(landing)/page.tsx around lines 110 - 113, The span containing
the hardcoded "13.1k" (the JSX element immediately after the star SVG in
page.tsx) will become stale; replace it with a dynamic value by fetching the
repository's stargazer count (e.g., call GitHub REST API GET
/repos/{owner}/{repo} and use the stargazers_count field) and render that value
(or a formatted shorthand) instead, or remove the span entirely if you don't
want live data; implement the fetch in a server-side data call or a client
useEffect/state depending on whether this page is an SSR/SSG or client component
and update the JSX to display the fetched value in place of the hardcoded text.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/src/app/`(landing)/page.tsx:
- Around line 152-153: The div with className containing
"group-hover:opacity-150" uses an invalid opacity value; replace the invalid
utility with a valid Tailwind opacity or a different hover effect: e.g., change
"group-hover:opacity-150" to "group-hover:opacity-100" (maps to opacity:1) or
remove the opacity change and implement "group-hover:brightness-125",
"group-hover:scale-105", or adjust the radial gradient colors in a hover variant
to increase glow intensity; target the div whose className includes "absolute
-inset-6 bg-[radial-gradient(...)] blur-2xl transition-opacity duration-300
group-hover:opacity-150" when making the fix.

---

Outside diff comments:
In `@docs/src/components/custom-header.tsx`:
- Around line 216-278: The dropdown lacks keyboard accessibility: add an Escape
key handler, focus trapping while open, and aria-expanded on the toggle.
Implement a useEffect that adds a keydown listener which calls setIsOpen(false)
when event.key === 'Escape' and isOpen is true (attach/detach on mount/unmount
and when isOpen changes), add refs for the trigger button and dropdown container
and on open move focus to the first focusable element in the dropdown, then
intercept Tab/Shift+Tab keydowns inside the dropdown to cycle focus (wrap to
first/last) to create a simple focus trap, and set aria-expanded={isOpen} on the
toggle button that opens the menu (the same element that toggles isOpen). Ensure
all listeners and refs are cleaned up and use the existing isOpen and setIsOpen
symbols to close the menu.

---

Nitpick comments:
In `@docs/src/app/`(landing)/page.tsx:
- Around line 110-113: The span containing the hardcoded "13.1k" (the JSX
element immediately after the star SVG in page.tsx) will become stale; replace
it with a dynamic value by fetching the repository's stargazer count (e.g., call
GitHub REST API GET /repos/{owner}/{repo} and use the stargazers_count field)
and render that value (or a formatted shorthand) instead, or remove the span
entirely if you don't want live data; implement the fetch in a server-side data
call or a client useEffect/state depending on whether this page is an SSR/SSG or
client component and update the JSX to display the fetched value in place of the
hardcoded text.

In `@docs/src/app/global.css`:
- Around line 104-113: The overlay created by the .dark body::after selector
uses z-index: 9999 which can conflict with interactive components (e.g.,
CopilotKit popup that also uses z-index: 9999 in copilotkit-provider.tsx); lower
the overlay z-index to a much smaller value (for example z-index: 1 or 0) while
keeping pointer-events: none and position: fixed so it visually sits behind UI
elements but still shows the noise texture without affecting stacking of
modals/tooltips/popups.

In `@docs/src/app/layout.tsx`:
- Around line 22-27: The Urbanist font import is currently loading many weight
and style variants which bloats payload; update the Urbanist(...) call (the
urbanist constant created via Urbanist) to only include the weights and styles
actually used (e.g., reduce weight list to ['400','500','600','700'] and remove
unused styles like 'italic' if not used) so the font bundle is trimmed; adjust
the variable '--font-urbanist' usage remains unchanged and verify any components
relying on lighter weights still render correctly after removing unused
variants.

In `@docs/src/providers/copilotkit-provider.tsx`:
- Around line 561-577: The CSS uses fragile substring class selectors like
[class*="copilotKitPopup"], [class*="ScrollToBottom"], and
[class*="scrollToBottom"] which couple our styles to CopilotKit internal class
names; update the file to add a clear comment above the block referencing
.copilotKitPopup, .copilotKitButton, and the scroll selectors explaining this
coupling and the risk of breakage if CopilotKit renames classes, and include
guidance to prefer using a stable hook or wrapper class (or to re-evaluate after
any CopilotKit upgrade) so future maintainers know why these selectors exist and
what to change if they break.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f8b678b5-f00c-4ed1-a2c3-5f2979c36d52

📥 Commits

Reviewing files that changed from the base of the PR and between 57b3598 and 0856473.

⛔ Files ignored due to path filters (11)
  • docs/public/apple-touch-icon.png is excluded by !**/*.png
  • docs/public/favicon.ico is excluded by !**/*.ico
  • docs/public/favicon.png is excluded by !**/*.png
  • docs/public/img/bg-dark.jpg is excluded by !**/*.jpg
  • docs/public/img/bg-light.jpg is excluded by !**/*.jpg
  • docs/public/img/cua-logo-accent.svg is excluded by !**/*.svg
  • docs/public/img/cua_logo_white_new.svg is excluded by !**/*.svg
  • docs/public/img/hero.png is excluded by !**/*.png
  • docs/public/img/logos/linkedin-white.svg is excluded by !**/*.svg
  • docs/public/img/logos/x-white.svg is excluded by !**/*.svg
  • docs/src/app/favicon.ico is excluded by !**/*.ico
📒 Files selected for processing (7)
  • docs/src/app/(landing)/page.tsx
  • docs/src/app/global.css
  • docs/src/app/layout.tsx
  • docs/src/components/custom-header.tsx
  • docs/src/components/footer.tsx
  • docs/src/components/hero.tsx
  • docs/src/providers/copilotkit-provider.tsx

Comment on lines +152 to +153
>
<div className="absolute -inset-6 bg-[radial-gradient(circle,rgba(97,188,255,0.18),rgba(88,200,190,0.06),transparent_72%)] blur-2xl transition-opacity duration-300 group-hover:opacity-150" />
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Invalid opacity value in hover state.

hover:opacity-150 is invalid CSS—opacity values range from 0 to 1 (or 0% to 100%). This will be ignored by the browser. If you want to increase brightness/glow on hover, consider using a different approach.

🐛 Proposed fix
-<div className="absolute -inset-6 bg-[radial-gradient(circle,rgba(97,188,255,0.18),rgba(88,200,190,0.06),transparent_72%)] blur-2xl transition-opacity duration-300 group-hover:opacity-150" />
+<div className="absolute -inset-6 bg-[radial-gradient(circle,rgba(97,188,255,0.18),rgba(88,200,190,0.06),transparent_72%)] blur-2xl opacity-70 transition-opacity duration-300 group-hover:opacity-100" />

Or to increase the glow intensity, adjust the gradient colors directly in a hover state variant.

📝 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
>
<div className="absolute -inset-6 bg-[radial-gradient(circle,rgba(97,188,255,0.18),rgba(88,200,190,0.06),transparent_72%)] blur-2xl transition-opacity duration-300 group-hover:opacity-150" />
>
<div className="absolute -inset-6 bg-[radial-gradient(circle,rgba(97,188,255,0.18),rgba(88,200,190,0.06),transparent_72%)] blur-2xl opacity-70 transition-opacity duration-300 group-hover:opacity-100" />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/app/`(landing)/page.tsx around lines 152 - 153, The div with
className containing "group-hover:opacity-150" uses an invalid opacity value;
replace the invalid utility with a valid Tailwind opacity or a different hover
effect: e.g., change "group-hover:opacity-150" to "group-hover:opacity-100"
(maps to opacity:1) or remove the opacity change and implement
"group-hover:brightness-125", "group-hover:scale-105", or adjust the radial
gradient colors in a hover variant to increase glow intensity; target the div
whose className includes "absolute -inset-6 bg-[radial-gradient(...)] blur-2xl
transition-opacity duration-300 group-hover:opacity-150" when making the fix.

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