Skip to content

Feature/dark mode#927

Merged
dan13ram merged 19 commits into
BuilderOSS:stagingfrom
xSatori:feature/dark-mode
May 5, 2026
Merged

Feature/dark mode#927
dan13ram merged 19 commits into
BuilderOSS:stagingfrom
xSatori:feature/dark-mode

Conversation

@xSatori
Copy link
Copy Markdown
Collaborator

@xSatori xSatori commented Apr 15, 2026

Description

This branch implements and polishes dark mode support across the app.

Changes include:

  • App-wide dark mode
  • Theme toggle and header/nav adjustments for better contrast and visual consistency
  • Dark mode styling for bridge, dashboard, profile, and playground surfaces
  • Dark-mode-aware hero SVGs on the home page
  • Dark modal and feed filter UI treatment for the customize feed flow
  • Shared DAO card border cleanup so cards render correctly in dark and light contexts
  • Supporting CSS/dist updates in shared UI packages so consumers pick up the new theme behavior

Motivation & context

Dark mode was requested in the UX enhancement discussions in January. This change implements dark mode and makes it visually coherent across the main app flows.

See: #830

Code review

Notes for review:

  • Theme detection for the homepage hero happens before first paint so the correct SVGs render immediately
  • Bridge and playground styling changes were intentionally scoped to dark mode and shared component tokens
  • Feed customization and modal updates were made in shared UI packages so downstream screens inherit the fix
  • Shared DAO card border styling was reverted from a hardcoded dark value back to the design token to keep mobile and desktop borders aligned

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)

Checklist

  • I have done a self-review of my own code
  • Any new and existing tests pass locally with my changes
  • My changes generate no new warnings (lint warnings, console warnings, etc)

Summary by CodeRabbit

  • New Features

    • Added dark mode support with theme toggle in navigation
    • Enhanced keyboard navigation and accessibility for dropdown menus
    • Improved mobile navigation experience with sticky action bars
  • Bug Fixes

    • Unified color system across light and dark modes for consistent theming
  • Style

    • Redesigned visual themes with centralized color tokens
    • Updated icon styling and naming conventions
    • Refined component styling in dark and light modes

xSatori added 4 commits April 13, 2026 22:42
Update dark-mode hover selectors and apply minor formatting/import tweaks.

- Change dark-mode hover rules in CustomDaoSelector.css.ts and FeedFiltersModal.css.ts to use the combined selector 'html[data-theme-mode="dark"] &:hover' so hover styles apply correctly in dark theme.
- Reorder imports in apps/subgraph/src/utils/parseDaoMetadata.ts (no behavior change).
- Adjust imports and JSX formatting in apps/web/src/modules/home/Marquee.tsx (add darkWord/lightWord imports and multiline Image props for readability).
- Move CSS import and collapse Stack props to a single line in apps/web/src/pages/bridge.tsx (formatting only).
Replace hard-coded border color values in packages/dao-ui/src/components/DaoCard/DaoCard.css.ts with theme.colors.border to ensure consistent theming across the component. The hover borderColor was updated accordingly; no other behavior changes.
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 15, 2026

@xSatori is attempting to deploy a commit to the Nouns Builder Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 15, 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

This PR introduces comprehensive dark mode support via a centralized theme system with CSS variables, migrates icon identifiers from camelCase to kebab-case naming, and replaces hardcoded colors throughout the codebase with design-system theme tokens. It adds a theme provider, theme toggle UI, and updates styling across layouts, navigation, and UI components to be theme-aware. The icon system is also standardized with kebab-case keys and documentation guidelines.

Changes

Dark Mode & Theme System

Layer / File(s) Summary
Theme Foundation & Initialization
apps/web/src/theme/theme.ts, apps/web/src/theme/AppThemeProvider.tsx
New ThemeMode type ('light' | 'dark'), THEME_STORAGE_KEY constant, and useThemeMode() hook. AppThemeProvider manages theme state, applies theme via DOM attributes/body classes, and persists to localStorage.
Document & App-Level Setup
apps/web/src/pages/_document.tsx, apps/web/src/pages/_app.tsx
_document.tsx initializes theme at load time via inline scripts reading localStorage and setting documentElement.dataset.themeMode. _app.tsx wraps layout with AppThemeProvider and updates NextNProgress to use theme-based colors.
Global CSS Variables
apps/web/src/styles/globals.css, apps/web/src/styles/flatpickr-theme.css, apps/web/src/styles/react-mde-theme.css
Root CSS variables define theme-aware link, button, and plugin colors with dark-mode overrides. New Flatpickr and React MDE theme files style date pickers and markdown editors using design tokens.
Zord Theme Updates
packages/zord/src/theme.css.ts, packages/zord/src/elements/Button.css.ts
Base dark-theme background updated from #000000 to #1f2024. Select/option styling uses theme tokens. Button focus styling adopts theme accent color.
Navigation & Layout Dark Mode
apps/web/src/layouts/CreateDaoLayout/Nav.styles.css.ts, apps/web/src/layouts/CreateDaoLayout/Nav.tsx, apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts, apps/web/src/layouts/DefaultLayout/Nav.tsx
Nav styles add dark-mode token overrides for all buttons/menus. navLogoGlyph inverts logo in dark mode via CSS filter. Nav.tsx components apply new glyph class and remove hardcoded fill props.
Navigation Menu & Theme Toggle
apps/web/src/layouts/DefaultLayout/NavMenu/NavMenu.tsx, apps/web/src/layouts/DefaultLayout/NavMenu/ThemeToggle.tsx, apps/web/src/layouts/DefaultLayout/NavMenu/ChainMenu.tsx, apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
ThemeToggle component added with sun/moon icon, accessibility attributes, and mount state to prevent hydration mismatch. NavMenu renders toggle. ChainMenu and ProfileMenu apply navPopUpWrapper styling and use theme-based colors.
Footer & Home Layout Theming
apps/web/src/layouts/HomeLayout/Footer.css.ts, apps/web/src/layouts/HomeLayout/Footer.tsx
Footer background/text/button colors switch to theme tokens. New homeFooterWrapper, homeFooterSocialIcon styles with dark-mode selectors. Twitter icon id changed to 'x'.
Component Color Migration (Explore, Dashboard, Profiles)
apps/web/src/modules/explore/ExploreToolbar.tsx, apps/web/src/modules/explore/SearchInput.css.ts, apps/web/src/modules/dashboard/*, apps/web/src/styles/profile.css.ts, apps/web/src/pages/about.tsx, apps/web/src/pages/bridge.tsx, apps/web/src/styles/bridge.css.ts
Hardcoded hex colors in component stylesheets and inline styles replaced with vars.color.* tokens. Includes focus-visible outline styling using accent color. Bridge card and action button styles centralized to CSS.
Home Page & Marquee Dark Support
apps/web/src/modules/home/Marquee.css.ts, apps/web/src/modules/home/Marquee.tsx, apps/web/src/modules/home/Home.css.ts, apps/web/src/modules/home/Homepage.css.ts, apps/web/src/styles/about.css.ts
New dark-mode SVG variants and lightWord/darkWord/lightWhy/darkWhy CSS classes toggle visibility. Marquee renders paired light/dark images. Button hover colors use theme tokens.
Package UI Components
packages/ui/src/Fields/*, packages/ui/src/Toggle/Toggle.css.ts, packages/ui/src/Panel/Panel.css.ts, packages/ui/src/Uploading/Uploading.css.ts, packages/ui/src/SingleImageUpload/SingleImageUpload.css.ts, packages/ui/src/DropdownSelect/DropdownSelect.css.ts, packages/ui/src/Tooltip/Tooltip.tsx, packages/ui/src/Graph/BaseGraph.tsx, packages/ui/src/Graph/StreamGraph.tsx
Input, toggle, panel, uploading, and upload feedback styling use theme tokens. DropdownSelect shadow uses theme shadow token. Tooltip trigger uses focus-visible events, is keyboard-focusable, and changes icon/label. Graph stroke colors derive from tokens.
Zord & DAO/Auction/Proposal UI
packages/zord/src/elements/Button.css.ts, packages/dao-ui/src/components/DaoCard/DaoCard.css.ts, packages/dao-ui/src/components/Activity/Activity.css.ts, packages/dao-ui/src/components/*, packages/auction-ui/src/components/Auction.css.ts, packages/auction-ui/src/components/AuctionChart/AuctionGraph.tsx, packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts, packages/proposal-ui/src/components/ProposalActions/*
Widespread color token adoption across card borders, buttons, chart fills, vote styling, and proposal action colors. Dark-mode selectors added where needed. Icon colors derive from tokens.
Create DAO/Proposal UI Theming
packages/create-dao-ui/src/components/*, packages/create-proposal-ui/src/components/*
Navigation, form fields, checkboxes, button styling, and preview panels all switch to vars.color tokens. Dark-mode selectors introduced for theme-aware hover/backgrounds. Helper text and warning callouts use theme-derived color-mix.
Feed UI Theming
packages/feed-ui/src/CustomDaoSelector.css.ts, packages/feed-ui/src/FeedFiltersModal.css.ts, packages/feed-ui/src/SearchInput.css.ts, packages/feed-ui/src/Feed.css.ts
Dark-mode selectors extend search input, filter modals, DAO items, and feed cards. Code/blockquote styling uses theme tokens via color-mix. Focus-visible outlines added.
Tests & Documentation
packages/zord/ICONS.md
Icon standards documentation added (directory structure, naming, color requirements).

Icon System Migration

Layer / File(s) Summary
Icon Asset Registry
packages/zord/src/icons.ts, packages/zord/ICONS.md
Icon keys standardized to kebab-case (e.g., arrowLeft'arrow-left', checkInCircle'check-in-circle'). twitter key removed in favor of 'x'. Icon documentation added with naming/usage standards.
Icon Usage Updates Across Apps
apps/web/src/components/*, apps/web/src/modules/*, packages/ui/src/*, packages/dao-ui/src/*, packages/auction-ui/src/*, packages/proposal-ui/src/*, packages/create-dao-ui/src/*, packages/create-proposal-ui/src/*
All component references to icon IDs updated from camelCase to kebab-case (e.g., chevronDown'chevron-down', arrowTopRight'arrow-top-right', heartFilled'heart-filled'). Affects navigation, buttons, disclosure triangles, copy/success indicators, pagination, social links, and form controls.
Utilities & DAO Metadata
packages/utils/src/daoMetadata.ts
mapDaoLinkKeyToIcon returns 'x' instead of 'twitter' when link key is 'x'.
Component Cleanup
packages/zord/src/elements/Select.tsx, packages/zord/src/elements/index.ts
Native Select component removed; consumers migrate to DropdownSelect for better UX.
DropdownSelect & Form Fields
packages/ui/src/DropdownSelect/DropdownSelect.tsx, packages/ui/src/Fields/Select.tsx, packages/proposal-ui/src/components/PropDates/PropDateForm.tsx, packages/auction-ui/src/components/AuctionChart/AuctionChart.tsx
DropdownSelect component enhanced with ARIA attributes (listbox semantics, keyboard navigation ArrowUp/Down/Home/End, Enter/Space to select, Escape to close). Form Select wired to DropdownSelect with string-based value handling. Milestone and sort menus migrated to DropdownSelect.
Shared Vote Label Component
packages/proposal-ui/src/components/VoteLabel/VoteLabel.tsx, packages/proposal-ui/src/components/VoteLabel/index.ts, packages/proposal-ui/src/components/index.ts, packages/feed-ui/src/Modals/VoteModalWrapper.tsx, packages/proposal-ui/src/components/ProposalActions/VoteStatus/Vote.tsx
New VoteLabel component centralizes vote text styling (positive for FOR, negative for AGAINST, abstain message). Proposal vote displays and feed vote modals refactored to use VoteLabel.
Tile Hover & ProposalDetails
packages/proposal-ui/src/components/ProposalDetailsGrid/Tile.css.ts, packages/proposal-ui/src/components/ProposalDetailsGrid/Tile.tsx, packages/proposal-ui/src/components/ProposalDetailsGrid/ProposalDetailsGrid.tsx
New proposalTileHover CSS class adds cursor and theme-based hover background. Tile component accepts optional className prop. Snapshot tile wired with hover styling.
Icon & Color Updates (Secondary)
packages/dao-ui/src/styles/About.css.ts, packages/proposal-ui/src/components/TransactionTypeIcon/TransactionTypeIcon.tsx, packages/proposal-ui/src/constants/transactionTypes.ts, packages/ui/src/Artwork/LayerOrdering.tsx, packages/ui/src/CoinForm/*, packages/ui/src/ContractLink/ContractLink.tsx
Icon hover animations and theme-based icon fills added. Transaction type icon backdrops use theme color-mix with new iconBackdrop helper. LayerOrdering drag shadow uses design-system prop. CoinForm inputs use theme border/background tokens.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Browser
    participant _document as _document.tsx<br/>(Theme Init)
    participant _app as _app.tsx<br/>(App Setup)
    participant AppThemeProvider
    participant Component as Navigation &<br/>Components
    participant Storage as localStorage

    User->>Browser: Load app
    Browser->>_document: Execute inline script
    _document->>Storage: Read THEME_STORAGE_KEY
    Storage-->>_document: Return saved theme or null
    _document->>_document: Determine theme from<br/>localStorage or<br/>prefers-color-scheme
    _document->>Browser: Set documentElement<br/>dataset.themeMode &<br/>style.colorScheme
    _document->>Browser: Apply body class<br/>(lightTheme or darkTheme)
    Browser->>_app: App hydration begins
    _app->>AppThemeProvider: Initialize with theme mode
    AppThemeProvider->>AppThemeProvider: Read initial theme<br/>from documentElement
    AppThemeProvider->>Component: Provide context<br/>(mode, toggleMode)
    User->>Component: Click theme toggle
    Component->>AppThemeProvider: Call toggleMode()
    AppThemeProvider->>AppThemeProvider: Switch mode<br/>(light ↔ dark)
    AppThemeProvider->>Browser: Apply documentElement<br/>attributes & body classes
    AppThemeProvider->>Storage: Persist mode to<br/>localStorage
    Browser-->>User: UI updates with<br/>new theme colors
Loading
sequenceDiagram
    participant Dev as Developer/<br/>File System
    participant Build as Build Pipeline
    participant Registry as Icon Registry<br/>(icons.ts)
    participant Component as UI Component
    participant Icon as Icon Component

    Dev->>Build: Reference icon by<br/>kebab-case ID<br/>(e.g., 'arrow-left')
    Build->>Registry: Look up icon ID
    Registry-->>Build: Return SVG asset
    Build->>Component: Bundle icon into<br/>component
    Component->>Icon: Pass id prop<br/>'arrow-left'
    Icon->>Icon: Resolve from<br/>icons mapping
    Icon->>Icon: Apply fill/color<br/>from props or<br/>theme tokens
    Icon-->>Component: Render SVG with<br/>theme-aware fill
    Component-->>Dev: Icon appears<br/>with correct<br/>styling
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

This PR is substantial and touches nearly every part of the codebase with multiple independent concerns:

  • Heterogeneous changes: Dark mode support (CSS variables, selectors, component updates), icon system overhaul (registry changes, usage updates across 50+ files), color token migration (replacing hardcoded colors in 80+ files), accessibility improvements (ARIA attributes, focus management), and component enhancements (DropdownSelect, VoteLabel, theme provider).
  • High logic density: Theme initialization (localStorage, DOM manipulation, context management), theme provider with memo optimization and side effects, keyboard navigation in DropdownSelect, and complex dark-mode selector patterns.
  • Multi-pattern spread: Not mechanical refactoring—each file update has unique logic (some are CSS token swaps, others are component restructuring, icon ID changes, or new feature additions).
  • Scope: 100+ files affected with new exports, removed exports, signature updates, and new files introduced (AppThemeProvider, ThemeToggle, VoteLabel, Flatpickr/MDE themes, ICONS.md).

Review requires understanding theme initialization, CSS variable scoping, dark-mode selector semantics, icon mapping, ARIA patterns, and component-level changes across multiple domains (layouts, navigation, forms, dashboards, proposals, auctions).

Possibly related PRs

  • BuilderOSS/nouns-builder#705: Both PRs modify the icon system, renaming icon IDs to kebab-case and updating icon imports/usage throughout the codebase.
  • BuilderOSS/nouns-builder#726: Both PRs modify apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx, restructuring the profile menu layout and mobile fullscreen UI.
  • BuilderOSS/nouns-builder#940: Both PRs modify packages/zord/src/icons.ts, standardizing icon keys and managing the icon registry.

Poem

🐰 Whisker-twitching at the darkness deep,
We bring the light to toggle sleep!
Icons dance in dashes bold,
Colors shift from new to old,
Theme by theme, we paint it right—
Dark and day in perfect flight! ✨🌙

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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: 5

🧹 Nitpick comments (10)
packages/dao-ui/src/components/DaoCard/DaoCard.css.ts (1)

37-39: Consider removing redundant hover selector.

The hover selector explicitly sets borderColor to theme.colors.border, which is the same value as the base state (line 33). Unless this is needed for CSS specificity reasons, this selector appears redundant.

♻️ Proposed refactor to remove redundant hover state
 export const border = style({
   border: `2px solid ${theme.colors.border}`,
   transition: 'all 0.15s ease-in-out',
   borderTop: 'none',
-  selectors: {
-    [`${card}:hover &`]: {
-      borderColor: theme.colors.border,
-    },
-  },
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/dao-ui/src/components/DaoCard/DaoCard.css.ts` around lines 37 - 39,
The hover selector [`${card}:hover &`] in DaoCard.css.ts redundantly sets
borderColor to theme.colors.border which matches the base state on the same
element; remove the entire hover rule (the block that sets borderColor) from the
styles to avoid duplication, unless you require increased CSS specificity—in
that case keep a comment explaining the specificity need or change the hover
value to a distinct color; target the selector named card / the rule that sets
borderColor to theme.colors.border when editing.
packages/feed-ui/src/CustomDaoSelector.css.ts (2)

182-185: Dark override for sectionTitle is redundant.

Base color and dark override are both vars.color.text1, so this selector can be removed for clarity.

🧹 Cleanup diff
 export const sectionTitle = style({
   fontSize: '14px',
   fontWeight: 600,
   color: vars.color.text1,
-  selectors: {
-    'html[data-theme-mode="dark"] &': {
-      color: vars.color.text1,
-    },
-  },
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/feed-ui/src/CustomDaoSelector.css.ts` around lines 182 - 185, The
dark-mode selector override for sectionTitle is redundant because both the base
style and the override use vars.color.text1; remove the
'html[data-theme-mode="dark"] &' block under the selectors for sectionTitle (the
stanza that sets color: vars.color.text1) so only the base color remains,
keeping the styleset concise and clear.

33-35: Consider replacing repeated hardcoded dark values with tokens.

The current styles are valid, but these literals will be harder to keep aligned with system-wide palette changes.

♻️ Example tokenized direction
'html[data-theme-mode="dark"] &': {
-  backgroundColor: '#2a2b31',
-  borderColor: '#4a4d57',
+  backgroundColor: vars.color.background2,
+  borderColor: vars.color.border,
   color: vars.color.text1,
},
@@
'html[data-theme-mode="dark"] &': {
-  backgroundColor: '#2a2b31',
+  backgroundColor: vars.color.background2,
},
'html[data-theme-mode="dark"] &:hover': {
-  backgroundColor: '#3b3e47',
+  backgroundColor: vars.color.neutralHover,
},
@@
'html[data-theme-mode="dark"] &': {
-  backgroundColor: '#2a2b31',
+  backgroundColor: vars.color.background2,
   color: vars.color.text1,
},

Also applies to: 70-74, 141-142

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

In `@packages/feed-ui/src/CustomDaoSelector.css.ts` around lines 33 - 35, Replace
the hardcoded dark hex literals (e.g., backgroundColor: '#2a2b31' and
borderColor: '#4a4d57' and the other occurrences at the ranges you noted) with
the design system tokens exposed in vars (for example use vars.color.* tokens
such as vars.color.surfaceDark, vars.color.background, vars.color.borderMuted or
the most appropriate existing token names) so the styles in CustomDaoSelector
(the style objects that set backgroundColor/borderColor/color) follow the shared
palette; update the same replacements for the other occurrences around lines
70-74 and 141-142 to use vars tokens consistently.
packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts (1)

18-21: Prefer semantic theme tokens over hardcoded dark colors.

This dark override works, but hardcoded values make future theme tuning harder and can drift from token updates.

♻️ Proposed refactor
-import { atoms } from '@buildeross/zord'
+import { atoms, vars } from '@buildeross/zord'
 import { globalStyle, style } from '@vanilla-extract/css'
@@
 globalStyle(`html[data-theme-mode='dark'] ${votePlacardReason} > *`, {
-  backgroundColor: '#5b5b61 !important',
-  color: '#ffffff !important',
+  backgroundColor: `${vars.color.background2} !important`,
+  color: `${vars.color.text1} !important`,
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts`
around lines 18 - 21, The override uses hardcoded hex colors for the dark theme;
replace those literals in the globalStyle targeting html[data-theme-mode='dark']
${votePlacardReason} > * with your semantic theme tokens or CSS variables (e.g.,
the design-system/background and design-system/text-on-dark tokens or
var(--token-...)) so the styles follow theme updates; keep the same selector
(${votePlacardReason} > *) and preserve !important if needed for specificity,
but reference the project’s established token names instead of '#5b5b61' and
'#ffffff'.
apps/web/src/modules/dashboard/CreateActions.css.ts (1)

4-24: Consider centralizing repeated dark hover color constants.

#67676d is now used as a semantic hover surface in multiple places; moving it to a shared theme token/constant would reduce future drift.

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

In `@apps/web/src/modules/dashboard/CreateActions.css.ts` around lines 4 - 24, The
local literal color constant darkButtonHover used in createPostButton (and
duplicated elsewhere) should be replaced with a centralized theme token (e.g.,
add vars.color.hoverSurfaceDark or similar) and all references updated to use
that token; remove the local const darkButtonHover, import the shared vars
object where needed, and update createPostButton (and any other styles using
'#67676d') to reference vars.color.hoverSurfaceDark (or your chosen token name)
including keeping the "!important" suffix in the template string so the behavior
doesn't change.
apps/web/src/modules/home/Marquee.css.ts (1)

19-36: Consider reducing style duplication.

The *Dark variants (UnlockDark, TheDark, etc.) have identical styles to their light counterparts. Since the visual difference comes from the SVG assets, you could simplify by reusing the same class:

// Example: share the same style
export const Unlock = style([baseStyles, getMobileStyle('130px')])
export const UnlockDark = Unlock // alias

However, keeping them separate provides flexibility if dark-mode-specific sizing adjustments are needed later.

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

In `@apps/web/src/modules/home/Marquee.css.ts` around lines 19 - 36, Many of the
dark-mode constants duplicate identical style arrays (e.g., UnlockDark, TheDark,
PossibilitiesDark, OfDark, CollectiveDark, CreationDark) — replace each "*Dark"
export with an alias to its light counterpart (e.g., set UnlockDark to reuse
Unlock) to remove duplication while preserving the original identifiers; keep
the original style-styled consts (Unlock, The, Possibilities, Of, Collective,
Creation, etc.) and assign their corresponding Dark names to reference those
same values so you retain flexibility to change them later if needed.
apps/web/src/styles/bridge.css.ts (1)

4-4: Consider extracting shared dark mode colors.

The darkBridgeHover value '#67676d' matches darkSurfaceHover in Nav.styles.css.ts. Consider extracting dark mode colors to a shared constants file to ensure consistency and ease future maintenance.

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

In `@apps/web/src/styles/bridge.css.ts` at line 4, The color '#67676d' is
duplicated as darkBridgeHover and darkSurfaceHover; extract shared dark-mode
color constants by creating a central export (e.g., DARK_COLORS or
darkModeColors) and move the value into that constant, then import and replace
uses of darkBridgeHover and darkSurfaceHover with the shared constant; update
references in bridge.css.ts and Nav.styles.css.ts (and any other modules) to use
the new exported symbol to ensure consistency and easier maintenance.
apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts (1)

194-207: Inconsistent hardcoded color value.

Line 198 uses hardcoded '#24262c' while other dark mode styles use the defined constants (darkSurface, darkSurfaceHover, darkSurfaceBorder). Consider using a constant for consistency:

♻️ Suggested change
 export const hiddenDaoButton = style({
   background: color.background2,
   selectors: {
     'html[data-theme-mode="dark"] &': {
-      background: '#24262c',
+      background: darkSurface, // or define a new constant if a different shade is intended
     },
     '&:hover': {
       background: color.neutralHover,
     },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts` around lines 194 - 207,
The dark-mode hover background for hiddenDaoButton currently uses a hardcoded
'#24262c'; update hiddenDaoButton's selector 'html[data-theme-mode="dark"] &' to
use the project constant (e.g., darkSurface) instead of the literal string so it
matches other dark-mode styles (darkSurface, darkSurfaceHover,
darkSurfaceBorder) and keeps theming consistent.
apps/web/src/pages/_document.tsx (1)

69-70: Potential flash of light theme for dark mode users.

The <body> element starts with hardcoded ${lightTheme} class. Even though themeBodyClassScript runs immediately to correct it, there may be a brief flash of unstyled/light-theme content before the script executes and removes the class.

Consider removing ${lightTheme} from the initial body class and letting the script add the appropriate theme class:

♻️ Suggested change
-        <body className={`${root} ${baseTheme} ${lightTheme}`} style={{ margin: 0 }}>
+        <body className={`${root} ${baseTheme}`} style={{ margin: 0 }}>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/pages/_document.tsx` around lines 69 - 70, The body currently
includes a hardcoded `${lightTheme}` class which can cause a brief flash of
light theme; remove `${lightTheme}` from the initial <body> class (leave
`${root}` and `${baseTheme}`) and let the client-side `themeBodyClassScript` add
the correct theme class at load time; update any references around `root`,
`baseTheme`, `lightTheme`, and `themeBodyClassScript` so server-rendered markup
does not include `lightTheme` and the script is responsible for applying the
appropriate theme class on the client.
apps/web/src/layouts/HomeLayout/Footer.css.ts (1)

3-5: Consider moving new color literals to shared theme tokens.

There are many new hard-coded hex values in this file. Converging these into shared theme tokens (or at least shared local constants beyond border/surface) will make dark-mode maintenance safer and keep visual consistency across surfaces.

♻️ Incremental cleanup (if token wiring is out of scope for this PR)
 const darkFooterSurface = '#1f2024'
 const darkFooterSurfaceHover = '#34363d'
 const darkFooterBorder = '#4a4d57'
+const darkFooterText = '#ffffff'

 // ...
-      color: '#ffffff',
+      color: darkFooterText,

 // ...
-      color: '#ffffff',
+      color: darkFooterText,

 // ...
-      color: '#ffffff',
+      color: darkFooterText,

Also applies to: 10-11, 21-23, 29-29, 43-43, 56-58, 80-80, 118-118

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

In `@apps/web/src/layouts/HomeLayout/Footer.css.ts` around lines 3 - 5, Replace
the hard-coded hex literals (e.g., darkFooterSurface, darkFooterSurfaceHover,
darkFooterBorder and the other hex values noted at lines ~10-11, 21-23, etc.)
with shared theme tokens: add corresponding color tokens in the central theme or
a shared color constants module (e.g., theme.colors.footer.surfaceDark,
footer.surfaceHoverDark, footer.borderDark) and import those tokens into
Footer.css.ts; if wiring new theme tokens is out of scope, extract the literals
into a shared local constants file (e.g., sharedFooterColors) and consume those
constants from Footer.css.ts so all hex values are centralized and reusable
across components.
🤖 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/modules/dashboard/SingleDaoSelector.css.ts`:
- Around line 35-47: The non-dark hover style is leaking dark colors into light
theme: remove the ':hover' backgroundColor: '#5b5b61' entry from the daoItem
style so the dark-only hover remains scoped under
globalStyle(`html[data-theme-mode='dark'] ${daoItem}:hover`) (or alternatively
add an explicit light-theme hover with the correct light color via a globalStyle
scoped to html[data-theme-mode='light'] ${daoItem}:hover); update the daoItem
definition to omit the dark hover and rely on the existing dark-scoped
globalStyle so dark colors live only in the dark-mode globalStyle.

In `@apps/web/src/styles/globals.css`:
- Line 71: The font-family declaration uses quoted generic and family names
which stylelint flags; update the font-family line in globals.css to remove
quotes around generic and system-family names and only quote the custom family
if necessary (e.g., change "font-family: 'ptRoot', 'Arial', 'Helvetica',
'sans-serif' !important;" to an unquoted list like ptRoot, Arial, Helvetica,
sans-serif !important). Locate the font-family declaration (the font-family: ...
line) and replace it with the corrected, unquoted generic-family names so
stylelint passes.

In `@apps/web/src/styles/profile.css.ts`:
- Around line 64-67: The dark-mode hover for profileDaoLink currently uses the
same color as its base dark state so there’s no visible feedback; update the CSS
rule for 'html[data-theme-mode="dark"] &:hover' in profileDaoLink to use a
distinct backgroundColor and borderColor (different from the base dark values
defined earlier) so hover is perceptible—locate the profileDaoLink style block
and change the hover colors to a slightly lighter or darker shade than the base
dark values to restore visual feedback.

In `@packages/ui/src/Artwork/Artwork.css.ts`:
- Around line 116-119: The rule that sets
globalStyle(`html[data-theme-mode='dark'] ${layerSelectStyle}:focus`, ...)
removes the keyboard focus indicator (outline: 'none'), breaking accessibility;
instead restore a visible, high-contrast focus style for dark mode by removing
the outline: 'none' and applying a replacement focus indicator (e.g., a 2px
solid outline or visible box-shadow using an accessible color) for the same
selector so keyboard users can see focus on elements styled by layerSelectStyle;
update the globalStyle invocation that targets html[data-theme-mode='dark']
${layerSelectStyle}:focus to apply the accessible focus styling rather than
removing it.

In `@packages/ui/src/Modal/Modal.css.ts`:
- Around line 30-34: The dark-mode selector 'html[data-theme-mode="dark"] &'
adds a 1px border only in dark theme which causes layout shift; fix by defining
a matching border in the base style (e.g., set border: 1px solid transparent or
equivalent) for the modal root so the dark selector only changes color, not
dimensions—update the base style where the modal container is defined and leave
the 'html[data-theme-mode="dark"] &' selector (and its background) to only
override the border color to `#4a4d57`.

---

Nitpick comments:
In `@apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts`:
- Around line 194-207: The dark-mode hover background for hiddenDaoButton
currently uses a hardcoded '#24262c'; update hiddenDaoButton's selector
'html[data-theme-mode="dark"] &' to use the project constant (e.g., darkSurface)
instead of the literal string so it matches other dark-mode styles (darkSurface,
darkSurfaceHover, darkSurfaceBorder) and keeps theming consistent.

In `@apps/web/src/layouts/HomeLayout/Footer.css.ts`:
- Around line 3-5: Replace the hard-coded hex literals (e.g., darkFooterSurface,
darkFooterSurfaceHover, darkFooterBorder and the other hex values noted at lines
~10-11, 21-23, etc.) with shared theme tokens: add corresponding color tokens in
the central theme or a shared color constants module (e.g.,
theme.colors.footer.surfaceDark, footer.surfaceHoverDark, footer.borderDark) and
import those tokens into Footer.css.ts; if wiring new theme tokens is out of
scope, extract the literals into a shared local constants file (e.g.,
sharedFooterColors) and consume those constants from Footer.css.ts so all hex
values are centralized and reusable across components.

In `@apps/web/src/modules/dashboard/CreateActions.css.ts`:
- Around line 4-24: The local literal color constant darkButtonHover used in
createPostButton (and duplicated elsewhere) should be replaced with a
centralized theme token (e.g., add vars.color.hoverSurfaceDark or similar) and
all references updated to use that token; remove the local const
darkButtonHover, import the shared vars object where needed, and update
createPostButton (and any other styles using '#67676d') to reference
vars.color.hoverSurfaceDark (or your chosen token name) including keeping the
"!important" suffix in the template string so the behavior doesn't change.

In `@apps/web/src/modules/home/Marquee.css.ts`:
- Around line 19-36: Many of the dark-mode constants duplicate identical style
arrays (e.g., UnlockDark, TheDark, PossibilitiesDark, OfDark, CollectiveDark,
CreationDark) — replace each "*Dark" export with an alias to its light
counterpart (e.g., set UnlockDark to reuse Unlock) to remove duplication while
preserving the original identifiers; keep the original style-styled consts
(Unlock, The, Possibilities, Of, Collective, Creation, etc.) and assign their
corresponding Dark names to reference those same values so you retain
flexibility to change them later if needed.

In `@apps/web/src/pages/_document.tsx`:
- Around line 69-70: The body currently includes a hardcoded `${lightTheme}`
class which can cause a brief flash of light theme; remove `${lightTheme}` from
the initial <body> class (leave `${root}` and `${baseTheme}`) and let the
client-side `themeBodyClassScript` add the correct theme class at load time;
update any references around `root`, `baseTheme`, `lightTheme`, and
`themeBodyClassScript` so server-rendered markup does not include `lightTheme`
and the script is responsible for applying the appropriate theme class on the
client.

In `@apps/web/src/styles/bridge.css.ts`:
- Line 4: The color '#67676d' is duplicated as darkBridgeHover and
darkSurfaceHover; extract shared dark-mode color constants by creating a central
export (e.g., DARK_COLORS or darkModeColors) and move the value into that
constant, then import and replace uses of darkBridgeHover and darkSurfaceHover
with the shared constant; update references in bridge.css.ts and
Nav.styles.css.ts (and any other modules) to use the new exported symbol to
ensure consistency and easier maintenance.

In `@packages/dao-ui/src/components/DaoCard/DaoCard.css.ts`:
- Around line 37-39: The hover selector [`${card}:hover &`] in DaoCard.css.ts
redundantly sets borderColor to theme.colors.border which matches the base state
on the same element; remove the entire hover rule (the block that sets
borderColor) from the styles to avoid duplication, unless you require increased
CSS specificity—in that case keep a comment explaining the specificity need or
change the hover value to a distinct color; target the selector named card / the
rule that sets borderColor to theme.colors.border when editing.

In `@packages/feed-ui/src/CustomDaoSelector.css.ts`:
- Around line 182-185: The dark-mode selector override for sectionTitle is
redundant because both the base style and the override use vars.color.text1;
remove the 'html[data-theme-mode="dark"] &' block under the selectors for
sectionTitle (the stanza that sets color: vars.color.text1) so only the base
color remains, keeping the styleset concise and clear.
- Around line 33-35: Replace the hardcoded dark hex literals (e.g.,
backgroundColor: '#2a2b31' and borderColor: '#4a4d57' and the other occurrences
at the ranges you noted) with the design system tokens exposed in vars (for
example use vars.color.* tokens such as vars.color.surfaceDark,
vars.color.background, vars.color.borderMuted or the most appropriate existing
token names) so the styles in CustomDaoSelector (the style objects that set
backgroundColor/borderColor/color) follow the shared palette; update the same
replacements for the other occurrences around lines 70-74 and 141-142 to use
vars tokens consistently.

In `@packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts`:
- Around line 18-21: The override uses hardcoded hex colors for the dark theme;
replace those literals in the globalStyle targeting html[data-theme-mode='dark']
${votePlacardReason} > * with your semantic theme tokens or CSS variables (e.g.,
the design-system/background and design-system/text-on-dark tokens or
var(--token-...)) so the styles follow theme updates; keep the same selector
(${votePlacardReason} > *) and preserve !important if needed for specificity,
but reference the project’s established token names instead of '#5b5b61' and
'#ffffff'.
🪄 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: 05837b89-4eae-4724-9a5c-a10a43308284

📥 Commits

Reviewing files that changed from the base of the PR and between 5e76275 and 0828889.

⛔ Files ignored due to path filters (6)
  • apps/web/public/home/collective-dark.svg is excluded by !**/*.svg
  • apps/web/public/home/creation-dark.svg is excluded by !**/*.svg
  • apps/web/public/home/of-dark.svg is excluded by !**/*.svg
  • apps/web/public/home/possibilities-dark.svg is excluded by !**/*.svg
  • apps/web/public/home/the-dark.svg is excluded by !**/*.svg
  • apps/web/public/home/unlock-dark.svg is excluded by !**/*.svg
📒 Files selected for processing (36)
  • apps/subgraph/src/utils/parseDaoMetadata.ts
  • apps/web/src/layouts/CreateDaoLayout/Nav.styles.css.ts
  • apps/web/src/layouts/CreateDaoLayout/Nav.tsx
  • apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts
  • apps/web/src/layouts/DefaultLayout/Nav.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ChainMenu.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/NavMenu.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ThemeToggle.tsx
  • apps/web/src/layouts/HomeLayout/Footer.css.ts
  • apps/web/src/layouts/HomeLayout/Footer.tsx
  • apps/web/src/modules/dashboard/CreateActions.css.ts
  • apps/web/src/modules/dashboard/CreateActions.tsx
  • apps/web/src/modules/dashboard/SingleDaoSelector.css.ts
  • apps/web/src/modules/dashboard/UserProfileCard.css.ts
  • apps/web/src/modules/explore/ExploreToolbar.tsx
  • apps/web/src/modules/explore/SearchInput.css.ts
  • apps/web/src/modules/home/Marquee.css.ts
  • apps/web/src/modules/home/Marquee.tsx
  • apps/web/src/pages/_app.tsx
  • apps/web/src/pages/_document.tsx
  • apps/web/src/pages/about.tsx
  • apps/web/src/pages/bridge.tsx
  • apps/web/src/styles/bridge.css.ts
  • apps/web/src/styles/globals.css
  • apps/web/src/styles/profile.css.ts
  • apps/web/src/theme/AppThemeProvider.tsx
  • apps/web/src/theme/theme.ts
  • packages/dao-ui/src/components/DaoCard/DaoCard.css.ts
  • packages/feed-ui/src/CustomDaoSelector.css.ts
  • packages/feed-ui/src/FeedFiltersModal.css.ts
  • packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts
  • packages/ui/src/Artwork/Artwork.css.ts
  • packages/ui/src/Modal/Modal.css.ts
  • packages/ui/src/Playground/LayerMenu.tsx
  • packages/zord/src/theme.css.ts

Comment thread apps/web/src/modules/dashboard/SingleDaoSelector.css.ts
Comment thread apps/web/src/styles/globals.css Outdated
Comment thread apps/web/src/styles/profile.css.ts
Comment thread packages/ui/src/Artwork/Artwork.css.ts Outdated
Comment on lines +30 to +34
selectors: {
'html[data-theme-mode="dark"] &': {
background: '#1f2024',
border: '1px solid #4a4d57',
},
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Prevent theme-switch layout shift caused by dark-only border.

At Line 33, dark mode adds a border that doesn’t exist in the base style. This can subtly change modal box dimensions across themes.

Proposed fix
 export const defaultAnimatedModalContent = style({
   background: '#fff',
+  border: '1px solid transparent',
   maxWidth: 'calc(100vw - 50px)',
   height: 'auto',
   maxHeight: '90vh',
   zIndex: z.MODAL_CONTENT_LAYER,
   selectors: {
     'html[data-theme-mode="dark"] &': {
       background: '#1f2024',
-      border: '1px solid `#4a4d57`',
+      borderColor: '#4a4d57',
     },
   },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/ui/src/Modal/Modal.css.ts` around lines 30 - 34, The dark-mode
selector 'html[data-theme-mode="dark"] &' adds a 1px border only in dark theme
which causes layout shift; fix by defining a matching border in the base style
(e.g., set border: 1px solid transparent or equivalent) for the modal root so
the dark selector only changes color, not dimensions—update the base style where
the modal container is defined and leave the 'html[data-theme-mode="dark"] &'
selector (and its background) to only override the border color to `#4a4d57`.

@dan13ram dan13ram moved this to 🏗️ In Progress in Resident Cycle Apr 15, 2026
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: 7

Caution

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

⚠️ Outside diff range comments (2)
packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts (1)

90-98: ⚠️ Potential issue | 🟡 Minor

Mobile border treatment is inconsistent for the active last step.

flowCircleActive applies a mobile border override, but flowCircleActiveLast does not. On mobile this can make the last active circle render differently (Line 92 vs Line 85).

🎯 Proposed fix
 const flowCircleActiveLast = style({
   backgroundColor: vars.color.background1,
   border: `2px solid ${vars.color.background1}`,
+  '@media': {
+    'screen and (max-width: 768px)': {
+      border: `2px solid ${vars.color.background2}`,
+    },
+  },
   selectors: {
     '&:before': {
       content: 'none',
     },
   },
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts`
around lines 90 - 98, The active-last circle style (flowCircleActiveLast) is
missing the mobile border override that flowCircleActive uses, causing
inconsistent rendering on small screens; update flowCircleActiveLast to include
the same mobile-specific override as flowCircleActive (i.e., add the same
selectors/@media rule or selector block that alters border on mobile) so the
active last step renders identically to flowCircleActive on mobile.
packages/ui/src/DropdownSelect/DropdownSelect.tsx (1)

391-402: ⚠️ Potential issue | 🟠 Major

Closed inline options are still exposed to screen readers.

The inline listbox stays mounted with role="listbox" and all role="option" children even when showOptions is false; only height/overflow hide it visually. That leaves a “closed” menu in the accessibility tree.

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

In `@packages/ui/src/DropdownSelect/DropdownSelect.tsx` around lines 391 - 402,
The inline listbox (the motion.div with id listboxId and role="listbox" that
uses inlineVariants and renderOptions) remains mounted when positioning ===
'inline' even if showOptions is false, exposing role="option" children to screen
readers; change the JSX so the listbox and its option children are only
rendered/mounted when showOptions is true (or alternatively remove the listbox
role and option elements when closed, e.g., render nothing or render a
non-interactive container with aria-hidden="true"), targeting the motion.div
block that calls renderOptions(defaultDropdownSelectOptionStyle).
♻️ Duplicate comments (1)
packages/ui/src/Artwork/Artwork.css.ts (1)

116-119: ⚠️ Potential issue | 🟠 Major

Don’t remove dark-mode focus indicator without replacement.

Line 118 removes focus visibility, which breaks keyboard navigability.

♿ Suggested fix
 globalStyle(`html[data-theme-mode='dark'] ${layerSelectStyle}:focus`, {
   color: `${vars.color.text1} !important`,
-  outline: 'none',
+  outline: `2px solid ${vars.color.border}`,
+  outlineOffset: '2px',
 })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/ui/src/Artwork/Artwork.css.ts` around lines 116 - 119, The dark-mode
globalStyle rule currently removes the focus outline for elements matching
layerSelectStyle, breaking keyboard accessibility; instead of setting outline:
'none' keep a visible focus indicator for keyboard users by replacing the rule
to use :focus-visible (or include a focus-visible selector) and apply an
accessible dark-theme focus style (e.g., a visible outline or box-shadow using
vars.color.text1 or a high-contrast color) while keeping color:
vars.color.text1; update the selector referenced in globalStyle and
layerSelectStyle so keyboard focus shows a clear indicator rather than being
removed.
🧹 Nitpick comments (7)
packages/dao-ui/src/components/ERC721RedeemMinterForm/ERC721RedeemMinterForm.tsx (1)

192-199: Optional: token-ize border radius for full design-token consistency.

The background is correctly theme-aware now. Consider replacing the hardcoded 8px radius with a radius token as well, so this block is fully token-driven like the rest of the dark-mode migration.

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

In
`@packages/dao-ui/src/components/ERC721RedeemMinterForm/ERC721RedeemMinterForm.tsx`
around lines 192 - 199, Replace the hardcoded '8px' borderRadius in the Box at
ERC721RedeemMinterForm with the design token used elsewhere (instead of '8px'
use the project's radius token from vars, e.g. vars.radii.x2 or the appropriate
vars.radius / vars.radii value), updating the style object inside the Box so the
borderRadius is token-driven and matches the existing token naming convention
alongside vars.color.warning.
packages/ui/src/Uploading/Uploading.css.ts (1)

13-13: Use backgroundColor in the mobile override for consistency.

Line 13 uses background while the base rule uses backgroundColor. Using the same property avoids unintentionally resetting other background sub-properties when styles are composed.

Suggested diff
-      background: vars.color.background1,
+      backgroundColor: vars.color.background1,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/ui/src/Uploading/Uploading.css.ts` at line 13, In the mobile
override inside Uploading.css.ts replace the CSS property "background:
vars.color.background1" with "backgroundColor: vars.color.background1" so it
matches the base rule's property and avoids resetting other background
sub-properties; locate the mobile override block for the Uploading component and
update that property (referencing the exact token vars.color.background1).
packages/create-proposal-ui/src/components/TransactionForm/ReplaceArtwork/ReplaceArtworkForm.css.ts (1)

16-18: Add a keyboard-visible focus style alongside hover.

This selector currently styles only :hover. Adding :focus-visible will improve keyboard accessibility for the checkbox interaction.

Proposed update
 selectors: {
   '&:hover': { cursor: 'pointer', background: vars.color.text1 },
+  '&:focus-visible': {
+    outline: `2px solid ${vars.color.text1}`,
+    outlineOffset: 2,
+  },
 },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@packages/create-proposal-ui/src/components/TransactionForm/ReplaceArtwork/ReplaceArtworkForm.css.ts`
around lines 16 - 18, The current style block for the checkbox uses only the
'&:hover' selector (in ReplaceArtworkForm.css.ts) which lacks a keyboard-visible
focus style; update the selectors object to also target '&:focus-visible' (or
combine selectors like '&:hover, &:focus-visible') and apply the same properties
(cursor: 'pointer', background: vars.color.text1) so keyboard users see the same
focus ring/visual as hover when the checkbox receives focus.
packages/feed-ui/src/Modals/VoteModalWrapper.tsx (1)

38-41: Consider centralizing this vote-label fragment to avoid drift.

These updated You voted <Text ...> blocks are now duplicated here and in packages/proposal-ui/src/components/ProposalActions/VoteStatus/Vote.tsx. A tiny shared helper/component would reduce future divergence risk while keeping token usage consistent.

Also applies to: 50-53

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

In `@packages/feed-ui/src/Modals/VoteModalWrapper.tsx` around lines 38 - 41,
Duplicate "You voted <Text as='span' color='...'>...</Text>" fragments in
VoteModalWrapper and ProposalActions/VoteStatus/Vote.tsx should be centralized
into a single reusable component (e.g., VoteLabel or VoteStatusLabel). Create a
small shared component that accepts voteType ('for'|'against'|'abstain') and
token-aware styling props, export it from a common UI/shared package, then
replace the inline fragments in VoteModalWrapper.tsx (the "You voted" block) and
in Vote.tsx to use this new component so token usage and wording remain
consistent.
packages/proposal-ui/src/constants/transactionTypes.ts (1)

21-151: Consider a tiny helper to remove repeated color-mix literals.

This block repeats the same string pattern many times; extracting a helper would make future tuning (e.g., 10% → 12%) one-line.

♻️ Optional refactor
+const mixBackdrop = (token: string) => `color-mix(in srgb, ${token} 10%, transparent)`

 export const TRANSACTION_TYPES: TransactionTypesPropsMap = {
   [TransactionType.SEND_TOKENS]: {
@@
-    iconBackdrop: `color-mix(in srgb, ${color.accent} 10%, transparent)`,
+    iconBackdrop: mixBackdrop(color.accent),
@@
-    iconBackdrop: `color-mix(in srgb, ${color.warning} 10%, transparent)`,
+    iconBackdrop: mixBackdrop(color.warning),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/proposal-ui/src/constants/transactionTypes.ts` around lines 21 -
151, The file repeats the same color-mix template for iconBackdrop across many
TransactionType entries; add a small helper (e.g., function
iconBackdrop(colorVar: string, pct = '10%') that returns the template string
`color-mix(in srgb, ${colorVar} ${pct}, transparent)` and replace literal uses
of `color-mix(in srgb, ${...} 10%, transparent)` in the TransactionType map
(examples: entries for SEND_NFT, MINT_GOVERNANCE_TOKENS, MILESTONE_PAYMENTS,
RELEASE_ESCROW_MILESTONE, NOMINATE_DELEGATE, DROPOSAL, PAUSE_AUCTIONS,
RESUME_AUCTIONS, REPLACE_ARTWORK, ADD_ARTWORK, MIGRATION, WALLET_CONNECT,
PIN_TREASURY_ASSET, STREAM_TOKENS, AIRDROP_TOKENS, CREATOR_COIN, CONTENT_COIN)
with calls to that helper so a single change to the percent or template updates
all entries.
packages/feed-ui/src/Feed.css.ts (1)

145-174: Consider extracting shared markdown style rules to avoid drift.

These code/pre/blockquote rules are now very similar across multiple packages; a shared helper would reduce maintenance overhead and keep token behavior synchronized.

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

In `@packages/feed-ui/src/Feed.css.ts` around lines 145 - 174, The markdown
styling for inline code, pre, and blockquote in Feed.css.ts (the globalStyle
calls targeting `${feedItemTextContent} code`, `${feedItemTextContent} pre`,
`${feedItemTextContent} pre code`, and `${feedItemTextContent} blockquote`)
duplicates rules found in other packages; extract these shared declarations into
a single helper (e.g., a function or exported object like createMarkdownStyles
or sharedMarkdownStyles) that accepts the container selector
(feedItemTextContent) and vars, replace the inline globalStyle calls with
invocations of that helper, and update other packages to import and use the same
helper so token/behavior stays synchronized across packages.
packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts (1)

29-98: Consider extracting shared circle token constants to reduce drift.

There is repeated border/background token composition across circle styles; a small shared constant (or shared style) would make future theme updates safer.

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

In `@packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts`
around lines 29 - 98, Extract the repeated background/border token compositions
into shared constants or shared style objects and reuse them in
flowFulfilledCircle, flowFulfilledCircleLast, flowCircle, flowCircleLast,
flowCircleActive, and flowCircleActiveLast so theme updates are centralized; for
example create a baseCircleTokens (using vars.color.background1 and
vars.color.background2) plus modifiers for "active" and "mobile" and a small
lastItem selector fragment, then spread/merge those shared tokens into each
style definition instead of repeating the same backgroundColor/border strings
and the '&:before' and '@media' blocks.
🤖 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/layouts/DefaultLayout/Nav.styles.css.ts`:
- Around line 322-331: The dark-mode primary CTA text is using the dark token
color.background1 inside the navPrimaryActionButton selector, making the “Create
a DAO” label hard to read; update the 'html[data-theme-mode="dark"] &' rule in
navPrimaryActionButton to use a light/foreground text token instead of
color.background1 (e.g., color.foreground1 or color.background — whichever token
your design system uses for readable light text on dark surfaces) and ensure the
hover rule still maintains sufficient contrast with darkSurfaceHover.

In `@apps/web/src/modules/explore/ExploreSortMenu.tsx`:
- Around line 33-39: The handler handleSortChange is updating query.orderBy but
the menu's controlled value is derived from query.sortKey, so the selected sort
never stays in sync with the URL; update the push payload to set the same key
the component reads (e.g., set query.sortKey to selection or set both
query.sortKey and query.orderBy) and ensure selectionToOrderBy(selection) still
computes orderBy, so modify the push call inside handleSortChange (and the
equivalent block at lines 46-56) to include query.sortKey: selection (or both
keys) so the UI and URL remain consistent.

In `@packages/proposal-ui/src/components/PropDates/PropDateForm.tsx`:
- Around line 260-280: The visible "Milestone (optional)" text isn't associated
with the DropdownSelect, so screen readers don't hear the label; update the
DropdownSelect usage in PropDateForm (the component rendering the label and
DropdownSelect) to pass an accessible label via the DropdownSelect prop (e.g.,
inputLabel or ariaLabel depending on DropdownSelect's API) so the interactive
trigger is linked to "Milestone (optional)"; keep the existing value/onChange
behavior (formik.setFieldValue('milestoneId', Number(nextValue))) and ensure the
prop text matches the rendered label so assistive tech announces it.

In `@packages/ui/src/DropdownSelect/DropdownSelect.tsx`:
- Around line 315-349: The trigger button currently only short-circuits handlers
so a disabled DropdownSelect remains focusable and announced as interactive;
update the button rendered by Box to pass the native disabled attribute
(disabled={disabled}) and remove or skip attaching interactive handlers
(onClick/onKeyDown/aria-expanded/aria-activedescendant) when disabled so it is
removed from the tab order and not announced as interactive; adjust usage around
triggerRef, handleTriggerKeyDown, openOptions, closeOptions and the aria props
(listboxId, inputLabelId, showOptions, activeIndex) so they are only applied
when !disabled.

In `@packages/ui/src/Fields/Select.tsx`:
- Around line 18-22: handleChange currently returns when no matching option is
found, so when DropdownSelect emits an empty string for the placeholder the
previous Formik value is left intact; update handleChange (the function using
optionsArray, selectedName, formik.setFieldValue and id) to detect selectedName
=== '' (or no method found) and explicitly clear the field via
formik.setFieldValue(id, '') or set a cleared structure, otherwise set the found
method as before. Ensure the placeholder branch runs before the optionsArray
lookup so placeholder selection reliably clears the Formik value.
- Around line 27-40: The label rendered in Select.tsx is no longer tied to a
form control because DropdownSelect isn't receiving the field label or the id,
so screen readers only see the selected value; update the DropdownSelect usage
to accept the input label and id by passing inputLabel={inputLabel} and id={id}
(or whatever prop names DropdownSelect expects for accessible labelling), and
ensure DropdownSelect forwards that id to the underlying input/button and
exposes aria-labelledby/aria-label appropriately so the <label htmlFor={id}>
actually references the control.

In `@packages/ui/src/Fields/styles.css.ts`:
- Around line 67-71: The focus rule currently sets borderColor to
vars.color.border which overrides error styling; update the '&:focus' rules (the
selectors shown at the diff locations and the similar blocks at lines
referenced) to preserve the error/negative border when the component is in its
error variant—i.e., detect the error state (the error modifier/class/variant
used in this file) and keep borderColor set to the negative/error token (not
vars.color.border) while focused so validation borders remain visible; apply the
same change for the other '&:focus' blocks referenced (around the 110-114 and
235-239 areas).

---

Outside diff comments:
In `@packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts`:
- Around line 90-98: The active-last circle style (flowCircleActiveLast) is
missing the mobile border override that flowCircleActive uses, causing
inconsistent rendering on small screens; update flowCircleActiveLast to include
the same mobile-specific override as flowCircleActive (i.e., add the same
selectors/@media rule or selector block that alters border on mobile) so the
active last step renders identically to flowCircleActive on mobile.

In `@packages/ui/src/DropdownSelect/DropdownSelect.tsx`:
- Around line 391-402: The inline listbox (the motion.div with id listboxId and
role="listbox" that uses inlineVariants and renderOptions) remains mounted when
positioning === 'inline' even if showOptions is false, exposing role="option"
children to screen readers; change the JSX so the listbox and its option
children are only rendered/mounted when showOptions is true (or alternatively
remove the listbox role and option elements when closed, e.g., render nothing or
render a non-interactive container with aria-hidden="true"), targeting the
motion.div block that calls renderOptions(defaultDropdownSelectOptionStyle).

---

Duplicate comments:
In `@packages/ui/src/Artwork/Artwork.css.ts`:
- Around line 116-119: The dark-mode globalStyle rule currently removes the
focus outline for elements matching layerSelectStyle, breaking keyboard
accessibility; instead of setting outline: 'none' keep a visible focus indicator
for keyboard users by replacing the rule to use :focus-visible (or include a
focus-visible selector) and apply an accessible dark-theme focus style (e.g., a
visible outline or box-shadow using vars.color.text1 or a high-contrast color)
while keeping color: vars.color.text1; update the selector referenced in
globalStyle and layerSelectStyle so keyboard focus shows a clear indicator
rather than being removed.

---

Nitpick comments:
In `@packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts`:
- Around line 29-98: Extract the repeated background/border token compositions
into shared constants or shared style objects and reuse them in
flowFulfilledCircle, flowFulfilledCircleLast, flowCircle, flowCircleLast,
flowCircleActive, and flowCircleActiveLast so theme updates are centralized; for
example create a baseCircleTokens (using vars.color.background1 and
vars.color.background2) plus modifiers for "active" and "mobile" and a small
lastItem selector fragment, then spread/merge those shared tokens into each
style definition instead of repeating the same backgroundColor/border strings
and the '&:before' and '@media' blocks.

In
`@packages/create-proposal-ui/src/components/TransactionForm/ReplaceArtwork/ReplaceArtworkForm.css.ts`:
- Around line 16-18: The current style block for the checkbox uses only the
'&:hover' selector (in ReplaceArtworkForm.css.ts) which lacks a keyboard-visible
focus style; update the selectors object to also target '&:focus-visible' (or
combine selectors like '&:hover, &:focus-visible') and apply the same properties
(cursor: 'pointer', background: vars.color.text1) so keyboard users see the same
focus ring/visual as hover when the checkbox receives focus.

In
`@packages/dao-ui/src/components/ERC721RedeemMinterForm/ERC721RedeemMinterForm.tsx`:
- Around line 192-199: Replace the hardcoded '8px' borderRadius in the Box at
ERC721RedeemMinterForm with the design token used elsewhere (instead of '8px'
use the project's radius token from vars, e.g. vars.radii.x2 or the appropriate
vars.radius / vars.radii value), updating the style object inside the Box so the
borderRadius is token-driven and matches the existing token naming convention
alongside vars.color.warning.

In `@packages/feed-ui/src/Feed.css.ts`:
- Around line 145-174: The markdown styling for inline code, pre, and blockquote
in Feed.css.ts (the globalStyle calls targeting `${feedItemTextContent} code`,
`${feedItemTextContent} pre`, `${feedItemTextContent} pre code`, and
`${feedItemTextContent} blockquote`) duplicates rules found in other packages;
extract these shared declarations into a single helper (e.g., a function or
exported object like createMarkdownStyles or sharedMarkdownStyles) that accepts
the container selector (feedItemTextContent) and vars, replace the inline
globalStyle calls with invocations of that helper, and update other packages to
import and use the same helper so token/behavior stays synchronized across
packages.

In `@packages/feed-ui/src/Modals/VoteModalWrapper.tsx`:
- Around line 38-41: Duplicate "You voted <Text as='span'
color='...'>...</Text>" fragments in VoteModalWrapper and
ProposalActions/VoteStatus/Vote.tsx should be centralized into a single reusable
component (e.g., VoteLabel or VoteStatusLabel). Create a small shared component
that accepts voteType ('for'|'against'|'abstain') and token-aware styling props,
export it from a common UI/shared package, then replace the inline fragments in
VoteModalWrapper.tsx (the "You voted" block) and in Vote.tsx to use this new
component so token usage and wording remain consistent.

In `@packages/proposal-ui/src/constants/transactionTypes.ts`:
- Around line 21-151: The file repeats the same color-mix template for
iconBackdrop across many TransactionType entries; add a small helper (e.g.,
function iconBackdrop(colorVar: string, pct = '10%') that returns the template
string `color-mix(in srgb, ${colorVar} ${pct}, transparent)` and replace literal
uses of `color-mix(in srgb, ${...} 10%, transparent)` in the TransactionType map
(examples: entries for SEND_NFT, MINT_GOVERNANCE_TOKENS, MILESTONE_PAYMENTS,
RELEASE_ESCROW_MILESTONE, NOMINATE_DELEGATE, DROPOSAL, PAUSE_AUCTIONS,
RESUME_AUCTIONS, REPLACE_ARTWORK, ADD_ARTWORK, MIGRATION, WALLET_CONNECT,
PIN_TREASURY_ASSET, STREAM_TOKENS, AIRDROP_TOKENS, CREATOR_COIN, CONTENT_COIN)
with calls to that helper so a single change to the percent or template updates
all entries.

In `@packages/ui/src/Uploading/Uploading.css.ts`:
- Line 13: In the mobile override inside Uploading.css.ts replace the CSS
property "background: vars.color.background1" with "backgroundColor:
vars.color.background1" so it matches the base rule's property and avoids
resetting other background sub-properties; locate the mobile override block for
the Uploading component and update that property (referencing the exact token
vars.color.background1).
🪄 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: a8830e02-ea1c-4524-9635-c53491223820

📥 Commits

Reviewing files that changed from the base of the PR and between 0828889 and 1f0f867.

⛔ Files ignored due to path filters (2)
  • apps/web/public/filled.svg is excluded by !**/*.svg
  • apps/web/public/outlined.svg is excluded by !**/*.svg
📒 Files selected for processing (80)
  • apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
  • apps/web/src/layouts/HomeLayout/Footer.css.ts
  • apps/web/src/modules/dashboard/CreateActions.css.ts
  • apps/web/src/modules/dashboard/DaoFeed/DaoFeed.css.ts
  • apps/web/src/modules/dashboard/SingleDaoSelector.css.ts
  • apps/web/src/modules/dashboard/UserProfileCard.css.ts
  • apps/web/src/modules/explore/ExploreSortMenu.tsx
  • apps/web/src/modules/explore/ExploreToolbar.tsx
  • apps/web/src/pages/_app.tsx
  • apps/web/src/styles/bridge.css.ts
  • apps/web/src/styles/profile.css.ts
  • packages/auction-ui/src/components/AllBids/BidCard.tsx
  • packages/auction-ui/src/components/Auction.css.ts
  • packages/auction-ui/src/components/AuctionChart/AuctionChart.css.ts
  • packages/create-dao-ui/src/components/Artwork/ArtworkUpload.css.ts
  • packages/create-dao-ui/src/components/ConfirmReset/ConfirmReset.css.ts
  • packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts
  • packages/create-dao-ui/src/components/ReviewAndDeploy/ReviewAndDeploy.css.ts
  • packages/create-dao-ui/src/components/ReviewAndDeploy/ReviewItem.css.ts
  • packages/create-dao-ui/src/components/ReviewAndDeploy/ReviewSection.css.ts
  • packages/create-proposal-ui/src/components/ArtworkUpload/ArtworkUpload.css.ts
  • packages/create-proposal-ui/src/components/Queue/Queue.css.ts
  • packages/create-proposal-ui/src/components/ReviewProposalForm/ReviewProposalForm.tsx
  • packages/create-proposal-ui/src/components/TransactionForm/AddArtwork/AddArtworkForm.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/ContentCoin/ContentCoin.tsx
  • packages/create-proposal-ui/src/components/TransactionForm/CreatorCoin/CreatorCoin.tsx
  • packages/create-proposal-ui/src/components/TransactionForm/CustomTransaction/CustomTransaction.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/CustomTransaction/forms/CustomTransactionForm.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/ReplaceArtwork/ReplaceArtworkForm.css.ts
  • packages/dao-ui/src/components/About/mdRender.css.ts
  • packages/dao-ui/src/components/Activity/Activity.css.ts
  • packages/dao-ui/src/components/DaoCard/DaoCard.css.ts
  • packages/dao-ui/src/components/DaoCard/DaoCard.tsx
  • packages/dao-ui/src/components/ERC721RedeemMinterForm/ERC721RedeemMinterForm.tsx
  • packages/dao-ui/src/components/ERC721RedeemMinterForm/MintingForm.tsx
  • packages/dao-ui/src/components/Feed/Feed.css.ts
  • packages/dao-ui/src/components/PreAuction/PreAuction.css.ts
  • packages/dao-ui/src/components/PreAuction/PreAuction.tsx
  • packages/dao-ui/src/components/SectionHandler/SectionHandler.css.ts
  • packages/feed-ui/src/CustomDaoSelector.css.ts
  • packages/feed-ui/src/Feed.css.ts
  • packages/feed-ui/src/FeedFiltersModal.css.ts
  • packages/feed-ui/src/Modals/VoteModalWrapper.tsx
  • packages/proposal-ui/src/components/GovernorContractButton/GovernorContractButton.css.ts
  • packages/proposal-ui/src/components/PropDates/PropDateForm.tsx
  • packages/proposal-ui/src/components/ProposalActions/ProposalActions.css.ts
  • packages/proposal-ui/src/components/ProposalActions/SuccessfulProposalActions.tsx
  • packages/proposal-ui/src/components/ProposalActions/VetoAction.tsx
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/Pending.tsx
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/Vote.tsx
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/VoteModal.css.ts
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/VoteModal.tsx
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/VoteStatus.tsx
  • packages/proposal-ui/src/components/ProposalDescription/ProposalDescription.css.ts
  • packages/proposal-ui/src/components/ProposalStatus/ProposalStatus.helper.ts
  • packages/proposal-ui/src/components/ProposalVotes/VotePlacard.tsx
  • packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts
  • packages/proposal-ui/src/constants/transactionTypes.ts
  • packages/ui/src/Artwork/Artwork.css.ts
  • packages/ui/src/CoinForm/ClankerCoinFormFields.tsx
  • packages/ui/src/CoinForm/CoinFormFields.tsx
  • packages/ui/src/ContractLink/ContractLink.tsx
  • packages/ui/src/DropMintWidget/DropMintWidget.css.ts
  • packages/ui/src/DropdownSelect/DropdownSelect.tsx
  • packages/ui/src/Fields/Select.tsx
  • packages/ui/src/Fields/styles.css.ts
  • packages/ui/src/MarkdownEditor/MarkdownEditor.tsx
  • packages/ui/src/Modal/Modal.css.ts
  • packages/ui/src/Panel/Panel.css.ts
  • packages/ui/src/Playground/LayerMenu.tsx
  • packages/ui/src/SingleImageUpload/SingleImageUpload.css.ts
  • packages/ui/src/SingleMediaUpload/SingleMediaUpload.css.ts
  • packages/ui/src/Toggle/Toggle.css.ts
  • packages/ui/src/UpgradeCard/UpgradeCard.css.ts
  • packages/ui/src/Uploading/Uploading.css.ts
  • packages/ui/src/WalletProfilePreview/WalletProfilePreview.tsx
  • packages/zord/src/elements/Select.tsx
  • packages/zord/src/elements/index.ts
  • packages/zord/src/theme.css.ts
💤 Files with no reviewable changes (2)
  • packages/zord/src/elements/index.ts
  • packages/zord/src/elements/Select.tsx
✅ Files skipped from review due to trivial changes (31)
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/VoteStatus.tsx
  • packages/create-dao-ui/src/components/ReviewAndDeploy/ReviewItem.css.ts
  • packages/auction-ui/src/components/AuctionChart/AuctionChart.css.ts
  • packages/ui/src/UpgradeCard/UpgradeCard.css.ts
  • apps/web/src/modules/dashboard/DaoFeed/DaoFeed.css.ts
  • packages/create-proposal-ui/src/components/ArtworkUpload/ArtworkUpload.css.ts
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/Pending.tsx
  • packages/ui/src/MarkdownEditor/MarkdownEditor.tsx
  • packages/dao-ui/src/components/PreAuction/PreAuction.tsx
  • packages/proposal-ui/src/components/GovernorContractButton/GovernorContractButton.css.ts
  • packages/auction-ui/src/components/AllBids/BidCard.tsx
  • packages/create-dao-ui/src/components/Artwork/ArtworkUpload.css.ts
  • packages/ui/src/SingleMediaUpload/SingleMediaUpload.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/CustomTransaction/CustomTransaction.css.ts
  • packages/proposal-ui/src/components/ProposalActions/VetoAction.tsx
  • packages/ui/src/WalletProfilePreview/WalletProfilePreview.tsx
  • packages/ui/src/CoinForm/ClankerCoinFormFields.tsx
  • packages/create-proposal-ui/src/components/Queue/Queue.css.ts
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/VoteModal.tsx
  • packages/dao-ui/src/components/Feed/Feed.css.ts
  • apps/web/src/modules/explore/ExploreToolbar.tsx
  • packages/create-proposal-ui/src/components/ReviewProposalForm/ReviewProposalForm.tsx
  • packages/proposal-ui/src/components/ProposalVotes/VotePlacard.tsx
  • packages/create-proposal-ui/src/components/TransactionForm/AddArtwork/AddArtworkForm.css.ts
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/VoteModal.css.ts
  • packages/ui/src/SingleImageUpload/SingleImageUpload.css.ts
  • packages/ui/src/DropMintWidget/DropMintWidget.css.ts
  • packages/dao-ui/src/components/SectionHandler/SectionHandler.css.ts
  • packages/feed-ui/src/CustomDaoSelector.css.ts
  • apps/web/src/modules/dashboard/CreateActions.css.ts
  • packages/dao-ui/src/components/PreAuction/PreAuction.css.ts
🚧 Files skipped from review as they are similar to previous changes (12)
  • packages/ui/src/Modal/Modal.css.ts
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
  • apps/web/src/pages/_app.tsx
  • apps/web/src/modules/dashboard/SingleDaoSelector.css.ts
  • packages/proposal-ui/src/components/ProposalVotes/VoterParticipation.css.ts
  • packages/feed-ui/src/FeedFiltersModal.css.ts
  • apps/web/src/styles/bridge.css.ts
  • apps/web/src/modules/dashboard/UserProfileCard.css.ts
  • apps/web/src/styles/profile.css.ts
  • packages/ui/src/Playground/LayerMenu.tsx
  • packages/dao-ui/src/components/DaoCard/DaoCard.css.ts
  • apps/web/src/layouts/HomeLayout/Footer.css.ts

Comment thread apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts Outdated
Comment thread apps/web/src/modules/explore/ExploreSortMenu.tsx
Comment thread packages/proposal-ui/src/components/PropDates/PropDateForm.tsx Outdated
Comment thread packages/ui/src/DropdownSelect/DropdownSelect.tsx
Comment thread packages/ui/src/Fields/Select.tsx
Comment thread packages/ui/src/Fields/Select.tsx
Comment thread packages/ui/src/Fields/styles.css.ts
This keeps select state/labels in sync, removes disabled dropdown interactivity, and addresses focus contrast and token drift across navigation, forms, and shared vote/transaction UI.
@dan13ram dan13ram moved this from 🏗️ In Progress to 🔎 In Review in Resident Cycle Apr 30, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 30, 2026

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

Project Deployment Actions Updated (UTC)
testnet-nouns-builder Ready Ready Preview May 1, 2026 4:20pm

Request Review

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.

♻️ Duplicate comments (3)
packages/ui/src/DropdownSelect/DropdownSelect.tsx (1)

282-307: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Treat isLoading as non-interactive in trigger behavior.

When isLoading is true, the default trigger still allows click/keyboard interactions (only disabled is checked). That can cause repeated or conflicting selection changes while a pending state is shown.

Suggested fix
 export function DropdownSelect<T extends React.Key>({
   id,
   value,
   onChange,
   options,
   inputLabel,
   ariaLabel,
   disabled = false,
   isLoading = false,
@@
 }: React.PropsWithChildren<DropdownSelectProps<T>>) {
+  const isDisabled = disabled || isLoading
   const [showOptions, setShowOptions] = useState(false)
@@
-    if (!options.length || disabled) return
+    if (!options.length || isDisabled) return
@@
-          disabled={disabled}
+          disabled={isDisabled}
@@
-          aria-haspopup={disabled ? undefined : 'listbox'}
-          aria-expanded={disabled ? undefined : showOptions}
-          aria-controls={disabled ? undefined : listboxId}
+          aria-haspopup={isDisabled ? undefined : 'listbox'}
+          aria-expanded={isDisabled ? undefined : showOptions}
+          aria-controls={isDisabled ? undefined : listboxId}
@@
-            !disabled && showOptions && activeIndex >= 0
+            !isDisabled && showOptions && activeIndex >= 0
               ? `${listboxId}-option-${activeIndex}`
               : undefined
           }
-          onKeyDown={disabled ? undefined : handleTriggerKeyDown}
+          onKeyDown={isDisabled ? undefined : handleTriggerKeyDown}
           onClick={
-            disabled
+            isDisabled
               ? undefined
               : () => {
@@
-          cursor={disabled ? 'auto' : 'pointer'}
+          cursor={isDisabled ? 'auto' : 'pointer'}
@@
-            disabled={disabled}
-            aria-haspopup={disabled ? undefined : 'listbox'}
-            aria-expanded={disabled ? undefined : showOptions}
-            aria-controls={disabled ? undefined : listboxId}
+            disabled={isDisabled}
+            aria-haspopup={isDisabled ? undefined : 'listbox'}
+            aria-expanded={isDisabled ? undefined : showOptions}
+            aria-controls={isDisabled ? undefined : listboxId}
@@
-              !disabled && showOptions && activeIndex >= 0
+              !isDisabled && showOptions && activeIndex >= 0
                 ? `${listboxId}-option-${activeIndex}`
                 : undefined
             }
-            onKeyDown={disabled ? undefined : handleTriggerKeyDown}
+            onKeyDown={isDisabled ? undefined : handleTriggerKeyDown}
             onClick={
-              disabled
+              isDisabled
                 ? undefined
                 : () => {

Also applies to: 330-354, 387-405

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

In `@packages/ui/src/DropdownSelect/DropdownSelect.tsx` around lines 282 - 307,
The trigger currently only checks disabled but must also treat isLoading as
non-interactive: update the trigger prop logic (the JSX block using
aria-haspopup/aria-expanded/aria-controls/aria-activedescendant/onKeyDown/onClick)
to return undefined or no-op when isLoading is true (in addition to disabled),
preventing handleTriggerKeyDown, openOptions, and closeOptions from running
while isLoading; ensure aria attributes like aria-haspopup, aria-expanded,
aria-controls, and aria-activedescendant also evaluate to undefined when
isLoading is true so the component is inaccessible during loading (apply same
change to the other trigger instances around the references to listboxId,
activeIndex, inputLabelId, ariaLabel/inputLabel).
apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts (1)

127-135: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix the dark-mode label contrast on the disconnect button.

color.background1 reads like a surface token, so on the red dark-mode background the label will be too dim. Switch this to a foreground token to keep the button legible.

Suggested fix
       'html[data-theme-mode="dark"] &': {
         background: color.negative,
-        color: color.background1,
+        color: color.text1,
       },
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts` around lines 127 - 135,
The dark-mode styles for the disconnect button use a surface token
(color.background1 / vars.color.background1) which reduces label contrast;
update the two selectors 'html[data-theme-mode="dark"] &' and
'html[data-theme-mode="dark"] &:hover' to use the foreground token
instead—replace color.background1 with color.foreground1 and
`${vars.color.background1}` with `${vars.color.foreground1}` so the label
remains legible in dark mode.
apps/web/src/styles/globals.css (1)

83-107: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Drop the quoted font stack.

The button token changes look fine, but Line 87 still fails stylelint because the font-family names are quoted. Switching to an unquoted stack should clear the lint gate.

Proposed fix
-  font-family: 'ptRoot', 'Arial', 'Helvetica', 'sans-serif' !important;
+  font-family: ptRoot, Arial, Helvetica, sans-serif !important;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/styles/globals.css` around lines 83 - 107, Replace the quoted
font stack in the CSS rule for the selectors "#connect-button-wrapper * div,
`#connect-button-wrapper` * button": update the font-family declaration (currently
using 'ptRoot', 'Arial', 'Helvetica', 'sans-serif' !important) to an unquoted
stack (remove the single quotes around each family name as appropriate) so the
font-family property adheres to stylelint rules while keeping the same fallback
order and preserving the !important if still required.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts`:
- Around line 127-135: The dark-mode styles for the disconnect button use a
surface token (color.background1 / vars.color.background1) which reduces label
contrast; update the two selectors 'html[data-theme-mode="dark"] &' and
'html[data-theme-mode="dark"] &:hover' to use the foreground token
instead—replace color.background1 with color.foreground1 and
`${vars.color.background1}` with `${vars.color.foreground1}` so the label
remains legible in dark mode.

In `@apps/web/src/styles/globals.css`:
- Around line 83-107: Replace the quoted font stack in the CSS rule for the
selectors "#connect-button-wrapper * div, `#connect-button-wrapper` * button":
update the font-family declaration (currently using 'ptRoot', 'Arial',
'Helvetica', 'sans-serif' !important) to an unquoted stack (remove the single
quotes around each family name as appropriate) so the font-family property
adheres to stylelint rules while keeping the same fallback order and preserving
the !important if still required.

In `@packages/ui/src/DropdownSelect/DropdownSelect.tsx`:
- Around line 282-307: The trigger currently only checks disabled but must also
treat isLoading as non-interactive: update the trigger prop logic (the JSX block
using
aria-haspopup/aria-expanded/aria-controls/aria-activedescendant/onKeyDown/onClick)
to return undefined or no-op when isLoading is true (in addition to disabled),
preventing handleTriggerKeyDown, openOptions, and closeOptions from running
while isLoading; ensure aria attributes like aria-haspopup, aria-expanded,
aria-controls, and aria-activedescendant also evaluate to undefined when
isLoading is true so the component is inaccessible during loading (apply same
change to the other trigger instances around the references to listboxId,
activeIndex, inputLabelId, ariaLabel/inputLabel).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c1ae52a0-0a4a-4847-af4d-7bbd8d5468cc

📥 Commits

Reviewing files that changed from the base of the PR and between 1f0f867 and 55f0521.

📒 Files selected for processing (26)
  • apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts
  • apps/web/src/layouts/DefaultLayout/NavMenu/ChainMenu.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
  • apps/web/src/modules/explore/ExploreSortMenu.tsx
  • apps/web/src/modules/explore/SearchInput.css.ts
  • apps/web/src/pages/_app.tsx
  • apps/web/src/styles/flatpickr-theme.css
  • apps/web/src/styles/globals.css
  • packages/create-dao-ui/src/components/CreateNavigation/NavSection.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/ReplaceArtwork/ReplaceArtworkForm.css.ts
  • packages/dao-ui/src/components/ERC721RedeemMinterForm/ERC721RedeemMinterForm.tsx
  • packages/feed-ui/src/Modals/VoteModalWrapper.tsx
  • packages/feed-ui/src/SearchInput.css.ts
  • packages/proposal-ui/src/components/PropDates/PropDateForm.tsx
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/Vote.tsx
  • packages/proposal-ui/src/components/VoteLabel/VoteLabel.tsx
  • packages/proposal-ui/src/components/VoteLabel/index.ts
  • packages/proposal-ui/src/components/index.ts
  • packages/proposal-ui/src/constants/transactionTypes.ts
  • packages/ui/src/Artwork/Artwork.css.ts
  • packages/ui/src/DropdownSelect/DropdownSelect.css.ts
  • packages/ui/src/DropdownSelect/DropdownSelect.tsx
  • packages/ui/src/Fields/Select.tsx
  • packages/ui/src/Fields/styles.css.ts
  • packages/ui/src/Uploading/Uploading.css.ts
  • packages/zord/src/elements/Button.css.ts
✅ Files skipped from review due to trivial changes (6)
  • packages/proposal-ui/src/components/index.ts
  • packages/proposal-ui/src/components/VoteLabel/index.ts
  • apps/web/src/styles/flatpickr-theme.css
  • packages/ui/src/DropdownSelect/DropdownSelect.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/ReplaceArtwork/ReplaceArtworkForm.css.ts
  • packages/ui/src/Uploading/Uploading.css.ts
🚧 Files skipped from review as they are similar to previous changes (7)
  • packages/proposal-ui/src/components/ProposalActions/VoteStatus/Vote.tsx
  • packages/dao-ui/src/components/ERC721RedeemMinterForm/ERC721RedeemMinterForm.tsx
  • packages/feed-ui/src/Modals/VoteModalWrapper.tsx
  • apps/web/src/pages/_app.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ChainMenu.tsx
  • packages/proposal-ui/src/components/PropDates/PropDateForm.tsx
  • packages/proposal-ui/src/constants/transactionTypes.ts

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

🧹 Nitpick comments (1)
apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx (1)

252-298: ⚡ Quick win

Reduce duplication between renderConnectedUser and renderConnectedUserStatic.

These two render blocks are nearly identical and can drift. Consider one shared renderer with a small mode flag for spacing/layout differences.

♻️ Refactor sketch
-const renderConnectedUser = () => ( ... )
-const renderConnectedUserStatic = () => ( ... )
+const renderConnectedUser = ({ mobile = false }: { mobile?: boolean } = {}) => (
+  <>
+    <Flex
+      direction="column"
+      align="stretch"
+      gap="x2"
+      style={mobile ? { paddingBottom: '8px' } : undefined}
+    >
+      {/* shared content */}
+    </Flex>
+    <Box color="border" borderStyle="solid" borderWidth="thin" />
+  </>
+)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx` around lines 252
- 298, Extract the duplicated JSX in renderConnectedUser and
renderConnectedUserStatic into a single shared renderer (e.g.,
renderConnectedUserCommon or a small Presentational component ConnectedUserRow)
that accepts a mode flag/prop (e.g., isStatic or variant) to toggle the minor
layout differences like paddingBottom, wrapping Link behavior, and any id
differences (e.g., 'close-modal'). Move repeated pieces (Avatar, displayName,
userBalance, CopyButton, Disconnect Button) into that shared renderer and
preserve existing props/aria attributes (aria-label, target/rel on Link) while
updating both original callers to use the new shared function/component.
🤖 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/layouts/DefaultLayout/Nav.styles.css.ts`:
- Around line 319-324: The hover state in the selectors block leaves the text
color as color.negative while setting background to vars.color.negative, causing
poor contrast; update the '&:hover' rule (in the same object that currently has
background: vars.color.negativeDisabled and color: color.negative) to explicitly
set a high-contrast text color for the hover state (for example replace or add
color: color.background or another existing high-contrast token) so hovered text
remains readable against vars.color.negative.

In `@packages/ui/src/Tooltip/Tooltip.tsx`:
- Around line 10-22: The tooltip trigger Box is keyboard-focusable but
icon-only, so add an explicit accessible name by adding an aria-label or
aria-labelledby to the Box (the element using onMouseOver/onFocus/setShowTooltip
and ref triggerRef) and mark the Icon as decorative (e.g., aria-hidden or
decorative prop) so screen readers announce a meaningful label rather than the
icon; update the Box to include a clear label (e.g., aria-label="Help" or a
prop-driven label) and ensure Icon id="question" is rendered decorative.

---

Nitpick comments:
In `@apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx`:
- Around line 252-298: Extract the duplicated JSX in renderConnectedUser and
renderConnectedUserStatic into a single shared renderer (e.g.,
renderConnectedUserCommon or a small Presentational component ConnectedUserRow)
that accepts a mode flag/prop (e.g., isStatic or variant) to toggle the minor
layout differences like paddingBottom, wrapping Link behavior, and any id
differences (e.g., 'close-modal'). Move repeated pieces (Avatar, displayName,
userBalance, CopyButton, Disconnect Button) into that shared renderer and
preserve existing props/aria attributes (aria-label, target/rel on Link) while
updating both original callers to use the new shared function/component.
🪄 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: 2f0b6f9c-71df-4e94-9a4e-193cd24072f4

📥 Commits

Reviewing files that changed from the base of the PR and between 55f0521 and 2265c43.

⛔ Files ignored due to path filters (118)
  • packages/zord/src/assets/airdrop-sablier.svg is excluded by !**/*.svg
  • packages/zord/src/assets/airdrop.svg is excluded by !**/*.svg
  • packages/zord/src/assets/arrow-left.svg is excluded by !**/*.svg
  • packages/zord/src/assets/arrow-right.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/airdrop-sablier.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/airdrop.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/brush.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/collection.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/content-coin.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/creator-coin.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/erc20.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/escrow.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/eth.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/handshake.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/migrate.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/nft.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/pause-template.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/resume-template.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/sablier.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/wallet-connect-outline.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/wallet-connect.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/x.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brush.svg is excluded by !**/*.svg
  • packages/zord/src/assets/burger.svg is excluded by !**/*.svg
  • packages/zord/src/assets/check-in-circle.svg is excluded by !**/*.svg
  • packages/zord/src/assets/check.svg is excluded by !**/*.svg
  • packages/zord/src/assets/chevron-down.svg is excluded by !**/*.svg
  • packages/zord/src/assets/chevron-left.svg is excluded by !**/*.svg
  • packages/zord/src/assets/chevron-right.svg is excluded by !**/*.svg
  • packages/zord/src/assets/chevron-up.svg is excluded by !**/*.svg
  • packages/zord/src/assets/code.svg is excluded by !**/*.svg
  • packages/zord/src/assets/collection.svg is excluded by !**/*.svg
  • packages/zord/src/assets/copy.svg is excluded by !**/*.svg
  • packages/zord/src/assets/creator-coin.svg is excluded by !**/*.svg
  • packages/zord/src/assets/cross-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/cross.svg is excluded by !**/*.svg
  • packages/zord/src/assets/dash.svg is excluded by !**/*.svg
  • packages/zord/src/assets/discord.svg is excluded by !**/*.svg
  • packages/zord/src/assets/dots.svg is excluded by !**/*.svg
  • packages/zord/src/assets/download.svg is excluded by !**/*.svg
  • packages/zord/src/assets/escrow.svg is excluded by !**/*.svg
  • packages/zord/src/assets/eth.svg is excluded by !**/*.svg
  • packages/zord/src/assets/external-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/github.svg is excluded by !**/*.svg
  • packages/zord/src/assets/globe.svg is excluded by !**/*.svg
  • packages/zord/src/assets/handlebar-circle.svg is excluded by !**/*.svg
  • packages/zord/src/assets/heart-filled.svg is excluded by !**/*.svg
  • packages/zord/src/assets/heart.svg is excluded by !**/*.svg
  • packages/zord/src/assets/info-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/migrate.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/arrow-left.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/arrow-right.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/arrow-top-right.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/burger.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/check-in-circle.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/check.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/chevron-down.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/chevron-left.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/chevron-right.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/chevron-up.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/code-brackets.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/code.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/copy.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/cross-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/cross.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/dash.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/discord.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/dots.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/download.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/ellipsis.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/external-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/github.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/globe.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/handlebar-circle.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/heart-filled.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/heart.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/move.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/new-window.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/noggles.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/pause.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/pencil.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/pin.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/play.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/plus.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/question.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/queue.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/refresh.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/search.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/share.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/sliders.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/spanner.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/swap.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/trash.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/warning-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/warning.svg is excluded by !**/*.svg
  • packages/zord/src/assets/move.svg is excluded by !**/*.svg
  • packages/zord/src/assets/new-window.svg is excluded by !**/*.svg
  • packages/zord/src/assets/noggles.svg is excluded by !**/*.svg
  • packages/zord/src/assets/pause-template.svg is excluded by !**/*.svg
  • packages/zord/src/assets/pause.svg is excluded by !**/*.svg
  • packages/zord/src/assets/pencil.svg is excluded by !**/*.svg
  • packages/zord/src/assets/pin.svg is excluded by !**/*.svg
  • packages/zord/src/assets/play.svg is excluded by !**/*.svg
  • packages/zord/src/assets/plus.svg is excluded by !**/*.svg
  • packages/zord/src/assets/question.svg is excluded by !**/*.svg
  • packages/zord/src/assets/refresh.svg is excluded by !**/*.svg
  • packages/zord/src/assets/resume-template.svg is excluded by !**/*.svg
  • packages/zord/src/assets/sablier.svg is excluded by !**/*.svg
  • packages/zord/src/assets/share.svg is excluded by !**/*.svg
  • packages/zord/src/assets/spanner.svg is excluded by !**/*.svg
  • packages/zord/src/assets/swap.svg is excluded by !**/*.svg
  • packages/zord/src/assets/trash.svg is excluded by !**/*.svg
  • packages/zord/src/assets/twitter.svg is excluded by !**/*.svg
  • packages/zord/src/assets/wallet-connect-outline.svg is excluded by !**/*.svg
  • packages/zord/src/assets/wallet-connect.svg is excluded by !**/*.svg
  • packages/zord/src/assets/warning-16.svg is excluded by !**/*.svg
  • packages/zord/src/assets/warning.svg is excluded by !**/*.svg
  • packages/zord/src/assets/x.svg is excluded by !**/*.svg
📒 Files selected for processing (75)
  • apps/web/src/components/HiddenDaoDisclosure.css.ts
  • apps/web/src/components/HiddenDaoDisclosure.tsx
  • apps/web/src/components/HoldersSection/HoldersList.css.ts
  • apps/web/src/components/ProposalLink.tsx
  • apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts
  • apps/web/src/layouts/DefaultLayout/NavMenu/ChainMenu.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
  • apps/web/src/layouts/HomeLayout/Footer.css.ts
  • apps/web/src/layouts/HomeLayout/Footer.tsx
  • apps/web/src/modules/coin/CoinDetail/CoinInfo.tsx
  • apps/web/src/modules/dashboard/DaoProposalCard.tsx
  • apps/web/src/modules/dashboard/MobileCreateMenu.tsx
  • apps/web/src/modules/drop/DropDetail/DropInfo.tsx
  • apps/web/src/modules/home/FAQ.tsx
  • apps/web/src/modules/home/Home.css.ts
  • apps/web/src/modules/home/Homepage.css.ts
  • apps/web/src/modules/playground/components/PlaygroundHeader.tsx
  • apps/web/src/pages/_app.tsx
  • apps/web/src/pages/profile/[user].tsx
  • apps/web/src/styles/globals.css
  • apps/web/src/styles/profile.css.ts
  • apps/web/src/styles/react-mde-theme.css
  • packages/auction-ui/src/components/AuctionChart/AuctionGraph.tsx
  • packages/auction-ui/src/components/AuctionTokenPicker.tsx
  • packages/create-dao-ui/src/components/AllocationForm/AllocationForm.tsx
  • packages/create-dao-ui/src/components/AuctionSettingsForm/AuctionSettingsForm.tsx
  • packages/create-dao-ui/src/components/FormNavButtons/FormNavButtons.tsx
  • packages/create-dao-ui/src/components/ReviewAndDeploy/ReviewSection.tsx
  • packages/create-proposal-ui/src/components/CreateProposalHeading/CreateProposalHeading.tsx
  • packages/create-proposal-ui/src/components/MobileProposalActionBar/MobileProposalActionBar.tsx
  • packages/create-proposal-ui/src/components/TransactionForm/ContentCoin/ContentCoinPreviewDisplay.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/CreatorCoin/CreatorCoinPreviewDisplay.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/MilestonePayments/MilestonePaymentsDetailsDisplay.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/StreamTokens/StreamTokensDetailsDisplay.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/WalletConnect/WalletConnect.tsx
  • packages/dao-ui/src/components/About/ExternalLinks.tsx
  • packages/dao-ui/src/components/About/Founder.tsx
  • packages/dao-ui/src/components/Activity/DelegateForm.tsx
  • packages/dao-ui/src/components/Cards/CreatorCoinSection.tsx
  • packages/dao-ui/src/styles/About.css.ts
  • packages/proposal-ui/src/components/ProposalDescription/AirdropDetails/AirdropItem.tsx
  • packages/proposal-ui/src/components/ProposalDescription/CoinDetails/CoinItem.tsx
  • packages/proposal-ui/src/components/ProposalDescription/DropDetails/DropItem.tsx
  • packages/proposal-ui/src/components/ProposalDescription/MilestoneDetails/EscrowInstance.tsx
  • packages/proposal-ui/src/components/ProposalDescription/MilestoneDetails/MilestoneItem.tsx
  • packages/proposal-ui/src/components/ProposalDescription/StreamDetails/SenderDelegation.tsx
  • packages/proposal-ui/src/components/ProposalDescription/StreamDetails/StreamItem.tsx
  • packages/proposal-ui/src/components/ProposalDetailsGrid/ProposalDetailsGrid.tsx
  • packages/proposal-ui/src/components/ProposalDetailsGrid/Tile.css.ts
  • packages/proposal-ui/src/components/ProposalDetailsGrid/Tile.tsx
  • packages/proposal-ui/src/components/ProposalHeader/ProposalHeader.tsx
  • packages/proposal-ui/src/components/ProposalNavigation/ProposalNavigation.tsx
  • packages/proposal-ui/src/components/ProposalStatus/ProposalStatus.helper.ts
  • packages/proposal-ui/src/components/TransactionTypeIcon/TransactionTypeIcon.tsx
  • packages/proposal-ui/src/constants/transactionTypes.ts
  • packages/ui/src/Accordion/AccordionItem.tsx
  • packages/ui/src/Artwork/LayerBox.tsx
  • packages/ui/src/Artwork/LayerOrdering.tsx
  • packages/ui/src/ContractLink/ContractLink.tsx
  • packages/ui/src/CopyButton/CopyButton.tsx
  • packages/ui/src/DaoLinksField/DaoLinksField.tsx
  • packages/ui/src/DropdownSelect/DropdownSelect.tsx
  • packages/ui/src/Graph/BaseGraph.tsx
  • packages/ui/src/Graph/StreamGraph.tsx
  • packages/ui/src/LaunchEconomicsPreview/LaunchEconomicsPreview.tsx
  • packages/ui/src/LikeButton/LikeButton.tsx
  • packages/ui/src/LikeButton/LikePopupContent.tsx
  • packages/ui/src/MarkdownDisplay/MarkdownDisplay.tsx
  • packages/ui/src/MarkdownEditor/MarkdownEditor.tsx
  • packages/ui/src/Modal/Modal.css.ts
  • packages/ui/src/Pagination/Pagination.tsx
  • packages/ui/src/ShareButton/ShareButton.tsx
  • packages/ui/src/Tooltip/Tooltip.tsx
  • packages/zord/ICONS.md
  • packages/zord/src/icons.ts
💤 Files with no reviewable changes (5)
  • packages/create-proposal-ui/src/components/TransactionForm/CreatorCoin/CreatorCoinPreviewDisplay.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/ContentCoin/ContentCoinPreviewDisplay.css.ts
  • apps/web/src/pages/profile/[user].tsx
  • packages/create-proposal-ui/src/components/TransactionForm/MilestonePayments/MilestonePaymentsDetailsDisplay.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/StreamTokens/StreamTokensDetailsDisplay.css.ts
✅ Files skipped from review due to trivial changes (45)
  • apps/web/src/modules/dashboard/MobileCreateMenu.tsx
  • apps/web/src/modules/home/FAQ.tsx
  • apps/web/src/modules/playground/components/PlaygroundHeader.tsx
  • packages/proposal-ui/src/components/ProposalDescription/DropDetails/DropItem.tsx
  • packages/ui/src/DaoLinksField/DaoLinksField.tsx
  • packages/proposal-ui/src/components/ProposalHeader/ProposalHeader.tsx
  • packages/dao-ui/src/components/Cards/CreatorCoinSection.tsx
  • apps/web/src/modules/drop/DropDetail/DropInfo.tsx
  • packages/proposal-ui/src/components/ProposalDescription/CoinDetails/CoinItem.tsx
  • packages/proposal-ui/src/components/ProposalDescription/MilestoneDetails/MilestoneItem.tsx
  • packages/proposal-ui/src/components/ProposalDescription/StreamDetails/SenderDelegation.tsx
  • apps/web/src/components/HiddenDaoDisclosure.tsx
  • packages/create-proposal-ui/src/components/MobileProposalActionBar/MobileProposalActionBar.tsx
  • packages/ui/src/Artwork/LayerOrdering.tsx
  • packages/create-proposal-ui/src/components/CreateProposalHeading/CreateProposalHeading.tsx
  • packages/ui/src/CopyButton/CopyButton.tsx
  • packages/dao-ui/src/styles/About.css.ts
  • packages/dao-ui/src/components/About/Founder.tsx
  • packages/ui/src/MarkdownDisplay/MarkdownDisplay.tsx
  • apps/web/src/modules/dashboard/DaoProposalCard.tsx
  • packages/ui/src/LikeButton/LikeButton.tsx
  • apps/web/src/modules/coin/CoinDetail/CoinInfo.tsx
  • packages/ui/src/LikeButton/LikePopupContent.tsx
  • packages/proposal-ui/src/components/ProposalDescription/StreamDetails/StreamItem.tsx
  • packages/ui/src/Accordion/AccordionItem.tsx
  • apps/web/src/modules/home/Homepage.css.ts
  • packages/create-dao-ui/src/components/AllocationForm/AllocationForm.tsx
  • packages/ui/src/LaunchEconomicsPreview/LaunchEconomicsPreview.tsx
  • packages/auction-ui/src/components/AuctionTokenPicker.tsx
  • packages/ui/src/Graph/BaseGraph.tsx
  • packages/proposal-ui/src/components/ProposalNavigation/ProposalNavigation.tsx
  • packages/proposal-ui/src/components/ProposalDetailsGrid/Tile.css.ts
  • packages/create-proposal-ui/src/components/TransactionForm/WalletConnect/WalletConnect.tsx
  • packages/create-dao-ui/src/components/ReviewAndDeploy/ReviewSection.tsx
  • packages/create-dao-ui/src/components/FormNavButtons/FormNavButtons.tsx
  • packages/zord/ICONS.md
  • packages/proposal-ui/src/components/ProposalDescription/MilestoneDetails/EscrowInstance.tsx
  • packages/dao-ui/src/components/Activity/DelegateForm.tsx
  • apps/web/src/styles/react-mde-theme.css
  • apps/web/src/components/ProposalLink.tsx
  • apps/web/src/components/HoldersSection/HoldersList.css.ts
  • packages/create-dao-ui/src/components/AuctionSettingsForm/AuctionSettingsForm.tsx
  • packages/ui/src/ShareButton/ShareButton.tsx
  • packages/ui/src/Artwork/LayerBox.tsx
  • packages/ui/src/DropdownSelect/DropdownSelect.tsx
🚧 Files skipped from review as they are similar to previous changes (4)
  • apps/web/src/layouts/HomeLayout/Footer.tsx
  • packages/ui/src/Modal/Modal.css.ts
  • packages/ui/src/MarkdownEditor/MarkdownEditor.tsx
  • packages/proposal-ui/src/components/ProposalStatus/ProposalStatus.helper.ts

Comment thread apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts Outdated
Comment thread packages/ui/src/Tooltip/Tooltip.tsx
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

🧹 Nitpick comments (2)
apps/web/src/styles/about.css.ts (1)

19-19: 💤 Low value

Minor naming nit: darkWordSelector — "Word" is misleading.

The constant name darkWordSelector contains "Word" which doesn't relate to its purpose (theme-mode detection for the "why" images). A clearer name like darkThemeSelector or darkModeSelector would better convey intent.

✏️ Suggested rename
-const darkWordSelector = 'html[data-theme-mode="dark"] &'
+const darkModeSelector = 'html[data-theme-mode="dark"] &'

 export const lightWhy = style({
   display: 'block',
   selectors: {
-    [darkWordSelector]: {
+    [darkModeSelector]: {
       display: 'none',
     },
   },
 })

 export const darkWhy = style({
   display: 'none',
   selectors: {
-    [darkWordSelector]: {
+    [darkModeSelector]: {
       display: 'block',
     },
   },
 })
🤖 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 `@apps/web/src/styles/about.css.ts` at line 19, Rename the misleading constant
darkWordSelector to a clearer name like darkThemeSelector (or darkModeSelector)
and update all references; specifically change the declaration const
darkWordSelector = 'html[data-theme-mode="dark"] &' to const darkThemeSelector =
'html[data-theme-mode="dark"] &' and replace every use of darkWordSelector in
the about.css.ts (and any imports/uses) with darkThemeSelector so the selector
name reflects theme-mode detection for the "why" images.
packages/ui/src/Tooltip/Tooltip.tsx (1)

7-9: ⚡ Quick win

Consider widening children from string to React.ReactNode.

Restricting to string prevents callers from embedding links, formatted text, or other React elements in tooltip content, which is a common use case.

♻️ Proposed refactor
-}: {
-  children: string
-  label?: string
-}) => {
+}: {
+  children: React.ReactNode
+  label?: string
+}) => {

Also add the import if not already present:

-import { useRef, useState } from 'react'
+import { type ReactNode, useRef, useState } from 'react'

And update the prop type:

-  children: string
+  children: ReactNode
🤖 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 `@packages/ui/src/Tooltip/Tooltip.tsx` around lines 7 - 9, The Tooltip
component currently types its children prop as string which prevents passing
JSX; update the prop type in Tooltip (where props are defined for the Tooltip
function/component) to accept React.ReactNode instead of string and add/import
React (or the React types) if not already imported so the type resolves; ensure
any related usages of the Tooltip children still work and adjust downstream
tests/types if necessary.
🤖 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 `@packages/ui/src/Tooltip/Tooltip.tsx`:
- Around line 18-19: Remove the redundant onMouseOver handler that duplicates
onMouseEnter in the Tooltip component: locate the JSX that attaches both
onMouseOver and onMouseEnter calling setShowTooltip(true) (e.g., inside
Tooltip's container/Box and the setShowTooltip state updater) and delete the
onMouseOver prop so only onMouseEnter remains to open the tooltip (avoids
bubbling from child Icon elements).

---

Nitpick comments:
In `@apps/web/src/styles/about.css.ts`:
- Line 19: Rename the misleading constant darkWordSelector to a clearer name
like darkThemeSelector (or darkModeSelector) and update all references;
specifically change the declaration const darkWordSelector =
'html[data-theme-mode="dark"] &' to const darkThemeSelector =
'html[data-theme-mode="dark"] &' and replace every use of darkWordSelector in
the about.css.ts (and any imports/uses) with darkThemeSelector so the selector
name reflects theme-mode detection for the "why" images.

In `@packages/ui/src/Tooltip/Tooltip.tsx`:
- Around line 7-9: The Tooltip component currently types its children prop as
string which prevents passing JSX; update the prop type in Tooltip (where props
are defined for the Tooltip function/component) to accept React.ReactNode
instead of string and add/import React (or the React types) if not already
imported so the type resolves; ensure any related usages of the Tooltip children
still work and adjust downstream tests/types if necessary.
🪄 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: 483a7d35-74a6-49c4-b6dc-46574d7b733f

📥 Commits

Reviewing files that changed from the base of the PR and between 2265c43 and a93a0c1.

⛔ Files ignored due to path filters (3)
  • apps/web/public/why-dark.svg is excluded by !**/*.svg
  • packages/zord/src/assets/brand/content-coin.svg is excluded by !**/*.svg
  • packages/zord/src/assets/monochrome/spanner.svg is excluded by !**/*.svg
📒 Files selected for processing (6)
  • apps/web/src/layouts/DefaultLayout/Nav.styles.css.ts
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx
  • apps/web/src/pages/about.tsx
  • apps/web/src/styles/about.css.ts
  • packages/ui/src/Tooltip/Tooltip.tsx
  • packages/utils/src/daoMetadata.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/web/src/pages/about.tsx
  • apps/web/src/layouts/DefaultLayout/NavMenu/ProfileMenu.tsx

Comment on lines 18 to +19
onMouseOver={() => setShowTooltip(true)}
onMouseEnter={() => setShowTooltip(true)}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the redundant onMouseOver handler.

Both onMouseOver (line 18) and onMouseEnter (line 19) call setShowTooltip(true). onMouseOver bubbles from child elements, so it fires redundantly whenever the cursor moves over the Icon inside the Box. onMouseEnter is the correct, non-bubbling replacement and is already present — onMouseOver should be dropped.

🐛 Proposed fix
       <Box
         cursor="pointer"
-        onMouseOver={() => setShowTooltip(true)}
         onMouseEnter={() => setShowTooltip(true)}
         onMouseLeave={() => setShowTooltip(false)}
📝 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
onMouseOver={() => setShowTooltip(true)}
onMouseEnter={() => setShowTooltip(true)}
<Box
cursor="pointer"
onMouseEnter={() => setShowTooltip(true)}
onMouseLeave={() => setShowTooltip(false)}
🤖 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 `@packages/ui/src/Tooltip/Tooltip.tsx` around lines 18 - 19, Remove the
redundant onMouseOver handler that duplicates onMouseEnter in the Tooltip
component: locate the JSX that attaches both onMouseOver and onMouseEnter
calling setShowTooltip(true) (e.g., inside Tooltip's container/Box and the
setShowTooltip state updater) and delete the onMouseOver prop so only
onMouseEnter remains to open the tooltip (avoids bubbling from child Icon
elements).

@dan13ram dan13ram force-pushed the feature/dark-mode branch from a93a0c1 to 22d5dc8 Compare May 5, 2026 16:25
@dan13ram dan13ram force-pushed the feature/dark-mode branch from 22d5dc8 to 73e79a4 Compare May 5, 2026 16:26
@dan13ram dan13ram merged commit 9b02325 into BuilderOSS:staging May 5, 2026
1 of 4 checks passed
@github-project-automation github-project-automation Bot moved this from 🔎 In Review to ✅ Done in Resident Cycle May 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

3 participants