@@ -48,6 +48,8 @@ Map component structures as follows:
...
@@ -48,6 +48,8 @@ Map component structures as follows:
All enum filter dropdowns must use the shared HeroUI `Select + ListBox` adapter (`FilterSelect.jsx`). All enum fields in business forms and dialogs must use the shared HeroUI compatibility adapter (`FormSelect.jsx`). Visible native HTML/Catalyst Select popups are prohibited throughout a Xinyuan application because their operating-system surface, selected slab, theme and viewport behavior cannot meet this contract.
All enum filter dropdowns must use the shared HeroUI `Select + ListBox` adapter (`FilterSelect.jsx`). All enum fields in business forms and dialogs must use the shared HeroUI compatibility adapter (`FormSelect.jsx`). Visible native HTML/Catalyst Select popups are prohibited throughout a Xinyuan application because their operating-system surface, selected slab, theme and viewport behavior cannot meet this contract.
HeroUI v3.2 Selects must use the current controlled `value` / `onChange` contract. Single selection passes one key or `null`; multiple selection passes a key array. Do not control a Select root with deprecated `selectedKey` / `selectedKeys` and `onSelectionChange`: multi-select state will split from the trigger value, and dialog edits can appear selected in the popup without updating the draft. Render the arrow through `Select.Indicator` with the shared `ChevronDown` adapter so it is always visible and receives the component's open state. Single-select popups close after selection; multi-select popups remain open until the user dismisses them.
Closed-trigger parity is insufficient. The first-pass audit must open every Select, page-size Select, remote-reference popup, multi-select, DatePicker and dialog form dropdown in the browser. Verify the visible popup surface, 12px radius, option height, selected row, checkmark, chevron, internal scroll, viewport bounds, Portal stacking and dark theme before approving the page. A page that still has a native/Catalyst/OS popup, HeroUI default blue selected option, old page-local chevron, white dark-mode island, or uninspected dropdown state is not migrated.
Closed-trigger parity is insufficient. The first-pass audit must open every Select, page-size Select, remote-reference popup, multi-select, DatePicker and dialog form dropdown in the browser. Verify the visible popup surface, 12px radius, option height, selected row, checkmark, chevron, internal scroll, viewport bounds, Portal stacking and dark theme before approving the page. A page that still has a native/Catalyst/OS popup, HeroUI default blue selected option, old page-local chevron, white dark-mode island, or uninspected dropdown state is not migrated.
Remote reference and multi-select controls must not be implemented as a HeroUI `Select` root when the popup contains multiple interactive rows. Use the shared `ReferenceSearchSelect.jsx` pattern: HeroUI `Popover` controlled by a HeroUI `Button` trigger, with only the HeroUI `ListBox` and necessary lightweight actions inside the popover. Do not render a second full-width search/input field inside the dropdown; the closed trigger is the only visible field surface. Keep `selectedKeys` / `onSelectionChange` on the `ListBox`, preserve the original ID-only callback protocol, and verify `aria-expanded` changes to `true` on click before approving the field.
Remote reference and multi-select controls must not be implemented as a HeroUI `Select` root when the popup contains multiple interactive rows. Use the shared `ReferenceSearchSelect.jsx` pattern: HeroUI `Popover` controlled by a HeroUI `Button` trigger, with only the HeroUI `ListBox` and necessary lightweight actions inside the popover. Do not render a second full-width search/input field inside the dropdown; the closed trigger is the only visible field surface. Keep `selectedKeys` / `onSelectionChange` on the `ListBox`, preserve the original ID-only callback protocol, and verify `aria-expanded` changes to `true` on click before approving the field.