351 lines
6.6 KiB
CSS
351 lines
6.6 KiB
CSS
/* Control page styles - desktop layout */
|
||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||
|
||
:root {
|
||
--bg: #0f1117;
|
||
--card-bg: #1a1d2e;
|
||
--text: #e0e0e0;
|
||
--text-dim: #888;
|
||
--accent: #4A90D9;
|
||
--border: rgba(255,255,255,0.10);
|
||
--radius: 8px;
|
||
--btn-secondary: rgba(255,255,255,0.08);
|
||
--warn-bg: rgba(255,200,87,0.12);
|
||
--badge-on-bg: rgba(76,175,80,0.18);
|
||
--badge-on-fg: #7bc47f;
|
||
--badge-off-bg: rgba(224,85,85,0.18);
|
||
--badge-off-fg: #e28a8a;
|
||
}
|
||
|
||
/* 浅色主题:白偏蓝背景、黑色字体与图标 */
|
||
.theme-light {
|
||
--bg: #e8edf4;
|
||
--card-bg: #ffffff;
|
||
--text: #1c2333;
|
||
--text-dim: #5b6a7e;
|
||
--accent: #2f6fb2;
|
||
--border: #d7dfe8;
|
||
--radius: 8px;
|
||
--btn-secondary: #e4e9f0;
|
||
--warn-bg: #fffbea;
|
||
--badge-on-bg: #e8f5e9;
|
||
--badge-on-fg: #2e7d32;
|
||
--badge-off-bg: #ffebee;
|
||
--badge-off-fg: #c62828;
|
||
}
|
||
|
||
/* 主题切换动画:切换瞬间由 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 !important;
|
||
}
|
||
|
||
html, body {
|
||
font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
|
||
background: var(--bg);
|
||
color: var(--text);
|
||
min-height: 100vh;
|
||
}
|
||
|
||
#app {
|
||
max-width: 960px;
|
||
margin: 0 auto;
|
||
padding: 20px;
|
||
}
|
||
|
||
header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-bottom: 24px;
|
||
flex-wrap: wrap;
|
||
gap: 12px;
|
||
}
|
||
|
||
header h1 {
|
||
font-size: 22px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
#tabs {
|
||
display: flex;
|
||
gap: 4px;
|
||
}
|
||
|
||
.tab {
|
||
padding: 8px 20px;
|
||
border: none;
|
||
background: var(--card-bg);
|
||
border-radius: var(--radius);
|
||
cursor: pointer;
|
||
font-size: 14px;
|
||
color: var(--text-dim);
|
||
border: 1px solid var(--border);
|
||
}
|
||
|
||
.tab.active {
|
||
background: var(--accent);
|
||
color: #fff;
|
||
border-color: var(--accent);
|
||
}
|
||
|
||
.tab-content {
|
||
display: none;
|
||
}
|
||
|
||
.tab-content.active {
|
||
display: block;
|
||
}
|
||
|
||
.section {
|
||
background: var(--card-bg);
|
||
border-radius: var(--radius);
|
||
padding: 20px;
|
||
margin-bottom: 16px;
|
||
border: 1px solid var(--border);
|
||
}
|
||
|
||
.section h3 {
|
||
font-size: 16px;
|
||
margin-bottom: 14px;
|
||
color: var(--text);
|
||
font-weight: 500;
|
||
}
|
||
|
||
/* Forms */
|
||
.form-row {
|
||
margin-bottom: 12px;
|
||
}
|
||
|
||
.form-row label {
|
||
display: block;
|
||
font-size: 13px;
|
||
color: var(--text-dim);
|
||
margin-bottom: 4px;
|
||
}
|
||
|
||
.inline-form {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
input, select, button {
|
||
font-family: inherit;
|
||
font-size: 14px;
|
||
}
|
||
|
||
input[type="text"],
|
||
input[type="url"],
|
||
input[type="number"],
|
||
input[type="time"],
|
||
select {
|
||
padding: 8px 12px;
|
||
border: 1px solid var(--border);
|
||
border-radius: 6px;
|
||
background: var(--card-bg);
|
||
color: var(--text);
|
||
min-width: 120px;
|
||
}
|
||
|
||
input[type="color"] {
|
||
width: 36px;
|
||
height: 36px;
|
||
border: 1px solid var(--border);
|
||
border-radius: 6px;
|
||
cursor: pointer;
|
||
padding: 2px;
|
||
}
|
||
|
||
button {
|
||
padding: 8px 16px;
|
||
background: var(--accent);
|
||
color: #fff;
|
||
border: none;
|
||
border-radius: 6px;
|
||
cursor: pointer;
|
||
font-weight: 500;
|
||
}
|
||
|
||
button:hover {
|
||
opacity: 0.9;
|
||
}
|
||
|
||
button.btn-secondary {
|
||
background: var(--btn-secondary);
|
||
color: var(--text);
|
||
}
|
||
|
||
button.btn-danger {
|
||
background: #E05555;
|
||
}
|
||
|
||
/* Lists */
|
||
.group-item, .alarm-item, .clock-item {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
padding: 10px 12px;
|
||
border: 1px solid var(--border);
|
||
border-radius: 6px;
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
.group-item .info, .alarm-item .info, .clock-item .info {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
}
|
||
|
||
.group-color-dot {
|
||
width: 12px;
|
||
height: 12px;
|
||
border-radius: 50%;
|
||
}
|
||
|
||
.group-name {
|
||
font-weight: 500;
|
||
}
|
||
|
||
.group-sources {
|
||
font-size: 12px;
|
||
color: var(--text-dim);
|
||
}
|
||
|
||
.group-actions {
|
||
display: flex;
|
||
gap: 6px;
|
||
}
|
||
|
||
.group-actions button {
|
||
font-size: 12px;
|
||
padding: 4px 10px;
|
||
}
|
||
|
||
.badge {
|
||
display: inline-block;
|
||
padding: 2px 8px;
|
||
border-radius: 4px;
|
||
font-size: 11px;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.badge-on { background: var(--badge-on-bg); color: var(--badge-on-fg); }
|
||
.badge-off { background: var(--badge-off-bg); color: var(--badge-off-fg); }
|
||
|
||
.small-btn {
|
||
font-size: 12px;
|
||
padding: 4px 10px;
|
||
background: var(--btn-secondary);
|
||
color: var(--text);
|
||
border: 1px solid var(--border);
|
||
border-radius: 4px;
|
||
cursor: pointer;
|
||
}
|
||
|
||
/* Day picker */
|
||
.day-picker {
|
||
display: flex;
|
||
gap: 4px;
|
||
}
|
||
|
||
.day-picker label {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 2px;
|
||
font-size: 13px;
|
||
cursor: pointer;
|
||
padding: 4px 8px;
|
||
border-radius: 4px;
|
||
border: 1px solid var(--border);
|
||
}
|
||
|
||
.day-picker label:has(input:checked) {
|
||
background: var(--accent);
|
||
color: #fff;
|
||
border-color: var(--accent);
|
||
}
|
||
|
||
.day-picker input[type="checkbox"] {
|
||
display: none;
|
||
}
|
||
|
||
/* Toast */
|
||
.toast {
|
||
position: fixed;
|
||
bottom: 20px;
|
||
right: 20px;
|
||
background: #333;
|
||
color: #fff;
|
||
padding: 10px 20px;
|
||
border-radius: 6px;
|
||
font-size: 14px;
|
||
animation: fadeIn 0.3s;
|
||
}
|
||
|
||
@keyframes fadeIn {
|
||
from { opacity: 0; transform: translateY(10px); }
|
||
to { opacity: 1; transform: translateY(0); }
|
||
}
|
||
|
||
/* ── Responsive breakpoints ────────────────── */
|
||
|
||
/* Tablet: 641–1024px */
|
||
@media (max-width: 1024px) {
|
||
#app { max-width: 100%; padding: 16px; }
|
||
.section { padding: 16px; }
|
||
}
|
||
|
||
/* Phone: ≤ 640px */
|
||
@media (max-width: 640px) {
|
||
#app { padding: 10px; }
|
||
header { flex-direction: column; align-items: flex-start; }
|
||
header h1 { font-size: 18px; }
|
||
#tabs { width: 100%; }
|
||
.tab { flex: 1; text-align: center; padding: 10px 8px; font-size: 13px; }
|
||
|
||
.section { padding: 14px; margin-bottom: 12px; }
|
||
.section h3 { font-size: 15px; margin-bottom: 10px; }
|
||
|
||
.inline-form { flex-direction: column; align-items: stretch; gap: 8px; }
|
||
input, select, button { width: 100%; min-width: 0; font-size: 15px; }
|
||
input[type="text"],
|
||
input[type="url"],
|
||
input[type="number"],
|
||
input[type="time"],
|
||
select { padding: 10px 12px; }
|
||
button { padding: 10px 16px; }
|
||
|
||
/* Day picker: wrap to two rows */
|
||
.day-picker { flex-wrap: wrap; gap: 4px; }
|
||
.day-picker label { padding: 6px 10px; font-size: 14px; }
|
||
|
||
/* List items: stack vertically */
|
||
.group-item, .alarm-item, .clock-item {
|
||
flex-direction: column;
|
||
align-items: flex-start;
|
||
gap: 8px;
|
||
}
|
||
.group-actions { width: 100%; justify-content: flex-end; }
|
||
|
||
/* Toast: full-width at bottom */
|
||
.toast {
|
||
left: 10px; right: 10px; bottom: 10px;
|
||
text-align: center; font-size: 14px;
|
||
}
|
||
}
|
||
|
||
/* Large desktop: > 1400px */
|
||
@media (min-width: 1400px) {
|
||
#app { max-width: 1200px; }
|
||
.section { padding: 28px; }
|
||
input[type="text"],
|
||
input[type="url"],
|
||
input[type="number"],
|
||
input[type="time"],
|
||
select { padding: 10px 14px; font-size: 15px; }
|
||
button { padding: 10px 20px; font-size: 15px; }
|
||
}
|