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) => ( - ); 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. +

+ + ), + }, +};