Der Stand hing am localStorage und damit an einem Rechner. Wer das Projekt woanders zog, sah einen anderen Stand. Jede Aenderung geht jetzt zusaetzlich in state/<projekt>.json, gebuendelt nach 600 ms. Beim Laden gewinnt die Datei, der localStorage ist nur noch der Rueckfall fuer den Fall, dass der Server nicht laeuft. Gibt es die Datei noch nicht, wird der vorhandene Browser-Stand einmalig hineingeschrieben. Ein Reload verschluckt nichts: was im Timer haengt, geht per sendBeacon raus. Der Server nimmt den Stand unter POST /state entgegen und loescht ihn unter DELETE /state. Der Projektname wird gegen ein enges Muster geprueft und der Zielpfad zusaetzlich gegen state/ gegengerechnet. Geschrieben wird erst in eine Nebendatei und dann umbenannt, eingerueckt und mit sortierten Schluesseln, damit git einen lesbaren Unterschied zeigt. state/*.json gehoeren ab jetzt in jeden Commit, sonst sieht die andere Maschine die Aenderung nicht. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
139 lines
1.6 KiB
JSON
139 lines
1.6 KiB
JSON
{
|
|
"bgState": [
|
|
{
|
|
"bg": "raster",
|
|
"int": "dezent"
|
|
},
|
|
{
|
|
"bg": "raster",
|
|
"int": "dezent"
|
|
},
|
|
{
|
|
"bg": "raster",
|
|
"int": "dezent"
|
|
},
|
|
{
|
|
"bg": "raster",
|
|
"int": "dezent"
|
|
},
|
|
{
|
|
"bg": "raster",
|
|
"int": "dezent"
|
|
}
|
|
],
|
|
"continuous": "aus",
|
|
"current": 0,
|
|
"edits": [
|
|
{
|
|
"laptop": {
|
|
"dx": -15,
|
|
"dy": -39,
|
|
"size": 827
|
|
},
|
|
"logo-full": {
|
|
"dx": -40,
|
|
"dy": 597
|
|
},
|
|
"szene": {
|
|
"dx": -10,
|
|
"dy": -82,
|
|
"size": 1020
|
|
},
|
|
"wabe-claim": {
|
|
"dx": 16,
|
|
"dy": -902
|
|
},
|
|
"wabe-logo": {
|
|
"dx": 209,
|
|
"dy": 833
|
|
},
|
|
"wabe-tagline": {
|
|
"dx": 141,
|
|
"dy": -3
|
|
}
|
|
},
|
|
{
|
|
"badge": {
|
|
"dx": -32,
|
|
"dy": -73
|
|
},
|
|
"body": {
|
|
"dx": 0,
|
|
"dy": -93
|
|
},
|
|
"headline": {
|
|
"dx": 0,
|
|
"dy": -84
|
|
},
|
|
"mock": {
|
|
"dx": 232,
|
|
"dy": -58,
|
|
"size": 706
|
|
},
|
|
"mock-2": {
|
|
"dx": -465,
|
|
"dy": -267,
|
|
"size": 360
|
|
}
|
|
},
|
|
{
|
|
"badge": {
|
|
"dx": -6,
|
|
"dy": -30
|
|
},
|
|
"headline": {
|
|
"dx": 0,
|
|
"dy": 7
|
|
},
|
|
"mock": {
|
|
"dx": 6,
|
|
"dy": -382,
|
|
"size": 870
|
|
},
|
|
"mock-2": {
|
|
"dx": -117,
|
|
"dy": -6,
|
|
"size": 354
|
|
},
|
|
"note": {
|
|
"dx": 144,
|
|
"dy": -129,
|
|
"size": 320
|
|
}
|
|
},
|
|
{
|
|
"headline": {},
|
|
"mock": {
|
|
"dx": 28,
|
|
"dy": -141,
|
|
"size": 931
|
|
},
|
|
"mock-2": {
|
|
"dx": -8,
|
|
"dy": -76
|
|
}
|
|
},
|
|
{
|
|
"mock": {
|
|
"dx": -9,
|
|
"dy": 16,
|
|
"size": 584
|
|
}
|
|
}
|
|
],
|
|
"frameStyle": "stapel",
|
|
"layoutState": [
|
|
"szene",
|
|
"standard",
|
|
"standard",
|
|
"standard",
|
|
"standard"
|
|
],
|
|
"superSample": 3,
|
|
"tagOut": "an",
|
|
"tilt": "an",
|
|
"v": 1,
|
|
"variant": "hell",
|
|
"view": "einzeln"
|
|
}
|