focus-buddy / static /css /style.css
pocanman's picture
migrate to new repo
3006400
Raw
History Blame Contribute Delete
11.4 kB
:root {
--bg-primary: #0f0f1a;
--bg-card: #1a1a2e;
--bg-input: #12122a;
--accent-gold: #ffd700;
--accent-dim: #b8960c;
--accent-purple:#7c3aed;
--text-primary: #e8e8f0;
--text-muted: #8888aa;
--border: #2a2a4a;
--danger: #ef4444;
--success: #22c55e;
--radius: 8px;
}
/* ── App Title ───────────────────────────────────────────────── */
.app-title {
font-family: 'Segoe UI', system-ui, sans-serif;
font-size: 1.4rem;
font-weight: 700;
color: var(--accent-gold);
letter-spacing: 0.04em;
padding: 10px 4px 6px;
}
.app-title-sub {
font-size: 0.75rem;
font-weight: 400;
color: var(--text-muted);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-left: 6px;
vertical-align: middle;
}
/* ── Stats Bar ────────────────────────────────────────────────── */
.stats-bar {
display: flex;
align-items: center;
gap: 10px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 8px 14px;
margin: 6px 0;
font-family: 'Segoe UI', system-ui, sans-serif;
}
.stat-item {
display: flex;
align-items: center;
gap: 5px;
font-size: 0.82rem;
white-space: nowrap;
}
.stat-level {
color: var(--accent-gold);
font-weight: 700;
font-size: 0.9rem;
min-width: 60px;
}
.stat-xp {
flex: 1;
gap: 6px;
}
.stat-label {
color: var(--text-muted);
font-size: 0.75rem;
letter-spacing: 0.08em;
}
.stat-value {
color: var(--text-muted);
font-size: 0.75rem;
font-variant-numeric: tabular-nums;
min-width: 44px;
text-align: right;
}
.xp-track {
flex: 1;
height: 6px;
background: var(--bg-input);
border-radius: 3px;
border: 1px solid var(--border);
overflow: hidden;
min-width: 40px;
}
.xp-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent-purple), var(--accent-gold));
border-radius: 3px;
transition: width 0.4s ease;
}
.stat-coins {
color: var(--accent-gold);
font-weight: 600;
min-width: 58px;
justify-content: flex-end;
}
/* ── Timer Panel ──────────────────────────────────────────────── */
.timer-panel {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 20px 16px;
margin: 8px 0;
text-align: center;
font-family: 'Segoe UI', system-ui, sans-serif;
}
.timer-display {
font-size: 4rem;
font-weight: 700;
letter-spacing: 0.05em;
color: var(--accent-gold);
font-variant-numeric: tabular-nums;
text-shadow: 0 0 20px rgba(255, 215, 0, 0.4);
margin-bottom: 4px;
line-height: 1;
transition: color 0.3s;
}
.timer-display.break-phase {
color: #60a5fa;
text-shadow: 0 0 20px rgba(96, 165, 250, 0.4);
}
.timer-display.ringing {
animation: pulse 0.5s ease-in-out infinite alternate;
}
.timer-target {
font-size: 0.42em;
font-weight: 400;
color: var(--text-muted);
letter-spacing: 0.03em;
vertical-align: middle;
margin-left: 4px;
}
@keyframes pulse {
from { opacity: 1; }
to { opacity: 0.4; }
}
.timer-phase-label {
font-size: 0.85rem;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
margin-bottom: 16px;
}
/* ── Mode selector ────────────────────────────────────────────── */
.mode-buttons {
display: flex;
gap: 8px;
justify-content: center;
margin-bottom: 14px;
}
.mode-btn {
flex: 1;
padding: 6px 10px;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--bg-input);
color: var(--text-muted);
font-size: 0.82rem;
cursor: pointer;
transition: all 0.2s;
}
.mode-btn:hover {
border-color: var(--accent-gold);
color: var(--accent-gold);
}
.mode-btn.active {
border-color: var(--accent-gold);
background: rgba(255, 215, 0, 0.1);
color: var(--accent-gold);
}
/* ── Duration config ──────────────────────────────────────────── */
.timer-config {
display: flex;
gap: 16px;
justify-content: center;
margin-bottom: 14px;
font-size: 0.82rem;
color: var(--text-muted);
}
.timer-config label {
display: flex;
align-items: center;
gap: 6px;
}
.timer-config input[type=number] {
width: 52px;
padding: 3px 6px;
border: 1px solid var(--border);
border-radius: 4px;
background: var(--bg-input);
color: var(--text-primary);
font-size: 0.85rem;
text-align: center;
}
.timer-config input[type=number]:focus {
outline: none;
border-color: var(--accent-gold);
}
/* ── Control buttons ──────────────────────────────────────────── */
.timer-controls {
display: flex;
gap: 8px;
justify-content: center;
}
.ctrl-btn {
flex: 1;
padding: 8px 4px;
border-radius: var(--radius);
border: 1px solid var(--border);
background: var(--bg-input);
color: var(--text-primary);
font-size: 0.85rem;
cursor: pointer;
transition: all 0.2s;
}
.ctrl-btn:hover:not(:disabled) {
border-color: var(--accent-purple);
color: #a78bfa;
}
.ctrl-btn.start-btn:hover:not(:disabled) {
border-color: var(--success);
color: var(--success);
}
.ctrl-btn.stop-btn:hover:not(:disabled) {
border-color: var(--danger);
color: var(--danger);
}
.ctrl-btn:disabled {
opacity: 0.35;
cursor: not-allowed;
}
/* ── Avatar ───────────────────────────────────────────────────── */
.avatar-container {
height: 260px;
border: 1px solid var(--border);
border-radius: var(--radius) var(--radius) 0 0;
margin-bottom: 0;
overflow: hidden;
background:
radial-gradient(ellipse at 50% 35%, rgba(124, 58, 237, 0.25), transparent 60%),
linear-gradient(180deg, #14142a 0%, #0c0c18 100%);
}
.avatar-container canvas {
display: block;
width: 100%;
height: 100%;
}
/* fuse stats bar to bottom of avatar */
#avatar-html,
#stats-html {
padding: 0 !important;
margin: 0 !important;
gap: 0 !important;
}
#stats-html .stats-bar {
border-top: none;
border-radius: 0 0 var(--radius) var(--radius);
margin: 0;
}
/* ── Todo Panel ───────────────────────────────────────────────── */
.todo-panel {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 14px 16px;
margin: 8px 0;
font-family: 'Segoe UI', system-ui, sans-serif;
}
.panel-title {
font-size: 0.85rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--accent-gold);
margin: 0 0 10px;
font-weight: 600;
}
.todo-list {
display: flex;
flex-direction: column;
gap: 6px;
}
.todo-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 8px;
border-radius: 6px;
background: var(--bg-input);
border: 1px solid var(--border);
transition: border-color 0.15s;
}
.todo-item:hover {
border-color: var(--accent-purple);
}
.todo-check {
flex-shrink: 0;
width: 15px;
height: 15px;
accent-color: var(--success);
cursor: pointer;
}
.todo-task {
flex: 1;
font-size: 0.85rem;
color: var(--text-primary);
word-break: break-word;
}
.todo-task.todo-done {
text-decoration: line-through;
color: var(--text-muted);
}
.todo-del {
flex-shrink: 0;
background: none;
border: none;
color: var(--text-muted);
font-size: 0.75rem;
cursor: pointer;
padding: 2px 4px;
border-radius: 4px;
line-height: 1;
transition: color 0.15s;
}
.todo-del:hover {
color: var(--danger);
}
/* ── Panel Toggle Tabs ────────────────────────────────────────────── */
.panel-toggle-row {
display: flex;
gap: 6px;
margin: 6px 0 0;
}
.panel-tab {
flex: 1;
padding: 7px 10px;
border: 1px solid var(--border);
border-radius: var(--radius) var(--radius) 0 0;
background: var(--bg-input);
color: var(--text-muted);
font-size: 0.82rem;
cursor: pointer;
transition: all 0.2s;
border-bottom: none;
}
.panel-tab:hover {
color: var(--accent-gold);
border-color: var(--accent-dim);
}
.panel-tab.active {
background: var(--bg-card);
color: var(--accent-gold);
border-color: var(--accent-dim);
font-weight: 600;
}
.coming-soon-badge {
display: inline-block;
font-size: 0.62rem;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--bg-primary);
background: var(--text-muted);
border-radius: 3px;
padding: 1px 5px;
margin-left: 5px;
vertical-align: middle;
opacity: 0.8;
}
/* ── Inventory Panel ──────────────────────────────────────────────── */
.inventory-panel {
background: var(--bg-card);
border: 1px solid var(--accent-dim);
border-top: none;
border-radius: 0 0 var(--radius) var(--radius);
padding: 14px 16px;
font-family: 'Segoe UI', system-ui, sans-serif;
min-height: 420px;
position: relative;
}
.inv-section-title {
font-size: 0.72rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--text-muted);
margin: 0 0 10px;
font-weight: 600;
}
.inv-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.inv-item {
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 14px 10px 12px;
display: flex;
flex-direction: column;
align-items: center;
gap: 5px;
transition: border-color 0.2s;
position: relative;
}
.inv-item:not(.item-locked):hover {
border-color: var(--accent-gold);
}
.inv-item.item-locked {
opacity: 0.45;
cursor: not-allowed;
}
.inv-item-icon {
font-size: 2rem;
line-height: 1;
}
.inv-item-name {
font-size: 0.82rem;
font-weight: 600;
color: var(--text-primary);
text-align: center;
}
.inv-item-cost {
font-size: 0.78rem;
color: var(--accent-gold);
}
.inv-item-req {
font-size: 0.70rem;
color: var(--text-muted);
letter-spacing: 0.06em;
}
.inv-item-lock {
position: absolute;
top: 6px;
right: 8px;
font-size: 0.7rem;
}
.inv-empty {
grid-column: 1 / -1;
text-align: center;
color: var(--text-muted);
font-size: 0.82rem;
padding: 24px 0;
}
.inv-grid-blurred {
filter: blur(3px);
pointer-events: none;
user-select: none;
}
.inv-coming-soon-overlay {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
background: rgba(15, 15, 26, 0.55);
border-radius: 0 0 var(--radius) var(--radius);
}
.inv-coming-soon-text {
font-size: 1.3rem;
font-weight: 700;
color: var(--accent-gold);
letter-spacing: 0.06em;
text-shadow: 0 0 16px rgba(255, 215, 0, 0.5);
}
.inv-coming-soon-sub {
font-size: 0.78rem;
color: var(--text-muted);
text-align: center;
max-width: 200px;
}