Files
brewpi/web/style.css
T
jensandClaude Sonnet 4.6 0e343655b7 Surface WAIT_USER and add Confirm to the browser client
Ports show_user_message() from client/brewpi_gui.py: a plain <dialog>
pops with the step's user_message the instant WAIT_USER is newly
entered (tracked via a prevState comparison in onSudChanged()'s State
branch), and sends {"Sud": {"Confirm": true}} on the dialog's close
event - covers both the OK button and Escape dismissal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0189FkmyJkY77HqsNomr1DwV
2026-06-25 00:21:49 +02:00

147 lines
2.6 KiB
CSS

:root {
--led-off: #555555;
--led-green: #2ecc71;
--led-green-dim: #1b5e36;
--led-orange: #e67e22;
--led-orange-dim: #7a4111;
}
body {
font-family: sans-serif;
margin: 0;
padding: 0.5em 1em 4em 1em;
color: #222;
}
header#connection-bar {
display: flex;
align-items: center;
gap: 1em;
padding-bottom: 0.5em;
border-bottom: 1px solid #ccc;
}
.status-connected { color: #2ecc71; font-weight: bold; }
.status-disconnected { color: #999; }
#lcd-panel {
display: grid;
grid-template-columns: 10em 6em 6em;
gap: 0.2em 1em;
margin: 1em 0;
max-width: 30em;
}
.lcd-row { display: contents; }
.lcd-header { font-weight: bold; }
.lcd-label { color: #555; }
.lcd {
font-family: monospace;
font-size: 1.1em;
background: #fff;
border: 1px solid #2ecc71;
padding: 0.1em 0.3em;
text-align: right;
}
nav#tabs {
margin-top: 1em;
border-bottom: 1px solid #ccc;
}
.tab-btn {
background: none;
border: 1px solid #ccc;
border-bottom: none;
padding: 0.4em 1em;
cursor: pointer;
position: relative;
top: 1px;
}
.tab-btn.active {
background: #fff;
font-weight: bold;
border-bottom: 1px solid #fff;
}
.tab-content { display: none; padding: 1em 0; }
.tab-content.active { display: block; }
.panel {
border: 1px solid #ddd;
border-radius: 4px;
padding: 0.6em 1em;
margin-bottom: 0.8em;
max-width: 30em;
}
.panel h3 { margin: 0 0 0.4em 0; }
.panel label {
display: flex;
align-items: center;
gap: 0.6em;
margin: 0.3em 0;
}
.panel input[type="range"] { flex: 1; }
.hidden { display: none; }
.button-row {
display: flex;
gap: 0.5em;
margin: 0.3em 0;
}
.button-row button:disabled { opacity: 0.5; cursor: default; }
#step-plates { display: flex; flex-direction: column; gap: 0.5em; max-width: 36em; }
.step-plate {
border: 1px solid #ccc;
border-radius: 4px;
padding: 0.5em 0.8em;
display: grid;
grid-template-columns: 1.4em 1fr auto;
gap: 0.2em 0.6em;
align-items: center;
}
.step-plate .led {
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--led-off);
border: 1px solid #222;
}
.step-plate .title {
font-weight: bold;
grid-column: 2;
}
.step-plate .remaining {
font-weight: bold;
text-align: right;
}
.step-plate .field {
color: #555;
font-size: 0.95em;
}
.step-plate .span2 { grid-column: span 2; }
#sud-message-dialog {
border: 1px solid #ccc;
border-radius: 4px;
padding: 1em 1.4em;
max-width: 24em;
}
#sud-message-dialog::backdrop { background: rgba(0, 0, 0, 0.3); }
#sud-message-dialog form { margin-top: 1em; text-align: right; }
footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #f0f0f0;
border-top: 1px solid #ccc;
padding: 0.3em 1em;
display: flex;
justify-content: space-between;
font-size: 0.9em;
}