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 (
-
-
-
+
setIsReleasesListOpen(false)} />
+ >
)
}