1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
// deck-it - the card a panel shows while what it watches is switched off
// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// Replaces box's content with a dimmed app icon, a title, a line on what
// brings it back, and a pulsing "checking" note, since the poll keeps going
// and the panel returns by itself. icon is a URL; a missing one is hidden.
// The raw reason, if any, is kept in the tooltip rather than shown.
export function offline(box, { icon, title, detail, reason }) {
const key = `${icon}|${title}|${detail}|${reason ?? ""}`;
if (box._offline === key && box.firstElementChild?.classList.contains("offline")) return;
box._offline = key;
box.innerHTML = `<div class="offline">
<img class="off-icon" alt="">
<div class="off-title"></div>
<div class="off-detail"></div>
<div class="off-poll"><i></i>checking</div>
</div>`;
const img = box.querySelector(".off-icon");
img.onerror = () => img.remove();
img.src = icon;
box.querySelector(".off-title").textContent = title;
box.querySelector(".off-detail").textContent = detail;
if (reason) box.firstElementChild.title = reason;
}
|