fix: scale indicator, logo crop, gateway LAN IP, setup spacing

webapp:
- Scale indicator: replace plain green dot with ⚖️ emoji + colored
  status badge (green/amber/grey/red); icon fades out when disconnected;
  tap shows a toast with device name + battery level
- Logo images: crop excess transparent padding from logo.png and
  logo_icon.png so content fills the frame at small display sizes
- style.css: reworked .scale-status-indicator CSS for emoji+badge

kiosk:
- SetupActivity: use device's real LAN IP for scale_gateway_url
  (was hardcoded 127.0.0.1 — only worked if server and kiosk run on
  the same machine); added getDeviceLanIp() helper (prefers wlan/eth)
- activity_setup.xml: reduce welcome step padding/margins so step 1
  fits on screen without scrolling; text sizes slightly reduced
- activity_setup.xml: fix feature bullet 'Bilancia Bluetooth via
  Gateway app' → 'Bilancia BLE integrata (nessuna app esterna)'
- strings.xml (en + it): rewrite all wizard_gateway_* strings to
  reflect integrated BLE service instead of external gateway APK
- ic_logo.png: regenerated at all densities from cropped source
This commit is contained in:
dadaloop82
2026-05-05 17:47:54 +00:00
parent a5094920bf
commit 7ea5505a0d
14 changed files with 126 additions and 55 deletions
+36 -16
View File
@@ -260,26 +260,46 @@ body {
}
/* ── Smart Scale status indicator ───────────────────────────────────── */
/* Same shape as .header-btn but non-interactive — shows colored dot */
/* Scale emoji with a small colored status dot in the lower-right corner */
.scale-status-indicator {
cursor: default;
cursor: pointer;
}
.scale-icon-wrapper {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
}
.scale-icon-emoji {
font-size: 20px;
line-height: 1;
transition: filter 0.3s, opacity 0.3s;
}
.scale-status-dot {
position: absolute;
bottom: 1px;
right: 0px;
width: 9px;
height: 9px;
border-radius: 50%;
border: 1.5px solid #0f172a;
background: #475569;
transition: background 0.4s, box-shadow 0.4s;
pointer-events: none;
}
.scale-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255,255,255,0.3);
transition: background 0.4s, box-shadow 0.4s;
flex-shrink: 0;
}
.scale-status-connected .scale-dot { background: #22c55e; box-shadow: 0 0 6px #22c55eaa; }
.scale-status-searching .scale-dot { background: #f59e0b; animation: scaleStatusPulse 1.4s infinite; }
.scale-status-disconnected .scale-dot { background: rgba(255,255,255,0.25); }
.scale-status-error .scale-dot { background: #ef4444; box-shadow: 0 0 4px #ef4444aa; }
.scale-status-connected .scale-status-dot { background: #22c55e; box-shadow: 0 0 5px #22c55eaa; }
.scale-status-connected .scale-icon-emoji { filter: none; opacity: 1; }
.scale-status-searching .scale-status-dot { background: #f59e0b; animation: scaleStatusPulse 1.4s infinite; }
.scale-status-searching .scale-icon-emoji { filter: none; opacity: 0.85; }
.scale-status-disconnected .scale-status-dot { background: #475569; }
.scale-status-disconnected .scale-icon-emoji { filter: grayscale(0.5); opacity: 0.55; }
.scale-status-error .scale-status-dot { background: #ef4444; box-shadow: 0 0 5px #ef4444aa; }
.scale-status-error .scale-icon-emoji { filter: none; opacity: 1; }
@keyframes scaleStatusPulse {
0%, 100% { box-shadow: 0 0 4px #f59e0b88; }
50% { box-shadow: 0 0 10px #f59e0bcc; }
0%, 100% { box-shadow: 0 0 3px #f59e0b88; }
50% { box-shadow: 0 0 9px #f59e0bcc; }
}
/* ── Scale read button (add/use forms) ──────────────────────────────── */
Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 KiB

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

After

Width:  |  Height:  |  Size: 238 KiB

+17
View File
@@ -805,6 +805,23 @@ function _scaleUpdateStatus(state) {
el.title = labels[state] || '';
}
/**
* Show a brief toast with the current scale connection status when the icon is tapped.
*/
function _scaleShowInfo() {
const state = _scaleConnected ? 'connected' : 'disconnected';
const msgs = {
connected: `⚖️ ${t('scale.status_connected')}${_scaleDevice ? ': ' + _scaleDevice : ''}${_scaleBattery != null ? ' 🔋' + _scaleBattery + '%' : ''}`,
searching: `⚖️ ${t('scale.status_searching')}`,
disconnected: `⚖️ ${t('scale.status_disconnected')}`,
error: `⚖️ ${t('scale.status_error')}`,
};
const el = document.getElementById('scale-status-indicator');
const cls = el ? [...el.classList].find(c => c.startsWith('scale-status-') && c !== 'scale-status-indicator') : null;
const key = cls ? cls.replace('scale-status-', '') : state;
showToast(msgs[key] || msgs[state], key === 'connected' ? 'success' : 'info');
}
/**
* Show the scale reading modal and wait for a stable weight, then populate the input.
* @param {string} targetInputId ID of the <input> to fill