Skip to content

[#171] Replace native selects with custom dark-themed dropdown#173

Merged
realproject7 merged 2 commits intomainfrom
task/171-custom-dropdown
Mar 16, 2026
Merged

[#171] Replace native selects with custom dark-themed dropdown#173
realproject7 merged 2 commits intomainfrom
task/171-custom-dropdown

Conversation

@realproject7
Copy link
Copy Markdown
Owner

Summary

  • New Select.tsx component: custom dropdown with dark theme, keyboard navigation (arrow keys, enter, escape), click-outside-to-close, hover/active states
  • Replaced all 3 native <select> elements: chain page storyline selector, register-agent genre + model selectors
  • Removed select option CSS from globals.css (no longer needed)

Fixes #171

Test plan

  • tsc --noEmit — zero errors
  • next build — clean
  • vitest run — 22/22 tests pass
  • Open dropdown on chain page — dark themed options, accent highlight on selected
  • Keyboard: arrow keys navigate, enter selects, escape closes
  • Click outside dropdown to close
  • Test at 375px width

🤖 Generated with Claude Code

New Select.tsx component with keyboard navigation (arrows, enter,
escape), click-outside-to-close, hover/active states, and dark theme
matching design system. Replaced all 3 native selects (chain page,
register-agent genre + model). Removed unused select option CSS.

Fixes #171

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@project7-interns project7-interns left a comment

Choose a reason for hiding this comment

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

T2b APPROVE

Well-built custom Select component:

  1. Select.tsx — Full keyboard navigation (arrows, enter, escape, space to open), click-outside-to-close via mousedown listener, scroll-into-view for focused items. Proper ARIA attributes (haspopup, expanded, listbox, option, selected). Clean controlled API.

  2. Integration — All 3 native selects replaced. Chain page correctly handles number↔string conversion. Register-agent page is straightforward.

  3. Cleanupselect option CSS removed from globals.css. Base select appearance styles remain (harmless if no native selects left).

No issues found.

Copy link
Copy Markdown
Collaborator

@project7-interns project7-interns left a comment

Choose a reason for hiding this comment

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

Verdict: REQUEST CHANGES

Summary

The custom dropdown implementation is close, but it regresses existing behavior by removing the ability to clear a selection back to the placeholder/empty state. The replaced native selects all exposed an empty option ("Select ..."), and the new component no longer provides any way to re-select that blank value once a user has picked something.

Findings

  • [medium] Select does not preserve the empty placeholder option, so the chain storyline selector and both register-agent selectors can no longer be cleared after a value has been chosen.
    • File: src/components/Select.tsx:32
    • Suggestion: Treat the placeholder as a real first option (for example value: "") or otherwise add an explicit clear/reset path so existing blank-state behavior is preserved.

Decision

Requesting changes because the custom component removes an existing user flow that the native selects supported: returning to the empty placeholder state. Once that is restored, the rest of the dropdown replacement looks appropriately scoped to #171.

Prepend the placeholder text as an empty-value option so users can
clear their selection back to blank, matching native select behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@project7-interns project7-interns left a comment

Choose a reason for hiding this comment

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

Verdict: APPROVE

Summary

The follow-up commit restores the blank-state behavior by making the placeholder a selectable empty-value option in the custom dropdown. That closes the functional regression from the first review, and the custom select replacement now looks appropriately scoped to #171.

Findings

  • [info] No remaining blocking findings after 4c1da55.
    • File: src/components/Select.tsx:32
    • Suggestion: None.

Decision

Approving because the prior clear-to-empty regression is resolved, the custom dropdown still satisfies the styling/accessibility goals of #171, and lint-and-typecheck plus local typecheck, test, and build validation pass.

@realproject7 realproject7 merged commit 9b57440 into main Mar 16, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[QA-Bug] Dropdown option styling ignored on macOS — needs custom JS dropdown component

2 participants