diff --git a/.gitignore b/.gitignore index a547bf3..11ea68e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? + +dist.tar.gz diff --git a/release.sh b/release.sh index c80507d..d987e7f 100755 --- a/release.sh +++ b/release.sh @@ -1,4 +1,5 @@ #!/bin/bash source ~/.nvm/nvm.sh nvm use - +npm run build +tar zcvf dist.tar.gz dist diff --git a/src/App.css b/src/App.css index 8548cc1..33959a4 100644 --- a/src/App.css +++ b/src/App.css @@ -13,6 +13,7 @@ width: 100%; padding-top: 40px; box-sizing: border-box; + position: relative; } /* Style selector */ @@ -183,3 +184,132 @@ font-size: 13px; } } + +/* Settings button */ +.settings-button { + position: absolute; + top: 20px; + left: 20px; + 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; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; +} + +.settings-button:hover { + background-color: rgba(255, 255, 255, 0.15); +} + +/* Settings overlay */ +.settings-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 2000; +} + +/* Settings dialog */ +.settings-dialog { + background-color: var(--bg); + border-radius: 12px; + padding: 24px; + width: 90%; + max-width: 400px; + box-shadow: var(--shadow); + border: 1px solid var(--border); +} + +.settings-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; +} + +.settings-header h3 { + margin: 0; + font-size: 20px; + color: var(--text-h); +} + +.settings-close { + width: 32px; + height: 32px; + padding: 0; + background: none; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 18px; + color: var(--text); + display: flex; + align-items: center; + justify-content: center; +} + +.settings-close:hover { + background-color: rgba(255, 255, 255, 0.05); +} + +.settings-content { + display: flex; + flex-direction: column; + gap: 16px; +} + +.settings-row { + display: flex; + justify-content: space-between; + align-items: center; +} + +.settings-label { + font-size: 16px; + color: var(--text); +} + +.settings-toggle { + width: 44px; + height: 24px; + padding: 2px; + background-color: rgba(255, 255, 255, 0.1); + border: none; + border-radius: 12px; + cursor: pointer; + position: relative; + transition: background-color 0.2s ease; +} + +.settings-toggle.active { + background-color: var(--accent); +} + +.toggle-slider { + position: absolute; + top: 2px; + left: 2px; + width: 20px; + height: 20px; + background-color: white; + border-radius: 50%; + transition: transform 0.2s ease; +} + +.settings-toggle.active .toggle-slider { + transform: translateX(20px); +} diff --git a/src/App.tsx b/src/App.tsx index bd1f1df..2bee6fc 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -31,7 +31,7 @@ function getTimezoneInfo(): string { return `${timeZone} ${offset}` } -function DigitalClock({ time, size, period, is24Hour, onToggleFormat, dateInfo, timeZone }: { time: string; size: number; period?: string; is24Hour: boolean; onToggleFormat: () => void; dateInfo: DateInfo; timeZone: string }) { +function DigitalClock({ time, size, period, is24Hour, onToggleFormat, dateInfo, timeZone, showDate, showTimezone }: { time: string; size: number; period?: string; is24Hour: boolean; onToggleFormat: () => void; dateInfo: DateInfo; timeZone: string; showDate: boolean; showTimezone: boolean }) { const fontSize = Math.floor(size * 0.95) const periodSize = Math.floor(size * 0.20) const dateSize = Math.floor(size * 0.20) @@ -59,12 +59,14 @@ function DigitalClock({ time, size, period, is24Hour, onToggleFormat, dateInfo, )} - - {dateInfo.dateString} {dateInfo.weekday} - + {showDate && ( + + {dateInfo.dateString} {dateInfo.weekday} + + )}
{time}
-
- - {timeZone} - -
+ {showTimezone && ( +
+ + {timeZone} + +
+ )} ) @@ -104,6 +108,17 @@ function App() { const saved = localStorage.getItem('clock-rollDirection') return saved === 'up' ? 'up' : 'down' }) + const [showSettings, setShowSettings] = useState(false) + const [showDate, setShowDate] = useState(() => { + // 从 localStorage 读取,默认显示日期 (true) + const saved = localStorage.getItem('clock-showDate') + return saved === null ? true : saved === 'true' + }) + const [showTimezone, setShowTimezone] = useState(() => { + // 从 localStorage 读取,默认显示时区 (true) + const saved = localStorage.getItem('clock-showTimezone') + return saved === null ? true : saved === 'true' + }) // 切换样式时保存到 localStorage const handleSetClockStyle = (style: ClockStyle) => { @@ -125,6 +140,20 @@ function App() { localStorage.setItem('clock-rollDirection', newValue) } + // 切换显示日期时保存到 localStorage + const toggleShowDate = () => { + const newValue = !showDate + setShowDate(newValue) + localStorage.setItem('clock-showDate', String(newValue)) + } + + // 切换显示时区时保存到 localStorage + const toggleShowTimezone = () => { + const newValue = !showTimezone + setShowTimezone(newValue) + localStorage.setItem('clock-showTimezone', String(newValue)) + } + useEffect(() => { const timer = setInterval(() => { setTime(new Date()) @@ -174,9 +203,9 @@ function App() { const renderClock = () => { switch (clockStyle) { case 'flip': - return + return case 'roll': - return + return case 'digital': default: return ( @@ -188,6 +217,8 @@ function App() { onToggleFormat={toggleFormat} dateInfo={dateInfo} timeZone={timeZone} + showDate={showDate} + showTimezone={showTimezone} /> ) } @@ -195,6 +226,59 @@ function App() { return (
+ + + {showSettings && ( +
setShowSettings(false)}> +
e.stopPropagation()}> +
+

设置

+ +
+
+
+ 12小时制 + +
+
+ 显示日期 + +
+
+ 显示时区 + +
+
+
+
+ )} +
- - {dateInfo.dateString} {dateInfo.weekday} - + {showDate && ( + + {dateInfo.dateString} {dateInfo.weekday} + + )}
{/* Hours */} @@ -93,14 +97,16 @@ export function FlipClock({ time, size, dateInfo, period, is24Hour, onToggleForm
-
- - {timeZone} - -
+ {showTimezone && ( +
+ + {timeZone} + +
+ )} ); diff --git a/src/components/RollClock.tsx b/src/components/RollClock.tsx index cc780e7..96c8717 100644 --- a/src/components/RollClock.tsx +++ b/src/components/RollClock.tsx @@ -16,9 +16,11 @@ interface RollClockProps { direction: 'down' | 'up'; onToggleDirection: () => void; timeZone: string; + showDate: boolean; + showTimezone: boolean; } -export function RollClock({ time, size, dateInfo, period, is24Hour, onToggleFormat, direction, onToggleDirection, timeZone }: RollClockProps) { +export function RollClock({ time, size, dateInfo, period, is24Hour, onToggleFormat, direction, onToggleDirection, timeZone, showDate, showTimezone }: RollClockProps) { // Parse time - it's already in 12h format when period is provided const [hoursStr, minutes, seconds] = time.split(':'); const displayHours = hoursStr; @@ -51,12 +53,14 @@ export function RollClock({ time, size, dateInfo, period, is24Hour, onToggleForm )} - - {dateInfo.dateString} {dateInfo.weekday} - + {showDate && ( + + {dateInfo.dateString} {dateInfo.weekday} + + )}
{/* Hours */} @@ -97,14 +101,16 @@ export function RollClock({ time, size, dateInfo, period, is24Hour, onToggleForm
-
- - {timeZone} - -
+ {showTimezone && ( +
+ + {timeZone} + +
+ )} {/* Direction toggle button */}