Filipe: "kannst du bitte das logo wenn man es installiert auf pc oder handy und oben rechts in der leiste noch perfektionnieren." Beide Stellen hatten denselben Fehler, und er war derselbe wie an mehreren Stellen davor: Der Husky lag als MASKE auf einer Farbflaeche. Von einer Maske zaehlt nur der Alphakanal, und die Vorlage ist rundum freigestellt -- uebrig blieb eine geschlossene Flaeche in Hundeform. Kein Auge, keine Schnauze, kein Ohrinneres. Ein Fleck. Jetzt liegt an beiden Stellen dieselbe Zeichnung im Mischmodus "screen" ueber einer stahlblauen Silhouette: Schwarz laesst das Fell dunkel, Weiss hebt Gesicht, Ohren und Auge heraus. Gleiche Farben, gleicher Daempfer (.88) -- ein Zeichen, zwei Orte. App-Symbol ausserdem: - Die Chili lief mit ihrem Stiel quer ueber den Fang. Sie ist jetzt gespiegelt, kleiner und liegt hinter dem Hals. - Der Hals endete in einer geraden Kante (die Vorlage ist unten angeschnitten). Eine zweite Maske blendet ihn aus, statt ihn abzuschneiden. - Der Grund war matschig: Rot und Blau trafen sich diagonal genau dort, wo der Kopf steht. Jetzt kaltes Licht oben, warmes unten. - Unter 64 px faellt die Gesichtszeichnung weg, die Chili aber NICHT -- klein erkennt man ein Zeichen zuerst an der Farbe. - Alle Masse haengen an einer Zahl (Groesse der Gruppe), nicht an sechs. Kopfleiste ausserdem: - Die Chili links hatte einen BLAUEN Schein -- aus der Zeit, als dort der Husky stand. Der Schein ist nie mitgewandert. Jetzt warm. - `filter` ersetzt, es ergaenzt nicht: Beim Ueberfahren wurde der Schein geloescht und das Zeichen dabei flacher statt heller. Behoben. Damit die Aenderung auch ankommt: - Der Stempel gilt jetzt auch fuer die App-Symbole und fuer das Manifest. Bilder werden einen Tag zwischengespeichert, das Symbol der INSTALLIERTEN App gar nicht neu geholt -- ohne Stempel haette niemand das neue Zeichen gesehen. - pruef-zwischenspeicher prueft das (18 -> 21 Pruefungen). Werkzeuge: - tools/ausschnitt.mjs (neu): schneidet aus einem Bildschirmfoto ein Stueck heraus und vergroessert die PNG-Datei. Noetig, weil eine Vergroesserung per CSS-transform den Browser NEU rechnen laesst -- ich habe damit 264 px beurteilt und geglaubt, es seien 22, und daraus den falschen Schluss gezogen, ein Gesicht trage bei 22 px nicht. - tools/ansicht.mjs: AUSSCHNITT=<selektor> nimmt nur ein Element auf. - workspace-symbol.mjs: SYMBOL_ZIEL lenkt die Ausgabe um (Entwuerfe ansehen, ohne die sechs echten Dateien zu ueberschreiben), und zwei Gegenproben pruefen jetzt, dass Gesicht und Chili wirklich zu sehen sind -- die alte Pruefung sagte nur "es steht etwas drauf" und haette den Fleck anstandslos durchgewunken. Co-Authored-By: Claude Opus 5 <[email protected]>
114 lines
4.6 KiB
JavaScript
114 lines
4.6 KiB
JavaScript
/* =====================================================================
|
|
workspace-stempel.mjs — Versionsstempel an die Workspace-Dateien.
|
|
|
|
WARUM ES DAS GIBT:
|
|
Cloudflare speichert JS und CSS vier Stunden im Browser -- es
|
|
ueberschreibt damit das "no-cache", das der Server korrekt schickt.
|
|
Nach einem Deploy sah man deshalb bis zu vier Stunden lang die ALTE
|
|
Oberflaeche, obwohl der Server laengst die neue auslieferte. Genau so
|
|
ist es passiert: eine neue Kachel war live, aber nicht sichtbar.
|
|
|
|
Die HTML-Seiten kommen dagegen immer frisch an (no-cache, DYNAMIC).
|
|
Deshalb genuegt es, in der HTML einen Stempel an die Adressen zu
|
|
haengen: Neue Seite -> neue Adresse -> Cloudflare kennt sie nicht ->
|
|
frische Datei. Ohne Cloudflare-Einstellung, ohne Zutun von aussen.
|
|
|
|
Der Stempel ist die Minute des Aufrufs. Er wird bei jedem Lauf neu
|
|
gesetzt, auch wenn schon einer dasteht.
|
|
|
|
AUFRUF: node tools/workspace-stempel.mjs
|
|
Gehoert vor jeden Deploy, der JS oder CSS im Workspace anfasst.
|
|
===================================================================== */
|
|
|
|
import { readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
import { join, dirname } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const HIER = dirname(fileURLToPath(import.meta.url));
|
|
const ORDNER = join(HIER, "..", "workspace");
|
|
|
|
const d = new Date();
|
|
const p = (n) => String(n).padStart(2, "0");
|
|
const STEMPEL = `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}`;
|
|
|
|
/* Trifft href="assets/..." und src="assets/..." -- mit oder ohne
|
|
vorhandenen Stempel, damit wiederholte Laeufe nicht anhaengen. */
|
|
const MUSTER = /(href|src)="(assets\/(?:css|js)\/[A-Za-z0-9._-]+)(?:\?v=\d+)?"/g;
|
|
|
|
/* ZWEITES MUSTER: DIE APP-SYMBOLE (09.09.2026).
|
|
|
|
Sie stehen mit absolutem Pfad in der Seite (`/assets/img/app-symbole/…`)
|
|
und fielen deshalb durch das Muster oben durch. Der Server gibt Bildern
|
|
einen Tag Haltbarkeit -- ein neu gezeichnetes Symbol war damit bis zu
|
|
24 Stunden lang unsichtbar, obwohl es ausgeliefert wurde. Genau die
|
|
Luecke, die der Stempel eigentlich schliessen soll, nur fuer Bilder
|
|
statt fuer Stilvorlagen.
|
|
|
|
Die Reiter-Kennung und das Apple-Symbol bekommen deshalb denselben
|
|
Stempel wie alles andere. Dass es DERSELBE ist, ist wichtig: Die
|
|
Pruefung `pruef-zwischenspeicher` verlangt genau einen Stempel im
|
|
ganzen Haus, und eine zweite Zahl waere sofort rot. */
|
|
const MUSTER_SYMBOL =
|
|
/(href)="(\/assets\/img\/app-symbole\/[A-Za-z0-9._-]+)(?:\?v=\d+)?"/g;
|
|
|
|
let dateien = 0;
|
|
let stellen = 0;
|
|
|
|
for (const name of readdirSync(ORDNER)) {
|
|
if (!name.endsWith(".html")) continue;
|
|
const pfad = join(ORDNER, name);
|
|
const alt = readFileSync(pfad, "utf8");
|
|
let n = 0;
|
|
const neu = alt
|
|
.replace(MUSTER, (_, was, datei) => {
|
|
n += 1;
|
|
return `${was}="${datei}?v=${STEMPEL}"`;
|
|
})
|
|
.replace(MUSTER_SYMBOL, (_, was, datei) => {
|
|
n += 1;
|
|
return `${was}="${datei}?v=${STEMPEL}"`;
|
|
});
|
|
if (neu !== alt) {
|
|
writeFileSync(pfad, neu);
|
|
dateien += 1;
|
|
stellen += n;
|
|
console.log(` ${name.padEnd(20)} ${n} Verweise`);
|
|
}
|
|
}
|
|
|
|
/* DAS MANIFEST GEHOERT DAZU (09.09.2026).
|
|
|
|
Aus ihm holt sich das Betriebssystem das Symbol der installierten App.
|
|
Ohne Stempel zeigen Android und Windows nach einer Neuzeichnung
|
|
weiter das alte Bild -- die Adresse hat sich ja nicht geaendert, und
|
|
ein einmal installiertes Symbol wird nicht von sich aus nachgeladen.
|
|
Das Manifest selbst wird ohne Haltbarkeit ausgeliefert, kommt also
|
|
frisch an; nur die Adressen darin waren starr.
|
|
|
|
Derselbe Stempel wie in den Seiten -- `pruef-zwischenspeicher`
|
|
verlangt im ganzen Haus genau eine Zahl und wuerde eine zweite sofort
|
|
melden. */
|
|
const MANIFEST = join(ORDNER, "app.webmanifest");
|
|
const MUSTER_MANIFEST =
|
|
/("src":\s*")(\/assets\/img\/app-symbole\/[A-Za-z0-9._-]+)(?:\?v=\d+)?(")/g;
|
|
{
|
|
const alt = readFileSync(MANIFEST, "utf8");
|
|
let n = 0;
|
|
const neu = alt.replace(MUSTER_MANIFEST, (_, vor, datei, nach) => {
|
|
n += 1;
|
|
return `${vor}${datei}?v=${STEMPEL}${nach}`;
|
|
});
|
|
/* Findet das Muster nichts, ist das ein FEHLER und kein Achselzucken:
|
|
Dann hat jemand das Manifest umgebaut, und ab da laeuft das Symbol
|
|
still auf dem alten Stand weiter. */
|
|
if (n === 0) {
|
|
console.error("FEHLER: im Manifest keine Symboladresse gefunden -- Muster pruefen.");
|
|
process.exit(1);
|
|
}
|
|
if (neu !== alt) { writeFileSync(MANIFEST, neu); dateien += 1; stellen += n; }
|
|
console.log(` app.webmanifest ${n} Verweise`);
|
|
}
|
|
|
|
console.log(`\nStempel ${STEMPEL} auf ${stellen} Verweise in ${dateien} Dateien gesetzt.`);
|
|
if (!dateien) console.log("Nichts geaendert -- stimmt das Muster noch?");
|