({ label, hint, options, className, selectClassName, size = "md", ...props }: NativeSelectProps)
| 30 | }; |
| 31 | |
| 32 | export const NativeSelect = ({ label, hint, options, className, selectClassName, size = "md", ...props }: NativeSelectProps) => { |
| 33 | const id = useId(); |
| 34 | const selectId = `select-native-${id}`; |
| 35 | const hintId = `select-native-hint-${id}`; |
| 36 | |
| 37 | return ( |
| 38 | <div className={cx("w-full in-data-input-wrapper:w-max", className)}> |
| 39 | {label && ( |
| 40 | <Label htmlFor={selectId} id={selectId} className="mb-1.5"> |
| 41 | {label} |
| 42 | </Label> |
| 43 | )} |
| 44 | |
| 45 | <div className="relative grid w-full items-center"> |
| 46 | <select |
| 47 | {...props} |
| 48 | id={selectId} |
| 49 | aria-describedby={hintId} |
| 50 | aria-labelledby={selectId} |
| 51 | className={cx( |
| 52 | "appearance-none rounded-lg bg-primary font-medium text-primary shadow-xs ring-1 ring-primary outline-hidden transition duration-100 ease-linear ring-inset placeholder:text-fg-quaternary focus-visible:ring-2 focus-visible:ring-brand disabled:cursor-not-allowed disabled:opacity-50", |
| 53 | |
| 54 | styles[size].root, |
| 55 | |
| 56 | // Styles when the select is within an `InputGroup` |
| 57 | "in-data-input-wrapper:flex in-data-input-wrapper:h-full in-data-input-wrapper:gap-1 in-data-input-wrapper:bg-inherit in-data-input-wrapper:px-3 in-data-input-wrapper:py-2 in-data-input-wrapper:font-normal in-data-input-wrapper:text-tertiary in-data-input-wrapper:shadow-none in-data-input-wrapper:ring-transparent in-data-input-wrapper:in-data-[size=sm]:text-sm", |
| 58 | // Styles for the select when `TextField` is disabled |
| 59 | "in-data-input-wrapper:group-disabled:pointer-events-none in-data-input-wrapper:group-disabled:cursor-not-allowed in-data-input-wrapper:group-disabled:bg-transparent", |
| 60 | // Common styles for sizes and border radius within `InputGroup` |
| 61 | "in-data-input-wrapper:in-data-leading:rounded-r-none in-data-input-wrapper:in-data-trailing:rounded-l-none in-data-input-wrapper:in-data-[input-size=lg]:py-2.5 in-data-input-wrapper:in-data-[input-size=md]:py-2 in-data-input-wrapper:in-data-[input-size=md]:pl-3 in-data-input-wrapper:in-data-[input-size=sm]:text-sm", |
| 62 | // For "leading" dropdown within `InputGroup` |
| 63 | "in-data-input-wrapper:in-data-leading:pr-4.5 in-data-input-wrapper:in-data-leading:in-data-[input-size=lg]:pl-3.5 in-data-input-wrapper:in-data-leading:in-data-[input-size=md]:pr-4.5 in-data-input-wrapper:in-data-leading:in-data-[input-size=md]:pl-3 in-data-input-wrapper:in-data-leading:in-data-[input-size=sm]:pr-3.5", |
| 64 | // For "trailing" dropdown within `InputGroup` |
| 65 | "in-data-input-wrapper:in-data-trailing:in-data-[input-size=lg]:pr-8 in-data-input-wrapper:in-data-trailing:in-data-[input-size=md]:pr-7.5 in-data-input-wrapper:in-data-trailing:in-data-[input-size=sm]:pr-6.5", |
| 66 | selectClassName, |
| 67 | )} |
| 68 | > |
| 69 | {options.map((opt) => ( |
| 70 | <option key={opt.value} value={opt.value}> |
| 71 | {opt.label} |
| 72 | </option> |
| 73 | ))} |
| 74 | </select> |
| 75 | |
| 76 | <ChevronDown |
| 77 | aria-hidden="true" |
| 78 | className={cx( |
| 79 | "pointer-events-none absolute text-fg-quaternary", |
| 80 | |
| 81 | styles[size].icon, |
| 82 | // Styles for the icon when the select is within an `InputGroup` |
| 83 | "in-data-input-wrapper:right-0 in-data-input-wrapper:size-4 in-data-input-wrapper:stroke-[2.625px]", |
| 84 | // For "trailing" dropdown within `InputGroup` |
| 85 | "in-data-input-wrapper:in-data-trailing:in-data-[input-size=md]:right-3 in-data-input-wrapper:in-data-trailing:in-data-[input-size=sm]:right-3", |
| 86 | )} |
| 87 | /> |
| 88 | </div> |
| 89 |
nothing calls this directly
no outgoing calls
no test coverage detected