Implement select dropdown widget (Phase 16)
Add interactive dropdown popup for <select> elements with full keyboard
navigation, mouse interaction, type-ahead search, and multiple select
support as a scrollable listbox.
DOM (crates/dom):
- Add select open/close state tracking (select_open, select_highlighted)
- Add SelectOptionInfo struct for option metadata
- Add select_options(), selected_index(), select_option_at() helpers
- Add type-ahead search with 1-second timeout buffer
- Tests for all select DOM operations
Layout (crates/layout):
- Extend FormControlInfo with dropdown_open, options, highlighted_index,
multiple, visible_size fields
- Add SelectOption struct for render-side option data
- Support <select multiple> sizing with size attribute
Render (crates/render):
- Two-phase rendering: collect open dropdowns during paint, render
overlays after main pass (ensures dropdowns paint on top)
- Dropdown overlay with shadow, border, highlighted option, optgroup
labels
- Multiple select listbox rendering with selection highlighting
- paint_rect_border helper, dropdown_menu_geometry public API
Browser (crates/browser):
- Click to open/close single-select dropdown
- Click on dropdown option to select it
- Click outside dropdown to dismiss
- Keyboard: Space/Enter to open/close, Up/Down to navigate options,
Escape to close, Home/End for first/last option
- Arrow keys cycle selection on closed single-select
- Multiple select: click to select, Cmd+Click to toggle, Up/Down
keyboard navigation, Space to toggle
- Type-ahead character search in open dropdown
- Hit-testing for dropdown overlay menu
- Close dropdowns on Tab navigation
JS bridge (crates/js):
- select.value getter/setter
- select.selectedIndex getter/setter
- select.options (HTMLOptionsCollection)
- select.selectedOptions
- select.type ("select-one" / "select-multiple")
- option.selected getter/setter
- input.checked, input.type, element.disabled getter/setters
- Tests for JS select interface
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>