From bab705b8fb017130b39e6a162b8044974881d071 Mon Sep 17 00:00:00 2001 From: Igor Aralov Date: Sun, 19 Jan 2025 16:04:32 +0300 Subject: [PATCH 1/2] Add hover effect to button --- src/shared/button/Button.modules.scss | 14 ++++++++++---- src/shared/button/Button.tsx | 3 +-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/shared/button/Button.modules.scss b/src/shared/button/Button.modules.scss index b476ee8aa..367b092c6 100644 --- a/src/shared/button/Button.modules.scss +++ b/src/shared/button/Button.modules.scss @@ -6,9 +6,15 @@ border: none; border-radius: 5px; cursor: pointer; -} -.disabled { - cursor: not-allowed; - opacity: 0.6; + &:hover { + &:not([disabled]) { + background-color: #0056b3; + } + } + + &:disabled { + cursor: not-allowed; + opacity: 0.6; + } } diff --git a/src/shared/button/Button.tsx b/src/shared/button/Button.tsx index 41bd4eef8..57ac8ecbb 100644 --- a/src/shared/button/Button.tsx +++ b/src/shared/button/Button.tsx @@ -1,5 +1,4 @@ import React, { ReactNode, MouseEvent } from 'react'; -import cn from 'clsx'; import s from './Button.modules.scss'; type ButtonProps = { @@ -9,7 +8,7 @@ type ButtonProps = { }; export const Button = ({ children, onClick, disabled = false }: ButtonProps) => ( - ); From ac21245adcf9f645a2cd3c5cb8e1805fb9885c56 Mon Sep 17 00:00:00 2001 From: Igor Aralov Date: Sun, 19 Jan 2025 16:06:32 +0300 Subject: [PATCH 2/2] =?UTF-8?q?[9]=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=BB=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20"=D0=A1=D0=B2=D0=BE=D1=80=D0=B0=D1=87=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5"=20(Collapse)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/collapse/Collapse.module.scss | 27 +++++++++++++ src/shared/collapse/Collapse.tsx | 50 ++++++++++++++++++++++++ src/stories/Collapse.stories.tsx | 29 ++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/shared/collapse/Collapse.module.scss create mode 100644 src/shared/collapse/Collapse.tsx create mode 100644 src/stories/Collapse.stories.tsx diff --git a/src/shared/collapse/Collapse.module.scss b/src/shared/collapse/Collapse.module.scss new file mode 100644 index 000000000..c12dfaa73 --- /dev/null +++ b/src/shared/collapse/Collapse.module.scss @@ -0,0 +1,27 @@ +.collapse-container { + border: 1px solid #ccc; + border-radius: 4px; + margin: 10px 0; + overflow: hidden; +} + +.collapse-button { + width: 100%; + background-color: #007bff; + color: white; + padding: 10px; + border: none; + cursor: pointer; + text-align: left; + font-size: 1em; + + &:hover { + background-color: #0056b3; + } +} + +.collapse-content { + padding: 10px; + background-color: #f9f9f9; + transition: height 0.3s ease; +} diff --git a/src/shared/collapse/Collapse.tsx b/src/shared/collapse/Collapse.tsx new file mode 100644 index 000000000..a5b8a730f --- /dev/null +++ b/src/shared/collapse/Collapse.tsx @@ -0,0 +1,50 @@ +import React, { useState, useRef, useEffect, ReactNode } from 'react'; +import s from './Collapse.module.scss'; + +type CollapseProps = { + title: string; + children: ReactNode; +}; + +export const Collapse = ({ title, children }: CollapseProps) => { + const [isOpen, setIsOpen] = useState(false); + const [height, setHeight] = useState(0); + const contentRef = useRef(null); + + const toggleCollapse = () => { + setIsOpen(!isOpen); + }; + + useEffect(() => { + const resizeObserver = new ResizeObserver((entries) => + entries.forEach((entry) => setHeight(entry.borderBoxSize[0].blockSize)) + ); + + const currentContentRef = contentRef.current; + + currentContentRef && resizeObserver.observe(currentContentRef); + + return () => { + currentContentRef && resizeObserver.unobserve(currentContentRef); + }; + }, []); + + return ( +
+ +
+
+ {children} +
+
+
+ ); +}; diff --git a/src/stories/Collapse.stories.tsx b/src/stories/Collapse.stories.tsx new file mode 100644 index 000000000..e43b503a4 --- /dev/null +++ b/src/stories/Collapse.stories.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import type { Meta } from '@storybook/react'; + +import { Collapse } from '../shared/collapse/Collapse'; +import { Button } from '../shared/button/Button'; + +const meta: Meta = { + component: Collapse, + title: 'Сложные компоненты/Сворачивание', + tags: ['autodocs'], +}; + +export default meta; + +export const Test = { + args: { + title: 'Сворачиваемый контент', + children: ( + <> + +

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Incidunt, perferendis! Non autem consectetur amet + sint at saepe veniam doloremque, culpa dolore corporis ad consequuntur temporibus? Magni laudantium eum dolor + tempora. +

+ + ), + }, +};