/* Display page styles — responsive, baseline 800×480 */ * { margin: 0; padding: 0; box-sizing: border-box; } :root { --bg: #0f1117; --card-bg: #1a1d2e; --card-active: #252840; --text: #e0e0e0; --text-dim: #888; --accent: #4A90D9; --accent-warm: #E8943A; --accent-green: #4CAF50; --accent-red: #E05555; --radius: clamp(6px, 1.25vw, 16px); /* 半透明白系列(背景/边框/分隔线,随主题切换) */ --w03: rgba(255,255,255,0.03); --w04: rgba(255,255,255,0.04); --w05: rgba(255,255,255,0.05); --w06: rgba(255,255,255,0.06); --w08: rgba(255,255,255,0.08); --w10: rgba(255,255,255,0.10); --w14: rgba(255,255,255,0.14); --w15: rgba(255,255,255,0.15); --w16: rgba(255,255,255,0.16); --card-border: rgba(255,255,255,0.12); } /* 浅色主题:白偏蓝背景、黑色字体与图标(html.theme-light 时生效) */ .theme-light { --bg: #e8edf4; --card-bg: #ffffff; --card-active: #dde4ee; --text: #1c2333; --text-dim: #5b6a7e; --accent: #2f6fb2; --accent-warm: #cf7416; --accent-green: #3a9450; --accent-red: #c74545; --radius: clamp(6px, 1.25vw, 16px); --w03: rgba(28,35,51,0.03); --w04: rgba(28,35,51,0.04); --w05: rgba(28,35,51,0.05); --w06: rgba(28,35,51,0.06); --w08: rgba(28,35,51,0.08); --w10: rgba(28,35,51,0.10); --w14: rgba(28,35,51,0.14); --w15: rgba(28,35,51,0.15); --w16: rgba(28,35,51,0.16); --card-border: #c9d4e2; } /* 浅色主题下的天气图标:还原彩色(深色下由 filter 转白) */ .theme-light .card-weather-icon, .theme-light .weather-icon, .theme-light .hc-icon img { filter: none; } /* 浅色主题下的 Sidebar 线性图标:黑色线条 */ .theme-light .card-icon svg { color: #1c2333; } /* 主题切换动画:切换瞬间由 theme.js 临时加 .theme-anim,触发全局平滑过渡 */ html.theme-anim, html.theme-anim * { transition: background-color 0.55s ease, color 0.55s ease, border-color 0.55s ease, box-shadow 0.55s ease, fill 0.55s ease, stroke 0.55s ease !important; } html, body { width: 100vw; height: 100vh; height: 100dvh; /* dynamic viewport for mobile browsers */ overflow: hidden; font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--bg); color: var(--text); user-select: none; -webkit-user-select: none; touch-action: manipulation; } #app { position: relative; display: flex; width: 100%; height: 100%; padding: clamp(4px, 1vw, 16px); /* 左右对称:大卡片左边缘与右边缘距离一致 */ gap: clamp(4px, 1vw, 16px); /* 布局变量:Sidebar 浮层与大卡片左缘间距、Sidebar 宽度 */ --sidebar-gap: clamp(14px, 1.8vw, 28px); --sidebar-w: clamp(140px, 25vw, 280px); } /* ── Sidebar(浮层:叠在大卡片之上,上/下/左与大卡片边缘等距)── */ #sidebar { position: absolute; left: var(--sidebar-gap); top: var(--sidebar-gap); bottom: var(--sidebar-gap); width: var(--sidebar-w); min-width: 0; z-index: 2; display: flex; flex-direction: column; gap: clamp(4px, 0.75vw, 12px); } .card { flex: 1; background: var(--card-bg); border-radius: var(--radius); padding: clamp(6px, 1.25vw, 18px); display: flex; flex-direction: column; align-items: center; justify-content: center; cursor: pointer; border: 2px solid var(--card-border); /* Sidebar 小卡片框框(与大卡片区分层次) */ transition: border-color 0.2s, background 0.2s; position: relative; overflow: hidden; } .card:active { background: var(--card-active); } .card.active { border-color: var(--accent); } .card-icon { font-size: clamp(16px, 2.75vw, 36px); margin-bottom: clamp(2px, 0.25vw, 6px); } /* Sidebar 线性图标:白色线条、无填充,尺寸与天气图标一致 */ .card-icon svg { width: clamp(24px, 3.5vw, 44px); height: clamp(24px, 3.5vw, 44px); color: #fff; /* stroke 使用 currentColor */ } /* 图标+标签 左列容器(默认纵向排列,视觉与原先一致) */ .card-left { display: flex; flex-direction: column; align-items: center; gap: clamp(2px, 0.25vw, 6px); min-width: 0; } .card-left .card-icon { margin-bottom: 0; } .card-left .card-label { margin-bottom: 0; } .card-weather-icon { width: clamp(24px, 3.5vw, 44px); height: clamp(24px, 3.5vw, 44px); filter: brightness(0) invert(1); } .card-label { font-size: clamp(10px, 1.4vw, 16px); color: var(--text-dim); margin-bottom: clamp(2px, 0.25vw, 6px); } .card-value { font-size: clamp(11px, 1.6vw, 20px); font-weight: 600; text-align: center; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ── Panel ────────────────────────────────── */ #panel { flex: 1; min-width: 0; background: var(--card-bg); border-radius: var(--radius); /* 左侧预留 Sidebar 区域:内容左缘 = sidebar左距 + sidebar宽 + 等距, 比 Sidebar 离大卡片左边缘的距离更大 */ padding: clamp(10px, 2vw, 28px) clamp(12px, 2.5vw, 36px) clamp(10px, 2vw, 28px) calc(var(--sidebar-gap) + var(--sidebar-w) + var(--sidebar-gap)); overflow-y: auto; position: relative; } .lock-btn { position: absolute; top: clamp(6px, 1vh, 14px); right: clamp(8px, 1.2vw, 18px); background: var(--w06); border: 1px solid var(--w10); border-radius: 8px; color: var(--text-dim); font-size: clamp(14px, 2vw, 22px); padding: clamp(4px, 0.6vh, 8px) clamp(8px, 1vw, 14px); cursor: pointer; line-height: 1; z-index: 10; transition: background 0.15s, color 0.15s; } .lock-btn:active { background: var(--w14); color: var(--text); } .panel-content { display: none; } .panel-content.active { display: block; } #panel-pomodoro.active { display: flex; flex-direction: column; height: 100%; } .pomo-bg-wrap { position: relative; width: 100%; flex: 1; min-height: clamp(200px, 40vh, 400px); border-radius: clamp(8px, 1.2vw, 16px); overflow: hidden; } .panel-content h2 { font-size: clamp(14px, 2vw, 26px); color: var(--text-dim); margin-bottom: clamp(8px, 1.5vh, 16px); font-weight: 400; border-bottom: 1px solid var(--w08); padding-bottom: clamp(6px, 1vh, 12px); } /* ── Time ─────────────────────────────────── */ .big-clock { font-size: clamp(32px, 7vw, 96px); font-weight: 700; font-variant-numeric: tabular-nums; letter-spacing: 2px; margin-bottom: clamp(2px, 0.5vh, 8px); } .date-str { font-size: clamp(12px, 2vw, 24px); color: var(--text-dim); margin-bottom: clamp(10px, 2vh, 24px); } .clock-list { display: flex; flex-wrap: wrap; gap: clamp(6px, 1.25vw, 16px); } .clock-item { background: var(--w05); border-radius: 8px; padding: clamp(6px, 1vw, 14px) clamp(10px, 1.75vw, 22px); } .clock-item .city { font-size: clamp(11px, 1.5vw, 18px); color: var(--text-dim); } .clock-item .time { font-size: clamp(16px, 2.5vw, 30px); font-weight: 600; } /* ── Weather ──────────────────────────────── */ .weather-main { display: flex; align-items: center; gap: clamp(10px, 1.75vw, 24px); margin-bottom: clamp(8px, 1.5vh, 18px); } .weather-temp-big { font-size: clamp(28px, 6.5vw, 88px); font-weight: 700; } .weather-desc { font-size: clamp(14px, 2.25vw, 28px); color: var(--text-dim); } .weather-icon { width: clamp(48px, 7vw, 88px); height: clamp(48px, 7vw, 88px); flex-shrink: 0; filter: brightness(0) invert(1); } .weather-details { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(6px, 1vw, 14px); } .weather-detail { background: var(--w04); border-radius: 6px; padding: clamp(6px, 1vw, 14px) clamp(10px, 1.5vw, 20px); font-size: clamp(11px, 1.75vw, 20px); } .weather-detail .label { font-size: clamp(10px, 1.4vw, 16px); color: var(--text-dim); } /* ── Hourly Forecast ──────────────────────── */ .hourly-section { margin-top: clamp(12px, 2vh, 24px); } .hourly-title { font-size: clamp(12px, 1.6vw, 18px); color: var(--text-dim); margin-bottom: clamp(8px, 1vh, 14px); } .hourly-list { display: flex; gap: clamp(4px, 0.6vw, 10px); overflow-x: auto; padding-bottom: clamp(4px, 0.5vh, 8px); scrollbar-width: thin; } .hc-item { flex: 0 0 auto; min-width: clamp(44px, 6vw, 64px); display: flex; flex-direction: column; align-items: center; gap: clamp(2px, 0.3vh, 6px); padding: clamp(6px, 0.8vw, 12px) clamp(4px, 0.6vw, 10px); background: var(--w04); border-radius: clamp(6px, 0.8vw, 12px); border: 1px solid transparent; } .hc-item.hc-now { background: rgba(74, 144, 217, 0.15); border-color: var(--accent); } .hc-time { font-size: clamp(10px, 1.3vw, 15px); color: var(--text-dim); } .hc-time .tomorrow { font-size: clamp(8px, 1vw, 12px); color: var(--accent-warm); margin-right: 2px; } .hc-icon { font-size: clamp(16px, 2.2vw, 28px); line-height: 1; } .hc-icon img { display: block; width: 100%; height: 100%; filter: brightness(0) invert(1); } .hc-temp { font-size: clamp(14px, 1.8vw, 22px); font-weight: 600; } .hc-pop { font-size: clamp(10px, 1.2vw, 14px); color: var(--accent-warm); } /* ── Weather Update Info ──────────────────── */ .update-info { margin-top: clamp(10px, 1.5vh, 18px); padding: clamp(6px, 0.8vw, 12px) clamp(8px, 1vw, 14px); background: var(--w03); border-radius: clamp(4px, 0.6vw, 8px); font-size: clamp(10px, 1.3vw, 14px); color: var(--text-dim); line-height: 1.8; } .update-info .label { color: var(--text-dim); opacity: 0.7; } /* ── Minutely + Warnings ──────────────────── */ .section-title-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: clamp(6px, 0.8vh, 10px); } .mini-refresh-btn { padding: clamp(2px, 0.3vw, 6px) clamp(8px, 1vw, 14px); font-size: clamp(10px, 1.2vw, 14px); border: 1px solid var(--w15); border-radius: 6px; background: var(--w08); color: var(--text-dim); cursor: pointer; font-family: inherit; } .mini-refresh-btn:active { background: var(--w16); } /* Minutely bars */ .minutely-bars { display: flex; gap: 1px; align-items: flex-end; height: clamp(60px, 8vh, 100px); overflow-x: auto; padding-bottom: 4px; } .mb-col { flex: 0 0 clamp(16px, 2.2vw, 28px); display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; } .mb-bar { width: 100%; background: var(--accent); border-radius: 2px 2px 0 0; min-height: 2px; opacity: 0.7; transition: height 0.3s; } .mb-time { font-size: clamp(8px, 0.9vw, 10px); color: var(--text-dim); margin-top: 2px; } /* Warning cards */ .warning-card { background: var(--w04); border-radius: clamp(4px, 0.6vw, 8px); padding: clamp(8px, 1vw, 14px) clamp(10px, 1.5vw, 18px); margin-bottom: clamp(4px, 0.6vh, 8px); } .warning-title { font-size: clamp(12px, 1.6vw, 18px); font-weight: 600; margin-bottom: clamp(4px, 0.4vh, 6px); } .warning-text { font-size: clamp(11px, 1.4vw, 16px); color: var(--text-dim); line-height: 1.5; } /* ── Display Toast ────────────────────────── */ .display-toast { position: fixed; bottom: clamp(20px, 4vh, 40px); left: 50%; transform: translateX(-50%); background: rgba(30, 30, 40, 0.95); color: #fff; padding: clamp(10px, 1.5vw, 18px) clamp(20px, 3vw, 36px); border-radius: clamp(8px, 1vw, 14px); font-size: clamp(13px, 1.8vw, 22px); z-index: 300; border: 1px solid var(--w10); animation: toast-in 0.25s ease; pointer-events: none; } @keyframes toast-in { from { opacity: 0; transform: translateX(-50%) translateY(10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } } /* ── Calendar ─────────────────────────────── */ .event-list { max-height: calc(100vh - clamp(100px, 29vw, 220px)); overflow-y: auto; } .event-item { display: flex; align-items: center; gap: clamp(8px, 1.5vw, 20px); padding: clamp(6px, 1vh, 12px) 0; border-bottom: 1px solid var(--w05); } .event-dot { width: clamp(6px, 1vw, 12px); height: clamp(6px, 1vw, 12px); border-radius: 50%; flex-shrink: 0; } .event-time { font-size: clamp(16px, 2.5vw, 30px); font-weight: 600; font-variant-numeric: tabular-nums; min-width: clamp(40px, 6.5vw, 70px); } .event-summary { font-size: clamp(13px, 1.9vw, 24px); } .event-sub { font-size: clamp(11px, 1.5vw, 18px); color: var(--text-dim); } /* ── Pomodoro ─────────────────────────────── */ .pomo-bg-img { position: absolute; inset: 0; background-image: url('/static/img/bg_pomodoro.jpg'); background-size: cover; background-position: center; background-repeat: no-repeat; } /* If bg_pomodoro.jpg doesn't exist, the 404 is silently ignored — no extra CSS needed */ .pomo-content { position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; padding: clamp(24px, 4vh, 48px) clamp(16px, 3vh, 32px); } .pomo-glass { display: inline-block; text-align: center; padding: clamp(8px, 1.2vh, 16px) clamp(16px, 2.5vw, 36px); background: rgba(0,0,0,0.30); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border-radius: clamp(10px, 1.5vw, 20px); } #pomodoro-phase { font-size: clamp(16px, 2.5vw, 28px); color: var(--accent-green); margin-bottom: clamp(4px, 0.6vh, 10px); font-weight: 600; } #pomodoro-timer { font-size: clamp(36px, 8vw, 100px); font-weight: 700; font-variant-numeric: tabular-nums; margin-bottom: clamp(4px, 0.6vh, 10px); } #pomodoro-cycles { font-size: clamp(12px, 2vw, 20px); color: var(--text-dim); } #pomodoro-next-break { font-size: clamp(13px, 2vw, 22px); color: var(--accent-warm); margin-top: clamp(6px, 0.8vh, 12px); font-weight: 500; } /* Pomodoro sidebar card layout */ .pomo-sidebar-row { position: relative; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; } .pomo-sidebar-btns { position: absolute; right: clamp(4px, 0.5vw, 8px); top: clamp(4px, 0.5vw, 8px); bottom: clamp(4px, 0.5vw, 8px); display: flex; flex-direction: column; gap: clamp(2px, 0.3vw, 5px); } .pomo-sidebar-info { display: flex; flex-direction: column; align-items: center; justify-content: center; min-width: 0; } .pomo-mini-btn { flex: 1; min-width: 0; padding: 0 clamp(6px, 0.8vw, 12px); font-size: clamp(9px, 1.2vw, 14px); font-weight: 600; border: none; border-radius: clamp(3px, 0.4vw, 6px); cursor: pointer; font-family: inherit; color: #fff; line-height: 1; } .pomo-mini-btn:active { opacity: 0.7; } .pomo-mini-primary { background: var(--accent-green); } .pomo-mini-secondary { background: var(--accent-warm); } .pomo-mini-danger { background: var(--accent-red); } /* ── Alarm Overlay ────────────────────────── */ .alarm-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100vw; height: 100vh; height: 100dvh; background: rgba(15, 17, 23, 0.92); display: flex; align-items: center; justify-content: center; z-index: 100; } .alarm-overlay.hidden { display: none; } .alarm-overlay-box { text-align: center; padding: clamp(24px, 5vw, 56px) clamp(32px, 6.5vw, 72px); background: var(--card-bg); border-radius: clamp(12px, 2vw, 24px); border: 2px solid var(--accent-red); animation: overlay-in 0.3s ease; } @keyframes overlay-in { from { transform: scale(0.85); opacity: 0; } to { transform: scale(1); opacity: 1; } } .alarm-overlay-icon { font-size: clamp(40px, 7vw, 80px); margin-bottom: clamp(8px, 1.5vh, 16px); } .alarm-overlay-title { font-size: clamp(18px, 2.75vw, 36px); font-weight: 700; margin-bottom: clamp(6px, 1vh, 12px); color: var(--accent-red); } .alarm-overlay-info { font-size: clamp(14px, 2vw, 26px); color: var(--text-dim); margin-bottom: clamp(16px, 3vh, 32px); line-height: 1.6; } .alarm-dismiss-btn { padding: clamp(10px, 1.75vw, 20px) clamp(32px, 6vw, 64px); font-size: clamp(14px, 2.25vw, 26px); font-weight: 600; background: var(--accent-red); color: #fff; border: none; border-radius: clamp(8px, 1.25vw, 14px); cursor: pointer; font-family: inherit; } .alarm-dismiss-btn:active { opacity: 0.8; } /* ── Animations ───────────────────────────── */ .card.alert { border-color: var(--accent-red); animation: alert-flash 0.5s ease 6; } @keyframes alert-flash { 0%, 100% { background: var(--card-bg); } 50% { background: rgba(224, 85, 85, 0.3); } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } /* ── Scrollbar ────────────────────────────── */ ::-webkit-scrollbar { width: 4px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--0.1); border-radius: 2px; } /* ── Small-screen fine-tuning (< 600px) ────── Preserves the existing 800×480 design intent while keeping things usable on even narrower viewports (phones). */ @media (max-width: 600px) { #app { flex-direction: column; padding: clamp(3px, 1.5vw, 8px); gap: clamp(3px, 1.5vw, 8px); } #sidebar { position: static; /* 小屏恢复流式布局(顶部横条) */ flex-direction: row; width: 100%; height: clamp(60px, 15vh, 100px); gap: clamp(3px, 1.5vw, 8px); } #panel { flex: 1; padding: clamp(10px, 2vw, 28px) clamp(12px, 2.5vw, 36px); } .card { min-width: 0; } .card-icon { font-size: clamp(14px, 4vw, 24px); } .card-label { font-size: clamp(9px, 2.5vw, 14px); } .card-value { font-size: clamp(10px, 2.8vw, 16px); } } /* ── 超宽屏(宽高比严格大于 16:9):Sidebar 卡片横向布局 ── 图标+标签在左(card-left 列),具体信息在右侧自动换行, 避免窄高卡片内文字放大覆盖。番茄钟按钮保持右侧竖排, info 预留按钮区域避免覆盖。 */ @media (min-aspect-ratio: 1601/900) { #sidebar .card:not(.card-pomodoro) { flex-direction: row; align-items: center; justify-content: space-between; gap: clamp(8px, 1vw, 16px); padding: clamp(4px, 0.7vw, 10px) clamp(10px, 1.2vw, 18px); } /* 左右 1:1:图标+标签占左半(内容居中),信息占右半(文字居中) */ #sidebar .card-left { flex: 1 1 0; min-width: 0; } #sidebar .card:not(.card-pomodoro) .card-value, #sidebar .pomo-sidebar-info .card-value { flex: 1 1 0; min-width: 0; text-align: center; white-space: normal; /* 覆盖全局 nowrap:允许换行,line-clamp 才生效 */ line-height: 1.35; word-break: break-word; /* 长文本上限 2 行:超出在底部截断并以省略号代替 */ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } /* 番茄钟:与其他卡片一致——整卡左右 1:1(图标+标签左半、信息右半)。 按钮与 value 互斥:value 显示时按钮隐藏,按钮显示时 value 隐藏, 按钮 absolute 落在右侧空区,互不遮挡 */ #sidebar .card-pomodoro { flex-direction: row; } #sidebar .pomo-sidebar-info { width: 100%; height: 100%; flex-direction: row; align-items: center; justify-content: center; gap: clamp(8px, 1vw, 16px); } } /* ── Large-screen caps (> 1920px) ─────────── Once the viewport is wide enough that all clamp() values hit their maximums, constrain the app so it doesn't keep stretching. */ @media (min-width: 1920px) { html, body { display: flex; align-items: center; justify-content: center; } #app { max-width: 1920px; max-height: 1080px; } } /* ── Panel header buttons (refresh + lock) ── */ .panel-header-btns { position: absolute; top: clamp(6px, 1vh, 14px); right: clamp(8px, 1.2vw, 18px); display: flex; gap: clamp(4px, 0.6vw, 10px); z-index: 10; } .panel-header-btns .lock-btn { position: static; } /* ── Panel Add Button ─────────────────────── */ .panel-add-btn { display: block; width: 100%; margin-top: clamp(8px, 1.5vh, 16px); padding: clamp(8px, 1.25vw, 16px); font-size: clamp(13px, 2vw, 22px); font-weight: 600; background: var(--w06); border: 1px dashed var(--0.18); border-radius: clamp(6px, 1vw, 12px); color: var(--text-dim); cursor: pointer; font-family: inherit; transition: background 0.15s, color 0.15s; } .panel-add-btn:active { background: var(--0.12); color: var(--text); } /* ── Alarm item action buttons (edit/delete) ─ */ .alarm-actions { display: flex; gap: clamp(4px, 0.6vw, 8px); flex-shrink: 0; } .alarm-action-btn { padding: clamp(3px, 0.5vw, 6px) clamp(8px, 1.2vw, 14px); font-size: clamp(10px, 1.4vw, 16px); border: 1px solid var(--w15); border-radius: 6px; background: var(--w06); color: var(--text-dim); cursor: pointer; font-family: inherit; transition: background 0.15s, color 0.15s; } .alarm-action-btn:active { background: var(--w14); } .alarm-action-btn.edit-btn:hover { color: var(--accent); border-color: var(--accent); } .alarm-action-btn.del-btn:hover { color: var(--accent-red); border-color: var(--accent-red); } /* ── Alarm item layout (with actions) ─────── */ .alarm-item { display: flex; align-items: center; justify-content: space-between; padding: clamp(8px, 1.25vw, 18px) clamp(10px, 1.75vw, 22px); background: var(--w04); border-radius: 8px; margin-bottom: clamp(6px, 1vh, 12px); } .alarm-item .alarm-info { display: flex; flex-direction: column; min-width: 0; } .alarm-item .alarm-time { font-size: clamp(20px, 3.5vw, 42px); font-weight: 700; font-variant-numeric: tabular-nums; } .alarm-item .alarm-label { font-size: clamp(12px, 1.75vw, 22px); color: var(--text-dim); } .alarm-item .alarm-days { font-size: clamp(10px, 1.4vw, 16px); color: var(--text-dim); } .alarm-item .alarm-status { font-size: clamp(10px, 1.2vw, 14px); color: var(--text-dim); text-align: right; } .alarm-item.triggered { background: rgba(224, 85, 85, 0.25); border: 2px solid var(--accent-red); animation: pulse 1s infinite; } /* ── Modal Overlay ────────────────────────── */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100vw; height: 100vh; height: 100dvh; background: rgba(15, 17, 23, 0.90); display: flex; align-items: center; justify-content: center; z-index: 200; } .modal-overlay.hidden { display: none; } .modal-box { background: var(--card-bg); border-radius: clamp(12px, 2vw, 24px); padding: clamp(20px, 3vw, 40px) clamp(24px, 4vw, 48px); width: min(90vw, clamp(320px, 50vw, 500px)); max-height: 90vh; overflow-y: auto; border: 1px solid var(--w10); animation: overlay-in 0.25s ease; } .modal-title { font-size: clamp(16px, 2.5vw, 28px); font-weight: 700; margin-bottom: clamp(16px, 2.5vh, 28px); text-align: center; } .modal-field { margin-bottom: clamp(14px, 2.5vh, 24px); } .modal-label { font-size: clamp(12px, 1.6vw, 18px); color: var(--text-dim); margin-bottom: clamp(6px, 0.8vh, 10px); } .alarm-modal-name { font-size: clamp(14px, 2vw, 22px); color: var(--text); padding: clamp(6px, 1vw, 12px); background: var(--w04); border-radius: 6px; } .modal-actions { display: flex; gap: clamp(10px, 1.5vw, 20px); justify-content: center; margin-top: clamp(16px, 3vh, 32px); } /* Modal buttons */ .pomo-btn { padding: clamp(10px, 1.5vw, 18px) clamp(24px, 4vw, 48px); font-size: clamp(14px, 2vw, 22px); font-weight: 600; border: none; border-radius: clamp(8px, 1vw, 14px); cursor: pointer; font-family: inherit; transition: opacity 0.15s; } .pomo-btn:active { opacity: 0.7; } .pomo-btn-primary { background: var(--accent); color: #fff; } .pomo-btn-secondary { background: var(--w08); color: var(--text-dim); border: 1px solid var(--0.12); } /* ── Time Picker (mouse-only) ─────────────── */ .time-picker { display: flex; align-items: center; justify-content: center; gap: clamp(4px, 0.8vw, 12px); } .tp-col { display: flex; flex-direction: column; align-items: center; gap: clamp(2px, 0.4vh, 6px); } .tp-btn { width: clamp(40px, 6vw, 64px); height: clamp(32px, 4vh, 48px); border: 1px solid var(--w15); border-radius: 8px; background: var(--w06); color: var(--text); font-size: clamp(14px, 2vw, 24px); cursor: pointer; display: flex; align-items: center; justify-content: center; line-height: 1; transition: background 0.1s; font-family: inherit; } .tp-btn:active { background: var(--w16); } .tp-value { font-size: clamp(32px, 6vw, 64px); font-weight: 700; font-variant-numeric: tabular-nums; width: clamp(50px, 7vw, 80px); text-align: center; line-height: 1.3; } .tp-sep { font-size: clamp(28px, 5vw, 56px); font-weight: 700; color: var(--text-dim); margin-top: calc(clamp(32px, 4vh, 48px) + clamp(8px, 1.2vh, 18px)); } /* ── Day Picker (modal style) ─────────────── */ #alarm-modal-days { display: flex; gap: clamp(4px, 0.6vw, 8px); } .day-btn { width: clamp(32px, 4.5vw, 48px); height: clamp(32px, 4.5vw, 48px); border-radius: 50%; border: 1px solid var(--0.18); background: var(--w06); color: var(--text-dim); font-size: clamp(12px, 1.6vw, 18px); cursor: pointer; display: flex; align-items: center; justify-content: center; font-family: inherit; transition: background 0.15s, color 0.15s, border-color 0.15s; } .day-btn:active { background: var(--w14); } .day-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); } /* ── Toggle Switch ────────────────────────── */ .toggle-label { display: inline-flex; align-items: center; gap: clamp(8px, 1vw, 14px); cursor: pointer; font-size: clamp(13px, 1.8vw, 20px); color: var(--text); } .toggle-label input { display: none; } .toggle-slider { width: clamp(36px, 4vw, 48px); height: clamp(20px, 2.5vh, 28px); background: var(--w15); border-radius: 14px; position: relative; transition: background 0.2s; } .toggle-slider::after { content: ''; position: absolute; top: 2px; left: 2px; width: calc(clamp(20px, 2.5vh, 28px) - 4px); height: calc(clamp(20px, 2.5vh, 28px) - 4px); background: #fff; border-radius: 50%; transition: transform 0.2s; } .toggle-label input:checked + .toggle-slider { background: var(--accent-green); } .toggle-label input:checked + .toggle-slider::after { transform: translateX(calc(clamp(36px, 4vw, 48px) - clamp(20px, 2.5vh, 28px))); } /* ── Countdown List ───────────────────────── */ .countdown-list .cd-item { display: flex; align-items: center; justify-content: space-between; padding: clamp(8px, 1.25vw, 18px) clamp(10px, 1.75vw, 22px); background: var(--w04); border-radius: 8px; margin-bottom: clamp(6px, 1vh, 12px); } .cd-item .cd-info { display: flex; flex-direction: column; min-width: 0; } .cd-item .cd-time { font-size: clamp(24px, 4vw, 52px); font-weight: 700; font-variant-numeric: tabular-nums; } .cd-item .cd-label { font-size: clamp(11px, 1.5vw, 18px); color: var(--text-dim); } .cd-item .cd-remain { font-size: clamp(14px, 2vw, 24px); color: var(--accent-warm); font-weight: 600; text-align: right; white-space: nowrap; } .cd-item .cd-remain.overdue { color: var(--accent-red); } /* ── Count-up timer (正计时) ──────────────── */ .countup-section { margin-top: clamp(8px, 1.5vh, 18px); } .countup-label { font-size: clamp(12px, 1.6vw, 18px); color: var(--text-dim); margin-bottom: clamp(2px, 0.4vh, 8px); } #countup-value { font-size: clamp(24px, 5vw, 64px); margin-bottom: 0; } .countup-btns { display: flex; gap: clamp(10px, 1.5vw, 20px); margin-top: clamp(8px, 1.2vh, 16px); } .countup-btns .pomo-btn { padding: clamp(6px, 1vh, 12px) clamp(20px, 3vw, 44px); }