diff --git a/components/TempDesignSystem/Form/Switch/index.tsx b/components/TempDesignSystem/Form/Switch/index.tsx new file mode 100644 index 000000000..347be7eda --- /dev/null +++ b/components/TempDesignSystem/Form/Switch/index.tsx @@ -0,0 +1,51 @@ +"use client" + +import { Switch as AriaSwitch } from "react-aria-components" +import { useController, useFormContext } from "react-hook-form" + +import { InfoCircleIcon } from "@/components/Icons" +import Caption from "@/components/TempDesignSystem/Text/Caption" + +import styles from "./switch.module.css" + +import type { SwitchProps } from "@/types/components/switch" + +export default function Switch({ + className, + name, + children, + registerOptions, +}: React.PropsWithChildren) { + const { control } = useFormContext() + const { field, fieldState } = useController({ + control, + name, + rules: registerOptions, + }) + + return ( + + {({ isSelected }) => ( + <> + + {children} + + + {fieldState.error ? ( + + + {fieldState.error.message} + + ) : null} + + )} + + ) +} diff --git a/components/TempDesignSystem/Form/Switch/switch.module.css b/components/TempDesignSystem/Form/Switch/switch.module.css new file mode 100644 index 000000000..f447459d6 --- /dev/null +++ b/components/TempDesignSystem/Form/Switch/switch.module.css @@ -0,0 +1,44 @@ +.container { + display: flex; + flex-direction: row; + color: var(--text-color); + cursor: pointer; +} + +.switch { + width: 40px; + height: 24px; + border: 2px solid var(--UI-Input-Controls-Border-Normal); + background: var(--UI-Input-Controls-Surface-Normal); + border-radius: 24px; + transition: all 200ms; + display: block; + + &:before { + content: ""; + display: block; + margin: 2px; + width: 16px; + height: 16px; + background: var(--UI-Input-Controls-Border-Normal); + border-radius: 100%; + transition: all 200ms; + } +} + +.container[data-selected] { + .switch { + border-color: var(--UI-Input-Controls-Fill-Selected); + background: var(--UI-Input-Controls-Fill-Selected); + + &:before { + background: var(--UI-Input-Controls-Surface-Normal); + transform: translateX(100%); + } + } +} + +.container[data-focus-visible] .switch { + outline: 2px solid var(--focus-ring-color); + outline-offset: 2px; +} diff --git a/types/components/switch/index.ts b/types/components/switch/index.ts new file mode 100644 index 000000000..f3d56f6bb --- /dev/null +++ b/types/components/switch/index.ts @@ -0,0 +1,7 @@ +import type { RegisterOptions } from "react-hook-form" + +export interface SwitchProps + extends React.InputHTMLAttributes { + name: string + registerOptions?: RegisterOptions +}