@chakra-ui/select
Version:
1 lines • 7.19 kB
Source Map (JSON)
{"version":3,"sources":["../src/select.tsx","../../../utilities/object-utils/src/split.ts"],"sourcesContent":["import { FormControlOptions, useFormControl } from \"@chakra-ui/form-control\"\nimport {\n chakra,\n forwardRef,\n layoutPropNames,\n omitThemingProps,\n PropsOf,\n SystemStyleObject,\n ThemingProps,\n useMultiStyleConfig,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { dataAttr } from \"@chakra-ui/shared-utils\"\nimport { split } from \"@chakra-ui/object-utils\"\nimport { cloneElement, isValidElement } from \"react\"\n\nimport { SelectField, SelectFieldProps } from \"./select-field\"\n\ninterface RootProps extends Omit<HTMLChakraProps<\"div\">, \"color\"> {}\n\ninterface SelectOptions extends FormControlOptions {\n /**\n * The border color when the select is focused. Use color keys in `theme.colors`\n * @example\n * focusBorderColor = \"blue.500\"\n */\n focusBorderColor?: string\n /**\n * The border color when the select is invalid. Use color keys in `theme.colors`\n * @example\n * errorBorderColor = \"red.500\"\n */\n errorBorderColor?: string\n /**\n * The placeholder for the select. We render an `<option/>` element that has\n * empty value.\n *\n * ```jsx\n * <option value=\"\">{placeholder}</option>\n * ```\n */\n placeholder?: string\n /**\n * The size (width and height) of the icon\n */\n iconSize?: string\n /**\n * The color of the icon\n */\n iconColor?: string\n}\n\nexport interface SelectProps\n extends SelectFieldProps,\n ThemingProps<\"Select\">,\n SelectOptions {\n /**\n * Props to forward to the root `div` element\n */\n rootProps?: RootProps\n /**\n * The icon element to use in the select\n * @type React.ReactElement\n */\n icon?: React.ReactElement<any>\n}\n\n/**\n * React component used to select one item from a list of options.\n *\n * @see Docs https://chakra-ui.com/docs/components/select\n */\nexport const Select = forwardRef<SelectProps, \"select\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Select\", props)\n\n const {\n rootProps,\n placeholder,\n icon,\n color,\n height,\n h,\n minH,\n minHeight,\n iconColor,\n iconSize,\n ...rest\n } = omitThemingProps(props)\n\n const [layoutProps, otherProps] = split(rest, layoutPropNames as any[])\n\n const ownProps = useFormControl(otherProps)\n\n const rootStyles: SystemStyleObject = {\n width: \"100%\",\n height: \"fit-content\",\n position: \"relative\",\n color,\n }\n\n const fieldStyles: SystemStyleObject = {\n paddingEnd: \"2rem\",\n ...styles.field,\n _focus: {\n zIndex: \"unset\",\n ...(styles as any).field?.[\"_focus\"],\n },\n }\n\n return (\n <chakra.div\n className=\"chakra-select__wrapper\"\n __css={rootStyles}\n {...layoutProps}\n {...rootProps}\n >\n <SelectField\n ref={ref}\n height={h ?? height}\n minH={minH ?? minHeight}\n placeholder={placeholder}\n {...ownProps}\n __css={fieldStyles}\n >\n {props.children}\n </SelectField>\n\n <SelectIcon\n data-disabled={dataAttr(ownProps.disabled)}\n {...((iconColor || color) && { color: iconColor || color })}\n __css={styles.icon}\n {...(iconSize && { fontSize: iconSize })}\n >\n {icon}\n </SelectIcon>\n </chakra.div>\n )\n})\n\nSelect.displayName = \"Select\"\n\nexport const DefaultIcon: React.FC<PropsOf<\"svg\">> = (props) => (\n <svg viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\"\n />\n </svg>\n)\n\nconst IconWrapper = chakra(\"div\", {\n baseStyle: {\n position: \"absolute\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n pointerEvents: \"none\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n },\n})\n\ninterface SelectIconProps extends HTMLChakraProps<\"div\"> {}\n\nconst SelectIcon: React.FC<SelectIconProps> = (props) => {\n const { children = <DefaultIcon />, ...rest } = props\n\n const clone = cloneElement(children as any, {\n role: \"presentation\",\n className: \"chakra-select__icon\",\n focusable: false,\n \"aria-hidden\": true,\n // force icon to adhere to `IconWrapper` styles\n style: {\n width: \"1em\",\n height: \"1em\",\n color: \"currentColor\",\n },\n })\n\n return (\n <IconWrapper {...rest} className=\"chakra-select__icon-wrapper\">\n {isValidElement(children) ? clone : null}\n </IconWrapper>\n )\n}\n\nSelectIcon.displayName = \"SelectIcon\"\n","export function split<T extends Record<string, any>, K extends keyof T>(\n object: T,\n keys: K[],\n) {\n const picked: Record<string, any> = {}\n const omitted: Record<string, any> = {}\n\n for (const [key, value] of Object.entries(object)) {\n if (keys.includes(key as T[K])) picked[key] = value\n else omitted[key] = value\n }\n\n return [picked, omitted] as [\n {\n [P in K]: T[P]\n },\n Omit<T, K>,\n ]\n}\n"],"mappings":"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","names":[]}