refactor: aufgeraeumt — Pakete hinten, Widgets vorne

Go: store, auth, weather und config sind eigene Pakete unter internal/. Vorher
lagen fuenf Dateien in einem Topf, und jede kannte jede.

Web: os.js hatte 1425 Zeilen und alles darin. Jetzt core.js (Zustand, Server,
Einstellungen), glyphs.js (die Pixelraster), js/widgets/ mit einem Widget je
Datei, os.js nur noch die Ansichten. Stylesheet nach css/.

Die HoneyBar bleibt eine einzelne Datei ohne Importe — sie wird von fremden
Seiten mit einer Zeile eingebunden, da darf nichts nachladen.

Nebenbei: Das gebaute Binary lag mit 9,8 MB im Repo und ist jetzt ignoriert.
Und der Test gegen eine zweite Versionsnummer geht nicht mehr auf os.js, sondern
durch alle .js — sonst haette ihn dieser Umbau still ausgehebelt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-29 20:51:21 +02:00
1 parent d08b0a229c
commit 52deffa30e
20 files changed
+780 -624

No files matched your search

+244
View File
@@ -0,0 +1,244 @@
/* Die Pixelsymbole von HoneyOS.
*
* Eigene Datei, weil sie Daten sind und nicht Verhalten: zwölf mal zwölf
* Zeichen je Symbol, mehr passiert hier nicht. Dieselben Raster stehen noch
* einmal in honeybar/honeybar.js — die soll eine einzelne Datei bleiben, die
* eine fremde App mit einer Zeile einbindet (siehe IDEAS 1.3).
*/
/* ── Pixel-Glyphen ─────────────────────────────────────────────────────────
* 12×12-Raster als Zeichenketten. Ein `#` ist ein Pixel. So bleiben die Icons
* im Retro-Raster statt aus einer Icon-Bibliothek zu kommen.
*/
export const GLYPHS = {
// Wettersymbole. Dieselben Namen wie in weather.go (wmo) und in der HoneyBar —
// solange 1.3 (geteilte Symbolquelle) nicht gebaut ist, stehen sie zweimal da.
sonne: [
"............",
".....##.....",
"..#..##..#..",
"...#....#...",
"....####....",
"..##....##..",
"..##....##..",
"....####....",
"...#....#...",
"..#..##..#..",
".....##.....",
"............",
],
heiter: [
"............",
"...##.......",
"..####..#...",
"...##..###..",
"......#####.",
"...####...#.",
"..#....##.#.",
".##........#",
"#..........#",
".##########.",
"............",
"............",
],
wolke: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
"#..........#",
"#..........#",
".##########.",
"............",
"............",
"............",
],
nebel: [
"............",
"....####....",
"..##....##..",
".##.......#.",
"#..........#",
".##########.",
"............",
".#########..",
"............",
"..#########.",
"............",
".#########..",
],
regen: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
".##########.",
"............",
"..#..#..#...",
".#..#..#....",
"..#..#..#...",
".#..#..#....",
],
schnee: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
".##########.",
"............",
"..#...#...#.",
".#.#.#.#.#..",
"..#...#...#.",
"............",
],
gewitter: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
".##########.",
"......##....",
".....##.....",
"....####....",
"......##....",
".....##.....",
],
cloud: [
"............",
"....####....",
"...#....#...",
"..#......##.",
".##........#",
"##.........#",
"#..........#",
"#..........#",
".##########.",
"............",
"............",
"............",
],
note: [
"..########..",
"..#......#..",
"..#.####.#..",
"..#......#..",
"..#.####.#..",
"..#......#..",
"..#.####.#..",
"..#......#..",
"..#.##...#..",
"..#......#..",
"..########..",
"............",
],
box: [
"............",
".##########.",
".#........#.",
".#........#.",
".#...##...#.",
".#..####..#.",
".#..####..#.",
".#...##...#.",
".#........#.",
".#........#.",
".##########.",
"............",
],
chip: [
"............",
"..#.#.#.#...",
".##########.",
".#........#.",
"##.######.##",
".#.#....#.#.",
"##.#....#.##",
".#.######.#.",
".#........#.",
".##########.",
"..#.#.#.#...",
"............",
],
gear: [
"....####....",
"..#.####.#..",
"..########..",
".####..####.",
"###......###",
"##........##",
"##........##",
"###......###",
".####..####.",
"..########..",
"..#.####.#..",
"....####....",
],
globe: [
"............",
"...######...",
"..#..#...#..",
".#...#....#.",
"############",
"#....#.....#",
"#....#.....#",
"############",
".#...#....#.",
"..#..#...#..",
"...######...",
"............",
],
disk: [
"............",
"############",
"#..######..#",
"#..#....#..#",
"#..#....#..#",
"#..######..#",
"#..........#",
"#.########.#",
"#.#......#.#",
"#.#......#.#",
"############",
"............",
],
folder: [
"............",
".####.......",
"#....#......",
"#.....######",
"#..........#",
"#..........#",
"#..........#",
"#..........#",
"#..........#",
"############",
"............",
"............",
],
};
export function glyphSvg(name) {
const grid = GLYPHS[name] || GLYPHS.box;
const rects = [];
grid.forEach((row, y) => {
// Waagerechte Läufe zusammenfassen: weniger Rechtecke, gleiches Bild.
let run = 0;
for (let x = 0; x <= row.length; x++) {
if (row[x] === "#") {
run++;
} else if (run) {
rects.push(`<rect x="${x - run}" y="${y}" width="${run}" height="1"/>`);
run = 0;
}
}
});
return `<svg viewBox="0 0 12 12" fill="currentColor" shape-rendering="crispEdges" aria-hidden="true">${rects.join("")}</svg>`;
}