From 54cb4607c5c3d14837f0dbdf9e6e46049be25b40 Mon Sep 17 00:00:00 2001 From: Vyacheslav Date: Sat, 14 Jun 2025 20:42:30 +0500 Subject: [PATCH] add ReleaseList and all for it --- src/components/ReleaseList/ReleaseList.tsx | 37 +++++++++++++++ src/components/Surface/Surface.module.css | 52 ++++++++++++++++++++++ src/components/Surface/Surface.tsx | 43 ++++++++++++++++++ src/pages/Timers/Timers.module.css | 6 +++ src/pages/Timers/Timers.tsx | 30 ++++++++----- 5 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 src/components/ReleaseList/ReleaseList.tsx create mode 100644 src/components/Surface/Surface.module.css create mode 100644 src/components/Surface/Surface.tsx diff --git a/src/components/ReleaseList/ReleaseList.tsx b/src/components/ReleaseList/ReleaseList.tsx new file mode 100644 index 0000000..241f77d --- /dev/null +++ b/src/components/ReleaseList/ReleaseList.tsx @@ -0,0 +1,37 @@ +import Surface from "../Surface/Surface.tsx"; + +interface ReleaseListProps { + isOpen: boolean; + onClose: () => void; +} + +const ReleaseList = ({isOpen, onClose}: ReleaseListProps) => { + return ( + +

v1.1.0 - Я все помню

+

14.06.2025

+ При обновлении страницы все таймеры сохранят свое состояние, при условии что были созданы сегодня + +
+ +

v1.0.0 - Ура, новые таймеры!

+

30.10.2024

+ Сверху каждого таймера представлены кнопки для базового управления: добавление/вычитание минут и очистка таймера +
+ По центру время до конца таймера +
+ Внизу каждого таймера базовые шаблоны для создания нового таймера, все значения указаны в минутах + +
+ +

Список респектов

+ Слава красава, сделал все +
+ Лизе спасибо за макет +
+ Игорь просто сигма, рядом посидел (все претензии к нему) +
+ ); +}; + +export default ReleaseList; \ No newline at end of file diff --git a/src/components/Surface/Surface.module.css b/src/components/Surface/Surface.module.css new file mode 100644 index 0000000..b4b0881 --- /dev/null +++ b/src/components/Surface/Surface.module.css @@ -0,0 +1,52 @@ +.surfaceOverlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + padding: 2rem; + box-sizing: border-box; +} + +.surfaceFrame { + display: flex; + flex-direction: column; + background-color: #FFFFFF; + padding: 0; + border-radius: 1.6rem; + position: relative; + z-index: 1001; + font-size: 2.4rem; + color: #000000; + max-width: 80%; + max-height: 80%; + overflow: hidden; + box-sizing: border-box; +} + +.surfaceContent { + padding: 3.2rem; + /*max-height: 100%;*/ + flex: 1 1 auto; + overflow: auto; + box-sizing: border-box; +} + +.closeButton { + position: absolute; + top: 1rem; + right: 1rem; + background: none; + border: none; + font-size: 2.4rem; + cursor: pointer; +} + +.closeButton:hover { + color: #666; +} \ No newline at end of file diff --git a/src/components/Surface/Surface.tsx b/src/components/Surface/Surface.tsx new file mode 100644 index 0000000..abf5416 --- /dev/null +++ b/src/components/Surface/Surface.tsx @@ -0,0 +1,43 @@ +import {ReactNode, useEffect} from "react"; +import styles from './Surface.module.css' + +interface SurfaceProps { + isOpen: boolean; + onClose: () => void; + children: ReactNode; +} + +const Surface = ({isOpen, onClose, children}: SurfaceProps) => { + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') onClose(); + }; + + if (isOpen) { + document.addEventListener('keydown', handleKeyDown); + document.body.style.overflow = 'hidden'; + } + + return () => { + document.removeEventListener('keydown', handleKeyDown); + document.body.style.overflow = 'auto'; + }; + }, [isOpen, onClose]); + + if (!isOpen) return null; + + + return ( +
+
e.stopPropagation()}> + +
+ {children} +
+
+
+ ); +}; + + +export default Surface; \ No newline at end of file diff --git a/src/pages/Timers/Timers.module.css b/src/pages/Timers/Timers.module.css index 8fced1c..5f35257 100644 --- a/src/pages/Timers/Timers.module.css +++ b/src/pages/Timers/Timers.module.css @@ -6,9 +6,15 @@ body, html { } .header { + width: 100%; display: flex; flex-direction: row; justify-content: space-between; + gap: 1.6rem; +} + +.header .header_item:nth-child(2) { + margin-left: auto; } .content { diff --git a/src/pages/Timers/Timers.tsx b/src/pages/Timers/Timers.tsx index 24a4410..c2456db 100644 --- a/src/pages/Timers/Timers.tsx +++ b/src/pages/Timers/Timers.tsx @@ -2,9 +2,13 @@ import {useEffect, useState} from 'react'; import Timer from '../../components/Timer/Timer'; import styles from './Timers.module.css'; import {formatFullTime} from "../../helpers/DateFunctions.ts"; +import ReleaseList from "../../components/ReleaseList/ReleaseList.tsx"; +import Button from "../../components/Button/Button.tsx"; const Timers = () => { const [time, setTime] = useState(new Date()); + const [isReleasesListOpen, setIsReleasesListOpen] = useState(false); + useEffect(() => { const intervalId = setInterval(() => { @@ -16,18 +20,22 @@ const Timers = () => { return ( -
-
- MetaTimer - {formatFullTime(time)} -
-
- - - - + <> +
+
+ MetaTimer + {formatFullTime(time)} +
+
+ + + + +
-
+ setIsReleasesListOpen(false)} /> + ) }