From 3807ddca2400ffb9f340e31dd794d1cfc190e265 Mon Sep 17 00:00:00 2001 From: marc Date: Mon, 31 Aug 2026 01:24:50 +0200 Subject: [PATCH] Notiz zeigt sich sofort gesetzt, Widgets nach Wunsch des Nutzers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aus dem Zettel wird die Notiz: Der Text steht immer formatiert da, roh ist nur die Zeile mit der Schreibmarke. Dazu eine kleine Werkzeugleiste (Aufgabe, Aufzaehlung, Nummer, Ueberschrift, fett, Linie), Enter fuehrt Listen fort, Backspace am Zeilenanfang nimmt erst den Vorsatz. Fuer groessere Umbauten bleibt der Quelltext-Knopf. Kein contenteditable: Der Quelltext bleibt die Wahrheit und wird nie aus dem HTML zurueckgerechnet, das der Browser beim Tippen erzeugt. Reihenfolge und An/Aus der Widgets liegen jetzt je Nutzer auf dem Server, in einer Einstellung ("benutzer,notiz,-system,wetter,bild"). Der Schalter fuer das Wetter auf dem Schreibtisch faellt damit weg — es ist ein Widget wie jedes andere. Die Einstellungen sind in Abschnitte sortiert (Darstellung, HoneyBar, Widgets, Wetter, Programme, Konto), Beschriftung links, Schalter rechts. --- IDEAS.md | 34 ++- README.md | 82 +++++++- internal/store/store.go | 16 +- main.go | 6 +- web/css/style.css | 171 +++++++++++---- web/js/core.js | 9 +- web/js/os.js | 173 ++++++++++------ web/js/widgets/bild.js | 6 +- web/js/widgets/notiz.js | 426 ++++++++++++++++++++++++++++++++------ web/js/widgets/rahmen.js | 87 ++++++-- web/js/widgets/weather.js | 2 - wetter_test.go | 14 +- 12 files changed, 806 insertions(+), 220 deletions(-) diff --git a/IDEAS.md b/IDEAS.md index e18dbf9..040b198 100644 --- a/IDEAS.md +++ b/IDEAS.md @@ -206,8 +206,10 @@ nicht geplant"). Was bleibt, ist alles, was für sich allein steht: Wetter ### Wetter in der HoneyBar, neben der Uhr — ✅ gebaut (25.08.2026) -**Steht.** Zwei Schalter in den Einstellungen, unabhängig voneinander: auf dem -Schreibtisch, in der HoneyBar, beides oder keins. Die Stadt wird einmal gesucht +**Steht.** Zwei Orte, unabhängig voneinander: auf dem Schreibtisch, in der +HoneyBar, beides oder keins. Seit dem 31.08.2026 an zwei Stellen — auf dem +Schreibtisch ist das Wetter ein Widget wie jedes andere und steht in der +Widget-Liste, für die Leiste gibt es den eigenen Schalter. Die Stadt wird einmal gesucht und mit ihren Koordinaten gespeichert; der Server holt das Wetter und legt es zehn Minuten beiseite, die Oberflächen zeigen nur, was er hergibt. @@ -299,7 +301,7 @@ Zu prüfen ist dabei, was sonst noch inline gesetzt wird: die Lage der HoneyBar selbst und der Innenabstand, den sie der Seite verpasst. Über die CSSOM gesetzte Stile (`el.style.x = …`) fallen nicht unter die CSP — was im Markup steht, schon. -### Bild-Widget — Marcs Idee (29.08.2026) +### Bild-Widget — ✅ gebaut (30.08.2026) Ein Widget, das ein Bild zeigt: hochgeladen oder als Adresse eingetragen. Genau **eines je Nutzer**; ein neues ersetzt das alte, ohne Verwaltung und ohne Liste. @@ -324,11 +326,19 @@ Zu klären, wenn es soweit ist: - Passt zum Aufnehmen eigener App-Logos (1.3): dieselbe Ablage, dasselbe Ausliefern. Zusammen bauen spart die Hälfte. -### Notizzettel-Widget — Marcs Idee (29.08.2026) +### Notiz-Widget — ✅ gebaut (30.08.2026), Sofort-Ansicht (31.08.2026) Ein Zettel auf dem Schreibtisch: hineintippen, fertig. Serverseitig je Nutzer, also auf jedem Gerät derselbe Text. +**Nachtrag 31.08.2026 — was daraus wurde.** Aus dem „Zettel" ist die *Notiz* +geworden, mit kleinem Markdown, einer Werkzeugleiste und **Sofort-Ansicht**: Der +Text ist immer gesetzt zu sehen, roh ist nur die Zeile, in der die Schreibmarke +steht. Der Weg über `contenteditable` wurde verworfen — man müsste aus dem HTML, +das der Browser beim Tippen erzeugt, den Quelltext zurückraten, und ein Fehler +dabei kostet Text. Die Grenze zu InkNote steht trotz Formatierung: ein Text, +keine Liste von Notizen, keine Ordner, keine Suche. + **Die Abgrenzung ist hier wichtiger als die Technik:** InkNote gibt es schon. Der Zettel darf **keine zweite Notiz-App** werden — kein Titel, keine Liste, keine Ordner, keine Suche, keine Formatierung. Genau *ein* Textfeld, das man @@ -387,7 +397,7 @@ wenige Farben reduziert, hart gerastert) oder bunt bleiben? Ein Original-Logo mit Farbverlauf neben Pixelglyphen sieht schnell nach Fremdkörper aus. Ein Filter in der HoneyBar wäre billig zu haben und ließe sich abschalten. -### Widgets verschieben, Reihenfolge im Server — Marcs Idee (29.08.2026) +### Widgets verschieben, Reihenfolge im Server — ✅ gebaut (31.08.2026) Widgets per Ziehen umsortieren, die Reihenfolge liegt beim Nutzer auf dem Server — also auf jedem Gerät gleich. @@ -412,6 +422,20 @@ Voraussetzung ist ein Widget-Verzeichnis — heute stehen Benutzer und Wetter fest im HTML. Sinnvoll zusammen mit dem Widget-Rahmen (1.4) zu bauen, nicht davor. +**Gebaut (31.08.2026), wie vorgeschlagen: eine Liste, beide Ansichten folgen +ihr.** Dazu ein Schalter je Widget — wer den Systemzustand nicht sehen will, +soll ihn abschalten können, ohne ihn nach unten zu schieben. + +Beides steht in **einer** Einstellung: `widgets = "benutzer,notiz,-system,…"`, +das Minus heißt aus. Ein Feld statt zwei, weil beides zusammengehört: Ein +ausgeschaltetes Widget behält seinen Platz. Damit brauchte es weder einen neuen +Endpunkt noch eine neue Tabelle — die Einstellungen liegen ohnehin je Nutzer auf +dem Server. + +Ziehen ist es nicht geworden, sondern **Pfeile** — aus demselben Grund wie bei +den Apps (1.3b): Am Handy löst HTML5-Drag per Berührung nicht aus, und die Liste +ist kurz. Freie Plätze auf dem Schreibtisch bleiben offen, falls sie je fehlen. + ### Widgets in der HoneyBar selbst Bisher sind Widgets als Fenster auf dem Schreibtisch gedacht. Der Schreibtisch diff --git a/README.md b/README.md index d2d09b6..c1d2896 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ Ein Widget ist eine **Beschreibung**, kein Kasten in der `index.html`: widgetAnmelden({ id: "wetter", titel: "wetter", wo: ["terminal", "desktop"], // wo es erscheinen darf - sichtbar: () => state.settings.weatherDesk === "on", + sichtbar: () => true, // eigene Bedingung, optional laden: async () => …, // false = es gibt nichts zu zeigen leer: "verbergen", // oder ein Satz, der dann dasteht inhalt: () => "", @@ -214,15 +214,85 @@ wegbleiben — so macht es das Wetter ohne eingestellten Ort. Eine neue Anzeige ist damit eine Datei in `web/js/widgets/` und ein Import in `os.js`. Weder das Raster noch die Seite werden dafür angefasst. +### Reihenfolge und An/Aus liegen beim Nutzer + +Unter *Einstellungen → Widgets* steht jedes Widget mit einem Schalter und zwei +Pfeilen. Beides zusammen steht in **einer** Einstellung, und die liegt wie alle +anderen beim Konto auf dem Server — also auf jedem Gerät gleich: + +``` +widgets = "benutzer,notiz,-system,wetter,bild" +``` + +Das Minus heißt aus. Ein Feld statt zwei, weil beides zusammengehört: Wer ein +Widget ausschaltet, soll seinen Platz behalten, wenn er es wieder einschaltet. +Die Liste ist ein Wunsch, kein Gesetz — unbekannte Namen fallen weg, neue +Widgets hängen sich hinten an und sind an. Ein Widget, das erst später +eingeschaltet wird, holt seine Daten dann nach. + +Pfeile statt Ziehen: Ziehen wäre hübscher, löst am Handy per Berührung aber +nicht aus (dieselbe Entscheidung wie bei der Reihenfolge der Apps). + +## Notiz und Bild + +Zwei Widgets, die nichts abfragen, sondern etwas *sind*. Beides liegt **je +Nutzer auf dem Server** — die Notiz als Text in `honeyos.json`, das Bild als +Datei in `bilder/` daneben (oder als fremde Adresse, nie beides). + +### Die Notiz zeigt sich sofort gesetzt + +Der Text ist **immer** formatiert zu sehen; roh ist nur die eine Zeile, in der +die Schreibmarke steht. Man tippt also in einer Aufzählung und sieht ringsum +schon Überschriften, Häkchen und Punkte — statt `- [ ] Milch` zu schreiben und +sich vorzustellen, wie das gleich aussieht. + +Die Werkzeugleiste (Aufgabe · Aufzählung · Nummer · Überschrift · fett · Linie) +wirkt auf genau diese Zeile. Enter führt eine Liste fort und nummeriert weiter; +Enter auf einer leeren Aufzählungszeile beendet sie. Backspace am Zeilenanfang +nimmt erst den Aufzählungspunkt, dann erst die Zeile. Häkchen lassen sich +anklicken, ohne in den Text zu springen — das ist der häufigste Griff an einer +Liste. Für größere Umbauten gibt es den Knopf **quelltext**: dann doch das ganze +Feld, roh. + +**Warum nicht `contenteditable`?** Weil man aus dem, was der Browser beim Tippen +und Einfügen an HTML erzeugt, den Quelltext *zurückraten* müsste — und ein +Fehler dabei kostet Text. Hier bleibt der Quelltext die Wahrheit und wird nie +zurückgerechnet: Die Anzeige entsteht aus ihm, geändert wird immer nur eine +Zeile. Der Preis ist, dass man nicht über mehrere Zeilen hinweg markieren kann; +dafür ist der Quelltext-Knopf da. + +Das kleine Markdown ist von Hand geschrieben und absichtlich klein: +Überschriften (`#`, `##`, `###`), Häkchen (`- [ ]`, `- [x]`), Aufzählungen, +nummerierte Listen, `---`, `**fett**`, `*kursiv*`, `` `code` ``. Keine +Bibliothek — HoneyOS hat keinen Bauschritt, und für sechs Regeln lohnt kein +Nachladen. Escapt wird **vor** dem Formatieren: Eine Notiz, die `