diff --git a/src/front/Components/DesignSystem/Dropdown/index.tsx b/src/front/Components/DesignSystem/Dropdown/index.tsx index f325a0e5..b88dae07 100644 --- a/src/front/Components/DesignSystem/Dropdown/index.tsx +++ b/src/front/Components/DesignSystem/Dropdown/index.tsx @@ -53,7 +53,7 @@ export default function Dropdown(props: IProps) { disabled && classes["disabled"], !!selectedOption && classes["active"], ])} - onClick={openable.toggle}> + onClick={() => openable.toggle()}>
{getLabelContent(selectedOption, placeholder)} diff --git a/src/front/Components/DesignSystem/Toggle/classes.module.scss b/src/front/Components/DesignSystem/Toggle/classes.module.scss new file mode 100644 index 00000000..83ee91b9 --- /dev/null +++ b/src/front/Components/DesignSystem/Toggle/classes.module.scss @@ -0,0 +1,46 @@ +@import "@Themes/constants.scss"; + +.root { + cursor: pointer; + height: fit-content; + + display: flex; + width: 48px; + padding: var(--Radius-xs, 2px); + gap: 8px; + + border-radius: var(--toggle-radius, 360px); + background: var(--toggle-off-background, #edeff1); + + .circle { + width: 20px; + height: 20px; + flex-shrink: 0; + + border-radius: var(--toggle-radius, 360px); + background: var(--toggle-switch-background, #fff); + + transition: transform 0.3s ease-in-out; + + &.active { + transform: translateX(24px); + } + } + + &.sm { + width: 40px; + + .circle { + width: 16px; + height: 16px; + + &.active { + transform: translateX(20px); + } + } + } + + &.active { + background-color: var(--toggle-on-background, #005bcb); + } +} diff --git a/src/front/Components/DesignSystem/Toggle/index.tsx b/src/front/Components/DesignSystem/Toggle/index.tsx new file mode 100644 index 00000000..db00bc4d --- /dev/null +++ b/src/front/Components/DesignSystem/Toggle/index.tsx @@ -0,0 +1,38 @@ +import useToggle from "@Front/Hooks/useToggle"; +import classNames from "classnames"; +import React, { useCallback } from "react"; + +import classes from "./classes.module.scss"; + +export enum EToggleSize { + MD = "md", + SM = "sm", +} + +export enum ETagVariant { + REGULAR = "regular", + SEMI_BOLD = "semi_bold", +} + +type IProps = { + onChange?: (value: boolean) => void; + defaultActive?: boolean; + size?: EToggleSize; + className?: string; +}; + +export default function Toggle(props: IProps) { + const { className, defaultActive = false, size = EToggleSize.MD } = props; + + const { active, toggle } = useToggle(defaultActive); + + const handleToggle = useCallback(() => { + toggle((isOpen) => props.onChange?.(isOpen)); + }, [toggle, props]); + + return ( +
+
+
+ ); +} diff --git a/src/front/Components/Layouts/DesignSystem/classes.module.scss b/src/front/Components/Layouts/DesignSystem/classes.module.scss index 90be8834..c0f72ca1 100644 --- a/src/front/Components/Layouts/DesignSystem/classes.module.scss +++ b/src/front/Components/Layouts/DesignSystem/classes.module.scss @@ -15,6 +15,7 @@ .rows { display: flex; + align-items: center; gap: 16px; } } diff --git a/src/front/Components/Layouts/DesignSystem/index.tsx b/src/front/Components/Layouts/DesignSystem/index.tsx index ed14fef5..dc0dee1c 100644 --- a/src/front/Components/Layouts/DesignSystem/index.tsx +++ b/src/front/Components/Layouts/DesignSystem/index.tsx @@ -35,6 +35,7 @@ import { useCallback, useMemo, useState } from "react"; import classes from "./classes.module.scss"; import CheckboxesInputElement from "@Front/Components/DesignSystem/CheckBox"; import RadioBox from "@Front/Components/DesignSystem/RadioBox"; +import Toggle, { EToggleSize } from "@Front/Components/DesignSystem/Toggle"; export default function DesignSystem() { const { isOpen, open, close } = useOpenable(); @@ -87,6 +88,15 @@ export default function DesignSystem() {
+ Toggle +
+ + +
+
+ + +
Autocomplete Multi Select { - setActive((prev) => !prev); + const toggle = useCallback((callback?: (isOpen: boolean) => void) => { + setActive((prev) => { + callback?.(!prev); + return !prev; + }); }, []); const activate = useCallback(() => {