From b3280a848311f670a9a87a41766b66fe01995cbc Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Tue, 5 May 2026 11:38:39 -0400 Subject: [PATCH] feat(headless): add Select primitive --- packages/headless/package.json | 4 + .../headless/src/primitives/select/README.md | 163 ++++ .../headless/src/primitives/select/index.ts | 12 + .../src/primitives/select/select.test.tsx | 704 ++++++++++++++++++ .../headless/src/primitives/select/select.tsx | 625 ++++++++++++++++ packages/headless/vite.config.ts | 1 + 6 files changed, 1509 insertions(+) create mode 100644 packages/headless/src/primitives/select/README.md create mode 100644 packages/headless/src/primitives/select/index.ts create mode 100644 packages/headless/src/primitives/select/select.test.tsx create mode 100644 packages/headless/src/primitives/select/select.tsx diff --git a/packages/headless/package.json b/packages/headless/package.json index 97ecfbd4c03..97d663f1487 100644 --- a/packages/headless/package.json +++ b/packages/headless/package.json @@ -20,6 +20,10 @@ "import": "./dist/primitives/popover/index.js", "types": "./dist/primitives/popover/index.d.ts" }, + "./select": { + "import": "./dist/primitives/select/index.js", + "types": "./dist/primitives/select/index.d.ts" + }, "./dialog": { "import": "./dist/primitives/dialog/index.js", "types": "./dist/primitives/dialog/index.d.ts" diff --git a/packages/headless/src/primitives/select/README.md b/packages/headless/src/primitives/select/README.md new file mode 100644 index 00000000000..21cb4813135 --- /dev/null +++ b/packages/headless/src/primitives/select/README.md @@ -0,0 +1,163 @@ +# Select + +A dropdown select component with keyboard navigation, typeahead, and optional item-to-trigger alignment. Replaces native ` + + + + + + + + + + +; +``` + +### Controlled + +```tsx +const [value, setValue] = useState('apple'); + +; +``` + +### With `items` for SSR label resolution + +The `items` prop allows label resolution before options mount (useful for server rendering or deferred lists): + +```tsx +const items = [ + { value: 'apple', label: 'Apple' }, + { value: 'banana', label: 'Banana' }, +]; + +; +``` + +### Disable item-to-trigger alignment + +By default, the selected option visually aligns with the trigger. Disable this for standard dropdown positioning: + +```tsx + +``` + +## Parts + +| Part | Default Element | Description | +| ------------------- | --------------- | ------------------------------------------ | +| `Select` | — | Root context provider | +| `Select.Trigger` | `