diff --git a/src/App.css b/src/App.css index 33959a4..ce09332 100644 --- a/src/App.css +++ b/src/App.css @@ -185,11 +185,20 @@ } } -/* Settings button */ -.settings-button { +/* Top buttons group */ +.top-buttons { position: absolute; top: 20px; left: 20px; + display: flex; + flex-direction: row; + gap: 8px; + z-index: 1000; +} + +/* Settings button */ +.settings-button { + position: static; width: 40px; height: 40px; padding: 8px; @@ -209,6 +218,26 @@ background-color: rgba(255, 255, 255, 0.15); } +.mute-button { + width: 40px; + height: 40px; + padding: 8px; + font-size: 20px; + background-color: rgba(255, 255, 255, 0.05); + border: none; + border-radius: 8px; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + filter: grayscale(100%); +} + +.mute-button:hover { + background-color: rgba(255, 255, 255, 0.15); +} + /* Settings overlay */ .settings-overlay { position: fixed; diff --git a/src/App.tsx b/src/App.tsx index 2bee6fc..288e073 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useState, useEffect, useRef } from 'react' import { FlipClock } from './components/FlipClock' import { RollClock } from './components/RollClock' import './App.css' @@ -109,6 +109,11 @@ function App() { return saved === 'up' ? 'up' : 'down' }) const [showSettings, setShowSettings] = useState(false) + const [isMuted, setIsMuted] = useState(() => { + const saved = localStorage.getItem('clock-isMuted') + return saved === null ? true : saved === 'true' + }) + const isMutedRef = useRef(isMuted) const [showDate, setShowDate] = useState(() => { // 从 localStorage 读取,默认显示日期 (true) const saved = localStorage.getItem('clock-showDate') @@ -147,6 +152,13 @@ function App() { localStorage.setItem('clock-showDate', String(newValue)) } + const toggleMute = () => { + const newValue = !isMuted + setIsMuted(newValue) + isMutedRef.current = newValue + localStorage.setItem('clock-isMuted', String(newValue)) + } + // 切换显示时区时保存到 localStorage const toggleShowTimezone = () => { const newValue = !showTimezone @@ -155,8 +167,13 @@ function App() { } useEffect(() => { + const audio = new Audio('/tick1.mp3') const timer = setInterval(() => { setTime(new Date()) + if (!isMutedRef.current) { + audio.currentTime = 0 + audio.play().catch(() => {}) + } }, 1000) return () => clearInterval(timer) }, []) @@ -226,13 +243,22 @@ function App() { return (