From eda3b3855a17d3e5aed824c79625f2de4b887b81 Mon Sep 17 00:00:00 2001 From: Mohsen Ghaemaghami Date: Mon, 25 Aug 2025 20:02:08 +0300 Subject: [PATCH] Enhance Select component: make SelectOption and SelectProps generic for improved type flexibility. --- packages/components/package.json | 6 ++---- packages/components/src/ui/select.tsx | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/components/package.json b/packages/components/package.json index 208adedd..ded9ce4a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@lambdacurry/forms", - "version": "0.19.5", + "version": "0.20.0", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -26,9 +26,7 @@ "import": "./dist/ui/*.js" } }, - "files": [ - "dist" - ], + "files": ["dist"], "scripts": { "prepublishOnly": "yarn run build", "build": "vite build", diff --git a/packages/components/src/ui/select.tsx b/packages/components/src/ui/select.tsx index c62399fd..fc45baac 100644 --- a/packages/components/src/ui/select.tsx +++ b/packages/components/src/ui/select.tsx @@ -5,9 +5,9 @@ import { useOverlayTriggerState } from 'react-stately'; import { PopoverContent, PopoverTrigger } from './popover'; import { cn } from './utils'; -export interface SelectOption { +export interface SelectOption { label: string; - value: string; + value: T; } export interface SelectUIComponents { @@ -22,10 +22,11 @@ export interface SelectUIComponents { ChevronIcon?: React.ComponentType>; } -export interface SelectProps extends Omit, 'value' | 'onChange'> { - options: SelectOption[]; - value?: string; - onValueChange?: (value: string) => void; +export interface SelectProps + extends Omit, 'value' | 'onChange'> { + options: SelectOption[]; + value?: T; + onValueChange?: (value: T) => void; placeholder?: string; disabled?: boolean; className?: string; @@ -34,7 +35,7 @@ export interface SelectProps extends Omit; } -export function Select({ +export function Select({ options, value, onValueChange, @@ -45,7 +46,7 @@ export function Select({ itemClassName, components, ...buttonProps -}: SelectProps) { +}: SelectProps) { const popoverState = useOverlayTriggerState({}); const listboxId = React.useId(); const [query, setQuery] = React.useState(''); @@ -174,7 +175,7 @@ export function Select({ const isSelected = option.value === value; const isEnterCandidate = query.trim() !== '' && enterCandidate?.value === option.value && !isSelected; return ( -
  • +
  • {