All checks were successful
CD / Build and push images (push) Successful in 3m1s
CI / Lint, typecheck, test (push) Successful in 2m13s
CI / Auth e2e pack (push) Successful in 2m36s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 9s
CD / Smoke tests against Test (push) Successful in 1m13s
CD / Promote to Int (push) Successful in 11s
Enable the third sidebar sort mode — a freely defined order. - api: `PATCH /pages/:id/position` (before/after neighbour) recomputes only the moved page's fractional `sort_key`. Pure `sort-key.ts` helpers (`nextKeyOrRebalance`, `evenlySpacedKeys`) decide between the cheap single-key path and a full pond rebalance to evenly-spaced keys when a key would exceed MAX_SORT_KEY_LENGTH or the client's neighbours are stale; rebalance runs in one transaction. Order is server-authoritative. - web: enable 'manual' in the sort-mode switch; in manual mode the owner can reorder via native drag-and-drop (drop above/below by pointer half) or the keyboard (per-row up/down buttons), each announced through an aria-live region. Reordering is hidden while a label filter narrows the list. New pages already append at the end (create uses generateKeyBetween(last, null)). Pure `reorder.ts` neighbour helpers, unit-tested. - i18n: manual sort mode + reorder strings (de + en). - tests: sort-key property test (10.000 adversarial reorders never collide or overflow — rebalance verified); reposition db test (persist, server-order, sort-mode switch keeps manual order); reorder e2e pack (keyboard reorder persists across reload + identical on a fresh read; aria-live announced). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PGdhRiwU1WRL4XxJfZYipY
52 lines
1.5 KiB
JSON
52 lines
1.5 KiB
JSON
{
|
||
"layout": {
|
||
"sidebar": {
|
||
"expand": "Seitenleiste einblenden",
|
||
"collapse": "Seitenleiste ausblenden",
|
||
"label": "Seiten",
|
||
"placeholder": "Deine Teiche und Seiten erscheinen hier.",
|
||
"empty": "Noch keine Seiten.",
|
||
"sortLabel": "Seiten sortieren",
|
||
"sortMode": {
|
||
"alpha": "A–Z",
|
||
"created": "Erstellungsdatum",
|
||
"manual": "Manuelle Reihenfolge"
|
||
},
|
||
"reorder": {
|
||
"up": "Nach oben",
|
||
"down": "Nach unten",
|
||
"dragHint": "Zum Umsortieren ziehen",
|
||
"moved": "{{title}} an Position {{position}} von {{count}} verschoben."
|
||
},
|
||
"newPage": "+ Neue Seite",
|
||
"newPageTitle": "Titel",
|
||
"create": "Erstellen",
|
||
"cancel": "Abbrechen"
|
||
},
|
||
"pondSwitcher": {
|
||
"label": "Teich wechseln",
|
||
"trigger": "Teich auswählen"
|
||
},
|
||
"user": {
|
||
"anonymous": "Nicht angemeldet"
|
||
}
|
||
},
|
||
"pondHome": {
|
||
"empty": "Dieser Teich hat noch keine Seiten – lege eine über die Seitenleiste an."
|
||
},
|
||
"home": {
|
||
"title": "Willkommen im Dorfteich",
|
||
"intro": "Dorfteich ist ein Open-Source-Wiki mit Echtzeit-Zusammenarbeit. Diese Instanz wird gerade eingerichtet.",
|
||
"api": {
|
||
"checking": "Prüfe API …",
|
||
"ok": "API erreichbar",
|
||
"error": "API nicht erreichbar"
|
||
}
|
||
},
|
||
"notFound": {
|
||
"title": "Seite nicht gefunden",
|
||
"body": "Die aufgerufene Adresse existiert nicht.",
|
||
"home": "Zurück zur Startseite"
|
||
}
|
||
}
|