Files
Imrayya 871a3cc174
Build Android APK / build (push) Failing after 5m7s
Build Server .exe / build (push) Failing after 2m27s
feat: config files, settings screen, hardware check
- Add config.py with multi-source config (YAML, .env, env vars)
- Add .env.example and config.yaml.example
- Add settings API endpoints (GET/POST /api/v1/settings)
- Add status endpoint (GET /api/v1/status) with hardware subsystem check
- Add settings screen to web client (protected by API token)
- Add localization strings for settings UI
- Add tests for config module and new endpoints
- Update README with config documentation
2026-07-01 13:32:08 +00:00

451 lines
6.7 KiB
CSS

/* PaperDash — E-Ink optimized styles */
/* High contrast, no smooth transitions, block-based UI */
:root {
--bg: #000000;
--fg: #ffffff;
--border: #ffffff;
--dim: #888888;
--panel-bg: #111111;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
width: 100%;
height: 100%;
background: var(--bg);
color: var(--fg);
font-family: "Courier New", monospace;
font-size: 16px;
overflow-x: hidden;
-webkit-user-select: none;
user-select: none;
}
#app {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
/* Screens */
.screen {
display: none;
flex-direction: column;
height: 100%;
padding: 16px;
}
.screen.active {
display: flex;
}
/* Login */
#login-screen {
justify-content: center;
align-items: center;
text-align: center;
gap: 16px;
}
#login-screen h1 {
font-size: 2em;
border-bottom: 2px solid var(--border);
padding-bottom: 8px;
}
#pin-input {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
padding: 12px 24px;
font-size: 1.5em;
text-align: center;
letter-spacing: 8px;
width: 200px;
font-family: inherit;
}
#connect-btn {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
padding: 10px 32px;
font-size: 1.1em;
cursor: pointer;
font-family: inherit;
}
.error {
color: var(--dim);
font-size: 0.9em;
}
/* Panels */
.panel {
border: 2px solid var(--border);
padding: 12px;
margin-bottom: 12px;
flex-shrink: 0;
}
.panel h2 {
font-size: 1em;
border-bottom: 1px solid var(--dim);
padding-bottom: 4px;
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 2px;
}
/* Media */
#artwork-container {
width: 100%;
max-height: 120px;
overflow: hidden;
margin-bottom: 8px;
border: 1px solid var(--dim);
}
#artwork-container img {
width: 100%;
height: 100%;
object-fit: contain;
}
.track-title {
font-size: 1.2em;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.track-artist,
.track-album {
color: var(--dim);
font-size: 0.9em;
}
/* Progress bar — block stepped for E-Ink */
#progress-container {
margin: 8px 0;
}
#progress-bar {
width: 100%;
height: 20px;
border: 2px solid var(--border);
background: var(--bg);
overflow: hidden;
}
#progress-fill {
height: 100%;
background: var(--fg);
width: 0%;
}
#progress-text {
display: flex;
justify-content: space-between;
font-size: 0.8em;
color: var(--dim);
margin-top: 2px;
}
/* Media controls */
#media-controls {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 8px;
}
.control-btn {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
width: 50px;
height: 50px;
font-size: 1.3em;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-family: inherit;
}
/* Audio mixer */
#master-volume {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
flex-wrap: wrap;
}
#master-label {
font-weight: bold;
min-width: 60px;
}
.volume-controls {
display: flex;
align-items: center;
gap: 4px;
flex: 1;
}
.volume-btn {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
width: 40px;
height: 40px;
font-size: 1.2em;
cursor: pointer;
font-family: inherit;
}
#master-volume-value {
min-width: 45px;
text-align: center;
}
.mute-btn {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
padding: 6px 12px;
font-size: 0.8em;
cursor: pointer;
font-family: inherit;
text-transform: uppercase;
}
.mute-btn.muted {
background: var(--fg);
color: var(--bg);
}
/* Channels */
.channel {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 0;
border-top: 1px solid var(--dim);
}
.channel-name {
min-width: 30px;
font-weight: bold;
}
.channel-meter {
flex: 1;
height: 16px;
border: 1px solid var(--dim);
overflow: hidden;
font-family: monospace;
font-size: 14px;
line-height: 16px;
}
.channel-meter-fill {
height: 100%;
background: var(--fg);
}
.channel-volume {
min-width: 35px;
text-align: right;
font-size: 0.85em;
}
/* Telemetry */
#telemetry-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.telemetry-item {
display: flex;
justify-content: space-between;
padding: 4px 8px;
border: 1px solid var(--dim);
}
.telemetry-label {
color: var(--dim);
text-transform: uppercase;
font-size: 0.85em;
}
.telemetry-value {
font-weight: bold;
}
/* Notifications */
.notification {
border: 2px solid var(--border);
padding: 8px;
margin-bottom: 6px;
}
.notification.alert {
border-color: var(--dim);
}
.notification.alert.warning {
border-style: double;
}
.notification.alert.error {
border-width: 3px;
}
.notification-title {
font-weight: bold;
margin-bottom: 4px;
}
.notification-message {
font-size: 0.9em;
color: var(--dim);
}
.notification-progress {
margin-top: 6px;
font-family: monospace;
font-size: 14px;
}
.notification-eta {
font-size: 0.8em;
color: var(--dim);
margin-top: 2px;
}
/* Scrollable dashboard */
#dashboard-screen {
overflow-y: auto;
overflow-x: hidden;
}
/* Settings button */
.settings-btn {
position: absolute;
top: 10px;
right: 10px;
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
width: 40px;
height: 40px;
font-size: 1.2em;
cursor: pointer;
z-index: 100;
font-family: inherit;
}
/* Settings screen */
#settings-screen {
justify-content: flex-start;
padding-top: 40px;
}
#settings-screen h1 {
font-size: 1.5em;
border-bottom: 2px solid var(--border);
padding-bottom: 8px;
margin-bottom: 12px;
}
#settings-screen p {
margin-bottom: 12px;
color: var(--dim);
}
#settings-token-input {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
padding: 10px;
width: 100%;
margin-bottom: 10px;
font-family: inherit;
font-size: 1em;
}
#settings-access-btn,
#settings-save-btn,
#settings-back-btn {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
padding: 10px 20px;
font-size: 1em;
cursor: pointer;
margin-right: 10px;
margin-bottom: 10px;
font-family: inherit;
}
#settings-content {
margin-top: 20px;
}
#settings-content .panel {
margin-bottom: 15px;
}
#settings-content h2 {
font-size: 0.9em;
margin-bottom: 8px;
color: var(--dim);
}
#settings-pin,
#settings-token {
background: var(--bg);
color: var(--fg);
border: 2px solid var(--border);
padding: 10px;
width: 100%;
font-family: inherit;
font-size: 1em;
}
#settings-status {
margin-top: 15px;
padding: 10px;
border: 2px solid var(--border);
background: var(--panel-bg);
}
.status {
color: var(--fg);
}
.error {
color: var(--dim);
font-size: 0.9em;
margin-top: 10px;
}
/* E-Ink specific: no transitions, sharp edges */
* {
transition: none !important;
-webkit-transition: none !important;
}