bigbiggerbiggestbot/telegram-fitness-bot/webapp/style.css
Danny ae09ab2eec feat(tg-fitness-bot): add telegram fitness bot with web app
Telegram workout tracker bot with Mini App web UI, SQLite database,
API server, and cloudflared tunnel support.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 22:46:10 +02:00

333 lines
7.4 KiB
CSS

/* ── Reset & Telegram-native theming ─────────────────────────── */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: var(--tg-theme-bg-color, #ffffff);
color: var(--tg-theme-text-color, #000000);
min-height: 100vh;
-webkit-font-smoothing: antialiased;
}
/* ── Tab navigation ──────────────────────────────────────────── */
#tabs {
display: flex;
background: var(--tg-theme-secondary-bg-color, #f0f0f0);
position: sticky;
top: 0;
z-index: 100;
border-bottom: 1px solid var(--tg-theme-hint-color, #999999)33;
}
.tab {
flex: 1;
padding: 12px 0;
border: none;
background: none;
color: var(--tg-theme-hint-color, #999999);
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: color 0.2s, border-color 0.2s;
border-bottom: 2px solid transparent;
}
.tab.active {
color: var(--tg-theme-button-color, #3390ec);
border-bottom-color: var(--tg-theme-button-color, #3390ec);
}
/* ── Views ───────────────────────────────────────────────────── */
.view {
display: none;
padding: 16px;
padding-bottom: 32px;
}
.view.active {
display: block;
}
/* ── Cards ───────────────────────────────────────────────────── */
.card {
background: var(--tg-theme-secondary-bg-color, #f0f0f0);
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
}
/* ── Buttons ─────────────────────────────────────────────────── */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
border: none;
border-radius: 10px;
font-size: 15px;
font-weight: 600;
cursor: pointer;
padding: 12px 20px;
width: 100%;
transition: opacity 0.15s;
}
.btn:active {
opacity: 0.7;
}
.btn-primary {
background: var(--tg-theme-button-color, #3390ec);
color: var(--tg-theme-button-text-color, #ffffff);
}
.btn-danger {
background: #e53935;
color: #ffffff;
}
.btn-sm {
padding: 8px 16px;
font-size: 13px;
width: auto;
}
/* ── Inputs ──────────────────────────────────────────────────── */
.input {
width: 100%;
padding: 10px 12px;
border-radius: 10px;
border: 1.5px solid var(--tg-theme-hint-color, #999999)44;
background: var(--tg-theme-bg-color, #ffffff);
color: var(--tg-theme-text-color, #000000);
font-size: 15px;
outline: none;
transition: border-color 0.2s;
-webkit-appearance: none;
}
.input:focus {
border-color: var(--tg-theme-button-color, #3390ec);
}
select.input {
cursor: pointer;
}
/* ── Workout view specifics ──────────────────────────────────── */
.workout-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
padding: 12px 16px;
background: var(--tg-theme-secondary-bg-color, #f0f0f0);
border-radius: 12px;
}
#workout-timer {
font-size: 22px;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.set-inputs {
display: flex;
gap: 12px;
margin: 12px 0;
}
.input-group {
flex: 1;
}
.input-group label {
display: block;
font-size: 12px;
font-weight: 600;
color: var(--tg-theme-hint-color, #999999);
margin-bottom: 4px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* ── Set list items ──────────────────────────────────────────── */
.exercise-group {
margin-bottom: 16px;
}
.exercise-group-name {
font-size: 14px;
font-weight: 700;
color: var(--tg-theme-hint-color, #999999);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 8px;
}
.set-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 16px;
background: var(--tg-theme-secondary-bg-color, #f0f0f0);
border-radius: 10px;
margin-bottom: 4px;
font-size: 15px;
}
.set-item .set-number {
color: var(--tg-theme-hint-color, #999999);
font-weight: 600;
min-width: 50px;
}
.set-item .set-detail {
font-weight: 600;
}
.set-item .set-delete {
background: none;
border: none;
color: #e53935;
font-size: 18px;
cursor: pointer;
padding: 4px 8px;
border-radius: 6px;
}
/* ── Exercise list ───────────────────────────────────────────── */
.add-exercise-row {
display: flex;
gap: 8px;
align-items: center;
}
.add-exercise-row .input {
flex: 1;
}
.exercise-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px 16px;
background: var(--tg-theme-secondary-bg-color, #f0f0f0);
border-radius: 10px;
margin-bottom: 4px;
font-size: 15px;
font-weight: 500;
}
.exercise-item .exercise-delete {
background: none;
border: none;
color: var(--tg-theme-hint-color, #999999);
font-size: 18px;
cursor: pointer;
padding: 4px 8px;
}
/* ── History ─────────────────────────────────────────────────── */
.history-card {
background: var(--tg-theme-secondary-bg-color, #f0f0f0);
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
}
.history-card-header {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.history-date {
font-size: 13px;
color: var(--tg-theme-hint-color, #999999);
}
.history-volume {
font-size: 13px;
font-weight: 600;
color: var(--tg-theme-button-color, #3390ec);
}
.history-exercise {
margin-bottom: 6px;
}
.history-exercise-name {
font-size: 14px;
font-weight: 600;
margin-bottom: 2px;
}
.history-exercise-sets {
font-size: 13px;
color: var(--tg-theme-hint-color, #999999);
}
/* ── Empty state ─────────────────────────────────────────────── */
.empty-state {
text-align: center;
padding: 48px 16px;
}
.empty-icon {
font-size: 48px;
margin-bottom: 12px;
}
.empty-state p {
color: var(--tg-theme-hint-color, #999999);
font-size: 16px;
margin-bottom: 20px;
}
/* ── Haptic-like tap feedback ────────────────────────────────── */
.btn:active,
.tab:active,
.set-delete:active,
.exercise-delete:active {
transform: scale(0.97);
}
/* ── Toast notification ──────────────────────────────────────── */
.toast {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%) translateY(80px);
background: var(--tg-theme-text-color, #000000);
color: var(--tg-theme-bg-color, #ffffff);
padding: 10px 20px;
border-radius: 10px;
font-size: 14px;
font-weight: 600;
opacity: 0;
transition: transform 0.3s, opacity 0.3s;
z-index: 1000;
pointer-events: none;
}
.toast.show {
transform: translateX(-50%) translateY(0);
opacity: 1;
}