buhapp-telegram/public/css/app.css
root ffbc917a5d Add mobile emulator mode for desktop testing
- 390px-wide frame on desktop, mimics mobile Telegram
- Toggle button (top-right): 'Mobile' / 'Fullscreen'
- Auto-detects screen width, remembers choice in localStorage
- Real mobile (≤768px) uses native layout
2026-08-20 17:54:45 +00:00

295 lines
7.0 KiB
CSS

:root {
--primary: #FF6B35;
--primary-dark: #E64A19;
--secondary: #1E88E5;
--bg: #FFFFFF;
--bg-elev: #F5F5F7;
--bg-dark: #1C1C1E;
--text: #111114;
--text-dim: #6B6B73;
--text-inverse: #FFFFFF;
--border: #E0E0E5;
--danger: #E53935;
--success: #4CAF50;
--warning: #FFB300;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #1C1C1E;
--bg-elev: #2C2C2E;
--text: #FFFFFF;
--text-dim: #98989D;
--border: #38383A;
}
}
* { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
html, body { height: 100%; overflow: hidden; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'SF Pro Display', Roboto, sans-serif;
font-size: 15px;
color: var(--text);
background: var(--bg);
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
-webkit-user-select: none;
user-select: none;
}
#app {
height: calc(100vh - 60px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
}
#tabbar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: calc(60px + env(safe-area-inset-bottom));
padding-bottom: env(safe-area-inset-bottom);
background: var(--bg-elev);
border-top: 1px solid var(--border);
display: flex;
z-index: 100;
}
.tab {
flex: 1;
background: none;
border: none;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
color: var(--text-dim);
font-size: 11px;
cursor: pointer;
position: relative;
}
.tab svg { fill: currentColor; }
.tab.active { color: var(--primary); }
.tab .badge {
position: absolute;
top: 4px;
right: calc(50% - 18px);
background: var(--primary);
color: var(--text-inverse);
font-size: 10px;
font-weight: 700;
border-radius: 999px;
min-width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 4px;
}
.view { padding: 16px; }
.view h1 { font-size: 28px; font-weight: 700; margin-bottom: 12px; }
.view h2 { font-size: 18px; font-weight: 600; margin: 12px 0 8px; }
.view .sub { color: var(--text-dim); margin-bottom: 16px; }
.card {
background: var(--bg-elev);
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
}
.card.clickable { cursor: pointer; }
.btn {
display: block;
width: 100%;
background: var(--primary);
color: var(--text-inverse);
border: none;
border-radius: 10px;
padding: 12px 16px;
font-size: 16px;
font-weight: 600;
margin-top: 8px;
cursor: pointer;
}
.btn.ghost {
background: transparent;
color: var(--text);
border: 1px solid var(--border);
}
.btn.danger { background: var(--danger); }
.btn:disabled { opacity: 0.4; }
.input {
width: 100%;
background: var(--bg-elev);
color: var(--text);
border: 1px solid var(--border);
border-radius: 10px;
padding: 12px;
font-size: 15px;
margin-bottom: 12px;
font-family: inherit;
}
label { font-size: 13px; color: var(--text-dim); margin-bottom: 4px; display: block; }
.chip {
display: inline-block;
padding: 6px 12px;
border-radius: 999px;
background: var(--bg-elev);
border: 1px solid var(--border);
margin: 0 6px 6px 0;
font-size: 13px;
cursor: pointer;
}
.chip.active { background: var(--primary); color: var(--text-inverse); border-color: var(--primary); }
.list-row {
display: flex;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid var(--border);
cursor: pointer;
}
.avatar {
width: 48px;
height: 48px;
border-radius: 50%;
background: var(--primary);
color: var(--text-inverse);
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
margin-right: 12px;
flex-shrink: 0;
overflow: hidden;
background-size: cover;
}
.list-row .body { flex: 1; min-width: 0; }
.list-row .name { font-weight: 600; }
.list-row .last { color: var(--text-dim); font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bubble {
max-width: 75%;
padding: 8px 12px;
border-radius: 16px;
margin-bottom: 6px;
word-wrap: break-word;
}
.bubble.mine { background: var(--primary); color: var(--text-inverse); align-self: flex-end; border-bottom-right-radius: 4px; }
.bubble.theirs { background: var(--bg-elev); color: var(--text); align-self: flex-start; border-bottom-left-radius: 4px; }
.bubble .meta { font-size: 11px; opacity: 0.7; margin-top: 2px; display: flex; gap: 6px; }
.bubble .edited { font-style: italic; }
.chat-input {
display: flex;
padding: 8px;
background: var(--bg);
border-top: 1px solid var(--border);
position: sticky;
bottom: 0;
}
.chat-input input { flex: 1; margin: 0 8px 0 0; }
.chat-input button { width: 40px; padding: 0; margin: 0; }
#map { height: calc(100vh - 60px - 32px); width: 100%; }
.stars { display: flex; gap: 4px; font-size: 32px; }
.stars span { cursor: pointer; color: var(--border); }
.stars span.on { color: var(--warning); }
.row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
#consent-overlay {
position: fixed; inset: 0;
background: var(--bg);
z-index: 200;
padding: 20px;
overflow-y: auto;
}
.empty { color: var(--text-dim); text-align: center; padding: 32px 16px; }
.toast {
position: fixed;
top: 16px; left: 16px; right: 16px;
background: var(--bg-dark);
color: var(--text-inverse);
padding: 12px;
border-radius: 10px;
z-index: 1000;
text-align: center;
font-size: 14px;
}
.loader { text-align: center; padding: 32px; color: var(--text-dim); }
.consent-line { display: flex; align-items: center; padding: 8px 0; gap: 8px; }
.consent-line input[type="checkbox"] { width: 20px; height: 20px; }
.rating-big { font-size: 36px; font-weight: 700; }
/* Mobile emulator — на десктопе показываем как на мобиле */
body.mobile-mode {
display: flex;
justify-content: center;
align-items: flex-start;
min-height: 100vh;
background: #1a1a1f;
}
body.mobile-mode #mobile-frame {
width: 390px;
max-width: 100vw;
height: 100vh;
background: var(--bg);
position: relative;
overflow: hidden;
box-shadow: 0 0 40px rgba(0,0,0,0.4);
display: flex;
flex-direction: column;
}
body.mobile-mode #app {
height: calc(100vh - 60px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
flex: 1;
}
body.mobile-mode #tabbar {
position: relative;
width: 390px;
max-width: 100vw;
}
@media (max-width: 600px) {
body.mobile-mode #mobile-frame,
body.mobile-mode #tabbar {
width: 100vw;
}
}
#mode-toggle {
position: fixed;
top: 12px;
right: 12px;
z-index: 1000;
background: var(--bg-elev);
border: 1px solid var(--border);
color: var(--text);
border-radius: 999px;
padding: 6px 12px;
font-size: 12px;
cursor: pointer;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
#mode-toggle:hover { background: var(--primary); color: var(--text-inverse); }
body:not(.mobile-mode) #mode-toggle { display: none; }
.privacy-note { font-size: 12px; color: var(--text-dim); margin-top: 4px; }