2021-11-10 11:16:32 +00:00
|
|
|
import React from "react";
|
2022-04-14 14:58:23 +00:00
|
|
|
import ReactSelect, { components, GroupBase, Props, InputProps } from "react-select";
|
2021-09-22 19:52:38 +00:00
|
|
|
|
2021-09-14 08:45:28 +00:00
|
|
|
import classNames from "@lib/classNames";
|
|
|
|
|
2022-04-14 14:58:23 +00:00
|
|
|
export type SelectProps<
|
|
|
|
Option,
|
|
|
|
IsMulti extends boolean = false,
|
|
|
|
Group extends GroupBase<Option> = GroupBase<Option>
|
|
|
|
> = Props<Option, IsMulti, Group>;
|
|
|
|
|
|
|
|
export const InputComponent = <Option, IsMulti extends boolean, Group extends GroupBase<Option>>({
|
|
|
|
inputClassName,
|
|
|
|
...props
|
|
|
|
}: InputProps<Option, IsMulti, Group>) => {
|
|
|
|
return (
|
|
|
|
<components.Input
|
|
|
|
// disables our default form focus hightlight on the react-select input element
|
|
|
|
inputClassName={classNames("focus:ring-0 focus:ring-offset-0", inputClassName)}
|
|
|
|
{...props}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2021-11-10 11:16:32 +00:00
|
|
|
function Select<
|
|
|
|
Option,
|
|
|
|
IsMulti extends boolean = false,
|
|
|
|
Group extends GroupBase<Option> = GroupBase<Option>
|
2022-04-14 14:58:23 +00:00
|
|
|
>({ className, ...props }: SelectProps<Option, IsMulti, Group>) {
|
2021-11-10 11:16:32 +00:00
|
|
|
return (
|
|
|
|
<ReactSelect
|
|
|
|
theme={(theme) => ({
|
|
|
|
...theme,
|
|
|
|
borderRadius: 2,
|
|
|
|
colors: {
|
|
|
|
...theme.colors,
|
2022-04-14 14:58:23 +00:00
|
|
|
primary: "var(--brand-color)",
|
2022-03-22 10:34:36 +00:00
|
|
|
|
|
|
|
primary50: "rgba(209 , 213, 219, var(--tw-bg-opacity))",
|
2021-11-10 11:16:32 +00:00
|
|
|
primary25: "rgba(244, 245, 246, var(--tw-bg-opacity))",
|
|
|
|
},
|
|
|
|
})}
|
2022-03-18 18:31:30 +00:00
|
|
|
styles={{
|
2022-04-14 14:58:23 +00:00
|
|
|
option: (provided, state) => ({
|
|
|
|
...provided,
|
|
|
|
color: state.isSelected ? "var(--brand-text-color)" : "black",
|
2022-03-18 18:31:30 +00:00
|
|
|
":active": {
|
2022-04-14 14:58:23 +00:00
|
|
|
backgroundColor: state.isSelected ? "" : "var(--brand-color)",
|
|
|
|
color: "var(--brand-text-color)",
|
2022-03-18 18:31:30 +00:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
}}
|
2021-11-10 11:16:32 +00:00
|
|
|
components={{
|
|
|
|
...components,
|
|
|
|
IndicatorSeparator: () => null,
|
2022-04-14 14:58:23 +00:00
|
|
|
Input: InputComponent,
|
2021-11-10 11:16:32 +00:00
|
|
|
}}
|
2022-04-14 14:58:23 +00:00
|
|
|
className={classNames("text-sm shadow-sm", className)}
|
2021-11-10 11:16:32 +00:00
|
|
|
{...props}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
2021-09-14 08:45:28 +00:00
|
|
|
|
2021-11-10 11:16:32 +00:00
|
|
|
export default Select;
|