clock/src/components/FlipClock.tsx
ysm 9cbae137a8 修复翻页时钟偏移并优化时间显示布局
- 修复翻页时钟动画开始时的位置偏移问题
- 将AM/PM显示移至时间数字左上角
- 添加日期(年月日星期)显示在时间数字右上角
- 统一数码管、翻页、滚动三种时钟的显示样式
- 调整AM/PM和日期字体为数字大小的20%
- 修复翻页和滚动时钟AM/PM显示错误(上午下午颠倒)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 13:24:27 +08:00

99 lines
2.7 KiB
TypeScript

import { useState } from 'react';
import { FlipDigit } from './FlipDigit';
import './FlipClock.css';
interface DateInfo {
dateString: string;
weekday: string;
}
interface FlipClockProps {
time: string; // "HH:MM:SS" format
size: number;
dateInfo: DateInfo;
period?: string;
}
export function FlipClock({ time, size, dateInfo, period }: FlipClockProps) {
const [is24Hour, setIs24Hour] = useState(true);
// Parse time - it's already in 12h format when period is provided
const [hoursStr, minutes, seconds] = time.split(':');
const displayHours = hoursStr;
const periodSize = size * 0.20;
const dateSize = size * 0.20;
return (
<div className="flip-clock-outer">
<div className="flip-clock-side-panel">
<button
className="flip-format-toggle"
onClick={() => setIs24Hour(!is24Hour)}
>
{is24Hour ? '24H' : '12H'}
</button>
</div>
<div className="flip-clock-main">
<div className="flip-clock-header">
<div className="flip-clock-header-left">
{period && (
<span
className="flip-clock-period"
style={{ fontSize: `${periodSize}px` }}
>
{period}
</span>
)}
</div>
<span
className="flip-clock-date"
style={{ fontSize: `${dateSize}px` }}
>
{dateInfo.dateString} {dateInfo.weekday}
</span>
</div>
<div className="flip-clock-container">
{/* Hours */}
<div className="flip-clock-digit-group">
<FlipDigit value={parseInt(displayHours[0], 10)} size={size} />
<FlipDigit value={parseInt(displayHours[1], 10)} size={size} />
</div>
<span
className="flip-clock-separator"
style={{
fontSize: `${size * 0.5}px`,
marginTop: `${-size * 0.08}px`
}}
>
:
</span>
{/* Minutes */}
<div className="flip-clock-digit-group">
<FlipDigit value={parseInt(minutes[0], 10)} size={size} />
<FlipDigit value={parseInt(minutes[1], 10)} size={size} />
</div>
<span
className="flip-clock-separator"
style={{
fontSize: `${size * 0.5}px`,
marginTop: `${-size * 0.08}px`
}}
>
:
</span>
{/* Seconds */}
<div className="flip-clock-digit-group">
<FlipDigit value={parseInt(seconds[0], 10)} size={size} />
<FlipDigit value={parseInt(seconds[1], 10)} size={size} />
</div>
</div>
</div>
</div>
);
}