# GREMMATIK App-Inhalte Buch

Aus den Appprojekt-Inhalten zusammengezogen. Stand 061.



## App-Code hier
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/00-START-APP-CODE-HIER.md

# App-Code hier Dies ist der leicht auffindbare Weitercodier-Ort. Start: 1. In diesen Ordner gehen: `GREMATIK-app-v4.0.672-fxchs` 2. `npm run preflight` 3. `npm install` 4. `npm run start` oder `npx expo start` Der frühere Maschinenpfad wird nicht mehr als aktiver Startpfad geführt. Aktiver Quellordner: `2-PROJEKTE/PROJEKT-app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs` Die Gesamtübergabe-ZIP liegt außerhalb der App in der Root-Übergabe. Stand: 2026-06-26.


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/App.js

import React from 'react'; import { Alert, Platform, StatusBar, StyleSheet, View, Pressable, Text, TextInput, useWindowDimensions, Animated, Easing, Image } from 'react-native'; import { captureRef } from 'react-native-view-shot'; import * as Print from 'expo-print'; import * as Sharing from 'expo-sharing'; import * as MediaLibrary from 'expo-media-library'; import * as ImagePicker from 'expo-image-picker'; import { Stage } from './src/ui/Stage'; import { FocusRoom } from './src/ui/FocusRoom'; import { LibraryPanel } from './src/ui/LibraryPanel'; import { PALETTE, theme } from './src/core/theme'; import { buildPrintHtml, buildPresentationHtml } from './src/core/printScene'; import { createEmptyMap, createTemplateMap, updateMapTitle, updateNode, addChildNode, addTextBlock, updateTextBlock, deleteTextBlock, addScale, updateScale, deleteScale, addBlockScale, updateBlockScale, deleteBlockScale, addChildNodes, deleteNodeTree, duplicateNodeTree, extractNodeSubtreeMap, nextNodeId, createAllConnectedMap, createAllImagesMap, createPhotoLibraryMap, mergePhotoLibraryMap, findPhotoLibraryMap, createSystemItmoMap, reparentNode, updateRelationWeight, } from './src/core/model'; import { loadMaps, saveMaps, exportMap, importMap, parseImportedMapText, loadReleaseSettings, saveReleaseSettings } from './src/core/storage'; const ITMO_ORIGIN_STRUCTURE_IMAGE = require('./assets/itmo-origin-structure.jpg'); const ITMO_INTRO_CARDS = [ { title: 'Beginne in der Mitte', text: 'GREMATIK sammelt Gedanken, Papier, Wissen und Körperthemen an einem ruhigen Fokuspunkt.', image: ITMO_ORIGIN_STRUCTURE_IMAGE, }, { title: 'Aus Themen wird Struktur', text: 'Kreise, Familien und Fäden ordnen, ohne dich in Listen zu verlieren.', image: ITMO_ORIGIN_STRUCTURE_IMAGE, }, { title: 'Bauen, prüfen, weiterdenken', text: 'Du kannst lernen, befunden, vergleichen, importieren und jeden Knoten weiterführen.', image: ITMO_ORIGIN_STRUCTURE_IMAGE, }, { title: 'Alles bleibt verbunden', text: 'Wörter, Bilder, Wiki, AI und Notizen werden zu deiner persönlichen Map.', image: ITMO_ORIGIN_STRUCTURE_IMAGE, }, { title: 'Fokus statt Überforderung', text: 'GREMATIK zeigt die Mitte klar und lässt die Außenwelt geordnet anschließen.', image: ITMO_ORIGIN_STRUCTURE_IMAGE, }, ]; function createLocalEmptyMapFallback(title = 'Neues Thema') { const t = Date.now(); const rootId = `local-empty-root-${t}`; const cleanTitle = String(title || 'Neues Thema').trim() || 'Neues Thema'; return { id: `local-empty-map-${t}`, title: cleanTitle, createdAt: t, updatedAt: t, roots: [rootId], nodes: { [rootId]: { id: rootId, title: cleanTitle === 'Neues Thema' ? 'Thematik' : cleanTitle, color: '#00e5b0', children: [], createdAt: t, updatedAt: t, text: '', blocks: [{ id: `local-empty-block-${t}`, title: 'Kern', text: '', words: [] }], symbolKeys: ['circle'], symbolKey: 'circle', relationWeight: 6, visualSize: 4, }, }, templateKind: 'empty', }; } function safeCreateEmptyMap(title = 'Neues Thema') { return typeof createEmptyMap === 'function' ? createEmptyMap(title) : createLocalEmptyMapFallback(title); } async function enrichPhotoAssetsWithMetadata(MediaLibrary, assets = [], concurrency = 12) { const source = Array.isArray(assets) ? assets : []; const out = new Array(source.length); let cursor = 0; const workers = Array.from({ length: Math.max(1, Math.min(concurrency, source.length || 1)) }, async () => { while (cursor ({ granted: true }), []); const [releaseSettings, setReleaseSettings] = React.useState(null); const [introPage, setIntroPage] = React.useState(0); const [introDismissedThisSession, setIntroDismissedThisSession] = React.useState(false); const [shareCleanMode, setShareCleanMode] = React.useState(false); const [restFullscreen, setRestFullscreen] = React.useState(false); const [allViewActive, setAllViewActive] = React.useState(false); const [itmoViewActive, setItmoViewActive] = React.useState(false); const [allImagesViewActive, setAllImagesViewActive] = React.useState(false); const [focusRoomContext, setFocusRoomContext] = React.useState(null); const [gravityDialog, setGravityDialog] = React.useState(null); const appWindow = useWindowDimensions(); const [undoStack, setUndoStack] = React.useState([]); const returnContextRef = React.useRef(null); const appCaptureRef = React.useRef(null); const [lastInteractionAt, setLastInteractionAt] = React.useState(Date.now()); const restTimerRef = React.useRef(null); const restUiOpacity = React.useRef(new Animated.Value(1)).current; const [restUiHolding, setRestUiHolding] = React.useState(false); const allConnectedMap = React.useMemo(() => createAllConnectedMap(maps), [maps]); const allImagesMap = React.useMemo(() => createAllImagesMap(maps), [maps]); const systemItmoMap = React.useMemo(() => createSystemItmoMap(releaseSettings), [releaseSettings]); const realActiveMap = maps.find(m => m.id === activeMapId) || maps[0]; const systemViewActive = allViewActive || itmoViewActive || allImagesViewActive || Boolean(realActiveMap?.readOnly); const focusRoomActive = !!focusRoomContext?.map; const activeMap = focusRoomActive ? focusRoomContext.map : (allImagesViewActive ? allImagesMap : (allViewActive ? allConnectedMap : (itmoViewActive ? systemItmoMap : realActiveMap))); const isWebLayout = Platform.OS === 'web'; const appLandscape = (appWindow?.width || 0) > (appWindow?.height || 0); const mobileAutoTimeline = !isWebLayout && appLandscape; const effectiveDisplayMode = mobileAutoTimeline ? 'timeline' : (!isWebLayout && displayMode === 'timeline' ? 'organism' : displayMode); const displayOptions = React.useMemo(() => getDisplayOptions(effectiveDisplayMode), [effectiveDisplayMode]); const wordIndex = React.useMemo(() => buildWordIndex(maps), [maps]); const activeBackgroundUri = React.useMemo(() => getMapRootBackgroundUri(activeMap), [activeMap]); const activeDesignTheme = 'gradient'; const sourceMapForFocus = React.useMemo(() => maps.find(m => m.id === focusRoomContext?.sourceMapId) || realActiveMap, [maps, focusRoomContext?.sourceMapId, real


## GREMATIK App-Erstdurchlauf
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/GREMATIK_APP_ERSTDURCHLAUF_LAUFEN_LASSEN.txt

GREMATIK App-Erstdurchlauf Stand: 2026-06-26 Europe/Berlin Version: 4.0.672 Dieser Ordner ist die lauffähige App-Arbeitskopie. Ausführen: 1. In diesen Ordner wechseln. 2. npm run preflight 3. npm install 4. npm run go Wichtig: - node_modules sind bewusst nicht in der ZIP enthalten. - Expo SDK 54 bleibt fest. - ITMO bleibt als technischer Import-/Exportkern sichtbar. - GREMATIK ist der öffentliche App-Name dieses Erstdurchlaufs. Korrektur v4.0.672: Der Preflight blockiert nicht mehr an fehlenden node_modules. Fehlende Expo-Abhängigkeiten sind Warnung, nicht Quellfehler. Vor EAS/TestFlight bleibt `npm install` Pflicht.


## GREMATIK Nullpunkt 0: Erstappbesuch
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/GREMATIK_NULLPUNKT_0_ERSTAPPBESUCH.md

# GREMATIK Nullpunkt 0: Erstappbesuch Stand: 2026-06-26 Dieser App-Stand behandelt den nächsten Start als Erstappbesuch. Wenn auf dem Gerät noch kein lokaler Speicher vorhanden ist, lädt die App zuerst die read-only Vorlage `GREMATIK Erstbesuch`. Dort stehen Standort, Vorgang, Optionen und Logbook-Regel, bevor eigene Themen wachsen. Technische Regel: `createSeedMap()` erzeugt nicht mehr zuerst eine leere Map, sondern die gesperrte GREMATIK-Orientierungsvorlage. Bestehende lokale Speicherstände auf bereits genutzten Geräten werden dadurch nicht gelöscht. Für einen echten Gerätetest auf Null muss die App-Datenablage im Gerät gelöscht oder die App frisch installiert werden. App-Button: Das neue organische Fuchs-Button-Motiv ist in `assets/icon.png`, `assets/adaptive-icon.png` und `assets/grematik-app-button-nullpunkt-0.png` gesetzt.


## HANDOFF v4.0.672 - ZIP-Konsistenz und Preflight-Quelle
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_NEXT_CHAT.md

# HANDOFF v4.0.672 - ZIP-Konsistenz und Preflight-Quelle Ausgang: Die hochgeladene ZIP `fxchs-grematik-de(12).zip` enthielt die App-Arbeitskopie v4.0.671. Der Quellbaum war lesbar, aber `npm run preflight` brach ohne `node_modules` und wegen der alten Prüfregel `visible app name contains the release version` ab. Änderung: - Version auf 4.0.672 gehoben. - `package.json` und `app.json` synchronisiert. - iOS `buildNumber` und Android `versionCode` auf 672 gesetzt. - Sichtbarer App-Name bleibt `GREMATIK`. - Preflight-Regel korrigiert: `GREMATIK` ist als stabiler sichtbarer Name erlaubt. - Fehlende lokale Expo-Abhängigkeiten sind im Preflight nur noch Warnung; der EAS/TestFlight-Build bleibt durch `scripts/ensure-deps.mjs` geschützt. Test: - `node scripts/preflight.mjs` muss im Quellordner ohne `node_modules` mit Warnungen, aber ohne FAIL enden. - Vor echtem TestFlight: `npm install`, dann `npm run preflight`, dann `npx expo-doctor`, dann Build. Offen: - Kein echter Expo-/EAS-Cloud-Build wurde in diesem Chat ausgeführt. - Keine UI-Screenshotprüfung durchgeführt.


## ITMO v4.0.551 – Release Candidate Cleanup
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.550.md

# ITMO v4.0.551 – Release Candidate Cleanup Basis: v4.0.549_intro_icon_release_shell. ## Ziel Kein neuer Feature-Ausbau, sondern Release-Putz: Versionsstand konsolidieren, Root-Doku bereinigen, TestFlight-Metadaten aktualisieren und den aktuellen App-Kern als fast fertigen Stand einfrieren. ## Geändert - Version auf 4.0.551 gehoben. - iOS buildNumber auf 550, Android versionCode auf 550. - `app.json` Extra-Labels auf `v4.0.551_render_view_fix_intro_placeholder` gesetzt. - `package.json` Name/Beschreibung korrigiert. - Intro-Skip nutzt jetzt `introSkippedV550`, akzeptiert aber alte `introSkippedV549`-Settings weiter. - Root-Doku bereinigt: alte Handoffs, alte Testchecklisten, alte Prompt-/Anatomie-Testdateien liegen unter `docs/root-history/` statt im Projektroot. - README neu und kurz auf aktuellen Releasekandidatenstand gebracht. ## Bewusst nicht geändert - Keine neue Geometrie-Logik. - Keine neue Inhaltsverbindungs-Fäden. - Keine Ton-/VR-Reaktivierung. - Keine finalen externen Intro-Bilder eingebunden. ## Offene Dinge vor echter Store-Abgabe - Finale Intro-/Vorlagenbilder einsetzen, sobald Bildmaterial vorliegt. - Öffentlich erreichbare Datenschutz- und Impressumsangaben finalisieren. - App-Store-Texte und Screenshots erzeugen. - Gerätetest und TestFlight-Preflight lokal ausführen.


## HANDOFF v4.0.551 – Render-View-Fix und Intro-Platzhalter
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.551.md

# HANDOFF v4.0.551 – Render-View-Fix und Intro-Platzhalter ## Status Direkter Hotfix nach Gerätetest: Die Bühne konnte mit `Property 'view' doesn't exist` abstürzen. Ursache war eine View-Abfrage in `filterShapesForZoom`, obwohl diese Funktion bereits mit projizierten Screen-Shapes arbeitet. ## Änderung - `filterShapesForZoom` nutzt für Randkinder keine nicht vorhandene World-View mehr. - Direkte Randkinder werden stattdessen über ihre projizierte Bildschirmnähe mitgenommen. - Intro bleibt als Platzhalter-/Bordmittel-Intro aktiv und ist weiter ersetzbar, sobald finale Bilder vorliegen. ## Nicht geändert - Keine neue Geometrie. - Keine neuen Inhaltsfäden. - Keine Ton-/VR-Reaktivierung. - Keine finalen externen Bildassets. ## Test - Bühne öffnen. - Neues Thema, Anatomie, Kompass, Gefühle/Bedürfnisse öffnen. - Pannen bis Randfamilien sichtbar sind. - Es darf kein Renderfehler `view` mehr erscheinen.


## ITMO v4.0.552 – AI-Prompt-UI, Schriftberuhigung, Geburtsanker
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.552.md

# ITMO v4.0.552 – AI-Prompt-UI, Schriftberuhigung, Geburtsanker ## Ziel Reaktion auf Gerätetest nach v4.0.551. Schwerpunkt: AI-Promptfenster wieder narrensicher machen, unnötige Zwischenflächen entfernen, Header-Glow beruhigen und die zuletzt beschädigte Geburts-/Familienkreisgeometrie reparieren. ## Änderungen - AI-Promptfenster: `Übernehmen` entfernt. - AI-Promptfenster: `AI`-Kicker entfernt. - AI-Promptfenster: Ziel-/Hilfstext und Promptvorschau entfernt. - AI-Promptfenster: `Prompt importieren` wieder als Hauptaktion eingebaut. - AI-Promptfenster: Schließen heißt jetzt `Beenden` und sitzt als einziger Abschlussbutton mittig unten mit X-Icon. - Header/Logo: Text-Glow bei `ITM` und Unterzeile entfernt. Nur das `O` blinkt langsam über Opacity/Scale. - Schriftberuhigung: AI-Promptfenster nutzt weniger Zwischenstufen, größere Normalgröße und klare dicke Überschrift. - Geburtsgeometrie: Urmutter-Kinder werden wieder stabil in fester Reihenfolge gesetzt: rechts, links, oben, unten, dann Diagonalen. - Familienkreisradius: Blattkinder liegen bei einheitlichem Familienarm wieder auf dem sichtbaren Familienkreis. Radius = Mutterradius + Fadenarm + Kindradius. - Rückanker: Kind-Fadenanker sitzt jetzt auf der zur Mutter zeigenden Polygonseite statt blind auf points[0]/points[1]. ## Nicht geändert - Keine neue Intro-Bildintegration. - Keine Inhaltsverbindungen auf Fäden. - Keine Ton-/VR-Reaktivierung. - Import neben Startsuche bleibt bestehen. ## Test - Neues Thema öffnen, vier Kinder erzeugen: rechts, links, oben, unten prüfen. - Prüfen, ob Kindmittelpunkte bei gleichartigen Blattkindern auf dem Familienkreis liegen. - AI-Vorlage öffnen: kein Übernehmen, keine Promptvorschau, kein Zielhilfstext, Prompt importieren sichtbar. - Header prüfen: kein Glow unter Text, nur O blinkt langsam.


## ITMO v4.0.553 – Prompt-Geburtsrichtung
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.553.md

# ITMO v4.0.553 – Prompt-Geburtsrichtung ## Ziel Das AI-Promptfenster bekommt eine klare Auswahl für die erste Geburtsrichtung der Promptmap. ## Änderungen - Vier Richtungsbuttons im Promptfenster: rechts, links, oben, unten. - Auswahl wird in `releaseSettings.aiPromptState.birthDirection` gespeichert. - Prompttext enthält die gewählte erste Richtung als konkrete Anweisung. - Promptimport übergibt `birthDirection` an die Importpipeline. - AI-Importe erhalten eine deterministische Richtungssequenz für Root-Hauptachsen, falls keine geplanten Richtungen aus dem Text kommen. ## Nicht geändert - Bühne/Bullauge/Familienkreise nicht weiter umgebaut. - Intro/Icon nicht geändert. - Ton/VR bleiben geparkt.


## ITMO v4.0.554 – Promptfenster und lesbares Kapitel-Importformat
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.554.md

# ITMO v4.0.554 – Promptfenster und lesbares Kapitel-Importformat ## Änderungen - Promptfenster ohne Überschrift „Thema erzeugen“. - Eingabefeld fragt jetzt: „Prompt für welche Thematik?“ - Eingabefeld markiert vorhandenen Text beim Fokus, damit direkt überschrieben werden kann; Fokuszustand wird grau unterlegt. - Prompt wurde auf lesbare klassische Kapitelnummerierung umgestellt. - AI-Antwortformat beginnt mit `Thema:` und `Suchbegriff:`; die Thema-Zeile dient als App-Thementitel und zählt nicht als Kapitel. - Erstes Kapitel soll dem Suchbegriff entsprechen, z. B. `1. Kontrollieren`. - Metadaten stehen lesbarer nach dem Fließtext: `Richtung: right; Symbol: none; Farbe: auto`. - Import erkennt `Thema:`/`Suchbegriff:` und nummerierte Kapitel. - Export schreibt Maps ebenfalls als lesbare nummerierte Kapiteldatei mit Thema, Suchbegriff und Metadatenzeile nach dem Text. ## Nicht geändert - Bühnengeometrie, Bullauge, Familienkreise. - Vorlagenlogik. - Intro/Icon. - Ton/VR bleiben geparkt. ## Prüfen 1. AI-Vorlage öffnen. 2. Textfeld antippen: vorhandener Text sollte markiert/grau unterlegt sein. 3. Prompt kopieren und Antwort mit nummerierter Struktur importieren. 4. Map exportieren und prüfen, ob die Datei lesbar mit Thema/Suchbegriff/Nummerierung ausgegeben wird.


## ITMO v4.0.555 – Familienkreis- und Geburtsgeometrie-Reparatur
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.555.md

# ITMO v4.0.555 – Familienkreis- und Geburtsgeometrie-Reparatur Basis: v4.0.554. ## Anlass Gerätetest zeigte zwei klare Bühnenfehler: - AI-/Prompt-Maps nutzten geplante Richtungen auch in tiefen Unterbäumen. Dadurch wuchsen Kinder teilweise wieder zur Bühnenmitte zurück und erzeugten lange Kreuzfäden. - Familienkreise richteten sich an der längsten Kind-/Enkel-Ausdehnung aus. Dadurch schwamm der Familienkreis optisch zu groß um die Mutterfamilie, statt den Grundkranz der direkten Kinder zu markieren. ## Änderungen - Familienkreisradius richtet sich jetzt an der kürzesten direkten Kindfadenlänge aus. - Kinder mit eigenen Kindern dürfen über diesen Grund-Familienkreis hinauswachsen, vergrößern aber nicht die Mutterfamilie. - AI-/Prompt-Maps nutzen geplante Richtungen nur noch für Root-Hauptachsen. Unterknoten wachsen wieder lokal aus ihrer Mutter heraus. - Anatomie, Kompass und andere Spezialvorlagen dürfen ihre räumlichen Hinweise weiterhin nutzen. - Lokale Kindverteilung vermeidet Rückwärtsrichtungen zur Mutter. Späte Kinder werden weiter im äußeren Halbraum verteilt, statt zurück in Richtung Vorfahr. - Geschwisterfamilien-Abstand nutzt den sichtbaren Grundkranz des Kindes. ## Nicht geändert - Promptfensterformat aus v4.0.554. - Nummerierter Import/Export. - Intro/Icon. - Ton/VR bleiben geparkt. ## Test 1. Neues Thema öffnen, 1–5 Kinder erzeugen. 2. Prüfen: Kindmittelpunkte der Blattkinder liegen auf dem Familienkreis. 3. Kind mit eigenem Kind erzeugen. 4. Prüfen: dieses Kind wächst nach außen über den Familienkreis hinaus, zieht aber nicht zur Mitte zurück. 5. AI-Promptmap „Sonne“ neu importieren. 6. Prüfen: Root-Hauptachsen verteilen sich nach Vorgabe; Unterbäume wachsen lokal aus ihrer Mutter, ohne lange Rückzugsfäden zur Bühnenmitte.


## ITMO v4.0.556 circle_body_family_anchor_fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.556.md

# ITMO v4.0.556 circle_body_family_anchor_fix Ziel: Kreis wieder als eigentlicher Körper, Polygon nur als dekorative Hülle. Familienkreisradius nach Muttermitte-Kindmitte des direkten Kindes mit den wenigsten Kindern. Enkel dürfen nicht durch falsche Rückseitenindizes Richtung Oma wachsen. Änderungen: - StageRenderLayers: Jede Shape bekommt wieder einen sichtbaren Kreis-Körper. Polygon wird nur als Stroke/Hülle darüber gezeichnet. - Fadenanker: Fäden docken am Kreisrand an, nicht an Polygonseiten. - FamilyCircleLayer: Radius wird aus Bildschirmabstand Muttermitte zu Kindmitte ermittelt. Ausgewählt wird das direkte Kind mit der kleinsten eigenen Kinderzahl; bei Gleichstand der kürzeste Abstand. - geometry.js: Rückseitenanker und Rückseitenindex werden gemeinsam berechnet. Der bisherige harte backEdgeIndex=0 für Enkel wurde ersetzt, damit Enkel nicht Richtung Oma zurückgezogen werden. Nicht geändert: - AI-Promptformat v4.0.554. - Prompt-Erstrichtung v4.0.553. - Intro/Icon-Platzhalter. - Ton/VR bleiben geparkt.


## ITMO v4.0.557 – Kreisanker und Geburtsgeometrie
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.557.md

# ITMO v4.0.557 – Kreisanker und Geburtsgeometrie ## Ziel Die Bühne wird wieder auf die einfache Kernregel zurückgeführt: Kreis ist der Körper, Polygon ist nur Dekohülle. Kinder werden über Kreisanker und Richtungsvektoren geboren, nicht über verzerrende Polygonseiten. ## Änderungen - Root-Kinder werden wieder über exakte Richtungsvektoren verteilt, nicht über die nächstbeste Polygonkante. - Standardreihenfolge ohne Promptvorgabe: rechts, links, oben, unten, danach Diagonalen. - Nicht-Root-Kinder wachsen lokal nach außen aus ihrer Mutter heraus. Die Auswärtsrichtung wird als Wachstumvektor an die nächste Generation weitergegeben. - Dreieck-/Viereck-/Polygonseiten entscheiden nicht mehr über die Lage des Kindes. Sie bleiben Dekohülle um den Kreis. - Familienkreisradius wird nicht mehr im Renderlayer verkürzt. Muttermitte bis Kindmitte bleibt die sichtbare Regel. - Geschwisterabstand bleibt billig vektorbasiert: Wenn Familienkreise kollidieren, wird entlang des bestehenden Familienvektors nach außen geschoben. ## Test 1. Neues Thema öffnen. 2. Sieben Kinder erzeugen. 3. Prüfen: Kind 1 rechts, Kind 2 links, Kind 3 oben, Kind 4 unten, danach Diagonalen. 4. An einem Kind weitere Kinder erzeugen. 5. Prüfen: Enkel wachsen aus dem Kind heraus, nicht Richtung Urmutter. 6. Prüfen: Kreis ist der Körper, Polygon bleibt Hülle.


## ITMO v4.0.558 – circle body / bullauge rule
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.558.md

# ITMO v4.0.558 – circle body / bullauge rule ## Ziel Diese Version entfernt die alte Einroll-/Ausroll- und Urmutter-Sonderlogik aus dem Bühnenrendering. Die Bühne folgt jetzt der harten Regel: Kreis vorne, Polygonhülle dahinter, Bildschirmmitte als Bullauge. ## Änderungen - Alle sichtbaren Knoten nutzen einen einheitlichen Kreisradius als Vordergrundkörper. - Polygonhüllen liegen hinter dem Kreis, sind gefüllt und zeigen nur die Anschluss-/Verbindungszahl. - 3 Verbindungen ergeben eine dreieckige Hülle, 4 eine viereckige Hülle usw.; der Kreis bleibt gleich groß. - Fäden docken an Kreisrändern an, nicht an Polygonkörpern. - Die alte Cluster-/Swallow-/Einroll-Projektion wird im normalen Bühnenpfad nicht mehr angewendet. - Bullauge ist nur noch Bildschirmmitte: Nähe zur Mitte skaliert weich größer, außen bleibt normal. - Kindergeburt wurde im Kern auf Kreisvektoren umgestellt: Kindmitte entsteht entlang des Familienvektors; Polygonseiten erzeugen nicht mehr die Position. ## Nicht geändert - Datenmodell, Vorlagen, Promptimport und Fokusraum bleiben unverändert. - Ton und VR bleiben geparkt. - Intro bleibt Platzhalter. ## Test 1. Neue Map öffnen. 2. Drei Kinder erzeugen: Mutterkreis bleibt gleich groß, Hülle wird dreieckig. 3. Vier Kinder erzeugen: Hülle wird viereckig, Kreis bleibt gleich groß. 4. An einem Kind weitere Kinder erzeugen: Enkel wachsen aus dem Kind heraus, nicht Richtung Oma. 5. Bühne verschieben: Bildschirmmitte vergrößert weich, unabhängig von Urmutter.


## ITMO v4.0.559 — hullStroke Referenzfix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.559.md

# ITMO v4.0.559 — hullStroke Referenzfix Fix: Renderfehler `Property hullStrokeForShape doesn't exist` in `src/ui/StageRenderLayers.js` behoben. Ursache: Nach dem Umbau auf Kreis als Vordergrundkörper und Polygonhülle dahinter blieb im Polygon-Renderpfad noch ein alter Funktionsaufruf `hullStrokeForShape(...)` stehen. Änderung: Der Pfad nutzt jetzt wieder `hullShapeForNode(...)`. Die Polygonhülle wird vor den Kreisen gerendert, damit sie dahinter liegt. Nicht geändert: Bühnengeometrie, Prompt, Import, Intro, Vorlagen.


## ITMO v4.0.560 – Circle/Hull/Birth/Compass Fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.560.md

# ITMO v4.0.560 – Circle/Hull/Birth/Compass Fix ## Schwerpunkt Kerngeometrie wieder auf die harte Regel zurückgeführt: Kreis ist sichtbarer Vordergrundkörper, Polygonhülle liegt gefüllt dahinter, Geburtenverteilung folgt Kreis-/Segmentlogik, Kompasspfeile rotieren nach ihrer tatsächlichen Richtung. ## Änderungen - Root-Geburtenverteilung neu: keine alte rechts-links-oben-unten-Mischordnung für 3+ Kinder. - Bei 3 Kindern entsteht eine echte Dreiecksverteilung um die Mutter. - Bei 4 Kindern entsteht eine gleichmäßige Viertelverteilung. - Erste Richtung rotiert nur den Startwinkel. - Prompt-/AI-Rootebene ignoriert einzelne geplante Richtungen der Unterpunkte als feste Weltachsen; maßgeblich ist die Start-/Erstrichtung plus gleichmäßige Verteilung. - Kreis wird vorne als Linie gerendert, ohne gefüllten Kreisbauch. - Polygonhülle bleibt gefüllt und liegt hinter der Kreislinie. - Kompasspfeile nutzen `compassDirectionAngleDeg` bevorzugt und werden am View rotiert, nicht nur am Textglyph. ## Nicht erledigt - Vollständige Entfernung aller alten Hilfsfunktionen aus dem Codebestand. - Tiefer Test auf Gerät. - Inhaltsverbindungen auf Fäden. ## Test 1. Neues Thema öffnen. 2. Drei Kinder erzeugen: Urmutterhülle muss Dreieck sein, Kinder müssen dreieckig verteilt sein. 3. Vier Kinder erzeugen: gleichmäßige Viertelverteilung. 4. Kompass öffnen: 16 Pfeile müssen rundum zeigen, nicht alle nach oben.


## ITMO v4.0.561 – Birth distribution, center open, family circle
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.561.md

# ITMO v4.0.561 – Birth distribution, center open, family circle ## Schwerpunkt Korrektur nach v4.0.560-Test: Map/Vorlage beim Öffnen zentrieren, Geburtenreihenfolge sinnvoller verteilen, Kinder ohne Kinder als kreisgroße Familien behandeln, Hüllen an Verbindungsrichtung ausrichten. ## Änderungen - Root-Geburtenfolge neu: 1 Startseite, 2 Gegenseite, 3/4 Querachsen, danach Zwischenrichtungen. - Bei 3 Kindern entsteht eine echte Dreiecksverteilung, bei 4 Kindern eine Kreuz-/Viertelverteilung. - Polygonhüllen werden an der passenden Verbindung ausgerichtet: Root-Hülle nach erster Richtung, Kind-Hülle mit Rückseite zur Mutter. - Kinder ohne Kinder bekommen im Familienkreis-Layer einen kreisgroßen Familienkreis statt Sonderbehandlung. - Neue Map/Vorlage öffnet initial zentriert auf der Urmutter, nicht seitlich/unten versetzt. - Kompass bleibt auf 16 feste Richtungen und rotiert Pfeile über tatsächliche Richtung. ## Nicht geändert - Keine neuen Features. - Keine Bildintegration. - Kein Ton/VR.


## ITMO v4.0.562 – Hull orientation and leaf-family circle fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.562.md

# ITMO v4.0.562 – Hull orientation and leaf-family circle fix - Polygonhülle nutzt wieder die echte Geometrie-/Tangentenrotation; keine axis-aligned Neuberechnung im Renderlayer. - Kreis bleibt Vordergrundkörper. - Kinderlose Kinder haben einen Familienkreis exakt in eigener Kreisgröße. - Hüllen mit 1/2 Verbindungen fallen visuell auf Kreis zurück; ab 3 Verbindungen gilt 3=Dreieck, 4=Viereck usw. - Root wird beim Öffnen weiterhin zentriert; Kompass bleibt feste 16-Richtungen-Karte.


## ITMO v4.0.563 – Randfamilien-Einrollen
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.563.md

# ITMO v4.0.563 – Randfamilien-Einrollen ## Ziel Randfamilien sollen wieder visuell einrollen, ohne die harte Bullauge-Regel und die Kreis-vorne-/Polygon-hinten-Regel zu brechen. ## Änderungen - Neuer Render-Schritt `applyEdgeFamilyRollIn` in `src/ui/Stage.js`. - Randfamilien werden nur visuell/projiziert entlang der bestehenden Eltern-Kind-Achse zur Mutter gezogen. - Logische Geometrie bleibt unverändert. - Der Effekt greift nur für Rand-/Außenbereiche und tiefer liegende Familien. - Kompass bleibt ausgenommen. ## Nicht geändert - Kreis bleibt Vordergrundkörper. - Polygonhülle bleibt dahinter. - Bullauge bleibt Bildschirmmitte. - Keine globale Einroll-/Ausroll-Zoomlogik reaktiviert.


## ITMO v4.0.564 – Intro und Geometrie-Putz
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.564.md

# ITMO v4.0.564 – Intro und Geometrie-Putz Stand: auf v4.0.563 aufgesetzt. Änderungen: - Intro nutzt jetzt die gelieferten fünf Platzhalterbilder als echte Vollbildkarten. - Intro-Skip nutzt introSkippedV564. - Kreisrendering weiter bereinigt: Kreis vorne nur noch Linie, keine gefüllte Kreisfläche. - Kreisschatten ist nur noch Linien-/Schattenkante, kein dunkler Füllkörper. - Kompass-Pfeile sind kleiner, damit der 16er-Ring lesbarer bleibt. - Randfamilien-Einrollen aus v4.0.563 bleibt erhalten. Nicht gelöst: - Vollständige finale Geometrie braucht weiter Gerätetest: Root mit 3/4 Kindern, Enkelrichtung, große Promptmaps. - Finales Bildset/Icon kann später ersetzt werden.


## ITMO v4.0.565 circle hull family anchor
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.565.md

# ITMO v4.0.565 circle hull family anchor Geometrie-Fix nach Test: - Polygonhülle wird im Renderlayer immer als Außenhülle UM den Kreis erzeugt. - shape.points bleiben Geometrieanker, nicht sichtbare Hüllengröße. - Kreis ist vorne nur Linie, ohne Schatten/Füllung. - Schatten/Füllung gehört nur zur Polygonhülle dahinter. - Familienkreis wird für alle sichtbaren Familien gezeichnet, nicht durch Überlappungsfilter aussortiert. - Familienkreis: ca. 20 Prozent Deckkraft, Fadendicke, gestrichelt. Test: 1. Neues Thema: drei Kinder erzeugen. Hülle der Mutter muss außerhalb des Kreises liegen. 2. Ein Kind mit Kindern: Unterfamilie muss eigenen Familienkreis haben. 3. Kompass prüfen.


## ITMO v4.0.566
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.566.md

# ITMO v4.0.566 Ziel: Hülle als knapper Außenring, Kreis vorne, Bildschirmmitte sichtbar. Änderungen: - Intro erscheint bei jedem Start und bleibt skipbar. - Bühnen-Koordinatensystem eingebaut: gestrichelte horizontale/vertikale Achse plus Mittelpunkt exakt in der Bildschirmmitte. - Hüllenrendering verschlankt: Kreis ist runde Sonderform der Hülle, 0/1/2 Anschlüsse bleiben rund, ab 3 Anschlüssen entsteht Polygonhülle. - Hülle sitzt knapp um den Kreis statt als riesiger eigener Körper. - Kreis vorne bleibt Linie ohne Füllung/Schatten. Test: 1. App starten: Intro muss erscheinen, Skip sichtbar. 2. Neue Map öffnen: Urmutter muss auf dem Mittelpunkt des Koordinatensystems sitzen. 3. 1, 2, 3, 4 Kinder erzeugen: Hülle rund bei wenigen Anschlüssen, Dreieck ab 3, Viereck ab 4.


## ITMO v4.0.567 – Intro Buttons Fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.567.md

# ITMO v4.0.567 – Intro Buttons Fix ## Fix - Intro bleibt bei jedem App-Start sichtbar, aber `Überspringen` und `Starten` schließen es jetzt für die laufende Sitzung. - Ursache in v4.0.566: `showIntro` hing nur an `releaseSettings` und wurde nach Skip/Start nicht false. - Neu: `introDismissedThisSession` blockiert das Intro nach Skip/Start bis zum nächsten App-Start. ## Test 1. App starten. 2. Intro erscheint. 3. `Überspringen` antippen: Startseite/Bühne muss bedienbar sein. 4. App neu starten: Intro erscheint wieder. 5. Bis letzter Karte, `Starten` antippen: Startseite/Bühne muss bedienbar sein.


## ITMO v4.0.568 – Edge Roll-in and Center Geometry Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.568.md

# ITMO v4.0.568 – Edge Roll-in and Center Geometry Pass - Randfamilien rollen wieder von außen nach innen: Blatt-/Außenknoten zuerst, tragende Eltern später. - Bullauge-Zentrum und Koordinatenkreuz nutzen jetzt exakt die Bildschirmmitte. - Kreis bleibt vorne ohne Schatten/Füllung; Hülle liegt knapp dahinter mit reduzierter Deckkraft. - Familienkreise bleiben für alle Familien sichtbar, gestrichelt und dünn. Test: Neue Map öffnen, Urmutter muss auf dem Koordinatenkreuz liegen. Mehrere Kinder/Enkel erzeugen und die Bühne an den Rand schieben; äußerste Knoten müssen zuerst kompakter an ihre Mutter gehen.


## ITMO v4.0.569 – Hull ring anchor fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.569.md

# ITMO v4.0.569 – Hull ring anchor fix - Polygonhülle wird als Außenring gezeichnet: Außenpolygon minus Innenkreis. Dadurch liegt keine Hüllenfüllung mehr im Kreiskörper. - Kreis bleibt Vordergrund: reine Linie, keine Füllung, kein Schatten. - Hülle hat Füllung und Schatten, aber nur außerhalb des Kreises. - Fadenanker kommen wieder vom Kreisrand. Bei 3+ Anschlüssen wird der Anker auf das passende Kreisbogen-/Verbindungssegment quantisiert. - Intro aus v4.0.567 bleibt startweise sichtbar und skipbar. - Koordinatenkreuz und Randfamilien-Einrollen aus v4.0.568 bleiben aktiv.


## ITMO v4.0.570 – Hull as hull, circle as front line
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.570.md

# ITMO v4.0.570 – Hull as hull, circle as front line ## Ziel Hülle verhält sich als Hülle: Kreis ist Vordergrundlinie, Hülle liegt knapp außen dahinter. Kreis ist die runde Sonderform der Hülle. ## Änderungen - Auch Knoten mit 0/1/2 Anschlüssen bekommen jetzt eine runde Außenhülle als Ring. - Polygonhüllen ab 3 Anschlüssen bleiben Außenring: Außenpolygon minus Innenkreis. - Hüllenabstand reduziert und knapper an den Kreis gelegt. - Kreis bleibt reine Linie ohne Füllung und ohne Schatten. - Schatten nur auf Hülle. - Fadenanker laufen über Kreis-/Segmentanker statt freien Kreiswinkel, sobald Anschlusssegmente existieren. ## Nicht geändert - Intro bleibt bei jedem Start sichtbar und skipbar. - Koordinatenkreuz bleibt sichtbar. - Randfamilien-Einrollen bleibt aktiv. - Kompass bleibt Sonderlayout. ## Test 1. Neue Map öffnen. 2. Prüfen, ob Urmutter auf Bildschirmmitte liegt. 3. 1, 2, 3, 4 Kinder erzeugen. 4. Prüfen: Kreislinie vorne, runde Hülle bei 1/2, Dreieck/Viereck außen ab 3/4. 5. Ein Kind mit Kindern erzeugen und lokale Hüllen/Familienkreise prüfen.


## ITMO v4.0.571 – hull rule correction
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.571.md

# ITMO v4.0.571 – hull rule correction Harte Korrektur der Hüllenregel nach Nutzerdefinition. ## Geändert - Keine runde Außenhülle mehr für 1 oder 2 Verbindungen. - 0 Verbindungen: keine Hülle, nur Kreislinie. - 1 Verbindung: Viereckhülle. - 2 Verbindungen: Viereckhülle. - 3 Verbindungen: Dreieckhülle. - 4 Verbindungen: Viereckhülle. - 5+ Verbindungen: n-Eck bis 16. - Hüllenradius wird über Tangentialradius berechnet, damit Dreieck/Viereck den Kreis umschließen statt in den Kreis zu schneiden. - Keine Ersatz-Rundhülle im Renderpfad. ## Nicht geändert - Kein UI-Umbau. - Kein Intro-Umbau. - Kein Prompt-Umbau. - Kein neues Feature.


## ITMO v4.0.572 – Leaf hull correction
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.572.md

# ITMO v4.0.572 – Leaf hull correction Scope only: correct the hull rule so leaf children do not receive square hulls from their parent connection. Rules now enforced in render layer: - 0 own children: no hull, only the foreground circle line. - 1 or 2 own children: square hull. - 3 own children: triangle hull. - 4 own children: square hull. - 5–16 own children: n-gon hull. The incoming parent connection is not counted for a leaf's hull. This preserves the mother rule without turning every leaf into a square. Not changed: intro, prompt, start UI, import/export, Kompass special template, edge roll-in.


## ITMO v4.0.573 – Kreis als Hüllen-Sonderform
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.573.md

# ITMO v4.0.573 – Kreis als Hüllen-Sonderform Korrektur nach Bühnenprüfung: - Kreis ist die Sonderform der Hülle bei 0 eigenen Kindern. - Blattkinder bekommen keine Viereckhülle durch ihre Elternverbindung. - Der Kreisinnenraum wird im Renderlayer mit der Bühnenfarbe maskiert, damit keine Hüllenfüllung oder Schatten im Kreis sichtbar dunkel stehen bleiben. - Viereck bleibt nur für Mütter mit 1 oder 2 eigenen Kindern. - Dreieck bleibt für Mütter mit 3 eigenen Kindern. - Kreislinie bleibt Vordergrundlinie. Nicht angefasst: Intro, Prompt, Start-UI, Import/Export, Kompass.


## ITMO v4.0.574
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.574.md

# ITMO v4.0.574 Fix: removed stale stageBackgroundColor references from Stage and StageRenderLayers. Circle/hull rendering now uses the ring path without an extra background-color mask. No UI, prompt, intro, import/export or compass changes.


## ITMO v4.0.576
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.576.md

# ITMO v4.0.576 Scope: finish current geometry pass without UI/prompt changes. Changes: - Removed remaining fragile ring cutout rendering. Hull is now a simple outside hull drawn behind the front circle, with no dependency on stage background color. - Circle remains front line only, thinner and clearer. - Hull gap reduced so the visual hull sits close to the circle. - 0-child leaf nodes use the 16-gon fallback as the circle special form. - 1/2 own children use square hull, 3 triangle, 4 square, 5+ n-gon up to 16. - No intro, prompt, start UI, import/export, or compass changes. Test: 1. Clean start: stop Expo, unzip into a fresh folder, run `npx expo start -c`. 2. New map: 0 children should show a circle-like 16-gon fallback around the circle line. 3. One child: mother square, child circle-like. 4. Two children: mother square. 5. Three children: mother triangle. 6. Four children: mother square. 7. Add children to a child: child becomes square/triangle by own child count.


## ITMO v4.0.577 – hull center black pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.577.md

# ITMO v4.0.577 – hull center black pass Fortsetzung auf Basis von v4.0.576. Ziel war nicht Feature-Ausbau, sondern Korrektur der sichtbaren Bühnengeometrie nach den aktuellen Hüllen-, Kreis- und Bullauge-Regeln. ## Geändert - Bühnenhintergrund ist hart schwarz. Der grüne Stage-Wash ist deaktiviert. - Bildschirmmitte ist wieder die echte Mitte: `STAGE_CENTER_Y = 0.500`. - Aktive Rand-Einrollung ist aus dem Renderpfad entfernt. - Aktiver Swallow-/Cluster-Filter ist aus dem Renderpfad entfernt. - Kerngeometrie und Renderer nutzen dieselbe Hüllenregel nach eigenen Kindern: - 0 eigene Kinder: 16-Eck als Kreis-Sonderform. - 1 oder 2 eigene Kinder: Viereck. - 3 eigene Kinder: Dreieck. - 4 eigene Kinder: Viereck. - 5 bis 16 eigene Kinder: n-Eck. - Elternverbindung zählt nicht mehr als sichtbarer Hüllengrund. Kinderlose Kinder werden dadurch nicht mehr automatisch Vierecke. - Hüllen werden wieder als ruhige Außenform hinter dem Kreis gezeichnet, ohne Ring-Cutout-Abhängigkeit. - Der Vordergrundkreis füllt innen schwarz und verhindert, dass die Hüllenfüllung den Innenkreis abdunkelt. - Familienkreise sind sichtbarer, aber dünner: weiße Kontur mit ungefähr halber Deckkraft. - Kompass-/Geburtsrichtung im Kern erhält die geplante Richtung stärker, statt unnötig auf alte Achsen reduziert zu werden. - `stageBackgroundColor` und `hullStrokeForShape` bleiben entfernt. ## Validierung - `node --check` für `App.js`, `src/**/*.js`, `scripts/**/*.js` und `scripts/**/*.mjs` bestanden. - Preflight-Metadaten sind auf v4.0.577 angehoben. - Im Sandbox-System fehlen lokale `node_modules`; deshalb kann Expo-Autolinking dort nicht vollständig laufen. Auf dem Entwicklungsrechner nach `npm install` bitte `npm run preflight` erneut ausführen. ## Nächster Test 1. App starten. 2. Kompass öffnen: Kinderlose Kinder müssen rund beziehungsweise 16-eckig bleiben, nicht viereckig. 3. Sonne/GFK importieren: 3 Kinder ergeben Dreieck, 4 Kinder Viereck, 5+ n-Eck. 4. Innenkreise prüfen: keine abgedunkelten Innenflächen. 5. Bühne bewegen: keine Rand-Einroll-/Ausrollbewegung, keine verschluckten Familien. 6. Queransicht prüfen: Mittelpunkt bleibt echte Bildschirmmitte.


## ITMO v4.0.578 – connection count hull pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.578.md

# ITMO v4.0.578 – connection count hull pass Fortsetzung auf Basis von v4.0.577. Ziel war nur die Korrektur der Hüllen-Eckenregel: nicht mehr eigene Kinder zählen, sondern echte Verbindungen. ## Geändert - Hüllenberechnung läuft jetzt über `connectionCountForHull(childCount, hasParent)`. - Die Mutterverbindung zählt bei allen Nicht-Root-Knoten als eigene Verbindung mit. - Root-Knoten zählen nur ihre direkten Kinderverbindungen. - 0 bis 2 Verbindungen bleiben Kreis-Sonderform beziehungsweise 16-Eck, weil daraus kein brauchbares 1- oder 2-Eck entsteht. - Ab 3 Verbindungen entspricht die Hülle der Verbindungssumme: 3 Verbindungen Dreieck, 4 Verbindungen Viereck, 5 bis 16 Verbindungen n-Eck. - Mehr als 16 Verbindungen wird im Renderer hart auf 16 Ecken gekappt, damit die Bühne stabil bleibt. - Beispielregel: Kind mit Mutterverbindung und 15 eigenen Kindern hat 16 Verbindungen und bekommt eine 16-Eck-Hülle. - Beispielregel: Kind mit Mutterverbindung und 2 eigenen Kindern hat 3 Verbindungen und bekommt eine Dreieck-Hülle. - Blattkind mit nur Mutterverbindung bleibt Kreis-Sonderform, nicht Viereck. ## Nicht geändert - Schwarzer Bühnenhintergrund aus v4.0.577 bleibt erhalten. - `STAGE_CENTER_Y = 0.500` bleibt erhalten. - Rand-Einrollung, Ring-Cutout-Pflichtpfad und Swallow-/Cluster-Filter bleiben aus dem aktiven Renderpfad entfernt. - Einheitlicher Vordergrundkreis bleibt gleich groß; nur die Hülle verändert ihre Eckenzahl. - Ton/Sound bleibt pausiert. ## Validierung - `node --check src/core/geometry.js` bestanden. - `node --check src/ui/Stage.js` bestanden. - `node --check src/ui/PolygonView.js` bestanden. - `node --check App.js` bestanden. - Vollständiger Expo-Preflight braucht lokale `node_modules`; im Sandbox-System sind Expo-Pakete nicht installiert. ## Nächster Test 1. Blattkind prüfen: nur Mutterverbindung, Kreis/16-Eck, kein Viereck. 2. Nicht-Root mit 1 eigenem Kind prüfen: 2 Verbindungen, weiterhin Kreis/16-Eck. 3. Nicht-Root mit 2 eigenen Kindern prüfen: Mutter plus 2 Kinder = 3 Verbindungen, also Dreieck. 4. Nicht-Root mit 3 eigenen Kindern prüfen: Mutter plus 3 Kinder = 4 Verbindungen, also Viereck. 5. Nicht-Root mit 15 eigenen Kindern prüfen: Mutter plus 15 Kinder = 16 Verbindungen, also 16-Eck. 6. Root separat prüfen: Root ohne Mutter zählt nur direkte Kinder.


## HANDOFF v4.0.579
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.579.md

# HANDOFF v4.0.579 Titel: connection_shape_circle_fix Änderungen: - Hüllenform zählt echte Verbindungen. - 0–1 Verbindungen ergeben eine Kreis-Hülle. - 2 Verbindungen ergeben ein Quadrat. - 3 Verbindungen ergeben ein Dreieck. - 4 Verbindungen ergeben ein Quadrat. - 5–16 Verbindungen ergeben das entsprechende n-Eck. - Die Kreis-Sonderform wird sichtbar als geschlossene, ungestrichelte Kreis-Hülle gerendert. - Die Vordergrundkreise sind nicht mehr schwarz gefüllt. - Die Segmentanker der Fäden folgen derselben Verbindungslogik wie die Hülle. Prüfen: 1. Blattkind bleibt Kreis-Hülle. 2. Kind mit einem Kind wird Quadrat. 3. Kind mit zwei Kindern wird Dreieck. 4. Root mit drei Kindern wird Dreieck. 5. Innenflächen der Kreise zeigen keine schwarze Füllung mehr.


## HANDOFF v4.0.580
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.580.md

# HANDOFF v4.0.580 Titel: focus_background_shape_rule Änderungen: - Der Bühnenhintergrund wird wieder aus der Fokus-/Themenfarbe berechnet. - Kein hartes globales Schwarz in StageCenterColorWash. - Wenn ein Knoten ausgewählt ist, bestimmt dessen Farbe den Hintergrund. - Vordergrundkreise sind farbig gefüllt, nicht schwarz. - Verbindungsregel bleibt: 0–1 Kreis, 2 Quadrat, 3 Dreieck, 4 Quadrat, 5–16 n-Eck. - Damit gilt: Kind mit 3 eigenen Kindern = Mutterverbindung + 3 Kinder = 4 Verbindungen = Viereck. Prüfen: 1. Fokussierter Knoten färbt den Bühnenhintergrund. 2. Kein harter schwarzer Bühnenhintergrund bei normaler Bühne. 3. Kreisinnenflächen nicht schwarz. 4. Kind mit 1 Kind = Quadrat. 5. Kind mit 2 Kindern = Dreieck. 6. Kind mit 3 Kindern = Viereck.


## HANDOFF v4.0.581
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.581.md

# HANDOFF v4.0.581 Absolute Hüllentabelle ist im Kern fixiert: `src/core/geometry.js`, `HULL_SHAPE_TABLE`. Root/Urmutter und Nicht-Root/Kind sind getrennte Tabellen. Renderer nutzt `nodePolygonSides()` aus dem Kern und keine eigene Formableitung mehr.


## HANDOFF v4.0.582
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.582.md

# HANDOFF v4.0.582 - Kreisfüllung auf der Bühne entfernt: Vordergrundkreise jetzt nur Kontur. - Schwarze UI-Flächen über dem Bühnenhintergrund deutlich reduziert. - Hüllentabelle aus v4.0.581 bleibt unverändert der absolute Kern.


## HANDOFF v4.0.583
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.583.md

# HANDOFF v4.0.583 - Innenkreis-Fadenanker folgen jetzt der passenden Hüllenseite statt alten Vertex-Winkeln. - Prioritätslabels für Root und direkte Familie werden immer erzwungen. - Leere Labels fallen sichtbar auf "Kind" zurück. - Hüllentabelle aus v4.0.581 bleibt unverändert gesperrt.


## HANDOFF v4.0.584
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.584.md

# HANDOFF v4.0.584 - Aktive Fadenlinie nutzt gespeicherte Hüllenseitenanker vor altem Winkel-Fallback. - Hüllenseitenanker werden aus der aktuellen kompakten Hülle berechnet, nicht aus alten shape.points. - Root- und Direktkinderlabels werden mit voller Opacity erzwungen. - Fadenstärke reduziert.


## HANDOFF v4.0.585
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.585.md

# HANDOFF v4.0.585 - Kreis-Hüllenfüllung entfernt: Kreise sind nur Kontur. - Innenkreis-Fadenanker nutzen jetzt die aktuell gerenderte Hüllenform aus compactStageGlyph, nicht alte shape.points. - Direktkinder-Labels depth <= 1 werden erzwungen.


## HANDOFF v4.0.586
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.586.md

# HANDOFF v4.0.586 - Kreis-Hülle wieder mit Hintergrundfüllung. - Vordergrundkreis überall nur noch weiße Linie, keine Farblinie. - Sichtbare Seitenanker bevorzugen echte Hüllenseiten, alte Richtungsreste weiter reduziert. - Hüllentabelle aus v4.0.581 bleibt unverändert der Kern.


## HANDOFF v4.0.587
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.587.md

# HANDOFF v4.0.587 - Ankerquelle radikal auf Vordergrundkreis reduziert. - Hülle wird aus Kreisanker-Tangenten konstruiert, nicht umgekehrt. - fixedVisibleSideAnchor/exactHullAnchor/circleSegmentBoundaryAnchor liefern keine Hüllen-/Seitenmittelpunkte mehr. - Kreis-Hülle behält Farbhintergrund, Innenkreis bleibt weiße Linie.


## HANDOFF v4.0.588
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.588.md

# HANDOFF v4.0.588 - Keine Lückenfüllung mehr: Kreisanker werden regelmäßig aus der Verbindungszahl erzeugt. - Hülle entsteht nur noch aus diesen regelmäßigen Kreisankern/Tangenten. - FamilyTetherLayer benutzt nur noch Kreisanker, keine fixedVisibleSideAnchor/exactHullAnchor/familyLineAnchor-Kette. - EarlyBudThreadLayer deaktiviert, damit keine fehlenden/alten Ghost-Reste gezeichnet werden. - Innenkreis bleibt weiße Linie, Kreis-Hülle hat wieder Farbhintergrund.


## HANDOFF v4.0.589
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.589.md

# HANDOFF v4.0.589 - Kreisanker sind jetzt fest und regelmäßig: keine Rotation zum ersten Ziel, kein shape.hullRotation, keine Lückenfüllung. - compactStageGlyph erzeugt keine alten Polygonpunkte mehr. Punkte entstehen nur noch aus Kreisankern/Tangenten. - Die Hüllentabelle aus v4.0.581 bleibt unverändert.


## HANDOFF v4.0.590
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.590.md

# HANDOFF v4.0.590 - Kreis-Hülle mit genau einer Verbindung nutzt jetzt den direkten Winkel zum Gegenkreis. - Mehrfachverbindungen bleiben auf feste Kreisanker quantisiert. - Keine Hüllen-/Seiten-/Lücken-Fallbacks im aktiven Familienfadenpfad.


## HANDOFF v4.0.591
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.591.md

# HANDOFF v4.0.591 - Aktiver Fadenpfad nutzt gespeicherte Kreisanker aus der Kerngeometrie: parentAnchorOnParent und parentAnchorOnSelf. - Hüllenpunkte werden bei 3+ gespeicherten Ankern aus diesen Kreisankern/Tangenten gebaut. - Kein nearest-regular-Anker mehr im normalen Eltern-Kind-Faden, wenn gespeicherte Verbindungspunkte vorhanden sind.


## HANDOFF v4.0.594
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.594.md

# HANDOFF v4.0.594 Änderungen - Root-Kinderverteilung ab 4 Kindern auf gleichmäßige Vollkreis-Winkel umgestellt. - Dadurch: 4 Kinder = 90°-Raster, 5 Kinder = 72°-Raster, keine alte Kreuz-/Lückenlogik mehr. - Bühnen-Körperkreise auf Familienkreis-Optik angepasst: weiße Kontur jetzt mit gleicher Deckkraft und feinerer Strichstärke. Bitte prüfen - Root mit 4 Kindern: Quadrat-Verteilung. - Root mit 5 Kindern: regelmäßige 72°-Verteilung und Pentagoneindruck. - Innere weiße Kreise wirken so leicht wie die Familienkreise.


## HANDOFF v4.0.595
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.595.md

# HANDOFF v4.0.595 Änderungen - Fäden enden jetzt auf der sichtbaren Hüllenaußenkante statt im inneren Dev-Kreis. - Polygonhüllen zeichnen nun deckend und ohne Rahmen. - Weiße Dev-Kreise unsichtbar gesetzt. - Familienkreise vollständig ausgeblendet. - Fäden auf volle Deckkraft gestellt. - Bühnenhintergrund leicht aufgehellt. - Bühnensuche startet leer und zeigt den Platzhalter „Thematik suchen“. Bitte prüfen - Root + Unterfamilie: Fäden dürfen nicht mehr aus Kreisinneren kommen. - Child mit eigener Familie: Mutter darf die Hüllenform nicht mehr optisch mitziehen. - Keine gestrichelten Dev-Kreise mehr sichtbar.


## HANDOFF v4.0.596
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.596.md

# HANDOFF v4.0.596 Änderungen - Strukturdeckkraft für Fäden und Polygonhüllen auf 80 Prozent gesetzt. - Familienkreise als Entwicklungsanzeige wieder aktiviert. - Koordinatenachse auf 10 Prozent reduziert. - Suchfeld-Regler aus JSX und Styles entfernt. - Bühnentap während aktiver Suche bleibt auf der Bühne und öffnet keinen Fokusraum. - Ruhebewegung verschiebt keine Knoten/Hüllen mehr. - Randnahes Bullauge/Rand-Einrollen wieder aktiviert. - Begriff Polygonankerkreis in docs/POLYGONANKERKREIS.md dokumentiert. Prüfen - Fäden sichtbar bei 80 Prozent, aber Debugkreise/Polygonanker besser prüfbar. - Familienkreis sichtbar. - Achse deutlich schwächer. - Suchfeld ohne Regler. - Sucheingabe + Bühnentap: kein Fokusraum. - Hüllen in Ruhebewegung bleiben still.


## HANDOFF v4.0.597
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.597.md

# HANDOFF v4.0.597 Änderungen - Neues Thema: Bühnenfeld ist zuerst Pflichtfeld für den Thementitel, nicht Suche. - Leerer Titel wird nicht übernommen; Bühnentap öffnet in diesem Zustand keinen Fokusraum. - Nach gesetztem Titel wird das Feld zur Suche: `In der Thematik „xy“ suchen`. - Titel wird in Map und Urmutter geschrieben. - Doppelte Thementitel werden automatisch als nummerierte Varianten gespeichert. - Suchfeld-Edit-Hinweis entfernt. - Regel dokumentiert in `docs/THEMATIK_TITEL_UND_SUCHE.md`. Prüfung - Neue Map öffnen: Feld zeigt `Thementitel eingeben`. - Titel eintragen: Urmutter übernimmt Titel. - Danach Feld: `In der Thematik „Titel“ suchen`. - Existierender Titel: neue Variante erhält Nummer im Titel.


## HANDOFF v4.0.598
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.598.md

# HANDOFF v4.0.598 Änderungen: - Stand als Stabilitäts-/Sicherungsstand markiert. - Thementitel-Feld blinkt vor Ersteingabe. - Labels erscheinen früher und ruhiger. - Familienkreise blenden gemeinsam ein/aus. - Nicht-Root-Familien ab 4 Kindern erhalten symmetrische Paarverteilung um die lokale Auswärtsachse: 2/2, 3/3, 4/4 ... bis 7/7. - Dokumentation ergänzt: docs/STAGE_STABILITY_LOCK_v4.0.598.md. Offen: - Exakte Ankerfindung am Polygonankerkreis weiter schärfen. - Danach Code-/Altpfad-Aufräumen.


## HANDOFF v4.0.637 - hull fill seam cleanup
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.637.md

# HANDOFF v4.0.637 - hull fill seam cleanup Ziel: sichtbaren Innenring in Polygonhüllen entfernen, ohne Bühne/Kamera/Anker wieder anzufassen. Änderung: - `src/ui/StageRenderLayers.js`: `hullShapeForNode` nutzt keine `polygonRingPathD(..., fillRule="evenodd")` mehr. - Stattdessen wird die Hülle als volle `SvgPolygon`-Fläche hinter dem deckenden Kreis gezeichnet. - Der schwache Innenkreis war wahrscheinlich Antialiasing an der ausgeschnittenen Ringkante, nicht ein normaler Circle-Stroke. Nicht geändert: - Stage/Kamera/Focus-Lock. - Familienkreislogik. - Ankerlogik. - Dreieckgröße. Test: 1. Alte Projektkopie löschen oder neuen Ordner verwenden. 2. ZIP frisch entpacken. 3. Expo/Metro-Cache möglichst clean starten. 4. Ozean-Test: 1, 2, 3, 4, 5, 16 Kinder. Erwartung: - Kein Springen. - Kein schwacher Innenring in Quadrat/Dreieck/Fünfeck/16er. - Familienkreise weiterhin sichtbar.


## HANDOFF v4.0.641-bullauge-print-layout-split
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.641.md

# HANDOFF v4.0.641-bullauge-print-layout-split Ziel: Bullauge und Print sauber trennen. ## Erledigt - Bildschirm/Bullauge: absolute Gleichabstandsregel. - Kinder mit eigenen Kindern werden im Bullauge nicht mehr herausgezogen. - Kollisionspush im Bullauge deaktiviert; Überlappungen sind erlaubt. - Print/PDF: nutzt `geometryMode: print` und behält hierarchische Extraabstände. - Max 9 Verbindungen bleibt: Root 9 Kinder, Nicht-Root 8 Kinder + Mutterverbindung. ## Test 1. Bühne öffnen, Map mit Kind-an-Kind-Struktur testen. 2. Bullauge: direkte Kinder müssen gleich nah an ihrer Mutter sitzen, auch wenn sie eigene Kinder haben. 3. Print: Gesamtbild darf weiter entzerrt/hierarchisch bleiben. 4. Kein Springen.


## HANDOFF v4.0.648-anchor-scale-fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.648.md

# HANDOFF v4.0.648-anchor-scale-fix Basis: v4.0.647. Fix: - Render Error `localBodyScale doesn't exist` in `src/ui/Stage.js` behoben. - Ursache: `parentAnchorOnSelf` referenzierte nach der Hüllenverformung eine nicht definierte lokale Variable. - Lösung: `parentAnchorOnSelf` wird jetzt mit `sizeScale` transformiert. Nicht verändert: - Bullauge bleibt positionsdominant. - Polygonhüllen dürfen sich verformen. - Verformung bleibt radial/tangential zur Bildschirmmitte ausgerichtet.


## ITMO v4.0.651 – Aligned Hull Point Warp
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.651.md

# ITMO v4.0.651 – Aligned Hull Point Warp Basis: v4.0.650_footer_ansichten_button. Ziel dieser Etappe: Polygonhüllen im Bullauge nicht nur punktweise verformen, sondern vor dem Warp sinnvoll ausrichten. Änderungen: - `src/ui/Stage.js`: `applyTakeOneBullaugeScreenWarp` erweitert. - Neue Vorstufe `alignHullBeforeWarp`: passende Hüllenseite wird zur Mutterrichtung ausgerichtet. - Root-/freie Knoten orientieren sich radial zur Bildschirmmitte. - Danach läuft der vorhandene Polygonpunkt-Warp aus v4.0.649 weiter. - Fadenanker werden wieder auf die gewarpte Hüllenseite projiziert. - Kreis-/Knotengrößen bleiben gedämpft, damit die Bullauge-Wirkung primär in den Beziehungshüllen sitzt. Testfokus: 1. Bullauge-Ansicht öffnen. 2. Quadrat, Dreieck und Hexagon in die Bildschirmmitte ziehen. 3. Hüllen müssen sichtbar arbeiten und sich geordneter zur Mutter/Fadenrichtung ausrichten. 4. Printansicht gegenprüfen: Ansichtenbutton darf weiter weich wechseln. 5. Keine Render-Errors. Bekannter Prüfpunkt: Wenn Hüllen noch zu wenig ausrichten, den Begrenzungswinkel in `alignHullBeforeWarp` von ±60° auf ±90° erhöhen.


## HANDOFF v4.0.652 — Hull orientation + Kompass fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.652.md

# HANDOFF v4.0.652 — Hull orientation + Kompass fix Geändert: - Kompass-Validator auf reale 9er-Kompassvorlage synchronisiert. Der alte 8er-Validator konnte rekursive Neuerzeugung/Renderfehler auslösen. - Sichtbare Polygonhüllen im Bullauge werden im Renderlayer nicht mehr neu aus Standardankern gebaut, sondern aus den in Stage bereits ausgerichteten und punktweise gewarpten Hüllenpunkten gezeichnet. - Hüllenausrichtung nicht mehr auf 60° geklemmt: die Mutterseite wird vollständig zur Mutter-/Zentrumsrichtung gedreht, danach erst Bullauge-Warp. - Sichtbare Mapvorlagen werden beim Antippen frisch ersetzt, damit alte AsyncStorage-Vorlagen nicht gegen neue Geometrie laufen. Test: 1. Kompass öffnen: kein Renderfehler, 9 Richtungen sichtbar. 2. Bullauge: Dreieck/Quadrat/Hexagon in die Mitte ziehen; Polygonhülle muss sichtbar ausgerichtet sein. 3. Printansicht: Umschalter bleibt weich, Printbutton bleibt Export.


## ITMO v4.0.653 – Kompass recursion fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.653.md

# ITMO v4.0.653 – Kompass recursion fix ## Status Built from v4.0.652. ## Changes - Fixed Kompass maximum call stack error. - Expanded strict Kompass direction validation to match the current 9-direction template: N, NNO, NO, ONO, O, OSO, SO, SSO, S. - Added a recursion guard in normalizeMap so a freshly generated clean Kompass template cannot call createKompassTemplate repeatedly. - Kept the v4.0.652 hull-orientation/template-refresh work unchanged. ## Test checklist 1. Open Kompass template. 2. Confirm no maximum call stack error. 3. Switch Bullauge/Printansicht with the footer Ansichten button. 4. Check triangle, square, pentagon, hexagon hull orientation.


## ITMO v4.0.655 – Background & Thread Color Polish
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.655.md

# ITMO v4.0.655 – Background & Thread Color Polish ## Ziel Zarter Finish-Pass auf Basis v4.0.654, ohne die stabile Bullauge-/Print-Architektur umzubauen. ## Änderungen - Bühnenhintergrund auf Schwarz gesetzt. - Koordinatenraster als farbige Punkte mit ca. 50%-Deckkraft ergänzt. - Rasterpunkte übernehmen die Farbe des nächstliegenden sichtbaren Knotens; Fokusnähe mischt die dominante Fokusfarbe ein. - Fäden bekommen Farbverlauf: Mutterfarbe → Mischfarbe → Kindfarbe. - Dreieck-Hüllen minimal größer, Viereck-Hüllen minimal kleiner, Fünfeck minimal beruhigt. - Wurzel-/lose Polygonhüllen drehen beim Bewegen nicht mehr auffällig zur Bildschirmmitte nach; sie behalten stabilere Grundrotation. - Bullauge-Punktwarp bleibt aktiv. ## Bewusst nicht gemacht - Keine große Liquid-Blob-Verformung. - Keine neue Layoutlogik. - Keine Änderung an Template-Struktur oder Importformat. ## Test 1. Kompass öffnen: kein Crash, farbiger Hintergrund, Fäden mit Übergangsfarben. 2. Gefühle öffnen: lange Labels und Fadenfarben prüfen. 3. Anatomie öffnen: schwarze Bühne, Raster, Hüllengrößen, Rotation beim Verschieben. 4. Bullauge/Printansicht umschalten: Architektur muss stabil bleiben. ## Bewertung Dieser Stand ist ein vorsichtiger visueller Finish-Pass. Bei Fehlern zuerst StageRenderLayers.js prüfen: StageCenterCoordinateLayer und FamilyTetherLayer.


## ITMO v4.0.660 – triangle hull freeze fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.660.md

# ITMO v4.0.660 – triangle hull freeze fix Stand: direkter Nachfolger von v4.0.659. Ziel - Restfehler der 3er-Hüllen beseitigen. - Keine alte pointWarp-/Tangenten-Dreieckslogik mehr bei 3 Verbindungen. - Dreieck bleibt kompakt, ruhig und ohne Haifischflossen/Sternzacken. Änderung - `src/ui/StageRenderLayers.js` - Neue Funktion `compactFrozenTriangleHullPoints`. - `applyCircleAnchorHull` nutzt bei `sides === 3` immer diese eingefrorene kompakte Dreieckshülle. - Prewarped `shape.points` werden für Dreiecke bewusst ignoriert, damit alte Bullauge-Pointwarp-Reste keine Spitzen erzeugen. Bewusst nicht angefasst - Bullauge-Logik. - Printansicht. - Fadenlängen. - Ordnersystem. - Intro/Logo. Test - Sonne mit 3 Kindern neu erzeugen. - Kind mit genau 2 eigenen Kindern prüfen: ergibt 3 Verbindungen und muss ein ruhiges Dreieck zeigen. - Keine Stern-/Flossenform mehr.


## HANDOFF v4.0.663 - hull fresh pipeline fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.663.md

# HANDOFF v4.0.663 - hull fresh pipeline fix Ziel: Restfehler beseitigen, bei denen alte Hull-Vertices/Pointwarp-Pfade nach Aenderung der Verbindungszahl sichtbar bleiben. Geaendert: - `src/ui/StageRenderLayers.js` - `applyCircleAnchorHull()` baut Polygonhuellen jetzt immer frisch aus aktueller Seitenzahl. - `shape.points` und `bullaugeWarp.pointWarp` werden im Renderpfad nicht mehr als Hull-Quelle genutzt. - Dreieck bleibt separat kontrolliert ueber `compactFrozenTriangleHullPoints`, aber ohne Warp. Test: 1. Neue Map mit 3 Verbindungen. 2. Kind mit 2 Kindern erzeugen. 3. Danach 4 und 5 Verbindungen testen. 4. Es duerfen keine Dreiecksreste, Quadrat-Mischformen oder abgeschnittene Kompasskanten sichtbar sein.


## HANDOFF v4.0.664 - foreground circle hull restore
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.664.md

# HANDOFF v4.0.664 - foreground circle hull restore Ziel: Die fixierte Regel Kreis-vor-Huelle wieder herstellen, ohne die frische v4.0.663-Hull-Pipeline zurueckzubauen. Geaendert: - `src/ui/StageRenderLayers.js` - Vordergrundkreis wird wieder bei allen Knoten gerendert, auch bei 3er-Huellen. - Kreisradius im Renderlayer nutzt wieder den aktuellen Glyph-Radius, damit Bullauge-Skalierung und Huelle synchron bleiben. - 3er-Huelle wird als echtes Tangenten-Dreieck um den Kreis erzeugt. Die Dreiecksspitze bleibt bei Kindern von der Mutter weg ausgerichtet. - `shape.points`, alte Pointwarp-Vertices und alte Dreiecksreste bleiben weiterhin aus dem Render-Hull-Pfad ausgeschlossen. Test: 1. Neue Map mit exakt 3 Verbindungen erzeugen. 2. Kind mit Mutter plus 2 Kindern erzeugen. 3. Beim Ziehen muss der Kreis als Vordergrundkoerper erhalten bleiben. 4. Die 3er-Huelle darf nicht als alter Stern/Flosse erscheinen, sondern als klare Huelle hinter dem Kreis. 5. Danach 4 und 5 Verbindungen testen: keine Geisterformen aus vorherigen Seitenzahlen.


## HANDOFF v4.0.665
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.665.md

# HANDOFF v4.0.665 Ziel: sichtbaren Kreis als Vordergrundkoerper wieder klar erzwingen. Aenderungen: - Render-Regel korrigiert: 0, 1 und 2 echte Anschluesse erzeugen keine Huelle mehr, sondern bleiben reine Kreise. - Quadrat-Fallback fuer Root mit einem Kind entfernt. - Huelle beginnt erst ab 3 echten Verbindungen. - Huelle wird als gedimmter Hintergrundkoerper gezeichnet, damit der Kreis optisch vorn bleibt und nicht wieder zur Polygon-Silhouette verschmilzt. - Dreieck/Fuenfeck/Sechseck bleiben frisch aus aktueller Anschlusszahl berechnet. Testfokus: 1. Root mit einem Kind: Root muss Kreis sein, kein Quadrat. 2. Knoten mit Parent + 1 Kind: Kreis, kein Quadrat. 3. Knoten mit Parent + 2 Kindern: Kreis sichtbar, Dreieck nur als Huelle dahinter. 4. Knoten mit Parent + 4 Kindern: Kreis sichtbar, Fuenfeck nur als Huelle dahinter.


## ITMO v4.0.667 – quiet hull family circles
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.667.md

# ITMO v4.0.667 – quiet hull family circles Basis: v4.0.666_circle_thread_anchor_restore. Änderung: - Hüllenfüllung deutlich reduziert, damit Polygonhülle nicht mehr als eigentlicher Körper wirkt. - Hüllenradius kompakter: Dreieck/Fünfeck/Sechseck liegen als Rückwand enger hinter dem Kreis. - Familienkreise visuell beruhigt: weniger Kreise, dünnere Striche, niedrigere Deckkraft, Blattkreise schwächer. - Kreis bleibt Vordergrundkörper, Fadenanker bleiben auf dem sichtbaren Kreisrand. Test: 1. 3 Anschlüsse: Dreieck muss erkennbar, aber nicht dominierend sein. 2. 5/6 Anschlüsse: Hülle darf nicht größer wirken als der Knoten selbst. 3. Große importierte Map: Familienkreise dürfen nicht die ganze Bühne optisch überlagern. 4. Fäden müssen weiter vom Kreisrand starten/enden.


## HANDOFF v4.0.668-relative-thread-field
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.668.md

# HANDOFF v4.0.668-relative-thread-field Basis: v4.0.667_quiet_hull_family_circles. Ziel dieses Schritts: - Verwandtschafts-/Übereinstimmungsfäden sichtbar machen. - Je mehr Übereinstimmung, desto dicker der Zusatzfaden. - Fadenfarbverläufe in echter Start-Ziel-Richtung. - Familienverbände als reine Polygonflächen, ohne zusätzliche Kreise. Geändert: - `src/ui/StageRenderLayers.js` - Neuer Layer `DirectFamilyPolygonBackdropLayer`. - Neuer Layer `KinshipResonanceThreadLayer`. - Eltern-Kind-Fäden nutzen relationWeight stärker für Fadendicke. - Gradients der Fäden laufen mit `gradientUnits="userSpaceOnUse"` von Anker A zu Anker B. Regeln: - Kreis bleibt Vordergrundkörper. - Hülle bleibt Hintergrundzeichen der Anschlusszahl. - Zusatz-Verwandtschaftsfäden sind keine Baumkanten und dürfen keine Eltern-Kind-Fäden ersetzen. - Zusatzfäden sind pro Knoten limitiert, damit Genogramm/Importe nicht überflutet werden. - Familienpolygon: nur direkte Kinderpunkte, 3 bis 16 Kinder, keine zusätzlichen Kreise. Offen für nächsten Schritt: - Testen, ob Zusatzfäden bei großen Genogramm-Maps zu dicht werden. - Falls zu laut: Score-Schwelle erhöhen oder maxLinks reduzieren. - Intro/Vorlagenbutton-Hintergründe können später aus denselben Familienpolygon-/Fadenregeln als statische Miniaturen abgeleitet werden.


## HANDOFF v4.0.672 - ZIP-Konsistenz und Preflight-Quelle
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/HANDOFF_v4.0.672.md

# HANDOFF v4.0.672 - ZIP-Konsistenz und Preflight-Quelle Ausgang: Die hochgeladene ZIP `fxchs-grematik-de(12).zip` enthielt die App-Arbeitskopie v4.0.671. Der Quellbaum war lesbar, aber `npm run preflight` brach ohne `node_modules` und wegen der alten Prüfregel `visible app name contains the release version` ab. Änderung: - Version auf 4.0.672 gehoben. - `package.json` und `app.json` synchronisiert. - iOS `buildNumber` und Android `versionCode` auf 672 gesetzt. - Sichtbarer App-Name bleibt `GREMATIK`. - Preflight-Regel korrigiert: `GREMATIK` ist als stabiler sichtbarer Name erlaubt. - Fehlende lokale Expo-Abhängigkeiten sind im Preflight nur noch Warnung; der EAS/TestFlight-Build bleibt durch `scripts/ensure-deps.mjs` geschützt. Test: - `node scripts/preflight.mjs` muss im Quellordner ohne `node_modules` mit Warnungen, aber ohne FAIL enden. - Vor echtem TestFlight: `npm install`, dann `npm run preflight`, dann `npx expo-doctor`, dann Build. Offen: - Kein echter Expo-/EAS-Cloud-Build wurde in diesem Chat ausgeführt. - Keine UI-Screenshotprüfung durchgeführt.


## NEXT_CHAT_PROMPT v4.0.672
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/NEXT_CHAT_PROMPT_AKTUELL.md

# NEXT_CHAT_PROMPT v4.0.672 Weiter mit v4.0.673 auf Basis von `fxchs-grematik-de-013.zip`. Priorität: 1. Quelle lokal öffnen und `npm install` ausführen. 2. `npm run preflight` und `npx expo-doctor` prüfen. 3. Danach erst TestFlight-Build vorbereiten. 4. Visuellen Kern prüfen: Intro-Skip, GREMATIK-Erstbesuch, Start, Bühne, Fokusraum, Import. 5. Keine Rückkehr zu sichtbarem Versionsnamen in der App; sichtbarer Name bleibt `GREMATIK`.


## NEXT_CHAT_PROMPT v4.0.664
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/NEXT_CHAT_PROMPT_v4.0.664.md

# NEXT_CHAT_PROMPT v4.0.664 Weiter mit v4.0.665 auf Basis von `ITMO_v4.0.664_foreground_circle_hull_restore.zip`. Prioritaet: 1. Screenshots gegen die Kreis-vor-Huelle-Regel pruefen. 2. Falls Kreis/Huelle jetzt stabil sind: Fadenanker an 3er/4er-Huellen feinkalibrieren. 3. Falls Dreieck zu gross wirkt: nur Tangentenradius feinjustieren, nicht wieder den Vordergrundkreis entfernen. 4. Keine Rueckkehr zu shape.points als Render-Hull-Quelle.


## NEXT_CHAT_PROMPT v4.0.672
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/NEXT_CHAT_PROMPT_v4.0.672.md

# NEXT_CHAT_PROMPT v4.0.672 Weiter mit v4.0.673 auf Basis von `fxchs-grematik-de-013.zip`. Priorität: 1. Quelle lokal öffnen und `npm install` ausführen. 2. `npm run preflight` und `npx expo-doctor` prüfen. 3. Danach erst TestFlight-Build vorbereiten. 4. Visuellen Kern prüfen: Intro-Skip, GREMATIK-Erstbesuch, Start, Bühne, Fokusraum, Import. 5. Keine Rückkehr zu sichtbarem Versionsnamen in der App; sichtbarer Name bleibt `GREMATIK`.


## GREMATIK v4.0.672 Erstdurchlauf
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/README.md

# GREMATIK v4.0.672 Erstdurchlauf Dies ist die im Autor-Erstdurchlauf angepasste, lauffähige App-Arbeitskopie. Der technische Kern bleibt Expo SDK 54 und verwendet weiterhin den ITMO-Import-/Exportkern, aber der sichtbare App-Name ist auf GREMATIK gezogen. ## Start lokal ```bash npm run preflight npm install npm run go ``` Für TestFlight bleibt der vorhandene Pfad bestehen: ```bash npm run preflight npm install npx expo-doctor npm run build:ios:testflight npm run submit:ios:testflight ``` ## Korrigiert in diesem Paket - `package.json` und `app.json` stehen beide auf 4.0.672. - Expo SDK bleibt hart bei 54. - sichtbarer App-Name: GREMATIK. - technische Importspur ITMO bleibt erhalten, damit vorhandene TXT-/Map-Formate nicht brechen. - keine `node_modules` enthalten; `npm run preflight` prüft die Quelle, `npm install` stellt die lokalen Abhängigkeiten für Expo/EAS her. ## Alter README-Stand # ITMO v4.0.551 Release Candidate Cleanup SDK 54 bleibt fest. Dieser Stand ist als ruhiger Releasekandidat-Putzstand gedacht: Start, Vorlagen, Bühne, Fokusraum, Import, AI-Prompt, Intro-Shell, Icon-Shell und TestFlight-Metadaten sind zusammengeführt. ## Kernstand - Start mit reduzierten Vorlagen: Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. - Import bleibt neben `Thematik suchen`. - AI läuft über die AI-Vorlage. - Systemvorlagen können einmal als eigenes Thema kopiert werden. - Bühne nutzt gleich große Polygone als Dekohüllen um Kreise. - Bullauge-, Familienkreis- und Randfadenlogik sind stabilisiert. - Skipbares Intro und vorläufiges App-Icon/Splash sind vorhanden. - Ton und VR sind geparkt und nicht sichtbarer Release-Kern. ## Lokaler TestFlight-Pfad ```powershell npm run preflight npm install npx expo-doctor npm run build:ios:testflight npm run submit:ios:testflight ``` ## Wichtig Vor TestFlight am Gerät prüfen: Intro-Skip, Start/Vorlagen, Import, AI-Prompt, Kompass, Anatomie/Gefühle/Bedürfnisse-Copy, Bühne, Fokusraum, Foto/Insta/Print.


## Releasekandidat-Status v4.0.551
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/RELEASE_CANDIDATE_STATUS_v4.0.550.md

# Releasekandidat-Status v4.0.551 Aktueller Kern: vollständig genug für einen Gerätetest als Releasekandidat. ## Kern drin Start, Vorlagen, Bibliothek, Bühne, Fokusraum, Import, AI-Prompt, Promptimport über Importpfad, Foto, Insta, Print, Systemvorlagen-Copy, Intro-Shell, App-Icon-Shell. ## Geparkt Ton/Sound, VR, semantische Inhaltsverbindungen auf Fäden, finale Bildwelt. ## Nächster fachlicher Ausbau nach Releasekandidat Inhaltsverbindungen auf Fäden: gemeinsame Wörter, Gewichtungen, semantische Nähe und kurze Linienbeschriftung. Das sollte als v4.1-Etappe kommen, nicht mehr in den Release-Putz.


## Testcheckliste v4.0.551
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.550.md

# Testcheckliste v4.0.551 ## Start - App frisch öffnen: Intro erscheint, wenn nicht bereits geskippt. - Skip oder letzte Introkarte führt sauber auf Start. - Start zeigt kein Footer-UI. - Suche heißt `Thematik suchen`. - Import liegt neben der Suche. - Vorlagen sichtbar: Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. - Unten sichtbar: Statistik, Impressum/Datenschutz/Quellen, Liste löschen. ## Vorlagen - Neu öffnet sofort eine leere Bühne. - AI öffnet den Promptworkflow. - Kompass/Anatomie/Gefühle/Bedürfnisse öffnen als Systemvorlagen und erscheinen nicht automatisch als normale Map. - Copy bei Systemvorlagen erzeugt genau ein editierbares Duplikat. - Erneutes Kopieren zeigt `Ein Duplikat sollte genügen`. ## Bühne - Polygone wirken gleich groß; Form ist nur Dekohülle. - Bullauge skaliert nahe Mitte weich. - Familienkreise schweben nicht losgelöst. - Keine langen Außenfäden quer durch die Bühne. - Langtipp zentriert den sichtbaren Knoten nahe Bildschirmmitte. - Querformat zeigt pure Bühne ohne Suche und Footer. ## Fokusraum - Unten wird nichts vom Footer verdeckt. - Thementitel kommt vom Urmuttertitel. - Textblöcke, Skalen, Wiki, Farbe und Löschen bleiben nutzbar. ## Export - Foto funktioniert. - Insta funktioniert. - Print/PDF funktioniert mindestens ohne Absturz. ## TestFlight lokal ```powershell npm install npm run preflight npx expo-doctor npm run build:ios:testflight npm run submit:ios:testflight ```


## TEST_CHECKLIST v4.0.551
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.551.md

# TEST_CHECKLIST v4.0.551 ## Renderfehler - App starten. - Bühne öffnen. - Neues Thema öffnen. - Anatomie öffnen. - Große Promptmap öffnen. - Bühne in Randbereiche verschieben. - Erwartung: Kein Fehler `Property 'view' doesn't exist`. ## Intro - Bei frischer Installation erscheint das Intro. - Skip/Start führt zur Startseite. - Das Intro nutzt weiterhin Platzhaltergrafik aus Bordmitteln und kann später durch finale Bilder ersetzt werden. ## Regression - Import bleibt neben Suche. - AI läuft über Vorlage. - Vorlagen bleiben: Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. - Systemvorlagen erscheinen nicht als normale Map-Zeilen, Kopien schon.


## Testcheckliste v4.0.552
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.552.md

# Testcheckliste v4.0.552 1. App starten. 2. AI-Vorlage öffnen. 3. Prüfen: kein `AI`-Kicker, kein `Übernehmen`, keine Vorschau, kein Zielhilfstext. 4. Thema eingeben, Tiefe wählen, `Prompt kopieren` testen. 5. ChatGPT-Antwort kopieren, `Prompt importieren` testen. 6. `Beenden` unten mittig testen. 7. Neues Thema öffnen. 8. Vier Kinder erzeugen und prüfen: rechts, links, oben, unten. 9. Familienkreis prüfen: gleiche Blattkinder sollen mit ihren Mittelpunkten auf dem Familienkreis liegen. 10. Fäden prüfen: Anker sitzen an der zur Mutter zeigenden Seite. 11. Header prüfen: `ITM` ohne Glow, Unterzeile ohne Glow, nur `O` blinkt langsam.


## Testcheckliste v4.0.553
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.553.md

# Testcheckliste v4.0.553 1. AI-Vorlage öffnen. 2. Prüfen: Im Promptfenster erscheinen Tiefe und darunter „Erste Richtung“ mit vier Iconbuttons. 3. Rechts auswählen, Prompt kopieren, Antwort importieren. Erste Hauptachse soll rechts beginnen. 4. Links/oben/unten jeweils mit kleinem Testthema wiederholen. 5. Prüfen, dass `Prompt importieren` weiter funktioniert. 6. Neues Thema manuell öffnen und Geburten prüfen, damit die normale Bühnengeburt nicht beschädigt wurde.


## Testcheckliste v4.0.554
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.554.md

# Testcheckliste v4.0.554 ## AI-Promptfenster - Keine Überschrift „Thema erzeugen“. - Placeholder: „Prompt für welche Thematik?“ - Eingabefeld fokussieren: Text ist überschreibbar, Fokus grau. - Tiefe und erste Richtung bleiben wählbar. - Prompt kopieren erzeugt nummeriertes Format. - Prompt importieren übernimmt ChatGPT-Antwort. ## Importformat - Antwort beginnt mit `Thema:` und `Suchbegriff:`. - Erstes Kapitel entspricht dem Suchbegriff: `1. Thema`. - Unterkapitel laufen als `1.1`, `1.1.1` usw. - Metadatenzeile nach Fließtext wird gelesen. ## Exportformat - Exportdatei ist für Menschen lesbar. - Thema-Zeile ist kein Kapitel. - Suchbegriff ist separat sichtbar. - Richtung/Symbol/Farbe stehen nach dem jeweiligen Fließtext.


## Testcheckliste v4.0.555
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.555.md

# Testcheckliste v4.0.555 ## Pflichtprüfung Bühne - Neues Thema öffnen. - Vier Kinder erzeugen. - Erwartung: rechts, links, oben, unten; Blattkind-Mittelpunkte liegen sichtbar auf dem Familienkreis. ## Kind mit eigener Familie - An einem Kind ein Kind erzeugen. - Erwartung: Faden zur Mutter wird länger; dieses Kind kann über den Mutter-Familienkreis hinauswachsen. - Erwartung: Es klappt nicht zur Bühnenmitte zurück. ## Promptmap - AI-Vorlage öffnen. - Thema „Sonne“ oder „Kontrollieren“ importieren. - Erwartung: nur Root-Hauptachsen folgen der gewählten ersten Richtung. - Erwartung: tiefere Kinder verteilen sich lokal um ihre Mutter. - Erwartung: keine dominanten langen Kreuzfäden durch die Bühne. ## Regression - Kompass öffnen: Richtungskalibrierung bleibt sichtbar. - Anatomie öffnen: räumliche Vorlage bleibt erhalten.


## Test v4.0.556
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.556.md

# Test v4.0.556 1. Neues Thema öffnen. 2. Vier Kinder erzeugen: rechts, links, oben, unten prüfen. 3. An einem Kind ein Kind erzeugen: Enkel muss aus dem Kind heraus wachsen, nicht Richtung Urmutter. 4. Sichtprüfung: Jeder Knoten muss als Kreis sichtbar sein. Polygon ist nur Hülle. 5. Familienkreis: Bei Blattkindern müssen die Kindmittelpunkte auf dem Familienkreis liegen. 6. Eltern mit gemischten Kindern prüfen: Der Familienkreis orientiert sich am direkten Kind mit den wenigsten Kindern, Unterfamilien wachsen heraus. 7. AI-Map Sonne neu importieren, alte Map nicht bewerten.


## Testcheckliste v4.0.557
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.557.md

# Testcheckliste v4.0.557 - [ ] Neues Thema startet ohne Renderfehler. - [ ] Kind 1 liegt rechts der Urmutter. - [ ] Kind 2 liegt links der Urmutter. - [ ] Kind 3 liegt oben. - [ ] Kind 4 liegt unten. - [ ] Weitere Kinder gehen in Diagonalen, nicht chaotisch zurück. - [ ] Kind eines Kindes wächst aus dessen Außenseite heraus. - [ ] Enkel werden nicht zur Urmutter gezogen. - [ ] Familienkreis liegt auf Muttermitte und direkter Kindmitte. - [ ] Polygon ist nur Hülle, Kreis bleibt sichtbarer Körper. - [ ] Sonne neu importieren und prüfen, nicht alte Map bewerten.


## Testcheckliste v4.0.558
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.558.md

# Testcheckliste v4.0.558 - [ ] Neues Thema öffnen. - [ ] Ein Kind erzeugen: Kreis sichtbar, Polygonhülle dahinter. - [ ] Drei Kinder erzeugen: Mutterhülle dreieckig, Mutterkreis nicht kleiner als Kinder. - [ ] Vier Kinder erzeugen: Mutterhülle viereckig, Kreis bleibt gleich groß. - [ ] Kind mit eigenen Kindern erzeugen: Enkel wachsen vom Kind weg, nicht zur Urmutter zurück. - [ ] Familienkreis prüfen: Kreis bleibt an Mutter/Kindfamilie gebunden, kein freies Wegschwimmen. - [ ] Bühne schieben: Nähe zur Bildschirmmitte skaliert weich größer; außen normal. - [ ] AI-Import Sonne neu importieren und auf lange Kreuzfäden prüfen.


## Testcheckliste v4.0.559
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.559.md

# Testcheckliste v4.0.559 1. App starten. 2. Bühne öffnen. 3. Neues Thema öffnen. 4. Drei Kinder erzeugen. 5. Prüfen: kein `hullStrokeForShape`-Renderfehler. 6. Prüfen: Kreis vorne, Polygonhülle dahinter.


## Testcheckliste v4.0.560
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.560.md

# Testcheckliste v4.0.560 - App startet ohne Renderfehler. - Neues Thema: Urmutter und Kinder haben gleich große Kreislinie. - Kreislinie liegt sichtbar vor der gefüllten Polygonhülle. - 3 Kinder: Dreieckshülle und dreieckige Geburtenverteilung. - 4 Kinder: Viereckshülle und Viertelverteilung. - Kind mit eigenen Kindern: Enkel wachsen lokal aus dem Kind, nicht zur Oma zurück. - Kompass: alle 16 Richtungen sichtbar, Pfeile rundum ausgerichtet. - AI-Promptmap neu importieren, nicht alte Map bewerten.


## Testcheckliste v4.0.561
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.561.md

# Testcheckliste v4.0.561 1. Neues Thema öffnen: Urmutter muss beim ersten Öffnen mittig stehen. 2. Ein Kind erzeugen: erstes Kind muss in gewählter erster Richtung entstehen. 3. Zweites Kind: Gegenseite. 4. Drittes Kind: echte Dreiecksverteilung, nicht links/rechts/unten-Restlogik. 5. Viertes Kind: vier Seiten um den Kreis. 6. Kind ohne Kinder: Familienkreis entspricht Kreisgröße. 7. Kind mit Kindern: Enkel wachsen aus dem Kind heraus, Hülle zur Mutterseite ausgerichtet. 8. Kompass öffnen: 16 Richtungen und Pfeile prüfen.


## Test v4.0.562
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.562.md

# Test v4.0.562 1. Neue Map öffnen: Urmutter muss mittig stehen. 2. Drei Kinder erzeugen: Mutterhülle dreieckig, Kreis vorne, Kinder an drei sauberen Seiten. 3. Vier Kinder erzeugen: Vierseitenverteilung, Kreisradius überall gleich. 4. Kind ohne Kinder prüfen: eigener Familienkreis entspricht Kreisgröße. 5. Kind mit eigenen Kindern: Hülle zur Mutterseite ausgerichtet, Enkel wachsen außen. 6. Kompass öffnen: 16 Richtungen und Pfeile prüfen.


## Test v4.0.563
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.563.md

# Test v4.0.563 1. Neue Map öffnen. 2. 3–4 Kinder erzeugen und Zentrum prüfen. 3. Ein Kind mit mehreren Kindern erzeugen. 4. Bühne zur Seite schieben. 5. Prüfen: Randfamilien ziehen sichtbar dichter an die Mutter und erzeugen weniger lange Außenfäden. 6. Prüfen: Zentrum bleibt offen und nicht eingerollt. 7. Kompass öffnen und sicherstellen, dass 16 Richtungen sichtbar bleiben.


## Testcheckliste v4.0.564
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.564.md

# Testcheckliste v4.0.564 1. App frisch starten: Intro erscheint mit Bildkarten, Weiter und Überspringen funktionieren. 2. Neue Map öffnen: Root ist zentriert. 3. 3 Kinder erzeugen: dreieckige Hülle hinter Kreis prüfen. 4. 4 Kinder erzeugen: vierseitige Hülle, Kreis vorne gleich groß. 5. Kind mit Kindern erzeugen: Enkel wachsen aus dem Kind heraus. 6. Große Map an Rand schieben: Randfamilien rollen kompakter ein. 7. Kompass öffnen: 16 Pfeile kleiner und richtungsbezogen.


## Test v4.0.565
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.565.md

# Test v4.0.565 - [ ] App startet ohne Renderfehler. - [ ] Neuer Knoten zeigt Kreis vorne als Linie. - [ ] Polygonhülle liegt sichtbar hinter und um den Kreis, nicht im Kreis. - [ ] Drei Kinder: Mutterhülle dreieckig um den Kreis. - [ ] Vier Kinder: Mutterhülle viereckig um den Kreis. - [ ] Familienkreis für Mutter und Unterfamilien sichtbar, gestrichelt und ruhig. - [ ] Kinderlose Kinder haben kreisgroßen Familienkreis. - [ ] Kompasspfeile bleiben ausgerichtet.


## Test v4.0.566
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.566.md

# Test v4.0.566 - Intro erscheint beim Start und ist skipbar. - Bühne zeigt Mittelpunkt-Achsen. - Neue Map öffnet mit Urmutter exakt auf Bildschirmmitte. - Kreis ist vorne reine Linie. - Hülle liegt knapp dahinter um den Kreis. - Drei Kinder: Root-Hülle dreieckig. - Vier Kinder: Root-Hülle viereckig. - Kind ohne Kinder: runde Hülle, kein Riesenpolygon.


## Test v4.0.567
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.567.md

# Test v4.0.567 - [ ] Intro erscheint beim App-Start. - [ ] Überspringen schließt Intro. - [ ] Starten auf letzter Karte schließt Intro. - [ ] App-Neustart zeigt Intro erneut. - [ ] Bühne danach bedienbar. - [ ] Keine Regression bei neuer Map.


## Testcheckliste v4.0.568
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.568.md

# Testcheckliste v4.0.568 1. App starten, Intro überspringen. 2. Neue Map öffnen: Urmutter exakt auf Bildschirmmitte/Koordinatenkreuz. 3. Drei Kinder erzeugen: Hülle sitzt knapp um Kreis, Kreis vorne klar. 4. Ein Kind mit mehreren Kindern erzeugen. 5. Bühne an Rand schieben: äußerste Kinder schließen zuerst zur Mutter, Eltern bleiben länger lesbar. 6. Kompass öffnen: 16 Richtungen, keine Randroll-Projektion.


## Test v4.0.569
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.569.md

# Test v4.0.569 1. App starten: Intro muss erscheinen und per Überspringen schließen. 2. Neue Map öffnen: Urmutter muss auf Koordinatenmitte liegen. 3. Drei Kinder erzeugen: Root-Hülle muss als Dreiecksring um den Kreis liegen, nicht im Kreis. 4. Vier Kinder erzeugen: Root-Hülle muss als Vierecksring um den Kreis liegen. 5. Kind mit zwei Kindern erzeugen: Kind-Hülle muss außen um den Kreis liegen. 6. Fäden prüfen: Fäden docken am Kreisrand an und springen nicht in die Polygonfüllung. 7. Rand schieben: Randfamilien rollen ein, ohne die Ringhüllen zu zerstören.


## Testcheckliste v4.0.570
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.570.md

# Testcheckliste v4.0.570 - [ ] Intro: Überspringen schließt Intro. - [ ] Intro: Starten schließt Intro. - [ ] Neue Map: Urmutter sitzt auf Bildschirmmitte. - [ ] 1 Anschluss: runde Hülle außen, Kreislinie vorne. - [ ] 2 Anschlüsse: runde Hülle außen, Kreislinie vorne. - [ ] 3 Anschlüsse: Dreieckshülle außen um Kreis. - [ ] 4 Anschlüsse: Viereckhülle außen um Kreis. - [ ] Kreis bleibt ohne Füllung und ohne Schatten. - [ ] Hüllenschatten liegt hinter der Hülle. - [ ] Familienkreise: gestrichelt und dünn. - [ ] Kompass öffnet ohne Pfeil-/Ringfehler.


## Test v4.0.571
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.571.md

# Test v4.0.571 1. Neue Map öffnen: Urmutter ohne Kinder zeigt nur Kreislinie, keine Hülle. 2. Ein Kind erzeugen: Urmutter zeigt Viereckhülle. 3. Zweites Kind erzeugen: Urmutter bleibt Viereckhülle. 4. Drittes Kind erzeugen: Urmutter zeigt Dreieckhülle. 5. Viertes Kind erzeugen: Urmutter zeigt Viereckhülle. 6. Fünftes Kind erzeugen: Urmutter zeigt Fünfeckhülle. 7. Bei einem Kind ein Kind erzeugen: Kind mit Elternverbindung + Kindverbindung zeigt Viereckhülle. 8. Hülle muss außen um Kreis liegen. Kreislinie bleibt vorne.


## TEST v4.0.572
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.572.md

# TEST v4.0.572 1. Open a new map. Root with no child: only circle line, no hull. 2. Add one child. Root must have square hull. Child must have no hull. 3. Add second child. Root remains square. Both leaf children have no hull. 4. Add third child. Root becomes triangle. Leaf children remain no-hull circles. 5. Add a child to one child. That child becomes a mother with square hull; its own leaf child remains no-hull circle.


## Test v4.0.573
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.573.md

# Test v4.0.573 1. Neue Map öffnen. 2. Root ohne Kind: nur Kreis-Hülle, keine dunkle Füllung im Kreis. 3. Ein Kind erzeugen: Mutter Viereckhülle, Kind Kreis-Hülle. 4. Zwei Kinder: Mutter Viereckhülle, Kinder Kreis-Hüllen. 5. Drei Kinder: Mutter Dreieckhülle, Kinder Kreis-Hüllen. 6. An einem Kind ein Kind erzeugen: dieses Kind bekommt Viereckhülle, sein Kind bleibt Kreis-Hülle.


## TEST_CHECKLIST v4.0.574
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.574.md

# TEST_CHECKLIST v4.0.574 1. Start app and open stage. 2. Confirm no stageBackgroundColor render error. 3. New map: root only circle. 4. Add 1 child: parent square hull, child circle special hull. 5. Add 3 children: parent triangle hull.


## Test checklist v4.0.576
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.576.md

# Test checklist v4.0.576 - No `stageBackgroundColor` render error. - Circle line visible in front. - No dark filled inner circle caused by hull rendering. - Leaf child does not become square because of parent connection. - Mother with one own child is square. - Mother with two own children is square. - Mother with three own children is triangle. - Family circles remain thin/dashed. - Intro can be skipped/started.


## TEST_CHECKLIST v4.0.577
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.577.md

# TEST_CHECKLIST v4.0.577 ## Pflichtprüfung Bühne - Start einer Map: Hintergrund bleibt schwarz, keine grüne Fläche, kein transparenter Wash. - Zentrum: Fokus liegt in der echten Bildschirmmitte, nicht oberhalb davon. - Bewegung: Keine Rand-Einrollung, keine Ausrollung, kein Swallow-/Cluster-Verschwinden. - Pinch bleibt ohne neue Funktion. ## Pflichtprüfung Hüllen - Kinderloser Knoten: Kreis-Sonderform beziehungsweise 16-Eck, kein Viereck nur wegen Elternverbindung. - Knoten mit 1 oder 2 eigenen Kindern: Viereck. - Knoten mit 3 eigenen Kindern: Dreieck. - Knoten mit 4 eigenen Kindern: Viereck. - Knoten mit 5 bis 16 eigenen Kindern: passendes n-Eck. - Vordergrundkreis bleibt gleich groß und innen schwarz, Hüllenfüllung darf den Innenkreis nicht abdunkeln. ## Pflichtprüfung Familienkreis - Familienkreis ist sichtbar, dünn und weiß. - Blattkinder zeigen eigenen kleinen Familienkreis. - Familienkreis hängt an der realen Familie und nicht an alter Randprojektion. ## Pflichtprüfung Fehlerfreiheit - Kein `stageBackgroundColor`-Fehler. - Kein `hullStrokeForShape`-Fehler. - Kein Syntaxfehler beim Start.


## TEST_CHECKLIST v4.0.578
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.578.md

# TEST_CHECKLIST v4.0.578 ## Pflichtprüfung Hüllen nach Verbindungen - Root ohne Kinder: Kreis-Sonderform beziehungsweise 16-Eck. - Root mit 1 oder 2 Kindern: Kreis-Sonderform beziehungsweise 16-Eck. - Root mit 3 Kindern: Dreieck. - Root mit 4 Kindern: Viereck. - Root mit 5 bis 16 Kindern: passendes n-Eck. - Blattkind mit Mutterverbindung: Kreis-Sonderform beziehungsweise 16-Eck, kein Viereck. - Kind mit Mutterverbindung und 1 eigenem Kind: 2 Verbindungen, Kreis-Sonderform beziehungsweise 16-Eck. - Kind mit Mutterverbindung und 2 eigenen Kindern: 3 Verbindungen, Dreieck. - Kind mit Mutterverbindung und 3 eigenen Kindern: 4 Verbindungen, Viereck. - Kind mit Mutterverbindung und 15 eigenen Kindern: 16 Verbindungen, 16-Eck. ## Pflichtprüfung gegen Regression - Vordergrundkreis bleibt gleich groß. - Hüllenfüllung dunkelt den Vordergrundkreis nicht ab. - Familienkreise bleiben sichtbar, dünn und weiß. - Bühne bleibt schwarz. - Keine Rand-Einrollung oder Swallow-/Cluster-Ausblendung. - Kein `stageBackgroundColor`-Fehler. - Kein `hullStrokeForShape`-Fehler.


## TEST CHECKLIST v4.0.579
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.579.md

# TEST CHECKLIST v4.0.579 - Neues Thema mit 3 Kindern: Root = Dreieck. - Blattkind ohne Kinder: Kreis-Hülle. - Kind mit genau 1 eigenem Kind: Quadrat. - Kind mit genau 2 eigenen Kindern: Dreieck. - Kind mit 15 eigenen Kindern und Mutterverbindung: 16-Eck. - Kreisinnenflächen nicht schwarz. - Kreis-Hülle sichtbar, geschlossen, ohne Strichelung.


## TEST CHECKLIST v4.0.580
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.580.md

# TEST CHECKLIST v4.0.580 - Fokus auf roten Knoten: Bühne bekommt roten/dunkelroten Hintergrundton. - Fokus auf grünen Knoten: Bühne bekommt grünen/dunkelgrünen Hintergrundton. - Keine rein schwarze StageCenterColorWash-Fläche. - Kreisinnenflächen farbig, nicht schwarz. - Blattkind: Kreis-Hülle. - Kind mit 1 eigenem Kind: Quadrat. - Kind mit 2 eigenen Kindern: Dreieck. - Kind mit 3 eigenen Kindern: Viereck. - Kind mit 15 eigenen Kindern: 16-Eck.


## TEST CHECKLIST v4.0.581
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.581.md

# TEST CHECKLIST v4.0.581 - Root 0 Kinder: Kreis. - Root 1 Kind: Viereck. - Root 2 Kinder: Viereck. - Root 3 Kinder: Dreieck. - Root 4 Kinder: Viereck. - Kind 0 Kinder: Kreis. - Kind 1 Kind: Viereck. - Kind 2 Kinder: Dreieck. - Kind 3 Kinder: Viereck. - Kind 15 Kinder: Sechzehneck.


## TEST CHECKLIST v4.0.582
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.582.md

# TEST CHECKLIST v4.0.582 - Vordergrundkreise ohne Füllung. - Suchleiste und Ergebnisfeld deutlich transparenter, weniger schwarz. - Hintergrundfarbe des Fokus bleibt sichtbar. - Formtabelle aus v4.0.581 unverändert.


## TEST CHECKLIST v4.0.583
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.583.md

# TEST CHECKLIST v4.0.583 - Root mit 5 Kindern: alle 5 Labels sichtbar. - Root/Kind-Linien starten passend zur Hüllenseite am Innenkreis. - Kein unbeschrifteter Direktknoten mehr sichtbar. - Hüllenregel weiterhin laut Tabelle.


## TEST CHECKLIST v4.0.584
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.584.md

# TEST CHECKLIST v4.0.584 - Bei Root mit 5 Kindern muss jedes Direktkind ein Label haben. - Fäden starten am passenden Innenkreis-Punkt der zugeordneten Hüllenseite. - Keine alten Winkelanker an falschen Ecken.


## TEST CHECKLIST v4.0.585
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.585.md

# TEST CHECKLIST v4.0.585 - Kreisinnenflächen leer, keine farbige Füllung. - Root mit 1 Kind: Faden vom unteren Innenkreisanker, nicht seitlich versetzt. - Root mit 3 Kindern: Innenanker links/rechts/unten passend zur Dreieckshülle. - Alle Direktkinder mit Label.


## TEST CHECKLIST v4.0.586
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.586.md

# TEST CHECKLIST v4.0.586 - Kreis-Hülle sichtbar mit Füllung. - Innenkreis überall nur weiße Kontur. - Root mit 1 Kind: Quadrat, Verbindung am passenden Rand. - Root mit 3 Kindern: Dreieck, drei Verbindungen je an Dreiecksseiten. - Kind mit 2 Kindern: Dreieck, untere Familie korrekt.


## TEST CHECKLIST v4.0.587
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.587.md

# TEST CHECKLIST v4.0.587 - Fäden starten/enden nur am weißen Vordergrundkreis. - Polygonhülle folgt Tangenten aus Kreisankern. - Keine Fäden mehr an Polygonseitenmitteln. - Root mit 1 Kind: Kind-Faden an Kreisrichtung, Hülle Quadrat. - Root mit 3 Kindern: drei Kreisanker, Dreieck aus Tangenten.


## TEST CHECKLIST v4.0.588
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.588.md

# TEST CHECKLIST v4.0.588 - Root mit 5 Verbindungen: regelmäßiges Fünfeck, nicht verzogen. - Root mit 3 Verbindungen: regelmäßiges Dreieck. - Kind mit 2 Kindern: regelmäßiges Dreieck. - Fäden ankern nur am Kreisrand. - Keine Ghost-/Bud-Reste oder fehlende Lückenlinien.


## TEST CHECKLIST v4.0.589
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.589.md

# TEST CHECKLIST v4.0.589 - Root mit 5 Kindern: regelmäßiges Fünfeck, keine alte schiefe Hülle. - Root mit 1/2 Kindern: Quadrat bleibt achsenstabil. - Root mit 3 Kindern: Dreieck bleibt regelmäßig. - Fäden nutzen nur Kreisanker.


## TEST CHECKLIST v4.0.590
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.590.md

# TEST CHECKLIST v4.0.590 - Blattkind: Faden endet am Kreisrand im Winkel zur Mutter, nicht fix oben. - Root mit 1 Kind: Root-Anker sitzt auf festem Quadratanker, Kind-Anker direkt zur Root. - Root mit 2/3/4/5 Kindern: Root-Anker bleiben feste Kreisanker der Form.


## TEST CHECKLIST v4.0.591
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.591.md

# TEST CHECKLIST v4.0.591 - Root mit 1 Kind: Faden von gespeichertem Mutter-Kreisanker zu Kind-Kreisanker. - Root mit 3/4/5 Kindern: Fäden benutzen die gleichen Kreisanker, die die Hülle orientieren. - Kein sichtbarer Wechsel durch alte nearest-regular-Logik.


## TEST CHECKLIST v4.0.594
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.594.md

# TEST CHECKLIST v4.0.594 1. Leere Map öffnen. 2. Root auf 4 Kinder erweitern. Erwartung: gleichmäßige 90°-Verteilung. 3. Root auf 5 Kinder erweitern. Erwartung: gleichmäßige 72°-Verteilung, keine Platzteilung. 4. Sichtprüfung: Polygonhülle entspricht der betroffenen Root/Node. 5. Sichtprüfung: innere weiße Kreise mit Familienkreis-Deckkraft.


## TEST CHECKLIST v4.0.595
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.595.md

# TEST CHECKLIST v4.0.595 1. Neue Map öffnen: Suchfeld zeigt „Thematik suchen“. 2. Root mit 5 Kindern prüfen: Pentagonstruktur bleibt stabil. 3. Ein Kind mit 2 weiteren Kindern anlegen: Dreieckshülle deckend, ohne Rahmen. 4. Sichtprüfung: keine weißen Dev-Kreise und keine Familienkreise. 5. Sichtprüfung: Fäden laufen bis an die Hüllenaußenkante und wirken voll deckend. 6. Hintergrund wirkt etwas heller als zuvor.


## TEST CHECKLIST v4.0.596
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.596.md

# TEST CHECKLIST v4.0.596 1. Root mit 5 Kindern: Fäden/Polygone 80 Prozent. 2. Familienkreise sichtbar. 3. Koordinatenachse nur schwach bei ca. 10 Prozent. 4. Suchfeld zeigt keinen +/- Regler. 5. In Suche tippen, dann Bühne antippen: Tastatur/Suche pausiert, kein Fokusraum. 6. Ruhephase beobachten: Hüllen bewegen nicht. 7. Randnahe Familien rollen wieder sichtbarer ein.


## TEST CHECKLIST v4.0.597
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.597.md

# TEST CHECKLIST v4.0.597 1. Neue leere Map öffnen. 2. Prüfen: Suchfeld zeigt zuerst `Thementitel eingeben`. 3. Ohne Titel auf Bühne tippen: kein Fokusraum öffnet. 4. Titel eingeben und bestätigen oder Feld verlassen. 5. Prüfen: Urmuttertitel = eingegebener Titel. 6. Prüfen: Feld zeigt danach `In der Thematik „Titel“ suchen`. 7. Zweite Map mit gleichem Titel erzeugen: Titel wird automatisch nummeriert.


## TEST CHECKLIST v4.0.598
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.598.md

# TEST CHECKLIST v4.0.598 1. Neues Thema öffnen: Titel-Feld soll vor Eingabe ruhig blinken. 2. Titel vergeben: Feld wird zur Suche innerhalb der Thematik. 3. Familie mit 4 Kindern an einem Kind anlegen: 2 links / 2 rechts um die lokale Auswärtsachse. 4. Familie mit 6 Kindern prüfen: 3 / 3. 5. Labels: Kinderlabels sollen früher sichtbar und ruhiger sein. 6. Familienkreise: Sichtbarkeit soll gemeinsam wirken, nicht hart einzeln flackern. 7. Weiterhin prüfen: Fäden/Anker am Polygonankerkreis.


## TEST_CHECKLIST v4.0.637
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.637.md

# TEST_CHECKLIST v4.0.637 - Clean entpacken, nicht über alten Ordner schreiben. - App starten. - Thema Ozean neu erzeugen. - 1 Kind: kein Innenring im Quadrat. - 2 Kinder: kein Innenring im Dreieck. - 3 Kinder: kein Innenring im Quadrat/Polygon. - 5 Kinder: kein Innenring im Fünfeck. - 16 Kinder: kein Innenring, Bühne springt nicht. - Suchleiste sichtbar lassen: keine Drift.


## TEST v4.0.641
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.641.md

# TEST v4.0.641 - [ ] Bühne springt nicht. - [ ] Bullauge: alle direkten Fäden gleich lang. - [ ] Bullauge: Kind mit Kindern bleibt am gleichen Radius wie Blattkind. - [ ] Bullauge: Überlappungen sind erlaubt, kein Wegziehen. - [ ] Print: Gesamtansicht bleibt entzerrt/hierarchisch. - [ ] Max 9 Verbindungen pro Knoten sichtbar eingehalten.


## TEST_CHECKLIST v4.0.664
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.664.md

# TEST_CHECKLIST v4.0.664 Pflichttest Buehne: - Root mit 3 Kindern: Kreis bleibt sichtbar als Vordergrundkoerper; Dreieck liegt nur dahinter. - Kind mit 2 eigenen Kindern: Dreiecksspitze zeigt von der Mutter weg. - Ziehen/Neuzentrieren: Dreieck rotiert nicht frei und springt nicht. - 4er/5er nach 3er: keine alten Dreieckreste. - Bullauge-Mitte: Kreis und Huelle skalieren gemeinsam, kein Auseinanderlaufen. Nicht angefasst: - Kein Pinch. - Keine Print-Distanzlogik. - Keine Import-/Promptlogik. - Keine SDK-Änderung; Expo SDK 54 bleibt.


## TEST CHECKLIST v4.0.665
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.665.md

# TEST CHECKLIST v4.0.665 - Neues Thema erstellen, ein Kind anlegen: Mutter und Kind muessen rund bleiben. - Beim zweiten Kind an einem Knoten: noch kein Quadrat. - Beim dritten echten Anschluss: Huelle darf erscheinen, Kreis muss aber klar Vordergrund bleiben. - Bei 5 echten Anschluessen: Fuenfeck darf sichtbar sein, aber nicht den Knotenkoerper ersetzen. - Fäden duerfen unter Kreis/Huelle nicht als Innenstreifen dominieren.


## Testcheckliste v4.0.667
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.667.md

# Testcheckliste v4.0.667 - Root mit 1 oder 2 Anschlüssen bleibt Kreis. - Knoten mit 3 Anschlüssen zeigt eine kleine gedimmte Dreieck-Hülle hinter dem Kreis. - Knoten mit 5 oder 6 Anschlüssen zeigt eine kleine gedimmte Polygon-Hülle hinter dem Kreis. - Fäden treffen sichtbar den Kreisrand, nicht die Hüllenkante. - Familienkreise sind nur Orientierung, nicht Hauptgrafik. - Genogramm/Importansicht bleibt lesbar, ohne weißes Kreisrauschen.


## TEST CHECKLIST v4.0.668
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.668.md

# TEST CHECKLIST v4.0.668 1. Kleine Muster-Map - Root mit drei Kindern bleibt Kreis plus dezente Dreieckhülle. - Eltern-Kind-Fäden kommen weiter vom Kreisrand. - Zwischen verwandten Kindern dürfen zarte Zusatzfäden entstehen. 2. Genogramm / große Map - Zusatzfäden dürfen sichtbar sein, aber die Bühne nicht zuspinnen. - Knoten mit gleicher Mutter oder gemeinsamer Großmutter sollten eher Zusatzverbindungen zeigen als entfernte Knoten. - Je stärker Übereinstimmung/Relation, desto dicker der Faden. 3. Farbverlauf - Faden startet farblich beim Startknoten und endet beim Zielknoten. - Verlauf darf nicht global falsch von links nach rechts laufen. 4. Familienpolygon - Familien mit 3 bis 16 sichtbaren Kindern zeigen eine zarte Polygonfläche aus Kinderpunkten. - Es entstehen keine zusätzlichen Kreise unter der Polygonfläche. - Bei 16 Kindern muss ein 16-Eck möglich sein. 5. Regression - 0/1/2 Anschlüsse bleiben reine Kreise. - Hüllen beginnen erst ab 3 Anschlüssen. - ZIP entpackt fehlerfrei.


## TEST_CHECKLIST v4.0.672
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/TEST_CHECKLIST_v4.0.672.md

# TEST_CHECKLIST v4.0.672 1. ZIP entpacken. 2. In `2-PROJEKTE/PROJEKT-app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs` wechseln. 3. `node scripts/preflight.mjs` ausführen. Erwartung: keine FAILs, nur Warnungen zu fehlenden node_modules. 4. `npm install` ausführen. 5. `npm run preflight` ausführen. Erwartung: keine FAILs und keine Dependency-Warnungen mehr. 6. `npm run go` starten und Start, Intro-Skip, Bibliothek, Bühne, Fokusraum und Import prüfen. 7. Für TestFlight zusätzlich `npx expo-doctor`, dann `npm run build:ios:testflight`.


## v4.0.578 - connection-count hull pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/VERSION_LOG.md

## v4.0.578 - connection-count hull pass - Hüllenecken werden nicht mehr nach eigenen Kindern berechnet, sondern nach realen Verbindungen. - Bei Nicht-Root-Knoten zählt die Mutterverbindung mit. - 0-2 Verbindungen bleiben Kreis-Sonderform/16-Eck; ab 3 gilt: 3 Dreieck, 4 Viereck, 5-16 n-Eck. - Kind mit Mutterverbindung und 15 eigenen Kindern ergibt 16 Verbindungen und dadurch 16-Eck. - Blattkind mit nur Mutterverbindung bleibt Kreis/16-Eck und wird nicht Viereck. - Keine Änderungen an schwarzer Bühne, Zentrum, Rand-Einrollung, Swallow-Filter, Innenkreis oder Ton. ## v4.0.566 - hull-as-ring center-axis - Intro is shown on every launch while keeping Skip/Weiter controls visible. - Stage coordinate crosshair added: screen-center axes and dot show the real zero/middle. - Root opening remains centered on absolute screen midpoint. - Polygon hull is now a tight outer ring around the circle; 0/1/2 connections stay round, 3+ become polygon hulls. - Circle foreground remains only a clean line; hull fill/shadow stays behind. ## v4.0.557 – circle-anchor birth geometry - Root births use exact circle vectors instead of polygon-side approximation. - Child births propagate a local growth vector so grandchildren do not pull back toward the grandparent. - Family circles are no longer render-shrunk by nearby foreign nodes. - Polygon sides remain decorative hulls; circle body and circle anchors drive geometry. ## v4.0.542 — Familienfarben, 16er-Palette, Pinch entfernt - Globale Palette auf 16 klare Regenbogenfarben reduziert und sortiert. - Promptmaps erhalten beim Import automatisch Familienfarben mit zufälligem Startindex. - Prompt erzeugt keine festen color-/symbol-Metadaten mehr; Familienfarben übernimmt ITMO. - Farbauswahl im Fokus-/Ankerpanel nutzt dieselbe 16er-Palette. - Pinch-Zoom auf der Bühne hart deaktiviert; Mehrfingerberührungen werden ignoriert. - Ton und VR als Parkmodule dokumentiert, nicht als sichtbare Kernfunktion. ## v4.0.535-kompass-equal-ring-arrows - Kompass-Bühnengeometrie bleibt exakter Sonderpfad nur für die Kompass-Prüfkarte. - Zentrum und alle 16 Richtungskinder erhalten denselben Dekorationsdurchmesser. - Kompass-Ring wird an Bühnenbreite/-höhe begrenzt, damit alle 16 Richtungen im ersten Rahmen sichtbar bleiben. - Richtungspfeile erhalten zusätzlich direkt am Shape `actualDirectionAngleDeg`; der bestehende Render-Pass sichert die tatsächliche Richtung weiter ab. - Keine Änderungen an Familienkreisen, Import, Promptimport, Anatomie, AI-Flow, Ton oder SDK. ## v4.0.534-family-circle-distance-guard - Familienkreise auf echte Familien begrenzt: Mutter plus direkte sichtbare Kinder. - Einzelne Blattknoten bekommen keinen eigenen Familienkreis mehr. - Familienkreis-Radius nutzt Muttermitte bis Basis-Kindabstand statt Kind-Tangente. - Wenn einzelne direkte Kinder wegen eigener Kinder längere Arme haben, bleibt der Grundfamilienkreis am normalen Blatt-Kindabstand orientiert. - Fremde sichtbare Knoten begrenzen Familienkreise, damit sie nicht in fremde Innenräume hineinlaufen. - Faden-Mindestaußenabstand von 16 auf 22 erhöht, damit Kontaktstummel ruhiger verschwinden. - Keine Änderungen an Kompass, Anatomie, Import, AI-Flow oder Ton. ## v4.0.533-import-promptimport-recovery - Sichtbarer `Import`-Button im Bibliotheks-/Suchbereich wiederhergestellt. - Sichtbarer `Promptimport`-Button neben dem Importzugang ergänzt. - AI-Promptgenerator zeigt `Promptimport` pro Prompt-Chip als lesbaren Textbutton statt nur Download-Icon. - Bei aktivem Prompt erscheint zusätzlich eine klare Aktionszeile `Prompt kopieren` und `Promptimport`. - Keine Änderungen an Geometrie, Kompass, Familienkreisen, Fäden oder Ton. ## v4.0.532_testflight_dependency_guard Status: TestFlight-Dependency-Guard nach lokalem EAS-Abbruch vor iOS-Entitlements. Geändert: - `eas.json` setzt jetzt `cli.appVersionSource` explizit auf `remote`, damit EAS CLI nicht erneut interaktiv nach der Versionsquelle fragt. - Neuer `scripts/ensure-deps.mjs` prüft vor Build/Submit lokal auf installierte Expo-Dependencies und erklärt den Fehler `Cannot find expo-modules-autolinking` direkt. - `preflight` prüft zusätzlich, ob `expo` und `expo-modules-autolinking` lokal auflösbar sind. - `WINDOWS_TESTFLIGHT_COMMANDS.ps1` führt den sauberen Windows-Pfad aus: npm install, preflight, expo-doctor, EAS build. Befund aus PowerShell-Log: - Git-Warnung ist nicht blockierend. - Expo-Go-Warnung ist nicht blockierend. - Blockierend war fehlendes lokales `node_modules` beziehungsweise fehlendes `expo-modules-autolinking` vor der EAS-Konfigurationsauswertung. ## v4.0.531-testflight-preflight - TestFlight-Metadaten konsistent auf 4.0.531 gesetzt: app.json, package.json, runtimeVersion, iOS buildNumber, Android versionCode und app.json.extra. - Kritische Fokusraum-Helfer ergänzt: toggleWordList, lookupWordTargets, ClearableMultilineInput und splitTextTokens. Dadurch sollen Wortmarkierung, Wiki-Wortsuche und Blocktext-Editor nicht mehr durch ReferenceErrors abbrechen. - Neues lokales Preflight-Script scripts/preflight.mjs ergänzt und als npm run preflight verdrahtet. Es prüft Versionsgleichlauf, SDK-54-Lock, iOS-Permissions, EAS-Profile, lokale Imports und Fokusraum-Helfer. - Altes unbrauchbares testflight:auto-Script entfernt; klare Scripts für build:ios:testflight und submit:ios:testflight bleiben. - Keine Geometrie-, Kompass-, Familienkreis-, Fäden- oder Tonänderung. Ton bleibt pausiert. Prüfung: - npm run preflight: bestanden. - TypeScript/JSX-Syntaxparse über alle 36 JS-Dateien: bestanden. - Lokale Importauflösung: bestanden. Offen vor echtem Upload: - npm install / npx expo-doctor / EAS-Build müssen auf deinem Rechner mit Internet und EAS-Login laufen. Im Sandbox-Lauf konnte npm install nicht abgeschlossen werden. ## v4.0.530-ai-panel-persist-testflight - AI-Fenster bleibt nach Appwechsel/Rückkehr geöffnet, solange der AI-Import noch nicht erfolgreich war. - AI-Panel-Status wird in ReleaseSettings/aiPromptState gespeichert. - Erfolgreicher AI-Import setzt den Pan


## app
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/app.json

{ "expo": { "name": "GREMATIK", "slug": "itmo-v4", "version": "4.0.672", "orientation": "default", "platforms": [ "ios", "android", "web" ], "sdkVersion": "54.0.0", "web": { "bundler": "metro", "output": "single" }, "ios": { "supportsTablet": true, "bundleIdentifier": "de.fxchs.itmo", "buildNumber": "672", "config": { "usesNonExemptEncryption": false }, "infoPlist": { "NSCameraUsageDescription": "ITMO nutzt die Kamera optional, um ein eigenes Foto als Bühnenhintergrund für ein Thema aufzunehmen.", "NSPhotoLibraryUsageDescription": "ITMO nutzt ausgewählte Fotos als Referenz für Polygone und Fotowelten. Die Originalbilder bleiben in deiner Fotomediathek.", "NSPhotoLibraryAddUsageDescription": "ITMO speichert keine Fotos in die Mediathek, kann aber exportierte Bilder teilen, wenn du das auslöst." } }, "android": { "package": "de.fxchs.itmo", "versionCode": 672, "permissions": [ "CAMERA", "READ_EXTERNAL_STORAGE", "READ_MEDIA_IMAGES" ], "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#000000" } }, "extra": { "itmoBuild": "v4.0.672_grematik_erstdurchlauf", "itmoVersion": "v4.0.672_grematik_erstdurchlauf", "cacheBust": "v4.0.672_grematik_erstdurchlauf", "buildLabel": "v4.0.672_grematik_erstdurchlauf", "buildTag": "v4.0.672_grematik_erstdurchlauf", "releaseChannel": "v4.0.672_grematik_erstdurchlauf", "itmoStage": "v4.0.672_grematik_erstdurchlauf", "publicAppName": "GREMATIK", "technicalImportName": "ITMO", "authorRun": "nullpunkt-0-erstappbesuch", "entrySetting": "timeline-zero-first-app-visit", "appButton": "organic-fox-button-nullpunkt-0" }, "scheme": "itmo", "splash": { "image": "./assets/splash.png", "resizeMode": "contain", "backgroundColor": "#000000" }, "runtimeVersion": "4.0.672", "icon": "./assets/icon.png" } }


## Anatomie-Knochenmap v4.0.463
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/ANATOMIE_KNOCHENMAP_v4.0.463.md

# Anatomie-Knochenmap v4.0.463 Neue Vorlage als körperorientierte Knochenkarte. Kopf oben, Körperachse nach unten, Arme seitlich, Becken/Beine unten. Knochen sind Knoten; Muskeln nur Textbezug. Importdatei im Projektroot: `Anatomie-Knochenmap-v4.0.463.txt`.


## Anatomie-Knochenmap v4.0.464
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/ANATOMIE_KNOCHENMAP_v4.0.464.md

# Anatomie-Knochenmap v4.0.464 Die v4.0.463-Map war inhaltlich zu tief als sichtbare Bühnenwolke. v4.0.464 stellt die Anatomie auf eine ruhige Körperfigur um. Grundregel: - Körperregionen und wichtige Einzelknochen sind Knoten. - Sehr feine Reihen wie Karpalia, Metakarpalia, Phalangen, Rippen und Tarsalia sind in Textblöcken gelistet, sofern ein eigener Bühnenknoten die Orientierung stören würde. - Muskeln bleiben Textbezug, keine Muskelknoten.


## FINAL REQUIREMENTS LOCK v4.0.330
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/FINAL_REQUIREMENTS_LOCK_v4.0.330.md

# FINAL REQUIREMENTS LOCK v4.0.330 Harte Regeln vor TestFlight: 1. Keine Renderfehler: width/clamp/timeline/wiki dürfen nicht crashen. 2. Enge Familien: Mutter + direkte Kinder + Labels + Fäden müssen gemeinsam sichtbar sein. 3. Startfamilie: enger, kurze Fäden, große labelnahe Polygone, kleinere Labels. 4. Kein sichtbarer Knoten ohne Fadenverbindung. 5. Fokusliste: Einträge inline aufklappen, Kinderchips direkt im bestehenden Eintrag, weniger Tastatur-Unruhe. 6. Wiki: keine störenden Systemdialoge; Fehler bleiben protokolliert oder inline. 7. Ruheanimation: sichtbar lebendig, aber niedriger Frame-Takt und nur Kernstruktur. 8. TestFlight erst nach Gerätetest ohne Crash und ohne starkes Ruckeln.


## FINAL VISUAL RULES v4.0.331
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/FINAL_VISUAL_RULES_v4.0.331.md

# FINAL VISUAL RULES v4.0.331 1. Keine riesigen Polygonhüllen über Labels. 2. Polygone markieren den Symbol-/Labelanker. 3. Enge Familien bleiben kompakt sichtbar. 4. Labels dürfen am Seitenrand leicht hängen. 5. Direkte Fäden kurz, verschachtelte Arme länger.


## FUNCTION CHECK v4.0.321
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/FUNCTION_CHECK_v4.0.321.md

# FUNCTION CHECK v4.0.321 Prüfen: 1. Fokusliste: Plus/Minus öffnet Kinder an Ort und Stelle. 2. Kind-Chip in aufgeklapptem Eintrag springt zum Kind. 3. Kind/Text-Aktionen sind direkt im aufgeklappten Bereich erreichbar. 4. Bühne zeigt deutlich größere Polygone. 5. Idle bewegt sichtbar, aber ohne starkes Ruckeln. 6. Große Map: Pinch/Drag/Fokus ohne Crash.


## GOLDENE REGEL v4.0.322
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/GOLDEN_RULE_FAMILY_FIT_v4.0.322.md

# GOLDENE REGEL v4.0.322 Enge Familien müssen auf der Bühne vollständig sichtbar sein: Urkern/Mutter, direkte Kinder, Labels und Fäden. Keine unverbundenen sichtbaren Knoten. Keine riesigen Polygonhüllen, die Labels oder Bühne sprengen.


## NEXT CHAT – ITMO v4.0.577
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_NEXT_CHAT.md

# NEXT CHAT – ITMO v4.0.577 Aktueller Stand: v4.0.577_hull_center_black_pass. Zuerst testen: - schwarze Bühne ohne Wash, - echte Bildschirmmitte, - keine Rand-Einrollung, - keine Swallow-/Cluster-Ausblendung, - kinderlose Kinder bleiben Kreis/16-Eck, - 3 eigene Kinder ergeben Dreieck, - Innenkreise bleiben schwarz und werden nicht von Hüllenfüllung abgedunkelt. Nicht wieder einbauen: - stageBackgroundColor, - hullStrokeForShape, - Ring-Cutout-Abhängigkeit als Pflichtpfad, - Rand-Einroll-/Ausrolllogik, - Swallow-Filter für normale Familien. ## v4.0.640 update New hard direction: 9 connections max. No 16er geometry. Root max 9 children, attached max 8 own children. Continue polishing side anchors and spacing around this stable 9max baseline.


## HANDOFF_v4.0.193
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.193.md

# HANDOFF_v4.0.193 Aktueller stabilisierter Stand nach v4.0.192. ## Schwerpunkt - Qualitätscheck nach Undo- und Bildast-Ausbau. - Dokumente bereinigt. - Versionen aktualisiert. - Syntax/JSON-Prüfung bestanden. ## Nächster Start im neuen Chat 1. Erst v4.0.193 auf iPhone starten. 2. Fotomehrfachauswahl testen. 3. Bildast-Erzeugung testen. 4. Undo nach Bildast, Text, Farbe und Löschen testen. 5. Fokusraum-Footer und Tastatur prüfen. 6. Danach echte Fehler reparieren, nicht blind weiter umbauen.


## HANDOFF v4.0.194
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.194.md

# HANDOFF v4.0.194 ## Kern dieser Etappe Drei komplette Bild- und Designsprachen wurden aufgebaut. ## Die drei Designthemen 1. Baumkrone - organisch, ruhig, verästelt - gut für Prozessbezug, Beziehungen, Tiefe 2. Atlas - editorial, klinisch, klar, diagrammatisch - gut für Fachinhalte, Print, Übersicht 3. Blumenwiese - lebendig, farbig, emotionaler, motivierend - gut für Kreativität, Gefühle, Bedürfnisse, Einstieg ## Umgesetzt - vollständige Vorlagenbildsets für alle zentralen Templates in allen drei Designthemen - neue Hero-/Startbilder pro Designthema - Designumschalter in der Bibliothek inhaltlich neu beschriftet - Template-Karten je Theme stilistisch differenziert - Baumkrone als neuer Standard gesetzt ## Nächste sinnvolle Prüfpunkte - auf iPhone prüfen, ob jedes Designthema im Startbereich, in der Vorlagenwelt und in den Karten deutlich anders wirkt - prüfen, ob die Kartenlesbarkeit in Atlas hoch genug ist - prüfen, ob Blumenwiese nicht zu verspielt wirkt und Baumkrone genügend Ruhe hat - falls gewünscht: als nächstes gleiche Designprofile stärker in Fokusraum, Suche und Print hineinziehen


## HANDOFF v4.0.195
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.195.md

# HANDOFF v4.0.195 ## Ziel Der ZIP-Workflow wird fortgeführt. v4.0.195 baut auf v4.0.194 auf und zieht die drei Designsprachen stärker in die App-Oberfläche. ## Gemacht - neues Modul `src/core/designThemes.js` - Designprofile für Baumkrone, Atlas und Blumenwiese zentral definiert - Stage-Suche nutzt jetzt das aktive Designprofil: Text, Panel, Rundung, Placeholder und Trefferbereich - Fokusraumheader nutzt jetzt das aktive Designprofil: Kontext, Headerfläche, Titelschrift, Kicker und Hintergrundatmosphäre - Printausgabe nutzt jetzt das aktive Designprofil: Hintergrund, Tinte, Panelton und Designmarke - `releaseSettings.designTheme` wird jetzt normalisiert und bleibt stabil gespeichert - Standard bleibt Baumkrone ## Prüfen - Designumschalter auf Startseite durchgehen - Fokusraum in allen drei Designs öffnen - Suche in allen drei Designs testen - Print testen, ob Atlas/Blumenwiese/Baumkrone unterscheidbar sind ## Nicht geändert - keine neue Featurewelt - keine Bild- oder Fotoimportänderung - keine neue Gestenlogik


## ITMO v4.0.212 – Template Chapter / Block / Scale Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.212.md

# ITMO v4.0.212 – Template Chapter / Block / Scale Pass ## Ziel Alle Vorlagen werden strukturell auf das ITMO-Kernprinzip zurückgeführt: Kreis = Kapitel, Polygonkind = Unterkapitel, Textblock = tragender Abschnitt, Skala = direkt am Textblock. ## Umgesetzt - Neuer Strukturpass `src/core/templates/templateStructureV212.js`. - `createTemplateMap()` führt nach den vorhandenen Template-Erweiterungen einen v4.0.212-Strukturpass aus. - Alle Vorlagen erhalten pro Kreis mindestens tragende Textblöcke. - Jeder Textblock trägt mindestens eine eigene Skala. - Alte Node-Skalen werden beim Templateaufbau in den ersten Textblock überführt; Node-Skalen bleiben nur als Kompatibilitätsfallback. - Jeder Block bekommt Struktur-Metadaten: `structureRole`, `chapterPath`, `sourceNodeId`, `order`. - Jeder Kreis bekommt `systemStructure` mit Rolle, Tiefe, Pfad, Eltern-, Kinder- und Block-IDs. - Fokusraum: oberes Breadcrumb-/Polygonband wurde durch eine Blockstruktur-Navigation ersetzt. - Fokusraum: Textblock-Skalen werden direkt unter dem jeweiligen Textblock angezeigt und bearbeitet. - Fokusraum: neue Skalen landen am aktiven Textblock oder am ersten Block, nicht mehr primär am Kreis. - Print-Statistik zählt jetzt auch Textblock-Skalen. ## Konzeptentscheidung Die Karte bleibt der eigentliche Baum. Es gibt keine zweite Kapitelverwaltung. Kapitel entstehen aus Kreisen, Unterkapitel aus Kindern, Textblöcke aus Blockdaten, Skalen aus `block.scales`. Dadurch bleiben Bühne, Polygone, Fokusraum, Wortlinks und Export/Print auf demselben Modell. ## Geänderte Dateien - `src/core/model.js` - `src/core/templates/templateStructureV212.js` - `src/ui/FocusRoom.js` - `src/core/printScene.js` - `App.js` - `package.json` ## Check - TypeScript-Syntaxcheck mit JSX-Parsing: `tsc -p tsconfig.check.json` ohne Ausgabe. - Node-Syntaxcheck für Modell-/UI-Dateien ohne Ausgabe. - ESM-Testkopie: alle 10 Vorlagen erzeugt; keine Nodes ohne Blöcke; alle Blockpfade vorhanden; Node-Skalen nach Templatepass 0; Block-Skalen vorhanden. ## Offen - Gerätetest in Expo Go. - Visuelle Feinkorrektur der neuen Blocknavigation nach echtem iPhone-Test. - Optional: bestehende gespeicherte User-Maps ebenfalls per Migrationsknopf auf v4.0.212-Struktur heben.


## ITMO v4.0.213 – Focusroom Polygon Text Rail Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.213.md

# ITMO v4.0.213 – Focusroom Polygon Text Rail Pass ## Ziel Der Fokusraum soll nicht mehr eine separate Verwandtschafts-/Breadcrumb-Ebene zeigen, sondern die Polygonstruktur selbst als Textblock-Chronologie nutzbar machen: Kreis = Kapitel, Kind = Unterkapitel, erster Textblock = eigener Polygoninhalt. ## Umgesetzt - Fokusraum oben auf `PolygonTextRail` umgebaut. - Vorfahren, aktuelles Polygon und Nachfahren werden als vertikale chronologische Textschiene angezeigt. - Je Polygon wird der erste Textblock gespiegelt: Titel, Rolle, Auszug und erste Skala. - Aktuelles Polygon wird hervorgehoben und beim Öffnen vertikal angescrollt. - Antippen des aktuellen Timeline-Blocks öffnet den Editor für `blocks[0]`. - Antippen von Vorfahren-/Nachfahrenblöcken navigiert in das jeweilige Polygon. - Vor-/Weiter-Buttons aus der Fokusraumstruktur entfernt. - Rückgängig-Button aus der Fokusraumaktionszeile entfernt; Fokusraum bleibt schlanker. - Alte Breadcrumb-/Verwandtschaftsschiene im kompakten FocusRoomPanel der Bibliothek ausgeblendet. - Haupttextanzeige im Fokusraum entfernt; Polygoninhalt läuft jetzt über Textblöcke. - Kompakter Polygontitel-Editor bleibt erhalten. - `normalizeMap()` stellt sicher, dass jeder Node mindestens einen Block besitzt. - `node.text` wird mit dem ersten Block synchronisiert, damit Suche, Bühne und Legacy-Export weiter funktionieren. - `updateTextBlock()` spiegelt Änderungen am ersten Block zurück in `node.text`. - Neue Kindpolygone bekommen sofort ersten Block, Urskala, Kapitelpfad und Systemstruktur. - Instagram-/PNG-Share angepasst: ausgewähltes Polygon bleibt ausgewählt, Fokusraum-Overlay wird beim Capture ausgeblendet, Screenshot zentriert nur ohne Zoomwechsel. ## Geänderte Dateien - `src/ui/FocusRoom.js` - `src/ui/LibraryPanel.js` - `src/ui/Stage.js` - `src/core/model.js` - `App.js` - `package.json` - `app.json` - `VERSION_LOG.md` ## Check - `node --check App.js` - `node --check src/core/model.js` - `node --check src/ui/FocusRoom.js` - `node --check src/ui/LibraryPanel.js` - `node --check src/ui/Stage.js` - `node --check src/core/printScene.js` ## Offen - Expo-Go-Gerätetest. - Prüfen, ob die vertikale Polygonschiene bei sehr tiefen Bäumen zu lang wird. - Danach visuelle Dichte der Timeline-Karten weiter reduzieren oder einklappbar machen.


## ITMO v4.0.214 – Chapter Text Template Import Export Focus Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.214.md

# ITMO v4.0.214 – Chapter Text Template Import Export Focus Pass ## Status Arbeitsstand auf Basis v4.0.213. Schwerpunkt: Kapiteltext als gemeinsames Quellformat für Vorlagen, Import, Export, Fokusraum und Print. ## Geändert - Neue Datei `src/core/templates/chapterTemplatesV214.js` ergänzt. - Alle sichtbaren Vorlagen werden als komplette Kapiteltexte neu erzeugt. - `createTemplateMap` nutzt für unterstützte Vorlagen direkt die neuen Kapiteltext-Templates und ignoriert alte Template-Reste. - Jede Vorlage erzeugt Polygone aus Headings, Unterpolygone aus Unterheadings und einen ersten Kern-Textblock je Polygon. - Jeder erste Textblock trägt eine Urskala. - Fokusraum zeigt jetzt den kompletten Kapiteltext der Map, nicht nur Vorfahren und Nachfahren des aktuellen Polygons. - Der aktuelle Polygontext wird beim Öffnen hervorgehoben und automatisch angescrollt. - Print enthält zusätzlich den vollständigen Kapiteltext der Map. - Footer-Foto-Button startet direkt `captureCameraBackground`; kein Bildfenster für Hintergrundauswahl. - `app.json` und `package.json` auf v4.0.214 aktualisiert. ## Vorlage-Tiefen - Neues Thema: 17 Polygone. - GERG: 30 Polygone. - Befundung: 36 Polygone. - ICF: 32 Polygone. - ICD: 27 Polygone. - AMDP: 43 Polygone. - Persönlichkeitsstörungen: 29 Polygone. - Anatomie: 62 Polygone. - Gefühle: 29 Polygone. - Bedürfnisse: 35 Polygone. ## Wichtige Logik `blocks[0]` bleibt der kanonische Eigeninhalt eines Polygons. `node.text` bleibt Such-/Legacy-Spiegel. Import und Export laufen über `src/core/chapterText.js`. ## Nächste sinnvolle Schritte 1. Expo-Go-Gerätetest. 2. Fokusraum-Schiene optisch verdichten, falls Anatomie mit 62 Polygonen zu lang wirkt. 3. Print-Darstellung gezielter in Kapitelbaum plus Szene aufteilen. 4. Kapitel-TXT-Import mit echten Unterrichts-/AMDP-/Anatomietexten prüfen. 5. Foto-Button im Gerätetest prüfen, weil direkte Kameraaufnahme vom Permission- und Camera-Ready-Timing abhängt. ## Statuszeile Ich brauche noch 5 Schritte bis zum nächsten sauberen testbaren Zielzustand.


## ITMO v4.0.215 – Inline Block Edit Scales Focus Header Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.215.md

# ITMO v4.0.215 – Inline Block Edit Scales Focus Header Pass ## Ausgangspunkt Basis war `ITMO_v4.0.214_chapter_text_template_import_export_focus_pass.zip`. ## Ziel Der Fokusraum soll nicht mehr aus einer großen Kapitelliste plus nachgelagertem altem Textbereich bestehen. Die Kapitelliste selbst soll die Arbeitsfläche sein: Polygon = erster Textblock, Textblock = bearbeitbarer Polygoninhalt, Skala = dezenter Balken direkt am Textblock. ## Umgesetzt - Fokusraum-Header mit editierbarem Maptitel ergänzt und Top-Abstand erhöht. - Alte untere Block-/Textfeldanzeige unter der Kapitelliste entfernt. - Chronologische Polygonliste bleibt vollständige Map-Textansicht und ist jetzt der primäre Bearbeitungsort. - Aktueller Polygon-Eintrag ist direkt bearbeitbar: - Polygontitel im Listeneintrag editierbar. - erster Textblocktitel im Listeneintrag editierbar. - Textblock wird inline als TextInput editiert. - aktive Wortmarkierungen laufen im aktuellen Textblock. - Nichtaktive Einträge bleiben navigierbare Kapitel-/Polygonvorschau; Antippen wechselt in dieses Polygon. - Skalen erscheinen als dezente Balken unter jedem Listeneintrag. - Aktueller Skalenbalken ist direkt bedienbar; bei fehlender Skala kann eine Urskala angelegt werden. - Farbe, Symbol und Bild des aktuellen Polygons sind im aktuellen Listeneintrag sichtbar. - Medien-/Farb-/Symbolpanel klappt direkt im aktuellen Listeneintrag auf. - Vorschläge und Unterpolygon-Anlage bleiben schlank unten erhalten. ## Geänderte Dateien - `src/ui/FocusRoom.js` - `App.js` - `package.json` - `app.json` ## Technische Hinweise - `node.text` bleibt weiterhin Legacy-/Suchspiegel des ersten Textblocks. - Für die neue Logik zählt weiterhin: erster Textblock eines Polygons ist der eigene Polygontext. - Die neue Fokusliste aktualisiert vorerst nur den aktuellen Knoten inline; andere Knoten werden durch Antippen aktiv und dann bearbeitet. Dadurch bleibt die bestehende `selectedId`-Datenführung stabil. ## Nächste sinnvolle Schritte 1. Expo-Go-Gerätetest: Fokusraum öffnen, in tiefer Vorlage scrollen, aktuellen Eintrag editieren. 2. Prüfen, ob Tastaturverhalten beim Inline-Editor weich genug ist. 3. Skalenbalken optisch noch feiner machen, falls sie zu präsent wirken. 4. Printdarstellung auf dieselbe Kapitel-/Blocklogik weiter verdichten. 5. Optional: später direkte Bearbeitung nichtaktiver Einträge ohne vorherige Navigation einbauen. ## Status v4.0.215 ist ein Struktur- und UX-Pass. Der Fokusraum ist jetzt wesentlich näher an der gewünschten Textblock-als-Polygon-Logik.


## ITMO v4.0.217 – Beta Clarity Focus Template Check Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.217.md

# ITMO v4.0.217 – Beta Clarity Focus Template Check Pass ## Ausgangspunkt Basis ist `ITMO_v4.0.216_time_template_timeline_landscape_pass`. Dieser Schritt reagiert auf den Wunsch, die neue Kapitel-/Textblocklogik zu einer lauffähigen Beta zu beruhigen: Vorlagen-Intro statt Anrede, Fokusraum ohne globalen Rahmen, Skalen als dezente direkt bedienbare Balken, Footer niedriger und Basisprüfung der Kernfunktionen. ## Umgesetzt ### Vorlagen / erster Eintrag - Der Start-Seed wird nicht mehr als erster Block `Anrede` in neue Maps geschoben. - Bei Template-Maps bleibt der erste Root-Text der fachliche Introtext. - Root-Introblöcke heißen jetzt `Intro`. - Der optionale Start-Seed wird nur noch als nachgeordnete `Startnotiz` eingefügt. ### Fokusraum - Der globale Fokusraumrahmen wurde visuell entfernt: kein harter äußerer Panelrahmen mehr um die komplette Arbeitsfläche. - Die Map-Titelzeile bleibt oben, aber ruhiger und transparenter. - Aktive Polygon-Textblöcke bleiben direkt im Kapiteltext bearbeitbar. - Wortmarkierungen bleiben im aktiven Textblock. ### Skalen - Skalen erscheinen nicht mehr als schwere Textzeile mit separatem Label/Value-Block. - Die Skalenbezeichnung sitzt im Balken selbst und kann direkt bearbeitet werden. - Neben der Skala stehen kleine Aktionen: `bearbeiten`, `ausblenden`, `einblenden`, `hinzufügen`, optional `löschen`. - Mehrere Skalen pro Textblock werden jetzt untereinander als ruhige Balken dargestellt. - Ausblenden ist zunächst lokale UI-Ausblendung im Fokusraum, nicht persistente Datenlöschung. ### Footer / Swipe - Footerhöhe weiter reduziert. - Footerbuttons kleiner gesetzt. - Bei geöffnetem/ausgefahrenem Fenster bleiben Footerbuttons sichtbar und bedienbar. - Der gedimmte Zustand bleibt mindestens bei 25 Prozent Deckkraft. - Der Modusbutton bleibt auch bei geöffnetem Fenster bedienbar. ### Foto / Hintergrund - Das alte Hintergrund-Auswahlfenster bleibt abgekoppelt. - Der Foto-Footer bleibt auf direkte Aufnahme ausgerichtet. - Die Bild-/Fotowelt-Funktionen bleiben weiter verfügbar. ### Versionierung - `package.json` auf 4.0.217 aktualisiert. - `app.json` auf 4.0.217 / build 217 aktualisiert. - Exportpayload auf 4.0.217 aktualisiert. - Printkopf auf 4.0.217 aktualisiert. ## Geänderte Hauptdateien - `src/core/model.js` - `src/core/templates/chapterTemplatesV214.js` - `src/core/chapterText.js` - `src/core/storage.js` - `src/core/printScene.js` - `src/ui/FocusRoom.js` - `src/ui/LibraryPanel.js` - `package.json` - `app.json` ## Noch offen - Expo-Go-Gerätetest. - Wiki-Laufzeittest mit echtem Netzwerk. - Kameraaufnahme auf iPhone prüfen. - Printdialog auf iOS/Web prüfen. - Import/Export einer reinen Kapitel-TXT und eines ITMO-TXT-Exports im Gerätetest prüfen. - Skalenaktionen visuell in kleinen Displays testen. ## Status Nächster sinnvoller Zielzustand: Beta-Testpass auf Gerät mit fünf Kernwegen: Vorlage anlegen, Fokusraum bearbeiten, Foto machen, TXT exportieren/importieren, Print/Share testen.


## ITMO v4.0.218 – Mobile Landscape Timeline Auto Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.218.md

# ITMO v4.0.218 – Mobile Landscape Timeline Auto Pass ## Stand Basis: v4.0.217 Beta Clarity Focus Template Check Pass. ## Ziel dieses Schritts Die Zeitspur soll auf mobilen Geräten nicht mehr als eigener Modus-Button erscheinen. Auf iPhone/Android wird die Zeitspur automatisch über Querformat aktiviert. Auf Web/Desktop bleibt Zeit als bewusster Modus erhalten, weil dort Querformat, Maus, Tastatur und Scrollrad eine eigene Arbeitsvariante bilden. ## Umgesetzt - `App.js`: `useWindowDimensions` und `Platform` ergänzt. - `effectiveDisplayMode` eingeführt. - Mobile Querformat: `effectiveDisplayMode = timeline`. - Mobile Hochformat: `timeline` wird nicht als gespeicherter Modus gehalten; Fallback auf `organism`. - Web/Desktop: `timeline` bleibt im Moduszyklus enthalten. - Mobile Moduszyklus: nur `organism` und `organicFree`. - Mobile Querformat: Modusbutton im Footer ausgeblendet, damit die Zeitspur nicht als Extra-Button erscheint. - Print und Share verwenden jetzt den effektiven Anzeigemodus, nicht blind den gespeicherten Basiszustand. - `package.json`, `app.json`, Exportversion und Print-Meta auf v4.0.218 gesetzt. ## Verhalten - Hochformat mobil: normale Bühne. - Querformat mobil: automatische Zeitspur. - Zurück ins Hochformat: normale Bühne. - Web/PC: Orbit/Edit/Zeit per Modusbutton und bestehender Tastatur-/Mauslogik. ## Geänderte Dateien - `App.js` - `src/ui/LibraryPanel.js` - `src/core/storage.js` - `src/core/printScene.js` - `src/core/chapterText.js` - `src/core/templates/chapterTemplatesV214.js` - `package.json` - `app.json` ## Check - `node --check App.js` - `find src -name '*.js' -print0 | xargs -0 -n1 node --check` - ZIP-Test ohne Fehler. ## Offen - Expo-Go-Test mit echtem Drehen: Hochformat → Querformat → Hochformat. - Prüfen, ob Fokusraum/Library im Querformat genug Raum lassen. - Danach Beta-Stabilisierung für Wiki, Print, Foto, Bilder, Import/Export und Inline-Editor.


## ITMO v4.0.219 – Focus Teaser Deep Maps Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.219.md

# ITMO v4.0.219 – Focus Teaser Deep Maps Pass ## Stand Basis: v4.0.218 Mobile Landscape Timeline Auto Pass. ## Ziel dieses Schritts Die neue Fokusraum-Liste soll ruhiger und klarer zwischen Bearbeiten, Ganzansicht und Teaser unterscheiden. Gleichzeitig sollen alle Kapitelvorlagen deutlich stärker verzweigen, damit Maps inhaltlich eher wie ein strukturierter Code-/Kapitelbaum wachsen können. ## Umgesetzt - Fokusraum: Modus-Badges pro Eintrag ergänzt: `Bearbeiten`, `Ganzansicht`, `Teaser`. - Nicht aktive Textblockeinträge werden als Teaser geführt. - Teasertexte sind auf maximal 10 Zeilen begrenzt. - Aktueller Textblock bleibt die Ganzansicht und kann weiter direkt in den Bearbeitungsmodus wechseln. - Leere Teaser bleiben antippbar und öffnen das zugehörige Polygon. - Vorlagen erhalten einen zusätzlichen v4.0.219-Tiefenpass. - Leaf-Kapitel und frühe Hauptäste bekommen sinnvolle Unterpolygone. - Vertiefungen sind je Vorlage fachlich unterschiedlich: - Anatomie: Struktur, Funktion, klinischer Blick, Verknüpfung. - Befundung: Erheben, Beobachtungsanker, Bewerten, Ableiten. - Gefühle: Körpersignal, Auslöser, Bedürfnisbezug, Handlung. - Bedürfnisse: Hinweise, Erfüllung, Mangel, Strategien. - Zeit: Zeitraum, Übergang, Atmosphäre, Frage. - AMDP: Beobachtungsanker, Graduierung, Abgrenzung, Alltagswirkung. - ICF: Code/Bereich, Qualifier, Alltagsbeispiel, Kontext. - ICD: Diagnosekern, Differentialblick, funktionelle Wirkung, therapeutischer Anschluss. - ITMO: Eingabe, Verknüpfung, Darstellung, Ausgabe. - Template-Metadaten, Exportversion, Printversion, app.json und package.json auf v4.0.219 aktualisiert. ## Template-Prüfung Temporärer Node-Importtest über angepasste lokale ESM-Kopie: - empty: 75 Polygone - gerg: 124 Polygone - befundung: 164 Polygone - icf: 144 Polygone - icd: 121 Polygone - amdp: 193 Polygone - persoenlichkeit: 131 Polygone - anatomie: 260 Polygone - gefuehl: 131 Polygone - beduerfnis: 157 Polygone - zeit: 253 Polygone - itmo: 57 Polygone Keine Nodes ohne Textblock. Keine ersten Textblöcke ohne Skala. ## Geänderte Dateien - `src/ui/FocusRoom.js` - `src/core/templates/chapterTemplatesV214.js` - `src/core/chapterText.js` - `src/core/printScene.js` - `src/core/storage.js` - `package.json` - `app.json` ## Check - `node --check App.js` - `find src -name '*.js' -print0 | xargs -0 -n1 node --check` - Template-Erzeugungstest über temporäre ESM-Kopie bestanden. - ZIP-Test ohne Fehler. ## Offen - Expo-Go-Test: Fokusraum-Liste mit langer Anatomie-/Zeit-Map prüfen. - Prüfen, ob die stark vergrößerten Vorlagen auf älteren Geräten noch flüssig bleiben. - Danach Beta-Funktionscheck v4.0.220: Wiki, Print, Foto, Bilder, Import/Export, Inline-Tastatur, Zeitspur, Querformat, Footer, Swipepanel.


## ITMO v4.0.222 – Global Search Empty Wiki Beta Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.222.md

# ITMO v4.0.222 – Global Search Empty Wiki Beta Pass ## Status Auf Basis von v4.0.221 wurde ein Beta-naher Struktur- und Suchpass umgesetzt. ## Umgesetzt - `Neues Thema` erzeugt jetzt wirklich nur eine leere Map mit einem Kernpolygon und ohne Vorlage/Kapitelbaum. - Das Kernpolygon enthält nur einen leeren Kern-Textblock mit Urskala; keine Seed-Anrede, keine Intro-Unterkapitel. - Globale Suche als Header über Start, Bühne und Fokusraum eingeführt. - Alte Themenlistensuche im Bibliothekspanel entfernt; Themenliste bleibt erhalten. - Suche findet Map-Titel, Polygon-Titel, Legacy-Text und Textblockinhalte über alle Maps. - Suchtreffer können direkt geöffnet werden. - Ohne Treffer oder zusätzlich zu Treffern kann aus der Suche ein neues Thema erstellt werden. - Doppelte Themen sind erlaubt: Bei exaktem Titel-Treffer bietet das System Betreten oder Hinzufügen an; Hinzufügen erzeugt fortlaufend nummerierte Titel. - Wiki-Aktion sitzt jetzt an jedem individuellen Teaser-/Textblocktitel im Fokusraum. - Wiki kann in den jeweiligen Textblock einfügen, auch bei nicht aktuellem Polygon in der Fokusliste. - Direkt nach einem Wiki-Eintrag erscheint am betroffenen Titel ein Rückgängig-Knopf. - Stage-eigene Suche ist zugunsten des globalen Headers ausgeblendet. - Bühne bekommt dezente XY-Raumachsen, die bei Bewegung leicht mitwandern. ## Dateien - `App.js` - `src/core/model.js` - `src/ui/FocusRoom.js` - `src/ui/Stage.js` - `src/ui/LibraryPanel.js` ## Check - `node --check App.js` - `node --check` für alle Dateien in `src` - `package.json` und `app.json` JSON-validiert ## Offen - Expo-Go-Test: globale Suche über Start/Fokus/Bühne, Thema aus Suche erzeugen, doppelten Titel hinzufügen, Wiki am nicht aktiven Teaser, Rückgängig-Wiki. - Optional nächster Schritt: echte visuelle Fäden zwischen Suchkopf und gefundenen Treffern auch in Start/Fokus statt nur Bühne/Strukturfeld.


## ITMO v4.0.254 — No Swipe Performance Size Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.254.md

# ITMO v4.0.254 — No Swipe Performance Size Pass ## Status Diese Version entfernt den Fenster-Swipe vollständig aus Bibliothek/Startfenster und Fokusraum. Fenster öffnen und schließen weiterhin sichtbar von unten nach oben beziehungsweise zurück nach unten, aber nur noch über Footer- beziehungsweise X-Steuerung. Die Bühne selbst behält ihren PanResponder, weil dieser für normales Bewegen, Zentrieren und Bühneninteraktion zuständig ist. ## Geändert - Window-/Sheet-Swipe aus `LibraryPanel.js` entfernt. - Fokusfenster-Drag-to-close aus `FocusRoom.js` entfernt. - Footer bleibt reine Buttonsteuerung; keine unsichtbaren Griffzonen mehr. - Öffnen/Schließen bleibt animiert über `Animated.Value`, ohne PanResponder-Konflikt mit ScrollViews. - Footer-Icons auf sichtbarere, ruhigere Größe angehoben und enger an die Symbolgröße der Themenliste angepasst. - Teaser-Personalisierung `Für fxchs:` aus Vorlagenteasern entfernt. - Vorlagenteaser nutzt mehr Textfläche; Untertitel bleibt auf drei Zeilen begrenzt. - FocusRail berechnet nicht mehr die komplette Map-Geometrie. - Rail-Aktionen sind sichtbar/statisch statt Swipe-Actions. - Fokusstruktur wird lokal/lazy aufgebaut: aktueller Knoten, Kinder, Geschwister, Ahnen und begrenzte Root-Auswahl statt vollständiger Tiefenlauf über alle Maps. - Stage-Performanceprofil wird bei Idle sparsamer: weniger Labels, Badges, Cluster, Tree-Lines und Symbole. - Cosmos-/Anchor-/Snippet-Berechnungen laufen nur noch, wenn die jeweilige Layerausgabe tatsächlich aktiv ist. - Idle-Bewegung wurde weicher, kleiner und billiger gerechnet. ## Wichtige Dateien - `src/ui/LibraryPanel.js` - `src/ui/FocusRoom.js` - `src/ui/Stage.js` - `src/ui/StageViewMath.js` - `package.json` - `VERSION_LOG.md` ## Nächster sinnvoller Schritt v4.0.255 sollte, falls es noch ruckelt, gezielt `buildGeometry(map, stageBox)` memo-/deltafähiger machen. Aktuell ist das der wahrscheinlich nächste harte Kostenpunkt bei großen Vorlagen und vielen Text-/Titeländerungen.


## Handoff v4.0.286 – Tone Melody Bud Reveal
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.286.md

# Handoff v4.0.286 – Tone Melody Bud Reveal Basis: v4.0.285 edit drag capture. ## Geändert - `src/ui/StageTone.js` neu strukturiert. Ton läuft jetzt als sequenzieller Sonar-Loop statt als gleichzeitiger Akkord. - Reihenfolge: zentraler sichtbarer Faden zuerst, danach sichtbare erreichbare Kinder in Baum-/Kinderreihenfolge. Ohne Fokus wird der visuell zentralste Knoten als Ausgangspunkt verwendet. - Nähe/Abstand 0–12 bleibt erhalten. 0 ist stumm. 1 ist hoch und kurz. 12 ist tief und lang. - Quellen werden über eine Ref gelesen; wenn sich Fokus/Sichtbarkeit ändert, wird die nächste Loop-Position neu aus der aktuellen Bühnenlage gebaut, ohne den Ton hart zu stoppen. - Native Expo-Go nutzt weiterhin die WAV-Dateien über `expo-av`, jetzt ebenfalls sequenziell statt nur als Dauerloop. - `src/ui/StageRenderLayers.js` blendet neue Kinder während der ersten Knospenphase aus den normalen Layern aus und zeichnet stattdessen eine Geburt vom Mutterrand: Arm, Spreizung/Finger, dann Knotenreveal. ## Testreihenfolge 1. Bühne öffnen, Ton AN. Der Einschaltton muss kommen. 2. Eine Map mit sichtbaren Eltern-Kind-Fäden öffnen. Es darf kein stehender Akkord entstehen, sondern eine wiederholte Melodie. 3. Fokus wechseln oder zoomen. Unsichtbare Fäden müssen verschwinden, neu sichtbare Fäden in den nächsten Loop aufgenommen werden. 4. Neue Kinder per Langtipp erzeugen. Das Kind soll nicht im Mutterpolygon sichtbar starten, sondern außen knospen. 5. Edit-Modus aus v4.0.285 prüfen: Polygon ziehen darf weiter nicht die Bühne ziehen. ## Offen - Reale Geräteprüfung für Web/iOS/Android. - Tondauer und Lautstärke subjektiv nach Gehör feinjustieren. - Drop-Aktionen im Editmodus vollständig durchtesten.


## ITMO v4.0.287 – GERG Sonar Compact Labels
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.287.md

# ITMO v4.0.287 – GERG Sonar Compact Labels Ausgang: v4.0.286. Ziel dieses Schritts: GERG als Testkarte für Sonar-Abstände nutzbar machen und die Bühne so verdichten, dass mehr Struktur sichtbar wird, während Labels groß genug zum Navigieren und Ziehen bleiben. Geändert: - GERG-Vorlage erhält unterschiedliche Abstände: Hauptäste werden als Arme behandelt, Unteräste als Finger. - relationWeight 1–12 ist in GERG bewusst gemischt, damit verschiedene Töne und Tonlängen hörbar werden. - relationWeight ist jetzt Teil des Geometriecache-Keys. Dadurch sollen Edit-Drops und Abstandänderungen die Karte sofort neu auslegen. - Abstandsskala kompakter: Maximalabstand bleibt zoombezogen, nutzt aber 1.62 Fensterbreiten statt 3. - Polygongrundgrößen reduziert: ROOT_LEN 126, MIN_LEN 48, kleinere Child-Shapes und Überlauf-Fächer. - Labelmetriken vergrößert und verlängert; Hitflächen im Edit-Drag bleiben groß. Test: 1. Neue GERG-Vorlage öffnen oder kopieren. 2. Ton AN. 3. Zentralen GERG-Knoten und Hauptäste fokussieren. 4. Prüfen, ob die Tonfolge unterschiedliche Tonhöhen und Längen hat. 5. In Edit ein Label ziehen; Bühne darf nicht mitziehen. 6. Abstand per Drop/Abstand übernehmen prüfen. Offen: - Drop-Aktionen ersetzen/tauschen/dazwischen real prüfen. - Knospenanimation nach Sichttest ggf. noch stärker staffeln. - Tonloop nach realem Hörtest feinjustieren.


## HANDOFF v4.0.288
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.288.md

# HANDOFF v4.0.288 - Anatomie: Distanzkonzept auf Knochen/Äste abgestimmt. - Gefühle/Bedürfnisse: einfache 12er-Tonleiter als Mutterkreis mit 12 Kindern. - Global: kleinere Polygone, größere Label-Hitflächen.


## HANDOFF v4.0.289
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.289.md

# HANDOFF v4.0.289 Schwerpunkt: Edit-Drop und Sonarloop. Änderungen: - Faden-Drop berechnet Split und Distanz aus der Fadenposition. - InsertBetween: gezogenes Polygon wird zwischen Mutter und Kind gestellt, Kind wird Enkel. - Nur-Abstand bei freiem Drag nutzt vorhandenen Elternbezug. - Tonloop reagiert schneller auf sichtbare Strukturänderungen, startet aber nicht bei jeder Gain-Veränderung neu. Test: 1. Edit aktivieren. 2. Polygon auf Faden ziehen, Dazwischen stellen. 3. Prüfen: altes Kind hängt unter gezogenem Polygon. 4. Polygon frei vom Elternkreis wegziehen, loslassen: Abstand ändert sich ohne neue Elternschaft. 5. Ton AN: Änderungen sollen im nächsten Loop hörbar werden.


## HANDOFF v4.0.290
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.290.md

# HANDOFF v4.0.290 Umgesetzt: - Tonpulse als UI-Zustand aus StageTone zurückgegeben. - StageRenderLayers zeichnet dezenten Halo auf aktuell klingendem Mutter-/Kindpolygon. - Idle-Bewegung reduziert, damit ruhige Animation weniger ruckelt. - Cluster-/Zoom-Mechanik: Fokusmitte bleibt offener, Außenbereiche schließen früher. Test: - Ton AN, Map mit mehreren sichtbaren Kindern öffnen. Aktuell klingender Faden muss Mutter/Kind zart markieren. - In Ruhe 10–20 Sekunden stehen lassen und Ruckeln beobachten. - Pinch/Zoom auf Familie: Mitte soll eher öffnen, außen eher schließen.


## HANDOFF v4.0.291
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.291.md

# HANDOFF v4.0.291 Schwerpunkt: 12er-Fit, Sichtfeld-Sonar und Farbklang. Änderungen: - Stage-Header: Button „12er Fit“ passt den aktuell gewählten Mutterknoten oder die größte direkte Familie in den Bildschirm ein. - Zoom-Minimum auf 0.06; Filter zeigt bei sehr kleinem Zoom weiterhin direkte Kinder. - StageTone baut Quellen nur aus sichtbaren Mutter-Kind-Paaren. - Farbklang im Web: Farbe steuert Wellenform, Filter, Wobble und leichtes Knistern. Es bleibt bei einer Stimme für Performance. Weiter: - Gerätetest: Gefühle/Bedürfnisse öffnen, 12er Fit, Ton AN. - Prüfen, ob bei genau einer sichtbaren Verbindung exakt ein Ton im Loop läuft. - Danach Drop-Feedback/Undo finalisieren.


## HANDOFF v4.0.292
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.292.md

# HANDOFF v4.0.292 Status: nächster kleiner Teststand nach v4.0.291. Geändert: - Drop-Feedback direkt auf der Bühne ergänzt. - Rückgängig-Schaltfläche für die letzte Drop-Aktion ergänzt. - Drop-Aktionen schreiben sprechende Undo-Labels. Testpunkte: 1. Edit aktivieren. 2. Polygon auf Faden/Polygon ziehen. 3. Aktion wählen. 4. Bestätigung sehen. 5. Rückgängig drücken und prüfen, ob Struktur und Abstand zurückspringen.


## HANDOFF v4.0.293
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.293.md

# HANDOFF v4.0.293 Konkreter Fix: - Fokusraum oben links mit sichtbarem „Bühne“-Button schliessbar. - Inhalt im Fokusraum beginnt tiefer. - 12er-Fit/Zoom kann bis 0.06 auszoomen. - Performanceprofil rendert bei starkem Zoom-out genug Labels fuer Mutter plus 12 Kinder. Nächste sinnvolle Arbeit: - Keine neuen Features vor dem Stabilitaetspass. - Testkarten: Gefuehle, Anatomie, GERG. - Nacheinander pruefen: Fokus schliessen, 12er-Fit, Tonloop nur sichtbar, Edit-Drop, Rueckgaengig.


## HANDOFF v4.0.294
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.294.md

# HANDOFF v4.0.294 Reiner Performance-/Zoom-Pass auf Basis v4.0.293. Keine neuen Featurestränge. Geändert: - Zoom-out/12er-Fit: Deko-Layer reduziert, Label-/Faden-Priorität erhöht. - Ruheanimation: später, langsamer, weniger Amplitude; aus bei starkem Zoom-out. - 12er-Fit: mehr Bildschirmnutzung, kompakterer Distanz-Maximalbereich. Nächster Schritt: Gerätetest mit Gefühle/Bedürfnisse 12er-Kreisen und danach nur konkrete Ruckler/Überlagerungen beheben.


## HANDOFF v4.0.295
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.295.md

# HANDOFF v4.0.295 Spucken/Schlucken-Skalierung ergänzt: Eltern mit mehreren Kindern werden kleiner, wenn Kinder draußen sichtbar sind. Root wächst beim Schließen nur noch begrenzt.


## HANDOFF v4.0.296
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.296.md

# HANDOFF v4.0.296 Sichttest-Fix nach Screenshots: Suche/Header entzerrt, Tastatur per Return/Clear geschlossen, Labels im Zoom-out kompakter/kollisionsärmer, Mehrfach-Eltern stärker verkleinert.


## HANDOFF v4.0.297
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.297.md

# HANDOFF v4.0.297 Stabilisierungspass für Querformat-Timeline, Fokusraum-Schließen und Footer/Bottom-Sheet. Keine neuen Feature-Stränge. Prüfen: Timeline im Querformat, Fokusraum schließen, Footer verdeckt weniger Inhalt.


## HANDOFF v4.0.298
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.298.md

# HANDOFF v4.0.298 Hotfix nach Runtime-Crash: - `pruneOverlappingLabels` hatte noch die nicht definierte Variable `pad` und die ebenfalls nicht lokale Variable `lowZoom`. - Funktion nimmt jetzt `zoom` korrekt entgegen und definiert Abstand/Low-Zoom lokal. - Label-Kollisionslogik bleibt konservativ und performancearm. Nächster Schritt: - App öffnen, Bühne laden, Suche/Labels/12er-Fit testen. - Danach weiter mit sichtbarer Eltern-Kind-Skalierung und Timeline/Bottom-Sheet-Feinschliff.


## HANDOFF v4.0.300
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.300.md

# HANDOFF v4.0.300 Hotfix/Stabilisierung: - Editbutton auf der Bühne entfernt. - Insta-Capture nimmt den aktuellen Bildschirmzustand ohne Kameraveränderung. - Auswahl, Suche, Mapwechsel ändern die Zoomstufe nicht mehr automatisch. - Nur 12er Fit und Pinch/Zoom dürfen Zoom explizit ändern.


## HANDOFF v4.0.301
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.301.md

# HANDOFF v4.0.301 - Entfernt den 12er-Button. - Einfacher Mutter-mit-Kindern-Aufbau wird beim Map-Betreten automatisch passend eingerahmt. - Keine späteren Zoomänderungen durch Auswahl/Suche/Insta/Vollbild. - Relation-Distanz kompakter für sichtbare 12-Kind-Strukturen.


## HANDOFF v4.0.309
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.309.md

# HANDOFF v4.0.309 Fokuspanel-Bereinigung nach Nutzerfeedback. Datum und Zahlenleiste raus, Bühne-Button mittig, geschlossene Teaser strikt titel-only, Skalen sichtbar/bearbeitbar, Wiki-Titel-Löschung repariert, Labelgrößen im Zoom-out stärker begrenzt.


## HANDOFF v4.0.319
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.319.md

# HANDOFF v4.0.319 Blocker-Fix: Langtipp-Kind-Erstellung, Ruheanimation und Fokus-Zeitachse mit Mini-Polygonen. Keine Tonfunktion.


## HANDOFF v4.0.321
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.321.md

# HANDOFF v4.0.321 Funktionsfix: - Fokusliste klappt Kinder inline innerhalb der bestehenden Liste auf. - Polygone werden deutlich größer und stärker sichtbar. - Idle-Animation wird seltener aktualisiert und bewegt weniger Elemente. - Fäden bleiben billig, Struktur bleibt verbunden.


## HANDOFF v4.0.322
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.322.md

# HANDOFF v4.0.322 Goldene Regel ergänzt: enge Familien müssen vollständig mit Labels auf die Bühne passen. Änderungen: - Tight-Family-Autofit rechnet mit Header/Footer-Sperrzonen und Label-Reserve. - Polygonlayer zeichnet kompakte Label-nahe Polygone statt riesiger Offscreen-Diamanten. - Polygonbody-Boost zurückgenommen. - Idle/Ruheanimation weiter gedrosselt, damit es weniger ruckelt. - Mehr echte Eltern-Kind-Fäden, aber günstig gerendert.


## HANDOFF v4.0.323
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.323.md

# HANDOFF v4.0.323 - Ladeprinzip: 3-2-1 Overlay bei schwerer Map-/Bühnenvorbereitung. - Ruheanimation deutlicher, aber mit niedrigem Takt und begrenzter Shape-Zahl. - Performanceprofil reduziert während Idle nicht mehr so hart, damit Struktur sichtbar bleibt.


## HANDOFF v4.0.330
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.330.md

# HANDOFF v4.0.330 Finaler kompakter Kandidat vor Build-Freeze. Schwerpunkte: - Startlayout enger und ruhiger. - Polygone größer, aber labelnah. - Labels kleiner. - Fokusliste bedienbarer und tastaturärmer. - Wiki-Systemdialoge entfernt. - Ruheanimation sichtbarer, aber gedrosselt. Nächster Schritt: Gerätetest. Nur Blocker hotfixen, danach Build-Freeze/EAS.


## HANDOFF v4.0.331
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.331.md

# HANDOFF v4.0.331 Finaler Startlayout-/Polygon-Hotfix. - Startfamilien enger. - Fäden kürzer. - Polygone labelnah statt riesiger Hüllen. - Labels kleiner und randtoleranter. - Verschachtelte Arme dürfen weiter raus. - Buildnummer 331.


## ITMO v4.0.333 – echte Polygon-Anzeige
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.333.md

# ITMO v4.0.333 – echte Polygon-Anzeige Ausgangsbasis: `ITMO_v4.0.332_hierarchy_polygon_logic.zip`. ## Geändert - Die sichtbare Bühnen-Polygonlogik wurde in `src/ui/StageRenderLayers.js` konkretisiert. - Endknoten werden in der leichten Strukturansicht als Kreis gezeichnet. - Nodes mit genau einem Kind werden als kurze Linie mit Endpunkt gezeichnet. - Nodes mit zwei Kindern werden als Dreieck gezeichnet. - Nodes ab drei Kindern werden als n-Eck nach direkter Kinderzahl gezeichnet, begrenzt auf 12 Seiten. - Die alte Punktlisten-Hilfsfunktion bleibt als Legacy-Fallback erhalten, damit andere Layer nicht brechen. ## Nicht geändert - Das tiefere Hierarchie-Layout in `src/core/geometry.js` bleibt erhalten. Dort wird intern weiterhin eine robuste Polygonbasis verwendet, damit Anheftung, Hit-Test und Familienhüllen nicht instabil werden. - Kein Ton-System. - Keine neue Zeitachse. - Keine großen Vorlagenfüllungen. ## Prüfung - ZIP wurde real aus dem Arbeitsverzeichnis erstellt. - `app.json` wurde auf 4.0.333 angehoben. - JSX-Struktur wurde visuell auf die geänderte Renderstelle geprüft. ## Nächster sinnvoller Schritt `v4.0.334-thread-idle-motion`: Fäden und Ruheanimationen sanfter, sichtbarer und als Grundlage für spätere Tonlogik vorbereiten.


## HANDOFF v4.0.334 camera fallback real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.334.md

# HANDOFF v4.0.334 camera fallback real Fix für roten Expo-Fehler: `expo-camera` wird nicht mehr importiert. Hintergrundfoto läuft über `expo-image-picker.launchCameraAsync`, das im Projekt bereits als Abhängigkeit geführt wird. Prüfpunkte: - `grep -R "expo-camera" app_source` darf keinen Code-Import mehr finden. - Expo Go soll nicht mehr bei `Stage.js` abbrechen. - Foto-Button öffnet das System-Kamerafenster statt Live-Kamera-Hintergrund.


## HANDOFF v4.0.338 – polygon_quality_real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.338.md

# HANDOFF v4.0.338 – polygon_quality_real Basis: v4.0.337_free_reconnect_real. Geändert: - Gleichmäßigere Kinderverteilung in `src/ui/StageViewMath.js`. - Stabilere kompakte Bühnenpolygone in `src/ui/StageRenderLayers.js`. - App-Version auf 4.0.338 gesetzt. Testen: 1. App starten. 2. Thema mit 0, 1, 2, 3, 4, 8+ Kindern betrachten. 3. Prüfen: Kreis, Linie, Dreieck, n-Eck, runder werdende Vielkindform. 4. Free-Drop aus v4.0.337 gegenprüfen. Offen: - Fäden können noch genauer an Polygonrändern andocken. - Print/Export braucht später dieselbe Polygonlogik.


## HANDOFF v4.0.341-web-desktop-real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.341.md

# HANDOFF v4.0.341-web-desktop-real Basis: v4.0.340-print-present-real. ## Ziel Desktop/Web bedienbarer machen, ohne Mobile/Expo-Go zu destabilisieren. ## Änderungen - Wheel/Trackpad-Pan für Web bleibt zentral in Stage.js. - Strg/Cmd+Wheel zoomt sauber um den Mausanker. - Timeline nutzt horizontales Wheel-Verhalten. - Tastatur: Pfeile bewegen, Plus/Minus/PageUp/PageDown zoomen, 0/Home zentrieren. - Kleiner Desktop-Hinweis wird nur auf Web eingeblendet und nicht im Capture-Modus. ## Nächster Schritt v4.0.342: Vorlagenausbau und bessere Strukturtexte.


## HANDOFF v4.0.343 Statistik/Wiki
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.343.md

# HANDOFF v4.0.343 Statistik/Wiki Basis: v4.0.341_web_desktop_real. ## Änderungen - Neue Datei `src/core/statsWiki.js`. - Bühnenpanel unten links für Statistik. - Statistik: Kreise, Textblöcke, Wörter, Tiefe, aktive Auswahl. - Wiki-Suchvorschläge aus aktiver Auswahl, Thema und Suche. - Web öffnet Wikipedia-Suche in neuem Tab; native zeigt vorbereitete Suchbegriffe. - Export-Version auf 4.0.343 gesetzt. ## Bewusste Grenze Keine externe Wiki-Abhängigkeit und keine native Browser-Abhängigkeit ergänzt. Das ist Absicht, damit Expo Go stabil bleibt.


## ITMO v4.0.344 quality-round-real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.344.md

# ITMO v4.0.344 quality-round-real ## Status Gesamt-Qualitätsrunde auf Basis v4.0.343. Keine neue große Feature-Ebene; Schwerpunkt ist Stabilisierung, Versionspflege und saubere Beta-Freeze-Vorbereitung. ## Änderungen - App-, Runtime-, Export- und Print-Metadaten auf v4.0.344 aktualisiert. - Vorlagenbegriff „Lernkarten“ im aktiven Codepfad entfernt und zu „Übungsfragen“ / „Übungs- und Berichtskarten“ normalisiert. - Alte, widersprüchliche Build-Labels in app.json bereinigt. - Package-Name und Beschreibung auf v4.0.344 korrigiert. - Statische Textsuche gegen harte `expo-camera`-Abhängigkeit geprüft. - Bekannte offene Visionsteile bleiben bewusst für Beta-Freeze und Folgeetappen dokumentiert. ## Nicht geändert - Keine neue Audio-Abhängigkeit. - Keine neue Navigationslogik. - Keine neuen Popups. - Keine Store-Finalisierung ohne echte Rechts-/Datenschutzdaten. ## Nächster Schritt v4.0.345-beta-freeze: letzte konservative Runde mit Start-/Smoke-Check, Übergabe an TestFlight/Web-Vorbereitung und klarer Liste der noch offenen Langfrist-Vision.


## HANDOFF v4.0.345-beta-freeze
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.345.md

# HANDOFF v4.0.345-beta-freeze ## Status Beta-Freeze aus v4.0.344. Dieser Stand ist als sichere Übergabe- und Testbasis gedacht. ## Nicht tief geändert Die Fädenankerpunkte wurden nicht riskant umgebaut. Sebastian hat ausdrücklich notiert, dass Fäden künftig an den Seitenrändern der Formen ankern sollen. Das ist als nächster Spezialpass vorzusehen. ## Festhalten - Kinderlose Kinder als Kreise beibehalten. - Mittelpunkt-Fäden perspektivisch durch Seitenrand-Ankerpunkte ersetzen. - Kein Extrakapitel „Lernkarten“. Nur normale Übungsfragen innerhalb von Inhalt/Vorlagen. - Weiterhin SDK 54. ## Nächster Schritt v4.0.346-anchor-points: Fadenanker über Shape-Boundary-Schnittpunkte berechnen. Dabei klein anfangen: Kreisrand zuerst, dann Polygonseiten, dann Endglieder.


## HANDOFF v4.0.346-anchor-points-real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.346.md

# HANDOFF v4.0.346-anchor-points-real Basis: v4.0.345-beta-freeze-real. Ziel dieser Etappe: Fäden nicht mehr aus der Mitte ziehen lassen, sondern an den Seitenrändern der sichtbaren Form ankern. Umgesetzt: - `FamilyTetherLayer` nutzt jetzt `familyLineAnchor()` mit Seitenrandlogik. - Polygonformen: Ankerpunkt wird als nächster Punkt auf einer Polygonseite zum Ziel berechnet. - Kinderlose / kreisartige Formen: Ankerpunkt wird auf dem Kreis-/Labelrand entlang der Zielrichtung berechnet. - Fallback für einfache Rechteck-/Labelformen vorhanden. - Keine neue Abhängigkeit. - Kein tiefer Umbau der Polygon-Engine. Bewusst nicht vertieft: - Exakte Seitenauswahl pro hierarchischer Mutter-Kind-Seite. - Mehrfachfäden pro Seite. - Kollisionen zwischen parallelen Fäden. - Tonkopplung an Seitenpunkte. Nächste sinnvolle Etappe: v4.0.347-thread-refinement oder alternativ Testlauf auf Gerät, falls visuelle Anker jetzt akzeptabel sind.


## ITMO v4.0.347 – Hülle folgt Inhalt
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.347.md

# ITMO v4.0.347 – Hülle folgt Inhalt ## Schwerpunkt - Polygone sind jetzt stärker an das Label/Inhaltsobjekt gekoppelt. - Die sichtbare Hülle wird aus Labelbreite und Labelhöhe abgeleitet. - Kinderlose Knoten bleiben Kreise. - Ein-Kind-Knoten bleiben als Linien-/Kapselstruktur vorbereitet. - Fäden nutzen die neue engere Inhaltshülle als Ankerbasis. ## Bewusste Grenze Kein kompletter Router-Umbau. Kreuzungsreduktion bleibt v4.0.348. ## Nächster Schritt v4.0.348: Fadenrouting Seite-zu-Seite weiter glätten, Kreuzungen reduzieren.


## HANDOFF v4.0.348-thread-routing-real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.348.md

# HANDOFF v4.0.348-thread-routing-real Basis: v4.0.347-hull-follows-content-real. ## Geändert - FamilyTetherLayer nutzt für Fäden jetzt die sichtbare Objektform aus `compactStageGlyph`. - Leaf-/Endknoten bleiben Kreise; Fäden ankern am Kreisrand. - Ein-Kind-Objekte werden entlang der sichtbaren Linienform angedockt. - Mehr-Kind-Objekte docken an der nächstliegenden sichtbaren Polygonseite an. - Die Kurvenführung wurde reduziert und stabilisiert, damit Fäden weniger durch Formen laufen. ## Nicht geändert - Keine tiefe Reorganisation der Geometrie. - Keine neue Audio-, SVG- oder Gesture-Abhängigkeit. - Keine Änderung an der Regel: kinderlose Kinder sind Kreise. ## Nächster sinnvoller Schritt v4.0.349 Bühnenästhetik: Leuchten, Kontrast, Hüllen-Dichte, Fäden minimal heller; nur nach Sichttest von v4.0.348.


## HANDOFF v4.0.349-stage-aesthetic-real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.349.md

# HANDOFF v4.0.349-stage-aesthetic-real ## Ziel Bühne visuell enger zusammenführen, ohne den Freeze-Kern oder das Fadenrouting tief umzubauen. ## Geändert - Objekt-Hüllen dichter an den Labelinhalt gezogen. - Label-Flächen weniger kastenhaft gemacht, damit Polygon/Kreis wieder stärker als eigentliches Objekt wirkt. - Kreise, Polygonlinien und Fäden leicht heller und klarer gesetzt. - Aktive Objekte behalten mehr Leuchtkraft, passive Objekte bleiben ruhiger. - Keine neue Abhängigkeit. ## Bewusst nicht vertieft - Kein erneuter Fadenrouter-Umbau. - Keine neue Tonlogik. - Keine Änderung am Datenmodell. - Kinderlose Kinder bleiben Kreise. ## Nächster Schritt v4.0.350: Tonlandschaft oder, falls der Sichttest neue geometrische Fehler zeigt, kleine Korrekturrunde v4.0.350a.


## Handoff v4.0.350 – Idle Sound Only
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.350.md

# Handoff v4.0.350 – Idle Sound Only ## Ziel Ton ist kein dauerhafter Bühnenmodus mehr. Er gehört nur zur Ruheanimation. ## Änderungen - Tonbutton erscheint nur, wenn die Ruheanimation aktiv/bereit ist. - Button ist einfacher: nur Symbol und „Ton“, keine Distanzsignatur im Header. - Ton wird automatisch ausgeschaltet, sobald Nutzerinteraktion die Ruheanimation beendet. - Klang wird nur während `idleSoundReady` geloopt. - Keine neue Audio-Abhängigkeit. WebAudio-Fallback aus `soundEngine.js` bleibt konservativ. ## Bewusst nicht geändert - Fadenrouting aus v4.0.348. - Bühnenästhetik aus v4.0.349. - Kinderlose Kinder bleiben Kreise. ## Test 1. App starten und Bühne öffnen. 2. Direkt nach Interaktion darf kein Tonbutton sichtbar sein. 3. Nach Ruhephase beginnt organische Bewegung; Tonbutton erscheint. 4. Ton aktivieren. 5. Bühne berühren oder bewegen; Tonbutton verschwindet und Ton wird deaktiviert.


## ITMO v4.0.351 — Urkreisregel + Performance
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.351.md

# ITMO v4.0.351 — Urkreisregel + Performance ## Geändert - Kinderlose Kinder bleiben Kreise. - Knoten mit 1 Kind, 2 Kindern oder 4 Kindern werden als Viereck dargestellt. - 3 Kinder bleiben Dreieck. - Ab 5 Kindern folgt die Eckenzahl der Kinderzahl bis maximal 12. - Sichtfenster-Culling für große Maps verschärft: gerendert wird nur der sichtbare Bereich plus kleiner Rand. ## Bewusst nicht vertieft - Ton wurde nicht durch eine neue Audio-Abhängigkeit repariert. Aktuell erzeugt `soundEngine` hörbaren Klang nur dort, wo WebAudio verfügbar ist. Für iOS/Expo Go braucht die nächste Etappe eine native Audio-Schicht. - Fadenanker wurden nur indirekt durch die neue Viereckregel verbessert; vollständiges Routing bleibt Folgeetappe. ## Nächste Etappe - v4.0.352-native-idle-audio oder v4.0.352-thread-anchor-finetune, je nach Sichttest.


## ITMO v4.0.352 – Urkreisregel korrigiert
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.352.md

# ITMO v4.0.352 – Urkreisregel korrigiert ## Ziel Die Mutter-Kind-Geometrie folgt jetzt der Regel: Die Mutterform zählt sich selbst mit. ## Regeln - Kinderlose Kinder bleiben Kreise. - Mutter mit 1 Kind: Viereck. - Mutter mit 2 Kindern: Dreieck. - Mutter mit 3 Kindern: Viereck. - Mutter mit 4 Kindern: Fünfeck. - Danach: Kinderanzahl + 1, maximal 12 Seiten. ## Zusätzlich - Fadenanker verwenden jetzt die sichtbare Objekt-Hülle statt der alten Hilfs-/Layoutform. - Die Änderung ist bewusst begrenzt: Ton bleibt als offener Defekt dokumentiert. - Performance-Culling aus v4.0.351 bleibt erhalten. ## Nächste sinnvolle Etappe v4.0.353: sichtbare Fadenanker feinjustieren und Ton hörbar machen.


## ITMO v4.0.353 – Radial Family Layout
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.353.md

# ITMO v4.0.353 – Radial Family Layout Ziel: Das im Chat bestätigte Prinzip aus der GErg-Visualisierung wurde in die Geometrie übertragen. Umgesetzt: - 0 Kinder = Kreis / Endpunkt. - 1 Kind = Viereck. - 2 Kinder = Dreieck. - 3 Kinder = Viereck. - 4 Kinder = Fünfeck. - Danach: Kinderanzahl + 1 bis maximal 12 Seiten. - Erste zwei Kinder werden links/rechts zur Mutterachse verteilt statt oben/unten gestapelt. - Familienarme bekommen mehr Zug nach außen. - Arm-Länge steigt, wenn ein Kind selbst weitere Kinder hat. - Endpunkte bleiben als Kreise an den Enden. Offen: - Ton ist weiterhin als separater Defekt zu behandeln. - Fadenanker können nach Sichttest weiter verfeinert werden. - Fokus-Zoom soll später direkte Kinder stärker mit heranziehen.


## ITMO v4.0.354 anatomy body layout
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.354.md

# ITMO v4.0.354 anatomy body layout Realer Ausbau auf Basis v4.0.353. ## Schwerpunkt - Anatomie-Vorlage als Körperapparat neu angelegt. - Kopf, Wirbelsäule, Hüfte/Becken, Arme links/rechts, Beine links/rechts klar räumlich platziert. - Linke Körperseite fokussiert Knochen und Landmarken. - Rechte Körperseite fokussiert Muskeln und Nerven. - Organe werden bewusst nicht in diese Anatomie-Map gepackt; dafür ist später eine eigene Organ-Map vorgesehen. - Finger und Zehen sind als erkennbare Unterstrukturen angelegt. - Nullpunkt/erste Mitte bleibt Kreis. - Urkreisregel bleibt: Endkinder sind Kreise; Kinderknoten richten ihre Form nach der Kinderzahl. ## Nächste Sichttests 1. Anatomie-Vorlage öffnen. 2. Prüfen, ob Körperachsen sichtbar sind: Kopf oben, Wirbelsäule zentral, Becken/Hüfte unten, Arme seitlich, Beine unten. 3. Prüfen, ob linke Seite Knochen und rechte Seite Muskeln/Nerven trägt. 4. Prüfen, ob bei größerer Map nur Sichtbares flüssig bleibt. ## Offene Punkte - Ton hörbar machen bleibt offen. - Fadenanker weiter feinjustieren. - Organ-Map separat anlegen.


## HANDOFF v4.0.355 – hard form rules
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.355.md

# HANDOFF v4.0.355 – hard form rules Basis: v4.0.354. Umgesetzt: - Nullpunkt/root bleibt Kreis. - Endkinder ohne Kinder bleiben Kreise. - 1 Kind = Viereck, 2 Kinder = Dreieck, 3 Kinder = Viereck, 4 Kinder = Fünfeck, danach Kinderzahl + 1. - Layout-Knoten halten diese Regel jetzt ein; vorher wurden manuell gesetzte Layout-Knoten fälschlich über rootSides fast immer kreisförmig. - Vierecke werden waagerecht/vertikal orientiert, nicht als Diamant. - Root-Kinder: erstes rechts, zweites links, weitere danach oben/unten/radial. Offen: - Sichttest: konkrete Fadenanker an Vierecken/Dreiecken prüfen. - Danach Abstände und Ton getrennt weiterbearbeiten.


## ITMO v4.0.356 – Side Anchor Rules
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.356.md

# ITMO v4.0.356 – Side Anchor Rules ## Ziel Die Polygon-Grundregel ist jetzt zentral in `src/core/geometry.js` hinterlegt. ## Umgesetzt - Urkern/Root: Seitenzahl folgt Kinderzahl. - Ausnahme am Urkern: 1 oder 2 Kinder ergeben ein Viereck. - Nicht-Root: Vorfahr-Verbindung wird zur Seitenzahl addiert. - Endkinder ohne eigene Kinder bleiben Kreise. - Kinder ankern an Seitenmitten, nicht an Ecken. - Die Vorfahrseite wird bei der Kindverteilung ausgeschlossen. - Erste Kinder werden seitlich zur Vorfahr-Achse verteilt, danach nach außen und in Zwischenrichtungen. ## Offene Sichttests - Ob die Seitenauswahl bei sehr schmalen Vierecken ruhig genug wirkt. - Ob große Anatomie-Maps nach dem neuen Seitenanker-System besser lesbar bleiben. - Fadenanker können als nächster Schritt optisch nachgezogen werden. ## Nächster Schritt v4.0.357: Anker-/Abstands-Feinjustierung und Sichttest der Anatomie-Map.


## HANDOFF v4.0.357
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.357.md

# HANDOFF v4.0.357 Ziel: Grundregeln der Polygonlogik nicht mehr im Render-Layer brechen. Wichtig: - `src/core/geometry.js` bleibt Quelle der Seitenzahl. - `StageRenderLayers.js` darf keine konkurrierende Seitenlogik mehr erzeugen. - Endkinder = Kreise. - Anker = Seitenmitten. - Nicht-Root rechnet die Vorfahrseite mit. Nächste Etappe: v4.0.358 Abstände/Armlängen/Subtree-Gewicht.


## ITMO v4.0.358 – Subtree-Abstände und Armlängen
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.358.md

# ITMO v4.0.358 – Subtree-Abstände und Armlängen Basis: v4.0.357. Umgesetzt: - Kinder mit eigenen Nachkommen bekommen sichtbar mehr Zug nach außen. - Arm-Länge nutzt Subtree-Gewicht statt nur RelationWeight. - Endkinder bleiben kompakt und rund. - Seitenmittenanker und Vorfahrseiten-Regel bleiben unverändert. - Keine neue Abhängigkeit. Regelstand: - Urkern: Seitenzahl = Kinderzahl; 1/2 Kinder werden als Viereck stabilisiert. - Nicht-Root: Seitenzahl = Kinderzahl + Vorfahrseite. - Anker liegen auf Seitenmitten, nicht auf Ecken. - Große Maps sollen sichtbar nur die aktuelle Umgebung plus Puffer rendern. Nächster Schritt: - v4.0.359: Subtree-Kollisionen vermeiden und Anatomie-Map erneut nach Seitenlogik prüfen.


## HANDOFF v4.0.359 fixed side anchors
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.359.md

# HANDOFF v4.0.359 fixed side anchors Ziel: Fadenanker nicht mehr an Ecken und nicht wandernd entlang Seiten. Änderungen: - Fadenanker auf Polygonen werden ausschließlich als Seitenmitten berechnet. - nearest-point-on-segment wurde für Fadenanker aus dem aktiven Routing entfernt. - Birth-/Tether-/Shape-Anker verwenden die gleiche Seitenmittenlogik. - Freie Nähe-Fäden im Shard-Layer sind deaktiviert, damit keine zweite alte Fadenlogik sichtbar wird. - Kreis-Endkinder bleiben Kreisrand-basiert, weil Kreise keine Seiten besitzen. Offen: - Sichttest: Seitenmitten müssen stabil bleiben, auch während Ruheanimation/Zoom. - Danach: Anatomie-Struktur mit der nun strengeren Ankerlogik erneut prüfen.


## HANDOFF v4.0.360 - startzoom birth sweeps
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.360.md

# HANDOFF v4.0.360 - startzoom birth sweeps Ziel: Startzoom muss nicht zufällig-organisch aussehen, sondern als Nullpunkt lesbar sein. Die Geometrie wird stärker aus Hierarchie und Seitenmitten erzeugt. Regeln: - Mutterform entsteht zuerst. - Seitenmitten sind Geburtsanker. - Direkte Kinder bilden eine Familie um die Mutter. - Enkel/weitere Nachkommen bekommen mehr Arm-Länge. - Endkinder bleiben Kreise. - Alte manuelle Koordinaten dürfen die Grundregeln in der Startansicht nicht brechen. Noch offen: - Sichttest: Seitenmittenanker müssen optisch weiter geprüft werden. - Ton ist weiterhin nicht hörbar gelöst. - Anatomie-Map muss nach der stabilen Engine erneut geordnet werden.


## HANDOFF v4.0.362 - flat 2D zoom
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.362.md

# HANDOFF v4.0.362 - flat 2D zoom Ziel dieser Etappe: Tiefenzoom hart entfernen. Geändert: - Stage-Zoom auf kleinen 2D-Bereich begrenzt: 0.72 bis 1.34. - Pinch, Mausrad und Tastatur-Zoom wurden abgeschwächt. - TreeCrown-, FocusBubble- und ClusterSwallow-Transformationen im Normalmodus deaktiviert. - Zoom entscheidet nicht mehr über Generationen/Tiefe. - Sichtbarkeit erfolgt über Viewport-Culling plus kleinen Rand. - Geometrie kann tiefer laufen; das Rendering lädt trotzdem nur Sichtbares. - Organische Idle-Bewegung darf keine Tiefenordnung mehr erzeugen. Regelstand: - Eine flache 2D-Ebene. - Zoom nur, damit Labels etwas besser lesbar werden. - Ordnung entsteht aus Mutter, Seitenmitten, Kindern und Verwandtschaft, nicht aus Tiefe. Nächster Schritt: - v4.0.363: Seitenmitten und Familienabstände im flachen Modus nach Sichttest nachziehen.


## ITMO v4.0.363 – Flat Anchors / No Sound
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.363.md

# ITMO v4.0.363 – Flat Anchors / No Sound Ziel dieser Etappe: die Bühne wieder streng auf eine flache, nachvollziehbare 2D-Familienstruktur bringen. ## Änderungen - Ton vollständig aus der Stage entfernt. - `src/core/soundEngine.js` entfernt. - Kein Tonbutton mehr. - Zoom bleibt flach: - Herauszoomen ist wieder möglich, um Familien zusammenzuziehen. - Reinzoomen ist hart begrenzt und dient nur der Label-Lesbarkeit. - Fäden verwenden jetzt sichtbare Objektformen, nicht alte Weltkoordinaten. - Polygon-Fäden ankern über feste Seitenindizes an Seitenmitten. - Kreis-Endkinder ankern am Kreisrand zur Mutter hin. - Nicht-Root-Kinder wachsen bevorzugt weg vom Opa, also weg von der Vorfahrseite. - Arme wurden kompakter gemacht. - Polygone wurden etwas größer und enger an den Inhalt gelegt. ## Harte Strukturregeln - Endkinder bleiben Kreise. - Root: Seitenzahl = Kinderzahl, außer 1/2 Kinder werden als Viereck stabilisiert. - Nicht-Root: Kinder + Vorfahrseite bestimmen die Seitenzahl; Endkinder bleiben Kreis. - Fäden dürfen nicht an Ecken ankern. - Fäden dürfen nicht entlang einer Seite wandern. - Fäden dürfen nicht alte Tiefen-/Hilfsgeometrie verwenden. ## Offene Sichtprüfung - Prüfen, ob bei 3/4/5 Kindern die Fäden wirklich an sichtbaren Seitenmitten sitzen. - Prüfen, ob Anatomie nach der flachen Struktur noch zu stark alte Layoutreste enthält.


## HANDOFF v4.0.364 - mindmap clean
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.364.md

# HANDOFF v4.0.364 - mindmap clean Ziel: aktueller flacher Mindmap-Kern ohne alte Tiefenreste. Wichtige Regeln: - Endkinder sind Kreise. - Urkern: 1/2 Kinder stabil, sonst Seitenzahl nach direkter Kinderzahl. - Nicht-Root: Vorfahrseite mitzählen. - Anker sind Seitenmitten, nie Ecken. - Fäden werden in v4.0.364 aus sichtbarer Form zur sichtbaren Gegenform gewählt. - Zoom ist kein Tiefensystem mehr. Er dient nur Überblick und leichter Label-Lesbarkeit. Geändert: - FamilyTether nutzt `sideMidpointFacing` statt alter gespeicherter Seitenindex-Reste. - `projectShape` zieht Labels nicht mehr Richtung Tunnel/Fokuszentrum. - zScale im Normalpfad auf 1 gesetzt. - `freeLabels` im normalen Display ausgeschaltet. Nächster Schritt: - v4.0.365 Sichttest-Fix: Familienabstände und direkte Kindarme an Urmutter/Anatomie/GErg prüfen.


## ITMO v4.0.365 family spacing handoff
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.365.md

# ITMO v4.0.365 family spacing handoff Basis: v4.0.364. Ziel: flache Mindmap weiter ordnen, ohne neue Feature-Schicht. Änderungen: - Erste Generation enger an der Urmutter. - Kinder mit eigenen Kindern erhalten kontrolliert mehr Arm. - Subtree-Gewicht beeinflusst Abstand stärker, aber ohne Tiefenzoom. - Objektmembran etwas größer. - Keine neue Abhängigkeit. Nächster Schritt: - v4.0.366: Urmutter-Fäden und Familienanker prüfen.


## HANDOFF v4.0.367 Subtree Collision
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.367.md

# HANDOFF v4.0.367 Subtree Collision Basis: v4.0.365 family spacing. Geändert: - Subtree-Gewicht beeinflusst den Armabstand stärker. - Familien mit vielen Geschwistern bekommen zusätzlichen Abstand. - Root-Familien liegen weiter auseinander. - 2D-Flachmodus bleibt Kernregel. - Ton bleibt entfernt. Nächster Schritt: - Sichttest: direkte Fäden an Urmutter und Kindarme prüfen. - Danach Anatomie-Neuaufbau auf der flachen Struktur.


## ITMO v4.0.368 – Anatomie auf flacher Seitenanker-Struktur
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.368.md

# ITMO v4.0.368 – Anatomie auf flacher Seitenanker-Struktur ## Ziel Anatomie soll nicht mehr gegen die neue flache Mindmap-Geometrie arbeiten. Die Map bleibt auf einer Ebene, Organe bleiben ausgelagert. Der Körperapparat nutzt räumliche Hinweise nur zur Seitenwahl; die Grundregeln bleiben verbindlich. ## Geändert - Anatomie-Vorlage auf v4.0.368 markiert. - Titel der Vorlage: `Anatomie Körperapparat 2D`. - Layout-Hinweise der Anatomie werden wieder sinnvoll genutzt, aber nur für die Auswahl der Polygonseite. - Kinder werden weiterhin aus Seitenmitten geboren. - Keine Rückkehr zu freier Koordinatenplatzierung. - Knochen links, Muskeln/Nerven rechts, Kopf/Achse/Becken/Arme/Beine als Körperapparat angelegt. ## Harte Regeln - Blattknoten bleiben Kreise. - Anker liegen auf Seitenmitten. - Keine Eckenanker. - Keine Tonfunktion. - Zoom bleibt flach und billig. - Organe sind nicht Teil dieser Map. ## Offene Sichtprüfung - Anatomie im Startzoom prüfen. - Erste Fäden an der Urmutter prüfen. - Finger/Zehen auf Erkennbarkeit prüfen. - Bei Bedarf v4.0.369: Finger-/Gliedmaßen-Abstände und Armachsen nachziehen.


## HANDOFF v4.0.369
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.369.md

# HANDOFF v4.0.369 Ziel: Dreieck-/Quadrat-/Labelregeln nach Sichttest. Umgesetzt: - Dreiecksspitze bei Kindknoten zeigt weg vom Vorfahren/Zentrum. - Kinddreieck basiert auf der Rueckseite zum Vorfahren und einer eindeutigen Auswaerts-Spitze. - Vierecke werden in sichtbarer Huelle und Familienlayout als Quadrat behandelt. - Labels bekommen eine kleine Lesbarkeits-Zoomrange statt alter Tiefenlogik. Weiter: - Sichttest: Fadenanker an Urmutter und an Dreiecken. - Danach Anatomie-Finger-/Gliedmassenabstaende.


## ITMO v4.0.370 – anatomy labels/code pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.370.md

# ITMO v4.0.370 – anatomy labels/code pass Ausgangsbasis: v4.0.369_triangle_square_labels_real. Änderungen: - Keine weiteren Renderings; Code-Schritt. - Anatomie-Template neu als flache Körperapparat-Map strukturiert. - Mitte: Körperachse mit Kopf, Hals, Rumpf, Becken. - Links: Knochenlogik für Arm und Bein, mit Fingern/Zehen. - Rechts: Muskeln/Nerven für Arm und Bein. - Organe bleiben bewusst draußen und sollen später eigene Map werden. - Labels erhalten einen separaten sichtbaren Labelpunkt oberhalb der Objektmembran. - Geometrie/Fäden behalten den Objektmittelpunkt; nur Lesefläche wird nach oben gelegt. Offen: - Sichttest: Labelposition darf nicht zu weit von kleinen Kreisen wegrutschen. - Sichttest: Fäden an Urmutter/erster Generation prüfen. - Nächster sinnvoller Schritt: v4.0.371 Fadenanker-/Abstands-Fix nach echtem Screenshot.


## ITMO v4.0.371 – Fadenanker und Abstände
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.371.md

# ITMO v4.0.371 – Fadenanker und Abstände - Eltern-Kind-Fäden nutzen zuerst die festen Geometrie-Anker aus `parentAnchorOnParent` und `parentAnchorOnSelf`. - Render-Layer darf nicht mehr erneut aus Ecken, Mittelpunkt oder Labelrichtung raten. - Fadenkurven sind stabilisiert: keine Atembewegung, keine wandernden Kontrollpunkte. - Fallback-Fadenlogik bleibt nur für Altformen ohne gespeicherte Seitenanker. - Grundlage für den nächsten Anatomie-Abstandsfix.


## ITMO v4.0.372 anchor label fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.372.md

# ITMO v4.0.372 anchor label fix Basis: v4.0.371. Aenderungen: - Fadenanker werden in `Stage.projectShape` in Screenkoordinaten projiziert. - `FamilyTetherLayer` bekommt dadurch keine Weltkoordinaten mehr als Fadenpunkte. - `PolygonView` nutzt `displayLabel` fuer sichtbare Beschriftung ueber der Form. - Label-Kollisionslogik arbeitet mit `displayLabel`. Offen: - Anatomie-Abstände nach Sichttest weiter glätten. - Vorlagen jenseits Anatomie an neue flache 2D-Struktur anpassen.


## HANDOFF v4.0.374 side topology correction
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.374.md

# HANDOFF v4.0.374 side topology correction ## Ziel Harte Korrektur der Familien-Topologie nach Nutzerregel. ## Regeln - Blattknoten bleiben Kreise. - Urkern: Seitenzahl = Kinderzahl; 1 und 2 Kinder bleiben Quadrat. - Nicht-Root: Vorfahrseite zählt mit. - Kind mit 1 Kind = Quadrat. - Kind mit 2 Kindern = Dreieck, weil 1 Elternseite + 2 Kinderseiten = 3. - Seiten werden bevorzugt weg von der Oma/Vorfahrseite gefüllt. - Fäden sollen nur feste Seitenmitten verwenden. ## Wichtige Änderung Die sichtbare Hülle wird nicht mehr neu aus Labelmetrik und Rotation erzeugt. Sie übernimmt Orientierung und Seitenreihenfolge der Kerngeometrie und skaliert nur gleichmäßig um das Labelzentrum. Dadurch bleiben feste Seiten-IDs für Fäden verwendbar.


## ITMO v4.0.375 Birth Spacing Labels
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.375.md

# ITMO v4.0.375 Birth Spacing Labels Regeln: - Keine Bild-/Rendering-Artefakte im Chat. Nur Code/ZIP. - Startzoom 1.0 ist maximale Reinzoom-Stufe. - Labels sichtbar bei Zoom 1.0, Fade beim Zoom-Out. - Kind-Mutter-Abstand konstant; Knoten mit Kindern = doppelter Abstand. - Neue leere Polygone dunkelgrau. - Naechste Etappe: Zoom-Out-Clustering ohne Mutter-Aufblasen.


## ITMO v4.0.376 – Label/Cluster Clean
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.376.md

# ITMO v4.0.376 – Label/Cluster Clean ## Geändert - Keine Bilder/Renderings; nur Code-ZIP. - Labeltitel als einfacher weißer Text ohne Rahmen, ohne Symbolbar, ohne Glow. - Unbefüllte neue Polygone sind weiß statt dunkelgrau. - Stage-Zoom: Einstieg bleibt `scale=1.0` als maximale Reinzoom-Stufe. - Zoom-Out kann stärker bis zur Urmutter clustern. - Nicht-Root-Elemente verblassen beim vollständigen Cluster stärker. - Alte Tiefen-/Sichtbarkeitszoomreste weiter entschärft. ## Weiter offen - Sichttest: Fäden bei Zoom 1 und beim Zoom-Out prüfen. - Zoom-Out-Clustering fein abstimmen: 0–25 Labels verblassen, 25–50 Kinder zur Mutter, 50–75 Geschwister, 75–100 Familien. - Danach andere Stränge wieder aufnehmen.


## ITMO v4.0.377 – Root Zoom Turn
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.377.md

# ITMO v4.0.377 – Root Zoom Turn ## Geändert - Keine Bilder/Renderings; nur Code-ZIP. - `applyClusterSwallowLayout` ist jetzt tatsächlich in die Stage-Pipeline eingebunden. - Zoom-Out ist strukturabhängig: kleine Karten schließen früher, große Karten brauchen mehr Herauszoomen. - Am kompletten Zoom-Out werden nur Root-/Urmutter-Polygone gerendert. - Familien drehen beim Schlucken minimal und begrenzt um ihr Elternzentrum; kein Glow, kein zusätzlicher Render-Layer. - Labeltitel sind größer, reinweiß, rahmenlos, ohne Schatten/Glow und bei der Default-Sichtbarkeit nicht mehr künstlich auf 74% gedeckelt. - Enkel bekommen einen kleinen Außenabstand vom Großelternknoten weg; Kind-mit-Kind behält den doppelten Arm. ## Nächster Sichttest 1. Map mit wenigen Knoten: Herauszoomen soll schnell zur Urmutter führen. 2. Map mit vielen Knoten: Herauszoomen soll länger stufenweise schließen. 3. Im Startzoom müssen weiße Titel zuverlässig lesbar bleiben. 4. Enkel dürfen weiter außen wirken, ohne dass Mutter-Kind-Abstände chaotisch werden. 5. Geburt: Kind soll optisch aus der Mutterlinie heraus erscheinen. ## Weiter offen - Falls Root-only zu früh greift: `rootOnlyZoomForCount()` in `src/ui/Stage.js` leicht senken. - Falls Labels zu groß wirken: nur `labelMetricsForShape()` in `src/ui/StageRenderLayers.js` minimal zurücknehmen.


## ITMO v4.0.378 – Parent-first Swallow
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.378.md

# ITMO v4.0.378 – Parent-first Swallow ## Geändert - Grundlage: v4.0.377. - Pinch-Bewegung speichert jetzt `scaleDelta` und `direction` im `zoomFocus`. - `applyClusterSwallowLayout` nutzt die Richtung für die Generationenreihenfolge. - Beim Herausklappen/Zoom-In: Eltern kommen zuerst heraus, Kinder/Enkel danach. - Beim Schließen/Zoom-Out: Eltern werden zuerst aus der sichtbaren Ansicht genommen, Kinder folgen danach. - Ohne aktive Pinch-Richtung gilt die Herausklapp-Logik Eltern vor Kindern. - Keine Bildänderungen, keine neuen Assets, kein Glow, keine neue Abhängigkeit. ## Nächster Sichttest 1. Root-only Zustand stark herauszoomen. 2. Langsam wieder hineinzoomen: erst Eltern, dann Kinder/Enkel. 3. Wieder herauszoomen: Eltern sollen zuerst verschwinden/rollen, Kinder danach. 4. Prüfen, ob Labeltitel beim Staffelwechsel lesbar bleiben. ## Weiter offen - Falls die Richtung beim sehr schnellen Pinch flackert, `scaleDelta` glätten oder zuletzt stabile Richtung 120 ms halten. - Falls Kinder noch zu früh sichtbar werden, `parentGate` in `applyClusterSwallowLayout` etwas strenger machen.


## HANDOFF v4.0.379 hard parent complete birth
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.379.md

# HANDOFF v4.0.379 hard parent complete birth Stand: v4.0.379_hard_parent_complete_birth Ziel dieses Schritts: Beim Herausklappen dürfen Kinder nicht parallel mit dem Elternknoten entstehen. Erst muss der Elternknoten vollständig außerhalb der Mutter sichtbar sein; danach beginnen seine Kinder. Geändert in `src/ui/Stage.js`: - Open-Generationen enger und klarer gestaffelt. - Open-Dauer pro Generation reduziert. - `effectivePullForId` rekursiv ergänzt. - `hardBranchHold` verhindert, dass Fokus-/Flower-Logik Kinder sichtbar macht, bevor der Elternknoten draußen ist. Nicht geändert: - Keine neuen Bilder. - Kein Glow. - Weiße Labels bleiben. - Root-only-Zoomout bleibt. - Expo SDK 54 bleibt. Sichttest: 1. In die Map hineinzoomen/aufklappen. 2. Prüfen: Urmutter → Elternknoten vollständig sichtbar → dann erst Kinder dieses Elternknotens. 3. Bei Enkeln analog: Kind vollständig sichtbar → dann erst Enkel.


## HANDOFF v4.0.380 outer children first stable pan
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.380.md

# HANDOFF v4.0.380 outer children first stable pan Stand: v4.0.380_outer_children_first_stable_pan Ziel dieses Schritts: Die Schluck-/Geburtsreihenfolge darf nicht mehr aus alten Parent-First- oder Fokusresten kippen. Beim Schließen muss es simpel sein: äußerste Kinder zuerst rein, dann Elternteil. Beim Öffnen umgekehrt: Elternteil raus, dann Kinder. Geändert in `src/ui/Stage.js`: - `pullTiming` nutzt jetzt eine feste Generationenstufe `maxDepth - depth`. - Für Zoom-Out schließt dadurch die äußerste sichtbare Generation zuerst. - `effectivePullForId` enthält ein Kinder-Gate: Eltern-Pull wird erst freigegeben, wenn direkte Kinder praktisch drin sind. - Geschwister werden nicht mehr nach gerade sichtbarer Teilmenge sortiert, sondern nach stabilen `siblingIndex`/`siblingCount` aus der Geometrie. - Focus-Flower/Outside-Focus-Kompression wurde aus `applyClusterSwallowLayout` entfernt. - Einfinger-Pan löscht `zoomFocus`; Pinch speichert Screen- und World-Koordinaten getrennt. Nicht geändert: - Keine neuen Bilder. - Kein Glow. - Weiße Labels bleiben. - Root-only-Zoomout bleibt. - Expo SDK 54 bleibt. Sichttest: 1. Zoom-Out: äußerste Kinder gehen zuerst rein. 2. Erst danach geht der jeweilige Elternteil rein. 3. Zoom-In: Elternteil kommt vollständig raus, danach Kinder. 4. Bühne nur verschieben: Abstände innerhalb der Familie dürfen sich nicht sichtbar ändern.


## HANDOFF v4.0.381
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.381.md

# HANDOFF v4.0.381 ## Ziel dieses Schritts Die Einrollbewegung sollte nicht mehr innen nach außen kippen und keine Kinder mehr zwischen ran/weg springen lassen. ## Technische Änderung - `src/ui/Stage.js`: `applyClusterSwallowLayout` neu aufgebaut. - Einrollzustand wird richtungsfrei aus Zoomwert und Struktur berechnet. - `effectivePullForId` wartet rekursiv auf direkte Kinder: Parent-Pull = eigener Pull nur, wenn Kinder-Pull nahezu 1 ist. - Transformierte Elternpunkte werden gespeichert; Kinder übernehmen zuerst die aktuelle Parent-Translation und ziehen dann zum aktuellen Parent-Center. - Familienrotation stark reduziert und rein deterministisch gehalten. - `src/core/geometry.js`: `mapMaxDepth` und `subtreeMaxDepth` pro Shape ergänzt. ## Prüfpunkte 1. Zoom-Out: äußerste Enkel/Kinder gehen zuerst rein. 2. Erst wenn sie drin sind, geht der direkte Elternteil rein. 3. Danach erst dessen Elternteil. 4. Einfinger-Pan verändert keine Abstände und löst kein Hin-und-her-Springen aus. 5. Kein Glow, keine neuen Bilder, keine neuen Assets.


## ITMO v4.0.383 — Stage Surface Thread Finish
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.383.md

# ITMO v4.0.383 — Stage Surface Thread Finish Status: Strukturmechanik aus v4.0.382 bleibt Referenz. Dieser Stand fasst nur Feinschliff an Bühne/Faden/Label und erste Fokusraum-Kleinigkeiten an. ## Geändert - Polygone auf der Bühne werden deckend mit ihrer Füllfarbe gezeichnet. - Optische Zusatzrahmen der Bühnenpolygone sind ausgeschaltet. - Eltern-Kind-Fäden sind ungefähr dreimal dicker. - Fadenanimation ist billig: ein globaler langsamer Sinusphasenwert, eine Amplitude, keine Physik. - Fäden werden früher gesperrt, sobald das Kind praktisch in der Mutter liegt: Pull, MotionPull und ContactT greifen gemeinsam. - Zoomanzeige bleibt auf der Bühne kompakt über dem Footer. - Labels erscheinen später: etwa zwei Zoomstufen Luft zwischen ausgerollter Struktur und Label-Lesestufe. - Vorlagenkarten starten im Normalmodus ausgerollt auf Zoomstufe 10/10. - Fokusraum: Skalen haben einen sichtbaren Löschbutton. - Fokusraum: angesprungene Einträge werden stärker zur Mitte gescrollt. ## Nicht anfassen - Außen-nach-innen-Einrollmechanik aus v4.0.382. - Rekursive Eltern-/Kind-Bewegung. - Pan darf Familienabstände nicht verändern. ## Offene Promptwünsche nach diesem Stand 1. Mapvorlagen inhaltlich/geometrisch überdenken und kollisionsärmer gliedern. 2. Fokusraum-Zustände sauber fertigstellen: zu, fokussiert, edit. 3. Fokusraum-Aktionspanel unten pro Eintrag weiter vereinfachen: Farbe, Bilder, Symbole, Kindmachen, Löschen. 4. Editfelder endgültig polieren: Titelcursor vorn, grauer Vorschlag darunter, X-Verhalten, Text bleibt Linktext bis Bearbeiten. 5. Header-Zeitachse oben wiederverwenden, ohne neues Panel. ## Testcheck - Langsam herauszoomen: kein Fadenblitz, wenn Kind in Mutter liegt. - Stage öffnen: Vorlage startet ausgerollt, nicht halb eingerollt. - Labels: erscheinen später als bisher. - Fokusraum: Skalenlöschung funktioniert.


## HANDOFF v4.0.384 – zoom100 outer threads
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.384.md

# HANDOFF v4.0.384 – zoom100 outer threads Status: Bühnenstruktur aus v4.0.382/383 bleibt Referenz. Dieser Stand verändert nur Zoomverständigung, Faden-Sichtbarkeit und kompaktere Familienarme. Geändert: - Zoomanzeige: 0–100 statt 1–10. Einrollen wird auf den brauchbaren Bereich bis ca. 61% begrenzt. - Die Root-only-Vorphase wurde entfernt, damit Kinder nicht später hart in den Renderpfad springen. - Fäden werden erst sichtbar, wenn Kante-zu-Kante-Außenabstand besteht. Innenfäden werden per Hull-Test geblockt. - Familienarme/Fadenlänge global 75%. - Randbereiche blenden bis 50% Deckkraft, im Handyfenster bleibt volle Sichtbarkeit. - Zoomdebug auf Bühne auch bei Overlay-Unterdrückung sichtbar; Capture bleibt ausgenommen. Sichttest: 1. Vom weitesten Zoom langsam hinein: Kinder sollen sofort aus der Mutter herauskommen. 2. Keine Fäden innerhalb der Mutterhülle. 3. Kein Weg/Rein-Flimmern von Fäden, wenn ein Kind nahe Kontakt ist. 4. Randbereiche dürfen heller/durchsichtiger wirken, aber innerhalb des Handyfensters nicht. Nächster Schritt: Mapvorlagen kollisionsarm neu gliedern oder Fokusraum-Zustände fertigstellen.


## ITMO v4.0.387 title-label-single-source
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.387.md

# ITMO v4.0.387 title-label-single-source ## Stand Basis: v4.0.386-focus-states-panel. Dieser Schritt ist ein kleiner Stabilitätsfix vor der weiteren Fokusraum- und Zeitachsenarbeit. ## Änderungen - Doppelte Bühnenlabels nach Titeländerung im Fokusraum bereinigt. - Die aktive Polygon-Hervorhebung (`PolygonView` im `dissolveOnly`-Overlay) rendert kein eigenes Label mehr. - Die sichtbare Bühnenbeschriftung kommt dadurch nur noch aus `LabelSurfaceLayer`. - Neue leere Themen behalten den Mapnamen „Neues Thema“, aber das Urpolygon heißt „Thematik“. ## Sichttest 1. Neues Thema anlegen. 2. Urpolygon prüfen: Label „Thematik“. 3. Fokusraum öffnen. 4. Titel ändern. 5. Fokusraum schließen. 6. Bühne prüfen: genau ein Label, der eingegebene Titel. ## Weiter - Header-Zeitachse oben wiederverwenden. - Mapvorlagen kollisionsarm gliedern. - Fokusraum-Sichttest und kleine Bedienkorrekturen.


## ITMO v4.0.389 linear birth shape finish
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.389.md

# ITMO v4.0.389 linear birth shape finish Stand: stabile Bühne aus v4.0.388 plus Feinschliff. Geändert: - gleiche Formmaße: Kreis-Durchmesser entspricht Quadrat-/Dreieck-/N-Eck-Seite - sichtbare Formen nutzen echte Geometrie statt labelabhängiger Hüllen - lineare Kamerafahrten statt Cubic-Easing - Zoom-Einrollen auf 0-100, damit vollständig bis zur Urmutter geschlossen wird - Geburt per Langtipp als Rollout aus der Mutterkante - strenger Fadenrender: nur bei realer Außenlänge - billige Fadenanimation mit globaler Amplitude Nächster Schritt: - Fokusraum-Sichttest und letzte Bedienkorrekturen - Abschluss-QA / Übergabe-ZIP


## HANDOFF v4.0.390
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.390.md

# HANDOFF v4.0.390 Stand: doubletap threads focus compact. ## Stabiler Bühnenkern Die Einrollstruktur aus v4.0.382 bis v4.0.389 bleibt die Referenz. Zoom-Out rollt von außen nach innen ein. Kinder verschwinden am Kontakt in der Mutter; Fäden werden nur bei echter Außenlänge gerendert. ## Änderungen in v4.0.390 - Kind-Erstellung auf der Bühne per Doppeltipp auf Polygon. - Langtipp erzeugt keine Kinder mehr. - Fäden werden unter den Polygonflächen gerendert, damit sie nicht vor fremden Polygonen liegen. - Fäden deutlich dicker; eine globale Sinusphase animiert alle Fäden billig. - Ruheanimation aktiviert Polygone wieder gestaffelt vom Urpolygon/Zentrum nach außen. - Vorlagenkompaktierung: generische Strukturpunkte werden als Textblöcke statt als eigene Kindpolygone angelegt. - Fokusraum zeigt Skalen nur beim fokussierten Eintrag. ## Sichttest 1. Bühne öffnen. 2. Auf Polygon doppeltippen: Kind muss entstehen und linear herausrollen. 3. Fäden prüfen: dick, sichtbar, aber nicht über fremden Polygonflächen. 4. Einige Sekunden nicht interagieren: Polygone sollen nacheinander vom Zentrum aus leicht ruhen. 5. Fokusraum öffnen: nur fokussierter Eintrag zeigt Skalen und Aktionen. ## Nächster Schritt Fokusraum vollständig weiter ausarbeiten: Bedienfluss für Zustand 1/2/3, Textlink-Verhalten, Kind-/Blockaktionen, saubere Editorfelder und Autozentrierung bei jeder Auswahl.


## Handoff v4.0.392 – Focus states, sound frozen
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.392.md

# Handoff v4.0.392 – Focus states, sound frozen ## Stand Die akzeptierte Bühnenstruktur aus v4.0.391 bleibt unverändert. Ton/Sound ist auf unbestimmte Zeit aus dem aktiven Plan genommen. ## Änderungen - Fokusraum trennt die Zustände strenger: nicht fokussierte Einträge bleiben Titelzeilen. - Der aktive Textblock innerhalb des aktuellen Polygons wird separat fokussiert; nur dieser zeigt Linktext, Skalen und Aktionsleiste. - Antippen eines aktuellen Textblocks fokussiert und zentriert ihn, ohne sofort Edit zu öffnen. - Edit wird über die Edit-Aktion geöffnet. - Zeitachsen-/Sprungmarken fokussieren Textblöcke, statt sie direkt zu editieren. - Roadmap: Ton/Sound eingefroren; keine Tonbuttons, keine Audio-Abhängigkeit, keine Hörtests. ## Sichttest 1. Fokusraum öffnen. 2. Mehrere Textblöcke prüfen: nur der fokussierte Block soll aufgeklappt sein. 3. Textblock antippen: Eintrag soll in die Mitte springen und nicht sofort Edit öffnen. 4. Edit-Button drücken: erst dann Textfeld öffnen. 5. Skalen/Kind/Textblock/Löschen nur im fokussierten Eintrag prüfen.


## ITMO v4.0.393 Handoff
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.393.md

# ITMO v4.0.393 Handoff Aktiver Schwerpunkt: globaler Kopf und Fokusraum. Stand: - Sound/Ton ist auf unbestimmte Zeit eingefroren. - Die Bühne/Strukturmechanik aus v4.0.389 bis v4.0.392 bleibt maßgeblich. - Fäden sollen statisch bleiben: keine animierte Sinusphase, kein Schwingen. - ITMO-/Suchkopf bleibt als globale Orientierung über Bühne, Fokusraum und Startfenster sichtbar. - Fokusraum fährt unter diesem Kopf hoch. - Close-Button im Fokusraum heißt „Zurück zur Struktur“. - Ein fokussierter Eintrag kann durch erneutes Antippen zuklappen und bleibt in der Liste sichtbar. Nächste Schritte: 1. Fokusraum-Eingaben, Wortlinks und Editfelder final glätten. 2. Vorlagen entschlacken: Inhalte in bestehenden Polygonen sammeln, keine generischen Kinder wie Begriff/Struktur/Beispiel. 3. Zeitachsen-Code stärker mit Querformat-Bühnenzeitachse vereinheitlichen. 4. Abschluss-QA und Beta-Handoff.


## ITMO v4.0.394 – Fokusraum-Edit/Wortlinks
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.394.md

# ITMO v4.0.394 – Fokusraum-Edit/Wortlinks Stand: Fokusraum-Feinschliff auf Basis von v4.0.393. ## Erledigt - Bühnenmechanik, Fäden, Zoom und Einrollstruktur unverändert gelassen. - Ton/Sound bleibt eingefroren und ist nicht Teil des aktiven Plans. - Fokusraum: Textkörper im Editmodus hat jetzt ein eigenes X zum Leeren. - Leere fokussierte Textblöcke zeigen einen direkten, ruhigen Einstieg „Text bearbeiten“. - Wortlinks sind im Lesemodus sichtbarer, ohne den Editmodus zu öffnen. - Fokussierter Eintrag kann per unterer Aktionsleiste wieder zugeklappt werden und bleibt sichtbar. ## Nächster Schritt Vorlagen radikal entschlacken: generische Unterpunkte wie Begriff, Struktur, Beispiel, Beobachtung und Klinik nicht als unnötige Kinder erzeugen, sondern als Textblöcke/Abschnitte im sachlich passenden Polygon sammeln. Besonders Anatomie: Knochen/Muskeln/Nerven als sinnvolle Polygone, Details innen. ## Prüfen - Fokusraum: Eintrag antippen, Linktext lesen, Wort auswählen, bestehenden Wortlink anspringen. - Edit: Titel schreiben, Text leeren per X, Fertig. - Eintrag zuklappen über erneutes Antippen und über untere Leiste. - Bühne/Fäden/Zoom dürfen gegenüber v4.0.393 nicht verändert wirken.


## ITMO v4.0.395 – templates bright stage finish
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.395.md

# ITMO v4.0.395 – templates bright stage finish ## Status Bühnenstruktur aus v4.0.382 ff. bleibt als perfekte Referenz erhalten. Dieser Schritt verändert nicht die Einrollmechanik, sondern glättet Sichtbarkeit, Helligkeit und Vorlagenstruktur. ## Änderungen - Sound/Ton bleibt auf unbestimmte Zeit eingefroren. - Fäden haben keine laufende Schwinganimation mehr. Die Linie ist eine statische, billige Sinuskurve mit stabiler ID-/Index-Varianz. - Fäden erscheinen weiterhin nur bei echter Außenlänge; die Grenzschwelle wurde etwas entschärft, damit Fäden weniger weg/rein flackern. - Bühne nutzt einen helleren Grundlook, näher am schönen Vollbildzustand. - Dunkle UI-Layer von Suche, Backbutton, Zoomdebug und Vorbereitungsoverlay wurden reduziert. - Vorlagen werden nach dem Aufbau kompakter gemacht: generische Blattkinder wie Begriff, Struktur, Beispiel, Beobachtung, Definition wandern als Textblöcke ins Elternpolygon. - Anatomie: Grundglied, Mittelglied, Endglied werden beim Vorlagenaufbau in den Finger-Polygonen gesammelt, nicht mehr als eigene Labelkinder geführt. ## Nicht geändert - Keine neue Fadenanimation. - Keine Ton-/Audio-Arbeit. - Keine neue Panelwelt. - Keine Änderung an der stabilen Zoom-/Einrollstruktur. ## Nächster Schritt Fokusraum final sichten und glätten: Zustände, Aktionspanel, mittiges Scrollen, Text-/Titel-Edit und Wortlinks.


## HANDOFF v4.0.396
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.396.md

# HANDOFF v4.0.396 Stand: Fäden beim Bühnen-Pan stabilisiert. Wichtig: - Struktur-/Einrollmechanik aus v4.0.382 ff. bleibt maßgeblich. - Keine Fadenanimation mehr: Fäden sind feste Sinuskurven pro Eltern-Kind-ID. - Beim Pan/Gesten wird Idle-/Ruhebewegung für sichtbare Shapes ausgesetzt, damit Fäden nicht gegen bewegte Polygone wackeln. - Ton/Sound ist auf unbestimmte Zeit eingefroren. Nächste sinnvolle Schritte: 1. Fokusraum final sichten und Bedienkorrekturen. 2. Vorlagen weiter entschlacken, besonders Anatomie/GFK/Befundung. 3. Abschluss-QA und Übergabe-ZIP.


## HANDOFF v4.0.397 – Stage Render Cleanup
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.397.md

# HANDOFF v4.0.397 – Stage Render Cleanup ## Stand Ausgangspunkt war v4.0.396. Die Bühne war visuell nah am Ziel, aber der Renderpfad enthielt noch viele deaktivierte Alt-Layer. Diese Schicht wurde in v4.0.397 bewusst verschlankt, ohne Fokusraum- oder Datenmodellfunktionen umzubauen. ## Wichtigste Änderung `src/ui/StageRenderLayers.js` rendert jetzt einen geschützten Stack: 1. `FamilyTetherLayer` 2. `LightPolygonStructureLayer` 3. `GravityPullLayer` 4. `LabelSurfaceLayer` 5. `GravitySnippetLayer` 6. ausgewählte Polygon-Dissolve-Hülle Fäden liegen damit zuverlässig unter den Polygonflächen und Labels liegen darüber. Alte Deko-/Bloom-/Birth-/Atmosphäre-Layer werden nicht mehr als versteckte Komponenten mitgerendert. ## Fäden Die Fäden sind jetzt vollständig statisch. Die Kurve wird stabil aus Eltern-Kind-ID und Tiefe erzeugt. Keine laufende Sinusphase, keine Schwinganimation, keine Pull-basierte Kurvenänderung. Zoom und Einrollen verändern nur Endpunkte und Sichtbarkeit. ## Nicht angefasst - Außen-nach-innen-Einrollstruktur. - Doppeltipp-Kind-Erstellung. - Fokusraum-Zustände. - Ton/Sound bleibt eingefroren. - SDK 54 und Expo-Go-Kompatibilität bleiben. ## Nächster sinnvoller Schritt Fokusraum-Komponentenschnitt: `FocusHeader`, `FocusTimeline`, `FocusEntry`, `FocusEntryActions`, `EditField`, `ScaleRow`. Ziel: weniger monolithischer Fokusraum und sichere Bedienkorrekturen.


## ITMO v4.0.398 – Straight Threads / Bright Stage
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.398.md

# ITMO v4.0.398 – Straight Threads / Bright Stage ## Status Dieser Schritt korrigiert die zuletzt gewünschte Bühnenänderung vor dem Fokusraum-Komponentenschnitt. ## Änderungen - Normale Bühne: nur gerade Fäden. - Vollbild/Clean-Stage: Sinus-/Wellenfäden bleiben erlaubt und dürfen leicht animieren. - Fadenkurven werden im Arbeitsmodus nicht mehr durch Pan/Zoom neu sichtbar verändert. - Bühnenhintergrund stärker aufgehellt. - Suchkopf, Suchfeld und Suchchips deutlich transparenter, damit die Bühne nicht abgedimmt wirkt. - Ton/Sound bleibt eingefroren und ist nicht Teil des aktiven Plans. ## Nicht angefasst - Außen-nach-innen-Einrolllogik. - Doppeltipp-Kind-Erstellung. - Fokusraumlogik, abgesehen von keinem Eingriff. - Vorlagenkompaktregel. ## Nächster Schritt v4.0.399: Fokusraum-Komponenten sauberziehen: FocusHeader, FocusTimeline, FocusEntry, FocusEntryActions, EditField, ScaleRow.


## ITMO v4.0.399 – Handoff
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.399.md

# ITMO v4.0.399 – Handoff ## Ziel dieser Version Diese Version schließt eine Ordnungsrunde ab: Die Bühne soll im Normalbetrieb so ungefiltert und kräftig wirken wie im Vollbild, die Fokusraum-Kinderbedienung wandert an eine ruhigere Stelle unten, und Vorlagen werden stärker als sinnvolle Inhaltspolygone statt als generischer Labelwald aufgebaut. ## Wichtige Festlegungen - Ton/Sound bleibt auf unbestimmte Zeit eingefroren. - Normale Bühne: gerade Fäden, keine Schwinganimation. - Vollbild/Clean-Stage: Sinus-/Wellenfäden dürfen sichtbar sein. - Fäden liegen im Renderstack unter Polygonflächen. - Kindererstellung auf der Bühne läuft per Doppeltipp. - Bei Doppeltipp-Geburt muss das neue Kind sichtbar herauskommen; bestehende Kinder dürfen nicht als Ersatz-Geburt wirken. - Bühne soll nicht durch UI-Overlays abgedunkelt wirken. ## Geänderte Kernbereiche - `src/ui/Stage.js`: Doppeltipp-Kind-Erstellung übergibt einen Snapshot der bisherigen Geschwisterpositionen. - `src/ui/StageRenderLayers.js`: Birth-Rollout stabilisiert vorhandene Geschwister und bindet die sichtbare Geburt an die neue Child-ID. - `src/ui/FocusRoom.js`: Kinderpanel unten am fokussierten Eintrag ergänzt. - `src/ui/StageSearch.js`: Header-/Suchflächen weiter entdunkelt. - `src/core/model.js`: Vorlagen-Kompaktregel V399 verschärft. - `src/core/templates/definitions.js`: Neurobefund aus der sichtbaren Vorlagenliste entfernt. - `src/core/templates/chapterTemplatesV214.js`: WM-2026-Vorlage als einfacher Gruppen-Spielplan neu formuliert. ## Prüfen auf Gerät 1. Bühne normal öffnen: Helligkeit gegen Vollbild vergleichen. 2. Doppeltipp auf Polygon: neues Kind muss herauskommen, nicht ein altes Geschwisterkind. 3. Bühne pannen: gerade Fäden dürfen nicht wackeln. 4. Fokusraum öffnen: fokussierter Eintrag zeigt Kinderpanel unten. 5. Anatomie-/Fachvorlagen prüfen: wiederholte Detailwörter sollen als Text im Polygon liegen, nicht als Bühnenkinder. 6. Vorlagenliste prüfen: Neurobefund darf nicht mehr als direkte Vorlage auftauchen. 7. WM 2026 öffnen: Gruppen als Polygone, Spielzeilen mit Ergebnisfeld. ## Bekannte Restthemen - Fokusraum-Komponenten können noch weiter in einzelne Dateien zerlegt werden. - Import/Export sollte als nächster harter Qualitätsblock folgen. - Vorlagen können fachlich weiter gefüllt werden, aber strukturell sollte die Kompaktregel erhalten bleiben.


## ITMO v4.0.400 – Fokusraum-Komponentenschnitt
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.400.md

# ITMO v4.0.400 – Fokusraum-Komponentenschnitt ## Ziel Der Fokusraum wird schrittweise entkoppelt, damit weitere Bedienfeinheiten nicht mehr direkt in der großen `FocusRoom.js` landen. Bühne und Fäden bleiben geschützt. ## Codeänderungen - Neu: `src/ui/focus/FocusEntryActionBar.js` - Neu: `src/ui/focus/FocusChildPanel.js` - Neu: `src/ui/focus/FocusTimelineAxis.js` - `FocusRoom.js` importiert diese Bausteine und enthält die alten lokalen Varianten nicht mehr aktiv. - Dead Code um die alte Inline-Kinderliste und alte Bottom-Aktionsleiste entfernt. ## Bewusst nicht verändert - Stage/Bühne - Gerade Arbeitsfäden - Sinus-/Wellenfäden nur im Vollbild/Clean-Stage-Pfad - Zoom- und Einrollmechanik - Doppeltipp-Kind-Geburt - Vorlagen-Kompaktregeln - Sound/Ton bleibt eingefroren ## Testpunkte 1. Fokusraum öffnen. 2. Eintrag antippen: fokussieren und mittig halten. 3. Unten am fokussierten Eintrag: Aktionen sichtbar. 4. Kinderpanel unten am Eintrag prüfen. 5. Zeitachse oben antippen und Sprung prüfen. 6. Bühne kurz bewegen: Fäden/Bühne dürfen unverändert stabil bleiben. ## Nächster sinnvoller Schritt v4.0.401: Fokusraum-Editfeld weiter auslagern und Import/Export/Print-Textformat härten.


## HANDOFF v4.0.401 – viewport centered idle fullscreen
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.401.md

# HANDOFF v4.0.401 – viewport centered idle fullscreen ## Ziel dieses Schritts Die Bühne soll beim Pannen ruhiger wirken. Sichtbarkeit und Renderlimit folgen jetzt dem Bildschirmmittelpunkt statt alten Baumgewichten. Außerdem dürfen Faden-/Polygon-Ruhebewegungen nur im Vollbild starten. ## Änderungen - `Stage.js` - `fullscreenStage` als feste boolesche Stage-Zustandsgröße eingeführt. - `applyIdleOrganismMotion()` läuft nur noch, wenn `fullscreenStage` aktiv ist und die Idle-Intensität sichtbar wird. - Performance-Profil bekommt `idleActive` nur noch bei echter Vollbild-Idle-Bewegung. - Stage-Tint nutzt wieder die ungefilterte Farbmischung, keine zusätzliche Vivid-Aufhellung. - `filterWorldShapesForProjection()` priorisiert bei großen Karten nun den Viewport-/Handymittelpunkt. - `filterShapesForZoom()` priorisiert ebenfalls Bildschirmzentrum und sichtbare Elemente statt alte Baumgewichte. - `filterConnectedVisibleShapes()` entfernt sichtbare Kinder nicht mehr nur wegen unsichtbarer Eltern. - `StageRenderLayers.js` - Sinus-/Wellenfäden nur noch im Vollbild und erst bei Idle. - Normale Bühne bleibt bei geraden Fäden ohne Animation. - `StageSearch.js` - Header-/Suchflächen weiter entdunkelt und transparenter gestellt. ## Nicht geändert - Doppeltipp-Kind-Geburt bleibt wie in v4.0.399/v4.0.400. - Einrollstruktur von außen nach innen bleibt unverändert. - Fokusraum-Komponentenschnitt bleibt erhalten, wurde aber in diesem Schritt nicht weiter ausgebaut. - Ton/Sound bleibt auf unbestimmte Zeit eingefroren. ## Erwarteter Sichttest 1. Bühne normal öffnen. 2. Zu äußeren Randstrukturen pannen. 3. Erwartung: Sichtbarkeit baut sich um den Handy-Mittelpunkt herum auf und schiebt nicht mehr halb vor dem Finger her. 4. Normalbühne: gerade Fäden, keine Sinusbewegung, keine Polygon-Ruhebewegung beim Arbeiten. 5. Vollbild nach Ruhezeit: Sinusfäden und sanfte Polygonruhe dürfen starten. 6. Beim Wechsel in Vollbild keine spürbare Helligkeitssprünge durch zusätzliche Filter. ## Nächster sinnvoller Schritt Fokusraum weiter entflechten: `EditField`, `ScaleRow` und Text-/Wortlinklogik als eigene Komponenten auslagern. Danach Import/Export/Print härten.


## HANDOFF v4.0.402 – label center / short root zoom
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.402.md

# HANDOFF v4.0.402 – label center / short root zoom ## Ausgangspunkt v4.0.401 war akzeptiert als viewportzentrierte Sichtbarkeitsrunde mit normaler Bühne ohne Idle-Bewegung und Vollbild-Idle separat. ## In v4.0.402 geändert - Bühnenlabels werden nicht mehr oberhalb der Polygonhülle positioniert. - `displayLabel` liegt auf dem Objekt-/Polygonmittelpunkt. - Labeltextfarbe wird aus der Polygonfarbe aufgehellt abgeleitet; aktive Labels bleiben weiß. - Der Mindestzoom im Stage-Component ist nun map-/strukturabhängig: `stageMinZoom = rootOnlyZoomForCount(shapeCount)`. - Pinch, Web-Wheel, Tastaturzoom und Zentrierungen nutzen `stageMinZoom`, damit der Nutzer nicht über den fertigen Urmutter-Zustand hinaus in eine tote Shrink-Phase zoomen muss. - Ein Guard hebt alte zu tiefe Viewzustände auf den aktuellen `stageMinZoom`. ## Nicht verändert - Keine Fadenanimation in der normalen Bühne. - Gerade Fäden im Arbeitsmodus. - Sinus/Wellenfäden nur Vollbild/Idle. - Doppeltipp-Kind-Geburt bleibt wie v4.0.399/400/401. - Fokusraum-Komponentenstand bleibt v4.0.400/401. - Ton/Sound bleibt eingefroren. ## Sichttest 1. Normale Bühne öffnen. 2. Labels prüfen: zentriert im Polygon, farblich passend, lesbar. 3. Langsam herauszoomen: Nach vollständigem Einrollen darf keine lange Phase kommen, in der die Urmutter noch weiter kleiner wird. 4. Pan/Zoom prüfen: Fäden bleiben gerade und ruhig.


## HANDOFF v4.0.403 edge threads
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.403.md

# HANDOFF v4.0.403 edge threads Basis: v4.0.402_label_center_short_zoom. ## Geändert - Fäden werden nicht mehr nur dann gezeichnet, wenn beide verbundenen Polygone vollständig im sichtbaren Renderkern liegen. - Sichtbare Randknoten ziehen direkte Eltern- und Kindpartner in Projektions- und Renderpfad. Dadurch können Fäden aus dem Bildschirmrand hinauszeigen. - Fäden bleiben trotzdem blockiert, wenn Mutter/Kind innen oder im Kontakt liegen. - Normale Bühne: gerade Fäden, keine Fadenanimation. - Vollbild-/Idle-Sonderlogik nicht verändert. - Ton bleibt auf unbestimmte Zeit eingefroren. ## Prüfen 1. Bühne seitlich an eine Familie schieben. 2. Wenn ein sichtbares Polygon eine Verbindung zu außerhalb hat, soll der Faden Richtung Rand sichtbar bleiben. 3. Wenn ein Kind eingerollt/in Kontakt ist, darf kein Innenfaden blitzen. 4. Pan darf Fäden nicht wackeln lassen.


## ITMO v4.0.404 – Focus edit / scale / word components
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.404.md

# ITMO v4.0.404 – Focus edit / scale / word components ## Status v4.0.404 ist eine Fokusraum-Entflechtungsrunde. Die angenommene laufende Bühne aus v4.0.403 wurde nicht funktional verändert. ## Geändert - Neue Komponente: `src/ui/focus/FocusEditField.js` - Editmodus für Titel und Textkörper ausgelagert. - Titelfeld: leerer Einstieg, alter Titel hellgrau darunter, X zum Leeren. - Wiki-Wort-Abfrage bleibt im Editfluss verfügbar. - Neue Komponente: `src/ui/focus/FocusScaleRow.js` - Skalenzeile ausgelagert. - Plus/Minus, Name/Wert-Bearbeitung und Löschen bleiben erhalten. - Neue Komponente: `src/ui/focus/FocusWordText.js` - Lesetext/Wortlinks ausgelagert. - Bestehende Links springen weiter, neue Wörter können weiter markiert und als Polygone angelegt werden. - `FocusRoom.js` orchestriert jetzt stärker nur noch Zustand, Scroll/Zentrierung und Datenrouten. ## Nicht verändert - Bühne - Fäden - Zoom/Einrollen - Labels - Doppeltipp-Kind-Geburt - Vorlagenstruktur - Ton bleibt eingefroren ## Prüfpunkte 1. Fokusraum öffnen. 2. Eintrag antippen: fokussierter Zustand, Text lesbar, Wortlinks aktiv. 3. Bearbeiten antippen: Titelfeld leer, alter Titel hellgrau, Textfeld darunter. 4. X im Titel-/Textfeld prüfen. 5. Skala hinzufügen, Wert ändern, Name bearbeiten, Skala löschen. 6. Kinderpanel unten am fokussierten Eintrag prüfen. 7. Bühne gegenprüfen: Fäden, Pan, Zoom, Labels unverändert. ## Nächster sinnvoller Schritt Import/Export/Print härten oder zunächst Fokusraum-Sichttestkorrekturen nach Gerätetest.


## ITMO v4.0.405 – Bühnenhelligkeit / Übergabe
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.405.md

# ITMO v4.0.405 – Bühnenhelligkeit / Übergabe ## Status v4.0.405 ist ein Übergabe- und Bühnenhelligkeits-Fix auf Basis von v4.0.404. Ziel war: farbige Bühne minimal ruhiger/dunkler, aber keine verdunkelnde Schicht über Struktur, Fäden oder Labels. ## Geändert - Bühnenhintergrund nutzt jetzt `calmStageColor()` statt ungefiltertem Rohfarbwert. - Die Farbe wird direkt als Hintergrundfarbe gesetzt und leicht mit Dunkelgrün/Schwarzgrün gemischt. - Es gibt dadurch keine halbtransparente Abdunkel-Folie über Polygone, Fäden oder Labels. - `StageCameraBackground` nutzt ohne Foto/Kamera keinen schwarzen Grundlayer mehr, sondern transparenten Hintergrund. - Stage-Suche/Header-Panels wurden weiter entdunkelt; sie sollen lokale UI bleiben und nicht wie ein grauer Gesamtfilter wirken. - Fokusraum, Fäden, Zoom/Einrollen, Labels, Doppeltipp-Geburt und Vorlagenlogik wurden funktional nicht verändert. - Ton/Sound bleibt eingefroren. ## Wichtig für den nächsten Chat - Der aktuelle stabile Stand ist v4.0.405. - Bühne/Fäden/Zoom gelten als grundsätzlich angenommen, nur echte Fehler korrigieren. - Normale Bühne: gerade Fäden, keine Fadenanimation, keine Polygonruhe. - Vollbild/Idle: Sinus-/Wellenfäden und Polygonruhe dürfen dort laufen. - Fäden dürfen zum Bildschirmrand laufen, wenn ein verbundenes Polygon außerhalb liegt. - Labels sitzen mittig über dem Polygonzentrum. - Zoomanzeige ist 0–100; tote Zoom-Out-Restphase wurde gekürzt. - Sound/Ton nicht anfassen, bis Sebastian es ausdrücklich reaktiviert. ## Nächste sinnvolle Arbeit 1. Fokusraum auf Gerät sichten und kleine Bedienkorrekturen machen. 2. Import/Export/Print härten. 3. Vorlagen erneut praktisch testen: Anatomie, Befundung, GFK, WM-Spielplan, Gefühle, Bedürfnisse. 4. ZIP-Handoff weiterhin bei jedem Schritt liefern. ## Prüfpunkte - Normalbühne und Vollbild dürfen keine Helligkeitssprünge mehr zeigen. - Die Bühne darf farbig ruhig wirken, aber Struktur/Fäden/Labels dürfen nicht durch eine globale Folie gedämpft sein. - Doppeltipp auf Polygon erzeugt ein neues Kind, nicht ein altes neu öffnendes Geschwister. - Pan darf Fäden nicht wackeln lassen. - Fokusraum: zu/fokussiert/edit prüfen, Kinderpanel unten prüfen, Skalenlöschung prüfen.


## ITMO v4.0.406 – Bühnenstruktur wie Vollbild
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.406.md

# ITMO v4.0.406 – Bühnenstruktur wie Vollbild ## Status v4.0.406 setzt auf v4.0.405 auf und korrigiert den verbliebenen Helligkeitsunterschied zwischen Arbeitsbühne und Ruhe-/Vollbild. ## Geändert - Sichtbare Polygone starten in der normalen Projektion jetzt mit 100% Struktur-Opacity. - Die alte Rand-/Tiefenabdunklung der Bühnenstruktur ist abgeschaltet. - `screenEdgeFade()` gibt für den Bühnenrenderpfad keinen Abdunkelwert mehr zurück. - Fäden übernehmen keine Randabdunklung mehr; sie behalten dieselbe Helligkeit wie im Vollbild. - Geburt und Zoom-/Einrollanimationen dürfen weiterhin temporär ausblenden, weil deren `zOpacity` erst nach der Projektion entsteht. - Hintergrund, Fokusraum, Vorlagen, Import/Export und Ton wurden nicht angefasst. ## Prüfpunkte - Arbeitsbühne öffnen und direkt mit Ruhe-/Vollbild vergleichen: Polygone/Fäden/Labels dürfen keinen dunkleren Arbeitsmodus-Look mehr haben. - Struktur bis an den Bildschirmrand bewegen: keine künstliche Abdunklung an Randpositionen. - Zoom-Out/Einrollen prüfen: Kinder dürfen weiterhin verschwinden, aber nicht wegen Arbeitsmodus-Dimmung. - Fäden zum Rand prüfen: gleiche Helligkeit wie innere Fäden, solange die Verbindung gerendert wird. ## Weiter Nächster sinnvoller Schritt: Sichtprüfung auf Gerät. Wenn die Bühne jetzt passt, Fokusraum/Bedienfehler weiterhärten.


## ITMO v4.0.407 – Stage Veil Fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.407.md

# ITMO v4.0.407 – Stage Veil Fix ## Zweck Die normale Bühne war sichtbar dunkler als der Ruhe-/Vollbildmodus. Ursache war nicht die Polygonfarbe, sondern ein UI-Schleier aus dem Bibliotheks-/Footer-Layer. ## Geändert - `src/ui/LibraryPanel.js`: `backdropVeil` wird nur noch gerendert, wenn `windowOpen` wahr ist. - Der geschlossene Footerzustand legt keine vollflächige Abdunklung mehr über die Bühne. - `backdropVeil` bei geöffnetem Fenster reduziert: `rgba(0,0,0,0.42)` → `rgba(0,0,0,0.18)`. ## Nicht geändert - Bühne/Geometrie/Fäden/Labels aus v4.0.406 bleiben erhalten. - Sound/Ton bleibt deaktiviert. ## Sichttest 1. App öffnen, Bibliothek schließen, Bühne betrachten. 2. 60 Sekunden bis Ruhe-/Vollbildmodus warten oder entsprechenden Pfad nutzen. 3. Helligkeit der Polygonstruktur vergleichen. Normalbühne darf nicht mehr dunkler sein als Vollbild.


## HANDOFF v4.0.408 – focusroom cleanup
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.408.md

# HANDOFF v4.0.408 – focusroom cleanup ## Ziel Fokusraum entschlackt: weniger Nebenbuttons, keine automatisch wiederkehrenden Standardskalen, Wiki direkt in den Text, Titel getrennt vom Textkörper. ## Geändert - Standardskalen werden nicht mehr automatisch erzeugt oder beim Normalisieren wiederhergestellt. - `Urskala`-Defaults werden aus normalisierten Maps entfernt; sinnvolle benannte Skalen bleiben erhalten. - Skalen können vollständig gelöscht werden; es wird keine Ersatzskala mehr erzeugt. - Skalenbearbeitung läuft über den Text auf dem Balken; der separate Editbutton neben der Skala ist entfernt. - Fokus-Aktionsleiste reduziert: Palette, Skala hinzufügen, Textblock hinzufügen, Kind erzeugen, Löschen. - Rückgängigbutton, separater Editbutton und Zuklappbutton aus der Fokus-Aktionsleiste entfernt. - Kinderpanel unter Themeneinträgen entfernt; Kind-Erzeugung bleibt genau einmal als Button erhalten. - Titelsymbole links neben den Einträgen entfernt; Titel werden in Kreisfarbe dargestellt. - Auf-/Zuklapp-Chevron für Einträge sitzt rechts neben dem Titel. - Titelbearbeitung ist vom Textkörper getrennt; der Textkörper enthält keinen Titel-` - `-Prefix mehr. - Wiki wird aus der Titelbearbeitung direkt geholt, ohne Zwischenfenster. - Wiki-Text wird unter vorhandenen Text angehängt. - Wenn der aktuelle Wiki-Eintrag gerade eingefügt wurde, erscheint im Titel-Edit ein durchgestrichenes Wiki-Symbol; Antippen entfernt genau diesen eingefügten Wiki-Block wieder. - Wiki-Abruf nutzt jetzt MediaWiki-`extracts` für Volltext statt REST-Summary. Der Text wird aus Performancegründen bei 18.000 Zeichen gekappt. ## Nicht angefasst - Bühne, Fäden, Zoom/Einrollen, Labelpositionen und Sichtbarkeitslogik wurden nicht verändert. - Ton/Sound bleibt eingefroren. ## Check - `node --check App.js`: ok. - `node --check` für alle JS-Dateien unter `src`: ok.


## ITMO v4.0.409 – Fokusraum Vollbild / Layout- und Inhaltsbereinigung
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.409.md

# ITMO v4.0.409 – Fokusraum Vollbild / Layout- und Inhaltsbereinigung Basis: v4.0.408_focusroom_cleanup. ## Umsetzung - Fokusraum öffnet vollflächig über der Bühne. Die Bühnenstruktur bleibt darunter nicht sichtbar. - Bottom-Sheet-Optik im Fokusraum entfernt: kein runder oberer Rand, kein Rahmen-/Schattenlook. - Zurück-Button größer und mit mehr Abstand gesetzt. - Polygonliste breiter und ruhiger: weniger Rahmen, horizontale Linien, dezente linke Farbkante. - Editor-Öffnung scrollt den aktiven Eintrag oben sichtbar an und wiederholt den Sprung nach kurzer Verzögerung gegen Tastatur-Layoutwechsel. - Aktionsleiste rechtsbündig: Bearbeiten/Fertig, Wiki, Farbe, Skala, Kind, Löschen. - Fertig im Editmodus ist ein grünes Häkchen. - Wiki liegt in der Buttonleiste. Wenn ein Wiki-Block gerade eingefügt wurde, wird das Wiki-Symbol durchgestrichen und löscht diesen Block wieder. - Farb-/Bild-/Symbolfenster öffnet unter dem Text. - Bild-Hinweistext neben dem Plus entfernt; daneben stehen nur noch Symbole. - Textblock-Button entfernt. - Worttext zeigt keinen zusätzlichen Bearbeiten-Schriftbutton mehr. ## Inhaltsbereinigung - Kapitelimport erzeugt keine Urskala und keinen Titelpräfix mehr. - Normalisierung entfernt doppelte sichtbare Titelpräfixe im Textkörper (`Titel - Text`, `Titel: Text`). - Exakte Mutter-Kind-Doppeltitel werden zusammengeführt, damit nicht direkt unter einem gleichnamigen Kapitel nochmals derselbe Titel als Unterkapitel erscheint. - Bestehende gespeicherte Maps werden über `normalizeMap()` beim Laden mitbereinigt. ## Nicht verändert - Bühne, Fäden, Zoom, Labelpositionen und Bühnenhelligkeit. - Ton/Sound bleibt eingefroren. - SDK 54 bleibt. ## Checks - `node --check App.js` - `node --check` für alle JS-Dateien unter `src`


## ITMO v4.0.410 – Fokusraum-Flusspass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.410.md

# ITMO v4.0.410 – Fokusraum-Flusspass Basis: v4.0.409_focusroom_fullscreen_cleanup. ## Ziel Den Fokusraum nach dem Vollbild-Umbau weiter nutzerfreundlich machen: weniger Struktur oben, weniger doppelte Überschriften, stabileres Scrollen beim Bearbeiten und mehr freier Raum um Zurück sowie Polygonliste. ## Änderungen - `FocusTimelineAxis` wird im Fokusraum nicht mehr gerendert. Die eigentliche Fokusliste bleibt die zentrale Navigation. - Fokusraum-Scroll nutzt `removeClippedSubviews={false}`, damit große Listen mit Textfeldern und Systemtastatur stabiler bleiben. - Beim aktiven Editziel wird bei Keyboard-Öffnung und Keyboard-Framewechsel erneut zum aktiven Eintrag gescrollt. - `stripDuplicateTitleLead()` entfernt jetzt auch identische Titelzeilen am Textanfang, nicht nur `Titel -` oder `Titel:`. - Fokusliste erkennt doppelte Eltern-Kind-Titel über den Pfad und zeigt solche Untereinträge als `Ergänzung`, statt denselben Titel nochmals zu wiederholen. - Der sichtbare Textkörper entfernt zusätzlich doppelte Titelzeilen aus dem Anfang des Textes. - Mehr Abstand um Zurück und Polygonpanel; Rahmen bleiben weitgehend horizontale Linien. ## Nicht verändert - Bühne, Bühnenhelligkeit, Fäden, Zoom, Geburt, Vorlageninhalte und Ton/Sound. - Expo SDK bleibt 54. ## Testpunkte 1. GERG/Befund-Vorlage öffnen und besonders Kapitel wie „Mensch und Betätigung“ auf doppelte Überschriften prüfen. 2. Einen Eintrag bearbeiten: Tastatur öffnen und prüfen, ob der Themenblock sichtbar oben bleibt. 3. Farbe öffnen: Palette/Bild/Symbole sollen unter dem Text erscheinen. 4. Wiki in der rechten Leiste holen und über durchgestrichenes Wiki wieder entfernen. 5. Große Vorlage scrollen: keine Hänger durch versteckte Textfelder.


## HANDOFF v4.0.417
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.417.md

# HANDOFF v4.0.417 Aktueller Pfad: Fokusraum-Stabilisierung. Wichtig: - v4.0.417 baut auf v4.0.416 auf. - Fix enthält einen echten JSX-Bundling-Fix in `src/ui/focus/FocusEntryActionBar.js`. - Fokusraum-Autoscroll ist weiter reduziert. Editstart darf einmal nach oben ausrichten, danach soll manuelles Scrollen Vorrang haben. - Keine Bühnenlogik geändert. Nächster Test: 1. App starten. 2. Fokusraum öffnen. 3. Eintrag bearbeiten. 4. Tastatur öffnen lassen. 5. Danach manuell scrollen und prüfen, ob der Fokusraum ruhig bleibt. 6. Rechte Iconleiste prüfen: Bearbeiten/Fertig, Wiki, Farbe, Skala, Kind, Löschen.


## Handoff v4.0.466
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.466.md

# Handoff v4.0.466 Nicht die Kind-Erzeugung anfassen. Sie funktioniert über mapweit eindeutige Kindtitel. Anatomie: Root = Kopf/Schädel. Erstes Kind = Hals/HWS. Negative Layout-Y-Differenz ist in dieser Anatomievorlage die sichtbare Richtung nach unten/Boden. Diese Regel nicht wieder invertieren. Nächste Prüfung: Kopf oben, Hals darunter, Thorax darunter, Becken darunter, Beine/Füße unten; Symbole weiß, ruhig und zentriert.


## HANDOFF v4.0.468-vector-inheritance
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.468.md

# HANDOFF v4.0.468-vector-inheritance Status: erster sauberer Vektor-Pass nach den Anatomie-Screenshots. Geändert: - src/core/geometry.js nutzt `plannedDirection` vor `layout`, wenn Kind-Slots gewählt werden. - `plannedDirection` und `growthAngle` sind Teil des Geometry-Cache-Keys. - Neue Helper: `directionKeyToVector`, `vectorFromAngleDeg`, `plannedVectorForChild`. Wichtig: - Keine Geburts- oder Anatomie-Sonderregel. - Polygonseiten bleiben Ankerpunkte. - Die Richtung entscheidet nur, welche Seite zuerst passend ist. - Alte Koordinaten dürfen nicht mehr gegen die geplante Wuchsrichtung gewinnen. Nächster Test: 1. Anatomie Knochen öffnen. 2. Ausrollen/Orbit prüfen. 3. Körperachse muss lesbar nach unten laufen: Kopf, Hals/HWS, Thorax, Becken/LWS. 4. Untere Extremitäten müssen vom Becken weg nach unten/außen weiterlaufen, nicht nach oben über das Becken springen. 5. Bei freier Kind-Erzeugung prüfen, ob neue Kinder weiterhin ohne Kamera-Sprung entstehen. Offen: - Falls Beine noch zu dicht am Footer landen: nur Arm-/Skalierungspass, nicht Richtungslogik ändern. - Label-Priorität über Symbolen bleibt als nächster Feinschliff offen.


## Handoff v4.0.477 – Promptgenerator / Paste-Import / Label-Freeze
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.477.md

# Handoff v4.0.477 – Promptgenerator / Paste-Import / Label-Freeze ## Status Dieser Stand baut auf v4.0.476 auf. Bullauge und Anatomie bleiben stabil. Am Familienfeld wurde nicht grob weitergedreht. Geändert: - Startseite: neuer Sparkles-Button neben Import öffnet den Promptgenerator. - Promptgenerator: Eingaben für Thema, Tiefe, Strukturtyp und Besonderheiten; Ausgabe als markierbarer Prompt für reine ITMO-Kapitel-TXT. - Paste-Import: erzeugte TXT kann direkt eingefügt und ohne Datei-Picker importiert werden. - Kapitelimport übernimmt optionale Metadatenzeilen: `plannedDirection`, `color`, `symbol`. - App.js nutzt `parseImportedMapText` direkt für Paste-Import. - Bühnenlabels: weißer Text ohne Rahmen/Box, passend zur zuletzt gesetzten Labelregel. - Versionsdaten in `package.json` und `app.json` auf v4.0.477 gesetzt. ## Unverändert lassen - Keine Sonderregeln für Geburt, Anatomie, LWS, Kompass oder einzelne Vorlagen. - Bullauge bleibt Fokusfeld: Familie in Bildschirmmitte öffnet, Außenfamilien klappen zu. - Ton/Sound bleibt pausiert. - SDK 54 bleibt gesetzt. ## Nächste sinnvolle Schritte 1. v4.0.477 in Expo Go testen: Appstart, Kompass, Anatomie, Promptgenerator, Paste-Import. 2. Wenn sauber: WM-Gewinnerbaum visuell prüfen und nur bei echtem Versatz leicht in der Templateplanung nachschärfen. 3. Danach Promptgenerator erweitern: Strukturtyp-Chips statt Freitext und optional Farbhints/Symbolhints. 4. Danach Importparser erweitern, wenn plannedDirection/Farbe/Symbol aus Text zuverlässig maschinenlesbar übernommen werden sollen.


## ITMO v4.0.537 — Promptimport Guardrails
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.537.md

# ITMO v4.0.537 — Promptimport Guardrails ## Ausgangspunkt Basis war v4.0.536. Dateiimport, Promptgenerator und direkter Promptimport waren bereits getrennt sichtbar. ## Ziel dieser Etappe Der Promptimport sollte weniger spröde werden. Der häufigste Fehler ist, dass noch der erzeugte Prompt in der Zwischenablage liegt, nicht die ChatGPT-Antwort. Diese Situation sollte vor dem eigentlichen Parser erkannt werden. ## Änderungen In `src/ui/LibraryPanel.js` wurde `classifyPromptImportClipboard` ergänzt. Die Funktion prüft leere Zwischenablage, offensichtlichen Prompttext, sichtbare Kapitelüberschriften, exportierte ITMO-Blöcke und reparierbare bare Antworten mit `plannedDirection`. Der direkte Startbutton `Promptimport` und der `Promptimport` im Promptgenerator nutzen jetzt dieselbe Vorprüfung. Bei einem kopierten Prompt erscheint die klare Meldung `Noch der Prompt`; bei leerer Zwischenablage bleibt `Antwort fehlt` erhalten. In `App.js` behandelt `doImportText` jetzt `source: 'prompt'` wie einen Prompt-/AI-Import. Direkt importierte ChatGPT-Antworten erhalten also ebenfalls `aiGenerated`, `aiTopic`, `aiImportSource` und das Root-Symbol. Der Undo-/History-Text lautet dafür `Promptimport` statt `Paste-Import`. ## Nicht geändert Kompass-Ringgeometrie aus v4.0.535 und Familienkreise aus v4.0.534 wurden nicht fachlich verändert. Dateiimport, TestFlight-Konfiguration, Anatomie und Ton wurden nicht fachlich verändert. Ton bleibt pausiert. ## Prüfung `node --check App.js` und `node --check src/ui/LibraryPanel.js` liefen nach der Änderung ohne Syntaxfehler. Danach wurde der gesamte JS-Bestand erneut per `node --check` geprüft. `package.json`, `app.json` und `eas.json` wurden als JSON geprüft. ## Nächster Test Auf dem Gerät zuerst bewusst den Prompt selbst kopieren und `Promptimport` antippen. Erwartung: Meldung `Noch der Prompt`. Danach eine echte Kapitel-TXT-Antwort kopieren und importieren. Erwartung: neue Map wird geöffnet und als Promptimport/AI-Import markiert.


## ITMO v4.0.547 – Template Copy & Render Filter
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.547.md

# ITMO v4.0.547 – Template Copy & Render Filter Status: Stabilisierung nach v4.0.546. Geändert: - Systemvorlagen-Copy-Workflow ergänzt: Kompass, Anatomie, Gefühle und Bedürfnisse können als eigenes Thema kopiert werden. - Maximal ein Duplikat pro Systemvorlage. Bei erneutem Kopieren erscheint ein Hinweis und das bestehende Duplikat kann geöffnet werden. - Eigene Kopien werden als `template-copy` gespeichert und erscheinen in der normalen Themenliste. Die Systemvorlagen selbst bleiben aus der Themenliste herausgefiltert. - Start-Statistik und Liste löschen bleiben unten sichtbar. Die Statistik ist wieder als kompakter Block eingebunden. - Familienkreis-Rendering repariert: kein Zugriff auf `depth` vor Definition. - Außenrendering verschärft: weniger Offscreen-Struktur, direkte Randanbindung bleibt, aber lange Außenfäden werden reduziert. Nicht geändert: - Promptimport bleibt über Import neben der Suche. - AI bleibt über Vorlage. - Ton/VR bleiben geparkt. Nächster Schritt: - Bullauge/Randfäden am Gerät prüfen. Danach Intro/Icon oder Inhaltsverbindungen beginnen.


## ITMO v4.0.548 Bullauge Edge Thread Release Prep
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.548.md

# ITMO v4.0.548 Bullauge Edge Thread Release Prep ## Status v4.0.548 setzt auf v4.0.547 auf und zieht die Bühnenlesbarkeit weiter zusammen. Schwerpunkt war nicht neues Feature, sondern Bullauge/Randfäden/Familienkreise stabilisieren. ## Geändert - Bullauge-Fokus ist etwas breiter und außen straffer. Außenfamilien werden stärker als Paket zur Mutter gezogen, damit Kinder am Rand nicht mit unnötig langen Fäden hängen bleiben. - Fäden sind auf eine kürzere maximale Screenlänge begrenzt. Beidseitig weit außerhalb liegende Fäden werden verworfen. - Familienkreise werden nach Erzeugung nochmals als nicht überlappende Auswahl gefiltert. Dadurch werden weniger schwebende oder ineinanderlaufende Kreise angezeigt. - Langtipp-Zentrierung nimmt den sichtbaren Knoten nahe der Bildschirmmitte als Ziel. Das unterstützt saubere Foto-/Insta-Aufnahmen. ## Nicht geändert - Vorlagenliste bleibt: Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. - Systemvorlagen-Copy-Workflow bleibt aus v4.0.547 erhalten. - Ton und VR bleiben Parkmodule. - Intro/Icon sind noch nicht final eingebaut, weil dafür die extern erzeugten Bilder fehlen. ## Nächster Schritt v4.0.549: Intro-/Icon-Integration vorbereiten, sobald Bildmaterial da ist; sonst Release-Putz und tote Pfade reduzieren.


## ITMO v4.0.577 – hull center black pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.577.md

# ITMO v4.0.577 – hull center black pass Fortsetzung auf Basis von v4.0.576. Ziel war nicht Feature-Ausbau, sondern Korrektur der sichtbaren Bühnengeometrie nach den aktuellen Hüllen-, Kreis- und Bullauge-Regeln. ## Geändert - Bühnenhintergrund ist hart schwarz. Der grüne Stage-Wash ist deaktiviert. - Bildschirmmitte ist wieder die echte Mitte: `STAGE_CENTER_Y = 0.500`. - Aktive Rand-Einrollung ist aus dem Renderpfad entfernt. - Aktiver Swallow-/Cluster-Filter ist aus dem Renderpfad entfernt. - Kerngeometrie und Renderer nutzen dieselbe Hüllenregel nach eigenen Kindern: - 0 eigene Kinder: 16-Eck als Kreis-Sonderform. - 1 oder 2 eigene Kinder: Viereck. - 3 eigene Kinder: Dreieck. - 4 eigene Kinder: Viereck. - 5 bis 16 eigene Kinder: n-Eck. - Elternverbindung zählt nicht mehr als sichtbarer Hüllengrund. Kinderlose Kinder werden dadurch nicht mehr automatisch Vierecke. - Hüllen werden wieder als ruhige Außenform hinter dem Kreis gezeichnet, ohne Ring-Cutout-Abhängigkeit. - Der Vordergrundkreis füllt innen schwarz und verhindert, dass die Hüllenfüllung den Innenkreis abdunkelt. - Familienkreise sind sichtbarer, aber dünner: weiße Kontur mit ungefähr halber Deckkraft. - Kompass-/Geburtsrichtung im Kern erhält die geplante Richtung stärker, statt unnötig auf alte Achsen reduziert zu werden. - `stageBackgroundColor` und `hullStrokeForShape` bleiben entfernt. ## Validierung - `node --check` für `App.js`, `src/**/*.js`, `scripts/**/*.js` und `scripts/**/*.mjs` bestanden. - Preflight-Metadaten sind auf v4.0.577 angehoben. - Im Sandbox-System fehlen lokale `node_modules`; deshalb kann Expo-Autolinking dort nicht vollständig laufen. Auf dem Entwicklungsrechner nach `npm install` bitte `npm run preflight` erneut ausführen. ## Nächster Test 1. App starten. 2. Kompass öffnen: Kinderlose Kinder müssen rund beziehungsweise 16-eckig bleiben, nicht viereckig. 3. Sonne/GFK importieren: 3 Kinder ergeben Dreieck, 4 Kinder Viereck, 5+ n-Eck. 4. Innenkreise prüfen: keine abgedunkelten Innenflächen. 5. Bühne bewegen: keine Rand-Einroll-/Ausrollbewegung, keine verschluckten Familien. 6. Queransicht prüfen: Mittelpunkt bleibt echte Bildschirmmitte.


## ITMO v4.0.633 - ground-truth-stage-rebuild
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.633.md

# ITMO v4.0.633 - ground-truth-stage-rebuild Status: radikaler Neuaufbau der Bühnen-Projektionskette. ## Was geändert wurde - Die bisherige Patch-Kette aus Hemisphere-Cloth, Fokusfeld, Hysterese, Fremdfamilienverschiebung, Rand-Einrollen und Render-Swallow ist im aktiven Renderpfad deaktiviert. - Stage.js nutzt nach der Welt-zu-Screen-Projektion keine zweite Lage mehr, die Knoten nach Bildschirmmitte, Suchfeld, Rand oder Fokusfamilie verschiebt. - Gravity-/Search-Pull verschiebt keine Knoten mehr; dadurch kann die Suchleiste keine geometrische Drift mehr auslösen. - `projectShape()` setzt den sichtbaren Mittelpunkt wieder auf den projizierten Weltmittelpunkt. Labelgröße verändert nicht mehr die Knotenposition. - `visualCircleRadius` ist hart `34`. - StageRenderLayers zeichnet den Vordergrundkreis deckend in Knotenfarbe. Keine schwarzen Innenflächen. - `familyCircleRadiusForParent()` folgt wieder der stabilen Regel: geringste eigene Kinderzahl unter den direkten Kindern bestimmt den Grundradius. ## Warum das gemacht wurde Die Screenshots zeigten keine kleine Polygonabweichung, sondern eine instabile Projektionsarchitektur: gleiche Struktur, aber andere Lage relativ zur festen Mittelachse. Deshalb wurde nicht weiter an Einzelankern gepatcht, sondern der gesamte nachträgliche Deformationspfad entfernt. ## Testplan 1. App starten, gleiche Map öffnen, nichts berühren: Struktur darf nicht springen. 2. Suche sichtbar lassen: Suchfeld darf die Knoten nicht verschieben. 3. Mehrfach auf dieselbe Familie zentrieren: Knoten dürfen relativ zueinander nicht kippen. 4. Kette Elternteil → Kind → Enkel prüfen: Seitenanker müssen an der gezeichneten Hülle sitzen. 5. Knoten mit 0 Kindern: Kreis-Sonderform. 6. Knoten mit Elternverbindung und 1 Kind: Quadrat-Hülle hinter gleich großem Vordergrundkreis. 7. Knoten mit Elternverbindung und 4 Kindern: Fünfeck-Hülle hinter gleich großem Vordergrundkreis. ## Bekannte bewusste Entscheidung Die schöne Bullauge-Drapierung ist vorerst ausgeschaltet. Erst wenn die Grundgeometrie stabil ist, darf eine optische Betonung wieder als rein lokale Skalierung ohne Positionsverschiebung zurückkommen.


## ITMO v4.0.634 – Stage Geometry Circle/Hull Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.634.md

# ITMO v4.0.634 – Stage Geometry Circle/Hull Pass Ziel: Nach dem stabilen Ground-Truth-Bühnenstand v4.0.633 wurden die nächsten vier Geometriepunkte umgesetzt, ohne die wieder stabile Bühnenarchitektur anzufassen. ## Geändert 1. Familienkreise sichtbar - FamilyCircleLayer ist wieder aktiv. - Ein Kreis pro sichtbarem Knoten. - Familienknoten nutzen `shape.familySelfRadius`. - Blattknoten nutzen den festen Vordergrundkreisradius. - Darstellung: dünn, weiß, gestrichelt, ca. 50% Deckkraft. - Keine Kollision, keine Layoutwirkung, keine Kamera-/Drapierungslogik. 2. Kreis als Vordergrundkörper - Der feste Kreisradius bleibt der eigentliche sichtbare Knoten. - Kreis-Sonderform erzeugt keinen zweiten größeren Außenkreis mehr. 3. Polygonhülle als Außenring - Polygonhüllen werden nicht mehr vollflächig unter dem Kreis gefüllt. - Der Render nutzt jetzt einen Even-Odd-Ring: außen Polygon, innen ausgeschnittener Kreis. - Dadurch bleibt der Kreis als Vordergrundform optisch sauber. 4. Fadenlängenregel - Standard Mutter-Kind-Abstand = Familienradius der Mutter. - Kind mit eigener Familie = 2x Familienradius der Mutter. - Geschwister-Kollision kann den Abstand nur nach außen verlängern, nicht nach innen verkürzen. ## Nicht geändert - Keine Rückkehr zu Pinch. - Keine Rückkehr zu Focus-Field. - Keine Rand-Einrolllogik. - Keine nachträgliche Screen-Rezentrierung. - Keine Suchleisten-/Footer-abhängige Weltverschiebung. ## Testziel Test 1: Dieselbe Map öffnen, Suche sichtbar lassen, Bühne bewegen. Struktur darf nicht springen. Test 2: Kind mit 0 Kindern muss als gleich großer Kreis erscheinen, ohne größeren Außenkreis. Test 3: Kind mit 2 eigenen Kindern muss Dreieck-Hüllenring um denselben Kreis zeigen. Test 4: Kind mit 4 eigenen Kindern muss Fünfeck-Hüllenring um denselben Kreis zeigen. Test 5: Familienkreise müssen sichtbar sein, aber keine Position verändern.


## HANDOFF v4.0.635-stage-anchor-gap-pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.635.md

# HANDOFF v4.0.635-stage-anchor-gap-pass Ausgangspunkt v4.0.634: Bühne springt nicht mehr. Nutzer bestätigt Stabilität. Dreieckgröße darf bleiben. Änderungen: 1. Parent-Child-Familien mit eigener Unterfamilie nutzen jetzt mindestens parentFamilyRadius + childFamilyRadius + FAMILY_CIRCLE_PADDING als Abstand. Dadurch sollen die gestrichelten Familienkreise nicht mehr exakt aneinanderstoßen. 2. Hüllenseitenanker werden nicht mehr über Geschwisterindex erzwungen. Für sichtbare Fäden wird die Hüllenseite gewählt, die tatsächlich in Richtung Ziel zeigt. 3. Vordergrundkreis bleibt über der Hülle und erhält eine sehr feine helle Kontur. Keine schwarze Innenkontur, keine Abdunklung. Prüfung: - Bühne darf weiter nicht springen. - Dreieckgröße soll unverändert wirken. - Fäden von Dreieck/Fünfeck sollen an der Zielseite austreten, nicht aus einer falschen Seitenzuordnung. - Familienkreise sollen einen kleinen Abstand zeigen statt Mittelpunkt-Berührung.


## HANDOFF v4.0.636-inner-ring-anchor-cleanup
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.636.md

# HANDOFF v4.0.636-inner-ring-anchor-cleanup Ausgangspunkt v4.0.635: Nutzer bestätigt: läuft ohne Springen. Dreieckgröße darf bleiben. Änderungen: 1. Der helle Innenkreis in Polygonhüllen wurde deaktiviert. 2. Der Knoten bleibt als ein deckender Vordergrundkörper lesbar; Polygonhülle bleibt dahinter. 3. Die Ankerlogik bleibt auf sichtbare Zielseiten ausgerichtet. Keine erneute Kamera-/Bühnenlogik angefasst. Prüfung: - Bühne darf weiter nicht springen. - In Dreieck/Quadrat/Fünfeck darf kein schwacher Innenring mehr sichtbar sein. - Dreieckgröße bleibt unverändert. - Fäden sollen weiterhin von der sichtbaren Zielseite kommen.


## ITMO v4.0.640 — 9max geometry cap and stable refinement
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.640.md

# ITMO v4.0.640 — 9max geometry cap and stable refinement Basis: v4.0.639. User decision: 16 connections are too much for the app. New stable maximum is 9 connections. Implemented: - Global geometry cap moved to 9 connections. - Root nodes can keep up to 9 direct children. - Attached nodes can keep up to 8 direct children, because the parent connection counts as one connection. - Hull sides are capped at 9. - Kompass calibration reduced from 16 to 9 stable directions. - Import prompt and import repair switched from 16max/12 target to 9max. - Stage hull renderer caps visible polygon sides at 9. Do not reintroduce 16-family geometry. Current goal is polishing the stable 9-connection layout.


## HANDOFF v4.0.643 — bullauge_variant_module
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.643.md

# HANDOFF v4.0.643 — bullauge_variant_module Ziel: Bullauge nicht mehr als versteckte Layoutlogik behandeln, sondern als explizite Darstellungsvariante über der stabilen Map-Geometrie. ## Fest übernommen - Max 9 Verbindungen pro Knoten bleibt App-Regel. - Bullauge/Bildschirm: alle direkten Fäden gleich lang. - Bullauge/Bildschirm: keine Sonderbehandlung für Kind mit Kindern. - Bullauge/Bildschirm: keine Kollisionsvermeidung, Überlappungen erlaubt. - Print/Druck: bleibt separat und darf Hierarchieabstände sowie Kollisionsabstände nutzen. ## Code Neue Datei: - `src/core/bullaugeDisplayVariants.js` Enthält: - `take-one-equal-thread-bullauge` als aktive Bullauge-Variante. - `idea-two-soft-lens` als geparkte zweite Variante. - `idea-three-orbit-pane` als geparkte dritte Variante. - `print-hierarchy-distance` als getrennte Print-Spezifikation. Integration: - `src/core/geometry.js` liest `viewport.bullaugeVariant`, `viewport.displayVariant` oder `map.bullaugeVariant`. - Ohne Angabe wird `take-one-equal-thread-bullauge` verwendet. - Cache-Key enthält die Darstellungsvariante. - Shapes tragen `bullaugeVariantV643` zur Diagnose. ## Nicht verändert - Keine neue Kamera-/Springlogik. - Keine Bullauge-Wölbung aktiviert. - Keine Elastik aktiviert. - Keine neue Kollisionskorrektur im Bullauge. - Print-Geometrie bleibt separat. ## Test 1. Bühne öffnen. 2. Struktur mit Kind an Kind öffnen. 3. Im Bullauge muss Kind mit Kindern auf gleichem Radius bleiben wie Blattkind. 4. Keine Sonderabstände. 5. Print später separat testen.


## HANDOFF v4.0.644 – visible bullauge screen warp
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.644.md

# HANDOFF v4.0.644 – visible bullauge screen warp Status: Take One Bullauge is now rendered visibly on screen. Changed: - Added `applyTakeOneBullaugeScreenWarp` in `src/ui/Stage.js`. - The Bullauge variant is no longer only a geometry/display-rule module. - The screen render now applies a radial lens around the fixed screen center. - Logical map coordinates, family radii, print layout, and relation data are not changed. - No child-with-children distance exception is reintroduced. - No collision correction is reintroduced. - Faden anchors are warped with the nodes so anchors stay attached visually. Rules preserved: - Max 9 connections per node. - Bullauge: equal direct thread lengths. - Print: separate hierarchy/spacing treatment. - No stage jumping, no render recentering. Test: 1. Open a map with at least two generations. 2. Pan slowly through screen center. 3. Nodes near the center should visibly bulge outward / feel larger. 4. Children with children must remain at the same logical radius as leaf children. 5. Fäden must remain attached during the warp.


## HANDOFF v4.0.645 – strong bullauge visibility test
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.645.md

# HANDOFF v4.0.645 – strong bullauge visibility test Basis: v4.0.644_visible_bullauge_warp. Ziel dieser Etappe: Der Bullaugen-Effekt darf nicht mehr nur technisch vorhanden sein, sondern muss im Screenshot sofort sichtbar werden. Diese Version ist bewusst ein überzeichneter Teststand, keine Endkalibrierung. Geändert: - `src/ui/Stage.js`: `applyTakeOneBullaugeScreenWarp` deutlich verstärkt. - Lens-Radius von `shortSide * 0.82` auf `shortSide * 0.94` erweitert. - Positionsdruck `maxPush` von `0.32` auf `0.78` angehoben. - Positionsfaktor darf jetzt bis `1.78` wachsen; v4.0.644 wurde hier noch durch `1.32` begrenzt. - Randberuhigung `outerSettle` von `0.055` auf `0.02` reduziert. - Knotengröße steigt in der Mitte jetzt bis ungefähr `1.46`. - `visualCircleRadius` darf bis `90` wachsen, damit der Test nicht künstlich gedeckelt wird. - Familienkreise bekommen jetzt `familyScale` aus derselben Bildschirm-Linse. - `StageRenderLayers.js`: Clamp-Grenzen für `sizeScale` und `familyScale` erweitert, damit der Render-Layer den Effekt nicht wieder abschneidet. Wichtig: - Die Welt-/Map-Geometrie wird nicht verändert. - Die Bullauge-Wölbung ist weiterhin reine Bildschirmprojektion. - Print/Layout bleibt getrennt. - Der Effekt soll beim Verschieben der Bühne mit der Bildschirmmitte wandern. Testziel: 1. Knoten nahe Bildschirmmitte müssen sichtbar größer sein. 2. Familienkreise nahe Bildschirmmitte müssen sichtbar größer/gewölbter sein. 3. Außenbereiche sollen vergleichsweise normal bleiben. 4. Beim Verschieben der Struktur darf die Vergrößerung nicht am Knoten kleben, sondern muss an der Bildschirmmitte kleben. Nächster Schritt nach Sichttest: - Falls zu stark: Endkalibrierung auf circa `maxPush 0.35–0.50`, `sizeScale 1.20–1.30`, `familyScale 1.15–1.25`. - Falls immer noch zu schwach: Render-Reihenfolge oder doppelte Normalisierung prüfen.


## HANDOFF v4.0.646 – position dominant bullauge
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.646.md

# HANDOFF v4.0.646 – position dominant bullauge Basis: v4.0.645_strong_bullauge_visibility_test. ## Änderung Der starke Sichttest hatte bewiesen, dass das Bullauge funktioniert, erzeugte aber Kollisionen und geschmolzene Polygone. v4.0.646 verschiebt die Gewichtung: Der Effekt entsteht jetzt überwiegend durch Positionswölbung um die Bildschirmmitte. Die Knotenkörper werden nur leicht größer. ## Code Datei: `src/ui/Stage.js` Funktion: `applyTakeOneBullaugeScreenWarp` - `maxPush` auf 0.88 gesetzt, damit die Positionswölbung deutlich bleibt. - `sizeScale` auf maximal 1.18 begrenzt. - `familyScale` auf maximal 1.30 begrenzt. - Lokale Punkte/Edges werden um den gewölbten Ursprung stabil transformiert, statt alle Punkte unabhängig durch die Linse zu schicken. - `bullaugeWarp.mode`: `take-one-position-dominant-v646`. ## Test 1. Map verschieben. 2. Der Effekt muss weiter an der Bildschirmmitte kleben. 3. Polygone dürfen nicht mehr geschmolzen wirken. 4. Knoten dürfen weniger ineinanderlaufen. 5. Familienkreise dürfen sichtbar atmen, aber nicht mehr die Bühne zerreißen. ## Erwartung Bullauge sichtbar, aber kontrollierter. Falls noch zu stark: `maxPush` auf 0.70–0.78 senken. Falls zu schwach: `familyScale` bis 1.34 erhöhen, Knotengröße aber nicht wieder stark erhöhen.


## HANDOFF v4.0.647-aligned-hull-bullauge
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.647.md

# HANDOFF v4.0.647-aligned-hull-bullauge Ausgang: v4.0.646 position-dominant Bullauge. Ziel: Polygonhüllen dürfen im Bullauge verformen, aber sauber ausgerichtet bleiben. Gemeint sind die sichtbaren Polygonhüllen, nicht die gestrichelten Familienkreise. Umsetzung: - In `src/ui/Stage.js` wurde `applyTakeOneBullaugeScreenWarp` erweitert. - Neue lokale Funktion `transformHullPoint`: verformt Hüllenpunkte entlang der Radialachse vom Bildschirmzentrum zum Knoten und der dazu senkrechten Tangentialachse. - Keine freie Punktwolken-Verformung: Seitenreihenfolge und Polygonkörper bleiben zusammenhängend. - Hüllenverformung ist nach Verbindungszahl gedämpft: 3+ voll, 2 halb, Kreis fast stabil. - `StageRenderLayers.js`: Familienkreisradius nimmt `bullaugeWarp.familyScale` mit. Prüfung: - App starten, beliebige importierte Map öffnen. - Map so verschieben, dass unterschiedliche Knoten durch die Bildschirmmitte laufen. - Erwartung: Hüllen werden in der Mitte sichtbar weicher/räumlicher, aber nicht mehr geschmolzen. - Fäden sollen erkennbar zu den sichtbaren Hüllenseiten passen. Nächster sinnvoller Schritt: Falls noch Fäden durch Hüllenkörper laufen, muss der Thread-Endpunkt nach der finalen v647-Hüllenprojektion per Ray/Polygon-Schnitt neu gesetzt werden.


## ITMO v4.0.650 – Footer-Ansichtenbutton
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.650.md

# ITMO v4.0.650 – Footer-Ansichtenbutton ## Änderung - Im Footer wurde ein eigener Ansichtenbutton eingefügt. - Der Button sitzt vor dem echten Print-Button und schaltet die Bühnenansicht weiter. - Reihenfolge: Bullauge → Printansicht → Zeitansicht → Frei → Bullauge. - Auf iOS/Android ohne Web-Timeline fällt die Reihenfolge Bullauge → Printansicht → Bullauge/Frei zurück, weil Timeline mobil wie bisher nicht erzwungen wird. - Der Wechsel fährt die Kamera weich auf den passenden Fit der neuen Ansicht. ## Technisch - `LibraryPanel` zeigt den neuen Footerbutton mit dynamischem Label/Icon. - `App.nextDisplayMode` kennt jetzt `printPreview`. - `Stage` baut bei `printPreview` die Geometrie mit `geometryMode: print`. - Bullauge-Warp wird in `printPreview` deaktiviert, damit die Printansicht als klare Vergleichsansicht dient. ## Test 1. Footer öffnen. 2. Ansichtenbutton antippen. 3. Prüfen: Bullauge und Printansicht wechseln sichtbar, aber ohne harten Sprung. 4. Print-Button rechts bleibt weiterhin echter Druck/Export.


## ITMO v4.0.651 – Aligned Hull Point Warp
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.651.md

# ITMO v4.0.651 – Aligned Hull Point Warp Basis: v4.0.650_footer_ansichten_button. Ziel dieser Etappe: Polygonhüllen im Bullauge nicht nur punktweise verformen, sondern vor dem Warp sinnvoll ausrichten. Änderungen: - `src/ui/Stage.js`: `applyTakeOneBullaugeScreenWarp` erweitert. - Neue Vorstufe `alignHullBeforeWarp`: passende Hüllenseite wird zur Mutterrichtung ausgerichtet. - Root-/freie Knoten orientieren sich radial zur Bildschirmmitte. - Danach läuft der vorhandene Polygonpunkt-Warp aus v4.0.649 weiter. - Fadenanker werden wieder auf die gewarpte Hüllenseite projiziert. - Kreis-/Knotengrößen bleiben gedämpft, damit die Bullauge-Wirkung primär in den Beziehungshüllen sitzt. Testfokus: 1. Bullauge-Ansicht öffnen. 2. Quadrat, Dreieck und Hexagon in die Bildschirmmitte ziehen. 3. Hüllen müssen sichtbar arbeiten und sich geordneter zur Mutter/Fadenrichtung ausrichten. 4. Printansicht gegenprüfen: Ansichtenbutton darf weiter weich wechseln. 5. Keine Render-Errors. Bekannter Prüfpunkt: Wenn Hüllen noch zu wenig ausrichten, den Begrenzungswinkel in `alignHullBeforeWarp` von ±60° auf ±90° erhöhen.


## HANDOFF v4.0.654 – Gentle Hull Size Polish
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.654.md

# HANDOFF v4.0.654 – Gentle Hull Size Polish Ziel: den guten Stand aus v4.0.653 nicht umbauen, sondern zart bereinigen. Geaendert: - `src/ui/Stage.js` - `contentHullPoints()` nutzt jetzt eine einheitlichere Grundgroesse fuer Kreis, Quadrat, Dreieck und N-Eck. - Die sichtbare Huelle wird nicht mehr aus Labelbreite/Textlaenge aufgeblasen. - Bullauge-Groessenskalierung wurde reduziert; Fokus bleibt vor allem ueber Huelle/Position spuerbar. - `visualCircleRadius` wird enger geklemmt, damit der Kreis-Kern stabil bleibt. - `src/ui/StageRenderLayers.js` - Lange Labels erhalten mehr Labelbreite und leicht reduzierte Schriftgroesse. - `package.json` - Version/Description aktualisiert. Nicht geaendert: - Ansichtenbutton bleibt wie v4.0.650. - Kompass-Rekursion-Fix bleibt wie v4.0.653. - Huellenausrichtung/Point-Warp bleibt aktiv. - Keine Liquid/Blob-Verfluessigung in diesem Schritt, um den guten Stand nicht zu zerstoeren. Test: 1. Bullauge: Kreis, Quadrat, Dreieck und Fuenfeck nebeneinander pruefen. Der Grundkoerper soll aehnlich gross wirken. 2. Printansicht: Familien weiterhin sauber und nicht aufgeblasen. 3. Kompass: oeffnet ohne Rekursion. 4. Anatomie: Rechtecke/Quadrate duerfen nicht mehr dominant groesser als Kreise wirken.


## ITMO v4.0.657 – Soft Hull Stability Pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.657.md

# ITMO v4.0.657 – Soft Hull Stability Pass Stand: 24.06.2026 ## Ziel Aufbauend auf v4.0.655 wurde kein Architekturumbau gemacht, sondern ein vorsichtiger visueller Feinschliff an der Bühne. ## Änderungen - Dreieck-Hüllen optisch größer kalibriert. - Viereck-Hüllen optisch kleiner und leichter kalibriert. - 5er- bis 9er-Hüllen minimal harmonisiert. - Polygonhüllen bekommen sehr sanft weichere Ecken, ohne ihre Seitenzahl zu verlieren. - Kreis-Hüllen werden beim Bullauge nicht mehr wie normale Polygone nachrotiert. - Hüllenrotation ist gedämpft und auf einen engeren Winkelbereich begrenzt, damit beim Bewegen weniger Eigenrotation sichtbar wird. - Punktraster auf Schwarz wirkt organischer: etwas gröber, deterministisch leicht versetzt, am Fokus farbiger, am Rand ruhiger. ## Bewusst nicht verändert - Bullauge-/Print-Umschalter. - Fadenlängen. - Familienkreislogik. - Kompass-Rekursionsfix. - Ordnersystem/Startbereich/Intro noch nicht umgesetzt. ## Testpunkte 1. Schnee/Logo: Kind 10 und große N-Ecke müssen weniger dominant wirken. 2. Anatomie: große Vierecke sollten etwas leichter wirken. 3. Dreieck: muss nicht mehr kleiner wirken als Kreis/Viereck. 4. Beim Bewegen: Kreise sollen nicht sichtbar um die eigene Achse mitdrehen. 5. Hintergrund: Raster soll weniger technisch und weniger aufdringlich wirken. ## Status Bühne bleibt im Poliermodus. Nächste sinnvolle Etappe: Anker/Kollisionen und danach Start-/Intro-/Ordnersystem.


## HANDOFF v4.0.658
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.658.md

# HANDOFF v4.0.658 Ziel: Bühnenfinish ohne Architekturumbau. Geändert: - Dreieck/Viereck-Massen finaler kalibriert. - Weichere Hüllen, keine Blob-Logik. - Rotationsdämpfung gegen sichtbares Mitdrehen. - Fokus-Raster organischer und farblich näher an Fokus/Knoten. - Fäden mit weicherem Farbverlauf. Nicht angefasst: - Bullauge-Grundlogik. - Printansicht. - Familienkreis-Grundlogik. - Intro/Ordnersystem. Test: - Gefühle, Anatomie, Kompass und Schnee in Bullauge/Print prüfen. - Besonders Dreieck/Viereck und Eigenrotation beim Verschieben beachten.


## HANDOFF v4.0.659 triangle-hull-regression-fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.659.md

# HANDOFF v4.0.659 triangle-hull-regression-fix Ziel: den sichtbaren 3er-Hüllenfehler beheben, ohne die tragende Bühnenarchitektur umzubauen. Geändert: - `contentHullFromBasePoints` erzeugt sichtbare Hüllen für 1–9 Seiten jetzt immer über `contentHullPoints`. - Alte Basis-/Layoutpunkte werden nicht mehr als sichtbarer Körper zurückprojiziert. - Dreiecksmassierung reduziert: keine Seesternspitzen, weniger übergroßer Schwerpunkt. - Dreiecks-Softening reduziert, damit die Hülle klar bleibt. - Rotationsdämpfung weiter reduziert. Nicht angefasst: - Bullauge-Logik. - Printansicht. - Footer. - Ordnersystem. - Intro. Test: 1. Neue Map mit 3 direkten Kindern erzeugen, z. B. Sonne. 2. 3er-Hülle muss regulär, ruhig und ohne Seiten-Auswüchse erscheinen. 3. 4er/5er-Hüllen dürfen nicht regressieren. 4. Beim Bewegen darf die Hülle nicht sichtbar um die eigene Achse nachlaufen.


## ITMO v4.0.661 – triangle visible body fix
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.661.md

# ITMO v4.0.661 – triangle visible body fix Ziel: 3er-Hüllen endgültig vom alten Kreis+Spike-Effekt trennen. Änderungen: - 3er-Hüllen werden im Renderlayer nicht mehr per Bullauge-/Pointwarp nachverformt. - Bei sichtbaren 3er-Polygonen wird kein zusätzlicher Vordergrundkreis mehr über das Dreieck gelegt, weil genau daraus die Flossen-/Sternoptik entstand. - Stage-Pipeline lässt 3er-Hüllen unverformt und warpt sie nicht mehr punktweise. - Dreiecksmasse leicht stabilisiert; keine zweite Größenaufblähung im Polish. Test: - Neue Map mit 3 Verbindungen erzeugen. - Kind mit 2 eigenen Kindern prüfen. - Keine Kreis-Bulges, keine Haifischflossen, keine Sternzacken. Nächster Schritt: - Wenn 3er-Hülle sauber ist: Hüllen/Familienkreise einfrieren und mit Intro/Ordner-Block starten.


## ITMO v4.0.662 – triangle orientation lock
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.662.md

# ITMO v4.0.662 – triangle orientation lock Ziel: Das Dreiecksproblem endgültig auflösen, ohne neue Bühnenlogik einzubauen. Geändert: - 3er-Hüllen bekommen eine deterministische Orientierung. - Bei Kindknoten zeigt die Dreiecksspitze von der Mutter weg. - Bei Root-Knoten zeigt die Dreiecksspitze weg vom Kinderschwerpunkt. - Keine Pointwarp-/Spike-Maske mehr für Dreiecke. - Stage-Projektion nutzt den projizierten Elternanker für dieselbe sichtbare Dreiecksorientierung. Test: - Neue Map mit exakt 3 Verbindungen erzeugen. - Kind mit Mutter + 2 Kindern erzeugen. - Beim Ziehen darf sich das Dreieck nicht frei um die eigene Achse drehen.


## HANDOFF v4.0.664 - foreground circle hull restore
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.664.md

# HANDOFF v4.0.664 - foreground circle hull restore Ziel: Die fixierte Regel Kreis-vor-Huelle wieder herstellen, ohne die frische v4.0.663-Hull-Pipeline zurueckzubauen. Geaendert: - `src/ui/StageRenderLayers.js` - Vordergrundkreis wird wieder bei allen Knoten gerendert, auch bei 3er-Huellen. - Kreisradius im Renderlayer nutzt wieder den aktuellen Glyph-Radius, damit Bullauge-Skalierung und Huelle synchron bleiben. - 3er-Huelle wird als echtes Tangenten-Dreieck um den Kreis erzeugt. Die Dreiecksspitze bleibt bei Kindern von der Mutter weg ausgerichtet. - `shape.points`, alte Pointwarp-Vertices und alte Dreiecksreste bleiben weiterhin aus dem Render-Hull-Pfad ausgeschlossen. Test: 1. Neue Map mit exakt 3 Verbindungen erzeugen. 2. Kind mit Mutter plus 2 Kindern erzeugen. 3. Beim Ziehen muss der Kreis als Vordergrundkoerper erhalten bleiben. 4. Die 3er-Huelle darf nicht als alter Stern/Flosse erscheinen, sondern als klare Huelle hinter dem Kreis. 5. Danach 4 und 5 Verbindungen testen: keine Geisterformen aus vorherigen Seitenzahlen.


## HANDOFF v4.0.666
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.666.md

# HANDOFF v4.0.666 Stand: Fadenanker-Kreisrestore nach v4.0.665. Änderung: - Vordergrundkreis bleibt sichtbarer Knotenkörper. - Hülle bleibt reine Hintergrundinformation ab 3 echten Anschlüssen. - Fadenanker werden nicht mehr auf die Polygonkante der Hülle gelegt. - Die Hüllenseite bestimmt nur noch die Austrittsrichtung; der konkrete Kontaktpunkt liegt auf dem Kreisrand. Testziel: - 3er-Knoten: Dreieck sichtbar hinter Kreis, Fäden laufen aus Kreisrand, nicht aus Dreieckskante. - 5er/6er: Polygonhülle bleibt lesbar, Fäden wirken an den Kreiskörper gebunden. - 0/1/2 Anschlüsse bleiben reine Kreise.


## ITMO v4.0.669 — kinship thread throttle
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.669.md

# ITMO v4.0.669 — kinship thread throttle Basis: v4.0.668 relative thread field. Änderungen: - Zusatz-/Verwandtschaftsfäden strenger gefiltert, damit große Maps nicht zuspinnen. - Pro Knoten weniger Resonanzfäden: Standard 2, ausgewählt maximal 4. - Globale Zusatzfäden auf 26 begrenzt. - Maximaldistanz für Resonanzfäden auf 460 px reduziert. - Fadenrichtung für Zusatzfäden stabilisiert: Ahne/Eltern/geringere Tiefe beziehungsweise frühere Geschwisterposition startet, Ziel liegt später/tiefer. - Farbverlauf folgt dieser Richtung von Startanker zu Zielanker. - Familienpolygon aus sichtbaren Kindern bleibt ohne zusätzliche Kreisflächen. Testpunkte: 1. Genogramm öffnen: Zusatzfäden sichtbar, aber nicht flächendeckend. 2. Geschwister/nahe Verwandte: Faden stärker als entfernte Texttreffer. 3. Farbverlauf: Startfarbe kommt vom Quellknoten, Zielfarbe vom Zielknoten. 4. Direkte Eltern-Kind-Fäden: weiterhin Kreisrandanker. 5. 3 bis 16 Kinder: zartes Kinderpolygon bleibt ohne Kreisunterlage.


## ITMO v4.0.670 — organic origin backdrops
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.670.md

# ITMO v4.0.670 — organic origin backdrops Basis: v4.0.669 kinship thread throttle. Änderungen: - Resonanz-/Verwandtschaftsfäden weiter beruhigt: höhere Mindestschwelle, pro Knoten Standard maximal 1 Zusatzfaden, global maximal 18. - Maximaldistanz der Zusatzfäden auf 390 px reduziert. - Zusatzfäden sind dünner und transparenter, ausgewählte Knoten dürfen weiter etwas stärker reagieren. - Organische Ursprungsgrafik als Asset eingebunden. - Intro nutzt die Ursprungsgrafik auf erster und letzter Karte. - Vorlagenkarten erhalten die Ursprungsgrafik als gedimmten, farbgetönten Hintergrund. - Familienpolygone bleiben ohne Kreisunterlage. Testpunkte: 1. Genogramm öffnen: Zusatzfäden dürfen nicht zuspinnen. 2. Ausgewählten Knoten prüfen: nahe Verwandte dürfen zart sichtbar reagieren. 3. Vorlagenbereich öffnen: Karten müssen organischer wirken, aber Text/Symbol lesbar bleiben. 4. Intro überspringen/starten muss weiter funktionieren. 5. ZIP bleibt Expo-Go-kompatibel.


## HANDOFF v4.0.671 — quiet family polygons
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.671.md

# HANDOFF v4.0.671 — quiet family polygons Ausgangspunkt: Sichttest v4.0.670. Umgesetzt: - Familienkreise stark reduziert: keine Blattkreise mehr, weniger Linien, niedrigere Deckkraft. - Familienpolygone sind jetzt gerade Polygonflächen statt weicher Kurvenhüllen. - Familienpolygone bleiben sehr zart und liegen hinter Kreis und Eltern-Kind-Fäden. - Resonanzfäden weiter gedimmt und global stärker begrenzt. - Alle Intro-Slides nutzen den organischen Ursprungshintergrund statt gemischtem altem Baum-/neuem Bildstil. Regelstand: - Kreis bleibt sichtbarer Körper. - Hülle bleibt Anschlusszeichen hinter dem Kreis. - Familienpolygon zeigt nur direkte Kinderpunkte, ohne zusätzliche Kreise darunter. - Verwandtschaftsfäden bleiben Zusatzinformation, nicht Hauptstruktur.


## HANDOFF v4.0.672 - ZIP-Konsistenz und Preflight-Quelle
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/HANDOFF_v4.0.672.md

# HANDOFF v4.0.672 - ZIP-Konsistenz und Preflight-Quelle Ausgang: Die hochgeladene ZIP `fxchs-grematik-de(12).zip` enthielt die App-Arbeitskopie v4.0.671. Der Quellbaum war lesbar, aber `npm run preflight` brach ohne `node_modules` und wegen der alten Prüfregel `visible app name contains the release version` ab. Änderung: - Version auf 4.0.672 gehoben. - `package.json` und `app.json` synchronisiert. - iOS `buildNumber` und Android `versionCode` auf 672 gesetzt. - Sichtbarer App-Name bleibt `GREMATIK`. - Preflight-Regel korrigiert: `GREMATIK` ist als stabiler sichtbarer Name erlaubt. - Fehlende lokale Expo-Abhängigkeiten sind im Preflight nur noch Warnung; der EAS/TestFlight-Build bleibt durch `scripts/ensure-deps.mjs` geschützt. Test: - `node scripts/preflight.mjs` muss im Quellordner ohne `node_modules` mit Warnungen, aber ohne FAIL enden. - Vor echtem TestFlight: `npm install`, dann `npm run preflight`, dann `npx expo-doctor`, dann Build. Offen: - Kein echter Expo-/EAS-Cloud-Build wurde in diesem Chat ausgeführt. - Keine UI-Screenshotprüfung durchgeführt.


## Intro/Icon TODO v4.0.548
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/INTRO_ICON_TODO_v4.0.548.md

# Intro/Icon TODO v4.0.548 Bildmaterial fehlt noch. Keine Platzhalterbilder in den Code übernehmen. Geplanter Intro-Ablauf: fünf skipbare Vollbildkarten. 1. In der Mitte beginnen. 2. Gedanken sichtbar machen. 3. Lernen, Befunden, Erinnern. 4. Mit AI schneller starten. 5. Deine Map bleibt beweglich. Nach Skip oder Ende: sanfte Blende zur Startseite. App-Icon: ITMO-Bullauge plus grüner polygonaler Fuchs, quadratisch, lesbar in kleiner Größe.


## ITMO Keyvisual- und Intro-Konzept v4.0.546
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/ITMO_KEYVISUAL_CONCEPT_v4.0.546.md

# ITMO Keyvisual- und Intro-Konzept v4.0.546 ITMO wird als vollständige, fokussierte App gedacht: eine ruhige neuronale Struktur, die Innenwelt und Außenwelt verbindet. Die App kann aus eigenen Worten, beschriebenem Papier, Importen, AI-Strukturen, Wiki-Wissen, Wortsuche, Bildern, Hintergründen, Statistiken und Gewichtungen eine persönliche Map erzeugen. Der zentrale Wert ist Fokus: viel Material wird sichtbar, aber nicht laut. Die Bildwelt soll freundlicher und heller werden, ohne beliebig zu wirken: hochwertige Mischung aus echter App-Nähe, Science-Fiction-Produktbild und dynamischer Marvel-Comic-Energie. Kernzeichen sind Bullauge, gleich große Kreise, Polygonhüllen als reine Dekoration, feine Fäden, Familienkreise und ein grüner polygonaler Fuchs als vierbeinige Begleitfigur. Keine kindliche Maskottchenlogik, keine UI-Screenshots als Bildersatz, keine überladene Neonwolke. Intro-Ziel: in wenigen skipbaren Vollbildschritten erklären, dass ITMO beim Mittelpunkt beginnt, Themen sichtbar macht, Lernen/Befundung/Selbstbeobachtung verbindet, AI-Import nutzt und mit Bullauge/Fokus ruhig durch komplexe Inhalte führt. Text muss kurz, stark und appnah bleiben. Ton und VR bleiben Parkmodule. Der Release-Kern bleibt: Start, Vorlagen, Import, AI-Prompt, Bühne, Bullauge, Fokusraum, Suche, Foto/Insta, Print/Export, Kompass/Anatomie/Gefühle/Bedürfnisse.


## Ladeprinzip v4.0.323
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/LOADING_PRINCIPLE_v4.0.323.md

# Ladeprinzip v4.0.323 Wenn Map-/Bühnenaufbau potenziell ruckelt, wird kurz 3-2-1 angezeigt: 3 Struktur vorbereiten 2 Familie und Labels ordnen 1 Bühne einblenden Ziel: keine halbfertige, ruckelnde Bühne zeigen.


## Starte mit ITMO_v4.0.193_quality_check_stabilized.zip. Prüfe zuerst reale iPhone-Fehler. Priorität: Fotomehrfachauswahl,
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.193.md

Starte mit ITMO_v4.0.193_quality_check_stabilized.zip. Prüfe zuerst reale iPhone-Fehler. Priorität: Fotomehrfachauswahl, Bildaststruktur, Undo, Fokusraum-Footer, Suche mit Tastatur, Share/Insta. Keine neue Featurewelt, bevor diese Punkte stabil sind.


## Bitte starte mit einem Sichttest von v4.0.194. Prüfe die drei Designthemen Baumkrone, Atlas und Blumenwiese auf dem iPho
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.194.md

Bitte starte mit einem Sichttest von v4.0.194. Prüfe die drei Designthemen Baumkrone, Atlas und Blumenwiese auf dem iPhone in Startbereich, Vorlagenwelt und Kartengefühl. Danach angleiche das beste Thema noch stärker an Fokusraum, Suche und Print. Wenn nötig, verfeinere Lesbarkeit, Größen, Abstände und die themenspezifische Gesamtlogik weiter. Gib am Ende wieder eine saubere ZIP aus.


## Bitte mit v4.0.195 weiterarbeiten. Prüfe auf dem iPhone die drei Designs Baumkrone, Atlas und Blumenwiese nicht nur auf 
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.195.md

Bitte mit v4.0.195 weiterarbeiten. Prüfe auf dem iPhone die drei Designs Baumkrone, Atlas und Blumenwiese nicht nur auf der Startseite, sondern auch in Fokusraum, Suche und Print. Wenn ein Design am stärksten ist, verfeinere es als Hauptdesign. Achte auf Lesbarkeit, Footer, Suche mit Tastatur, Bildmehrfachauswahl, Undo und ruhige Baum-/Gehirn-/Wiesenatmung. Am Ende wieder eine vollständige ZIP ausgeben.


## Weiter mit ITMO v4.0.212. Quelle ist die ZIP `ITMO_v4.0.212_template_chapter_block_scale_pass.zip`.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.212.md

Weiter mit ITMO v4.0.212. Quelle ist die ZIP `ITMO_v4.0.212_template_chapter_block_scale_pass.zip`. Bitte zuerst Expo-Go-Gerätetest/Syntax prüfen. Danach die neue Fokusraum-Blocknavigation visuell glätten: weniger Höhe, bessere Einrastlogik bei vielen Textblöcken/Kinderchips, aktive Blockmarkierung deutlicher. Keine Rückkehr zum alten Breadcrumb. Skalen bleiben am Textblock. Kreis = Kapitel, Kindkreis = Unterkapitel.


## Arbeite auf Basis `ITMO_v4.0.213_focusroom_polygon_text_rail_pass.zip` weiter.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.213.md

Arbeite auf Basis `ITMO_v4.0.213_focusroom_polygon_text_rail_pass.zip` weiter. Priorität: 1. Expo-Go-Gerätetest gedanklich/strukturell nachziehen und die neue Fokusraum-Polygonschiene visuell beruhigen. 2. Prüfen, ob sehr tiefe Kapitelbäume die Timeline überladen; ggf. direkte Kinder zuerst zeigen und tiefe Nachfahren einklappbar machen. 3. Textblock-Editor für den ersten Block noch klarer als „eigener Polygontext“ kennzeichnen. 4. Instagram/PNG-Share testen: Auswahl darf nicht verloren gehen, Fokusraum-Overlay muss aus dem Screenshot raus, Zoomstufe darf sich nicht ändern, nur Zentrierung des ausgewählten Polygons. 5. Danach weiter an Bühnenhelligkeit, Polygonscherben, Verbindungen und Footer-Dichte arbeiten. Wichtige Regel: Textblöcke stellen ab jetzt Polygone dar. `blocks[0]` ist der eigene Polygontext. Skalen hängen am Textblock. Keine separate Breadcrumb-/Verwandtschaftsketten-UI wieder einführen.


## Arbeite auf Basis `ITMO_v4.0.214_chapter_text_template_import_export_focus_pass.zip` weiter.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.214.md

Arbeite auf Basis `ITMO_v4.0.214_chapter_text_template_import_export_focus_pass.zip` weiter. Wichtigster Stand: - Alle sichtbaren Vorlagen werden aus `src/core/templates/chapterTemplatesV214.js` als Kapitel-TXT erzeugt. - Heading = Polygon, Unterheading = Polygonkind, erster Textblock = eigener Polygontext, Urskala am Textblock. - Fokusraum zeigt den kompletten Kapiteltext der aktiven Map als Schiene und scrollt den aktuellen Polygontext an. - Import/Export läuft zusätzlich über lesbaren Kapiteltext in `src/core/chapterText.js`. - Print enthält nun auch den vollständigen Kapiteltext. - Footer-Foto-Button macht direkt ein Bühnenfoto und öffnet kein Hintergrundbildfenster. Nächste Priorität: 1. Expo-Go-Gerätetest auf Syntax, Start, Template-Erzeugung und Fokusraum-Scroll. 2. Prüfen, ob der direkte Foto-Button zuverlässig Kamera-Permission, Countdown und Aufnahme schafft. 3. Fokusraum-Schiene optisch weiter verdichten, besonders für Anatomie. 4. Print später sauberer in Kapitelbaum, Skalen und grafische Szene aufteilen. 5. Bei Problemen nicht alte Template-Reste reaktivieren, sondern Kapiteltext-Quelle korrigieren.


## Arbeite auf Basis `ITMO_v4.0.215_inline_block_edit_scales_focus_header_pass.zip` weiter.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.215.md

Arbeite auf Basis `ITMO_v4.0.215_inline_block_edit_scales_focus_header_pass.zip` weiter. Wichtig: Fokusraum ist ab v4.0.215 als direkt bearbeitbare Polygon-Textliste gedacht. Jeder erste Textblock eines Polygons ist der eigene Polygontext. Die alte untere Textfeld-/Blockliste wurde entfernt. Skalen sitzen als dezente Balken direkt an den Listeneinträgen. Farbe, Symbol und Bild des aktuellen Polygons werden im aktiven Listeneintrag angezeigt. Nächste Arbeit: 1. Expo-Go-Test auf iOS/Android: Fokusraum öffnen, tiefen Kapiteltext scrollen, aktuellen Textblock inline bearbeiten, Skalenbalken bedienen, Farbe/Symbol/Bild im aktiven Eintrag ändern. 2. Tastatur- und Scrollverhalten verbessern, falls der Inline-Editor beim Schreiben verdeckt wird. 3. Printdarstellung auf dieselbe Kapiteltext-/Textblocklogik überarbeiten. 4. Falls stabil: direkte Bearbeitung anderer Listeneinträge ohne vorherigen Fokuswechsel konzipieren. 5. Weiter optisch verdichten: weniger Rand, ruhige Skalen, klare aktive Markierung. Arbeite kurz, sauber und mit ZIP-Ergebnis.


## Arbeite ab `ITMO_v4.0.217_beta_clarity_focus_template_check_pass.zip` weiter.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.217.md

Arbeite ab `ITMO_v4.0.217_beta_clarity_focus_template_check_pass.zip` weiter. Ziel: lauffähige Beta stabilisieren. Priorität 1: Expo-Go-Gerätetest systematisch vorbereiten und Fehler fixen. Prüfe: Vorlage anlegen, Fokusraum öffnen, Textblock inline bearbeiten, Wort markieren, Wiki einfügen, Kindpolygon aus Wort erstellen, Skala bearbeiten/ausblenden/einblenden/hinzufügen, Farbe/Symbol/Bild am Polygon ändern. Priorität 2: Import/Export real testen. Exportiere eine Map als TXT. Importiere dieselbe TXT wieder. Importiere zusätzlich eine reine Kapitel-TXT. Prüfe, ob Root-Intro erhalten bleibt und kein Anrede-Block als erster Eintrag entsteht. Priorität 3: Foto/Print/Share prüfen. Foto-Button soll direkt aufnehmen. Hintergrund-Auswahlfenster bleibt auf Eis. Print soll Kapiteltext und Zeitachse sauber ausgeben. Instagram/PNG soll nicht herauszoomen. Priorität 4: Fokusraum weiter beruhigen. Falls nötig: Skalenaktionen kleiner machen, Textzeilen mehr Luft geben, aktive Karte klarer hervorheben, globalen Rahmen weiter vermeiden. Priorität 5: Footer finalisieren. Footerhöhe, Buttonhitflächen und blasse Bedienbarkeit bei geöffnetem Fenster prüfen. Mindestdeckkraft 25 Prozent beibehalten. Status aus v4.0.217: - Vorlagen-Intro statt Anrede umgesetzt. - Root-Introblock heißt Intro. - Start-Seed nur noch als nachgeordnete Startnotiz. - Skalenbezeichnung sitzt im Skalenbalken und ist editierbar. - Skalenaktionen: bearbeiten, ausblenden, einblenden, hinzufügen, löschen. - Fokusraumrahmen visuell entfernt. - Footer niedriger und Modusbutton trotz geöffnetem Fenster bedienbar.


## Arbeite weiter ab ITMO v4.0.218_mobile_landscape_timeline_auto_pass.zip.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.218.md

Arbeite weiter ab ITMO v4.0.218_mobile_landscape_timeline_auto_pass.zip. Wichtig: Auf mobilen Geräten darf die Zeitspur keinen Extra-Button mehr haben. Sie aktiviert sich automatisch beim Drehen ins Querformat und verschwindet beim Zurückdrehen ins Hochformat. Web/Desktop darf Zeit weiterhin bewusst als Modus haben. Nächster sinnvoller Schritt: Beta-Stabilisierung v4.0.219. Prioritäten: 1. Expo-Go-Gerätelogik prüfen: Hochformat, Querformat, Zurückdrehen, Footer, Fokusraum. 2. Fokusraum weiter beruhigen: weniger Rahmen, klare Textblock-Hierarchie, feine Skalen. 3. Wiki, Print, Foto, Bilder, Import/Export systematisch testen und sichtbare Fehler beheben. 4. Footer final niedriger halten; Swipe/Sheet darf Buttons nicht totdecken. 5. Desktop/Web mit Maus, Tastatur und Scrollrad als eigene Variante schärfen, ohne Mobile zu stören. Immer ZIP liefern.


## Arbeite weiter an ITMO v4.0.220 auf Basis von `ITMO_v4.0.219_focus_teaser_deep_maps_pass.zip`.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.219.md

Arbeite weiter an ITMO v4.0.220 auf Basis von `ITMO_v4.0.219_focus_teaser_deep_maps_pass.zip`. Ziel: Beta-Funktionscheck und Stabilisierung. Bitte nicht neue Featurewelten öffnen, sondern alles vorhandene lauffähig machen. Prioritäten: 1. Fokusraum in Expo Go testen: lange Kapitelmaps, Inline-Tastatur, aktiver Block, Teaser auf 10 Zeilen, Scrollposition. 2. Performance prüfen: besonders Anatomie mit ca. 260 Polygonen und Zeit mit ca. 253 Polygonen. 3. Wiki-Funktion prüfen: markiertes Wort, Artikelabruf, Einfügen in aktiven Textblock. 4. Print prüfen: Kapiteltext, Zeitachse, Skalen, lange Maps. 5. Foto prüfen: direkte Kameraaufnahme, kein altes Hintergrundfenster. 6. Bilder prüfen: Bildauswahl im aktiven Polygon, Bildreferenz, Bildstruktur. 7. Import/Export prüfen: Kapitel-TXT und JSON-Block, Roundtrip, tiefe Hierarchien. 8. Footer und Swipepanel prüfen: Höhe, Deckkraft, Bedienbarkeit, Querformat. 9. Zeitspur prüfen: Mobile nur Querformat automatisch; Web/PC bewusst anwählbar. Behalte die aktuelle Logik: - Heading = Polygon. - Unterheading = Polygonkind. - erster Textblock = eigener Polygontext. - Skala hängt am Textblock. - Fokusraum-Liste ist Bearbeitungsfläche. - Nicht aktive Einträge sind Teaser. Am Ende wieder ZIP, Handoff, Quality-Check und klare offene Punkte liefern.


## Arbeite weiter ab ITMO_v4.0.222_global_search_empty_wiki_beta_pass.zip.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.222.md

Arbeite weiter ab ITMO_v4.0.222_global_search_empty_wiki_beta_pass.zip. Priorität: 1. Expo-Go-Funktionscheck für globale Suche, neues leeres Thema, Wiki am Titel, Rückgängig-Wiki, Import/Export, Print, Foto, Fokusraum-Tastatur. 2. Falls Suchkopf/Fokusraum optisch konkurrieren: Header noch ruhiger und höher/lower safe-area-sicher anpassen. 3. Echte visuelle Suchfäden in Start/Fokus ergänzen, wenn Treffer aktiv sind. 4. Touchflächen und Swipe-Aktionen am Teaser prüfen. 5. Danach Beta-Handoff vorbereiten.


## Arbeite weiter ab ITMO v4.0.254. Der Fenster-Swipe wurde vollständig entfernt; Fenster werden nur noch über Footer/X geö
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.254.md

Arbeite weiter ab ITMO v4.0.254. Der Fenster-Swipe wurde vollständig entfernt; Fenster werden nur noch über Footer/X geöffnet und geschlossen, bleiben aber weich animiert. Prüfe zuerst Bedienung und Ruckeln. Falls noch Last spürbar ist, konzentriere dich auf `buildGeometry(map, stageBox)`, sichtbare-Knoten-Filterung, Memoisierung und Stage-Layer-Drosselung. Stage-PanResponder nicht entfernen, weil er für Bühnenbewegung nötig ist.


## Weiterarbeiten ab ITMO v4.0.287. Bitte zuerst GERG neu aus der Vorlage öffnen/kopieren, Ton AN testen und prüfen, ob die
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.287.md

Weiterarbeiten ab ITMO v4.0.287. Bitte zuerst GERG neu aus der Vorlage öffnen/kopieren, Ton AN testen und prüfen, ob die unterschiedlichen relationWeights als Melodie hörbar werden. Dann Edit-Drag testen: Label/Polygon ziehen, Abstand ändern, Drop auf Faden/Polygon mit Entscheidung. Danach Knospen/Geburt und Drop-Aktionen glätten. Expo SDK 54 beibehalten. Jede Übergabe als ZIP.


## Weiter mit v4.0.288: Drop-Aktionen im Editmodus prüfen, dann Anatomie/Gefühl/Bedürfnis auf realem Gerät hör- und sichtte
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.288.md

Weiter mit v4.0.288: Drop-Aktionen im Editmodus prüfen, dann Anatomie/Gefühl/Bedürfnis auf realem Gerät hör- und sichttesten und Ton-/Abstandsfeinheiten glätten.


## Weiter mit v4.0.289. Bitte zuerst real testen: Edit-Drop auf Polygon, Faden, freien Raum; danach Tonloop in GERG, Anatom
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.289.md

Weiter mit v4.0.289. Bitte zuerst real testen: Edit-Drop auf Polygon, Faden, freien Raum; danach Tonloop in GERG, Anatomie, Gefühle und Bedürfnisse prüfen. Nächster Schritt: visuelles Feedback für Drop-Ergebnis und ggf. Undo/Bestätigung verbessern.


## Weiter mit v4.0.290: Zuerst real testen, ob Tonpulse sichtbar im Takt mit der Melodie laufen. Danach Drop-Undo und Feins
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.290.md

Weiter mit v4.0.290: Zuerst real testen, ob Tonpulse sichtbar im Takt mit der Melodie laufen. Danach Drop-Undo und Feinschliff der Arm/Finger-Zoommechanik.


## Weiter mit ITMO v4.0.291. Prüfe 12er Fit auf Gefühle/Bedürfnisse und Anatomie. Sonar soll nur sichtbare Fäden spielen. F
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.291.md

Weiter mit ITMO v4.0.291. Prüfe 12er Fit auf Gefühle/Bedürfnisse und Anatomie. Sonar soll nur sichtbare Fäden spielen. Farben sollen unterschiedliche Klangfarben ergeben, ohne Performance zu belasten. Danach Drop-Feedback/Undo und Zoom-Fokus-Feinschliff.


## Weiter mit v4.0.292. Priorität: echten Gerätetest für 12er Fit, sichtfeldgebundenen Sonarloop, farbabhängige Klangfarben
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.292.md

Weiter mit v4.0.292. Priorität: echten Gerätetest für 12er Fit, sichtfeldgebundenen Sonarloop, farbabhängige Klangfarben, Drop-Undo und Zoom-Fokus. Danach Feinschliff: Mitte öffnet, außen schließt; Kinder dürfen nicht lange im Mutterbereich hängen.


## Arbeite weiter ab v4.0.293. Ziel ist ein fluessiger, sauberer Teststand. Keine neuen Features, bis Fokusraum-Schliessen,
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.293.md

Arbeite weiter ab v4.0.293. Ziel ist ein fluessiger, sauberer Teststand. Keine neuen Features, bis Fokusraum-Schliessen, 12er-Fit, sichtfeldbasierter Tonloop, Edit-Drop und Rueckgaengig stabil sind. Danach Zoom/Fokus-Mechanik: Mitte oeffnet, Rand schliesst, Arm/Finger-Prinzip weiter glätten.


## Weiter mit v4.0.294: Teste zuerst Gefühle oder Bedürfnisse. 12er Fit drücken, Ton AN, prüfen ob Mutter + 12 Kinder sicht
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.294.md

Weiter mit v4.0.294: Teste zuerst Gefühle oder Bedürfnisse. 12er Fit drücken, Ton AN, prüfen ob Mutter + 12 Kinder sichtbar sind, Ton nur sichtbare Fäden nimmt und die Bühne flüssig bleibt. Danach nur gezielte Fixes: Labelkollision, zu kleines/zu großes Fit, Drop-Undo, Fokusraum-Schließen.


## Weiter ab v4.0.295: Sichttest 12er-Fit, Fokus-Zoom und Tonloop. Danach nur gezielte Fixes für Größe, Label-Überlagerung 
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.295.md

Weiter ab v4.0.295: Sichttest 12er-Fit, Fokus-Zoom und Tonloop. Danach nur gezielte Fixes für Größe, Label-Überlagerung und Performance.


## Weiter mit v4.0.296: Auf Gerät prüfen, ob Suche/Keyboard, 12er Fit/Ton und große Eltern mit vielen Kindern flüssiger sin
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.296.md

Weiter mit v4.0.296: Auf Gerät prüfen, ob Suche/Keyboard, 12er Fit/Ton und große Eltern mit vielen Kindern flüssiger sind. Danach konkrete Restfixes: Querformat-Timeline, Fokusraum/Bottom-Sheet und Vorlagenfüllung.


## Weiter mit v4.0.297: reale Sichttests prüfen. Danach nur konkrete Fixes an Zoom/Fokus/Ton/Timeline, keine neuen Features
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.297.md

Weiter mit v4.0.297: reale Sichttests prüfen. Danach nur konkrete Fixes an Zoom/Fokus/Ton/Timeline, keine neuen Features bis der Kern flüssig läuft.


## Weiter mit v4.0.309: Smoke-Test Fokusraum, Wiki-Titel löschen/neuschreiben, Skalen bearbeiten, Labelgrößen im Zoom-out, 
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.309.md

Weiter mit v4.0.309: Smoke-Test Fokusraum, Wiki-Titel löschen/neuschreiben, Skalen bearbeiten, Labelgrößen im Zoom-out, danach erneuter TestFlight-Kandidat.


## Weiter mit v4.0.319: Gerätetest auf Langtipp-Kind, Ruheanimation, Fokus-Zeitachse. Danach nur Blocker-Hotfix oder Build-
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.319.md

Weiter mit v4.0.319: Gerätetest auf Langtipp-Kind, Ruheanimation, Fokus-Zeitachse. Danach nur Blocker-Hotfix oder Build-Freeze.


## Weiter mit v4.0.323: Gerätetest auf Ladeoverlay, sichtbare Ruheanimation, Familien-Fit, Fokusliste und Ruckeln. Nur Bloc
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.323.md

Weiter mit v4.0.323: Gerätetest auf Ladeoverlay, sichtbare Ruheanimation, Familien-Fit, Fokusliste und Ruckeln. Nur Blocker fixen.


## Weiter mit ITMO v4.0.330: Gerätetest auf Startfamilie, Fokusliste, Wiki, Ruheanimation, Ruckeln und Renderfehler. Nur Bl
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.330.md

Weiter mit ITMO v4.0.330: Gerätetest auf Startfamilie, Fokusliste, Wiki, Ruheanimation, Ruckeln und Renderfehler. Nur Blocker beheben. Danach Build-Freeze und EAS/TestFlight.


## Arbeite weiter auf `ITMO_v4.0.333_polygon_display_real.zip`. Nächste Etappe: `v4.0.334-thread-idle-motion`. Ziel: Fäden 
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.333.md

Arbeite weiter auf `ITMO_v4.0.333_polygon_display_real.zip`. Nächste Etappe: `v4.0.334-thread-idle-motion`. Ziel: Fäden heller, ruhiger, dauerhaft korrekt verankert; Idle-Bewegung sehr sanft, sofortiger Abbruch bei Interaktion; Vorbereitung für späteres 0–12-Tonsystem. Keine neuen großen UI-Konzepte. Jede Antwort mit echter ZIP und ehrlichem Countdown.


## Arbeite ab ITMO v4.0.341 weiter. Nächste Etappe: Vorlagenausbau. Ziele: Gefühle, Bedürfnisse, GFK, Befundung und Anatomi
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.341.md

Arbeite ab ITMO v4.0.341 weiter. Nächste Etappe: Vorlagenausbau. Ziele: Gefühle, Bedürfnisse, GFK, Befundung und Anatomie strukturreicher machen, ohne Lernkarten als Extrakapitel wieder einzuführen. SDK 54 und Expo-Go-Kompatibilität behalten. Immer echte ZIP liefern.


## NEXT CHAT PROMPT v4.0.345
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.345.md

# NEXT CHAT PROMPT v4.0.345 Arbeite mit ITMO_v4.0.345_beta_freeze_real.zip weiter. Wichtig: Nicht breit refactoren. Nächster gezielter Schritt ist v4.0.346-anchor-points. Ziel: Fäden sollen nicht in Mittelpunkt/Innenraum laufen, sondern an Seitenrändern der jeweiligen Formen ankern. Reihenfolge: Kreisrand, Polygonseiten, Endglieder. Kinderlose Kinder bleiben Kreise. Keine Lernkarten als Extrakapitel wieder einführen. SDK 54 behalten. Jede Etappe als echte ZIP liefern.


## Arbeite ab ITMO_v4.0.346-anchor-points-real weiter. Wichtig: Kinderlose Kinder bleiben Kreise. Fäden sollen an Seitenrän
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.346.md

Arbeite ab ITMO_v4.0.346-anchor-points-real weiter. Wichtig: Kinderlose Kinder bleiben Kreise. Fäden sollen an Seitenrändern bzw. Kreisrändern ankern. Nicht wieder Zentrumspunkte verwenden. Nächster Schwerpunkt: visuelle Fadenverfeinerung nur, wenn die App stabil läuft; sonst Beta-Freeze nicht gefährden.


## Arbeite ab ITMO_v4.0.348_thread_routing_real.zip weiter. Wichtig: kinderlose Kinder bleiben Kreise. Fäden sollen an sich
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.348.md

Arbeite ab ITMO_v4.0.348_thread_routing_real.zip weiter. Wichtig: kinderlose Kinder bleiben Kreise. Fäden sollen an sichtbaren Objektseiten/Kreisrändern ankern. Nicht tief refactoren. Nächster Schritt nach Sichttest: v4.0.349 Bühnenästhetik mit dichterer Hülle, leicht hellerem Fadenlicht und besserem Kontrast. SDK 54 behalten. Jede Etappe als echte ZIP liefern.


## Arbeite ab ITMO_v4.0.349_stage_aesthetic_real.zip weiter. Wichtig: kinderlose Kinder bleiben Kreise. Hüllen sollen das O
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.349.md

Arbeite ab ITMO_v4.0.349_stage_aesthetic_real.zip weiter. Wichtig: kinderlose Kinder bleiben Kreise. Hüllen sollen das Objekt sein, nicht Dekoration hinter einem Button. Fäden ankern an Seiten/Kreisrändern. v4.0.349 hat bewusst nur optische Parameter verdichtet. Nächster geplanter Schritt: v4.0.350 Tonlandschaft, außer der Sichttest zeigt einen klaren Geometriefehler. SDK 54 behalten. Jede Etappe als echte ZIP liefern.


## Arbeite ab ITMO_v4.0.350_idle_sound_only_real.zip weiter. Ton gehört nur zur Ruheanimation. Der Tonbutton ist einfach un
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.350.md

Arbeite ab ITMO_v4.0.350_idle_sound_only_real.zip weiter. Ton gehört nur zur Ruheanimation. Der Tonbutton ist einfach und erscheint nur während aktiver Ruhebewegung. Nächster sinnvoller Schritt: realer Sicht-/Hörtest; danach entweder Ton feinjustieren oder zur nächsten Strukturphase wechseln. Kinderlose Kinder bleiben Kreise. Fäden ankern an Seiten/Kreisrändern. SDK 54 behalten. Jede Etappe als echte ZIP liefern.


## Starte mit ITMO_v4.0.351_urkreis_performance_real.zip. Bitte Sichttest zuerst: Prüfen, ob 1/2/4 Kinder als Viereck ersch
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.351.md

Starte mit ITMO_v4.0.351_urkreis_performance_real.zip. Bitte Sichttest zuerst: Prüfen, ob 1/2/4 Kinder als Viereck erscheinen, kinderlose Kinder Kreise bleiben und große Maps flüssiger wirken. Danach entweder native Idle-Audio-Ausgabe ergänzen oder Fadenanker weiter feinjustieren.


## Arbeite mit ITMO v4.0.356 weiter. Prüfe zuerst die Darstellung kleiner Maps mit 1–5 Kindern und danach die Anatomie-Map.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.356.md

Arbeite mit ITMO v4.0.356 weiter. Prüfe zuerst die Darstellung kleiner Maps mit 1–5 Kindern und danach die Anatomie-Map. Regeln: Root: Seitenzahl = Kinderzahl, aber 1/2 Kinder = Viereck. Nicht-Root: Kinder + Vorfahrseite = Verbindungszahl; 0 eigene Kinder = Kreis. Anker immer Seitenmitten, nicht Ecken. Nächster Fokus: Ankerabstände, Fadenenden und Lesbarkeit großer Maps.


## Weiter mit ITMO ab v4.0.377. Bitte keine Bilder im Chat erzeugen. Arbeitsstil: kurze Antwort, konkrete ZIP. Aktueller St
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.377.md

Weiter mit ITMO ab v4.0.377. Bitte keine Bilder im Chat erzeugen. Arbeitsstil: kurze Antwort, konkrete ZIP. Aktueller Stand: Cluster-Zoom ist in Stage.js aktiv verdrahtet; Root-only beim vollständigen Zoom-Out über `rootOnlyZoomForCount()`. Labels sind größer/weiß/ohne Rahmen oder Glow. Bitte zuerst Sichttest: Startzoom-Lesbarkeit, Herauszoom-Schlucken, Urmutter-only, Geburtsanimation aus Mutter, Enkelabstand. Danach nur gezielt nachjustieren.


## NEXT CHAT PROMPT v4.0.381
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.381.md

# NEXT CHAT PROMPT v4.0.381 Arbeite am Stand ITMO v4.0.381 weiter. Wichtigster Test: Zoom-Out muss ausschließlich von außen nach innen einrollen. Erst äußerste Kinder, dann Elternteil, dann dessen Elternteil. Beim Verschieben der Bühne dürfen Abstände nicht springen. Keine Bilder im Chat generieren. Expo SDK 54 beibehalten. ZIP liefern.


## Bitte mit ITMO v4.0.389 weiterarbeiten. Bühne ist strukturell abgenommen. Nicht an der Außen-nach-innen-Einrolllogik rüt
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.389.md

Bitte mit ITMO v4.0.389 weiterarbeiten. Bühne ist strukturell abgenommen. Nicht an der Außen-nach-innen-Einrolllogik rütteln. Nächster Fokus: Fokusraum-Bedienfeinschliff, dann Abschluss-QA und Übergabe-ZIP.


## Weiter ab ITMO v4.0.392. Ton/Sound bleibt auf unbestimmte Zeit eingefroren und darf nicht aktiv entwickelt werden. Nächs
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.392.md

Weiter ab ITMO v4.0.392. Ton/Sound bleibt auf unbestimmte Zeit eingefroren und darf nicht aktiv entwickelt werden. Nächster Block: Fokusraum fertigstellen. Prüfe zuerst die drei Zustände: zu = nur Titel, fokussiert = Titel/Wiki/Linktext/Skalen/Aktionsleiste, edit = echte Eingabefelder. Antippen soll zentrieren und fokussieren, nicht sofort editieren. Danach Editfelder, Wortlinks und Vorlagenentschlackung. SDK 54 behalten. Jede Etappe als ZIP liefern.


## Weiter ab ITMO v4.0.395. Sound/Ton bleibt eingefroren. Keine Fadenanimation reaktivieren. Bühnenstruktur ist die Referen
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.395.md

Weiter ab ITMO v4.0.395. Sound/Ton bleibt eingefroren. Keine Fadenanimation reaktivieren. Bühnenstruktur ist die Referenz: Einrollen außen nach innen, Fäden nur bei Außenlänge, Doppeltipp erzeugt Kind und hält Kamera. Nächster Schwerpunkt: Fokusraum final sichten und glätten. Achte besonders auf drei Zustände: zu, fokussiert, edit; fokussierte Einträge müssen mittig sichtbar bleiben; Text bleibt Linktext bis Edit; Skalen löschbar; Aktionspanel schlank unten am Eintrag. Danach Abschluss-QA/Übergabe-ZIP.


## Weiterarbeiten ab ITMO v4.0.396. Erst prüfen: Bühne bewegen darf keine Fäden wackeln lassen. Fäden sind statische ID-Sin
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.396.md

Weiterarbeiten ab ITMO v4.0.396. Erst prüfen: Bühne bewegen darf keine Fäden wackeln lassen. Fäden sind statische ID-Sinuslinien; keine Schwing-/Frameanimation reaktivieren. Ton/Sound bleibt eingefroren. Danach Fokusraum final glätten, Vorlagen entschlacken und Abschluss-QA/Übergabe-ZIP erstellen.


## Weiter ab ITMO v4.0.397. Wichtig: Ton/Sound bleibt auf unbestimmte Zeit eingefroren. Keine neuen Bilder. Die Bühne wurde
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.397.md

Weiter ab ITMO v4.0.397. Wichtig: Ton/Sound bleibt auf unbestimmte Zeit eingefroren. Keine neuen Bilder. Die Bühne wurde gerade stabilisiert: StageRenderLayers hat einen geschützten Stack, Fäden sind vollständig statisch und alte deaktivierte Renderlayer sind aus dem aktiven JSX-Pfad entfernt. Nächster Schritt soll Fokusraum-Komponentenschnitt sein: FocusHeader, FocusTimeline, FocusEntry, FocusEntryActions, EditField, ScaleRow. Bühne/Fäden/Einrollstruktur nur anfassen, wenn ein harter Fehler sichtbar ist.


## Weiter mit ITMO v4.0.398. Ton bleibt eingefroren. Normale Bühne hat nur gerade Fäden; Sinus/Wellen nur im Vollbild. Bühn
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.398.md

Weiter mit ITMO v4.0.398. Ton bleibt eingefroren. Normale Bühne hat nur gerade Fäden; Sinus/Wellen nur im Vollbild. Bühne soll hell bleiben. Nächster Schritt: Fokusraum-Komponentenschnitt ohne Bühnenmechanik anzufassen.


## Weiter mit ITMO v4.0.399.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.399.md

Weiter mit ITMO v4.0.399. Aktiver Stand: Bühne/Fäden sind weitgehend stabil. Ton/Sound ist eingefroren. Normale Bühne nutzt gerade Fäden; Vollbild darf Sinus-/Wellenfäden nutzen. Bühne soll ungefiltert/hell wirken wie Vollbild. Doppeltipp auf Bühne erstellt Kinder; die neue Child-ID muss sichtbar herauskommen, alte Geschwister dürfen nicht wie eine Geburt aufklappen. Fokusraum hat unten am fokussierten Eintrag ein Kinderpanel. Vorlagen werden kompakt geführt: generische Detailknoten werden Textblöcke im relevanten Polygon. Gefühle/Bedürfnisse sind Ausnahmen. Neurobefund ist aus der sichtbaren Vorlagenliste entfernt. WM 2026 ist als einfacher Gruppen-Spielplan angelegt. Nächste sinnvolle Schritte: 1. Fokusraum-Komponenten auslagern: FocusHeader, FocusTimeline, FocusEntry, FocusEntryActions, EditField, ScaleRow. 2. Import/Export und Print stabilisieren. 3. Vorlagen fachlich weiter befüllen, aber keine generischen Kindknoten erzeugen. 4. QA auf Gerät: Doppeltipp-Geburt, Pan-Stabilität, Fokusraum-Kinderpanel, Helligkeit, Vorlagenliste.


## Bitte mit ITMO v4.0.400 weiterarbeiten. Aktueller Stand: Fokusraum-Komponentenschnitt begonnen; Stage/Bühne/Fäden nicht 
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.400.md

Bitte mit ITMO v4.0.400 weiterarbeiten. Aktueller Stand: Fokusraum-Komponentenschnitt begonnen; Stage/Bühne/Fäden nicht anfassen, außer Fehler werden konkret gemeldet. Ton/Sound bleibt auf unbestimmte Zeit eingefroren. Nächster sinnvoller Schritt: Fokusraum-Editfeld und Skalenzeilen weiter auslagern, danach Import/Export/Print härten.


## Arbeite ab ITMO v4.0.401 weiter. Ton/Sound bleibt eingefroren. Bühne/Fäden/Zoom nur anfassen, wenn ein Sichttest konkret
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.401.md

Arbeite ab ITMO v4.0.401 weiter. Ton/Sound bleibt eingefroren. Bühne/Fäden/Zoom nur anfassen, wenn ein Sichttest konkreten Fehler zeigt. Normalbühne: gerade Fäden, keine Sinusfäden, keine Ruhepolygonbewegung. Vollbild/clean stage: Sinusfäden und Polygonruhe erst nach Idle. Sichtbarkeit der Bühne soll vom Bildschirmmittelpunkt ausgehen, nicht von alten Baumgewichten. Nächster Hauptschritt: Fokusraum-Komponenten `EditField`, `ScaleRow`, Text-/Wortlinklogik auslagern und Bedienung glätten; danach Import/Export/Print härten.


## Wir arbeiten weiter an ITMO/NeuroMap. Aktueller Stand: v4.0.402_label_center_short_zoom.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.402.md

Wir arbeiten weiter an ITMO/NeuroMap. Aktueller Stand: v4.0.402_label_center_short_zoom. Wichtig: - Ton/Sound bleibt auf unbestimmte Zeit eingefroren. - Keine neuen Bilder im Chat. - Normale Bühne: gerade Fäden, keine Fadenschwingung, keine Polygonruheanimation. - Vollbild/Clean-Stage: Sinus/Wellenfäden und Polygonruhe erst nach Idle. - Labels sitzen zentriert über dem Polygonmittelpunkt und sind farblich passend getönt. - Der Zoom-Out stoppt am sinnvollen Urmutter-Einrollpunkt; die tote Restphase nach vollständigem Einrollen wurde gekürzt. Nächster sinnvoller Schritt: 1. Fokusraum weiter entflechten: `EditField`, `ScaleRow`, Wortlink-/Textblocklogik. 2. Danach Import/Export/Print härten. 3. Danach Übergabe-ZIP mit reduziertem Handoff-Dokumentensatz.


## Weiter mit ITMO ab v4.0.403_edge_threads.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.403.md

Weiter mit ITMO ab v4.0.403_edge_threads. Wichtig: Ton/Sound bleibt eingefroren. Normale Bühne nutzt gerade Fäden ohne Animation. Fäden dürfen am Rand sichtbar bleiben, wenn eine Verbindung zu einem außerhalb liegenden direkten Eltern-/Kindpolygon besteht. Innen-/Kontaktfäden bleiben verboten. Nächster sinnvoller Schritt: Fokusraum weiter entflechten (`EditField`, `ScaleRow`, Text-/Wortlinklogik) oder Sichttest der Randfäden.


## Bitte bei ITMO v4.0.404 weitermachen. Wichtig: Ton/Sound bleibt eingefroren. Bühne/Fäden/Zoom aus v4.0.403/404 nur bei e
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.404.md

Bitte bei ITMO v4.0.404 weitermachen. Wichtig: Ton/Sound bleibt eingefroren. Bühne/Fäden/Zoom aus v4.0.403/404 nur bei echten Fehlern anfassen. Fokusraum wurde weiter entflechtet: `FocusEditField`, `FocusScaleRow`, `FocusWordText`. Nächster sinnvoller Schritt ist ein Sichttest des Fokusraums und danach Import/Export/Print-Härtung.


## Bitte mit ITMO v4.0.405 weitermachen. Aktueller Stand: Bühne/Fäden/Zoom sind grundsätzlich angenommen. Ton/Sound bleibt 
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.405.md

Bitte mit ITMO v4.0.405 weitermachen. Aktueller Stand: Bühne/Fäden/Zoom sind grundsätzlich angenommen. Ton/Sound bleibt auf unbestimmte Zeit eingefroren und darf nicht weiterentwickelt werden. Wichtige Regeln: - Normale Bühne: gerade Fäden, keine Fadenanimation, keine Polygonruhebewegung. - Vollbild/Idle: Sinus-/Wellenfäden und Polygonruhe dürfen nur dort laufen. - Fäden dürfen aus dem Bildschirmrand laufen, wenn ein Eltern-/Kindpolygon außerhalb liegt. - Keine globale Abdunkel-Folie über Bühne/Struktur/Labels/Fäden. - Bühnenhintergrund darf etwas ruhiger/dunkler sein, aber nur als Hintergrundfarbe, nicht als Overlay. - Labels mittig über Polygonmittelpunkt. - Doppeltipp auf Polygon erzeugt ein neues Kind; keine Langtipp-Kinder. - Neues Kind muss selbst aus der Mutter herauskommen, kein altes Geschwister darf scheinbar neu aufgehen. - Vorlagen dürfen nicht in generische Kinder wie Ursprung, Ansatz, Begriff, Struktur, Beispiel zerfasern; solche Inhalte gehören als Textblöcke in das passende Polygon. Gefühle/Bedürfnisse sind von dieser harten Kompaktregel ausgenommen. Nächste Arbeit: 1. Fokusraum auf Gerät sichten und kleine Bedienfehler beheben. 2. Import/Export/Print härten. 3. Vorlagen praktisch prüfen und ggf. weiter entschlacken. 4. Immer ZIP liefern.


## Weiter ab ITMO v4.0.408_focusroom_cleanup. Prüfe zuerst Fokusraum: Titel getrennt vom Textkörper, keine automatischen Ur
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.408.md

Weiter ab ITMO v4.0.408_focusroom_cleanup. Prüfe zuerst Fokusraum: Titel getrennt vom Textkörper, keine automatischen Urskalen, Skalen vollständig löschbar, Wiki direkt aus Titel-Edit ohne Zwischenfenster, Kinderpanel entfernt. Ton/Sound bleibt eingefroren.


## Weiterarbeiten ab ITMO v4.0.409.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.409.md

Weiterarbeiten ab ITMO v4.0.409. Priorität: Fokusraum testen und feinziehen. Bitte zuerst prüfen: 1. Öffnet der Fokusraum vollständig ohne sichtbare Bühnenstruktur dahinter? 2. Sind Vorlagenkapitel wie „Mensch und Betätigung“ nicht mehr direkt doppelt sichtbar? 3. Springt der Editor beim Bearbeiten an den Blockanfang, ohne dass die Tastatur den Text verdeckt? 4. Ist die rechte Buttonleiste verständlich: Bearbeiten/Fertig, Wiki, Farbe, Skala, Kind, Löschen? 5. Öffnet das Farb-/Bild-/Symbolfenster unter dem Text? 6. Sind Rahmen-in-Rahmen deutlich reduziert? Nicht reaktivieren: Ton/Sound. Nicht wechseln: Expo SDK 54.


## Arbeite auf Basis von ITMO v4.0.410 weiter. Ton/Sound bleibt eingefroren. SDK 54 bleibt. Fokusraum ist jetzt Vollbild oh
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.410.md

Arbeite auf Basis von ITMO v4.0.410 weiter. Ton/Sound bleibt eingefroren. SDK 54 bleibt. Fokusraum ist jetzt Vollbild ohne oberes Mini-Strukturband, mit stärkerer Titelduplikat-Bereinigung und Keyboard-Scroll-Nachführung. Nächster sinnvoller Pass: realer Sichttest an GERG/Befundung/Anatomie, Rest-Duplikate in Vorlagen identifizieren, Fokusleiste weiter auf Symbolklarheit und große Touchflächen prüfen, danach erst wieder Bühne/Performance anfassen.


## Weiter mit ITMO v4.0.468-vector-inheritance. Erst App testen. Prüfe besonders Anatomie-Knochen: Vektorvererbung, Becken/
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.468.md

Weiter mit ITMO v4.0.468-vector-inheritance. Erst App testen. Prüfe besonders Anatomie-Knochen: Vektorvererbung, Becken/Thorax/Kopf-Achse, Beine/Füße nach außen-unten. Keine Anatomie-Sonderregeln bauen. Wenn die Richtung stimmt, danach Label-Priorität und kleine Überschneidungen glätten.


## Weiter ab ITMO v4.0.477. Erst Dokumentation lesen. v4.0.477 enthält Promptgenerator, Paste-TXT-Import und weiße rahmenlo
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.477.md

Weiter ab ITMO v4.0.477. Erst Dokumentation lesen. v4.0.477 enthält Promptgenerator, Paste-TXT-Import und weiße rahmenlose Bühnenlabels. Bullauge/Anatomie gelten als stabile Referenz und dürfen nicht grob verändert werden. Teste zuerst Appstart, Kompass, Anatomie, Promptgenerator und Paste-Import. Danach WM 2026 visuell prüfen: Weltmeister als rechter Ziel-/Urkern, Äste nach links. Keine Sonderregeln für Geburt, Anatomie, LWS oder Kompass. Ton bleibt pausiert. Jede Übergabe als ZIP.


## NEXT_CHAT_PROMPT v4.0.664
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.664.md

# NEXT_CHAT_PROMPT v4.0.664 Weiter mit v4.0.665 auf Basis von `ITMO_v4.0.664_foreground_circle_hull_restore.zip`. Prioritaet: 1. Screenshots gegen die Kreis-vor-Huelle-Regel pruefen. 2. Falls Kreis/Huelle jetzt stabil sind: Fadenanker an 3er/4er-Huellen feinkalibrieren. 3. Falls Dreieck zu gross wirkt: nur Tangentenradius feinjustieren, nicht wieder den Vordergrundkreis entfernen. 4. Keine Rueckkehr zu shape.points als Render-Hull-Quelle.


## NEXT_CHAT_PROMPT v4.0.672
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/NEXT_CHAT_PROMPT_v4.0.672.md

# NEXT_CHAT_PROMPT v4.0.672 Weiter mit v4.0.673 auf Basis von `fxchs-grematik-de-013.zip`. Priorität: 1. Quelle lokal öffnen und `npm install` ausführen. 2. `npm run preflight` und `npx expo-doctor` prüfen. 3. Danach erst TestFlight-Build vorbereiten. 4. Visuellen Kern prüfen: Intro-Skip, GREMATIK-Erstbesuch, Start, Bühne, Fokusraum, Import. 5. Keine Rückkehr zu sichtbarem Versionsnamen in der App; sichtbarer Name bleibt `GREMATIK`.


## Polygonankerkreis
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/POLYGONANKERKREIS.md

# Polygonankerkreis Der Polygonankerkreis ist der unsichtbare Konstruktionskreis jedes Knotens. Regel: - Fäden ankern am Polygonankerkreis beziehungsweise am daraus abgeleiteten sichtbaren Hüllenrand. - Der Polygonankerkreis erzeugt die Tangenten. - Die Tangenten erzeugen die Polygonhülle. - Die Hülle darf nie zurück die Anker bestimmen. - Familienkreise sind nur Entwicklungs-/Orientierungshilfe und keine Ankerquelle. Begriffe: - Polygonankerkreis: Kreis für Anker, Tangenten und Hüllenkonstruktion. - Familienkreis: Entwicklungs-/Lesekreis Mutter bis Kindabstand. - Hülle: gefüllte sichtbare Polygonform aus Tangenten des Polygonankerkreises.


## QUALITY_CHECK_v4.0.193
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.193.md

# QUALITY_CHECK_v4.0.193 ## Ergebnis v4.0.192 wurde technisch geprüft und als v4.0.193 stabilisiert. Der Schwerpunkt lag auf Syntax, JSON, Import-/Scope-Risiken, Bildmehrfachauswahl, Undo, Suche, Footer/Fokusraum und Übergabedokumenten. ## Automatisch geprüft - Alle JavaScript-Dateien mit `node --check`. - `app.json` mit JSON-Parser. - `package.json` mit JSON-Parser. - Suche nach alten Footer-Griff-Resten: `Themen hochziehen`, `sheetFooterGrab`. - Sichtprüfung kritischer Module: `App.js`, `FocusRoom.js`, `LibraryPanel.js`, `Stage.js`, `StageSearch.js`, `StageRenderLayers.js`, `StageViewMath.js`, `StageGravity.js`, `photoMaps.js`, `model.js`, `contentV164.js`, `workflowV162.js`, `treeV189.js`. ## Gefunden und bereinigt - Alte v4.0.190-Handoff-Dateien im `docs`-Ordner entfernt. - Übergabedokumente auf v4.0.193 neu gesetzt. - App-/Build-Version auf 4.0.193 gesetzt. - Bildast-Text-Verkettung in `App.js` auf explizites `\n` normalisiert. ## Technisch offen, nur Gerätetest möglich - iOS-Fotobibliothek: Mehrfachauswahl, begrenzter Fotozugriff und `selectionLimit` müssen auf dem iPhone getestet werden. - Expo Go / iOS: Kamera, MediaLibrary und ImagePicker können nur dort vollständig geprüft werden. - Share Sheet / Insta: Komposition und sichere Vorschau müssen auf dem Gerät geprüft werden. - Tastaturverhalten im Fokusraum und auf der Suche muss auf iPhone geprüft werden. ## Bedienlogik offen - Bildast-Vorschau ist noch eine Systemabfrage, keine echte Mini-Baumvorschau. - Undo ist funktional, aber noch nicht semantisch gruppiert. Längeres Textschreiben kann kleinteilige Undo-Schritte erzeugen. - Suche ist beruhigt, aber bei Tastatur und vielen Treffern noch ein Feinschliff-Thema. - Footer im Fokusraum funktioniert, muss optisch weiter pixelgenau geprüft werden. ## Empfehlung nächster Schritt v4.0.194 sollte kein großer Umbau sein, sondern eine echte Vorschau-Struktur vor Bildast-Übernahme plus ein Gerätetest-Fixlauf.


## Quality Check v4.0.212
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.212.md

# Quality Check v4.0.212 ## Geprüft - `node --check App.js` - `node --check src/ui/FocusRoom.js` - `node --check src/core/model.js` - `node --check src/core/templates/templateStructureV212.js` - `node --check src/core/printScene.js` - temporärer TypeScript/JSX-Parsecheck über alle JS-Dateien - ESM-Testkopie zur Template-Erzeugung ## Template-Erzeugung Geprüfte Kinds: - empty - befundung - gerg - icf - icd - amdp - persoenlichkeit - anatomie - gefuehl - beduerfnis Ergebnis: - keine Nodes ohne Textblöcke - keine Blockpfade leer - Node-Skalen nach Templatepass auf 0 verschoben - Block-Skalen vorhanden ## Risiko - Expo-Go-Gerätetest steht aus. - Die neue Blocknavigation kann visuell noch zu dicht wirken, wenn ein Kapitel sehr viele Textblöcke und Kinder hat.


## Quality Check v4.0.213
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.213.md

# Quality Check v4.0.213 ## Geprüft - `node --check App.js` - `node --check src/core/model.js` - `node --check src/ui/FocusRoom.js` - `node --check src/ui/LibraryPanel.js` - `node --check src/ui/Stage.js` - `node --check src/core/printScene.js` ## Schwerpunkt - Fokusraum-UI bleibt syntaktisch sauber nach Umbau von Breadcrumb/Blocknavigation auf vertikale Polygon-Text-Schiene. - Modellfunktionen halten den ersten Textblock als kanonischen Polygontext synchron mit `node.text`. - Neue Kinder erhalten sofort Blockstruktur und Urskala. - Share-Flow löscht die Auswahl nicht mehr vor dem Capture. ## Nicht geprüft - Kein Expo-Go-Gerätetest im Container möglich. - Kein realer iOS-Share-Sheet-Test im Container möglich.


## Quality Check v4.0.214
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.214.md

# Quality Check v4.0.214 ## Syntax Geprüft mit `node --check`: - `src/core/templates/chapterTemplatesV214.js` - `src/core/model.js` - `src/core/chapterText.js` - `src/ui/FocusRoom.js` - `src/ui/LibraryPanel.js` - `src/core/printScene.js` - `App.js` Ergebnis: keine Syntaxfehler. ## Semantischer Template-Test Temporärer ESM-Test mit `createTemplateMap`, `buildChapterTextFromMap` und `parseChapterTextToMap`. Ergebnis: - empty: 17 Polygone, 17 Blöcke, Roundtrip 17. - gerg: 30 Polygone, 30 Blöcke, Roundtrip 30. - befundung: 36 Polygone, 36 Blöcke, Roundtrip 36. - icf: 32 Polygone, 32 Blöcke, Roundtrip 32. - icd: 27 Polygone, 27 Blöcke, Roundtrip 27. - amdp: 43 Polygone, 43 Blöcke, Roundtrip 43. - persoenlichkeit: 29 Polygone, 29 Blöcke, Roundtrip 29. - anatomie: 62 Polygone, 62 Blöcke, Roundtrip 62. - gefuehl: 29 Polygone, 29 Blöcke, Roundtrip 29. - beduerfnis: 35 Polygone, 35 Blöcke, Roundtrip 35. Keine Nodes ohne Textblock. Keine ersten Blöcke ohne Skala. Alle unterstützten Vorlagen tragen `chapterTemplateV214`. ## Nicht geprüft - Expo-Go-Gerätetest. - Kameraaufnahme auf echtem Gerät. - iOS/Android Teilen nach Aufnahme. - Visuelle Scroll-Position im Fokusraum bei sehr großen Vorlagen.


## Quality Check v4.0.215
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.215.md

# Quality Check v4.0.215 ## Statische Checks - `node --check App.js`: ohne Fehler. - `node --check src/ui/FocusRoom.js`: ohne Fehler. - `node --check` für alle `src/core/*.js` und `src/ui/*.js`: ohne Fehler. - Style-Referenzcheck in `FocusRoom.js`: keine verwendeten, aber undefinierten Styles. ## Manuell geprüfte Struktur - Fokusraum rendert Header mit Maptitel. - Die alte separate Blockliste unterhalb der Kapiteltextliste wurde entfernt. - `PolygonTextRail` übernimmt Navigation, Anzeige, Inline-Textbearbeitung, Skalenbalken und aktuelles Medien-/Symbol-/Farbpanel. - Aktuelle Wortmarkierungen sitzen im aktiven Textblock. - Nichtaktive Polygontexte bleiben navigierbar. ## Risiken - Gerätetest steht aus. - React-Native-Tastaturverhalten bei langem Inline-Text muss auf iOS geprüft werden. - Direktbearbeitung nichtaktiver Einträge ist bewusst noch nicht aktiv, damit die bestehende selectedId-Logik stabil bleibt. ## Ergebnis Code syntaktisch sauber. Gerätetest erforderlich.


## QUALITY CHECK v4.0.217
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.217.md

# QUALITY CHECK v4.0.217 ## Statische Checks - `node --check App.js`: bestanden. - `node --check` für alle Dateien unter `src/`: bestanden. - `src/core/model.js`: keine `Anrede`-Blockerzeugung mehr. - `src/ui/FocusRoom.js`: neue Skalenlogik mit `hiddenScaleIds`, `editingScaleIds`, Inline-Labeloverlay und direkter Textblockbearbeitung vorhanden. - `src/ui/LibraryPanel.js`: Footerhöhe reduziert, Twin-Dim bleibt bei 0.25, Modusbutton ist nicht mehr deaktiviert, wenn das Fenster offen ist. - `src/core/storage.js`: Exportversion auf 4.0.217 gesetzt. - `src/core/printScene.js`: Printkopf auf 4.0.217 gesetzt. ## Funktionsbereiche statisch geprüft ### Wiki - Wiki-Funktion im Fokusraum bleibt über `fetchWikipediaArticle` erhalten. - Ziel: ausgewähltes Wort oder aktiver Titel wird in den aktiven Textblock eingefügt. - Offener Laufzeittest: Netzwerk/Wikipedia im Expo-Go-Gerätetest prüfen. ### Print - `buildPrintHtml` bleibt angebunden. - Kapiteltext wird weiter über `buildChapterTextFromMap` in den Print aufgenommen. - Zeitachsenmodus bleibt als Printsektion vorhanden. ### Foto / Kamera - Kameraaufnahme bleibt über Footer-Foto direkt erreichbar. - Hintergrund-Auswahlfenster wurde nicht weiter als Hauptweg angeboten. - Offener Laufzeittest: Kameraerlaubnis, Countdown, Root-Hintergrundspeicherung. ### Bilder - Foto-in-Kreis und Fotowelt-Funktion bleiben im Panel erhalten. - Eigene Bilder werden weiterhin als Referenzen behandelt. ### Import / Export - Export bleibt lesbare ITMO-TXT mit Kapiteltext plus JSON-Block. - Import akzeptiert weiterhin Kapiteltext, ITMO-TXT und JSON. - Exportpayload jetzt 4.0.217. ### Footer - Footerhöhe niedriger. - Buttons bleiben bei ausgefahrenem Fenster blass, aber bedienbar. - Deckkraftminimum für Twin-Dim: 0.25. ## Nicht vollständig automatisch prüfbar - Expo-Go-Tastaturverhalten im Inline-Editor. - Skalen-Labelbearbeitung auf iOS-Tastatur. - Kamera/Fotozugriff auf echtem Gerät. - Wikipedia-Fetch bei Netzwerkfehlern. - Printdialog und Share-Sheet auf iOS.


## Quality Check v4.0.218
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.218.md

# Quality Check v4.0.218 ## Automatisiert geprüft - App.js: Syntaxcheck ok. - Alle Dateien unter src: Syntaxcheck ok. - ZIP-Erzeugung und ZIP-Inhaltsprüfung ok. ## Statisch geprüft - Mobile Auto-Zeitspur wird über `Platform.OS !== 'web' && width > height` bestimmt. - Mobile speichert `timeline` nicht dauerhaft als Modus. - Mobile Modusbutton wird im automatischen Querformat-Zeitspurzustand ausgeblendet. - Web behält den Zeitmodus im Zyklus. - Share und Print verwenden den effektiven Modus. ## Nicht im Container prüfbar - Expo-Go-Drehverhalten auf iPhone/Android. - Kameraaufnahme. - Native Print-/Sharing-Dialoge. - Web-Mausrad im Browser.


## Quality Check v4.0.219
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.219.md

# Quality Check v4.0.219 ## Syntax Bestanden: - `node --check App.js` - `find src -name '*.js' -print0 | xargs -0 -n1 node --check` ## Fokusraum Statisch geprüft: - Bearbeiten/Ganzansicht/Teaser-Badges vorhanden. - Nicht aktive Textblöcke nutzen `numberOfLines={10}`. - Aktueller Textblock bleibt vollständig sichtbar und editierbar. - Wortmarkierungen bleiben im aktiven Textblock. - Leere Teaser bleiben antippbar. ## Vorlagen Temporärer Template-Erzeugungstest bestanden: - Alle Vorlagen erzeugen Nodes. - Keine Nodes ohne Textblock. - Keine ersten Textblöcke ohne Skala. - `templateDepthV219` ist gesetzt. - Umfang deutlich erhöht: Anatomie 260, Zeit 253, AMDP 193, Befundung 164 Polygone. ## Versionierung Statisch geprüft: - `package.json` 4.0.219. - `app.json` 4.0.219, iOS build 219, Android versionCode 219. - Exportversion 4.0.219. - Print-Meta v4.0.219. - Template-Systemstruktur v4.0.219. ## Nicht im Container prüfbar - Expo-Go-Laufzeit. - Tastaturverhalten auf iOS. - Kameraaufnahme. - Fotobibliothek. - Wiki-Fetch auf Gerät. - Print-/Share-Dialog. - Querformatwechsel auf echtem Gerät.


## Quality Check v4.0.222
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.222.md

# Quality Check v4.0.222 ## Statisch geprüft - JS-Syntax: App und alle src-Dateien ohne Fehler. - JSON: app.json und package.json valide. - Leeres Thema: createTemplateMap('empty') läuft nicht mehr durch das Kapiteltemplate. - Fokus-Wiki: Callback kann nun nodeId + blockId verarbeiten. - Bibliothek: lokale Suche im Themenlistenbereich aus der UI entfernt. ## Gerätetest offen - Neues Thema öffnen: genau ein Kernpolygon, kein Kapitelbaum. - Kerntext löschen und ab erstem Buchstaben neu tippen. - Globale Suche im Start, Fokusraum und Bühne. - Treffer öffnen. - Nicht gefundenen Begriff als Thema anlegen. - Exakt vorhandenen Titel suchen und Hinzufügen mit Zahl prüfen. - Wiki am Teasertitel ausführen und Rückgängig testen.


## Quality Check v4.0.254
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.254.md

# Quality Check v4.0.254 ## Parsercheck - TypeScript/JSX-Parsercheck über `App.js` und alle JS-Dateien unter `src`: bestanden. - 29 JS-Dateien geprüft. ## Rest-Check - Keine `SwipeRailCard`-/`SwipeAction`-Reste. - Keine `sheetPan`-/`footerGrab`-/`focusPan`-Reste. - Keine `windowSwipe`-/`swipe`-Reste in App-/UI-Code. - Stage-`PanResponder` bleibt bewusst bestehen, weil er nicht Fenster-Swipe, sondern Bühnenbedienung ist. - `buildGeometry` ist aus dem Fokusraum entfernt; bleibt in der Bühne als Kerngeometrie. ## Funktionale Prüfpunkte - Start-/Bibliotheksfenster: nur Footersteuerung, kein Drag-Swipe. - Fokusfenster: X schließt, kein Drag-Swipe. - Fensteranimation: sichtbar von unten hoch und zurück runter. - Footer: Buttons bleiben dauerhaft unten erreichbar. - Template-Teaser: kein `Für fxchs:` mehr. - Rail-Aktionen: sichtbar, nicht per Swipe versteckt. ## Offene Beobachtung Bei sehr großen Vorlagen kann weiterhin `buildGeometry(map, stageBox)` der Hauptkostenpunkt sein. Nächste Optimierung: Geometrie nur für sichtbare oder nahe Knoten berechnen beziehungsweise Ergebnisse stärker memoisiert wiederverwenden.


## QUALITY CHECK v4.0.289
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.289.md

# QUALITY CHECK v4.0.289 Statisch geprüft: - App.js - src/ui/Stage.js - src/ui/StageTone.js - src/core/templates/chapterTemplatesV214.js - src/core/geometry.js - src/ui/StageRenderLayers.js - src/ui/PolygonView.js Außerdem geprüft: - package.json parsebar - app.json parsebar Nicht geprüft: - Kein Metro-Bundle-Test im Container, da node_modules fehlen. - Kein Gerätetest.


## Quality Check v4.0.333
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.333.md

# Quality Check v4.0.333 ## Bestanden - Änderung basiert auf real vorhandener v4.0.332-ZIP. - ZIP-Ziel wird tatsächlich erstellt. - Keine Importliste verändert. `Circle` und `Path` waren in `StageRenderLayers.js` bereits importiert. - Legacy-Fallback `compactStagePolygonPoints` bleibt vorhanden. ## Manuell in Expo Go prüfen 1. App starten. 2. Thema mit Endknoten öffnen. 3. Prüfen: Endknoten erscheinen als Kreis in der leichten Strukturansicht. 4. Node mit genau einem Kind prüfen: Linie mit Endpunkt. 5. Node mit zwei Kindern prüfen: Dreieck. 6. Node mit vielen Kindern prüfen: n-Eck wird runder. ## Risiko Die Kerngeometrie nutzt weiterhin robuste Anheftungspolygone. Das ist Absicht, weil reine Kreis-/Liniengeometrie sonst Hit-Tests und Kinderanheftung destabilisieren könnte.


## QUALITY CHECK v4.0.334
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.334.md

# QUALITY CHECK v4.0.334 Bestanden: - Harte `expo-camera`-Imports entfernt. - `package.json` ohne `expo-camera`. - `Stage.js` rendert keinen `CameraView` mehr. - Fotoaufnahme bleibt über `expo-image-picker` verfügbar. Nicht vollständig getestet im Gerätelauf innerhalb dieses Chats.


## QUALITY CHECK v4.0.338
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.338.md

# QUALITY CHECK v4.0.338 Static Check: - Importstruktur unverändert. - Keine neue Abhängigkeit ergänzt. - JSX-Struktur in geänderten Funktionen beibehalten. - ZIP aus echter Arbeitsbasis erzeugt. Risiko: - Keine Laufzeit auf Gerät innerhalb dieser Umgebung. - Sichtprüfung muss in Expo Go erfolgen.


## QUALITY CHECK v4.0.341
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.341.md

# QUALITY CHECK v4.0.341 ## Geprüft - Keine neue Abhängigkeit. - Web-Code bleibt durch Platform.OS === 'web' begrenzt. - Mobile PanResponder bleibt erhalten. - Print-Metadaten aktualisiert. - Versionen in app.json und package.json aktualisiert. ## Risiken - Browser-Wheel-Verhalten kann je nach Trackpad/Firefox/Chrome unterschiedlich skaliert sein. - Native Builds ignorieren Web-only Props; das ist gewollt. ## Manuell testen - Web: Rad/Trackpad Bühne bewegen. - Web: Strg/Cmd+Rad zoomt am Zeiger. - Web: Pfeiltasten, Plus, Minus, PageUp, PageDown, 0. - iOS Expo Go: normaler Touchbetrieb unverändert.


## QUALITY CHECK v4.0.343
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.343.md

# QUALITY CHECK v4.0.343 ## Geprüft - ZIP basiert auf vorhandener lauffähiger v4.0.341. - Keine neue npm-Abhängigkeit. - `expo-camera` bleibt entfernt. - Statistikberechnung arbeitet rein lokal aus `map.nodes`. - Wiki-Funktion ist auf Web aktiv, native sicher passiv. - App-Version, Export-Version und Print-Version aktualisiert. ## Nächster Test in Expo 1. App starten. 2. Bühne öffnen. 3. Statistik unten links antippen. 4. Kreis auswählen und prüfen, ob Aktivwerte wechseln. 5. Web: Wiki-Chip anklicken.


## Quality Check v4.0.344
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.344.md

# Quality Check v4.0.344 ## Geprüft - ZIP aus v4.0.343 entpackt und v4.0.344 auf echter Arbeitsbasis erstellt. - `package.json`, `app.json`, `src/core/storage.js` und Print-Metadaten versioniert. - Codepfad `src/core/templates/contentV164.js` enthält keine neuen Lernkarten-Kapitelbezeichnungen mehr. - `expo-camera` ist nicht in `package.json` enthalten. - `src` behält die bestehenden Expo-SDK-54-Abhängigkeiten. ## Ergebnis Konservative Qualitätsrunde bestanden. Es wurden keine riskanten Feature-Abhängigkeiten ergänzt. ## Bekannte offene Punkte - Vollständiger Laufzeittest muss beim Nutzer in Expo Go erfolgen. - Alte Dokumentationshistorie kann frühere Begriffe wie „Lernkarten“ enthalten; der aktive Vorlagen-Code wurde bereinigt. - Beta-Freeze braucht noch eine letzte Gesamtübergabe mit Testanweisung.


## QUALITY CHECK v4.0.345
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.345.md

# QUALITY CHECK v4.0.345 - Neue Abhängigkeiten: nein. - Geometrie-Risiko: bewusst vermieden. - Nutzerhinweis aufgenommen: Fäden sollen an Seitenrändern ankern. - Nutzerlob aufgenommen: kinderlose Kinder als Kreise bleiben. - Lernkarten als Extrakapitel: bleibt entfernt. - Empfohlener Test: Start in Expo Go, Bühne öffnen, Polygone/Fäden visuell prüfen, Import/Export kurz testen.


## QUALITY CHECK v4.0.346-anchor-points-real
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.346.md

# QUALITY CHECK v4.0.346-anchor-points-real Geprüft: - Keine zusätzliche npm-Abhängigkeit. - Änderung lokal auf `src/ui/StageRenderLayers.js` beschränkt. - Kinderlose Kinder bleiben visuell Kreis-/Randlogik. - Fäden verwenden nicht mehr pauschal Zentrum plus Radius, sondern Seiten-/Randprojektion. Risiko: - Bei sehr unregelmäßigen oder animierten Polygonpunkten kann der nächste Seitenpunkt optisch springen. Das ist für spätere Feinkorrektur vorgemerkt. Testempfehlung: 1. App starten. 2. Map mit mindestens drei Ebenen öffnen. 3. Kinderlose Endknoten prüfen: Faden muss am Kreisrand enden. 4. Mutterpolygon mit mehreren Kindern prüfen: Fäden sollen sichtbar an Außenkanten statt im Zentrum ankern.


## Quality Check v4.0.347
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.347.md

# Quality Check v4.0.347 - Keine neue Abhängigkeit. - Stage.js Hüllenpunkte aus Labelmetriken ergänzt. - StageRenderLayers.js Kompaktglyph zentriert. - Kinderlose Kinder bleiben Kreise. - Erwarteter Sichttest: Polygone kleben näher am Inhalt und wirken weniger dekorativ.


## QUALITY CHECK v4.0.348
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.348.md

# QUALITY CHECK v4.0.348 ## Geprüft - ZIP-Basis v4.0.347 entpackt. - StageRenderLayers gezielt geändert. - Keine neue Abhängigkeit ergänzt. - Versionen in app.json/package.json auf 4.0.348 gesetzt. - Export-/Print-Versionen auf 4.0.348 gesetzt. ## Risiko Mittel: Das Routing nutzt jetzt kompakte Bühnen-Glyphen. Falls visuell noch einzelne Fäden ungünstig laufen, liegt das eher an der noch einfachen Kreuzungslogik, nicht mehr am Mittelpunktanker. ## Sichttest Bitte prüfen: - Fäden starten sichtbar näher an Kreis- und Polygonrändern. - Keine auffälligen Mittelpunkt-Fäden mehr. - Kinderlose Kinder bleiben als Kreise sichtbar. - App startet ohne neue Dependency-Fehler.


## QUALITY CHECK v4.0.349
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.349.md

# QUALITY CHECK v4.0.349 ## Prüfpunkte - Versionen in app.json/package.json auf 4.0.349 gesetzt. - Export-/Print-Versionen auf 4.0.349 gesetzt. - Keine neue Abhängigkeit ergänzt. - JSX-Duplikat in StageRenderLayers geprüft: keine doppelte rotate-Konstante. - Änderung bleibt auf optische Parameter und Handoff-Doku begrenzt. ## Sichttest nötig - Prüfen, ob Label nicht mehr wie separater Button wirkt. - Prüfen, ob Hülle näher am Inhalt sitzt. - Prüfen, ob Fäden nicht zu dominant geworden sind.


## Quality Check v4.0.350
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.350.md

# Quality Check v4.0.350 ## Static Checks - `node --check src/ui/Stage.js` bestanden. ## Risikoarmut - Keine neue Dependency. - Kein Umbau der Geometrie. - Soundeffekt hängt nur an bestehender Ruheanimation. ## Offene Sichttests - Prüfen, ob der Tonbutton im Alltag nicht stört. - Prüfen, ob der Button nach Ruhephase zuverlässig erscheint. - Prüfen, ob Berührung Ton sofort beendet.


## Quality Check v4.0.351
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.351.md

# Quality Check v4.0.351 ## Geprüft - `node -c src/core/geometry.js` bestanden. - `node -c src/ui/Stage.js` bestanden. - `node -c src/ui/StageRenderLayers.js` bestanden. ## Erwartete Wirkung - Weniger Sonderformen: 1/2/4 Kinder sehen als Viereck stabiler aus. - Große Maps sollten weniger träge wirken, weil weniger Elemente gleichzeitig gerendert werden. ## Bekannte offene Punkte - Kein hörbarer Ton auf nativen Geräten ohne echte native Audio-Ausgabe. - Bei sehr großen, dicht gepackten Vorlagen kann die Grundgeometrie weiterhin überlagern; gerendert wird aber weniger davon.


## Quality Check v4.0.352
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.352.md

# Quality Check v4.0.352 - Keine neue Abhängigkeit ergänzt. - Geometrieregel zentral in `src/core/geometry.js` angepasst. - Sichtbare Hülle in `src/ui/Stage.js` als Fadenankerbasis gesetzt. - Kinderlose Kinder bleiben visuell Kreise. - Bekannter offener Punkt: Ton noch nicht hörbar.


## Quality Check v4.0.353
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.353.md

# Quality Check v4.0.353 Statischer Check: - geometry.js bearbeitet. - Keine neue Abhängigkeit. - Urkreisregel im Code korrigiert. - Radial-Familien-Slots ergänzt. Risiko: - Layout ist geometrisch stärker verändert; Sichttest erforderlich. - Bei sehr großen Maps greift weiterhin das vorhandene Performance-Culling aus den Vorversionen.


## ITMO v4.0.354 anatomy body layout
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.354.md

# ITMO v4.0.354 anatomy body layout Realer Ausbau auf Basis v4.0.353. ## Schwerpunkt - Anatomie-Vorlage als Körperapparat neu angelegt. - Kopf, Wirbelsäule, Hüfte/Becken, Arme links/rechts, Beine links/rechts klar räumlich platziert. - Linke Körperseite fokussiert Knochen und Landmarken. - Rechte Körperseite fokussiert Muskeln und Nerven. - Organe werden bewusst nicht in diese Anatomie-Map gepackt; dafür ist später eine eigene Organ-Map vorgesehen. - Finger und Zehen sind als erkennbare Unterstrukturen angelegt. - Nullpunkt/erste Mitte bleibt Kreis. - Urkreisregel bleibt: Endkinder sind Kreise; Kinderknoten richten ihre Form nach der Kinderzahl. ## Nächste Sichttests 1. Anatomie-Vorlage öffnen. 2. Prüfen, ob Körperachsen sichtbar sind: Kopf oben, Wirbelsäule zentral, Becken/Hüfte unten, Arme seitlich, Beine unten. 3. Prüfen, ob linke Seite Knochen und rechte Seite Muskeln/Nerven trägt. 4. Prüfen, ob bei größerer Map nur Sichtbares flüssig bleibt. ## Offene Punkte - Ton hörbar machen bleibt offen. - Fadenanker weiter feinjustieren. - Organ-Map separat anlegen.


## QUALITY CHECK v4.0.355
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.355.md

# QUALITY CHECK v4.0.355 Geprüft: - `node --check src/core/geometry.js` bestanden. - Keine neue Abhängigkeit. - Expo SDK 54 bleibt unangetastet. Risiko: - Die Geometrie wurde zentral geändert; Sichttest ist nötig, besonders bei großen Anatomie-/GERG-Maps.


## Quality Check v4.0.356
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.356.md

# Quality Check v4.0.356 ## Static - `node --check src/core/geometry.js`: bestanden. ## Risiko Mittel. Die Geometrie-Engine wurde gezielt an einer Kernstelle verändert. Keine neue Abhängigkeit. ## Wichtig Die Regel gilt jetzt codezentral. Einzelne Maps sollen diese Formlogik nicht mehr manuell brechen.


## QUALITY CHECK v4.0.357
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.357.md

# QUALITY CHECK v4.0.357 - `node --check App.js` bestanden. - `node --check src/core/geometry.js` bestanden. - `node --check src/ui/StageRenderLayers.js` bestanden. - Keine neue Abhängigkeit. - Risiko: tatsächlicher Sichttest auf iOS nötig, weil die alte Layoutlogik noch Positionen aus der vorherigen Hierarchie übernehmen kann.


## Quality Check v4.0.358
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.358.md

# Quality Check v4.0.358 Geprüft: - JavaScript-Syntax der geänderten Kerngeometrie mit `node --check`. - package/app Metadaten auf v4.0.358 gesetzt. - Keine neue Dependency. Bekannte offene Punkte: - Ton ist weiterhin nicht hörbar gelöst. - Anatomie benötigt nach der Seitenlogik noch Sichttest und ggf. Mapdaten-Korrektur. - Kollisionen zwischen großen Unterbäumen sind noch nicht vollständig gelöst.


## QUALITY CHECK v4.0.359
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.359.md

# QUALITY CHECK v4.0.359 Statische Prüfung: - Keine neue Abhängigkeit. - StageRenderLayers.js gezielt geändert. - Fadenanker nicht mehr per Projektion auf beliebige Segmentpunkte. - Nähe-Fäden deaktiviert. Erwartung im Sichttest: - Fäden enden mittig auf Seiten. - Keine Eckpunkt-Fäden bei Polygonen. - Keine wandernden Ankerpunkte entlang Seiten.


## QUALITY CHECK v4.0.360
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.360.md

# QUALITY CHECK v4.0.360 Static: - node --check src/core/geometry.js bestanden. - Keine neue Abhängigkeit. Geometrie: - Kreis-Endkinder kompakter gemacht. - Layout-Reste in der Grundansicht neutralisiert. - Kinderpositionen entstehen aus Mutterseiten statt aus alter Koordinate. Risiko: - Freie manuelle Ablage kann in der Grundansicht weniger dominant sein; das ist beabsichtigt, bis ein eigener Free-Layout-Modus sauber getrennt ist.


## QUALITY CHECK v4.0.362
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.362.md

# QUALITY CHECK v4.0.362 Static Check: - `node --check src/core/geometry.js` bestanden. - `node --check src/ui/Stage.js` bestanden. Manuell zu testen: - Startzoom darf nicht mehr in Tiefe/Tunnel ziehen. - Pinch darf nur leicht näher/heraus zoomen. - Große Maps müssen sichtbar cullen, aber nicht nach Tiefe verschwinden. - Mutter-Kind-Familien müssen auf einer Ebene bleiben. - Labels sollen beim leichten Reinzoomen besser lesbar werden.


## Quality Check v4.0.363
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.363.md

# Quality Check v4.0.363 - Ton-Import aus Stage entfernt. - Tonbutton aus Stage entfernt. - Sound Engine Datei entfernt. - `src/core/geometry.js` per `node --check` geprüft. - Keine neue Abhängigkeit ergänzt. - Package-Version auf 4.0.363 gesetzt. Einschränkung: JSX-Dateien wurden statisch bearbeitet, aber nicht mit Metro gebundelt. Sichttest in Expo Go bleibt notwendig.


## QUALITY CHECK v4.0.364
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.364.md

# QUALITY CHECK v4.0.364 Geprüft: - keine neue Abhängigkeit. - package/app-Metadaten auf v4.0.364 gesetzt. - Ton bleibt entfernt. - Stage-Import von TreeCrown-Anwendung entfernt. - FamilyTether nutzt sichtbare Seitenmitten. Zu testen auf Gerät: - Erste Fäden an der Urmutter. - Rauszoom: übersichtlich, billig, keine Tiefe. - Reinzoom: nur leichte Label-Nähe, kein Tunnel. - Große GErg-/Anatomie-Map: Performance und sichtbarer Bereich.


## Quality Check v4.0.365
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.365.md

# Quality Check v4.0.365 Geprüft: - Expo SDK bleibt 54. - package.json ohne neue Abhängigkeit. - app.json Versionswerte aktualisiert. - Geometrieänderung bleibt im flachen 2D-Modus. Offen für Sichttest: - Urmutter-Fäden exakt an Seitenmitten. - Familienabstände in Startzoom. - Kein erneutes Tiefenverhalten.


## QUALITY CHECK v4.0.367
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.367.md

# QUALITY CHECK v4.0.367 Prüfung: - package/app Version auf 4.0.367 gesetzt. - Keine neue Dependency. - Geometrieänderung auf src/core/geometry.js begrenzt. - Flache 2D-Regel bleibt erhalten. Offen nach Sichttest: - Optische Kollisionen in großen Anatomie-Maps prüfen. - Urmutter-Fäden und Kindanker anhand Screenshots erneut abgleichen.


## Quality Check v4.0.368
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.368.md

# Quality Check v4.0.368 - package.json Version auf 4.0.368 gesetzt. - app.json Version/Build auf 4.0.368 gesetzt. - Keine neue Abhängigkeit ergänzt. - `expo-camera` bleibt entfernt. - Ton bleibt entfernt. - Geometrieänderung begrenzt: Layout-Hinweise wirken nur bei Anatomie und nur als Seitenwahl. - Seitenmittenanker bleiben Kernregel. Bekannter Punkt: tatsächliche optische Körperform muss per Gerät/Screenshot geprüft werden.


## QUALITY CHECK v4.0.369
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.369.md

# QUALITY CHECK v4.0.369 - Syntaxrelevante Dateien gepatcht: src/core/geometry.js, src/ui/Stage.js, src/ui/StageRenderLayers.js, src/ui/StageViewMath.js. - App-Versionen auf 4.0.369 aktualisiert. - Keine neuen Dependencies. - ZIP soll lesbar sein.


## Quality Check v4.0.370
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.370.md

# Quality Check v4.0.370 - package/app Metadaten auf 4.0.370 gesetzt. - node --check bestanden für src/core/model.js. - node --check bestanden für src/core/geometry.js. - Keine neue Abhängigkeit. - Ton bleibt entfernt. - Expo SDK bleibt 54.


## Quality Check v4.0.371
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.371.md

# Quality Check v4.0.371 Geprüft: - ZIP lesbar. - package.json Version 4.0.371. - Keine neue Abhängigkeit. - Fadenanker-Priorität: gespeicherte Seitenmitten vor Fallback. Offen: - Sichttest: Anatomie-Abstände und Überkreuzungen.


## Quality Check v4.0.372
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.372.md

# Quality Check v4.0.372 - Keine neue Abhaengigkeit. - Syntax-Dateien existieren. - ZIP wird nach Erstellung geprueft. - Schwerpunkt: Fadenanker-Koordinatenfehler korrigiert.


## QUALITY CHECK v4.0.374
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.374.md

# QUALITY CHECK v4.0.374 - Keine neue Abhängigkeit. - Ton bleibt entfernt. - Zoom-Endstand bleibt bei 1.0. - Sichtbare Hüllen behalten Kernseitenreihenfolge. - Quadratgröße reduziert und gleichseitige Skalierung eingeführt.


## Quality Check v4.0.375
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.375.md

# Quality Check v4.0.375 - ZIP aus v4.0.374 real erzeugt. - Keine neue Abhaengigkeit. - Syntax-Importe nicht veraendert. - Fokus: Geometrie/Render-Logik, nicht neue Features.


## Quality Check v4.0.376
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.376.md

# Quality Check v4.0.376 - ZIP wird aus v4.0.375 erzeugt. - Keine neue Abhängigkeit. - Ton bleibt entfernt. - Label-Darstellung bewusst einfacher und performanter. - Zoom-Out-Cluster arbeitet stärker, Root soll am Ende übrig bleiben. - Sichttest auf Gerät erforderlich.


## Quality Check v4.0.377
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.377.md

# Quality Check v4.0.377 - Grundlage: v4.0.376. - Keine neue Abhängigkeit. - Expo SDK 54 bleibt unverändert. - Keine Bildgenerierung, keine neuen Assets. - TypeScript-Parsecheck ausgeführt mit `npx tsc --allowJs --jsx react --noEmit --target ES2020 --moduleResolution node --skipLibCheck src/ui/Stage.js src/ui/StageRenderLayers.js src/core/geometry.js`. - Fokus der Änderung: Zoom-Out/Cluster-Pipeline, Label-Lesbarkeit, begrenzte Familienrotation, Enkel-Außenabstand.


## Quality Check v4.0.378
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.378.md

# Quality Check v4.0.378 - Grundlage: v4.0.377. - Keine neue Abhängigkeit. - Expo SDK 54 bleibt unverändert. - Keine Bildgenerierung, keine neuen Assets. - Änderung lokal in `src/ui/Stage.js` plus Metadaten/Dokumentation. - Parsecheck ausgeführt: `npx --yes tsc --allowJs --jsx react --noEmit --target ES2020 --moduleResolution node --skipLibCheck src/ui/Stage.js src/ui/StageRenderLayers.js src/core/geometry.js` - Ergebnis: kein TypeScript-Parsefehler. Prüfpunkt für Gerät: - Familienöffnung: Eltern sichtbar vor Kindern. - Familienschluss: Eltern zuerst raus aus der sichtbaren Ansicht, Kinder danach. - Root-only bleibt erhalten.


## QUALITY CHECK v4.0.380
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.380.md

# QUALITY CHECK v4.0.380 Durchgeführt: - TypeScript-Transpile-Parsecheck für `App.js`, `src/ui/Stage.js`, `src/core/geometry.js` ohne Diagnostics. - Keine Assets ergänzt. - Keine SDK-Änderung. - Clusterlogik auf strukturabhängige Werte reduziert. Gezielt geprüft im Code: - Zoom-Out nutzt keine Parent-First-Close-Generation mehr. - Kinder-Gate verhindert Eltern-Reinziehen, solange sichtbare direkte Kinder noch nicht drin sind. - Pan setzt `zoomFocus` zurück. - Fokusdistanz/Outside-Focus beeinflusst die Familienabstände nicht mehr. Offener Gerätetest: - Sichttest auf iPhone/Expo Go: äußere Kinder zuerst rein, Elternteil danach. - Reiner Pan ohne Pinch: keine Abstandssprünge zwischen Mutter, Kind und Enkeln.


## Quality Check v4.0.383
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.383.md

# Quality Check v4.0.383 - `node -c App.js`: ok - `node -c src/ui/Stage.js`: ok - `node -c src/ui/StageRenderLayers.js`: ok - `node -c src/ui/FocusRoom.js`: ok Manueller Sichttest erforderlich: Fadenkontakt, deckende Flächen, Labelverzögerung, Fokusraum-Skalenlöschung.


## QUALITY CHECK v4.0.384
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.384.md

# QUALITY CHECK v4.0.384 Automatisch geprüft: - JavaScript-Parsecheck für App.js, Stage.js, StageRenderLayers.js und geometry.js. Manuell offen: - Gerätetest Zoom 0–100. - Faden nur bei echter Außenlänge. - 75%-Fadenlänge auf Anatomie/Gefühle/Bedürfnisse prüfen. - Rand-Fade auf Handyfenster prüfen.


## Quality Check v4.0.387
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.387.md

# Quality Check v4.0.387 ## Geprüft - TypeScript-Transpile-Parsecheck für App.js, StageRenderLayers.js, model.js, FocusRoom.js: ohne Fehler. - Zielpatch ist klein und berührt die stabile Zoom-/Strukturmechanik nicht. ## Risiko - Bestehende gespeicherte alte Maps mit Roottitel „Neues Thema“ werden nicht zwangsumbenannt. Die Änderung gilt für neu erzeugte leere Maps. - Falls ein gespeicherter Blocktext bereits alte doppelte Präfixe enthält, kann der Inhalt erhalten bleiben; die doppelte Bühnenanzeige durch zwei Renderquellen ist aber entfernt.


## QUALITY CHECK v4.0.390
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.390.md

# QUALITY CHECK v4.0.390 - TypeScript-Transpile-Parsecheck für alle JS-Dateien: OK. - Expo SDK bleibt 54. - Keine neuen Bildassets. - Keine neue Panelwelt. - Bühnenstruktur wurde nicht konzeptionell neu gebaut. - Risiko: Doppeltipp ersetzt alte Doppeltipp-Zentrierung auf Polygonen. Zentrierung bleibt für freien Doppeltipp erhalten.


## QUALITY CHECK v4.0.406
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.406.md

# QUALITY CHECK v4.0.406 - TypeScript-Transpile-Check für App.js, Stage.js und StageRenderLayers.js: OK. - Keine neuen Assets. - Kein Ton/Sound-Code verändert. - Keine neue UI-Schicht eingeführt. - Bühnenstruktur wird nicht mehr durch Rand-/Tiefenopacity abgedunkelt. - Risiko: Die Bühne wirkt absichtlich klarer/heller; falls zu hart, nur Hintergrundfarbe dunkeln, nicht Struktur abdunkeln.


## Quality Check v4.0.407
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.407.md

# Quality Check v4.0.407 ## Prüfpunkte - Geschlossener Footer rendert keinen `backdropVeil` mehr. - Bibliothek geöffnet rendert nur noch einen leichten Hintergrundschleier. - Stage-Renderpfad wurde nicht verändert; Fix liegt bewusst im UI-Overlay. - Sound/Ton nicht angefasst. ## Erwartetes Ergebnis Die Bühnenstruktur sieht im normalen geschlossenen Bühnenzustand so hell aus wie im Ruhe-/Vollbildmodus.


## QUALITY CHECK v4.0.408
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.408.md

# QUALITY CHECK v4.0.408 ## Automatisch geprüft - App.js Syntaxcheck: ok. - Alle `src/**/*.js` per `node --check`: ok. - ZIP wird neu erzeugt und geprüft. ## Manuell zu prüfen 1. Fokusraum öffnen. 2. Prüfen, ob keine automatische Urskala mehr sichtbar ist. 3. Eine Skala hinzufügen, über den Balkentext bearbeiten und vollständig löschen. 4. Text bearbeiten öffnen: Titel steht oben separat in Kreisfarbe; Textfeld darunter enthält keinen Titel und kein ` - `. 5. Wiki-Symbol im Titel-Edit antippen: Artikel wird ohne Zwischenfenster direkt unter vorhandenen Text gehängt. 6. Direkt danach durchgestrichenes Wiki-Symbol antippen: nur der gerade eingefügte Wiki-Block verschwindet. 7. Prüfen, ob Kinder nicht mehr als zusätzliches Panel unter dem Eintrag angezeigt werden.


## Quality Check v4.0.410
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.410.md

# Quality Check v4.0.410 ## Automatisch geprüft - `node --check App.js` - `node --check` für alle JavaScript-Dateien unter `src/` ## Manuell zu prüfen - Fokusraum ist Vollbild und zeigt kein zusätzliches oberes Strukturband. - Zurück-Button hat genug Abstand und bleibt gut treffbar. - Polygonliste hat mehr Luft und wirkt nicht mehr wie Rahmen-in-Rahmen. - Alte Titelduplikate in Textkörpern verschwinden auch bei einfachen Titelzeilen. - Gleichnamige Unterkapitel werden nicht erneut mit identischem Titel angezeigt. - Editmodus scrollt zum Blockanfang und bleibt mit Tastatur bedienbar.


## Quality Check v4.0.477
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/QUALITY_CHECK_v4.0.477.md

# Quality Check v4.0.477 Geprüft im Code: - Klammer-/Brace-Balance für App.js, LibraryPanel.js und StageRenderLayers.js unauffällig. - package.json ist gültiges JSON. - `onImportText` wird von App.js an LibraryPanel durchgereicht. - `PromptGeneratorPanel` nutzt keine neue externe Abhängigkeit. - Paste-Import verwendet die bereits vorhandene Parserfunktion `parseImportedMapText`. Offener Gerätetest: - Expo-Go-Start. - Promptfeld markieren/kopieren auf iOS. - Paste-Import mit kurzer Kapitel-TXT. - Kompass/Anatomie gegen v4.0.476 vergleichen.


## READ THIS FIRST – ITMO v4.0.405
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/READ_THIS_FIRST_v4.0.405.md

# READ THIS FIRST – ITMO v4.0.405 Dies ist der aktuelle Übergabestand für einen neuen Chat. Aktueller Arbeitskern: - Expo SDK 54 behalten. - ZIP pro Schritt liefern. - Keine neuen Bilder im Chat. - Sound/Ton bleibt eingefroren. - Bühne ist der stabile Kern: Struktur nicht ohne Not umbauen. Zuletzt geändert: - Bühnenhintergrund etwas ruhiger/dunkler als direkter Farbwert. - Kein Abdunkel-Overlay über Struktur/Fäden/Labels. - Suche/Header weiter transparent. - Fokusraum-Komponenten sind bereits begonnen: `FocusEntryActionBar`, `FocusChildPanel`, `FocusTimelineAxis`, `FocusEditField`, `FocusScaleRow`, `FocusWordText`. Nächster sinnvoller Schritt: Fokusraum und danach Import/Export/Print.


## ITMO Roadmap ab v4.0.391
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/ROADMAP_v4.0.391.md

# ITMO Roadmap ab v4.0.391 Stand: Die Strukturmechanik der Bühne ist akzeptiert. Ab jetzt gilt: nur noch Feinschliff am Bühnenkern, danach Fokusraum, Inhalte und Veröffentlichung. ## 1. Bühnenkern stabilisieren - Doppeltipp-Kind darf die Kamera nicht verschieben. - Doppeltipp auf Polygon erzeugt Kind; Einfachtipp darf erst nach Ablauf des Doppeltipp-Fensters fokussieren. - Fäden bleiben sichtbar stabil: keine laufende Sinusanimation, nur statische ID-/Index-Kurve. - Fäden liegen auf Eltern-/Familienebene unter Polygonen. - Bühne bleibt kräftig hell wie im Vollbild. - Zoom bleibt Orientierung und Einrollmechanik, keine unnötige alte Größenzoomwelt. ## 2. Fokusraum fertigstellen - Drei Zustände pro Eintrag: zu, fokussiert, edit. - Zu: nur Titel. - Fokussiert: Titel mit Wiki, darunter Linktext, Wortlinks, Skalen, Bild/Farbe/Symbol, Kindmachen, Löschen. - Edit: Titel- und Textfelder wirklich editierbar; X im Feld; Cursor sauber; bestehender Titel als graue Vorlage, die beim Tippen verschwindet. - Jede Ankeraktion scrollt den betroffenen Eintrag mittig ins Sichtfeld. - Kinderbuttons bleiben als schlankes Panel unten am Eintrag, keine neue Panelwelt. ## 3. Vorlagen neu gliedern - Keine sinnlosen Kinder wie Begriff, Struktur, Beispiel, Lage, Funktion als wiederholte Labels. - Ein Polygon steht für die reale Sache: Knochen, Muskel, Bedürfnis, Gefühl, AMDP-Item, GFK-Schritt, Befundbereich. - Detailwissen liegt als Textblock, Skala oder Medienblock im Polygon. - Anatomie: große Körper-/Funktionsregionen als Hauptäste, einzelne relevante Knochen/Muskeln/Nerven als Polygone, Details innen. - GFK: Grundhaltung, Beobachtung, Gefühl, Bedürfnis, Bitte, Empathie, Grenzen, Konfliktübersetzung als ruhige Hauptstruktur. - Befundung: ICF/COPM/AMPS/Beobachtung/Ziele/Planung klar getrennt, aber ohne unnötige Formal-Kinder. ## 4. Suche, Wörter, Wiki - Globale Suche in Start, Bühne, Fokusraum. - Treffer zentrieren, pinnen, maximal wenige Chips. - Wortlinks im Text klar markieren. - Entscheidung unter Text: zum Inhalt springen, neuen Inhalt machen, Link lösen, abbrechen. - Wiki bleibt pro Titel und Wort möglich, aber ohne Overlay-Gewusel. ## 5. Medien, Import, Export, Print - TXT-/ITMO-Import robust anwählbar. - Kapiteltext importiert als Baum: Titel = erstes Wort/erste Überschrift, Details als Blöcke. - Export pro Thema als lesbare Kapiteldatei. - Print/PDF nach aktueller Zoom-/Bühnenlogik. - Bilder/Audio/Dokumente pro Polygon; langfristig Bildimport großer iPhone-Sammlungen mit Ort/Zeit/Cluster. ## 6. Zeitachse; Ton auf Eis - Ton/Sound ist auf unbestimmte Zeit aus dem aktiven Plan gestrichen. - Keine Tonbuttons, keine Audio-Abhängigkeiten, keine Hörtests, bis der Nutzer Ton ausdrücklich reaktiviert. - Zeitachse ohne neues Panel: vorhandene horizontale Achse weiterverwenden. - Querformat: Zeitnavigation zuerst, Bühne bleibt bedienbar. - Fäden bleiben rein visuell: Struktur, Verbindung, Ruhebewegung, keine Klanglogik. ## 7. Web/TestFlight/Beta - Expo SDK 54 bleibt bis zum nächsten Build-Schritt. - Expo Go stabil halten, bekannte MediaLibrary-Warnung als Warnung behandeln. - Webvariante startbar machen. - Danach Dev Build/TestFlight vorbereiten. - Store-relevante Texte, Datenschutz/Impressum in ITMO-Map sauber halten. ## Reihenfolge der nächsten ZIPs 1. v4.0.391: Bühnenkamera halten, statische Fäden, kräftige Bühne. 2. v4.0.392: Fokusraum-Zustände praktisch härten. 3. v4.0.393: Fokusraum-Editfelder und Anker-Scroll sauber machen. 4. v4.0.394: Vorlagenstruktur radikal entschlacken. 5. v4.0.395: Import/Export/Suche/Wortlinks zusammenführen. 6. v4.0.396: Zeitachse/Navigation vorbereiten; Ton bleibt eingefroren. 7. v4.0.397: QA und Übergabe an Web/TestFlight-Härtung.


## ITMO Roadmap ab v4.0.392
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/ROADMAP_v4.0.392.md

# ITMO Roadmap ab v4.0.392 Stand: Die Strukturmechanik der Bühne ist akzeptiert. Ab jetzt gilt: nur noch Feinschliff am Bühnenkern, danach Fokusraum, Inhalte und Veröffentlichung. ## 1. Bühnenkern stabilisieren - Doppeltipp-Kind darf die Kamera nicht verschieben. - Doppeltipp auf Polygon erzeugt Kind; Einfachtipp darf erst nach Ablauf des Doppeltipp-Fensters fokussieren. - Fäden bleiben sichtbar stabil: keine laufende Sinusanimation, nur statische ID-/Index-Kurve. - Fäden liegen auf Eltern-/Familienebene unter Polygonen. - Bühne bleibt kräftig hell wie im Vollbild. - Zoom bleibt Orientierung und Einrollmechanik, keine unnötige alte Größenzoomwelt. ## 2. Fokusraum fertigstellen - Drei Zustände pro Eintrag: zu, fokussiert, edit. - Zu: nur Titel. - Fokussiert: Titel mit Wiki, darunter Linktext, Wortlinks, Skalen, Bild/Farbe/Symbol, Kindmachen, Löschen. - Edit: Titel- und Textfelder wirklich editierbar; X im Feld; Cursor sauber; bestehender Titel als graue Vorlage, die beim Tippen verschwindet. - Jede Ankeraktion scrollt den betroffenen Eintrag mittig ins Sichtfeld. - Kinderbuttons bleiben als schlankes Panel unten am Eintrag, keine neue Panelwelt. ## 3. Vorlagen neu gliedern - Keine sinnlosen Kinder wie Begriff, Struktur, Beispiel, Lage, Funktion als wiederholte Labels. - Ein Polygon steht für die reale Sache: Knochen, Muskel, Bedürfnis, Gefühl, AMDP-Item, GFK-Schritt, Befundbereich. - Detailwissen liegt als Textblock, Skala oder Medienblock im Polygon. - Anatomie: große Körper-/Funktionsregionen als Hauptäste, einzelne relevante Knochen/Muskeln/Nerven als Polygone, Details innen. - GFK: Grundhaltung, Beobachtung, Gefühl, Bedürfnis, Bitte, Empathie, Grenzen, Konfliktübersetzung als ruhige Hauptstruktur. - Befundung: ICF/COPM/AMPS/Beobachtung/Ziele/Planung klar getrennt, aber ohne unnötige Formal-Kinder. ## 4. Suche, Wörter, Wiki - Globale Suche in Start, Bühne, Fokusraum. - Treffer zentrieren, pinnen, maximal wenige Chips. - Wortlinks im Text klar markieren. - Entscheidung unter Text: zum Inhalt springen, neuen Inhalt machen, Link lösen, abbrechen. - Wiki bleibt pro Titel und Wort möglich, aber ohne Overlay-Gewusel. ## 5. Medien, Import, Export, Print - TXT-/ITMO-Import robust anwählbar. - Kapiteltext importiert als Baum: Titel = erstes Wort/erste Überschrift, Details als Blöcke. - Export pro Thema als lesbare Kapiteldatei. - Print/PDF nach aktueller Zoom-/Bühnenlogik. - Bilder/Audio/Dokumente pro Polygon; langfristig Bildimport großer iPhone-Sammlungen mit Ort/Zeit/Cluster. ## 6. Zeitachse; Ton auf Eis - Ton/Sound ist auf unbestimmte Zeit aus dem aktiven Plan gestrichen. - Keine Tonbuttons, keine Audio-Abhängigkeiten, keine Hörtests, bis der Nutzer Ton ausdrücklich reaktiviert. - Zeitachse ohne neues Panel: vorhandene horizontale Achse weiterverwenden. - Querformat: Zeitnavigation zuerst, Bühne bleibt bedienbar. - Fäden bleiben rein visuell: Struktur, Verbindung, Ruhebewegung, keine Klanglogik. ## 7. Web/TestFlight/Beta - Expo SDK 54 bleibt bis zum nächsten Build-Schritt. - Expo Go stabil halten, bekannte MediaLibrary-Warnung als Warnung behandeln. - Webvariante startbar machen. - Danach Dev Build/TestFlight vorbereiten. - Store-relevante Texte, Datenschutz/Impressum in ITMO-Map sauber halten. ## Reihenfolge der nächsten ZIPs 1. v4.0.391: Bühnenkamera halten, statische Fäden, kräftige Bühne. 1a. v4.0.392: Ton aus aktivem Plan entfernen; Fokusraum-Zustände härten. 2. v4.0.392: Fokusraum-Zustände praktisch härten. 3. v4.0.393: Fokusraum-Editfelder und Anker-Scroll sauber machen. 4. v4.0.394: Vorlagenstruktur radikal entschlacken. 5. v4.0.395: Import/Export/Suche/Wortlinks zusammenführen. 6. v4.0.396: Zeitachse/Navigation vorbereiten; Ton bleibt eingefroren. 7. v4.0.397: QA und Übergabe an Web/TestFlight-Härtung.


## SMART_APP_PLAN_v4.0.193
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/SMART_APP_PLAN_v4.0.193.md

# SMART_APP_PLAN_v4.0.193 1. Gerätetest-Fixlauf. 2. Echte Vorschau-Struktur für Bildäste. 3. Semantisches Undo gruppieren. 4. Suche und Trefferteaser final beruhigen. 5. Fokusraum-Footer optisch glätten. 6. Capture/Insta als komponierten Postmodus ausbauen. 7. Store/TestFlight-Härtung.


## STABILIZATION PLAN v4.0.293
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STABILIZATION_PLAN_v4.0.293.md

# STABILIZATION PLAN v4.0.293 Ziel: schnell zum sauberen, fluessigen ITMO-Teststand kommen. Ab jetzt zuerst Stabilitaet, dann neue Tiefe. ## Prioritaet 10 - Bedienbarkeit sofort - Fokusraum eindeutig schliessbar machen. - Edit-Drag darf nie gegen Buehnen-Pan kaempfen. - Drop-Aktionen mit Rueckgaengig behalten. - 12er-Fit fuer Tonleiterkarten als Teststandard nutzen. ## Prioritaet 9 - Performance - Sichtfeld als harte Grenze fuer Ton und Rendering nutzen. - Dekorative Layer nur in ruhigen Momenten und bei moderater Knotenzahl. - Ruheanimation sehr sparsam halten; keine zyklischen Nebenintervalle, die Kamera oder Suche stören. - Maximal ein aktiver Synth-Ton im Loop; Klangfarbe ueber Parameter statt weitere Stimmen. ## Prioritaet 8 - Struktur und Zoom - Mitte oeffnet, Rand schliesst. - Kinder erscheinen erst, wenn Arm/Faden sichtbar genug ist. - 12 direkte Kinder mit Abstand 12 muessen in einer Einstellung sichtbar und bedienbar sein. - Anatomie nutzt lange/kurze Fäden als Knochen-/Zweiglogik. ## Prioritaet 7 - Inhalte - GERG, Anatomie, Gefuehle, Beduerfnisse, GFK als Testvorlagen stabil halten. - Erst danach tiefe Fuellung/Printausgabe weiter ausbauen. ## Schnellster Weg 1. Feature-Freeze fuer neue Ideen bis Teststand fluessig ist. 2. Drei Testkarten als Massstab: Gefuehle 12er-Kreis, Anatomie, GERG. 3. Pro Schritt nur ein Block: Bedienung, Performance, Zoom, Ton, Inhalt. 4. Jede ZIP mit Syntaxcheck und kurzer Testanweisung.


## Stabilisierung bis TestFlight v4.0.299
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STABILIZATION_TO_TESTFLIGHT_v4.0.299.md

# Stabilisierung bis TestFlight v4.0.299 Ziel: Keine neuen Feature-Stränge, bis ein flüssiger TestFlight-Kandidat steht. ## Schritte 1. Start/Navigation: Map-Betritt, Fokusraum schließen, Suche, Tastatur, weiche Sprungmarken. 2. Bühne/Zoom: 12er Fit, Spucken/Schlucken, Labels, Sichtfeld-Loop. 3. Edit: Drag, Drop, Undo, Abstandsskala, Faden-/Polygon-Ziele. 4. Performance: Deko-Layer, Ruheanimation, Timeline, Bottom-Sheet, Querformat. 5. Content Freeze: Anatomie, GERG, Gefühle, Bedürfnisse, GFK nur noch reparieren, nicht ausbauen. 6. Build Freeze: Expo SDK 54, clean install, iOS EAS Build, TestFlight Upload. 7. Externer Test: 3 Testpersonen, Crash-/UX-Liste, ein Fix-Build.


## STAGE STABILITY LOCK v4.0.598
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.598.md

# STAGE STABILITY LOCK v4.0.598 Stand: Dieser Stand wird als sauberer Entwicklungsstand gesichert, bevor größer aufgeräumt wird. ## Was fest bleibt Die aktuelle Bühnenanmutung ist als positive Referenz markiert: ruhige dunkle Bühne, 80-Prozent-Strukturdeckkraft, sichtbare Familienkreise, reduzierte Koordinatenachsen und klarer Titel-/Suchfeld-Ablauf. Der Polygonankerkreis bleibt der definierte Kreis, auf dessen Bogenabschnitten die Fadenanker gesucht werden. Er ist nicht der Familienkreis. Er ist auch nicht der sichtbare Dev-Hilfskreis. Er ist die Ankerlogik für Fäden und Tangenten. ## Noch offen Die endgültige exakte Ankerfindung muss noch geschärft werden. Ziel bleibt: Fäden starten und enden an den richtigen Polygonankerkreis-Positionen und nicht im Kreisinneren. ## Neue Stabilisierung Labels erscheinen früher und werden weicher ausgeblendet. Sie sollen bei Kindern nicht hart auf- und zuklappen. Familienkreise blenden als gemeinsamer Leselayer ein und aus, nicht einzeln pro Knoten. Kindfamilien ab vier Kindern bekommen eine Symmetrie-Ausnahme: 4 Kinder verteilen sich als 2 links und 2 rechts um die lokale Auswärtsachse, 6 als 3/3, 8 als 4/4 bis 14 als 7/7. Bei ungerader Anzahl bleibt ein Mittelast plus symmetrische Paare. Das Thementitel-Feld blinkt vor der Ersteingabe, damit klar ist, dass zuerst ein Titel vergeben werden muss.


## STAGE STABILITY LOCK v4.0.599
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.599.md

# STAGE STABILITY LOCK v4.0.599 Dieser Stand hält die gute Bullauge-Wirkung aus v4.0.598 fest und verändert nur Feinlogik. ## Polygonankerkreis Der aktive Fadenanker wird nicht mehr aus gespeicherten Altankern gesucht. Der Renderpfad nimmt die Richtung vom aktuellen Knoten zur aktuellen Gegenform und projiziert sie auf den sichtbaren Polygonankerkreis. Dadurch bleiben alte Top-/Fallback-Anker aus dem sichtbaren Fadenpfad heraus. ## Labels Kinderlabels bleiben während Bullauge/Randzug früher und länger sichtbar. Das Ein-/Ausblenden wird breiter und weicher geführt, damit keine harten Auf-/Zu-Sprünge entstehen. ## Familienkreise Familienkreise bleiben Entwicklungs-Orientierung und blenden mit einer gemeinsamen Zoomkurve ein und aus. ## Symmetrie Kindfamilien mit gerader Zahl ab 4 bleiben paarig um die lokale Auswärtsachse verteilt: 2/2, 3/3, 4/4 bis 7/7.


## STAGE STABILITY LOCK v4.0.600
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.600.md

# STAGE STABILITY LOCK v4.0.600 Schwerpunkt: Kapitelimport und Hüllenruhe. ## Kapitelimport Klassische Nummerierung wird jetzt vollständig erkannt: - `1. Kapitel` - `1.1 Unterkapitel` - `1.1.1 Unterunterkapitel` Der alte Parser erkannte Unterkapitel ohne Endpunkt nicht sicher. Dadurch landeten Inhalte als Fließtext in der Urmutter. ## Hüllenruhe Polygonhüllen werden wieder regelmäßig aus einem Startanker plus gleichmäßiger 360°-Verteilung erzeugt. Einzelne Kindpositionen dürfen keine Seite herausziehen. ## Fäden Die Mindest-Außenlücke wurde reduziert, damit Fäden in dichten Bullauge-Situationen nicht abrissartig verschwinden.


## STAGE STABILITY LOCK v4.0.601
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.601.md

# STAGE STABILITY LOCK v4.0.601 Ziel dieses Passes: Der gute Bühnenstand aus v4.0.598–600 bleibt erhalten, aber tiefe Familienkreise und Fadenabrisse werden beruhigt. Regeln ab v4.0.601: - Familienkreise sind nur Leselinien/Diagnosehilfe. Sie sind keine Ankerquelle und keine Kollisionsquelle. - Root- und erste Familienebene bleiben gut sichtbar. - Enkel- und Tiefen-Familienkreise werden deutlich schwächer dargestellt, außer sie gehören zur aktuellen Auswahlfamilie. - Fäden werden im aktiven Renderpfad nicht mehr wegen Familienkreis- oder Innenkontakt-Schätzungen ausgeblendet. - Ein Faden wird nur noch verworfen, wenn die Strecke praktisch null oder extrem weit außerhalb ist. - Labels behalten eine höhere Mindestlesbarkeit, damit sie im Bullauge/Randzug nicht hart flackern. Offen für späteres Aufräumen: - alte Diagnosefunktionen prüfen und entfernen, sofern sie nicht mehr im aktiven Renderpfad liegen. - Ankerpfad weiter vereinheitlichen, sobald Sichttest bestätigt, dass keine Fäden mehr abreißen.


## STAGE STABILITY LOCK v4.0.602
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.602.md

# STAGE STABILITY LOCK v4.0.602 Ziel: Importierte Maps sollen geometrisch näher an live erzeugten Themen liegen. Änderungen: - Import-Normalisierung nach `parseImportedMapText`. - Importierte Knoten verlieren alte Layout-/Anchor-Reste. - Geschwister bekommen stabile `visualOrder` und `plannedDirection`. - Root und Kindfamilien werden wie neu geborene Familien neu interpretierbar. - Familienkreise bleiben Leselinien und werden bei Enkeln/Tiefen weiter zurückgenommen. - Fäden reißen nicht mehr wegen Familienkreis-/Innenkontakt-Schätzungen ab. Offen: - Exakte optische Ankerqualität weiter am Polygonankerkreis prüfen. - Danach Altpfade aufräumen.


## STAGE STABILITY LOCK v4.0.603
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.603.md

# STAGE STABILITY LOCK v4.0.603 Ziel dieses Passes: neue Themenkarten sollen dem Bullauge mehr Platz geben. Randnahe Familien, auch die Urmutter, dürfen keine langen Gummiarme mehr in die sichtbare Mitte ziehen. Sie sollen sich am Rand kompakter als Familiencluster zeigen. Regel: - Bildschirmmitte bleibt das echte Fokuszentrum. - Randnahe Familien rollen früher zur eigenen Mutter ein. - Kinder einer randnahen Mutter werden stärker um diese Mutter geclustert. - Familienkreise bleiben Leselinien und zeigen den lokalen Familienradius. - Der Polygonankerkreis bleibt die Ankerregel; Familienkreise sind keine Ankerquelle. - Dieser Pass betrifft zunächst neue Thema-Maps; AI-/Importmaps folgen separat. Geändert: - Safe-Zone für Randrollen enger gesetzt. - Far-/Parent-Far-Auslöser früher aktiviert. - Parent-Cluster-Roll stärker gewichtet. - Tiefe und Blattknoten rollen kompakter ein. - Randnahe Familien werden transparenter, damit sie nicht die Fokusmitte dominieren. Prüfung: - Eine randnahe Urmutter wie „Sonne“ soll mit ihren Kindern eher als kompaktes Sonnen-/Familiencluster erscheinen. - Die Fokusmitte soll leerer und lesbarer bleiben. - Keine langen Außenarme vor dem Einrollen.


## STAGE STABILITY LOCK v4.0.604
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.604.md

# STAGE STABILITY LOCK v4.0.604 ## Ziel Einrollen bedeutet ab jetzt Render-Ausblendung, nicht nur optisches Kleinerziehen. Die Bühne wird enger um die echte Bildschirmmitte gedacht: Fokusfamilie entfaltet sich, Randfamilien schließen sich zur Mutter und fallen bei hohem Rollwert aus dem aktiven Renderpfad. ## Änderungen - Fertig eingerollte Randkinder werden über `filterSwallowedRenderShapes` aus dem Renderpfad entfernt. - Rand- und Ferneinrollung starten früher und stärker. - Tiefere Blätter rollen zuerst und verschwinden früher als tragende Eltern. - Familienkreise werden bei hohem Rollwert mit ausgeblendet. - Viewport-/Projektionsmargen verkleinert, damit die Bühne nur so groß bleibt, wie die aktuelle Bildschirm-Bullaugenlogik sie braucht. ## Prüfpunkte - Randnahe Familien sollen nicht als lange Gummiarme bestehen bleiben. - Eine Fokusfamilie soll im Bildraum offen bleiben, Außenfamilien sollen sich zuziehen und verschwinden. - Die Bildschirmmitte bleibt Fokuszentrum, nicht die Urmutter außerhalb des Displays.


## STAGE_STABILITY_LOCK v4.0.605
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.605.md

# STAGE_STABILITY_LOCK v4.0.605 Ziel: v4.0.604-Randrollout entschärfen, ohne den guten Bullauge-Stand zu verlieren. Änderungen: - Rollout blendet Familien nicht mehr aus dem Renderpfad aus. Unteräste bleiben sichtbar und testbar. - Randrollout ist deutlich schwächer und später. Erste Kinder werden nicht mehr hart zur Mutter gedrückt. - Vererbter Rollout auf Enkel wurde reduziert, damit Unteräste nicht nur kurz in der Fokusmitte aufblitzen. - Familienkreise nutzen wieder die gespeicherte Familienregel (`familySelfRadius`) als stabile Basis und wachsen beim Verschieben nicht mehr aus aktuellen Renderprojektionen heraus. - Familienkreis-Deckkraft fällt beim Randrollout sanfter ab. Prüfen: - Neue Thema-Map: erste Kinder behalten Abstand. - Beim Verschieben der Urmutter darf der Familienkreis nicht größer werden. - Unteräste bleiben sichtbar und rollen nur sanft, statt zu verschwinden.


## STAGE STABILITY LOCK v4.0.606
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.606.md

# STAGE STABILITY LOCK v4.0.606 ## Familienkreis-Regel Der Familienkreis ist wieder strikt eine sichtbare Leselinie. Regel ab v4.0.606: - Jeder sichtbare Knoten bekommt einen Familienkreis. - Hat der Knoten sichtbare Kinder, orientiert sich der Radius am längsten sichtbaren Kinderfaden. - Hat der Knoten keine sichtbaren Kinder, ist der Familienkreis der eigene Polygonankerkreis/Grundkreis. - Der Familienkreis wird nicht aus gespeicherten alten Radien, nicht aus der Oma-Achse und nicht aus Kollisionsresten gebildet. - Wenn Randrollout Kinder näher zur Mutter zieht, wird der Familienkreis kleiner. - Wenn die Familie in der Mitte offen ist, wird der Familienkreis entsprechend größer. ## Bühnenmitte statt Oma Normale Unterfamilien nutzen für ihre Wachstumsachse nicht mehr die alte Vorfahren-/Oma-Achse. Die Ausrichtung wird stärker aus der Bühnenmitte gedacht: Jeder markierte Kreis kann Fokuszentrum werden.


## STAGE STABILITY LOCK v4.0.607
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.607.md

# STAGE STABILITY LOCK v4.0.607 Zugmechanik getrennt von Winkelmechanik. Regel: - Anker-/Geburtswinkel bleiben stabil. - Bildschirmmitte entscheidet nur, welche vorhandenen Außenkinder stärker gezogen werden. - Zug verkürzt Fäden und Randarme, darf aber keine Winkel drehen. - Alte Bühnenmitten-Achse darf nicht mehr als Ersatz-Wachstumsachse in `chooseSlotsForChildren` eingehen. - Alte `familyTurn`-Rotation ist deaktiviert. Prüfung: 1. Familie an den Rand schieben. 2. Außenkinder sollen näher zur Mutter ziehen. 3. Die Linienwinkel dürfen dabei nicht springen oder rotieren. 4. Innenkinder sollen weniger stark gezogen werden als Außenkinder.


## STAGE STABILITY LOCK v4.0.608
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.608.md

# STAGE STABILITY LOCK v4.0.608 ## Fokus-Orthogonalfluss Was im Fokus der Bildschirmmitte liegt, darf sich weich in eine klare 90°-Stellung bringen. Das betrifft die sichtbare Bühnenprojektion, nicht die gespeicherte Geburtslogik. ## Gegenimpuls außen Äußere Kind-Kind-Familien ziehen leicht von der Bildschirmmitte weg. Dadurch bleibt die Fokusmitte frei, während Randfamilien organisch aus dem Zentrum herausfließen. ## Harte Regel Winkel werden nicht als Daten überschrieben. Der Effekt ist ein weicher Render-/Bullauge-Effekt.


## STAGE STABILITY LOCK v4.0.609
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.609.md

# STAGE STABILITY LOCK v4.0.609 Ziel: Fokusfäden richten sich nur in der exakten Bildschirmmitte weich an den Hüllenseiten der fokussierten Mutter aus. Regel: - 90° ist kein globaler Rotationszwang. - 90° gilt nur als Zielstellung für direkte Mutter-Kind-Fäden im Fokus, wenn die Mutter wirklich nahe der Bildschirmmitte steht. - Bei 3/5/6/... Kindern wird nicht auf Kreuzform gezwungen, sondern auf die regulären Hüllenseiten der Mutter geblendet. - Bei einer Kind-Mutter mit eigener Elternverbindung wird die Rückseite berücksichtigt; die direkten Kinder nutzen weich die verbleibenden Hüllenseiten. - Außenliegende Kind-Kind-Familien behalten ihren Gegenimpuls weg von der Bildschirmmitte. - Geburtswinkel und logische Ankerdaten bleiben unverändert; die Korrektur bleibt reine Bühnenprojektion. Prüfung: 1. Mutter in die Bildschirmmitte bringen. 2. Direkte Kinder müssen sich ruhig und passend zur Hülle ordnen. 3. Mutter aus der Mitte bewegen. 4. Die Ordnung darf wieder freier werden und nicht hart springen.


## STAGE STABILITY LOCK v4.0.610
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.610.md

# STAGE STABILITY LOCK v4.0.610 ## Bullauge-Randlogik Randlogik ist ab diesem Stand kreisförmig statt rechteckig. Der Einroll- und Ausblendbereich wird aus der Bildschirmmitte berechnet: - Mittelpunkt: Bildschirmmitte. - Radius: Abstand von der Bildschirmmitte zur weitesten Bildschirmkante. - Alles in der Fokusmitte bleibt symmetrisch. - Randrollout beginnt radial, nicht mehr an einzelnen Bildschirmseiten. - Verschwinden aus dem Renderpfad erfolgt erst außerhalb des Bullauge-Kreises, damit Unteräste nicht mehr früh blitzen. ## Regeln - Kein Zug weg von der Oma als Randlogik. - Kein rechteckiger SafeLeft/SafeRight/SafeTop/SafeBottom-Rand mehr für Einrollen. - Seitenpriorität bleibt nur Zugstärke; sie ändert keine Winkel. - Fokusfamilie und direkte Fokuspartner bleiben im Renderpfad. - Blätter dürfen außerhalb des Bullauge-Radius zuerst verschwinden. ## Test 1. Eine neue Thema-Map öffnen. 2. Mittelpunkt prüfen: Fokusbereich soll gleichmäßig/strahlend wirken. 3. Struktur Richtung Bildschirmrand schieben. 4. Kinder sollen radial einrollen, nicht links/rechts/oben/unten unterschiedlich hart. 5. Unteräste sollen erst außerhalb des Bullauge-Radius aus dem Rendering fallen.


## ITMO v4.0.611 – radial edge fade and square hull calm pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.611.md

# ITMO v4.0.611 – radial edge fade and square hull calm pass Ziel: Der Bullauge-Rand soll wirklich als symmetrischer Kreis um die Bildschirmmitte arbeiten. Außenfamilien dürfen nicht als große Cluster am Suchfeld oder Bildschirmrand hängen bleiben. Gleichzeitig dürfen Vierecke in der Fokusprojektion nicht wieder als Diamanten kippen. Änderungen: - Bullauge-Radius = Abstand Bildschirmmitte bis zur äußersten Ecke (`hypot(width/2, height/2)`). - Einrollen/Fade/Render-Gone nutzen jetzt diesen Kreis statt Rechteckränder. - Außenknoten und Außenfamilien werden stärker radial ausgeblendet. - Branches können außerhalb des Bullauge-Kreises ebenfalls aus dem Renderpfad fallen; direkte Fokusfamilie bleibt geschützt. - Viereck-Hüllen werden im sichtbaren Renderpfad achsparallel gehalten; die Hüllenseiten-/Ankerlogik bleibt über Fäden/Anker erhalten. Prüfung: - Beim Schieben an den Rand sollen große Kind-Kind-Familien nicht mehr oben/rechts hängen bleiben. - Fokusmitte bleibt symmetrisch. - Ein-Kind-/Vier-Kind-Vierecke bleiben ruhige Quadrate, keine Diamanten.


## ITMO v4.0.612 – Hemisphere Cloth Mesh Projection
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.612.md

# ITMO v4.0.612 – Hemisphere Cloth Mesh Projection Ziel dieses Passes: Die Bühne wird nicht mehr nur als flache Rechteckfläche mit radialem Randfading gedacht. Die Map bleibt logisch ein flaches, ungedehntes Tuch. In der sichtbaren Projektion liegt unter der Bildschirmmitte eine gedachte Halbkugel. Das Tuch fällt weich auf diese Halbkugel. Regelmodell: - Die logische Geometrie bleibt unverändert. - Bildschirmmitte ist Mittelpunkt der Halbkugel. - Halbkugelradius ist etwas kleiner als die Bildschirmbreite. - Sichtbare Knotenpositionen werden radial zur Mitte auf die Halbkugelprojektion gelegt. - Der Effekt ist weich gemischt, damit keine harte Fischaugen- oder Portallogik entsteht. - Randrollout und Verschwinden bleiben danach radial um die Bildschirmmitte aktiv. - Fokusfäden/Hüllenseitenlogik bleiben nachgelagert und arbeiten auf der projizierten Bühne. Prüfkriterien: - Fokusmitte wirkt ruhiger und symmetrischer. - Das Mesh wirkt, als liege es auf einer zentralen Wölbung, nicht an Rechteckrändern. - Familienkreise folgen dem sichtbaren Tuchzustand. - Außenfamilien dürfen weiter einrollen, aber die Mitte bleibt strahlender.


## STAGE STABILITY LOCK v4.0.613
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.613.md

# STAGE STABILITY LOCK v4.0.613 ## Ziel Halbkugel-/Tuchprojektion bleibt aktiv, aber sichtbares Auspoppen und blockierende Familien im inneren Fokusbereich werden reduziert. ## Änderungen - Renderpuffer außerhalb des Bildschirms deutlich erweitert. - Bullauge-Rollout verschwindet später aus dem Renderpfad, damit Knoten nicht sichtbar auspoppen. - Randrollout startet später und weicher. - Kinder mit eigenen Kindern werden im inneren Fokusbereich entlang ihres bestehenden Mutter-Kind-Winkels nach außen geschoben. - Diese Auslagerung ändert keine Winkel; sie schafft nur Platz für die Hüllenseiten-/90°-Ausrichtung der fokussierten Mutter. - Familienabstand in der Grundgeometrie nutzt wieder den längsten direkten Kinderfaden, nicht den kürzesten Altwert. ## Test - Große Familie in die Mitte ziehen: direkte Kinder sollen sauberer an Hüllenseiten liegen. - Kind mit eigener Familie im inneren Kreis: soll nicht die Fokusmutter blockieren. - Randbewegung: Knoten sollen weicher ausfaden statt sichtbar aufzupoppen.


## ITMO v4.0.615 – no family-circle collision, stable focus slots
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.615.md

# ITMO v4.0.615 – no family-circle collision, stable focus slots Ziel: - Familienkreise hart aus der sichtbaren Bühne nehmen. - Fokusverteilung ohne Kollisionsgefühl und ohne Kreis-Abhängigkeit berechnen. - Zappeln in der Mitte vermeiden. Änderungen: - `FamilyCircleLayer` rendert `null`. - Die Stage ruft Familienkreise nur noch deaktiviert auf. - Fokuszielwinkel nutzen keine `nearestAngleFromList`-Umschaltung mehr. - Direkte Kinder bekommen stabile Geschwisterslots aus `siblingIndex`/`nodeId`. - Nach Fokus-Clearance werden Mutter-Kind-Vektor und Länge neu berechnet. - Die Fokusverteilung läuft damit rein über Hüllenseiten-Slots, nicht über Kollisionsabfragen. Prüfung: - Fokusmutter in die Bildschirmmitte bewegen. - Kinder dürfen nicht mehr zwischen Zielseiten springen. - Keine Familienkreislinien sichtbar. - Verteilung im Fokus muss gleichmäßiger wirken.


## STAGE STABILITY LOCK v4.0.617
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.617.md

# STAGE STABILITY LOCK v4.0.617 Ziel: Familien dürfen durch Bullauge/Mesh nicht sichtbar rotieren. Regeln: - Bullauge beeinflusst Größe, leichte Formruhe und Abstand. - Familien- und Hüllenrotation wird nicht aus der radialen Bildschirmposition abgeleitet. - Polygonhüllen bleiben bühnenstabil regelmäßig ausgerichtet. - Fäden suchen ihre Anker weiter über die echte Gegenrichtung auf dem Polygonankerkreis. - Familienkreise bleiben aus dem Renderpfad entfernt. - Fokusverteilung bleibt ohne Kollisionsabfrage. Prüfung: - Ein-Kind-Familie langsam durch die Mitte ziehen: Hülle darf nicht drehen. - Zwei-/Drei-/Vier-Kind-Familien durch die Mitte ziehen: Slots dürfen sich stabil sortieren, nicht die ganze Familie rotieren. - Randbewegung: Größe/Fade darf reagieren, Rotation nicht.


## ITMO v4.0.618 – Root Down Slot Lock
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STAGE_STABILITY_LOCK_v4.0.618.md

# ITMO v4.0.618 – Root Down Slot Lock Ziel: Alte Fokus-/Slotlogik entfernt, die Kind 1 der Urmutter aus der unteren Geburtsrichtung herausgezogen hat. Regeln: - Erstes Urmutter-Kind ist grundsätzlich unten. - Die Fokus-Slotlogik nutzt feste Geschwisterslots nach Index, keine nearest-angle-Umsortierung. - Im Fokuskern gibt es keine Oma-/Rückseitenpriorität. - Familien drehen nicht; Bullauge darf skalieren, leicht verzerren und ausblenden, aber keine Familienrotation erzeugen. - Root-Richtung ohne explizite plannedDirection fällt auf down zurück. Technik: - `src/ui/Stage.js`: Fokusziel von `-Math.PI / 2` auf `Math.PI / 2 - TAU * index / n` umgestellt. - `src/core/geometry.js`: Root-Default von right auf down, Root-Verteilung im Uhrzeigersinn ab unten. - `nearestAngleFromList` aus dem Fokuspfad entfernt. Checks: - Urmutter mit einem Kind: Kind sitzt unten und bleibt unten. - Urmutter mit 2/3/4 Kindern: Kind 1 bleibt unten, weitere Kinder folgen festen Slots. - Kein Hin- und Her-Springen beim langsamen Bewegen durch die Mitte.


## Strukturplan v4.0.212
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STRUCTURE_PLAN_v4.0.212.md

# Strukturplan v4.0.212 ## Grundregel 1. Kreis ist Kapitel. 2. Kindkreis ist Unterkapitel. 3. Enkelkreis ist Unterunterkapitel. 4. Textblock trägt den Inhalt der jeweiligen Ebene. 5. Skala hängt am Textblock, nicht frei am Kreis. 6. Navigation im Fokusraum ergibt sich aus Textblöcken und Kindern, nicht aus einem separaten Breadcrumb. ## Datenmodell Node: - `children`: Unterkapitel/Polygonkinder. - `blocks`: Inhaltsabschnitte des Kapitels. - `systemStructure`: Rolle, Tiefe, Pfad, Eltern-/Kinder-/Blockverweise. Block: - `title` - `text` - `scales` - `chapterPath` - `structureRole` - `sourceNodeId` Scale: - `label` - `value` - `min` - `max` ## Fokusraum Oben steht keine Breadcrumb-Leiste mehr. Stattdessen: - Titel/Rolle des aktuellen Kapitels. - horizontale Textblock-Chips. - horizontale Kind-Chips als Unterkapitel-Verknüpfungen. - Vor/zurück bleibt als Geschwister-Navigation erhalten, aber ohne Breadcrumb-Optik. ## Vorlagenlogik Alle Templates laufen nach den bisherigen Inhalts-Erweiterungen durch `applyTemplateStructureV212()`: - fehlende Blöcke werden ergänzt. - vorhandene Texte werden in Kernblöcke überführt, falls keine Blöcke existieren. - Arbeitsfrage und Verknüpfungsblock werden ergänzt, wenn sie fehlen. - Skalen werden pro Block erzeugt. - alte Node-Skalen werden in den ersten Block verschoben. ## Warum so So bleibt das System fehlerarm: Keine zweite Kapitelquelle, kein separates Breadcrumb-Modell, keine losen Skalen. Alles hängt am bestehenden Polygonbaum.


## STRUCTURE PLAN v4.0.213 – Fokusraum als Polygon-Text-Schiene
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STRUCTURE_PLAN_v4.0.213.md

# STRUCTURE PLAN v4.0.213 – Fokusraum als Polygon-Text-Schiene ## Grundsatz Die Textblöcke sind ab jetzt die les- und bearbeitbare Darstellung der Polygone. Der erste Textblock eines Polygons ist der eigene Polygontext. Weitere Textblöcke sind zusätzliche Abschnitte dieses Polygons. Skalen hängen am jeweiligen Textblock. ## Fokusraum-Logik - Vorfahren, aktuelles Polygon und Nachfahren werden chronologisch von oben nach unten angezeigt. - Angezeigt wird jeweils der erste Textblock des Polygons. - Der aktuelle Polygonblock wird hervorgehoben und beim Öffnen vertikal in den sichtbaren Bereich gescrollt. - Antippen eines Vorfahren- oder Nachfahrenblocks navigiert in dieses Polygon. - Antippen des aktuellen Blocks öffnet dessen Textblock-Editor. - Die alte Beziehungskette/Breadcrumb-Logik wird nicht mehr als eigene UI-Ebene geführt. ## Datenmodell - `node.blocks[0]` ist der kanonische Eigeninhalt des Polygons. - `node.text` bleibt als Legacy-/Such-/Exportspiegel erhalten und wird aus `blocks[0].text` synchronisiert. - Neue Polygone bekommen sofort einen ersten Block mit Urskala. - Neue Wort-/Kindpolygone bekommen Kapitelpfad, Rolle und Systemstruktur mit. - Node-Skalen bleiben nur als Fallback; neue Skalen gehen bevorzugt an Textblöcke. ## Instagram/Share - Beim Teilen wird die Fokusraum-Overlayansicht ausgeblendet, die Bühnenauswahl aber behalten. - Es wird nicht mehr auf die Gesamtkarte herausgezoomt. - Der aktuell ausgewählte Kreis wird für den Screenshot nur zentriert; die aktuelle Zoomstufe bleibt erhalten. ## Nicht-Ziel dieser Etappe - Keine neuen Bilder. - Keine große Layout-Neugestaltung der Bühne. - Keine neue zweite Kapitelverwaltung neben dem Polygonbaum.


## STRUCTURE PLAN v4.0.214 – Kapiteltext als Quellformat
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STRUCTURE_PLAN_v4.0.214.md

# STRUCTURE PLAN v4.0.214 – Kapiteltext als Quellformat ## Leitidee ITMO behandelt Maps jetzt wie einfache Kapitel-TXT-Dateien. Ein Heading ist ein Polygon. Ein Unterheading ist ein Polygonkind. Der erste Textblock eines Polygons ist der eigene Polygontext. Jeder Textblock trägt seine Urskala. ## Import Eine einfache TXT mit Markdown-Headings, numerischen Überschriften oder eingerückten Bullet-Kapiteln wird in eine Map überführt. Beispiel: ```txt # Anatomie Grundtext des ersten Polygons. ## Bewegungsapparat Text des Kindpolygons. ### Gelenke Text des Unterkindes. ``` ## Export Jede Map kann wieder als lesbarer Kapiteltext exportiert werden. Der JSON-Block bleibt zusätzlich als Kompatibilitätssicherung in der Exportdatei. ## Fokusraum Der Fokusraum zeigt den ganzen Kapiteltext der Map als vertikale Textschiene. Der aktuelle Polygonblock wird hervorgehoben und beim Öffnen automatisch angescrollt. Der aktuelle Block ist direkt bearbeitbar. Andere Einträge navigieren in das jeweilige Polygon. ## Vorlagen Alle sichtbaren Vorlagen werden aus neuen Kapiteltexten erzeugt: Neues Thema, GERG, Befundung, ICF, ICD, AMDP, Persönlichkeitsstörungen, Anatomie, Gefühle und Bedürfnisse. Alte Template-Vertiefungen werden für diese Vorlagen übersprungen. ## Print Print nutzt zusätzlich den aus der Map erzeugten Kapiteltext. Die grafische Szene bleibt sichtbar, aber der lesbare Kapitelstamm wird mit ausgegeben. ## Foto-Hintergrund Der Footer-Foto-Button öffnet kein Bildfenster mehr. Er startet direkt das Kamera-Foto als Bühnenhintergrund. Die frühere Fotoauswahl als Hintergrund bleibt im Code vorhanden, ist aber aus dem Hauptbutton herausgenommen.


## STRUCTURE PLAN v4.0.215 – Fokusliste als Bearbeitungsfläche
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STRUCTURE_PLAN_v4.0.215.md

# STRUCTURE PLAN v4.0.215 – Fokusliste als Bearbeitungsfläche ## Grundsatz Die Kapitel-TXT ist das übergeordnete Quellformat. Daraus entstehen Polygone. Jedes Polygon trägt seinen eigenen Inhalt im ersten Textblock. Der Fokusraum zeigt den gesamten Kapiteltext der Map und scrollt zum aktiven Polygon. ## Neue Fokusraumlogik - Mapheader oben: Maptitel. - Liste: alle Polygone chronologisch nach Kapitelstruktur. - Aktiver Listeneintrag: Bearbeitung von Titel, erstem Textblock, Skala, Farbe, Symbol und Bild. - Nichtaktive Listeneinträge: Vorschau und Navigation. - Unterer alter Textfeldbereich: entfernt. ## Textblocklogik - `node.blocks[0]` ist der eigene Polygontext. - `node.text` bleibt Spiegel des ersten Textblocks für Suche, Bühne und Legacy. - Skalen werden direkt am Textblock geführt. ## Spätere Erweiterung Nichtaktive Listeneinträge könnten direkt editierbar werden, indem `updateTextBlock` und `updateNode` für beliebige Node-IDs statt nur selectedId verdrahtet werden. Aktuell bleibt der stabile Pfad: antippen, fokussieren, bearbeiten.


## STRUCTURE PLAN v4.0.217
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STRUCTURE_PLAN_v4.0.217.md

# STRUCTURE PLAN v4.0.217 ## Beta-Kern ITMO nähert sich einer Beta, wenn alle Kernwege ohne Bruch funktionieren: 1. Vorlage erzeugt tiefe Kapitelstruktur. 2. Fokusraum zeigt dieselbe Struktur als bearbeitbaren Kapiteltext. 3. Jeder erste Textblock repräsentiert sein Polygon. 4. Skalen hängen am Textblock und bleiben dort direkt bedienbar. 5. Import/Export nutzt denselben Kapiteltext. 6. Print nutzt denselben Kapiteltext. 7. Bühne, Fokusraum, Foto, Bilder und Footer bleiben kompatibel. ## Fokusraum-Zielbild Der Fokusraum ist kein Formular mehr, sondern die Map als Textschiene: - Map-Titel oben. - Chronologischer Kapiteltext darunter. - Aktuelles Polygon hervorgehoben. - Aktueller Textblock direkt editierbar. - Wörter im aktuellen Textblock markierbar und verlinkbar. - Skalen dezent im Block. - Farbe/Symbol/Bild als kompakter Polygonstrip am aktiven Eintrag. ## Skalen-Zielbild - Skala ist ein Balken, kein Formularblock. - Label sitzt im Balken. - Wert entsteht durch Antippen des Balkens. - Bearbeiten blendet Label-Eingabe ein. - Ausblenden ist ruhig und nicht destruktiv. - Hinzufügen erzeugt weitere Skalen am selben Textblock. ## Vorlagen-Zielbild - Kein Root-Startblock als Anrede. - Jeder Root beginnt mit fachlichem Intro. - Der Seed ist nur eine Startnotiz, falls überhaupt gesetzt. - Anatomie und Zeit bleiben tiefe Referenzvorlagen. ## Beta-Prüfliste - Expo Go startet ohne roten Fehler. - Alle Vorlagen öffnen. - Fokusraum scrollt zum aktuellen Polygon. - Inline-Tastatur blockiert Footer nicht katastrophal. - Wiki-Fetch funktioniert oder scheitert sauber. - Fotoaufnahme speichert Bühnenfoto. - Bildreferenzen bleiben erhalten. - Import/Export Roundtrip funktioniert. - Print öffnet Dialog. - Share/Instagram bleibt zentriert und zoomt nicht heraus.


## Strukturplan v4.0.219
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/STRUCTURE_PLAN_v4.0.219.md

# Strukturplan v4.0.219 ## Fokusraum-Logik Die Fokusraum-Liste unterscheidet jetzt drei Zustände: - Teaser: nicht aktiver Polygontext, maximal 10 Zeilen, antippbar zum Wechseln. - Ganzansicht: aktueller Polygontext, vollständig lesbar und mit Wortmarkierung nutzbar. - Bearbeiten: aktueller Textblock wird direkt inline editiert. Damit bleibt die Liste ruhig, aber arbeitsfähig. ## Map-Logik Vorlagen werden nicht mehr nur als flache Fachlisten behandelt. Der neue Tiefenpass ergänzt unter Leaf-Kapiteln und frühen Hauptästen strukturierende Unterpolygone. Prinzip: - Kapitel = Polygon. - Unterkapitel = Polygonkind. - Vertiefung = weiteres Polygonkind. - erster Textblock = eigener Inhalt dieses Polygons. - Urskala = Bewertungsanker des Textblocks. ## Fachliche Verzweigung Jede Vorlage bekommt andere Vertiefungsachsen. Dadurch entstehen keine bloß kopierten Standard-Unterpunkte, sondern passende Denkpfade. Beispiele: - Anatomie verzweigt nach Struktur, Funktion, klinischem Blick und Verknüpfung. - Befundung verzweigt nach Erheben, Beobachtungsanker, Bewerten und Ableiten. - Gefühle verzweigen nach Körpersignal, Auslöser, Bedürfnisbezug und Handlung. - Zeit verzweigt nach Zeitraum, Übergang, Atmosphäre und Frage. ## Nächste Strukturarbeit v4.0.220 sollte keine neue Modelländerung beginnen, sondern den großen Zustand testen: - Läuft die große Anatomie flüssig? - Bleibt die Zeitmap im Querformat bedienbar? - Ist der Fokusraum bei 250+ Polygonen noch ruhig? - Bleiben Import/Export/Print mit tiefen Maps lesbar?


## TestFlight Cleanup ab v4.0.301
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TESTFLIGHT_CLEANUP_PLAN_v4.0.301.md

# TestFlight Cleanup ab v4.0.301 1. Navigation/Zoom-Invarianten einfrieren. 2. Mutter-Kind-Fit und Spucken-Schlucken stabilisieren. 3. Edit/Drop/Undo prüfen. 4. Ton nur Sichtfeld und Farbe-Klangfarbe prüfen. 5. Performance-Deko-Freeze. 6. Content-Freeze. 7. EAS/TestFlight Build.


## TEST_CHECKLIST v4.0.537
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.537.md

# TEST_CHECKLIST v4.0.537 ## Promptimport Fehlertest Promptgenerator öffnen. Thema eingeben. Prompt kopieren. Danach ohne ChatGPT-Antwort direkt `Promptimport` antippen. Erwartung: Meldung `Noch der Prompt`. Es darf keine neue Map angelegt werden. ## Promptimport Erfolgstest Eine echte Kapitel-TXT-Antwort kopieren, die mit `# Titel` beginnt. In der Bibliothek `Promptimport` antippen. Erwartung: neue Map wird angelegt, vorn in der Bibliothek einsortiert und direkt geöffnet. Die Map gilt intern als Prompt-/AI-Import. ## Bare-Antwort Reparaturtest Eine Antwort ohne `#`, aber mit klaren Titelzeilen und `plannedDirection:` kopieren. `Promptimport` antippen. Erwartung: Import versucht Reparatur. Wenn die Struktur genug Hinweise enthält, entsteht eine Map. Wenn nicht, erscheint eine klare Parsermeldung. ## Dateiimport Regression `Datei` antippen und eine ITMO-TXT-Datei importieren. Erwartung: Dateiimport bleibt neutraler Import und wird nicht als AI-Import markiert. ## Kompass Regression Kompass öffnen. Erwartung: 16 direkte Richtungskinder, gleich große Dekorationspolygone, Pfeile nach außen. ## Familienkreis Regression Eine Mutter mit sechs Kindern und Kindeskindern öffnen. Erwartung: Familienkreis um Mutter plus direkte Kinder, nicht um einzelne Blattknoten. Längere Fäden zeigen herauswachsende Kinderfamilien. ## TestFlight Vorbereitung Nach Gerätetest lokal ausführen: npm install npm run preflight npx expo-doctor npm run build:ios:testflight npm run submit:ios:testflight


## Testcheck v4.0.547
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.547.md

# Testcheck v4.0.547 1. Start öffnen: Vorlagen sichtbar: Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. 2. Start unten prüfen: Statistik, Impressum/Datenschutz/Quellen und Liste löschen sichtbar. 3. Kompass-Vorlage antippen: öffnet Bühne, erscheint nicht als normale Map-Zeile. 4. Copy-Icon auf Kompass tippen: eigenes Thema wird angelegt und geöffnet. 5. Copy-Icon auf Kompass erneut tippen: Hinweis „Ein Duplikat sollte genügen“. 6. Copy-Icon auf Anatomie, Gefühle, Bedürfnisse prüfen. 7. Bühne mit großer Promptmap bewegen: Außenfäden dürfen nicht übermäßig lang ziehen. 8. Familienkreise prüfen: keine losgelösten Kreise, keine Absturz-/Blank-Screens.


## Testcheckliste v4.0.548
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.548.md

# Testcheckliste v4.0.548 1. Große Promptmap neu importieren, zum Beispiel Rheuma oder Kontrollieren. Nicht alte Map bewerten. 2. Bühne schieben: Außenkinder dürfen keine extrem langen Fäden mehr quer über den Bildschirm ziehen. 3. Familienkreise prüfen: weniger Überlappung, keine weißen Großkreise, die losgelöst wirken. 4. Langtipp auf Bühne: Der Knoten nahe der Bildschirmmitte wird zentral ausgerichtet. 5. Kompass öffnen: Richtungspfeile und 16er-Ring dürfen nicht verschwinden. 6. Start prüfen: Vorlagen Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse bleiben sichtbar.


## TEST_CHECKLIST v4.0.577
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.577.md

# TEST_CHECKLIST v4.0.577 ## Pflichtprüfung Bühne - Start einer Map: Hintergrund bleibt schwarz, keine grüne Fläche, kein transparenter Wash. - Zentrum: Fokus liegt in der echten Bildschirmmitte, nicht oberhalb davon. - Bewegung: Keine Rand-Einrollung, keine Ausrollung, kein Swallow-/Cluster-Verschwinden. - Pinch bleibt ohne neue Funktion. ## Pflichtprüfung Hüllen - Kinderloser Knoten: Kreis-Sonderform beziehungsweise 16-Eck, kein Viereck nur wegen Elternverbindung. - Knoten mit 1 oder 2 eigenen Kindern: Viereck. - Knoten mit 3 eigenen Kindern: Dreieck. - Knoten mit 4 eigenen Kindern: Viereck. - Knoten mit 5 bis 16 eigenen Kindern: passendes n-Eck. - Vordergrundkreis bleibt gleich groß und innen schwarz, Hüllenfüllung darf den Innenkreis nicht abdunkeln. ## Pflichtprüfung Familienkreis - Familienkreis ist sichtbar, dünn und weiß. - Blattkinder zeigen eigenen kleinen Familienkreis. - Familienkreis hängt an der realen Familie und nicht an alter Randprojektion. ## Pflichtprüfung Fehlerfreiheit - Kein `stageBackgroundColor`-Fehler. - Kein `hullStrokeForShape`-Fehler. - Kein Syntaxfehler beim Start.


## TEST_CHECKLIST v4.0.635
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.635.md

# TEST_CHECKLIST v4.0.635 1. Map mit Root, 2 Kindern und einem Kind mit eigener Familie öffnen. 2. Prüfen: Kein Springen bei Suchleiste sichtbar. 3. Prüfen: Dreieck bleibt groß genug und nicht kleiner als in v4.0.634. 4. Prüfen: Faden vom Root zum unteren Kind kommt aus der unteren bzw. zielgerichteten Seite, nicht schräg aus einer falschen Seitenzuordnung. 5. Prüfen: Familienkreise berühren sich nicht exakt im Mittelpunkt; ein kleiner Abstand ist sichtbar. 6. Prüfen: Kreis im Polygon ist nicht schwarz/dunkel, sondern sauberer Vordergrundkreis.


## TEST_CHECKLIST v4.0.636
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.636.md

# TEST_CHECKLIST v4.0.636 1. Map mit 3 Verbindungen öffnen: Dreieck bleibt gleich groß, kein Innenring sichtbar. 2. Map mit 4–6 Verbindungen öffnen: Quadrat/Fünfeck ohne Innenring. 3. Große Sonne-/Kompassstruktur öffnen: keine Drift, kein Springen, keine Suchleistenverschiebung. 4. Fäden prüfen: Austritt weiterhin an Zielseite, keine Rückkehr zu falscher Geschwisterseite. 5. Familienkreise prüfen: sichtbar, mit Abstand, ohne Einfluss auf Positionen.


## Test checklist v4.0.640
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.640.md

# Test checklist v4.0.640 1. Open an existing map with many children. Expected: no jumping, no camera drift. 2. Create children on root until limit. Expected: maximum 9 direct children. 3. Create children on a non-root node until limit. Expected: maximum 8 own children, because parent connection is the ninth connection. 4. Check hulls. Expected: no 10-16-gons; largest hull is 9-sided. 5. Import a large TXT chapter structure. Expected: direct children are grouped into 9max-readable families. 6. Open Kompass. Expected: 9-direction calibration, not 16.


## TEST_CHECKLIST v4.0.643
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.643.md

# TEST_CHECKLIST v4.0.643 ## Bullauge Take One - [ ] Kein Springen. - [ ] Max 9 bleibt aktiv. - [ ] Direkte Fäden gleich lang. - [ ] Kind mit Kindern bleibt auf gleichem Radius wie Kind ohne Kinder. - [ ] Überlappungen sind erlaubt und lösen keine Abstandskorrektur aus. - [ ] Familienkreise dürfen sich überlagern. ## Print - [ ] Print/Druck darf weiterhin größere Abstände nutzen. - [ ] Print darf Kind mit Kindern extra behandeln. - [ ] Bullauge-Änderung zerstört Print nicht. ## Diagnose - [ ] Shape-Feld `bullaugeVariantV643` vorhanden. - [ ] Default ist `take-one-equal-thread-bullauge`.


## TEST CHECKLIST v4.0.644
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.644.md

# TEST CHECKLIST v4.0.644 - No jumping on open. - No jumping while search header is visible. - Bullauge visible: center area bulges compared to outer area. - Child with children is not moved farther away in Bullauge mode. - Fäden stay attached to nodes during visible warp. - Print path remains separate and not forced into Bullauge equal-radius logic.


## TEST_CHECKLIST v4.0.645 – strong bullauge visibility test
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.645.md

# TEST_CHECKLIST v4.0.645 – strong bullauge visibility test - [ ] App startet ohne roten Fehler. - [ ] Bühne öffnet bestehende Map. - [ ] Bullauge ist im Screenshot sofort sichtbar. - [ ] Knoten nahe Bildschirmmitte sind deutlich größer als Randknoten. - [ ] Familienkreise nahe Bildschirmmitte sind ebenfalls sichtbar mitgewölbt. - [ ] Beim Verschieben wandert der Effekt mit der Bildschirmmitte. - [ ] Der Effekt klebt nicht dauerhaft an einem bestimmten Knoten. - [ ] Print/Footer/Bibliothek bleiben bedienbar. Bewertung: - Sichtbarkeit Ziel: 8/10. - Eleganz ist noch nicht Ziel. Erst Wirkung beweisen, danach fein kalibrieren.


## TEST_CHECKLIST v4.0.646 – position dominant bullauge
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.646.md

# TEST_CHECKLIST v4.0.646 – position dominant bullauge - [ ] Effekt hängt an der Bildschirmmitte, nicht am Knoten. - [ ] Mittige Familie wirkt räumlich gewölbt. - [ ] Knoten bleiben deutlich lesbarer als in v4.0.645. - [ ] Polygone bleiben stabile Körper, keine geschmolzenen Formen. - [ ] Kreise laufen weniger ineinander. - [ ] Familienkreise zeigen den Effekt sichtbar, aber kontrolliert. - [ ] Fäden bleiben ungefähr nachvollziehbar.


## TEST CHECKLIST v4.0.647
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.647.md

# TEST CHECKLIST v4.0.647 - [ ] Map verschieben: Bullauge hängt sichtbar an der Bildschirmmitte. - [ ] Polygonhüllen verformen sich sichtbar, aber bleiben als Dreieck/Viereck/Fünfeck/Sechseck lesbar. - [ ] Kreise bleiben weitgehend stabil und werden nicht zu Eiern. - [ ] Fäden wirken an Hüllenseiten gebunden, nicht an alten Polygonresten. - [ ] Familienkreise folgen der Bullauge-Projektion stärker als in v4.0.646. - [ ] Keine harte Regression: Start, Import, Bühne, Suche, Fokusraum öffnen.


## TEST_CHECKLIST v4.0.654
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.654.md

# TEST_CHECKLIST v4.0.654 - [ ] Kompass oeffnet ohne Maximum-call-stack-Fehler. - [ ] Bullauge/Printansicht-Wechsel funktioniert weiter. - [ ] Kreise wirken nicht mehr kleiner als Vierecke. - [ ] Dreieck, Quadrat, Fuenfeck und Hexagon bleiben erkennbar. - [ ] Anatomie-Vorlage: Kopf/HWS/Thorax/LWS/Becken pruefen. - [ ] Lange Labels wie Hoffnungslosigkeit, Angst und Stress, Thorax/Schulterhoehe bleiben lesbarer. - [ ] Keine neuen Spruenge oder kaputten Fadenanker.


## TEST_CHECKLIST v4.0.664
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.664.md

# TEST_CHECKLIST v4.0.664 Pflichttest Buehne: - Root mit 3 Kindern: Kreis bleibt sichtbar als Vordergrundkoerper; Dreieck liegt nur dahinter. - Kind mit 2 eigenen Kindern: Dreiecksspitze zeigt von der Mutter weg. - Ziehen/Neuzentrieren: Dreieck rotiert nicht frei und springt nicht. - 4er/5er nach 3er: keine alten Dreieckreste. - Bullauge-Mitte: Kreis und Huelle skalieren gemeinsam, kein Auseinanderlaufen. Nicht angefasst: - Kein Pinch. - Keine Print-Distanzlogik. - Keine Import-/Promptlogik. - Keine SDK-Änderung; Expo SDK 54 bleibt.


## TEST_CHECKLIST v4.0.666
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.666.md

# TEST_CHECKLIST v4.0.666 1. Neues Thema mit 1 Kind: Root und Kind sind rund. 2. Root mit 3 Kindern: Kreis vorne, Dreieck gedimmt dahinter. 3. Fäden müssen am Kreisrand austreten, nicht sichtbar an der Dreieckskante starten. 4. Kind mit Parent + 2 Kindern: Dreieck darf Richtungsfläche zeigen, aber alle Fäden gehören optisch zum Kreis. 5. Kind mit Parent + 4/5 Kindern: Fünfeck/Sechseck nur Hintergrund, Fäden bleiben am Kreis.


## TEST_CHECKLIST v4.0.670
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.670.md

# TEST_CHECKLIST v4.0.670 - App startet in Expo Go. - Intro erscheint, Bildhintergrund sichtbar, Überspringen und Starten funktionieren. - Vorlagenkarten öffnen normal und bleiben antippbar. - Template-Texte sind trotz Bildhintergrund lesbar. - Genogramm/AI-Import: Zusatzfäden sind deutlich sparsamer als v4.0.668. - Direkte Eltern-Kind-Fäden bleiben am Kreisrand verankert. - Familienpolygone werden nur als Polygonfläche gezeigt, ohne zusätzliche Kreise.


## TEST_CHECKLIST v4.0.671
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.671.md

# TEST_CHECKLIST v4.0.671 1. Testmap mit Root + 3 Kindern öffnen. - Erwartung: Familienpolygon ist ein zartes Dreieck aus Kinderpunkten. - Keine dominante dunkle Fläche. - Keine Zusatzkreise unter dem Polygon. 2. Root + Kind + mehrere Kinder öffnen. - Erwartung: Kreis bleibt Vordergrundkörper. - Hülle des Knotens bleibt sichtbar, aber nicht dominant. - Eltern-Kind-Fäden docken am Kreisrand. 3. Genogramm oder größere Map öffnen. - Erwartung: gestrichelte Familienkreise überfluten die Bühne nicht mehr. - Blattkreise sind nicht mehr als eigene Diagnosekreise sichtbar. - Resonanzfäden sind nur schwach und begrenzt sichtbar. 4. Intro prüfen. - Erwartung: kein alter Baum-Hintergrund mehr zwischen den Slides. - Organischer Ursprungshintergrund erscheint konsistent.


## TEST_CHECKLIST v4.0.672
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/TEST_CHECKLIST_v4.0.672.md

# TEST_CHECKLIST v4.0.672 1. ZIP entpacken. 2. In `2-PROJEKTE/PROJEKT-app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs` wechseln. 3. `node scripts/preflight.mjs` ausführen. Erwartung: keine FAILs, nur Warnungen zu fehlenden node_modules. 4. `npm install` ausführen. 5. `npm run preflight` ausführen. Erwartung: keine FAILs und keine Dependency-Warnungen mehr. 6. `npm run go` starten und Start, Intro-Skip, Bibliothek, Bühne, Fokusraum und Import prüfen. 7. Für TestFlight zusätzlich `npx expo-doctor`, dann `npm run build:ios:testflight`.


## Thematik-Titel und Bühnensuche
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/THEMATIK_TITEL_UND_SUCHE.md

# Thematik-Titel und Bühnensuche ## Grundregel Ein neues Thema startet auf der Bühne zunächst mit einem Pflichtfeld für den Thementitel. Dieses Feld ist in diesem Zustand keine Map-Suche. Der eingegebene Titel wird als Titel der Thematik und als Titel der Urmutter gesetzt. Danach schaltet dasselbe Feld in den Suchmodus innerhalb dieser Thematik. ## Suchmodus Nach gesetztem Titel zeigt das Feld: `In der Thematik „ “ suchen` Die Suche sucht nur innerhalb der aktuellen Map. Der alte Edit-Hinweis im Suchfeld bleibt entfernt. ## Varianten Wenn ein Thementitel bereits existiert, wird automatisch eine nummerierte Variante erzeugt. Beispiel: `Sonne` `Sonne 2` `Sonne 3` Die Nummer steht direkt im Titel und macht die Variante eindeutig. ## Titelbearbeitung Der Thematiktitel gehört zur Startseite/Liste und soll dort über ein Stiftsymbol hinter dem Titel bearbeitet werden. Bei Kollision wird die Variante ebenfalls durch Nummerierung eindeutig gemacht. Die Urmutter besitzt zusätzlich ihren Knotentitel und kann im Knoten-/Fokuskontext bearbeitet werden. Beim Erstellen sind Thematik und Urmutter zunächst identisch benannt.


## Drei Themen – Kurznotizen
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/THREE_THEME_NOTES_v4.0.194.md

# Drei Themen – Kurznotizen ## Baumkrone Ziel: Gehirn, Baum, Vernetzung, organische Ruhe. Vorteil: Beziehungssinn, räumliche Tiefe, Prozessgefühl. ## Atlas Ziel: Kartenwerk, Fachbuch, Diagramm, Drucknähe. Vorteil: hohe Lesbarkeit, klare Orientierung, seriöser Fachcharakter. ## Blumenwiese Ziel: lebendige Farbvielfalt, Blütenfeld von oben, motivierende Weite. Vorteil: emotionaler Zugang, freundlicher Einstieg, starke Eigenständigkeit.


## ITMO v4.0.192 — Undo und Bildstruktur
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/UNDO_IMAGE_PREVIEW_v4.0.192.md

# ITMO v4.0.192 — Undo und Bildstruktur ## Rückgängig Ein erster Undo-Stack speichert bis zu 24 Map-Zustände. Er greift bei normalen Map-Änderungen wie Text, Farbe, Kinder, Löschen, Import, Fotowelt und Bildast-Erzeugung. Grenze: Texttippen erzeugt aktuell noch feine Zwischenschritte. Später sollte Undo semantisch gruppieren: ein Schreibvorgang, ein Bildstruktur-Vorgang, ein Löschvorgang. ## Bildmehrfachauswahl Im Fokusraum kann ein Polygon mehrere Fotos aus der iPhone-Mediathek auswählen. ITMO speichert weiterhin nur Referenzen. Optionen nach Auswahl: - Titelbild - Aststruktur - Beides Aststruktur bedeutet: Der aktuelle Kreis bleibt Stamm, die Bilder werden als Kindkreise angelegt. ## Nächster Schritt Vorschau vor Übernahme als echte Mini-Struktur statt Alert-Text.


## v4.0.658 – stage finish polish pass
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/VERSION_LOG.md

## v4.0.658 – stage finish polish pass - Dreieck optisch vergrößert und Viereck weiter beruhigt. - N-Eck-Massen feiner aneinander angeglichen. - Hüllenmaterial weicher gemacht, ohne Blob-Optik. - Hüllenrotation stärker gedämpft, damit beim Bewegen weniger Eigenrotation sichtbar ist. - Punktraster ruhiger, Fokusfarbe und lokale Knotennähe stärker eingemischt. - Fäden mit weicherem Mutter-Kind-Farbverlauf. ## v4.0.657 – Soft Hull Stability Pass - Hüllenmasse weiter normalisiert: Dreieck größer, Viereck kleiner, N-Ecke ruhiger. - Sanfte Ecken-Weichung für Polygonhüllen ohne Seitenzahlverlust. - Kreis-Hüllen von automatischer Bullauge-Rotation ausgenommen. - Hüllenrotation gedämpft, um sichtbares Eigendrehen beim Bewegen zu reduzieren. - Schwarzes Punktraster organischer und ruhiger gemacht. ## v4.0.650 – Footer-Ansichtenbutton - Neuer Ansichtenbutton im Footer vor Print. - Wechsel: Bullauge → Printansicht → Zeitansicht → Frei → Bullauge. - Printansicht nutzt echte Print-Geometrie als Bühnenvorschau, kein Bullauge-Warp. - Ansichtenwechsel animiert die Kamera weich zum passenden Fit. ## v4.0.647-aligned-hull-bullauge Status: Bullauge bleibt reine Bildschirmprojektion. Gegenüber v4.0.646 dürfen nun die sichtbaren Polygonhüllen wieder verformen, aber kontrolliert: nicht punktweise chaotisch, sondern lokal entlang Radial- und Tangentialachse zur Bildschirmmitte. Dadurch können Hüllen eine Bullauge-Wölbung zeigen, ohne ihre Seitenlogik und Fadenanker komplett zu verlieren. Geändert: - `src/ui/Stage.js`: `applyTakeOneBullaugeScreenWarp` auf v647 gesetzt. - Polygonpunkte werden lokal radial/tangential ausgerichtet verformt. - Knoten mit 3+ Verbindungen bekommen volle Hüllenverformung, 2er-Hüllen gedämpft, Kreise fast stabil. - Knotengröße leicht reduziert, damit weniger Kollisionen entstehen. - `src/ui/StageRenderLayers.js`: Familienkreisradius liest `bullaugeWarp.familyScale`, damit Diagnosekreise zur Bullauge-Projektion passen. Testziel: 1. Beim Verschieben muss die Wölbung an der Bildschirmmitte hängen. 2. Polygonhüllen dürfen sichtbar weich werden. 3. Die Orientierung der Hüllen soll dabei lesbar bleiben. 4. Fäden dürfen nicht sichtbar aus falsch gedrehten alten Hüllenseiten kommen. Noch offen nach Screenshotprüfung: - Stärke der Hüllenverformung feinjustieren. - Falls Fäden noch durch Hüllen laufen: Anker nach der finalen Hüllenprojektion neu schneiden. ## v4.0.630 - single active focus family lock - Bullauge-Fokus erzeugt jetzt nur noch eine aktive Fokusfamilie gleichzeitig. - Nebenfamilien werden nicht mehr parallel mit 90°-Slot-Snap und Branch-Clearance behandelt. - Dadurch sollen Familien mit eigenen Kindern nicht mehr im Zentrum zusammengezogen und gekreuzt werden. - Fäden/Hüllen bleiben auf globalem Layer aus v4.0.629. ## v4.0.627 - centerline-under-hull-thread-mask - Aktive Bühnenfäden werden nicht mehr boundary-to-boundary mit Kappen gerendert. - Faden ist jetzt eine Zentrum-zu-Zentrum-Untergrundlinie. - Deckende Hüllen maskieren den Faden automatisch an der sichtbaren Hüllenkante. - Dadurch keine berechneten Stummel an Dreiecken/Fünfecken mehr. - Fadenbreite reduziert und Linie auf rundes Segment umgestellt. ## v4.0.626 - tangent-anchor-no-stump-thread - Entfernt den Außen-Offset der Tangentenanker, der bei Dreieck/Fuenfeck sichtbare Fadenstummel erzeugt hatte. - Aktive Fäden enden wieder exakt auf der Tangenten-Seitenmitte; die deckende Hülle maskiert Innenanteile. - Fadenstrichstaerke reduziert und runde Kappen gesetzt, damit keine harten Rechtecksegmente mehr an Hüllenkanten stehen. ## v4.0.625 - tethers-under-all-hulls-render-order - Alle aktiven Familienfäden werden global unter alle Hüllen gelegt. - Paketweise Render-Reihenfolge entfernt, die tiefe Fäden über Dreieck-/Polygonhüllen sichtbar machen konnte. - Schwarzer Fadenschatten im aktiven Bühnenfaden entfernt, damit keine schwarzen Schnitte in Dreieck/Hülle entstehen. - Hüllen bleiben deckend; Fäden werden durch die Hülle maskiert statt sichtbar durch die Fläche zu laufen. ## v4.0.624 - opaque hull outside thread anchor - Hüllenfüllung auf volle Deckkraft gesetzt, damit breite Fäden darunter nicht mehr als Innenstreifen durch Dreieck/Fünfeck sichtbar bleiben. - Aktive Polygon-Fadenanker liegen minimal außerhalb der Tangentenseite; die Hülle selbst bleibt unverändert. - Ziel bleibt: Fäden berühren Hüllenseiten, laufen aber nicht sichtbar in die Hüllfläche hinein. ## v4.0.623 - tangent-side-midpoint-thread-anchor - Aktive Fadenanker bei Polygonhüllen nutzen jetzt wieder die echte Tangentenmitte der Hüllenseite. - Der falsche v4.0.622-Pfad über sichtbare Polygon-Kantenmittelpunkte wurde entfernt, weil er bei ungeraden Hüllen um einen Kantenindex versetzt war. - 3/5/7-Hüllen sollen dadurch nicht mehr an Spitzen/Ecken anbinden. - Kreisanker bleiben nur für echte Kreisformen. ## v4.0.622 - visible-hull-side-anchor-final - Aktive Fäden berechnen Parent- und Child-Anker direkt aus der aktuell gezeichneten Hülle. - Zielwinkel bestimmt nur noch die Hüllenseite; der konkrete Punkt ist immer die sichtbare Seitenmitte. - 3/5/7 nutzen damit dieselbe sichtbare Seitenkantenlogik wie gerade Kinderzahlen. - Gespeicherte Geometrieanker und theoretische Kreisanker werden für Polygonhüllen im aktiven Fadenpfad nicht mehr verwendet. ## v4.0.621 - odd-side-midpoint-anchor-unification - Ungerade Sonderfehler im aktiven Fadenanker entfernt. - Polygon-Fäden nutzen Side-Midpoints direkt vom Polygonankerkreis statt gezeichnete Punkte/Vertices. - Eigene Kinder werden über stabilen Geschwisterindex auf Hüllenseiten gelegt. - 3/5/7 Kinder laufen über dasselbe Seitenmittelpunkt-System wie gerade Zahlen. - Kreisanker bleiben nur für echte Kreisformen. ## v4.0.619 - no-family-rotation-final-lock - Familien erhalten keine Winkelrotation mehr relativ zur Oma, zur Rueckseite oder zur aktuellen Tuchlage. - Fokus-Slots werden fuer alle Familien nur noch aus stabilem Geschwisterindex berechnet. - Kind 1 bleibt unten; weitere Kinder verteilen sich stabil im Uhrzeige


## ITMO MAP TXT EXPORT
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/Anatomie-Knochenmap-v4.0.464.txt

ITMO MAP TXT EXPORT Titel: Anatomie-Knochenmap-v4.0.464 Exportiert: 2026-06-17T20:10:00.000Z Hinweis: Diese Datei ist als Kapiteltext lesbar. ITMO kann den Kapiteltext importieren; die App-Vorlage nutzt zusätzlich die native körperachsenbasierte V464-Struktur. ---ITMO_KAPITEL_TEXT_START--- # Anatomie Knochen ## Kopf / Schädel ### Hirnschädel #### Os frontale #### Os parietale links #### Os parietale rechts #### Os temporale links #### Os temporale rechts #### Os occipitale #### Os sphenoidale #### Os ethmoidale ### Gesichtsschädel #### Mandibula #### Vomer #### Maxilla links #### Maxilla rechts #### Os zygomaticum links #### Os zygomaticum rechts #### Os nasale links #### Os nasale rechts #### Os lacrimale links #### Os lacrimale rechts #### Os palatinum links #### Os palatinum rechts #### Concha nasalis inferior links #### Concha nasalis inferior rechts ### Gehörknöchelchen #### Malleus links #### Incus links #### Stapes links #### Malleus rechts #### Incus rechts #### Stapes rechts ### Os hyoideum ## Hals / HWS ### C1 Atlas ### C2 Axis ### C3-C7 #### C3 #### C4 #### C5 #### C6 #### C7 ## Thorax / Schulterhöhe ### Brustwirbelsäule T1-T12 #### T1 #### T2 #### T3 #### T4 #### T5 #### T6 #### T7 #### T8 #### T9 #### T10 #### T11 #### T12 ### Brustkorb #### Sternum #### Rippen links I-XII #### Rippen rechts I-XII ### Schultergürtel links #### Clavicula links #### Scapula links ### Schultergürtel rechts #### Clavicula rechts #### Scapula rechts ## Arm links ### Humerus links ### Unterarm links #### Radius links #### Ulna links ### Hand links #### Handwurzel links #### Mittelhand links #### Fingerknochen links ## Arm rechts ### Humerus rechts ### Unterarm rechts #### Radius rechts #### Ulna rechts ### Hand rechts #### Handwurzel rechts #### Mittelhand rechts #### Fingerknochen rechts ## Becken / LWS ### Lendenwirbel L1-L5 #### L1 #### L2 #### L3 #### L4 #### L5 ### Os sacrum / Os coccygis ### Os coxae links #### Os ilium links #### Os ischii links #### Os pubis links ### Os coxae rechts #### Os ilium rechts #### Os ischii rechts #### Os pubis rechts ## Bein links ### Femur links ### Knie / Patella links #### Patella links ### Unterschenkel links #### Tibia links #### Fibula links ### Fuß links #### Fußwurzel links #### Mittelfuß links #### Zehenknochen links ## Bein rechts ### Femur rechts ### Knie / Patella rechts #### Patella rechts ### Unterschenkel rechts #### Tibia rechts #### Fibula rechts ### Fuß rechts #### Fußwurzel rechts #### Mittelfuß rechts #### Zehenknochen rechts ---ITMO_KAPITEL_TEXT_END--- ---ITMO_JSON_START--- { "type": "itmo-map-v4", "version": "4.0.464", "exportedAt": "2026-06-17T20:10:00.000Z", "chapterText": "# Anatomie Knochen\n\n## Kopf / Schädel\n\n### Hirnschädel\n\n#### Os frontale\n#### Os parietale links\n#### Os parietale rechts\n#### Os temporale links\n#### Os temporale rechts\n#### Os occipitale\n#### Os sphenoidale\n#### Os ethmoidale\n\n### Gesichtsschädel\n\n#### Mandibula\n#### Vomer\n#### Maxilla links\n#### Maxilla rechts\n#### Os zygomaticum links\n#### Os zygomaticum rechts\n#### Os nasale links\n#### Os nasale rechts\n#### Os lacrimale links\n#### Os lacrimale rechts\n#### Os palatinum links\n#### Os palatinum rechts\n#### Concha nasalis inferior links\n#### Concha nasalis inferior rechts\n\n### Gehörknöchelchen\n\n#### Malleus links\n#### Incus links\n#### Stapes links\n#### Malleus rechts\n#### Incus rechts\n#### Stapes rechts\n\n### Os hyoideum\n\n## Hals / HWS\n\n### C1 Atlas\n\n### C2 Axis\n\n### C3-C7\n\n#### C3\n#### C4\n#### C5\n#### C6\n#### C7\n\n## Thorax / Schulterhöhe\n\n### Brustwirbelsäule T1-T12\n\n#### T1\n#### T2\n#### T3\n#### T4\n#### T5\n#### T6\n#### T7\n#### T8\n#### T9\n#### T10\n#### T11\n#### T12\n\n### Brustkorb\n\n#### Sternum\n#### Rippen links I-XII\n#### Rippen rechts I-XII\n\n### Schultergürtel links\n\n#### Clavicula links\n#### Scapula links\n\n### Schultergürtel rechts\n\n#### Clavicula rechts\n#### Scapula rechts\n\n## Arm links\n\n### Humerus links\n\n### Unterarm links\n\n#### Radius links\n#### Ulna links\n\n### Hand links\n\n#### Handwurzel links\n#### Mittelhand links\n#### Fingerknochen links\n\n## Arm rechts\n\n### Humerus rechts\n\n### Unterarm rechts\n\n#### Radius rechts\n#### Ulna rechts\n\n### Hand rechts\n\n#### Handwurzel rechts\n#### Mittelhand rechts\n#### Fingerknochen rechts\n\n## Becken / LWS\n\n### Lendenwirbel L1-L5\n\n#### L1\n#### L2\n#### L3\n#### L4\n#### L5\n\n### Os sacrum / Os coccygis\n\n### Os coxae links\n\n#### Os ilium links\n#### Os ischii links\n#### Os pubis links\n\n### Os coxae rechts\n\n#### Os ilium rechts\n#### Os ischii rechts\n#### Os pubis rechts\n\n## Bein links\n\n### Femur links\n\n### Knie / Patella links\n\n#### Patella links\n\n### Unterschenkel links\n\n#### Tibia links\n#### Fibula links\n\n### Fuß links\n\n#### Fußwurzel links\n#### Mittelfuß links\n#### Zehenknochen links\n\n## Bein rechts\n\n### Femur rechts\n\n### Knie / Patella rechts\n\n#### Patella rechts\n\n### Unterschenkel rechts\n\n#### Tibia rechts\n#### Fibula rechts\n\n### Fuß rechts\n\n#### Fußwurzel rechts\n#### Mittelfuß rechts\n#### Zehenknochen rechts\n", "note": "V4.0.464 strukturierte Anatomie-Knochenmap; Detailreihen werden in der App in Textblöcken geführt, um Bühnenchaos zu vermeiden." } ---ITMO_JSON_END---


## ITMO MAP TXT EXPORT
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/Anatomie-Knochenmap-v4.0.465.txt

ITMO MAP TXT EXPORT Titel: Anatomie-Knochenmap-v4.0.465 Exportiert: 2026-06-17T20:45:00.000Z Hinweis: Diese Datei ist als Kapiteltext lesbar. ITMO kann den Kapiteltext importieren; die App-Vorlage selbst enthält zusätzlich Layout-, Symbol- und Richtungsdaten. ---ITMO_KAPITEL_TEXT_START--- # Kopf / Schädel Oberster Startpunkt der Knochenkarte. Von hier wächst die Körperachse zwingend nach unten. Schädelknochen, Gesichtsschädel und Gehörknöchelchen bleiben als Textblöcke im Kopf, damit die Bühne nicht als Knochenwolke explodiert. ## Hals / HWS Direktes erstes Kind des Kopfes. Geplante Richtung: unten. ### Os hyoideum Zungenbein unter Mandibula/Schädelbasis. Bezug zu Schlucken, Zunge, Kehlkopf und supra-/infrahyoidaler Muskulatur. ### C1 Atlas / C2 Axis Kopfgelenkregion. Atlas trägt den Schädel, Axis bildet mit Dens axis die Rotationsachse. ### Thorax / Schulterhöhe Brustkorb und Schulterhöhe. Hier zweigen die oberen Extremitäten symmetrisch links/rechts ab. Die Körperachse läuft weiter nach unten zu LWS und Becken. #### C3-C7 Halswirbel C3 bis C7 als funktionelle Reihe. #### Brustwirbelsäule T1-T12 Zwölf Brustwirbel mit Rippenbezug. #### Brustkorb Sternum und zwölf Rippenpaare. Schutz, Atemmechanik, Schultergürtelbezug. ##### Sternum Manubrium sterni, Corpus sterni, Processus xiphoideus. ##### Rippen links I-XII Zwölf linke Rippen. ##### Rippen rechts I-XII Zwölf rechte Rippen. #### Schultergürtel links Clavicula links und Scapula links. Geplante Richtung: links. ##### Obere Extremität links Humerus, Radius, Ulna und Handknochen links. Distale Richtung nach außen/unten. ###### Humerus links Oberarmknochen links. ###### Unterarm links Radius links und Ulna links. ####### Hand links Karpalia, Metakarpalia und Phalangen links als Textblock-Feinstruktur. #### Schultergürtel rechts Clavicula rechts und Scapula rechts. Geplante Richtung: rechts. ##### Obere Extremität rechts Humerus, Radius, Ulna und Handknochen rechts. Distale Richtung nach außen/unten. ###### Humerus rechts Oberarmknochen rechts. ###### Unterarm rechts Radius rechts und Ulna rechts. ####### Hand rechts Karpalia, Metakarpalia und Phalangen rechts als Textblock-Feinstruktur. #### Becken / LWS Übergang von Rumpf zu unteren Extremitäten. Geplante Richtung: unten. ##### Os sacrum / Os coccygis Kreuzbein und Steißbein als dorsale Becken-/Wirbelsäulenbasis. ##### Untere Extremität links Bein links. Geplante Richtung: unten links. ###### Femur links Oberschenkelknochen links. ###### Knie links Patella links; distaler Femur und proximale Tibia/Fibula funktionell mitdenken. ####### Unterschenkel links Tibia links und Fibula links. ######## Fuß links Tarsalia, Metatarsalia und Phalangen links als Textblock-Feinstruktur. ##### Untere Extremität rechts Bein rechts. Geplante Richtung: unten rechts. ###### Femur rechts Oberschenkelknochen rechts. ###### Knie rechts Patella rechts; distaler Femur und proximale Tibia/Fibula funktionell mitdenken. ####### Unterschenkel rechts Tibia rechts und Fibula rechts. ######## Fuß rechts Tarsalia, Metatarsalia und Phalangen rechts als Textblock-Feinstruktur. ---ITMO_KAPITEL_TEXT_END--- ---ITMO_JSON_START--- { "type": "itmo-map-v4", "version": "4.0.465", "note": "Die produktive Anatomie-Vorlage liegt im App-Code als createAnatomyBonesTemplateV465, weil dort Richtungs- und Symbolplanung sauber gespeichert werden. Dieser Block dient als Import-/Lesereferenz." } ---ITMO_JSON_END---


## ITMO MAP TXT EXPORT
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/Anatomie-Knochenmap-v4.0.467.txt

ITMO MAP TXT EXPORT Titel: Anatomie Knochen Exportiert: 2026-06-17T21:45:00.000Z Hinweis: Diese Datei beschreibt die v4.0.467-Anatomievorlage als Kapitelstruktur. Die native App-Vorlage ist zusätzlich im Code in src/core/model.js hinterlegt. ---ITMO_KAPITEL_TEXT_START--- # Kopf / Schädel Kopf oben. Startpunkt der Körperachse. Schädelknochen, Gesichtsschädel und Gehörknöchelchen werden textlich geführt, damit die Bühne lesbar bleibt. ## Hals / HWS Erstes Kind des Kopfes. Muss sichtbar nach unten laufen. C1-C7, Kopfhaltung, Hyoidbezug. ### Thorax / Schulterhöhe Achsenknoten für Brustkorb und Schulterhöhe. Nur drei sichtbare Hauptäste, damit die Geometrie die Körperform hält: Schultergürtel links, Schultergürtel rechts, Becken / LWS. #### Schultergürtel links Clavicula links und Scapula links. Seitlicher Ast auf Schulterhöhe. ##### Obere Extremität links Humerus, Unterarm, Hand links. ###### Humerus links Oberarmknochen links. ###### Unterarm links Radius links und Ulna links. ####### Hand links Handwurzel, Mittelhand, Fingerknochen links. Details textlich: Karpalia, Metakarpalia, Phalangen. #### Schultergürtel rechts Clavicula rechts und Scapula rechts. Seitlicher Ast auf Schulterhöhe. ##### Obere Extremität rechts Humerus, Unterarm, Hand rechts. ###### Humerus rechts Oberarmknochen rechts. ###### Unterarm rechts Radius rechts und Ulna rechts. ####### Hand rechts Handwurzel, Mittelhand, Fingerknochen rechts. Details textlich: Karpalia, Metakarpalia, Phalangen. #### Becken / LWS Dritter Hauptast des Thorax und zwingend unterhalb der Schulterhöhe. LWS, Kreuzbein, Steißbein, Os coxae links/rechts. ##### Lendenwirbel L1-L5 Fünf Lendenwirbel als tragender Abschnitt der unteren Körperachse. ##### Os sacrum / Os coccygis Kreuzbein und Steißbein als kaudales Achsenskelett. ##### Os coxae links Ilium, Ischium und Pubis links als erwachsen verwachsener Hüftknochen. ##### Os coxae rechts Ilium, Ischium und Pubis rechts als erwachsen verwachsener Hüftknochen. ##### Untere Extremität links Femur, Patella, Tibia, Fibula und Fuß links. ###### Oberschenkel links Femur links und Patella links. ###### Unterschenkel links Tibia links und Fibula links. ####### Fuß links Fußwurzel, Mittelfuß, Zehenknochen links. Details textlich: Tarsalia, Metatarsalia, Phalangen. ##### Untere Extremität rechts Femur, Patella, Tibia, Fibula und Fuß rechts. ###### Oberschenkel rechts Femur rechts und Patella rechts. ###### Unterschenkel rechts Tibia rechts und Fibula rechts. ####### Fuß rechts Fußwurzel, Mittelfuß, Zehenknochen rechts. Details textlich: Tarsalia, Metatarsalia, Phalangen. ### Os hyoideum Begleitknoten am Hals. Darf die Körperachse nicht verdrängen. ### C1 Atlas / C2 Axis Kopfgelenkregion. Atlas trägt den Schädel, Axis mit Dens axis als Rotationsachse. ---ITMO_KAPITEL_TEXT_END---


## Parkmodule und Fertig-App-Linie v4.0.542
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/CLEANUP_PARKMODULES_v4.0.542.md

# Parkmodule und Fertig-App-Linie v4.0.542 ## Kern behalten Bibliothek, Bühne, Fokusraum, Import, Promptimport, Export/Print, Foto/Instamodus, Kompass-Prüfkarte und Vorlagen bleiben Kernbestand. ## Parken Ton bleibt pausiert. Keine sichtbaren Buttons, keine neue Logik, keine weitere Priorität, bis Ton ausdrücklich reaktiviert wird. VR bleibt Architektur-Ausblick. Keine sichtbaren Bedienelemente und keine Entwicklung, bis der Kern stabil ist. ## Entsorgen oder stilllegen Restpfade, die nur alte Experimente bedienen, sollen künftig nicht weiter sichtbar gemacht werden. Sie werden nur entfernt, wenn dadurch keine stabile Funktion beschädigt wird. Der nächste sinnvolle Schritt ist keine große Löschung, sondern ein TestFlight-Cut mit sauber dokumentiertem Kernstand.


## HANDOFF_v4.0.532
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.532.md

# HANDOFF_v4.0.532 Stand: TestFlight-Dependency-Guard. Auslöser war ein Windows-PowerShell-Abbruch bei `eas build --platform ios --profile production`: `Cannot find 'expo-modules-autolinking' package in your project, make sure that you have 'expo' package installed` Bewertung: Das ist kein App-Code-Fehler, sondern ein lokaler Dependency-Zustand. EAS liest die Expo-Konfiguration lokal, bevor der Cloud-Build startet. Ohne `node_modules` kann EAS `expo` und `expo-modules-autolinking` nicht auflösen. Umsetzung: - Version auf 4.0.532 gehoben. - `eas.json` ergänzt um `cli.appVersionSource: remote`. - `scripts/ensure-deps.mjs` ergänzt. - `preflight` prüft lokale Expo-Dependencies. - Windows-Skript aktualisiert: `npm install`, `preflight`, `expo-doctor`, EAS Build. Nächster sauberer Test: PowerShell im entpackten Projektordner: ```powershell .\WINDOWS_TESTFLIGHT_COMMANDS.ps1 ``` Danach bei erfolgreichem EAS-Build: ```powershell npm run submit:ios:testflight ```


## HANDOFF_v4.0.533
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.533.md

# HANDOFF_v4.0.533 Stand: Import-/Promptimport-Recovery auf Basis v4.0.532. Auslöser: Sebastian hat gemeldet, dass der Importbutton fehlt. Zusätzlich soll nach dem Erzeugen/Kopieren eines AI-Prompts direkt im Promptfenster ein klar sichtbarer Promptimport vorhanden sein. Umsetzung: - Version auf 4.0.533 gehoben. - Bibliothek/Suchbereich: sichtbare Aktionszeile mit `Import` und `Promptimport` ergänzt. - `Import` ruft wieder den vorhandenen Dateiimport über `onImport` auf. - `Promptimport` öffnet direkt das AI-Promptfenster. - AI-Promptgenerator: kleiner Download-Icon-Import pro Chip durch lesbaren `Promptimport`-Button ersetzt. - AI-Promptgenerator: sobald ein Thema als Prompt aktiv ist, erscheint zusätzlich eine eigene Zeile mit `Prompt kopieren` und `Promptimport`. - Keine Änderung an Geometrie, Kompass, Familienkreisen, Fäden, Fokusraum oder Ton. - Ton bleibt pausiert. - SDK 54 bleibt unverändert. Geprüft: - `node --check src/ui/LibraryPanel.js` bestanden. - `node --check App.js` bestanden. - `node --check src/ui/Stage.js` bestanden. - `node --check src/ui/FocusRoom.js` bestanden. - `package.json` gültig. - `app.json` gültig. Nächster sinnvoller Test: 1. App starten. 2. Themen/Bibliothek öffnen. 3. Prüfen: Aktionszeile zeigt `Import` und `Promptimport`. 4. `Import` testen: ITMO-TXT-Datei auswählen. 5. `Promptimport` testen: AI-Fenster öffnen, Thema eingeben, bestätigen, Prompt kopieren, ChatGPT-Antwort kopieren, `Promptimport` tippen. 6. Prüfen: importierte Map öffnet direkt auf der Bühne. Offene Planpunkte aus bisherigem Stand: - Kompass weiter als Prüfkarte verwenden: 16 Richtungen sichtbar, Pfeile sauber ausgerichtet, keine Kettenbildung. - Familienkreise visuell prüfen: weiß, 50 Prozent Deckkraft, hinter der Familie, kein anderer Familienkreis in Innenraum. - Fädenlängen weiter prüfen: Kinder gleich lang, Kinder mit eigenen Kindern erhalten verständlich mehr Außenraum. - Mobile Abstandswirkung prüfen: Ziel etwa 5 mm Abstand zwischen Fäden/Strukturen auf Handy. - TestFlight-Pfad bleibt bereit: `npm install`, `npm run preflight`, `npx expo-doctor`, `npm run build:ios:testflight`, danach Submit.


## HANDOFF_v4.0.534
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.534.md

# HANDOFF_v4.0.534 Stand: Familienkreis-/Abstandspass auf Basis v4.0.533. Auslöser: Nach Wiederherstellung von Import und Promptimport sollte der nächste offene Planpunkt umgesetzt werden: Familienkreise und Fädenabstände verständlicher machen, ohne Kompass, Anatomie, AI-Flow oder Ton anzufassen. Umsetzung: - Version auf 4.0.534 gehoben. - Familienkreise werden nur noch für echte Familien gezeichnet: Mutter plus direkte sichtbare Kinder. - Einzelne Blattknoten erhalten keinen eigenen Familienkreis mehr. - Familienkreis-Radius richtet sich nicht mehr an der Kind-Tangente aus, sondern am Muttermitte-zu-Basis-Kindabstand. - Wenn einzelne direkte Kinder durch eigene Kinder längere Arme bekommen, bevorzugt der Familienkreis den normalen Blatt-Kindabstand. Dadurch bleiben lange Fäden als Herauswachsen aus der Grundfamilie sichtbar. - Render-Sicherung ergänzt: fremde Knoten sollen nicht in einen Familienkreis hineinfallen; wenn ein fremder sichtbarer Knoten zu nah liegt, wird der Kreis begrenzt oder ausgelassen. - Faden-Mindestaußenabstand von 16 auf 22 erhöht, damit sehr kurze Innen-/Kontaktfäden nicht mehr sichtbar werden. - Familienkreis bleibt weiß, 50 Prozent Deckkraft, hinter der Struktur. - Ton bleibt pausiert. - SDK 54 bleibt unverändert. Nicht geändert: - Kein neuer Anatomie-Sonderfall. - Keine neue Geburten-Sonderregel. - Keine Änderung am Import-/Promptimport-Flow aus v4.0.533. - Keine Änderung am Kompass-Datenmodell. Geprüft: - `node --check App.js` bestanden. - `node --check src/ui/StageRenderLayers.js` bestanden. - Alle JS-Dateien unter `src/` per `node --check` bestanden. - `package.json`, `app.json`, `eas.json` sind gültiges JSON. Nächster sinnvoller Test: 1. App starten. 2. Eine einfache Mutter mit 6 Kindern öffnen oder erzeugen. 3. Prüfen: Es gibt einen weißen Kreis um Mutter plus direkte Kinder, aber keine Einzelblatt-Kreise. 4. Einem der 6 Kinder wiederum Kinder geben. 5. Prüfen: Der direkte Kindfaden wird als längerer Faden erkennbar, während der Grundfamilienkreis ruhig bleibt. 6. Kompass öffnen und prüfen, dass die 16 Richtungen unverändert sichtbar sind. 7. Import und Promptimport aus v4.0.533 nochmals kurz gegenprüfen.


## HANDOFF_v4.0.535
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.535.md

# HANDOFF_v4.0.535 Stand: Kompass-/Pfeilpass auf Basis v4.0.534. Auslöser: Nach Familienkreis-Reparatur sollte der nächste offene Planpunkt umgesetzt werden: Kompasskarte wieder als saubere 16-Richtungen-Prüfkarte festziehen, Pfeile eindeutiger ausrichten und Polygon-Größen innerhalb dieser Prüfkarte beruhigen. Umsetzung: - Version auf 4.0.535 gehoben. - `buildExactKompassGeometry` arbeitet weiter als Sonderpfad nur für die Kompass-Vorlage. Das ist kein Anatomie- oder Geburten-Sonderfall, sondern eine explizite Prüfform für Richtungen. - Kompass-Zentrum und alle 16 Richtungskinder erhalten denselben Durchmesser. Dadurch sind die Polygone nur noch ruhige Dekoration und die Richtung/Fäden stehen im Vordergrund. - Kompass-Ring wird aus Bühnenbreite, Bühnenhöhe und sicherem Rand berechnet. Alle 16 Richtungen sollen beim Öffnen im ersten Rahmen sichtbar bleiben. - Richtungs-Kinder erhalten zusätzlich `compassDirectionAngleDeg` und `actualDirectionAngleDeg`, bevor der bestehende Render-Pass erneut die tatsächliche Eltern-Kind-Richtung absichert. - Pfeile bleiben `dir-auto`; keine 16 verschiedenen Symboltypen. - Familienkreise aus v4.0.534 bleiben unverändert. - Import und Promptimport aus v4.0.533 bleiben unverändert. - Ton bleibt pausiert. - SDK 54 bleibt unverändert. Nicht geändert: - Keine Änderung an Anatomie. - Keine Änderung am AI-Promptgenerator. - Keine Änderung an der normalen Familien-Geometrie. - Keine neue Geburten-Sonderregel. - Keine neue Dependency. Geprüft: - `node --check App.js` bestanden. - `node --check src/core/geometry.js` bestanden. - Alle JS-Dateien unter `src/` per `node --check` bestanden. - `package.json`, `app.json`, `eas.json` sind gültiges JSON. Nächster sinnvoller Test: 1. Kompass öffnen. 2. Prüfen: 16 direkte Kinder, keine Kette, keine Enkel. 3. Prüfen: Zentrum und Richtungs-Polygone wirken gleich groß und ruhig. 4. Prüfen: N zeigt nach oben, O nach rechts, S nach unten, W nach links; Zwischenrichtungen sitzen dazwischen. 5. Prüfen: Pfeile zeigen aus der Mitte heraus. 6. Danach Familienkreis-Test aus v4.0.534 erneut kurz wiederholen. 7. Danach Import/Promptimport als Regression testen.


## ITMO v4.0.536 — Promptimport direkt aus Zwischenablage
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.536.md

# ITMO v4.0.536 — Promptimport direkt aus Zwischenablage ## Ausgangspunkt Basis war v4.0.535 mit Kompass-Ringgeometrie und erhaltenen Familienkreisen aus v4.0.534. ## Ziel dieser Etappe Der Startbereich sollte nicht mehr zweideutig sein. Dateiimport, Promptgenerator und Promptimport der ChatGPT-Antwort sind nun getrennte Nutzerhandlungen. ## Änderungen In `src/ui/LibraryPanel.js` wurde ein direkter `importClipboardChapterText` ergänzt. Der Button liest die Zwischenablage und ruft `onImportText` mit `source: 'prompt'` auf. Leere oder nicht lesbare Zwischenablagen zeigen eine klare Meldung. Die obere Aktionszeile in der Bibliothek zeigt jetzt drei eindeutige Aktionen: `Datei`, `Prompt`, `Promptimport`. `Datei` nutzt weiterhin den Dokumentpicker. `Prompt` öffnet den Generator. `Promptimport` importiert direkt die kopierte ChatGPT-Antwort. Im Promptgenerator bleibt der Import am jeweiligen Prompt-Chip und unten am aktiven Prompt sichtbar. Zusätzlich wird der erzeugte Prompt als auswählbarer Text angezeigt, falls Kopieren auf einem Gerät nicht zuverlässig greift. ## Nicht geändert Kompasslogik, Familienkreislogik, Fädenlängen, Anatomie, TestFlight-Konfiguration und Ton wurden nicht fachlich verändert. Ton bleibt pausiert. ## Prüfung `node --check App.js` und alle JS-Dateien unter `src/` liefen ohne Syntaxfehler. `package.json`, `app.json` und `eas.json` sind gültiges JSON. Die Skripte unter `scripts/` wurden ebenfalls per `node --check` geprüft. ## Offene Gerätetests Prompt erzeugen, kopieren, ChatGPT-Antwort kopieren, danach `Promptimport` im Promptfenster testen. Eine reine Kapitel-TXT-Antwort in die Zwischenablage legen und direkt in der Bibliothek über `Promptimport` importieren. Eine TXT-Datei über `Datei` importieren. Danach Kompass und Familienkreis kurz gegenprüfen, damit die v4.0.534/v4.0.535-Regeln weiter sichtbar korrekt bleiben.


## ITMO v4.0.537 — Promptimport Guardrails
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.537.md

# ITMO v4.0.537 — Promptimport Guardrails ## Ausgangspunkt Basis war v4.0.536. Dateiimport, Promptgenerator und direkter Promptimport waren bereits getrennt sichtbar. ## Ziel dieser Etappe Der Promptimport sollte weniger spröde werden. Der häufigste Fehler ist, dass noch der erzeugte Prompt in der Zwischenablage liegt, nicht die ChatGPT-Antwort. Diese Situation sollte vor dem eigentlichen Parser erkannt werden. ## Änderungen In `src/ui/LibraryPanel.js` wurde `classifyPromptImportClipboard` ergänzt. Die Funktion prüft leere Zwischenablage, offensichtlichen Prompttext, sichtbare Kapitelüberschriften, exportierte ITMO-Blöcke und reparierbare bare Antworten mit `plannedDirection`. Der direkte Startbutton `Promptimport` und der `Promptimport` im Promptgenerator nutzen jetzt dieselbe Vorprüfung. Bei einem kopierten Prompt erscheint die klare Meldung `Noch der Prompt`; bei leerer Zwischenablage bleibt `Antwort fehlt` erhalten. In `App.js` behandelt `doImportText` jetzt `source: 'prompt'` wie einen Prompt-/AI-Import. Direkt importierte ChatGPT-Antworten erhalten also ebenfalls `aiGenerated`, `aiTopic`, `aiImportSource` und das Root-Symbol. Der Undo-/History-Text lautet dafür `Promptimport` statt `Paste-Import`. ## Nicht geändert Kompass-Ringgeometrie aus v4.0.535 und Familienkreise aus v4.0.534 wurden nicht fachlich verändert. Dateiimport, TestFlight-Konfiguration, Anatomie und Ton wurden nicht fachlich verändert. Ton bleibt pausiert. ## Prüfung `node --check App.js` und `node --check src/ui/LibraryPanel.js` liefen nach der Änderung ohne Syntaxfehler. Danach wurde der gesamte JS-Bestand erneut per `node --check` geprüft. `package.json`, `app.json` und `eas.json` wurden als JSON geprüft. ## Nächster Test Auf dem Gerät zuerst bewusst den Prompt selbst kopieren und `Promptimport` antippen. Erwartung: Meldung `Noch der Prompt`. Danach eine echte Kapitel-TXT-Antwort kopieren und importieren. Erwartung: neue Map wird geöffnet und als Promptimport/AI-Import markiert.


## ITMO v4.0.538 – Stage Symbol + Promptpanel Cleanup
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.538.md

# ITMO v4.0.538 – Stage Symbol + Promptpanel Cleanup ## Ausgangspunkt Stand v4.0.537 wurde auf dem Gerät mit Rheuma-Promptimport geprüft. Import und Fokusraum funktionieren grundsätzlich. Sichtbare Probleme im Screenshot: - Auf der Bühne lagen große weiße Buchsymbole über fast jedem importierten Knoten. Ursache: der Kapitelprompt schreibt `symbol: book` in jede Metadatenzeile; die Bühne hat dieses Symbol als großes weißes Icon gerendert. - Das AI-/Promptfenster war zu durchsichtig; die Map lag sichtbar und störend hinter dem Panel. ## Änderungen - `src/ui/StageRenderLayers.js` - `StagePolygonMedia` unterdrückt generisches `book` auf der Bühne vollständig. - Fachsymbole bleiben sichtbar. - Richtungssymbole `dir-auto` bleiben groß und rotationsfähig. - Knochenzeichen bleiben wie bisher ruhig sichtbar. - Andere nicht-fachspezifische Symbole werden kleiner gerendert, statt die Struktur zu überdecken. - `src/ui/LibraryPanel.js` - Promptpanel-Hintergrund deutlich blickdichter. - AI-Chips und Promptvorschau dunkler und besser gegen die darunterliegende Bühne getrennt. - Z-Index/Elevation ergänzt, damit das Panel als Vordergrundfenster steht. ## Nicht geändert - Promptimport-Logik aus v4.0.537 bleibt unverändert. - Kompassgeometrie aus v4.0.535 bleibt unverändert. - Familienkreise aus v4.0.534 bleiben unverändert. - Ton bleibt pausiert. ## Nächster Test 1. Rheuma-Map öffnen: Buchumrisse dürfen nicht mehr über der Bühne liegen. 2. AI-Fenster öffnen: darunterliegende Map darf nicht mehr störend durchscheinen. 3. Kompass öffnen: Richtungspfeile müssen weiterhin sichtbar sein, weil `dir-auto` nicht unterdrückt wurde.


## ITMO v4.0.539 — Prompttiefe und 16max-Strukturregel
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.539.md

# ITMO v4.0.539 — Prompttiefe und 16max-Strukturregel ## Ausgangspunkt Basis war v4.0.538. Die Rheuma-Screenshots zeigten, dass Promptimport und Inhalt grundsätzlich funktionieren, aber das Promptfenster noch keine echte Ebenenvorauswahl hatte und der Prompt die Untergliederung sowie die 16max-Regel nicht hart genug vorgab. ## Änderungen ### Promptfenster - Neue Tiefe-Vorauswahl direkt im Promptfenster: 2, 3, 4, 5, 6. - Die gewählte Tiefe wird im AI-Promptzustand gespeichert. - Prompt kopieren und Promptvorschau verwenden dieselbe Tiefe. - Der Hinweis im Panel nennt die Regel: gewählte Ebenenzahl und höchstens 16 direkte Kinder pro Mutter. ### Prompttext - Der Prompt fordert jetzt ausdrücklich eine untergliederte Struktur. - Die 16max-Regel ist im Prompt enthalten: kein Knoten mehr als 16 direkte Kinder. - Wenn mehr Aspekte nötig sind, sollen sie in sinnvolle Untergruppen verteilt werden. - Die Überschriftenregel wird dynamisch an die gewählte Tiefe angepasst. ### Import-Schutz - Kapitelimport gruppiert direkte Kinder automatisch, wenn ein Knoten mehr als 16 direkte Kinder enthält. - Statt Inhalte zu verwerfen, wird ein Bündelknoten „Weitere Aspekte“ erzeugt. - Verschachtelte Überläufe werden ebenfalls gruppiert, sodass pro Mutter maximal 16 direkte Kinder bleiben. - Import-Metadaten enthalten `maxDirectChildren: 16`. ## Nicht geändert - Promptimport-Zwischenablage aus v4.0.537 bleibt unverändert. - Symbolbereinigung aus v4.0.538 bleibt unverändert. - Kompass aus v4.0.535 bleibt unverändert. - Familienkreise aus v4.0.534 bleiben unverändert. - Ton bleibt pausiert. ## Prüfstatus - `node --check App.js` - `node --check` für alle JS-Dateien in `src/` - `node --check` für Skripte - JSON-Prüfung für `package.json`, `app.json`, `eas.json` ## Nächster Test 1. Promptfenster öffnen. 2. Tiefe 3, 4, 5 wechseln und prüfen, ob die Vorschau angepasst wird. 3. Rheuma oder anderes Thema mit Tiefe 4 erzeugen. 4. Importieren und prüfen: keine Mutter mit mehr als 16 direkten Kindern.


## ITMO v4.0.540 — Stabilisierung Safe-Area, Promptfenster, Importtests
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.540.md

# ITMO v4.0.540 — Stabilisierung Safe-Area, Promptfenster, Importtests Stand: 19.06.2026 ## Ziel Diese Etappe baut keine neue Fachfunktion ein. Sie stabilisiert den aktuellen Import-/Prompt-/Fokusraum-Pfad vor einem erneuten TestFlight-tauglichen Durchlauf. ## Änderungen ### Fokusraum Safe-Area Der Fokusraum bekommt unten mehr echten Scroll-Abstand. Die letzten Einträge, Textblöcke und Aktionsleisten sollen nicht mehr unter der globalen Footerleiste liegen. Hochformat nutzt eine größere Bottom-Clearance, Querformat eine kleinere. ### Promptfenster vereinfacht Das Promptfenster ist jetzt stärker auf den Hauptablauf reduziert: Thema eingeben, Tiefe wählen, übernehmen, Prompt kopieren, Promptimport. Alte große Promptchips wurden in einen kompakten Verlauf verwandelt. Lange Promptverläufe sollen nicht mehr über der Map liegen und den Inhalt verdecken. ### Import-Testfälle Ein eigenes Testdokument benennt die wichtigsten Promptimport- und Dateiimport-Proben: leerer Import, versehentlich kopierter Prompt, gültige Kapitelantwort, großes Thema mit 16max-Gruppierung und Dateiimport. ## Nicht geändert Kompasslogik aus v4.0.535 bleibt unverändert. Familienkreise aus v4.0.534 bleiben unverändert. Promptimport-Guardrails aus v4.0.537 bleiben unverändert. Symbolbereinigung aus v4.0.538 bleibt unverändert. 16max-Strukturregel aus v4.0.539 bleibt unverändert. Ton bleibt pausiert. ## Prüfziel Der nächste Gerätetest sollte mit Rheuma oder Lagerungsschiene laufen: Prompt erzeugen, Antwort importieren, Bühne prüfen, Fokusraum bis ganz nach unten scrollen und anschließend Dateiimport gegenprüfen.


## ITMO v4.0.541 stage_readability_import_layout
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.541.md

# ITMO v4.0.541 stage_readability_import_layout ## Ziel Stabilisierung der Bühne nach großen Promptimporten. Die Screenshots zu „Kontrollieren 2/3“ zeigten: Import funktioniert, aber die Bühne rendert zu viele Labels, zu dominante Familienkreise und zu viele Polygone/Fäden gleichzeitig. Das war kein reines Promptproblem mehr, sondern eine Lesbarkeits- und Renderbudget-Frage. ## Änderungen - Bühnenlabels werden wieder überlappt geprüft. Priorität behalten Root, selektierter Knoten, direkte Familie, zentrale sichtbare Knoten und Knoten mit Kindern. - Labelbudget für große Maps reduziert: bei sehr großen Importen erscheinen weniger gleichzeitige Labels, statt dass alle Titel übereinanderliegen. - Familienkreise sind ruhiger: große und tiefere Familienkreise werden transparenter und dünner, kleine direkte Familien bleiben sichtbar. - Familienkreis-Rendering begrenzt: nicht mehr bis zu 96 Kreise, sondern maximal 36 priorisierte Kreise. - Polygon-/Fadenbudget pro Familienebene wieder begrenzt. Vorher wurde pro Ebene durch `Math.max(..., layer.length)` faktisch alles gerendert. - Import-Repair verschärft: harte 16max-Regel bleibt, aber visueller Zielwert ist 12 direkte Kinder pro Mutter. Überlauf wird in mehrere Gruppen geteilt, statt als lange verschachtelte „Weitere Aspekte“-Kette zu entstehen. - Prompttext präzisiert: Ziel 6–12 Kinder, hart maximal 16; breite Kreiswolke vermeiden. ## Nicht geändert - Promptimport-Zwischenablage aus v4.0.537 bleibt. - Symbolbereinigung `book` aus v4.0.538 bleibt. - Promptfenster/Safe-Area aus v4.0.540 bleibt. - Kompasslogik bleibt unberührt. - Ton bleibt pausiert. ## Prüfen 1. Promptfenster: Tiefe 4 und 6 prüfen; Hinweis muss „Ziel: 6–12, hart max. 16 Kinder pro Mutter“ zeigen. 2. Neues großes Thema importieren, z. B. Kontrollieren oder Rheuma. 3. Bühne prüfen: deutlich weniger Labelüberlagerung, keine weiße Buchsymbolwolke, Familienkreise nicht mehr dominant. 4. Fokusraum prüfen: Struktur muss weiterhin vollständig importiert sein. 5. Kompass kurz öffnen: Pfeile müssen erhalten bleiben.


## ITMO v4.0.542 — Familienfarben, 16er-Palette, Pinch entfernt
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.542.md

# ITMO v4.0.542 — Familienfarben, 16er-Palette, Pinch entfernt Basis war v4.0.541. Die Screenshots zeigten: Promptimport funktioniert und die Struktur kommt an, aber große Promptmaps brauchen erkennbare Familienfarben und keine störende Pinch-Logik mehr. ## Änderungen Die globale Farbpalette wurde auf 16 klare, nach Regenbogenfolge sortierte Farben reduziert. Nach Farbe 16 beginnt die App wieder bei Farbe 1. Promptmaps bekommen beim Import automatisch Familienfarben. Der Startindex wird pro Promptimport neu bestimmt. Die Root erhält die Startfarbe, direkte Hauptachsen laufen durch die 16 Farben, und die jeweiligen Unterbäume behalten die Familienfarbe. Dadurch soll eine importierte Map nicht wieder als einfarbige Kreiswolke erscheinen. Der Prompt fordert keine `color`- oder `symbol`-Metadaten mehr an. ITMO übernimmt Familienfarben und Symbolruhe selbst. Erlaubt bleibt nur `plannedDirection`, falls es sachlich sinnvoll ist. Die Farbauswahl im Fokus-/Ankerpanel verwendet dieselbe 16er-Regenbogenpalette. Damit ist die manuelle Palette nicht mehr als lange unsortierte Farbkette sichtbar. Pinch wurde auf der mobilen Bühne hart deaktiviert. Mehrfingerberührungen werden ignoriert und verändern die Kameraskalierung nicht mehr. Web-Ctrl-Radzoom und normale Plus/Minus-Zoomtasten wurden für die Bühne ebenfalls entfernt; Pfeiltasten zum Verschieben bleiben. Die interne Skalierung bleibt nur als technische Ansicht für Bullauge/Kompass/zentrierte Ansichten erhalten. ## Nicht geändert Kompasslogik aus v4.0.535 bleibt erhalten. Familienkreis- und Bühnenlesbarkeitsbegrenzung aus v4.0.541 bleibt erhalten. Promptimport-Guardrails bleiben erhalten. Ton bleibt pausiert. VR bleibt geparkt und ist nicht sichtbar angebaut. ## Sinn der Zuschnürung Ton und VR sollen als spätere Parkmodule behandelt werden, nicht als halbfertige sichtbare Restbereiche. Die App soll zuerst als ruhige Kern-App fertig werden: Themen, Bühne, Fokusraum, Import, Export, Print, Foto/Instamodus. Spätere Erweiterungen können wieder sauber aus diesem Kern gebaut werden.


## ITMO v4.0.543 cleanup_navigation_stage_releasecandidate
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.543.md

# ITMO v4.0.543 cleanup_navigation_stage_releasecandidate Stand: Zuschnürung nach v4.0.542. Ziel war kein neues Feature, sondern UI-Beruhigung und ein releasefähiger Kern. ## Geändert - Promptimport-Button aus dem AI-Promptfenster entfernt. Der Promptworkflow ist jetzt: Thema, Tiefe, Übernehmen, Prompt kopieren. Import läuft wieder über den Import-/Datei-Einstieg. - Startseite: Dateiimport ist oben sichtbar und zusätzlich neben dem Suchfeld erreichbar. Der Plus-Button neben der Suche wurde entfernt. - Footer: Orbit-/Modusbutton entfernt. Footer hat nur noch Foto, Insta, Themen und Print. Buttonrahmen wurden entfernt, Icons wurden größer. - Vorlagen und Map-Zeilen öffnen direkt die Bühne. Kein zusätzliches Betreten über Statistikchips. - Startseitenliste: Statistikchips und größere Zwischenabstände entfernt. - Querformat-Bühne: Library/Footer werden im Querformat nicht mehr eingeblendet; StageSearch wird dort ebenfalls ausgeblendet. Querformat ist jetzt pure Bühne. - Bühnen-Suchfeld: Platzhalter heißt „Thematik suchen“. Kein automatisches Markieren des Thementitels beim Fokus. - Fokusraum: Map-Titelbearbeitung entfernt. Angezeigt wird der Urmuttertitel. Der Themenname soll vom Root/der Urmutter kommen. - StageHeader verwendet ebenfalls den Urmuttertitel, nicht einen nummerierten Importtitel. - Root-/Clusterwachstum im Einrollpfad neutralisiert: Polygone sollen nicht mehr durch alte Clusterlogik großgezogen werden. Gleichgroße Polygone bleiben Kernregel. - Prompt verfeinert: von wenigen starken Hauptachsen zu mehr Unterfamilien, weniger Ebene-2-Überfüllung, keine einseitigen Ketten, kein „Weitere Aspekte“-Sammelzug. - Import-Overflow-Gruppen heißen jetzt „Ergänzungen“ statt „Weitere Aspekte“. ## Nicht geändert - Prompt-Tiefenwahl 2–6 bleibt. - 16er-Familienfarben bleiben. - Pinch bleibt entfernt. - Ton und VR bleiben Parkmodule. ## Prüfen - Startseite: Datei oben, Datei neben Suche, kein Plus neben Suche, kein Promptimport-Button im Promptfenster. - Footer: kein Orbitbutton, keine Buttonrahmen, größere Icons. - Querformat: nur Bühne, keine Suche, kein Footer. - Neue Promptmap importieren: keine riesigen „Weitere Aspekte“-Polygone mehr; falls Overflow entsteht, heißt er „Ergänzungen“. - Fokusraum: Thementitel nicht editierbar, Titel kommt aus Urmutter.


## ITMO v4.0.544 – Start schwarz + Kreisgeometrie-Basis
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.544.md

# ITMO v4.0.544 – Start schwarz + Kreisgeometrie-Basis ## Status Arbeitsstand nach v4.0.543. Fokus: Startseite reduzieren, Import klar neben Suche, AI nur noch über Vorlage, Footer auf Start ausblenden, schwarze deckende Startfläche und erste harte Gleichgrößenregel für Polygone. ## Änderungen - Datei- und Prompt-Buttons oberhalb der Suche entfernt. - Import bleibt als Icon direkt neben „Thematik suchen“. - AI bleibt über die Vorlage erreichbar. - Startseite rendert keinen Footer mehr, solange das Startfenster offen ist. - Startseite/Promptfläche nutzt deckendes Schwarz statt durchscheinender Bühnenfläche. - Statistik-/Linkbereich auf der Startseite ausgeblendet. - Polygone werden geometrisch als Dekohüllen um denselben Grundkreis gebaut. Seitenzahl ändert Form, nicht Größe. - Kindfäden bekommen erste Familienfaktoren: 0 Kinder Faktor 1, 1 Kind 4/3, 2 Kinder 5/3, ab 3 Kinder Faktor 2. ## Nicht fertig - Vollständige Familienkreis-Abstandsregel ist vorbereitet, aber noch nicht als globale Platzierungskorrektur fertig. - Bullauge-Zentrums-Skalierung ist noch nicht final. - Intro, Logo/Icon und Vorlagenbilder fehlen weiterhin. ## Test Neue Promptmap importieren. Start prüfen: keine oberen Datei/Promptbuttons, Import neben Suche, kein Footer auf Start. Bühne prüfen: Polygone gleichmäßiger, keine großen Vieleckkörper durch Kindzahl.


## ITMO v4.0.545 – Bullauge / Familienkreis-Geometrie
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.545.md

# ITMO v4.0.545 – Bullauge / Familienkreis-Geometrie Ziel: Kreis zuerst, Polygon nur Dekohülle. Die Bühne soll Richtung, Faden und Familienkreis wieder aus einer einfachen, deterministischen Geometrie ableiten. ## Geändert - Alle Polygone bleiben als gleich große Dekohüllen um denselben Grundkreis angelegt. - Fadenfaktor ist jetzt eine feste Regel: - Kind ohne Kinder: Faktor 1 - Kind mit 1 Kind: Faktor 4/3 - Kind mit 2 Kindern: Faktor 5/3 - Kind mit 3 oder mehr Kindern: Faktor 2 - Familienkreis-Abstand zwischen Geschwisterfamilien nutzt eine billige Vektorregel: Wenn zwei Familienkreise kollidieren würden, wird das später platzierte Kind nur entlang seines vorhandenen Eltern-Kind-Vektors weitergeschoben. - Familienkreise werden aus Mutter-/Kinderankern gelesen, nicht als frei schwebende Hülle. - Root ohne Kinder bekommt ausnahmsweise einen kreisgroßen Familienkreis. - Bullauge skaliert nahe der Bildschirmmitte weich die sichtbare Form, Label-/Fadenanker und den Familienkreis gemeinsam. Außen bleibt Normalgröße. ## Nicht geändert - Startseiten-Aufräumung aus v4.0.544 bleibt. - Promptimport/Import bleiben unverändert. - Kompass-Vorlage bleibt fachlich unangetastet. - Ton und VR bleiben Parkmodule. ## Test - Neue Promptmap importieren, nicht alte Map bewerten. - Prüfen: gleich große Polygone, weniger schwebende Familienkreise, weniger Überschneidung, außen keine unnötig langen Fäden. - Langtipp-Zentrierung weiter prüfen: sie nimmt weiterhin den sichtbar bildschirmnächsten Knoten.


## Handoff v4.0.546
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.546.md

# Handoff v4.0.546 Schwerpunkt: Start weiter zuschnüren und Bühnenstörungen reduzieren. Geändert: - Vorlagenliste reduziert: Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. - Gefühle und Bedürfnisse bleiben ausdrücklich erhalten. - Start unten bekommt wieder Statistik/Links/Listelöschen, aber ruhiger und kompakter. - Geöffnete Systemvorlagen Kompass, Anatomie, Gefühle, Bedürfnisse werden nicht mehr als normale eigene Map-Zeilen in der Startliste angezeigt. - Bühnensymbole werden hart beruhigt: normale Template-/Import-Symbole erscheinen auf der Bühne nicht mehr als große weiße Icons. Kompass-dir-auto bleibt als bewusster Prüfmodus erlaubt. - Footericons bleiben ohne eigene Buttonhintergründe und sind größer. - Konzeptnotiz für Keyvisual/Intro ergänzt. Offen: - Copy-Icon für Systemvorlagen, damit eine editierbare eigene Kopie entsteht. - Vollständiger Rendering-Filter/Außenfäden. - Intro und App-Icon einbauen, sobald Bilder geliefert werden.


## ITMO v4.0.549 – Intro/Icon Release Shell
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.549.md

# ITMO v4.0.549 – Intro/Icon Release Shell Basis: v4.0.548_bullauge_edge_thread_release_prep. ## Änderung - Erststart-Intro als fünf skipbare Vollbildkarten eingebaut. - Intro ist bildunabhängig und nutzt vorhandene ITMO-Geometrie: Bullauge, Fäden, Kreise, dunkler deckender Hintergrund. - Skip/Start speichert `introSkippedV549` in den Release-Settings. - App-Icon, Adaptive Icon und Splash als einfache ITMO-Bullauge-Platzhalter erzeugt und in `app.json` verknüpft. - Version auf 4.0.549 gehoben. ## Bewusst noch nicht erledigt - Finale Intro-/Vorlagenbilder sind noch nicht integriert. Dafür warten wir auf Sebastians bessere Bildauswahl. - Inhaltsverbindungen auf Fäden sind noch nicht gebaut. - Finale Store-Texte, Impressum/Datenschutz-URLs und TestFlight-Preflight stehen noch aus. ## Status Dieser Stand ist ein Release-Shell-Schritt: nicht endgültiges Design, aber keine weiße TestFlight-App mehr und ein echter, skipbarer Einstieg.


## HANDOFF v4.0.649 — polygon point warp
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/HANDOFF_v4.0.649.md

# HANDOFF v4.0.649 — polygon point warp Ziel: Bullauge nicht mehr über Knotengröße, sondern über die Polygonhüllen sichtbar machen. Änderungen: - applyTakeOneBullaugeScreenWarp auf Polygonhüllen-Punktwarp umgestellt. - Jeder Polygonhüllenpunkt wird separat durch die Bildschirm-Linse gezogen. - Knoten/Kreise bleiben fast stabil: sizeScale stark reduziert. - Hüllenpunkt-Warp wird je nach Punktzahl gedämpft: 4+ stark, 3 mittel, 2 schwach. - parentAnchorOnSelf wird nach dem Warp auf die nächstgelegene Seite der verformten Hülle gesetzt. - familyScale bleibt leicht aktiv, aber nicht mehr dominant. Test: - Mittelpunkt auf Quadrat/Hexagon legen. - Hülle soll sichtbar ziehen/verformen, aber Seitenanzahl erhalten. - Fäden sollen näher an verformten Hüllenseiten sitzen. - Knoten dürfen nicht wieder stark ineinanderlaufen.


## Ziel: Promptgenerator für reine TXT-Import-Maps
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/MAP_PROMPT_GENERATOR_TARGET_v4.0.470.md

# Ziel: Promptgenerator für reine TXT-Import-Maps Systemfenster nach Tipp auf „Prompt generieren“. Eingaben: - Thema - Tiefe - Besonderheiten als Auswahl - Farbwünsche - Symbolwünsche an/aus - optionale Sonderwünsche, standardmäßig eingeklappt Ausgabe: - Ein kopierbarer Prompt, der eine reine TXT-Struktur erzeugt. - Diese TXT kann in eine zweite Importvariante eingefügt werden. - Ziel ist eine Map mit geplanten Wuchsvektoren, Strukturrollen, Farbhints und Symbolhints. Arbeitsregel: - Nicht stumpf befüllen. - Erst Strukturtyp bestimmen: Körperachse, Stern, Prozess, Stammbaum, Zeitachse, Cluster, Fachbaum. - Dann Root, Hauptachsen, Tiefe, Unterbaumgewichtung und Lesbarkeit planen. - Erst danach Inhalte ausgeben. Beispiel-Promptkern: Erzeuge eine ITMO-TXT-Map zum Thema: [THEMA]. Tiefe: [TIEFE]. Strukturtyp: [AUTO oder AUSWAHL]. Ordne die Map generisch als Baum mit sichtbarer Mittelphase: Familienverbände bleiben nahe am Zentrum, Randstrukturen wachsen kontrolliert nach außen. Nutze geplante Richtungen wie up, down, left, right, up-left, up-right, down-left, down-right. Schreibe pro Knoten Titel, kurzer Text, optionale Farbe, optionales Symbol und geplante Richtung. Keine Sonderregeln für einzelne Inhalte; die Struktur muss aus dem Inhalt logisch ableitbar sein.


## Promptimport Selbsttest
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/PROMPTIMPORT_SELFTEST_v4.0.537.txt

# Promptimport Selbsttest plannedDirection: right; color: #00e5b0; symbol: book Diese Datei ist eine minimale Importprobe für v4.0.537. ## Kind A plannedDirection: left; color: #00e5b0; symbol: book Kind A prüft eine direkte Unterstruktur. ### Enkel A1 plannedDirection: up-left; color: #00e5b0; symbol: book Enkel A1 prüft Tiefe 3. ## Kind B plannedDirection: right; color: #00e5b0; symbol: book Kind B prüft den zweiten Ast.


## ITMO v4.0.540 Promptimport-Testfälle
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/PROMPTIMPORT_TESTCASES_v4.0.540.txt

ITMO v4.0.540 Promptimport-Testfälle A. Leere Zwischenablage Erwartung: Antwort fehlt. B. Zwischenablage enthält noch den Prompt Text beginnt mit: Erzeuge eine reine ITMO-Kapitel-TXT zum Thema Erwartung: Noch der Prompt. C. Gültige Kapitelantwort Text beginnt mit: # Rheuma Erwartung: Mapimport mit Promptimport-Quelle. D. Breite Struktur Root mit mehr als 16 direkten ##-Kindern. Erwartung: Import gruppiert überzählige direkte Kinder in Weitere Aspekte, ohne Text zu löschen. E. Dateiimport TXT-Datei mit # Root / ## Kind / ### Enkel. Erwartung: Dateiimport bleibt getrennt vom Promptimport und funktioniert weiterhin.


## ITMO v4.0.484 TestFlight-Hilfe
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TESTFLIGHT_HILFE_v4.0.484.md

# ITMO v4.0.484 TestFlight-Hilfe Stand: 18.06.2026 Diese ZIP baut keine TestFlight-Version automatisch in ChatGPT, weil dafür dein Apple-Developer-Zugang, EAS-Login und App-Store-Connect-Zugriff lokal nötig sind. Die ZIP ist aber so vorbereitet, dass du den TestFlight-Weg direkt im Projektordner starten kannst. ## 0. Wichtig Nicht nur einzelne Dateien kopieren, sondern die ZIP vollständig in einen sauberen Projektordner entpacken. Wenn du über einen alten Ordner kopierst, bleiben alte node_modules und Metro-Caches erhalten. Dann können Phantomfehler entstehen. ## 1. Einmal sauber installieren Im Projektordner ausführen: ```powershell npm install ``` Danach prüfen: ```powershell npx expo-doctor ``` Falls expo-doctor meckert, erst die Meldung beheben. ## 2. Expo/EAS anmelden ```powershell npx eas login npx eas whoami ``` Wenn `eas` lokal nicht gefunden wird: ```powershell npm install -g eas-cli ``` ## 3. iOS-Build für TestFlight erzeugen ```powershell $env:EAS_NO_VCS="1"; npx eas build --platform ios --profile production ``` Wenn nach Apple-Zugangsdaten gefragt wird, anmelden. Wenn Zertifikate/Profile fehlen, EAS verwalten lassen. ## 4. Nach erfolgreichem Build an TestFlight senden ```powershell $env:EAS_NO_VCS="1"; npx eas submit --platform ios --latest ``` Wenn App Store Connect die App noch nicht kennt, musst du dort zuerst die App mit Bundle-ID `de.fxchs.itmo` anlegen oder EAS durch die Prompts führen lassen. ## 5. Interne Tester einladen In App Store Connect: Apps öffnen. ITMO öffnen. TestFlight öffnen. Internal Testing öffnen. Build hinzufügen. Tester einladen. Interne Tester sind für den ersten schnellen Test besser als externe Tester. ## 6. Externe Tester später Für externe Tester Gruppe erstellen, Build hinzufügen und Einladung per E-Mail oder öffentlichem Link teilen. Beim ersten externen Build kann Apple eine Beta-App-Review verlangen. ## 7. Schnellweg, falls du es probieren willst Expo bietet inzwischen auch: ```powershell npx testflight ``` Das startet Build und Submit als geführten Ablauf. Wenn der Befehl scheitert, nimm den getrennten Weg aus Schritt 3 und 4. ## 8. Wenn Fehler kommen Häufige Fehler: `Unable to resolve module`: ZIP nicht sauber entpackt oder npm install fehlt. `bundleIdentifier already exists`: App existiert schon in einem anderen Apple-Team oder Bundle-ID passt nicht zum Team. `Authentication failed`: Apple-Login, 2FA oder App-Store-Connect-Rechte prüfen. `No such app`: App in App Store Connect fehlt oder Bundle-ID stimmt nicht. `EAS_NO_VCS`: Bei deinem Arbeitsordner ohne Git ist diese Variable korrekt. ## 9. Zustand dieser ZIP App-Code: v4.0.483 stabil übernommen. Versionsmetadaten: auf v4.0.484 aktualisiert. SDK: Expo SDK 54 bleibt. Neue native Abhängigkeiten: keine. TestFlight-Hilfe: ergänzt.


## Testcheckliste v4.0.462
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.462.md

# Testcheckliste v4.0.462 ## Pflichttest Kind-Erzeugung 1. Neues Thema öffnen. 2. Urpolygon doppeltippen. 3. Erste Richtung wählen. 4. Erstes Kind doppeltippen. 5. Enkel doppeltippen. 6. Urenkel doppeltippen. 7. Mindestens 8 Generationen als einfache Kette erzeugen. 8. Danach Fokusraum öffnen und mit Kind-Button ebenfalls 3 weitere Kinder erzeugen. Erfolg: Jedes sichtbare Polygon kann per Doppeltipp und Fokusraum-Button Kinder erzeugen. ## Root-Richtungsslots 1. Neues Thema. 2. Urpolygon doppeltippen. 3. Slot unten wählen. 4. Weitere Root-Kinder erzeugen. Erfolg: zweites Kind gegenüber, weitere Kinder sinnvoll auf Querachsen. ## Richtungssymbole 1. Mehrere Generationen erzeugen. 2. Bühnenposition prüfen. Erfolg: Pfeile bleiben groß, sichtbar und passen zur tatsächlichen Eltern-Kind-Richtung. ## Bühne/Fokusfeld 1. Große Vorlage öffnen. 2. Bühne verschieben. Erfolg: Zentrum rollt aus, Rand rollt ein, keine zusätzliche harte Zoomgrößenphase. ## Suche 1. Suchfeld nutzen. 2. Chip antippen. Erfolg: Chip setzt aktiven Treffer und Suchfaden, ohne zwangsweise zu zentrieren. ## Fokusraum 1. Text bearbeiten. 2. Farb-/Symbolpanel öffnen. 3. Scrollen. Erfolg: kein unnötiger Hochscroll beim Panel, Text bleibt eng gesetzt.


## Testcheckliste v4.0.463
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.463.md

# Testcheckliste v4.0.463 ## Pflicht - [ ] Neues leeres Thema: Kind-Kette per Doppeltipp über mehrere Ebenen möglich. - [ ] Fokusraum-Kindbutton erzeugt Kinder in tieferen Ebenen. - [ ] Anatomie-Vorlage neu öffnen. - [ ] Anatomie zeigt Kopf oben. - [ ] HWS, Thorax, Becken laufen nach unten. - [ ] Arme liegen links/rechts symmetrisch. - [ ] Beine/Füße liegen unten links/rechts. - [ ] Symbole sind groß im Polygon und besser zentriert. - [ ] Importdatei `Anatomie-Knochenmap-v4.0.463.txt` wird angenommen. ## Nicht anfassen ohne ausdrückliche Freigabe - Ton/Sound. - SDK 55. - Kindtitel-Logik v4.0.461.


## Test v4.0.465
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.465.md

# Test v4.0.465 - [ ] Anatomie neu aus Vorlage öffnen, nicht alte Map testen. - [ ] Kopf / Schädel steht oben. - [ ] Hals / HWS ist erstes Kind und läuft nach unten. - [ ] Thorax / Schulterhöhe folgt unter Hals/HWS. - [ ] Schultergürtel links/rechts zweigt seitlich ab. - [ ] Becken / LWS liegt unter Thorax. - [ ] Untere Extremitäten laufen nach unten links/rechts. - [ ] Symbole sind weiß und im Stil der Symbolauswahl. - [ ] Keine großen Emoji-Sticker. - [ ] Doppeltipp/Kind-Erzeugung weiter testen.


## ITMO v4.0.467 Testcheckliste
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.467.md

# ITMO v4.0.467 Testcheckliste 1. Anatomie-Vorlage neu öffnen, nicht alte Anatomie-Map. 2. Prüfen: Kopf / Schädel oben. 3. Prüfen: Hals / HWS unter Kopf. 4. Prüfen: Thorax / Schulterhöhe unter Hals / HWS. 5. Prüfen: Schultergürtel links/rechts seitlich am Thorax. 6. Prüfen: Becken / LWS unter Thorax, nicht links/oben. 7. Prüfen: Beine/Füße unter Becken links/rechts. 8. Prüfen: Kind-Erzeugung per Doppeltipp bleibt stabil.


## Testcheckliste v4.0.476
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.476.md

# Testcheckliste v4.0.476 ## Muss sofort geprüft werden 1. App startet ohne Render Error. 2. Anatomie Knochen öffnen. - Erwartung: bestätigtes perfektes Bullauge/Anatomie-Bild bleibt erhalten. 3. Kompass öffnen. - Erwartung: kein Fehler. - Zentrum „Kompass“. - Acht direkte Kinder: Oben, Rechts oben, Rechts, Rechts unten, Unten, Links unten, Links, Links oben. - Keine doppelten Nah/Fern-Knoten. 4. Bühne verschieben. - Familie in Bildschirmmitte öffnet. - Außenliegende Familien klappen zu. - Urzentrum klappt ebenfalls zu, wenn es aus der Mitte herauswandert. 5. Themen/Fokusraum öffnen. - Keine doppelten Titelblöcke durch alte Vorlagenreste. ## Regressionen, auf die achten - LWS darf nicht wieder als seitliches Beckenkind erscheinen. - Anatomie darf keine zufällige freie-Slot-Verteilung zeigen. - Kompass darf keine umbenannten Richtungen wie doppelt „Oben“ anzeigen. - Doppeltitel in Listen/Fokusraum weiter beobachten. - Renderfehler `createEmptyMap is not a function` darf nicht zurückkehren. - Renderfehler `repairParentChildCyclesInPlaceV429 does not exist` darf nicht zurückkehren.


## Testcheckliste v4.0.477
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.477.md

# Testcheckliste v4.0.477 ## Muss sofort geprüft werden 1. App startet ohne Render Error. 2. Kompass öffnen. - Erwartung: Zentrum „Kompass“, acht direkte Richtungskinder, keine Nah/Fern-Dopplung, kein Fallback-Fehler. 3. Anatomie Knochen öffnen. - Erwartung: bestätigtes Bullauge/Anatomie-Bild bleibt unverändert. 4. Startseite öffnen und Suchleiste prüfen. - Neuer Sparkles-Button neben Import öffnet den Promptgenerator. 5. Promptgenerator prüfen. - Thema, Tiefe, Strukturtyp und Besonderheiten ändern den Prompt live. - Promptfeld ist markierbar/kopierbar. 6. Paste-Import prüfen. - Beispiel einfügen: # Testmap plannedDirection: left; color: #00e5b0; symbol: book kurzer Roottext ## Kind A Text A ## Kind B Text B - „TXT importieren“ legt eine neue Map an und öffnet sie auf der Bühne. 7. Labels prüfen. - Polygontitel sind weiß, ohne Rahmen und ohne zusätzliche Labelbox. 8. WM 2026 öffnen. - Erwartung: Weltmeister bleibt Ziel-/Urkern rechts gedacht, Äste wachsen nach links heraus. ## Regressionen - Bullauge-Formel nicht neu kalibrieren. - Keine Geburts-, Anatomie-, LWS- oder Kompass-Sonderregel einführen. - Ton/Sound bleibt pausiert. - Dateiimport per Dokumentpicker muss weiterhin funktionieren. - Paste-Import darf bestehende Maps nicht überschreiben, sondern eine nummerierte Kopie anlegen.


## Testcheckliste v4.0.478
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.478.md

# Testcheckliste v4.0.478 1. Neues Thema öffnen. 2. Urmutter per Doppeltipp 1 bis 6 Kinder gebären lassen. Erwartung: keine Stapelung von Kind 3/4/5 auf derselben rechten Bahn. 3. Prüfen, ob jedes direkte Kind an einer Seitenmitte hängt und der Faden von Seite zu Kindseite läuft. 4. Bei 3 Kindern prüfen: Urmutter darf Dreieck sein, Kinder müssen dennoch verteilt bleiben. 5. Bei 5 bis 6 Kindern prüfen: Kinder verteilen sich um die Urmutter, keine rechte Mehrfachkante. 6. Auf ein Kind doppeltippen und Enkel erzeugen. Erwartung: Enkelregel bleibt lokal, keine Änderung der Root-Regel. 7. Paste-Import aus v4.0.477 erneut testen. Erwartung: Metadaten werden weiterhin übernommen. Status: syntaktisch geprüft für model.js und geometry.js; Expo-Go-Gerätetest offen.


## TEST_CHECKLIST v4.0.479
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.479.md

# TEST_CHECKLIST v4.0.479 ## 1. Bühne - Neues Thema anlegen. - Prüfen: Urmutter zeigt `*`. - Sechs Kinder per Doppeltipp erzeugen. - Prüfen: Kinder entstehen weiter gleichmäßig an Polygonseiten. ## 2. Labels - Prüfen: Bühnenlabels sind schwarz. - Prüfen: Labeltext sitzt minimal höher im Polygon. - Prüfen: keine Rahmen/Glow-Reste um Labels. ## 3. Symbole - Prüfen: Richtungspfeile und Stern sind kleiner als in v4.0.478. - Prüfen: Symbole sitzen mittiger und nicht mehr zu hoch. - Prüfen: Symbole verdecken den Labeltext weniger stark. ## 4. Promptgenerator - Themen-Panel öffnen und Promptgenerator antippen. - Prüfen: kein Besonderheiten-Feld. - Prüfen: Prompt- und TXT-Feld zeigen nur etwa drei Zeilen. - Prompt kopieren, Antwort erzeugen lassen, Ergebnis direkt in TXT-Antwort einfügen und importieren. - Prüfen: Import funktioniert ohne Nachbearbeitung, wenn die Antwort das vorgegebene Überschriftenformat einhält.


## TEST_CHECKLIST v4.0.480
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.480.md

# TEST_CHECKLIST v4.0.480 ## Ziel Prompt-/Importfenster ruhiger und praktischer machen, ohne die stabile Urmuttergeburt aus v4.0.478/v4.0.479 zu beschädigen. ## Prüfen 1. Promptgenerator öffnen. - Prompt-Vorschau ist nur lesbar. - Feldhöhe bleibt kompakt bei drei sichtbaren Zeilen. - Kopierbutton liegt direkt darunter. 2. Antwortbereich prüfen. - Antwortfeld ist nur lesbar. - Paste-Button übernimmt den Inhalt aus der Zwischenablage. - Importieren nutzt exakt diesen eingefügten Text. 3. Ebenenzahl prüfen. - Es gibt nur Thema und Tiefe. - Das alte Strukturfeld mit Auto ist weg. - Hilfetext zur Ebenenzahl ist sichtbar und kurz. 4. Bühne mit offenem Fenster stehen lassen. - Ruheanimation startet nicht, solange Fenster offen sind. 5. Symbole prüfen. - Urmutterstern bleibt sichtbar. - Pfeile/Symbole sind kleiner als in v4.0.479. - Zentrierung bleibt sauber. ## Bekannte Grenze Clipboard braucht `expo-clipboard`. Nach dem ZIP-Wechsel einmal `npm install` ausführen, falls das Paket lokal noch nicht vorhanden ist.


## ITMO v4.0.481 Testcheckliste
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.481.md

# ITMO v4.0.481 Testcheckliste ## Promptstrecke - Promptgenerator öffnen. - Thema und Ebenenzahl setzen. - Prompt kopieren und in ChatGPT senden. - Nur die Antwort kopieren. - Antwort einfügen und importieren. - Erwartung: Antwort mit `#` wird importiert; Prompttext selbst wird mit klarer Meldung abgewiesen. ## Bühne - Neue Map und Vorlagenmap öffnen. - Symbole im Polygon prüfen. - Erwartung: Symbole kleiner, mittig, nicht zu hoch. ## Ruheanimation - Fenster/Promptgenerator offen lassen. - Erwartung: Ruheanimation startet nicht, solange Fenster offen sind.


## TEST_CHECKLIST v4.0.482
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.482.md

# TEST_CHECKLIST v4.0.482 1. Projekt ohne expo-clipboard starten. 2. Library/Promptgenerator öffnen. 3. Promptvorschau markieren/kopieren oder Web-Copy testen. 4. Antwortfeld per Paste-Feld fokussieren und Antwort einfügen. 5. TXT importieren. 6. Prüfen: keine Fehlermeldung Unable to resolve module expo-clipboard.


## TEST_CHECKLIST v4.0.483
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.483.md

# TEST_CHECKLIST v4.0.483 Ziel: Promptcopy-Rückmeldung und kleinere Bühnensymbole prüfen. 1. App starten. Kein `expo-clipboard`-Fehler darf erscheinen. 2. Themen öffnen und Promptgenerator starten. 3. Prompt kopieren drücken. 4. Web: Meldung `Prompt kopiert!` muss erscheinen und der Prompt muss in der Zwischenablage liegen. 5. Expo Go nativ ohne Zusatzmodul: Der Prompt bleibt markierbar; es erscheint eine klare Kopierhilfe statt Absturz. 6. Vorlagenmap öffnen. Symbole auf der Bühne müssen deutlich kleiner sein als in v4.0.482. 7. Neue Map mit Urmutter und Kindern testen. Urmuttergeburt bleibt gleichmäßig an Seiten.


## TEST_CHECKLIST v4.0.520
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.520.md

# TEST_CHECKLIST v4.0.520 1. Neues Thema: bis 16 Kinder erzeugen. 17. Kind darf nicht entstehen. 2. Prüfen: Kinder nutzen reale Elternseiten, nicht starre Weltreihenfolge. 3. Root-Dreieck: Kindseiten liegen oben, unten-rechts, unten-links. 4. Kompass: 16 direkte Kinder, gleichmäßig, kein Stapel, keine Kette.


## Test v4.0.521
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.521.md

# Test v4.0.521 1. Neues Thema, erstes Kind oben setzen: zweites Kind gegenüber, weitere Kinder reihum auf Elternseiten. 2. Mehr als 16 Kinder erzeugen: es bleibt bei 16. 3. Kompass öffnen: 16 Richtungen sichtbar, keine Kette, keine 30-Kind-Altlast. 4. Fokusraum prüfen: nicht mehr Kind 30 bei neuer Map.


## Test v4.0.522
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.522.md

# Test v4.0.522 1. Kompass öffnen: 16 direkte Richtungen müssen auf der Bühne sichtbar sein, nicht nur im Fokusraum. 2. Kompass pinch/pan testen: Bullauge/Fokuswirkung soll sichtbar greifen, ohne einzelne Äste zu verlieren. 3. Fokusraum > Palette: Kompassfarben müssen als normale Farbswatches verfügbar sein. 4. Fokusraum > Symbolpanel: `*`, adaptiver Pfeil und die vier harten Pfeile prüfen. 5. Neues Thema: 16-Kinder-Maximum bleibt aktiv.


## TEST_CHECKLIST v4.0.523
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.523.md

# TEST_CHECKLIST v4.0.523 1. Kompass öffnen: 16 Kinder sichtbar, nicht 8. 2. Langtipp auf Kompass-Bühne: Kompass wird zentriert. 3. Fokusraum Kompass: weiterhin 16 Kinder. 4. Neues Thema: 17. Kind wird nicht angelegt.


## TEST_CHECKLIST v4.0.524
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.524.md

# TEST_CHECKLIST v4.0.524 1. Kompass öffnen: Bühne muss 16 direkte Kinder um die Mutter zeigen. 2. Fokusraum Kompass: 16 Einträge müssen weiterhin vorhanden sein. 3. Langtipp auf Bühne: Kompass/Urmutter wird zentriert. 4. Prompt kopieren: Alert „Prompt kopiert!“ und Clipboard-Funktion. 5. Prompt-Antwort einfügen: Paste-Feld zieht Text aus der Zwischenablage. Nicht geprüft in dieser Etappe: Anatomie-Feinlayout, Kreis-/Polygon-Morph, Labelkollisionen.


## TEST_CHECKLIST v4.0.525
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.525.md

# TEST_CHECKLIST v4.0.525 Ziel: AI-Vorlage ersetzt das alte Importfenster. 1. Start öffnen: Es gibt eine Vorlage „AI“. 2. AI öffnen: Nur Thema-Eingabe, Bestätigen, Chips und Prompt-Vorschau. 3. Thema eingeben und bestätigen: Chip „Prompt für … kopieren“ erscheint. 4. Prompt kopieren, App verlassen, zurückkommen: Fenster und Chips bleiben stehen. 5. Nach ChatGPT-Antwort: Chip/Knopf „Thema … generieren“ importiert aus der Zwischenablage. 6. Nach erfolgreichem Import: direkte Bühne des neuen Themas. 7. AI erneut öffnen: gespeicherte Chips sind noch vorhanden.


## TEST_CHECKLIST v4.0.526-family-circles-ai-center
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.526.md

# TEST_CHECKLIST v4.0.526-family-circles-ai-center 1. Neues Thema mit 1–6 Kindern öffnen: hinter Mutter/Kinder-Familie muss ein weißer Familienkreis sichtbar sein. 2. Ein Kind mit eigenen Kindern anlegen: dieses Kind soll einen eigenen Familienkreis bekommen. 3. Langtipp auf Bühne: sichtnächster Kreis/Shape zur Bildschirmmitte wird zentriert; wenn alles weggeschoben wurde, Urmutter. 4. AI-Vorlage öffnen: Themenchips und Prompt/Paste-Flow aus v4.0.525 müssen erhalten bleiben. 5. Kompass kurz gegenprüfen: 16er-Struktur darf nicht schlechter werden.


## TEST v4.0.527 – lokale Seitenauffächerung
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.527.md

# TEST v4.0.527 – lokale Seitenauffächerung 1. Neues Thema öffnen. 2. Ein Kind erzeugen. 3. Dieses Kind auswählen und ihm zwei Kinder geben. 4. Erwartung bei waagerechter Struktur: die beiden Enkel liegen symmetrisch rechts-oben und rechts-unten, nicht rechts und oben. 5. Familienkreise bleiben sichtbar. 6. AI-Fenster/Chips aus 4.0.526 bleiben erhalten.


## TEST_CHECKLIST v4.0.528 – ai-import-bare-chapter-symbol-rotation
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.528.md

# TEST_CHECKLIST v4.0.528 – ai-import-bare-chapter-symbol-rotation 1. AI-Vorlage öffnen, Thema bestätigen, Prompt kopieren. 2. Aus ChatGPT eine Antwort kopieren, die versehentlich ohne # startet. Erwartung: Import versucht Reparatur statt generischem Fehler. 3. Kompass-Bühne prüfen: 16 Kinder sichtbar, Pfeile folgen der Richtung. 4. Neues Thema mit Kindern prüfen: Richtungspfeile bleiben rotiert. 5. Familienkreise prüfen: sichtbar hinter Struktur, keine Abstürze.


## TEST v4.0.529
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.529.md

# TEST v4.0.529 1. Fokusraum: Wiki bei „Sonne“ testen. Erwartung: kein fetchWikipediaArticle-Fehler. 2. Neues Thema mit Kind: Familienkreis Kind/Mutter prüfen. Kreisränder sollen an der Verbindung sinnvoller tangieren. 3. AI-Fenster öffnen: nur Eingabe, Bestätigen, Chips, Kopier-/Import-Icon. Keine Prompt-Vorschau. 4. AI-Prompt erzeugen und Antwort importieren: Struktur soll stärker verästeln.


## TEST_CHECKLIST v4.0.530
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.530.md

# TEST_CHECKLIST v4.0.530 Ziel: AI-Fenster bleibt beim Wechsel zu ChatGPT stabil offen. 1. AI-Vorlage öffnen. 2. Thema eingeben und Prompt kopieren. 3. App verlassen, ChatGPT öffnen, ohne Import zurück zur App. 4. Erwartung: AI-Fenster ist noch offen, Thema/Chip/Zustand bleiben erhalten. 5. Antwort importieren. Erwartung: neue Bühne öffnet direkt. 6. Danach Themenliste/AI erneut öffnen: Chips sind noch gespeichert, aber das AI-Fenster drängt sich nicht automatisch nach erfolgreichem Import vor. Nicht verändert: Kompass, Familienkreise, Wiki.


## TEST_CHECKLIST v4.0.531
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.531.md

# TEST_CHECKLIST v4.0.531 Ziel: TestFlight-Kandidat ohne offensichtliche lokale Preflight- und Fokusraum-ReferenceError-Risiken. 1. Im Projektordner ausführen: `npm install`. 2. Danach ausführen: `npm run preflight`. Erwartung: `PREFLIGHT OK`. 3. Danach ausführen: `npx expo-doctor`. Erwartung: keine blockierenden Fehler. 4. App lokal starten: `npm run go`. Erwartung: Start ohne rotes Fehlerfenster. 5. Fokusraum öffnen und Textblock bearbeiten. Erwartung: einzeiliges Titel-/mehrzeiliges Textfeld funktionieren, X löscht nur Feldinhalt. 6. Wort im Text antippen. Erwartung: Wortmarkierung toggelt sichtbar; `als Polygone` funktioniert für neue Wörter. 7. Wiki-Wortfeld im Textblock öffnen. Erwartung: kein ReferenceError, Linkziel-Suche bleibt bedienbar. 8. AI-Vorlage prüfen wie in v4.0.530: Appwechsel zu ChatGPT, Rückkehr, Panel bleibt offen bis Import. 9. Kompass öffnen. Erwartung: acht Richtungen, keine Sonderregelverschiebung, keine Error-Meldung. 10. Anatomie und Bullauge öffnen. Erwartung: Familienkreise/Fäden/Labels unverändert gegenüber v4.0.530. 11. TestFlight-Build starten: `npm run build:ios:testflight`. 12. Nach erfolgreichem Build senden: `npm run submit:ios:testflight`. Nicht verändert: Geometrie, Kompass, Familienkreise, Bühne, Ton.


## TEST_CHECKLIST_v4.0.532
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.532.md

# TEST_CHECKLIST_v4.0.532 Ziel: TestFlight-Build nicht mehr vor dem Cloud-Build durch fehlende lokale Expo-Dependencies blockieren. Prüfung lokal: 1. ZIP entpacken. 2. PowerShell im Projektordner öffnen. 3. `npm install` ausführen. 4. `npm run preflight` ausführen. 5. `npx expo-doctor` ausführen. 6. `npm run build:ios:testflight` ausführen. Erwartung: - `preflight` meldet `expo` und `expo-modules-autolinking` als lokal gefunden. - EAS fragt nicht erneut nach `appVersionSource`, weil `remote` in `eas.json` gesetzt ist. - Der Fehler `Cannot find 'expo-modules-autolinking' package` tritt nach erfolgreichem `npm install` nicht mehr auf. Einordnung: - Git-Warnung bei `EAS_NO_VCS=1` ist nicht blockierend. - Expo-Go-Warnung ist für den Build nicht blockierend und wird im Windows-Skript unterdrückt. - Blockierend bleibt nur ein fehlgeschlagenes `npm install`, ein echter `expo-doctor`-Fehler oder ein EAS/Apple-Credentials-Fehler.


## TEST_CHECKLIST_v4.0.533
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.533.md

# TEST_CHECKLIST_v4.0.533 Ziel: Importbutton und Promptimport sichtbar und nutzbar prüfen. ## Bibliothek - Themen/Bibliothek öffnen. - Im Such-/Aktionsbereich müssen zwei Buttons sichtbar sein: `Import` und `Promptimport`. - `Import` öffnet den Dokumentpicker. - Eine gültige ITMO-Kapitel-TXT wird importiert und als neue Map oben in der Bibliothek abgelegt. - Nach Import öffnet die Bühne ohne App-Neustart. ## AI-Promptgenerator - `Promptimport` öffnet das AI-Fenster. - Thema eingeben und bestätigen. - Prompt-Chip erscheint. - Chip zeigt lesbar `Promptimport`, nicht nur ein Icon. - Nach dem Kopieren eines Prompts erscheint unten zusätzlich `Prompt kopieren` und `Promptimport`. - Wenn noch der Prompt statt der ChatGPT-Antwort in der Zwischenablage liegt, erscheint die Warnung, dass erst die Antwort kopiert werden muss. - Wenn die ChatGPT-Antwort in der Zwischenablage liegt, importiert `Promptimport` die Kapitelstruktur als neue Map. ## Nicht regressiv prüfen - Kompass öffnet. - Anatomie öffnet. - Bühne bleibt hell wie Vollbild. - Familienkreise bleiben sichtbar hinter der Struktur. - Ton bleibt aus und wird nicht reaktiviert.


## TEST_CHECKLIST_v4.0.534
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.534.md

# TEST_CHECKLIST_v4.0.534 Ziel: Familienkreise und Fädenabstände prüfen. ## Familienkreis - Ein Thema mit einer Mutter und mehreren direkten Kindern öffnen. - Erwartung: ein weißer Kreis liegt hinter Mutter und direkten Kindern. - Erwartung: einzelne kinderlose Blattknoten haben keinen eigenen zusätzlichen Familienkreis. - Erwartung: Kreisdeckkraft wirkt etwa halbtransparent und nicht als gefüllte Fläche. - Erwartung: der Kreis liegt hinter Fäden und Polygonen. ## Herauswachsende Kinder - Einem direkten Kind eigene Kinder geben. - Erwartung: dieses Kind bekommt sichtbar mehr Außenraum beziehungsweise einen längeren Faden. - Erwartung: die ursprüngliche Mutter-Kinder-Familie bleibt als Grundkreis lesbar. - Erwartung: keine fremden Familienkreise liegen störend im Innenraum eines anderen Familienkreises. ## Fäden - Sehr kurze Kontaktfäden beim Einrollen prüfen. - Erwartung: innenliegende oder fast kontaktierende Fäden verschwinden, statt als kurze Stummel aufzublitzen. - Erwartung: normale sichtbare Eltern-Kind-Fäden bleiben erhalten. ## Nicht regressiv prüfen - Bibliothek zeigt `Import` und `Promptimport`. - AI-Fenster zeigt pro Prompt-Chip `Promptimport`. - Kompass öffnet mit 16 Richtungen. - Anatomie öffnet. - Ton bleibt aus.


## TEST_CHECKLIST_v4.0.535
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.535.md

# TEST_CHECKLIST_v4.0.535 Ziel: Kompasskarte und Pfeilausrichtung prüfen. ## Kompass - Kompass-Vorlage öffnen. - Erwartung: genau eine Mitte `Kompass` und 16 direkte Richtungskinder. - Erwartung: keine Richtung liegt als Enkel oder Kette unter einer anderen Richtung. - Erwartung: alle Richtungskinder bilden einen ruhigen Ring. - Erwartung: Zentrum und Richtungskinder wirken gleich groß genug als Dekoration. ## Richtungen - N muss oben liegen. - O muss rechts liegen. - S muss unten liegen. - W muss links liegen. - NNO, ONO, OSO, SSO, SSW, WSW, WNW, NNW müssen zwischen den Haupt- und Diagonalrichtungen liegen. ## Pfeile - Pfeile müssen aus der Mitte nach außen zeigen. - Diagonalpfeile müssen schräg ausgerichtet sein, nicht nur als Hochpfeil erscheinen. - Beim Zentrieren oder leichten Bewegen der Bühne dürfen Pfeile nicht ihre Richtung verlieren. ## Regression - Familienkreis aus v4.0.534 prüfen: Mutter plus direkte Kinder, keine Blattknoten-Kreise. - Import und Promptimport sichtbar prüfen. - AI-Promptchip zeigt weiterhin `Promptimport`. - Anatomie öffnet. - Ton bleibt aus.


## TEST_CHECKLIST v4.0.536
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.536.md

# TEST_CHECKLIST v4.0.536 ## Pflichttest Import Bibliothek öffnen. Oben müssen drei Aktionen sichtbar sein: Datei, Prompt, Promptimport. Datei antippen. Eine ITMO-TXT-Datei auswählen. Erwartung: neue Map wird vorn in der Bibliothek angelegt, Bühne öffnet, Struktur ist sichtbar. ## Pflichttest Promptgenerator Prompt antippen. Thema eingeben. Bestätigen. Prompt kopieren antippen. Erwartung: Rückmeldung nennt das Thema und weist darauf hin, dass danach die ChatGPT-Antwort kopiert und Promptimport getippt wird. ChatGPT-Antwort kopieren. Promptimport im Promptfenster antippen. Erwartung: neue Map wird angelegt und geöffnet. ## Pflichttest direkter Promptimport Eine gültige Kapitel-TXT-Antwort mit `# Titel` in die Zwischenablage kopieren. Bibliothek öffnen. Promptimport antippen. Erwartung: Import ohne Dateiauswahl. ## Fehlertest Prompt selbst statt Antwort kopieren. Promptimport antippen. Erwartung: klare Meldung, dass die Antwort fehlt beziehungsweise noch der Prompt kopiert wurde. ## Regression Kompass Kompass öffnen. Erwartung: 16 direkte Richtungskinder, gleich große Dekorationspolygone, Pfeile nach außen. ## Regression Familienkreis Eine Mutter mit mehreren Kindern und Enkeln öffnen. Erwartung: Familienkreis nur um Mutter plus direkte Kinder; längere Fäden bei Kindern mit eigenen Kindern bleiben sichtbar als Herauswachsen. ## TestFlight-Vorbereitung Nach Gerätetest lokal ausführen: npm install npm run preflight npx expo-doctor npm run build:ios:testflight npm run submit:ios:testflight


## TEST_CHECKLIST v4.0.537
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.537.md

# TEST_CHECKLIST v4.0.537 ## Promptimport Fehlertest Promptgenerator öffnen. Thema eingeben. Prompt kopieren. Danach ohne ChatGPT-Antwort direkt `Promptimport` antippen. Erwartung: Meldung `Noch der Prompt`. Es darf keine neue Map angelegt werden. ## Promptimport Erfolgstest Eine echte Kapitel-TXT-Antwort kopieren, die mit `# Titel` beginnt. In der Bibliothek `Promptimport` antippen. Erwartung: neue Map wird angelegt, vorn in der Bibliothek einsortiert und direkt geöffnet. Die Map gilt intern als Prompt-/AI-Import. ## Bare-Antwort Reparaturtest Eine Antwort ohne `#`, aber mit klaren Titelzeilen und `plannedDirection:` kopieren. `Promptimport` antippen. Erwartung: Import versucht Reparatur. Wenn die Struktur genug Hinweise enthält, entsteht eine Map. Wenn nicht, erscheint eine klare Parsermeldung. ## Dateiimport Regression `Datei` antippen und eine ITMO-TXT-Datei importieren. Erwartung: Dateiimport bleibt neutraler Import und wird nicht als AI-Import markiert. ## Kompass Regression Kompass öffnen. Erwartung: 16 direkte Richtungskinder, gleich große Dekorationspolygone, Pfeile nach außen. ## Familienkreis Regression Eine Mutter mit sechs Kindern und Kindeskindern öffnen. Erwartung: Familienkreis um Mutter plus direkte Kinder, nicht um einzelne Blattknoten. Längere Fäden zeigen herauswachsende Kinderfamilien. ## TestFlight Vorbereitung Nach Gerätetest lokal ausführen: npm install npm run preflight npx expo-doctor npm run build:ios:testflight npm run submit:ios:testflight


## Testcheckliste v4.0.538
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.538.md

# Testcheckliste v4.0.538 ## 1. Rheuma / importierte Kapitelmap - Promptimport mit Rheuma oder bestehende Rheuma-Map öffnen. - Erwartung: keine großen weißen Buchumrisse mehr auf der Bühne. - Erwartung: Titel/Fäden/Familienstruktur bleiben sichtbar. ## 2. AI-Fenster - AI öffnen, Thema eingeben, Promptchip anzeigen. - Erwartung: Panel ist blickdicht genug; Map liegt nicht mehr störend hinter Text und Buttons. - Erwartung: Promptimport-Buttons bleiben bedienbar. ## 3. Kompass - Kompasskarte öffnen. - Erwartung: Richtungspfeile bleiben sichtbar und nach außen ausgerichtet. - Erwartung: Die neue Buchsymbol-Unterdrückung greift nicht auf Richtungssymbole. ## 4. Regression - Dateiimport antippen. - Promptimport mit falschem Clipboard testen: Prompt selbst soll weiterhin abgefangen werden. - Fokusraum öffnen: Kapitelbaum muss weiter navigierbar bleiben.


## TEST_CHECKLIST v4.0.539
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.539.md

# TEST_CHECKLIST v4.0.539 ## Promptfenster - AI öffnen. - Thema eingeben. - Tiefe 2 bis 6 durchschalten. - Prüfen: Hinweis zeigt die gewählte Tiefe und 16max-Regel. - Prüfen: Promptvorschau ändert die Tiefenzeile und die Überschriftenregel. ## Promptimport - Prompt kopieren. - In ChatGPT senden. - Antwort kopieren. - In ITMO Promptimport tippen. - Erwartung: Map wird angelegt. ## 16max-Regel - Thema mit sehr vielen Hauptaspekten importieren. - Erwartung: Root hat höchstens 16 direkte Kinder. - Wenn mehr vorhanden waren, muss ein Knoten „Weitere Aspekte“ erscheinen. - Dieser Knoten darf wiederum höchstens 16 direkte Kinder haben. ## Regression - Rheuma öffnen: keine weißen Buchsymbolstapel. - Kompass öffnen: Pfeile bleiben sichtbar und ausgerichtet. - Familienkreis öffnen: Mutter plus direkte Kinder bleiben ruhig markiert. - Fokusraum öffnen: Textstruktur bleibt lesbar.


## TEST_CHECKLIST v4.0.540
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.540.md

# TEST_CHECKLIST v4.0.540 ## 1. Promptfenster Promptfenster öffnen. Erwartung: keine großen alten Promptkarten mehr. Sichtbar sind Thema, Tiefe, Übernehmen, Prompt kopieren, Promptimport, Vorschau und höchstens ein kompakter Verlauf. Tiefe 3, 4 und 5 antippen. Erwartung: Vorschau ändert die Tiefe und nennt weiterhin die 16max-Regel. ## 2. Promptimport Fehlerfall Prompt kopieren und direkt in ITMO Promptimport tippen, ohne vorher ChatGPT-Antwort zu kopieren. Erwartung: Meldung „Noch der Prompt“. ## 3. Promptimport gültig Eine gültige Kapitelantwort kopieren, die mit `# Rheuma` oder `# Lagerungsschiene` beginnt. Promptimport tippen. Erwartung: neue Map entsteht, Map öffnet, Fokusraum zeigt gegliederte Struktur. ## 4. 16max-Prüfung Ein absichtlich großes Thema importieren. Erwartung: Kein Knoten hat mehr als 16 direkte Kinder. Überzählige Inhalte landen in sinnvollen Gruppen, insbesondere „Weitere Aspekte“ nur als Reparaturgruppe. ## 5. Fokusraum Safe-Area In der importierten Map ganz nach unten scrollen. Erwartung: letzte Überschrift, Text und Aktionsbuttons bleiben oberhalb des Footers bedienbar. Kein Inhalt liegt dauerhaft unter Foto/Insta/Themen/Print/Orbit. ## 6. Regression Kompass öffnen. Erwartung: 16 Richtungen, gleich große Dekorationsformen, Pfeile sichtbar. Rheuma oder Sonne öffnen. Erwartung: keine großen weißen `book`-Symbole auf der Bühne.


## Testcheckliste v4.0.541
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.541.md

# Testcheckliste v4.0.541 ## Promptimport - Promptfenster öffnen. - Tiefe 4 wählen. - Thema „Kontrollieren“ übernehmen. - Prompt kopieren und in ChatGPT verwenden. - Antwort kopieren. - In ITMO `Promptimport` drücken. - Erwartung: Import erfolgreich, Map erscheint als neues Thema. ## Bühne nach Import - Kontrollieren-Map öffnen. - Erwartung: keine Buchsymbolstapel. - Erwartung: deutlich weniger gleichzeitige Labels als in v4.0.540. - Erwartung: Familienkreise sind sichtbar, aber nicht mehr bilddominierend. - Erwartung: große Überlaufgruppen entstehen höchstens als mehrere geordnete Gruppen, nicht als lange Kette. ## Fokusraum - Map in Themen/Fokus öffnen. - Bis unten scrollen. - Erwartung: Einträge liegen nicht unter dem Footer. - Erwartung: importierte Untergliederung bleibt erhalten. ## Regression - Kompass öffnen. - Erwartung: 16 Richtungen, Pfeile nach außen, gleich große Dekoration. - Promptimport mit leerer/falscher Zwischenablage prüfen.


## Testcheckliste v4.0.542
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.542.md

# Testcheckliste v4.0.542 ## 1. Promptfarbe Promptfenster öffnen, Thema eingeben, Tiefe wählen, Prompt kopieren. In der Vorschau darf keine feste `color: #00e5b0`-Zeile und kein `symbol: book` mehr stehen. ## 2. Promptimport-Familienfarben Ein Thema neu über Promptimport importieren, zum Beispiel Kontrollieren oder Rheuma. Erwartung: Root und Hauptachsen nutzen unterschiedliche Farben aus der 16er-Palette. Unterbäume bleiben farblich ihrer Hauptachse zugeordnet. Wichtig: Alte importierte Maps nicht als Testgrundlage nutzen, weil deren Farben bereits im Speicher liegen können. ## 3. Palette im Fokusraum Ein Polygon öffnen, Anker/Farbpanel öffnen. Erwartung: 16 Farben in Regenbogenfolge. Keine lange doppelte Palette. ## 4. Pinch entfernt Auf der Bühne mit zwei Fingern auseinander- und zusammenziehen. Erwartung: kein Zoom, keine Größenphase, keine sichtbare Pinch-Reaktion. Einfinger-Schieben funktioniert weiter. ## 5. Regression Kompass öffnen. Erwartung: Pfeile bleiben sichtbar und ausgerichtet. Fokusraum öffnen. Erwartung: unterer Safe-Area-Abstand bleibt erhalten. Promptimport mit versehentlich kopiertem Prompt testen. Erwartung: Meldung „Noch der Prompt“ beziehungsweise klare Abweisung.


## Testcheckliste v4.0.543
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.543.md

# Testcheckliste v4.0.543 1. App starten. Startseite prüfen: oben Datei + Prompt, Suchfeld mit Datei daneben, kein Plusbutton. 2. AI-Prompt öffnen. Tiefe wählen, Thema übernehmen, Prompt kopieren. Prüfen: kein Promptimport-Button im AI-Fenster. 3. Dateiimport testen: kopierte Kapitelantwort über Datei/Import einfügen. 4. Neue Map öffnen. Bühne sollte direkt erscheinen, keine Zwischenstatistik. 5. Footer prüfen: Foto, Insta, Themen, Print. Kein Orbit. 6. iPhone quer drehen. Prüfen: keine Suche, kein Footer, nur Bühne. 7. Bühnen-Suche im Hochformat antippen. Placeholder: „Thematik suchen“. Kein komplett markierter Thementitel. 8. Fokusraum öffnen. Map-Titel ist Anzeige, nicht editierbares Feld. 9. Große Promptmap neu importieren. Prüfen: Familienfarben bleiben, keine riesigen Root-/Overflow-Polygone, Overflow heißt „Ergänzungen“. 10. Pinch testen. Mehrfingerbewegung darf keinen Zoom auslösen.


## Testcheckliste v4.0.544
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.544.md

# Testcheckliste v4.0.544 1. App starten: Startseite schwarz, kein Footer sichtbar. 2. Suche: Platzhalter „Thematik suchen“. Importbutton direkt daneben sichtbar. 3. AI: nur über Vorlage „AI“ öffnen. 4. Datei-/Promptbuttons oberhalb der Suche dürfen nicht mehr erscheinen. 5. Neue Promptmap importieren, alte Maps nicht als Geometrie-Test verwenden. 6. Bühne: Polygone wirken gleich groß; Form nur Dekohülle. 7. Familienfäden: Kinder mit eigenen Kindern dürfen längere Fäden haben, aber nicht riesig randflüchten. 8. Querformat prüfen: weiterhin pure Bühne ohne Suche/Footer.


## Testcheckliste v4.0.545
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.545.md

# Testcheckliste v4.0.545 1. App starten, Startseite prüfen: Import neben Thematik suchen, AI über Vorlage. 2. Neue Promptmap erzeugen/importieren, z.B. Rheuma oder Kontrollieren. 3. Bühne prüfen: alle Polygonkörper gleich groß, Seitenzahl nur Dekohülle. 4. Familienkreise prüfen: Mutter + direkte Kinder, kein losgelöstes Wegschwimmen. 5. Geschwisterfamilien prüfen: Familienkreise sollen nicht deutlich ineinander liegen. 6. Kind mit eigenem Kind prüfen: Faden zur Mutter sichtbar länger als Blattkind. 7. Bullauge prüfen: nahe Mitte sanft größer, außen normal. 8. Langtipp prüfen: bildschirmnächster Knoten wird zentriert. 9. Kompass kurz öffnen: 16er-Ring darf nicht gebrochen sein.


## Test v4.0.546
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.546.md

# Test v4.0.546 1. Start öffnen: nur Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse als Vorlagen prüfen. 2. Import neben Thematik suchen prüfen. 3. Start ganz unten prüfen: Statistik sichtbar, Impressum/Datenschutz/Quellen sichtbar, Liste löschen sichtbar. 4. Kompass öffnen: Richtungspfeile bleiben sichtbar. 5. Anatomie öffnen: keine riesigen Schädel-/Symbolflächen auf der Bühne. 6. Neue Map öffnen: keine riesigen weißen Pfeile/Symbole auf der Bühne. 7. Footer auf Bühne prüfen: Foto, Insta, Themen, Print ohne eigene Buttonrahmen.


## Testcheckliste v4.0.549
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/TEST_CHECKLIST_v4.0.549.md

# Testcheckliste v4.0.549 ## Intro - App frisch öffnen oder `introSkippedV549` in den Release-Settings zurücksetzen. - Prüfen: schwarzer deckender Hintergrund, fünf Karten, Weiter, Start, Skip. - Nach Skip/Start muss die Startseite erscheinen. - App neu starten: Intro darf nicht erneut erscheinen. ## App-Icon / Splash - Prüfen: `assets/icon.png`, `assets/adaptive-icon.png`, `assets/splash.png` vorhanden. - Prüfen: `app.json` verweist auf diese Dateien. - Nach Build prüfen: TestFlight-Icon ist nicht mehr weiß. ## Regression - Startseite: Vorlagen Neu, AI, Kompass, Anatomie, Gefühle, Bedürfnisse. - Import neben `Thematik suchen`. - Keine Footerleiste auf Start. - Bühne und Fokusraum unverändert öffnen. - Kompass und Anatomie als Systemvorlagen öffnen; Copy nur ein Duplikat.


## v4.0.649-polygon-point-warp
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/docs/root-history/VERSION_LOG.md

## v4.0.649-polygon-point-warp - Polygonhüllen-Punkte werden einzeln durch die Bullauge-Linse gezogen. - Knoten bleiben fast stabil; Bullauge sitzt primär in den Hüllen. - Fadenanker auf die nächstgelegene Seite der verformten Hülle zurückgeführt.


## eas
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/eas.json

{ "cli": { "version": ">= 13.0.0", "appVersionSource": "remote" }, "build": { "production": { "autoIncrement": true, "ios": { "resourceClass": "m-medium" } }, "preview": { "distribution": "internal" } }, "submit": { "production": { "ios": {} } } }


## package
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/package.json

{ "name": "grematik-v4-0-672-erstdurchlauf", "version": "4.0.672", "private": true, "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start --go --lan --clear --port 8081", "go": "expo start --go --lan --clear --port 8081", "ios": "expo start --ios", "android": "expo start --android", "web": "expo start --web", "eas:login": "eas login", "eas:whoami": "eas whoami", "eas:configure": "eas build:configure", "build:ios:testflight": "node scripts/ensure-deps.mjs && eas build --platform ios --profile production", "submit:ios:testflight": "node scripts/ensure-deps.mjs && eas submit --platform ios --latest", "preflight": "node scripts/preflight.mjs", "setup": "npm install", "doctor": "npx expo-doctor", "testflight:prepare": "npm install && npm run preflight && npx expo-doctor", "testflight:windows": "powershell -ExecutionPolicy Bypass -File .\\WINDOWS_TESTFLIGHT_COMMANDS.ps1" }, "dependencies": { "expo": "~54.0.0", "expo-print": "~15.0.7", "@expo/vector-icons": "^15.0.2", "@react-native-async-storage/async-storage": "~2.2.0", "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.5", "react-native-web": "^0.21.0", "expo-document-picker": "~14.0.7", "expo-file-system": "~19.0.17", "expo-sharing": "~14.0.7", "react-native-svg": "~15.12.1", "react-native-view-shot": "~4.0.3", "expo-media-library": "~18.2.0", "expo-image-picker": "~17.0.8", "expo-clipboard": "~8.0.7" }, "devDependencies": {}, "description": "GREMATIK v4.0.672 Erstdurchlauf: lauffähige Expo-SDK-54-App-Arbeitskopie mit korrigierter Preflight-Logik, stabilem App-Namen und gesichertem Kontextarchiv." }


## // v4.0.253: PNG-/Theme-Assets wurden bewusst aus dem App-Kern entfernt.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/assets.js

// v4.0.253: PNG-/Theme-Assets wurden bewusst aus dem App-Kern entfernt. // Die Bühne und Bibliothek arbeiten nur noch mit schwarzen Flächen, Symbolen und optionalen Nutzer-Fotoreferenzen. export const APP_IMAGES = {}; export const SYMBOLS = [ { key: 'add', label: 'Neu', char: '*' }, { key: 'circle', label: 'Urmutter', char: '*' }, // v4.0.522: Ein adaptiver Pfeil. Die Bühne rotiert ihn aus der tatsächlichen Eltern-Kind-Richtung. { key: 'dir-auto', label: 'Richtung', char: '↑' }, // v4.0.450: Richtungsicons liegen direkt hinter dem internen Add-Symbol, // damit der sichtbare Symbolpicker mit dem linken Pfeil startet. { key: 'dir-left', label: 'Links', char: '←' }, { key: 'dir-right', label: 'Rechts', char: '→' }, { key: 'dir-up', label: 'Oben', char: '↑' }, { key: 'dir-down', label: 'Unten', char: '↓' }, { key: 'dir-up-right', label: 'Rechts oben', char: '↗' }, { key: 'dir-down-right', label: 'Rechts unten', char: '↘' }, { key: 'dir-down-left', label: 'Links unten', char: '↙' }, { key: 'dir-up-left', label: 'Links oben', char: '↖' }, // v4.0.465: Anatomie nutzt dieselbe ruhige weiße Icon-Sprache wie // der Symbolpicker. Keine Emoji-Sticker mehr auf der Bühne. { key: 'skull-bone', label: 'Schädel', icon: 'skull-outline' }, { key: 'spine-bone', label: 'Wirbelsäule', icon: 'git-commit-outline' }, { key: 'thorax-bone', label: 'Thorax', icon: 'grid-outline' }, { key: 'pelvis-bone', label: 'Becken', icon: 'diamond-outline' }, { key: 'long-bone', label: 'Knochen', icon: 'remove-outline' }, { key: 'hand-bone', label: 'Hand', icon: 'hand-left-outline' }, { key: 'foot-bone', label: 'Fuß', icon: 'footsteps-outline' }, { key: 'axis-bone', label: 'Achse', icon: 'resize-outline' }, { key: 'body', label: 'Körper', icon: 'body-outline' }, { key: 'brain', label: 'Psyche', icon: 'medical-outline' }, { key: 'seed', label: 'Samen', icon: 'ellipse-outline' }, { key: 'leaf', label: 'Blatt', icon: 'leaf-outline' }, { key: 'heart', label: 'Herz', icon: 'heart-outline' }, { key: 'hand', label: 'Hand', icon: 'hand-left-outline' }, { key: 'eye', label: 'Auge', icon: 'eye-outline' }, { key: 'ear', label: 'Ohr', icon: 'ear-outline' }, { key: 'mouth', label: 'Mund', icon: 'chatbubble-ellipses-outline' }, { key: 'home', label: 'Haus', icon: 'home-outline' }, { key: 'bridge', label: 'Brücke', icon: 'git-branch-outline' }, { key: 'water', label: 'Wasser', icon: 'water-outline' }, { key: 'flame', label: 'Flamme', icon: 'flame-outline' }, { key: 'spiral', label: 'Spirale', icon: 'reload-circle-outline' }, { key: 'star', label: 'Stern', icon: 'sparkles-outline' }, { key: 'book', label: 'Buch', icon: 'book-outline' }, { key: 'path', label: 'Weg', icon: 'trail-sign-outline' }, { key: 'sun', label: 'Sonne', icon: 'sunny-outline' }, { key: 'moon', label: 'Mond', icon: 'moon-outline' }, { key: 'shield', label: 'Schutz', icon: 'shield-checkmark-outline' }, { key: 'scale', label: 'Skala', icon: 'options-outline' }, { key: 'balance', label: 'Balance', icon: 'contrast-outline' }, { key: 'bulb', label: 'Idee', icon: 'bulb-outline' }, { key: 'diamond', label: 'Klarheit', icon: 'diamond-outline' }, { key: 'people', label: 'Kontakt', icon: 'people-outline' }, { key: 'person', label: 'Selbst', icon: 'person-outline' }, { key: 'pulse', label: 'Körper', icon: 'pulse-outline' }, { key: 'compass', label: 'Orientierung', icon: 'compass-outline' }, { key: 'infinite', label: 'Entwicklung', icon: 'infinite-outline' }, { key: 'palette', label: 'Farbe', icon: 'color-palette-outline' }, { key: 'map', label: 'Map', icon: 'map-outline' }, { key: 'time', label: 'Zeit', icon: 'time-outline' }, { key: 'planet', label: 'Bühne', icon: 'planet-outline' }, { key: 'print', label: 'Print', icon: 'print-outline' }, { key: 'image', label: 'Bild', icon: 'image-outline' }, { key: 'calendar', label: 'Kalender', icon: 'calendar-outline' }, { key: 'tree', label: 'Baum', icon: 'git-branch-outline' }, { key: 'copy', label: 'Kopie', icon: 'copy-outline' }, { key: 'pin', label: 'Ort', icon: 'location-outline' }, { key: 'sparkles', label: 'ITMO', icon: 'sparkles-outline' }, { key: 'football', label: 'Fußball', icon: 'football-outline' }, ]; export function getDesignThemeImageSource() { return null; } export function getDesignThemeImageSourceForSize() { return null; } export function getImageSource(key, uri) { if (uri) return { uri }; return null; } export function getTemplateImageSourceForTheme() { return null; } export function getTemplateImageSource() { return null; } export function getImageLabel(key, uri) { if (uri) return 'eigenes Bild'; return ''; } export function getSymbolDefinition(key) { return SYMBOLS.find(s => s.key === key) || null; } export function getSymbolDefinitions(keys = []) { const list = Array.isArray(keys) ? keys : (keys ? [keys] : []); return Array.from(new Set(list.filter(Boolean))).map(getSymbolDefinition).filter(Boolean); } export function getAmbientPolygonImageSource(shape = {}) { if (shape?.imageUri) return getImageSource(null, shape.imageUri); return null; } export function isValidImageSource(source) { if (!source) return false; if (typeof source === 'object' && typeof source.uri === 'string' && source.uri.trim().length > 0) return true; return false; } export function ensureImageSource(source, fallback = null) { return isValidImageSource(source) ? source : fallback; }


## // ITMO v4.0.643
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/bullaugeDisplayVariants.js

// ITMO v4.0.643 // Bullauge is a display translation layer, not the print/layout ground truth. // The fixed map/print geometry and the screen bullauge projection must stay separable. export const BULLAUGE_DISPLAY_VARIANT_TAKE_ONE_V643 = 'take-one-equal-thread-bullauge'; export const BULLAUGE_DISPLAY_VARIANT_SOFT_LENS_V643 = 'idea-two-soft-lens'; export const BULLAUGE_DISPLAY_VARIANT_ORBIT_PANE_V643 = 'idea-three-orbit-pane'; export const BULLAUGE_DISPLAY_VARIANTS_V643 = Object.freeze({ [BULLAUGE_DISPLAY_VARIANT_TAKE_ONE_V643]: Object.freeze({ id: BULLAUGE_DISPLAY_VARIANT_TAKE_ONE_V643, version: 'v4.0.643', label: 'Take One Equal Thread Bullauge', purpose: 'Primary screen/bullauge mode.', maxConnectionsPerNode: 9, equalDirectThreadLength: true, pullChildrenWithChildrenOutward: false, collisionAvoidance: false, allowOverlaps: true, keepFamilyRadiusFlat: true, printOnly: false, note: 'A child with children stays on exactly the same direct radius as a leaf child. The bullauge/lens may later visually deconflict the view, but geometry must not pre-spread it.', }), [BULLAUGE_DISPLAY_VARIANT_SOFT_LENS_V643]: Object.freeze({ id: BULLAUGE_DISPLAY_VARIANT_SOFT_LENS_V643, version: 'v4.0.643-idea', label: 'Soft Lens Bullauge', purpose: 'Parked idea: same geometry as Take One, but stronger center magnification and softer edge compression.', maxConnectionsPerNode: 9, equalDirectThreadLength: true, pullChildrenWithChildrenOutward: false, collisionAvoidance: false, allowOverlaps: true, keepFamilyRadiusFlat: true, printOnly: false, }), [BULLAUGE_DISPLAY_VARIANT_ORBIT_PANE_V643]: Object.freeze({ id: BULLAUGE_DISPLAY_VARIANT_ORBIT_PANE_V643, version: 'v4.0.643-idea', label: 'Orbit Pane Bullauge', purpose: 'Parked idea: translate dense equal-thread clusters into a porthole/orbit reading pane without changing stored layout.', maxConnectionsPerNode: 9, equalDirectThreadLength: true, pullChildrenWithChildrenOutward: false, collisionAvoidance: false, allowOverlaps: true, keepFamilyRadiusFlat: true, printOnly: false, }), }); export const PRINT_DISPLAY_VARIANT_V643 = Object.freeze({ id: 'print-hierarchy-distance', version: 'v4.0.643', label: 'Print Hierarchy Distance', purpose: 'Print/export mode keeps hierarchy readable and may use larger distances for children with children.', maxConnectionsPerNode: 9, equalDirectThreadLength: false, pullChildrenWithChildrenOutward: true, collisionAvoidance: true, allowOverlaps: false, keepFamilyRadiusFlat: false, printOnly: true, }); export function normalizeBullaugeDisplayVariantV643(value = null) { const key = String(value || '').trim().toLowerCase(); if (BULLAUGE_DISPLAY_VARIANTS_V643[key]) return key; return BULLAUGE_DISPLAY_VARIANT_TAKE_ONE_V643; } export function bullaugeDisplayVariantSpecV643(value = null) { return BULLAUGE_DISPLAY_VARIANTS_V643[normalizeBullaugeDisplayVariantV643(value)]; } export function isTakeOneBullaugeV643(value = null) { return normalizeBullaugeDisplayVariantV643(value) === BULLAUGE_DISPLAY_VARIANT_TAKE_ONE_V643; }


## import { PALETTE } from './theme';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/chapterText.js

import { PALETTE } from './theme'; const uid = prefix => `${prefix}-${Date.now()}-${Math.floor(Math.random() * 99999)}`; const now = () => Date.now(); const MAX_IMPORTED_DIRECT_CHILDREN = 9; const HARD_IMPORTED_DIRECT_CHILDREN_LIMIT = 9; function titlePrefixForBlock(title = '', path = []) { const raw = String(title || '').trim(); const last = Array.isArray(path) && path.length ? String(path[path.length - 1] || '').trim() : ''; if (!raw || raw === 'Kern' || raw === 'Intro') return last || raw || 'Kern'; return raw; } function cleanTitleFragment(value = '') { return String(value || '') .replace(/[\r\n]+/g, ' ') .replace(/[„“"'`´]+/g, '') .replace(/^[\s\-–—:;,.]+|[\s\-–—:;,.]+$/g, '') .replace(/\s+/g, ' ') .trim(); } function hasTitlePrefix(text = '') { return /^.{1,64}?\s+[\-–—]\s+.+/u.test(String(text || '').replace(/\s+/g, ' ').trim()); } function ensureTitleTextPrefix(text = '', title = '', path = []) { const raw = String(text || '').trim(); if (!raw) return raw; if (hasTitlePrefix(raw)) return raw; const t = cleanTitleFragment(titlePrefixForBlock(title, path)) || 'Titel'; return `${t} - ${raw}`; } function makeBlock(title = 'Kern', text = '', path = [], nodeId = null, order = 0) { return { id: uid('block'), type: 'text', title, text: String(text || '').trim(), scales: [], structureRole: path.length { const node = nodes[id]; if (!node) return; const ownPath = [...path, node.title || 'Kapitel']; const blocks = Array.isArray(node.blocks) ? node.blocks : []; node.systemStructure = { ...(node.systemStructure || {}), role: ownPath.length b.id), maxDirectChildren: HARD_IMPORTED_DIRECT_CHILDREN_LIMIT, visualDirectChildrenTarget: MAX_IMPORTED_DIRECT_CHILDREN, }; node.parentId = parentId; node.blocks = blocks.map(block => ({ ...block, chapterPath: ownPath, sourceNodeId: node.id })); (Array.isArray(node.children) ? node.children : []).forEach(childId => visit(childId, ownPath, depth + 1, node.id)); }; (Array.isArray(roots) ? roots : []).forEach(rootId => visit(rootId, [], 0, null)); } function enforceImportedChildLimit(nodes = {}, roots = [], maxChildren = MAX_IMPORTED_DIRECT_CHILDREN, seedTime = Date.now()) { let serial = Object.keys(nodes || {}).length + 1; const makeOverflowGroup = (parent, overflowIds, round = 1) => { const parentPath = Array.isArray(parent?.systemStructure?.path) && parent.systemStructure.path.length ? parent.systemStructure.path : [parent?.title || 'Kapitel']; const title = round { if (nodes[childId]) nodes[childId].parentId = id; }); return id; }; const chunkIds = (ids = [], size = maxChildren) => { const chunks = []; for (let i = 0; i { const node = nodes[id]; if (!node) return; let children = Array.isArray(node.children) ? node.children.filter(childId => nodes[childId]) : []; if (children.length > maxChildren) { let keepCount = maxChildren - 1; let overflow = children.slice(keepCount); let chunks = chunkIds(overflow, maxChildren); while (chunks.length + keepCount > maxChildren && keepCount > 0) { keepCount -= 1; overflow = children.slice(keepCount); chunks = chunkIds(overflow, maxChildren); } const keep = children.slice(0, Math.max(0, keepCount)); const groupIds = chunks.map((chunk, index) => makeOverflowGroup(node, chunk, chunks.length > 1 ? index + 1 : 1)); children = [...keep, ...groupIds].slice(0, maxChildren); } node.children = children; children.forEach(childId => clampNode(childId)); }; (Array.isArray(roots) ? roots : []).forEach(rootId => clampNode(rootId)); refreshImportedStructureMetadata(nodes, roots); } export function parseChapterTextToMap(raw = '', options = {}) { const originalSource = String(raw || '').replace(/\r\n/g, '\n').replace(/\r/g, '\n').trim(); if (!originalSource) throw new Error('Die Kapiteldatei ist leer.'); const headerMeta = extractChapterHeaderMeta(originalSource); const source = headerMeta.body.trim(); if (!source) throw new Error('Die Kapiteldatei enthält keine Kapitelstruktur.'); const t = now(); const mapId = `map-chapter-${t}`; const nodes = {}; const roots = []; const stack = []; let serial = 0; let current = null; let activeBlockTitle = 'Kern'; let activeBlockLines = []; let prefaceLines = []; const finishBlock = () => { if (!current) return; const node = nodes[current.id]; if (!node) return; const path = Array.isArray(node.systemStructure?.path) && node.systemStructure.path.length ? node.systemStructure.path : [node.title]; const text = activeBlockLines.join('\n').trim(); if (!node.blocks.length && !text && activeBlockTitle === 'Kern') { node.blocks.push(makeBlock('Kern', '', path, node.id, 0)); } else if (text || activeBlockTitle !== 'Kern' || !node.blocks.length) { node.blocks.push(makeBlock(activeBlockTitle || (node.blocks.length ? `Textblock ${node.blocks.length + 1}` : 'Kern'), text, path, node.id, node.blocks.length)); } node.text = node.blocks[0]?.text || ''; node.systemStructure.blockIds = node.blocks.map(b => b.id); activeBlockTitle = 'Kern'; activeBlockLines = []; }; const openHeading = (level, title) => { finishBlock(); const safeLevel = Math.max(1, Math.min(18, Number(level) || 1)); while (stack.length >= safeLevel) stack.pop(); const parent = stack[stack.length - 1] || null; const path = [...(parent?.path || []), String(title || 'Kapitel').trim() || 'Kapitel']; const id = `node-chapter-${t}-${serial++}`; const node = makeNode(id, title, safeLevel, parent?.id || null, t + serial, path); nodes[id] = node; if (parent?.id && nodes[parent.id]) nodes[parent.id].children.push(id); else roots.push(id); current = { id, level: safeLevel, path }; stack.push(current); activeBlockTitle = 'Kern'; activeBlockLines = []; }; const lines = source.split('\n'); for (const line of lines) { const heading = parseHeadingLine(line); const blockMarker = parseBlockMarker(line); if (heading) { openHeading(heading.level, heading.title); } else if (blockMarker && current) { finishBlock(); activeBlockTitle = blockMarker.title; activeBlockLines = []; } else if (current) { activeBlockLines.push(line); } else { prefaceLines.push(line); } } finishBlock()


## export const DESIGN_THEME_PROFILES = {
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/designThemes.js

export const DESIGN_THEME_PROFILES = { gradient: { key: 'gradient', label: 'Klar', accent: '#fffbe2', accent2: '#7df0ff', dark: '#02050d', panel: 'rgba(0,0,0,0.54)', panelStrong: 'rgba(0,0,0,0.72)', border: 'rgba(255,250,218,0.16)', text: '#fffbe2', textSoft: 'rgba(255,250,218,0.68)', radius: 28, fontScale: 1, searchPlaceholder: 'Begriff suchen', printBg: '#f5f0df', printInk: '#15201d', printPanel: '#fffaf0', }, stars: { key: 'stars', label: 'Atlas', accent: '#5f8cff', accent2: '#ff638f', dark: '#f3efe1', panel: 'rgba(250,247,235,0.92)', panelStrong: 'rgba(255,252,242,0.96)', border: 'rgba(18,43,76,0.24)', text: '#10243e', textSoft: 'rgba(16,36,62,0.68)', radius: 14, fontScale: 0.96, searchPlaceholder: 'Begriff im Atlas suchen', printBg: '#f8f5e9', printInk: '#10243e', printPanel: '#fffdf5', }, kosmos: { key: 'kosmos', label: 'Kosmos', accent: '#7df0ff', accent2: '#b56cff', dark: '#020816', panel: 'rgba(3,10,24,0.56)', panelStrong: 'rgba(5,14,32,0.76)', border: 'rgba(125,240,255,0.30)', text: '#fffbe2', textSoft: 'rgba(255,250,218,0.72)', radius: 22, fontScale: 1.05, searchPlaceholder: 'Themen im Kosmos suchen', printBg: '#f5f0df', printInk: '#0b1728', printPanel: '#fffaf0', }, manga: { key: 'manga', label: 'Konfetti', accent: '#ff74ad', accent2: '#7df0ff', dark: '#050914', panel: 'rgba(8,12,28,0.58)', panelStrong: 'rgba(7,10,24,0.78)', border: 'rgba(255,227,106,0.22)', text: '#fff8e7', textSoft: 'rgba(255,245,225,0.70)', radius: 34, fontScale: 1.03, searchPlaceholder: 'Blüten und Äste suchen', printBg: '#fff5eb', printInk: '#24172a', printPanel: '#ffffff', }, }; export function getDesignThemeProfile(theme = 'gradient') { return DESIGN_THEME_PROFILES[theme] || DESIGN_THEME_PROFILES.gradient; }


## import { bullaugeDisplayVariantSpecV643, normalizeBullaugeDisplayVariantV643, PRINT_DISPLAY_VARIANT_V643 } from './bulla
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/geometry.js

import { bullaugeDisplayVariantSpecV643, normalizeBullaugeDisplayVariantV643, PRINT_DISPLAY_VARIANT_V643 } from './bullaugeDisplayVariants'; const TAU = Math.PI * 2; const ROOT_LEN = 68; // v4.0.375: kompakte Membran, konstante Familienarme. const GLOBAL_FAMILY_ARM_SCALE = 1.00; // v4.0.544: Fadenlänge ist wieder echte Familienkreis-Geometrie, kein versteckter Kurzskalierer. const BASE_FAMILY_ARM = 58; const FAMILY_CIRCLE_PADDING = 14; const MIN_LEN = 24; const MAX_DEPTH = 32; // v4.0.362: keine visuelle Tiefenbegrenzung mehr; Performance kommt durch Sichtfenster-Culling const SUBTREE_PULL_LIMIT = 86; // v4.0.367: Unterbäume bekommen kontrolliert mehr Raum, damit Familien nicht ineinanderlaufen. const SIBLING_COLLISION_GAP = 18; // v4.0.367: zusätzlicher Abstand bei vielen Geschwistern im selben Familienkranz. const MAX_ITMO_CONNECTIONS_V640 = 9; // v4.0.640: 9 Verbindungen ist der stabile App-Maxwert. Keine 16er-Familien mehr. const GEOMETRY_MODE_BULLAUGE_V641 = 'bullauge'; const GEOMETRY_MODE_PRINT_V641 = 'print'; const BULLAUGE_FAMILY_RADIUS_V641 = ROOT_LEN + BASE_FAMILY_ARM; const DEFAULT_BULLAUGE_VARIANT_V643 = 'take-one-equal-thread-bullauge'; function normalizeGeometryModeV641(value = null) { const key = String(value || '').trim().toLowerCase(); return key === GEOMETRY_MODE_PRINT_V641 ? GEOMETRY_MODE_PRINT_V641 : GEOMETRY_MODE_BULLAUGE_V641; } function maxVisualChildrenForNodeV641(hasParent = true) { // v4.0.641: Max 9 VERBINDUNGEN pro Knoten. // Root: 9 Kinder. Nicht-Root: 1 Rueckverbindung + maximal 8 Kinder. return hasParent ? Math.max(0, MAX_ITMO_CONNECTIONS_V640 - 1) : MAX_ITMO_CONNECTIONS_V640; } function clamp(value, min, max) { const n = Number(value); if (!Number.isFinite(n)) return min; return Math.max(min, Math.min(max, n)); } const GEOMETRY_CACHE = new Map(); const GEOMETRY_CACHE_LIMIT = 8; function geometryCacheKey(map = {}, viewport = { width: 390, height: 720 }) { const nodes = map?.nodes || {}; const roots = Array.isArray(map?.roots) ? map.roots.join(',') : ''; const vw = Math.round(Number(viewport?.width || 390)); const vh = Math.round(Number(viewport?.height || 720)); const mode = normalizeGeometryModeV641(viewport?.geometryMode || viewport?.layoutMode || viewport?.mode); const bullaugeVariant = normalizeBullaugeDisplayVariantV643(viewport?.bullaugeVariant || viewport?.displayVariant || DEFAULT_BULLAUGE_VARIANT_V643); const parts = Object.keys(nodes).sort().map(id => { const n = nodes[id] || {}; const children = Array.isArray(n.children) ? n.children.join('.') : ''; const layout = n.layout ? `${Math.round(Number(n.layout.x || 0))},${Math.round(Number(n.layout.y || 0))},${Math.round(Number(n.layout.size || 0))},${Math.round(Number(n.layout.rotate || 0) * 100)}` : ''; const symbols = Array.isArray(n.symbolKeys) ? n.symbolKeys.join('.') : (n.symbolKey || ''); return `${id}|${n.parentId || ''}|${children}|${n.title || ''}|${n.color || ''}|${symbols}|${n.imageUri || ''}|${n.imageKey || ''}|${layout}|${n.plannedDirection || ''}|${n.growthAngle ?? ''}|${n.visualSize || ''}|${n.relationWeight ?? ''}|${n.createdAt || ''}`; }); return `${map?.id || ''}|${vw}x${vh}|${mode}|${bullaugeVariant}|${roots}|${parts.length}|${parts.join('§')}`; } function rememberGeometry(key, value) { GEOMETRY_CACHE.set(key, value); if (GEOMETRY_CACHE.size > GEOMETRY_CACHE_LIMIT) { const oldest = GEOMETRY_CACHE.keys().next().value; GEOMETRY_CACHE.delete(oldest); } return value; } // v4.0.581 ABSOLUTE HÜLLEN-TABELLE. Nicht ausdünnen, nicht umdeuten. // Die Tabelle ist der einzige Richtwert für alle Hüllenformen. // sides: 1 bedeutet echte Kreis-Sonderform. 3-9 bedeuten Polygonseiten. export const HULL_SHAPE_TABLE = Object.freeze({ root: Object.freeze({ 0: Object.freeze({ childCount: 0, parentConnection: 0, connectionCount: 0, sides: 1, shape: 'circle' }), 1: Object.freeze({ childCount: 1, parentConnection: 0, connectionCount: 1, sides: 4, shape: 'square' }), 2: Object.freeze({ childCount: 2, parentConnection: 0, connectionCount: 2, sides: 4, shape: 'square' }), 3: Object.freeze({ childCount: 3, parentConnection: 0, connectionCount: 3, sides: 3, shape: 'triangle' }), 4: Object.freeze({ childCount: 4, parentConnection: 0, connectionCount: 4, sides: 4, shape: 'square' }), 5: Object.freeze({ childCount: 5, parentConnection: 0, connectionCount: 5, sides: 5, shape: 'pentagon' }), 6: Object.freeze({ childCount: 6, parentConnection: 0, connectionCount: 6, sides: 6, shape: 'hexagon' }), 7: Object.freeze({ childCount: 7, parentConnection: 0, connectionCount: 7, sides: 7, shape: 'heptagon' }), 8: Object.freeze({ childCount: 8, parentConnection: 0, connectionCount: 8, sides: 8, shape: 'octagon' }), 9: Object.freeze({ childCount: 9, parentConnection: 0, connectionCount: 9, sides: 9, shape: 'nonagon' }), 10: Object.freeze({ childCount: 10, parentConnection: 0, connectionCount: 10, sides: 10, shape: 'decagon' }), 11: Object.freeze({ childCount: 11, parentConnection: 0, connectionCount: 11, sides: 11, shape: 'hendecagon' }), 12: Object.freeze({ childCount: 12, parentConnection: 0, connectionCount: 12, sides: 12, shape: 'dodecagon' }), 13: Object.freeze({ childCount: 13, parentConnection: 0, connectionCount: 13, sides: 13, shape: 'tridecagon' }), 14: Object.freeze({ childCount: 14, parentConnection: 0, connectionCount: 14, sides: 14, shape: 'tetradecagon' }), 15: Object.freeze({ childCount: 15, parentConnection: 0, connectionCount: 15, sides: 15, shape: 'pentadecagon' }), 16: Object.freeze({ childCount: 16, parentConnection: 0, connectionCount: 16, sides: MAX_ITMO_CONNECTIONS_V640, shape: 'hexadecagon' }), }), attached: Object.freeze({ 0: Object.freeze({ childCount: 0, parentConnection: 1, connectionCount: 1, sides: 1, shape: 'circle' }), 1: Object.freeze({ childCount: 1, parentConnection: 1, connectionCount: 2, sides: 4, shape: 'square' }), 2: Object.freeze({ childCount: 2, parentConnection: 1, connectionCount: 3, sides: 3, shape: 'triangle' }), 3: Object.freeze({ childCount: 3, parentConnection: 1, connectionCoun


## import { PALETTE } from './theme';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/model.js

import { PALETTE } from './theme'; import { normalizeReleaseSettings } from './release'; import { TEMPLATE_DEFINITIONS } from './templates/definitions'; import { enrichTemplateWorldV162 } from './templates/workflowV162'; import { enrichTemplateContentV164 } from './templates/contentV164'; import { applyTemplateTreeWorldV189 } from './templates/treeV189'; import { applyTemplateStructureV212 } from './templates/templateStructureV212'; import { createChapterTemplateMapV214, hasChapterTemplateV214 } from './templates/chapterTemplatesV214'; export { TEMPLATE_DEFINITIONS }; export { createPhotoLibraryMap, mergePhotoLibraryMap, findPhotoLibraryMap, createAllImagesMap, collectImageNodesFromMaps } from './photoMaps'; const now = () => Date.now(); const uid = prefix => `${prefix}-${Date.now()}-${Math.floor(Math.random() * 99999)}`; const DEFAULT_RELATION_WEIGHT = 3; const TEMPLATE_FAMILY_COLORS_V424 = ['#ffe119', '#00e5b0', '#008cff', '#ff1675', '#8b2cff', '#ff6a00', '#47ff00']; const LEGACY_PASTEL_COLOR_MAP_V427 = { '#fff4a8': '#ffe119', '#9fffe3': '#00e5b0', '#87c8ff': '#008cff', '#ff9fcb': '#ff1675', '#d7a6ff': '#8b2cff', '#ffa76f': '#ff6a00', '#b7ff70': '#47ff00', }; const EMPTY_POLYGON_COLOR = '#ffffff'; const clampRelationWeight = value => Number.isFinite(Number(value)) ? Math.max(0, Math.min(12, Number(value))) : DEFAULT_RELATION_WEIGHT; export function makeNode(id, title, color, children = [], extra = {}) { const t = extra.createdAt || now(); return { id, title, color, children, parentId: extra.parentId || null, createdAt: t, updatedAt: extra.updatedAt || t, text: extra.text || '', blocks: normalizeBlocks(extra.blocks), scales: Array.isArray(extra.scales) ? extra.scales : [], imageKey: extra.imageKey || null, imageUri: extra.imageUri || null, symbolKeys: Array.isArray(extra.symbolKeys) ? Array.from(new Set(extra.symbolKeys.filter(Boolean))) : (extra.symbolKey ? [extra.symbolKey] : []), symbolKey: extra.symbolKey || (Array.isArray(extra.symbolKeys) && extra.symbolKeys[0]) || null, directionAutoSymbol: !!extra.directionAutoSymbol, // v4.0.465: geplante Richtungen müssen auch als Node-Feld erhalten bleiben. // Ohne dieses Feld verliert die Bühne bei Root-/Anatomieplanung wichtige // Vorentscheidungen wie: erstes Kind der Kopf-Urmutter strahlt nach unten. plannedDirection: extra.plannedDirection || null, photoMeta: extra.photoMeta || null, photoRef: extra.photoRef || extra.photoMeta?.photoRef || null, mediaKind: extra.mediaKind || null, layout: extra.layout || null, visualSize: extra.visualSize || null, visualOrder: extra.visualOrder || null, relationWeight: clampRelationWeight(extra.relationWeight ?? DEFAULT_RELATION_WEIGHT), systemStructure: extra.systemStructure && typeof extra.systemStructure === 'object' ? normalizeSystemStructure(extra.systemStructure, {}) : null, }; } const n = (id, title, colorIndex, children = [], extra = {}) => makeNode(id, title, PALETTE[colorIndex % PALETTE.length], children, extra); const scale = (label, value = 5, min = 0, max = 10, hidden = false) => ({ id: uid('scale'), label, value, min, max, hidden: !!hidden }); const block = (title, text, scales = null) => ({ id: uid('block'), type: 'text', title, text, scales: Array.isArray(scales) ? scales : [] }); function normalizeSystemStructure(value = {}, fallback = {}) { const base = value && typeof value === 'object' ? value : {}; const next = { ...fallback, ...base }; if (!Array.isArray(next.path)) next.path = Array.isArray(fallback.path) ? fallback.path : []; if (!Array.isArray(next.childIds)) next.childIds = Array.isArray(fallback.childIds) ? fallback.childIds : []; if (!Array.isArray(next.blockIds)) next.blockIds = Array.isArray(fallback.blockIds) ? fallback.blockIds : []; return next; } function normalizeBlockScales(scales = []) { const source = Array.isArray(scales) ? scales : []; const valid = source.map((item, index) => ({ id: item?.id || uid('scale'), label: item?.label || 'Skala', value: Number.isFinite(item?.value) ? item.value : 5, min: Number.isFinite(item?.min) ? item.min : 0, max: Number.isFinite(item?.max) ? item.max : 10, hidden: item?.hidden !== false, })); return valid; } function normalizeBlocks(blocks = []) { if (!Array.isArray(blocks)) return []; return blocks.map((item, index) => ({ id: item?.id || uid('block'), type: item?.type || 'text', title: item?.title || (index === 0 ? 'Kern' : `Textblock ${index + 1}`), text: typeof item?.text === 'string' ? item.text : '', scales: normalizeBlockScales(item?.scales), structureRole: item?.structureRole || null, chapterPath: Array.isArray(item?.chapterPath) ? item.chapterPath : [], sourceNodeId: item?.sourceNodeId || null, order: Number.isFinite(item?.order) ? item.order : index, })); } function applyDefaultScalePolicyToNode(node = {}) { // v4.0.408: Keine automatisch erzeugten Standardskalen mehr. // Vorhandene Skalen bleiben erhalten, aber leere Skalenlisten bleiben leer. const blocks = Array.isArray(node.blocks) ? node.blocks : []; const keepNonDefaultScale = scaleItem => String(scaleItem?.label || '').trim().toLowerCase() !== 'urskala'; node.blocks = blocks.map(blockItem => ({ ...blockItem, scales: normalizeBlockScales(blockItem?.scales).filter(keepNonDefaultScale), })); node.scales = (Array.isArray(node.scales) ? node.scales : []).filter(keepNonDefaultScale); return node; } function cleanTitleFragment(value = '') { return String(value || '') .replace(/[\r\n]+/g, ' ') .replace(/[„“"'`´]+/g, '') .replace(/^[\s\-–—:;,.]+|[\s\-–—:;,.]+$/g, '') .replace(/\s+/g, ' ') .trim(); } function escapeRegExp(value = '') { return String(value || '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function stripDuplicateTitleLead(text = '', candidates = []) { let raw = String(text || '').trim(); if (!raw) return raw; const cleanCandidates = Array.from(new Set((candidates || []) .map(value => cleanTitleFragment(value || '')) .filter(value => value && value.length >= 2) )); let changed = true; let guard = 0; while (changed && guard ({ ...b, structureRole: node?.systemStruct


## import { PALETTE } from './theme';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/photoMaps.js

import { PALETTE } from './theme'; const now = () => Date.now(); const safeId = value => String(value || 'x').replace(/[^a-zA-Z0-9_-]+/g, '_').slice(0, 80); const monthNames = ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember']; export const PHOTO_IMPORT_LIMIT = 1000; export const PHOTO_STORAGE_MODE = 'reference-only'; function makePhotoNode(id, title, color, children = [], extra = {}) { const t = extra.createdAt || now(); return { id, title, color, children, parentId: extra.parentId || null, createdAt: t, updatedAt: extra.updatedAt || t, text: extra.text || '', blocks: Array.isArray(extra.blocks) ? extra.blocks : [], scales: Array.isArray(extra.scales) ? extra.scales : [], imageKey: null, imageUri: extra.imageUri || null, symbolKeys: Array.isArray(extra.symbolKeys) ? extra.symbolKeys : (extra.symbolKey ? [extra.symbolKey] : ['image']), symbolKey: extra.symbolKey || (Array.isArray(extra.symbolKeys) && extra.symbolKeys[0]) || 'image', photoMeta: extra.photoMeta || null, photoRef: extra.photoRef || extra.photoMeta?.photoRef || null, mediaKind: extra.mediaKind || (extra.photoMeta ? 'photo' : null), sourceMapId: extra.sourceMapId || null, sourceNodeId: extra.sourceNodeId || null, systemNode: Boolean(extra.systemNode), }; } function formatDate(value) { const d = new Date(Number(value || Date.now())); if (!Number.isFinite(d.getTime())) return 'unbekannt'; return d.toLocaleDateString('de-DE', { year: 'numeric', month: '2-digit', day: '2-digit' }); } function dayKeyFor(date) { return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } function hourKeyFor(date) { return `${dayKeyFor(date)}-${String(date.getHours()).padStart(2, '0')}`; } function getAspectClass(asset = {}) { const w = Number(asset.width || 0); const h = Number(asset.height || 0); if (!w || !h) return { key: 'unknown', label: 'Format unbekannt', tone: PALETTE[3] }; const ratio = w / h; if (ratio > 1.85) return { key: 'panorama', label: 'Panorama', tone: PALETTE[6] }; if (ratio > 1.18) return { key: 'landscape', label: 'Querformat', tone: PALETTE[7] }; if (ratio = 12000000) return { key: 'large', label: 'Sehr groß' }; if (pixels >= 5000000) return { key: 'medium', label: 'Groß' }; return { key: 'small', label: 'Klein/Export' }; } function getLocation(asset = {}) { const raw = asset.location || asset.exif?.location || asset.gps || null; const lat = Number(raw?.latitude ?? raw?.lat ?? raw?.coords?.latitude); const lon = Number(raw?.longitude ?? raw?.lng ?? raw?.lon ?? raw?.coords?.longitude); if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null; return { latitude: lat, longitude: lon }; } function getLocationCluster(asset = {}) { const loc = getLocation(asset); if (!loc) return { key: 'unknown', label: 'Ort unbekannt', location: null }; const lat = Math.round(loc.latitude * 20) / 20; const lon = Math.round(loc.longitude * 20) / 20; return { key: `${lat}_${lon}`, label: `Ort ${lat.toFixed(2)}, ${lon.toFixed(2)}`, location: loc }; } function getDuplicateKey(asset = {}) { const title = String(asset.filename || '').replace(/\.[^.]+$/, '').toLowerCase(); const w = Number(asset.width || 0); const h = Number(asset.height || 0); if (!title || !w || !h) return null; return `${title}-${w}x${h}`; } function pushMapList(map, key, value) { if (!key) return; const list = map.get(key) || []; list.push(value); map.set(key, list); } function makeClusterClone(asset, clusterId, index, t, extra = {}) { const title = extra.title || asset.filename || `Bild ${index + 1}`; return makePhotoNode(`photo-ref-${safeId(clusterId)}-${safeId(asset.id)}-${index}-${t}`, title, extra.color || asset.aspect?.tone || PALETTE[(index + 8) % PALETTE.length], [], { parentId: clusterId, createdAt: asset.createdAt || (t + index), updatedAt: asset.modifiedAt || asset.createdAt || t, imageUri: asset.uri, symbolKeys: extra.symbolKeys || ['image'], text: extra.text || `Bildreferenz aus der Fotomediathek.\nZeit: ${formatDate(asset.createdAt)}\nDatei: ${asset.filename || 'unbenannt'}\nSpeicher: Referenz, keine Kopie.`, photoMeta: asset, photoRef: asset.photoRef, mediaKind: 'photo', }); } export function normalizePhotoAsset(asset = {}, index = 0) { const createdAt = Number(asset.creationTime || asset.createdAt || asset.modificationTime || Date.now() - index); const date = Number.isFinite(createdAt) ? new Date(createdAt) : new Date(); const year = date.getFullYear(); const month = date.getMonth(); const monthKey = `${year}-${String(month + 1).padStart(2, '0')}`; const title = asset.filename || asset.title || `Bild ${index + 1}`; const assetId = String(asset.id || asset.assetId || `${asset.uri || 'photo'}-${index}`); const uri = asset.uri || asset.localUri || asset.imageUri || null; const locationCluster = getLocationCluster(asset); const aspect = getAspectClass(asset); const sizeClass = getSizeClass(asset); const photoRef = { provider: 'ios-photo-library', assetId, uri, storageMode: PHOTO_STORAGE_MODE, }; return { id: assetId, assetId, uri, filename: title, title, createdAt: date.getTime(), modifiedAt: Number(asset.modificationTime || asset.updatedAt || createdAt), width: Number(asset.width || 0), height: Number(asset.height || 0), mediaType: asset.mediaType || 'photo', monthKey, monthLabel: `${monthNames[month]} ${year}`, dayKey: dayKeyFor(date), dayLabel: date.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' }), hourKey: hourKeyFor(date), hourLabel: `${date.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit' })} · ${String(date.getHours()).padStart(2, '0')} Uhr`, year: String(year), location: getLocation(asset), locationCluster, aspect, sizeClass, duplicateKey: getDuplicateKey({ ...asset, filename: title }), source: 'iphone-library', storageMode: PHOTO_STORAGE_MODE, photoRef, }; } export function createPhotoLibraryMap(rawAssets = [], options = {}) { const assets = (rawAssets || []).map(normalizePhotoAsset).filt


## import { buildGeometry, shapeBounds } from './geometry';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/printScene.js

import { buildGeometry, shapeBounds } from './geometry'; import { getSymbolDefinitions } from './assets'; import { normalizeReleaseSettings } from './release'; function esc(value = '') { return String(value).replace(/[&<>"']/g, ch => ({ '&': '&amp;', ' ': '&gt;', '"': '&quot;', "'": '&#039;' }[ch])); } function formatPrintDate(t) { const n = Number(t || 0); if (!n) return ''; try { return new Date(n).toLocaleString('de-DE', { day: '2-digit', month: '2-digit', year: '2-digit', hour: '2-digit', minute: '2-digit' }); } catch (_) { return ''; } } function printableImg(uri, cls = 'miniImg') { if (!uri) return ''; const safe = esc(String(uri)); return ` `; } function polygonPoints(points, offsetX, offsetY, scale) { return points.map(p => `${((p.x + offsetX) * scale).toFixed(1)},${((p.y + offsetY) * scale).toFixed(1)}`).join(' '); } function collectBounds(shapes) { if (!shapes.length) return { minX: 0, minY: 0, maxX: 1, maxY: 1, width: 1, height: 1 }; const boxes = shapes.map(shapeBounds); const minX = Math.min(...boxes.map(b => b.minX)); const minY = Math.min(...boxes.map(b => b.minY)); const maxX = Math.max(...boxes.map(b => b.maxX)); const maxY = Math.max(...boxes.map(b => b.maxY)); return { minX, minY, maxX, maxY, width: maxX - minX, height: maxY - minY }; } function blockScalesOf(node = {}) { return [...(node.scales || []), ...(node.blocks || []).flatMap(block => block.scales || [])].filter(sc => sc && sc.hidden !== true); } function symbolKeysOf(nodeOrShape = {}) { return Array.isArray(nodeOrShape.symbolKeys) && nodeOrShape.symbolKeys.length ? nodeOrShape.symbolKeys : (nodeOrShape.symbolKey ? [nodeOrShape.symbolKey] : []); } function shapeSymbols(shape, offsetX, offsetY, scale) { const symbols = getSymbolDefinitions(symbolKeysOf(shape)).slice(0, 1); if (!symbols.length) return ''; const cx = (shape.center.x + offsetX) * scale; const cy = (shape.center.y + offsetY) * scale + 4; return ` ${esc(symbols[0].label.slice(0, 3))} `; } function normalizePrintSeed(value = '') { return String(value || '').trim().replace(/^itmo[.\s:_-]*/i, '').replace(/\s+/g, ' ').slice(0, 64); } function stageWorldRect(stageView, stageScreen) { const scale = Number(stageView?.scale || 0); const width = Number(stageScreen?.width || 0); const height = Number(stageScreen?.height || 0); if (!scale || !width || !height) return null; const minX = (-Number(stageView.x || 0)) / scale; const minY = (-Number(stageView.y || 0)) / scale; return { minX, minY, maxX: minX + width / scale, maxY: minY + height / scale, width: width / scale, height: height / scale }; } function boundsIntersects(a, b, margin = 0) { return a.maxX >= b.minX - margin && a.minX = b.minY - margin && a.minY boundsIntersects(shapeBounds(shape), rect, margin)); if (selected.length >= 2) return selected; const cx = rect.minX + rect.width / 2; const cy = rect.minY + rect.height / 2; return allShapes.slice().map(shape => ({ shape, d: Math.hypot((shape.center?.x || 0) - cx, (shape.center?.y || 0) - cy) })) .sort((a, b) => a.d - b.d) .slice(0, Math.min(22, allShapes.length)) .map(item => item.shape); } function treeOrderedNodes(map = {}) { const nodes = map.nodes || {}; const roots = Array.isArray(map.roots) && map.roots.length ? map.roots : Object.values(nodes).filter(n => !n.parentId).map(n => n.id); const seen = new Set(); const out = []; const walk = (id, depth = 0) => { const node = nodes[id]; if (!node || seen.has(id)) return; seen.add(id); out.push({ node, depth }); (node.children || []).forEach(childId => walk(childId, depth + 1)); }; roots.forEach(id => walk(id, 0)); Object.values(nodes).sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).forEach(node => walk(node.id, 0)); return out; } function textBlockHtml(block = {}, index = 0, node = {}) { const title = block.title || (index === 0 ? 'Kern' : `Textblock ${index + 1}`); const text = String(block.text || '').trim(); const scaleLine = (block.scales || []).filter(sc => sc && sc.hidden !== true).map(sc => ` ${esc(sc.label || 'Skala')}: ${esc(sc.value ?? '')} `).join(''); const images = [block.imageUri, index === 0 ? node.imageUri : null].filter(Boolean); return ` ${esc(title)} ${text ? ` ${esc(text).replace(/\n/g, ' ')} ` : ''}${images.length ? ` ${images.map(uri => printableImg(uri)).join('')} ` : ''}${scaleLine ? ` ${scaleLine} ` : ''} `; } function focusListHtml(map = {}) { return treeOrderedNodes(map).map(({ node, depth }, index) => { const blocks = Array.isArray(node.blocks) && node.blocks.length ? node.blocks : [{ title: 'Text', text: node.text || '' }]; const symbols = getSymbolDefinitions(symbolKeysOf(node)).map(s => s.label).filter(Boolean).join(', '); const updated = formatPrintDate(node.updatedAt || node.createdAt); const scales = blockScalesOf(node).slice(0, 6).map(sc => ` ${esc(sc.label || 'Skala')}: ${esc(sc.value ?? '')} `).join(''); return ` ${esc(index + 1)}. ${esc(node.title || 'Kreis')} ${updated ? esc(updated) : ''}${symbols ? ` · ${esc(symbols)}` : ''} ${blocks.map((block, blockIndex) => textBlockHtml(block, blockIndex, node)).join('')}${scales ? ` ${scales} ` : ''} `; }).join(''); } export function buildPrintHtml(map, options = {}) { const releaseSettings = normalizeReleaseSettings(options.releaseSettings || {}); const homeSeed = normalizePrintSeed(releaseSettings.homeSeed || options.homeSeed || ''); const itmoSeedLine = homeSeed ? `ITMO.${homeSeed}` : 'ITMO'; const nodes = Object.values(map.nodes || {}); const geom = buildGeometry(map, { width: 980, height: 1320, geometryMode: 'print' }); const printShapes = choosePrintShapes(geom.shapes, options); const bounds = collectBounds(printShapes); const pad = 66; const svgW = 980; const svgH = 980; const fitScale = Math.min((svgW - pad * 2) / Math.max(bounds.width, 1), (svgH - pad * 2) / Math.max(bounds.height, 1), 1.9); const scale = Math.max(0.12, Math.min(2.6, fitScale)); const offsetX = -bounds.minX + (svgW / scale - bounds.width) / 2; const offsetY = -bounds.minY + (svgH / scale - bounds.height) / 2; const poly = printShapes.map(s 


## export const RELEASE_REQUIREMENTS = [
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/release.js

export const RELEASE_REQUIREMENTS = [ { key: 'impressum', title: 'Impressum', status: 'offen', tone: '#ffd166', text: 'Anbieterkennzeichnung sichtbar in der App und öffentlich erreichbar. Name, ladungsfähige Anschrift, Kontakt und verantwortliche Stelle müssen vor Store-Abgabe final sein.', }, { key: 'privacy', title: 'Datenschutz', status: 'offen', tone: '#7cffa6', text: 'Öffentliche Datenschutz-URL erforderlich. Lokale Speicherung, Bildimport, Export, Print und Teilen müssen beschrieben werden.', }, { key: 'support', title: 'Support', status: 'offen', tone: '#22c3da', text: 'Supportkontakt oder Supportseite für App Store Connect. Muss dauerhaft erreichbar sein und zur App passen.', }, { key: 'appPrivacy', title: 'App Privacy', status: 'zu prüfen', tone: '#b28dff', text: 'Store-Angaben zu Datenarten, Zweck und Verknüpfung mit Personen final ausfüllen. Aktueller App-Kern ist lokal gedacht; Teilen und Export bleiben Nutzerhandlungen.', }, ]; export const RELEASE_FIELDS = [ { key: 'providerName', label: 'Anbieter / Name', placeholder: 'Name oder Anbieter eintragen' }, { key: 'providerAddress', label: 'Anschrift', placeholder: 'ladungsfähige Anschrift eintragen', multiline: true }, { key: 'impressumUrl', label: 'Impressum-URL', placeholder: 'https://…' }, { key: 'privacyUrl', label: 'Datenschutz-URL', placeholder: 'https://…' }, { key: 'supportContact', label: 'Support', placeholder: 'Mail oder URL' }, { key: 'storeSubtitle', label: 'Store-Untertitel', placeholder: 'Kurzer App-Store-Untertitel' }, { key: 'storeDescription', label: 'Store-Beschreibung', placeholder: 'Beschreibung für App Store Connect', multiline: true }, { key: 'reviewNotes', label: 'Review Notes', placeholder: 'Hinweise für Apple Review', multiline: true }, ]; export const RELEASE_STEPS = [ 'Rechtsseiten in der App sichtbar machen', 'öffentliche Impressums- und Datenschutz-URLs festlegen', 'Store-Texte und Screenshots erzeugen', 'PNG-Bildteilen aus der Bühne testen', 'Gerätetest prüfen', 'Review Notes schreiben', ]; export const RELEASE_SCREENSHOTS = [ 'Startseite mit horizontalen Panels', 'Bühne im Bildmodus', 'Bühne im Symbolmodus', 'Fokusraum mit Textfläche', 'Bild- und Symbolchips im Fokusraum', 'Print- oder Rechtsbereich', 'PNG-Bild aus Bühnenansicht geteilt' ]; export const DEFAULT_RELEASE_SETTINGS = { providerName: '', providerAddress: '', impressumUrl: '', privacyUrl: '', supportContact: '', storeSubtitle: 'Visuelles Denken, Schreiben und Befunden', storeDescription: 'GREMATIK ist eine lokale, visuelle Schreib- und Denkapp. Gedanken, Befundbausteine, Wörter, Farben, Bilder und Skalen werden als verbundene Polygone organisiert. Die App ist zunächst ohne Account, Cloud oder Analyse gedacht. ITMO bleibt als technischer Import- und Arbeitskern lesbar.', reviewNotes: '', homeSeed: '', designTheme: 'gradient', checkedSteps: {}, checkedScreenshots: {}, }; export function normalizeReleaseSettings(value = {}) { const checkedSteps = value && typeof value.checkedSteps === 'object' && value.checkedSteps ? value.checkedSteps : {}; const checkedScreenshots = value && typeof value.checkedScreenshots === 'object' && value.checkedScreenshots ? value.checkedScreenshots : {}; const homeSeed = String(value?.homeSeed || '') .trim() .replace(/^itmo[.\s:_-]*/i, '') .replace(/\s+/g, ' ') .slice(0, 64); const safeTheme = 'gradient'; const merged = { ...DEFAULT_RELEASE_SETTINGS, ...(value || {}), checkedSteps, checkedScreenshots, homeSeed, designTheme: safeTheme }; return merged; } export function releaseSummary(settings = {}) { const normalized = normalizeReleaseSettings(settings); const requiredFields = ['providerName', 'providerAddress', 'impressumUrl', 'privacyUrl', 'supportContact']; const missingFields = requiredFields.filter(key => !String(normalized[key] || '').trim()); const checked = Object.values(normalized.checkedSteps || {}).filter(Boolean).length; const screenshotsChecked = Object.values(normalized.checkedScreenshots || {}).filter(Boolean).length; return { open: missingFields.length, total: requiredFields.length, checked, steps: RELEASE_STEPS.length, screenshotsChecked, screenshots: RELEASE_SCREENSHOTS.length }; } export function buildImpressumText(settings = {}) { const data = normalizeReleaseSettings(settings); const lines = [ 'Impressum', '', data.providerName || 'Anbieter / Name noch offen', data.providerAddress || 'Anschrift noch offen', '', `Kontakt: ${data.supportContact || 'Supportkontakt noch offen'}`, data.impressumUrl ? `Impressum-URL: ${data.impressumUrl}` : 'Impressum-URL noch offen', '', 'Hinweis: Diese Angaben müssen zu den öffentlich erreichbaren Angaben der App passen.', ]; return lines.join('\n'); } export function buildPrivacyText(settings = {}) { const data = normalizeReleaseSettings(settings); const lines = [ 'Datenschutz', '', data.privacyUrl ? `Datenschutz-URL: ${data.privacyUrl}` : 'Datenschutz-URL noch offen', '', 'Aktueller App-Kern:', 'Texte, Farben, Skalen, Bilder und Themen werden lokal auf dem Gerät gespeichert.', 'Import, Export, Print und Teilen werden durch Nutzerhandlung ausgelöst.', 'Solange keine Cloud, kein Account, keine Analyse und kein Sync eingebaut sind, ist der Datenfluss entsprechend schlank zu beschreiben.', '', 'Zu prüfen:', 'Die Store-Datenschutzangaben müssen exakt zur tatsächlichen Datenverarbeitung passen. Store-Untertitel und Beschreibung sollten ebenfalls den lokalen, ruhigen Kern ohne Cloudversprechen abbilden.', 'Wenn später Cloud, Account, Sync, Tracking oder Analyse dazukommen, müssen Datenschutztext und Store-Angaben vorher angepasst werden.', ]; return lines.join('\n'); }


## export function collectMapStats(map = {}, selectedId = null) {
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/statsWiki.js

export function collectMapStats(map = {}, selectedId = null) { const nodes = map?.nodes || {}; const list = Object.values(nodes).filter(Boolean); const total = list.length; const roots = Array.isArray(map?.roots) ? map.roots.length : list.filter(n => !n.parentId).length; const selected = selectedId && nodes[selectedId] ? nodes[selectedId] : null; let blockCount = 0; let wordCount = 0; let scaleCount = 0; let visibleScaleCount = 0; let maxDepth = 0; const byParent = new Map(); list.forEach(node => { if (node?.parentId) { if (!byParent.has(node.parentId)) byParent.set(node.parentId, []); byParent.get(node.parentId).push(node.id); } const blocks = Array.isArray(node?.blocks) ? node.blocks : []; blockCount += blocks.length; blocks.forEach(block => { wordCount += countWords(block?.text || ''); const scales = Array.isArray(block?.scales) ? block.scales : []; scaleCount += scales.length; visibleScaleCount += scales.filter(scale => scale?.hidden === false).length; }); const nodeScales = Array.isArray(node?.scales) ? node.scales : []; scaleCount += nodeScales.length; visibleScaleCount += nodeScales.filter(scale => scale?.hidden === false).length; }); // v4.0.429: maxDepth ohne Rekursion berechnen. Alte/kaputte Maps mit // Parent-Zyklen dürfen nicht mehr in einen Call-Stack-Fehler laufen. const depthOf = id => { let depth = 0; let cursor = id; const seen = new Set(); while (cursor && nodes[cursor] && !seen.has(cursor) && depth { maxDepth = Math.max(maxDepth, depthOf(node.id)); }); const selectedChildren = selected ? (Array.isArray(selected.children) ? selected.children.length : byParent.get(selected.id)?.length || 0) : 0; const selectedBlocks = selected ? (Array.isArray(selected.blocks) ? selected.blocks.length : 0) : 0; const selectedWords = selected ? countWords([selected.text, ...(selected.blocks || []).map(b => b?.text || '')].join(' ')) : 0; return { total, roots, blockCount, wordCount, scaleCount, visibleScaleCount, maxDepth, selectedTitle: selected?.title || map?.title || 'ITMO', selectedChildren, selectedBlocks, selectedWords, }; } export function buildWikiSuggestions(map = {}, selectedId = null, searchText = '') { const nodes = map?.nodes || {}; const selected = selectedId && nodes[selectedId] ? nodes[selectedId] : null; const raw = String(searchText || '').trim(); const seed = raw || selected?.title || map?.title || ''; const words = Array.from(new Set(String(seed) .split(/[^\p{L}\p{N}äöüÄÖÜß-]+/u) .map(w => w.trim()) .filter(w => w.length > 2) .slice(0, 6))); const titles = [selected?.title, map?.title, ...(selected?.children || []).map(id => nodes[id]?.title)] .filter(Boolean) .map(String) .filter(v => v.trim().length > 0) .slice(0, 4); return Array.from(new Set([...titles, ...words])).slice(0, 6); } export function makeWikiUrl(query = '') { const q = String(query || '').trim(); if (!q) return 'https://de.wikipedia.org/wiki/Spezial:Suche'; return `https://de.wikipedia.org/wiki/Spezial:Suche?search=${encodeURIComponent(q)}`; } function countWords(text = '') { const match = String(text || '').match(/[\p{L}\p{N}äöüÄÖÜß][\p{L}\p{N}äöüÄÖÜß-]*/gu); return match ? match.length : 0; }


## import AsyncStorage from '@react-native-async-storage/async-storage';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/storage.js

import AsyncStorage from '@react-native-async-storage/async-storage'; import * as FileSystem from 'expo-file-system/legacy'; import * as FileSystemModern from 'expo-file-system'; import * as Sharing from 'expo-sharing'; import * as DocumentPicker from 'expo-document-picker'; import { Share } from 'react-native'; import { createSeedMap, normalizeMap } from './model'; import { normalizeReleaseSettings } from './release'; import { buildChapterTextFromMap, parseChapterTextToMap, looksLikeChapterText } from './chapterText'; const KEY = 'itmo.v4.diamond.maps'; const RELEASE_KEY = 'itmo.v4.release.settings'; const TXT_START = '---ITMO_JSON_START---'; const TXT_END = '---ITMO_JSON_END---'; const EXPORT_VERSION = '4.0.427'; export async function loadMaps() { try { const raw = await AsyncStorage.getItem(KEY); if (!raw) return [createSeedMap()]; const parsed = JSON.parse(raw); const maps = Array.isArray(parsed) ? parsed : [parsed]; return maps.map(normalizeMap); } catch (_) { return [createSeedMap()]; } } export async function saveMaps(maps) { await AsyncStorage.setItem(KEY, JSON.stringify(maps)); } export async function exportMap(map) { const chapterText = buildChapterTextFromMap(map); const payload = { type: 'itmo-map-v4', version: EXPORT_VERSION, exportedAt: new Date().toISOString(), imageMode: 'reference-uri-metadata-no-photo-copy', chapterText, map }; const fileName = `${safeFileName(map?.title || 'itmo-map')}-v4.0.421.txt`; const body = [ 'ITMO MAP TXT EXPORT', `Titel: ${map?.title || 'ITMO Thema'}`, `Exportiert: ${payload.exportedAt}`, 'Hinweis: Diese Datei ist als Kapiteltext lesbar. ITMO kann sowohl diesen Kapiteltext als auch den JSON-Block importieren.', '', '---ITMO_KAPITEL_TEXT_START---', chapterText, '---ITMO_KAPITEL_TEXT_END---', '', TXT_START, JSON.stringify(payload, null, 2), TXT_END, '', ].join('\n'); const webDownload = tryBrowserTextDownload(fileName, body); if (webDownload) return webDownload; const fileWrite = await tryWriteExportFile(fileName, body); if (fileWrite?.uri) { try { if (await Sharing.isAvailableAsync()) { await Sharing.shareAsync(fileWrite.uri, { mimeType: 'text/plain', UTI: 'public.plain-text', dialogTitle: `${map?.title || 'ITMO Thema'} exportieren` }); } } catch (_) { // Datei wurde geschrieben; wenn der native Share-Dialog scheitert, bleibt der Export gültig. } return fileWrite.uri; } // v4.0.421: Expo Go/iOS liefert je nach SDK/Cachezustand manchmal kein // beschreibbares FileSystem-Verzeichnis. Dann ist Text-Export trotzdem eine // Nutzerhandlung: native Share-Sheet mit komplettem TXT-Inhalt statt Abbruch. try { await Share.share({ title: fileName, message: body }); return `share-text://${fileName}`; } catch (e) { throw new Error(`Export nicht möglich: ${String(e?.message || e || fileWrite?.error || 'kein Schreib- oder Teilziel gefunden')}`); } } export async function importMap() { const result = await DocumentPicker.getDocumentAsync({ type: ['text/plain', 'application/json', '*/*'], copyToCacheDirectory: true }); if (result.canceled || !result.assets?.[0]?.uri) return null; const asset = result.assets[0]; const raw = await FileSystem.readAsStringAsync(asset.uri, { encoding: FileSystem.EncodingType.UTF8 }); const parsed = parseImportedMapText(raw); const map = normalizeMap(parsed.map || parsed); return { ...map, importMeta: { ...(map.importMeta || {}), sourceName: asset.name || 'ITMO Import', importedAt: Date.now(), importVersion: EXPORT_VERSION } }; } export function parseImportedMapText(raw = '') { const originalText = String(raw || '').trim(); if (!originalText) throw new Error('Die Datei ist leer.'); if (/^\s*Erzeuge\s+eine\s+reine\s+ITMO-Kapitel-TXT/im.test(originalText)) { throw new Error('Das ist der Prompt, nicht die Antwort. Sende den Prompt zuerst an ChatGPT und füge danach die Antwort ein. Die Antwort muss mit # beginnen.'); } const text = extractImportableChapterText(originalText); const chapterStart = text.indexOf('---ITMO_KAPITEL_TEXT_START---'); const chapterEnd = text.indexOf('---ITMO_KAPITEL_TEXT_END---'); const chapterText = chapterStart >= 0 && chapterEnd > chapterStart ? text.slice(chapterStart + '---ITMO_KAPITEL_TEXT_START---'.length, chapterEnd).trim() : ''; const start = text.indexOf(TXT_START); const end = text.indexOf(TXT_END); const hasJsonBlock = start >= 0 && end > start; const json = hasJsonBlock ? text.slice(start + TXT_START.length, end).trim() : text; // Lossless ITMO exports carry JSON plus a readable chapter text. Prefer JSON when it // exists, so image refs, colors, symbols, scales and timestamps survive a roundtrip. if (hasJsonBlock || /^\s*[\[{]/.test(json)) { try { const parsed = JSON.parse(json); if (parsed?.map || parsed?.nodes || parsed?.type === 'itmo-map-v4') return parsed; } catch (_) { // Fall through to the readable chapter body below. } } if (chapterText) return { map: parseChapterTextToMap(chapterText) }; if (looksLikeChapterText(text)) return { map: parseChapterTextToMap(text) }; const repairedBareChapter = repairBareAiChapterText(text); if (repairedBareChapter && looksLikeChapterText(repairedBareChapter)) return { map: parseChapterTextToMap(repairedBareChapter) }; throw new Error('Keine gültige ITMO-Kapitelantwort gefunden. Kopiere die Antwort mit Überschriften oder die reine Kapitel-TXT-Antwort aus ChatGPT.'); } function repairBareAiChapterText(text = '') { const raw = String(text || '').trim(); if (!raw || /^\s*#/m.test(raw)) return ''; const lines = raw.split(/\r?\n/); const meaningful = lines.map(line => String(line || '').trim()).filter(Boolean); if (meaningful.length /^plannedDirection\s*:/i.test(line)).length; const promptLike = /^Erzeuge\s+eine\s+reine\s+ITMO-Kapitel-TXT/i.test(meaningful[0] || ''); if (promptLike) return ''; if (!metaCount && !meaningful.some(line => /^[A-ZÄÖÜ][\p{L}\p{N}\s\-/]{2,}$/u.test(line))) return ''; let firstTitleSeen = false; const repaired = lines.map(line => { const t = String(line || '').trim(); if (!t) return line; if (/^plannedDirection\s*:/i.test(t)) return line; if (


## import { parseChapterTextToMap } from '../chapterText';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/templates/chapterTemplatesV214.js

import { parseChapterTextToMap } from '../chapterText'; import { PALETTE } from '../theme'; // v4.0.220: alle Vorlagen sind echte Kapiteltexte mit Root-Intro und zusätzlicher Tiefenverzweigung. // Ein Heading erzeugt ein Polygon. Der erste Textblock dieses Polygons ist sein eigener Text. const TEMPLATE_TEXTS = { grematik_logbook: `# GREMATIK Erstbesuch Du bist am Nullpunkt 0. Das ist kein leerer Anfang, sondern ein geordneter Eintritt: App, Buch und Web werden zusammengeführt. Diese Vorlage ist absichtlich unbearbeitbar. Sie hält Orientierung, Protokoll, Eingangssetting und nächste Optionen fest. ## Wo bin ich? Du bist in der GREMATIK-App. Die Bühne zeigt Kreise und Fäden. Der Fokusraum zeigt Text. Die Bibliothek zeigt Vorlagen. Das Logbook hält fest, warum etwas so steht. ## Was passiert gerade? Dieser Stand setzt die Zeitachse auf 0. Nicht die Herkunft wird gelöscht, sondern der nächste nutzbare Einstieg wird hergestellt. Der erste Besuch soll ruhig, geführt und wiederauffindbar sein. ## Welche Optionen habe ich? Du kannst lesen, eine eigene Map beginnen, ein Buchkapitel als TXT importieren, ein Thema exportieren, im Web öffentliche Inhalte öffnen oder im ZIP-System App, Web und Projekte weiterführen. ## App, Buch, Web Die App sortiert lebendige Themen. Das Buch schleift Sprache und Kapitel. Die Website zeigt öffentliche Ordner und Inhalte schlicht lesbar. Alle drei sollen dieselbe Gestalt und dieselbe Führungslogik tragen. ## Logbook-Regel Jedes Projekt führt ein Logbook. Das Logbook ist Quelle, Gedächtnis, Verlauf und Entscheidungsregister. Nichts Wichtiges soll nur im Gespräch verschwinden. ## Fuchs und Ansprache Standardansprache darf Fuchs sein, wenn die Person das möchte. Wenn nicht, wird anders angesprochen. Orientierung und Respekt stehen vor Stil. ## CoPilot-Regel Das System sagt, wo du bist, was passiert, was die nächsten Optionen sind und welche Handlung jetzt sinnvoll ist. Es begleitet wie Flugbegleiter und CoPilot: ruhig, klar, verantwortlich. ## Nächster sauberer Schritt Für einen echten Erstappbesuch auf einem Gerät: App frisch installieren oder lokale Appdaten löschen, dann starten. Erwartung: Diese Orientierungsvorlage erscheint als erster Stand; danach können eigene Themen entstehen. ## Quelle Nullpunkt-Setzung aus der fxchs.grematik.de-Fortführung am 26.06.2026. Gestaltungsrichtung: organischer weiß-cremiger GREMATIK-App-Button mit Fuchs-Zentrum.`, empty: `# Neues Thema Eigene Map als Kapitelbaum. Jeder Kreis ist ein Kapitel. Jeder erste Textblock ist der eigene Polygontext. Kinder sind Unterkapitel und können beliebig weiter verzweigen. ## Einstieg Der erste Kreis hält die Grundfrage. Von hier aus entstehen die ersten Unterkapitel. ### Worum geht es? Beschreibe das Thema in einem einfachen Satz. Was soll hier verstanden, sortiert oder vorbereitet werden? ### Warum jetzt? Notiere Anlass, Dringlichkeit, Stimmung oder Kontext. Das hilft später, den Einstieg wiederzufinden. ### Was wäre ein guter nächster Schritt? Formuliere einen kleinen nächsten Schritt. Nicht die ganze Lösung, sondern den nächsten tragfähigen Knoten. ## Material Hier sammelt die Map Rohmaterial, ohne es sofort perfekt sortieren zu müssen. ### Gedanken Unfertige Gedanken dürfen hier stehen. Später können einzelne Wörter zu Polygonkindern werden. ### Beobachtungen Was ist konkret wahrnehmbar? Was wurde gesehen, gehört, getan, gemessen oder wiederholt erlebt? ### Quellen Woher kommt die Information? Unterricht, Gespräch, Buch, Patientensituation, Bild, Erinnerung oder eigene Beobachtung. ## Ordnung Die Ordnung entsteht aus der Frage, welche Teile eigene Polygone brauchen. ### Kapitel Ein Kapitel ist ein eigener Kreis, wenn es einen eigenen Text und eigene Kinder tragen soll. ### Unterkapitel Ein Unterkapitel ist ein Polygonkind. Es bekommt seinen eigenen ersten Textblock; Skalen werden bei Bedarf ergänzt. ### Verbindungen Verbindungen entstehen über Wörter, Pfade, Kinder, Exporttext und die gemeinsame Kapitelstruktur. ## Auswertung Am Ende kann die Map gelesen, exportiert, gedruckt oder weiter verdichtet werden. ### Was ist klarer geworden? Schreibe den Gewinn der Sortierung auf. ### Was bleibt offen? Offene Punkte bleiben als eigene Polygone sichtbar, statt im Text zu verschwinden. ### Was soll als Nächstes wachsen? Lege fest, welcher Ast vertieft werden soll.`, gerg: `# Grundlagen der Ergotherapie Ergotherapie wird als betätigungsorientierter Kapitelbaum geführt: Mensch, Alltag, Befundung, Ziel, Intervention, Evaluation und professionelle Haltung bleiben unterscheidbar und verbunden. ## Mensch und Betätigung Betätigung ist der zentrale Zugang. Entscheidend ist nicht nur, was jemand kann, sondern was im Alltag Bedeutung, Rolle und Teilhabe trägt. ### Selbstversorgung Waschen, Anziehen, Essen, Trinken, Toilettengang, Mobilität, Schlaf und Haushaltsroutinen bilden eine alltagsnahe Grundlage. #### Körperfunktionen im Alltag Kraft, Beweglichkeit, Koordination, Wahrnehmung, Aufmerksamkeit und Ausdauer werden nicht isoliert betrachtet, sondern in konkreten Handlungen. #### Gewohnheiten und Rollen Routinen, Familienrollen, Arbeit, Schule, Verantwortung und Tagesstruktur zeigen, welche Betätigungen wirklich relevant sind. ### Produktivität Produktivität umfasst Schule, Arbeit, Ausbildung, Haushalt, Verpflichtungen, Aufgabenplanung und Verantwortung. #### Anforderungen Zeitdruck, Komplexität, Material, soziale Regeln, Sicherheit und Fehlerfolgen bestimmen die therapeutische Anpassung. #### Ressourcen Interessen, Erfahrung, Motivation, vorhandene Strategien und Unterstützung sind Teil der Planung. ### Freizeit und Teilhabe Freizeit ist kein Zusatz, sondern ein Bereich von Sinn, Erholung, Kontakt, Selbstwirksamkeit und Identität. ## Ergotherapeutischer Prozess Der Prozess verbindet Erstkontakt, Befundung, Zielsetzung, Planung, Durchführung, Anpassung und Evaluation. ### Erstkontakt Anliegen, Auftrag, Rahmen, Diagnose, Sicherheit, Erwartungen und erste Hypothesen werden geklärt. ### Befundung Anamnese, Beobachtung


## const now = () => Date.now();
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/templates/contentV164.js

const now = () => Date.now(); const uid = prefix => `${prefix}-${Date.now()}-${Math.floor(Math.random() * 99999)}`; const block = (title, text) => ({ id: uid('block'), type: 'text', title, text }); const scale = (label, value = 5, min = 0, max = 10) => ({ id: uid('scale'), label, value, min, max }); function hashText(text = '') { let h = 0; const s = String(text || ''); for (let i = 0; i value); const palette = Array.isArray(helpers.palette) && helpers.palette.length ? helpers.palette : ['#7df0ff', '#7affb7', '#ff8bdc', '#ffe36a']; if (!map?.nodes || !map?.roots?.length || map.enrichedV164) return map; const normalizedKind = String(kind || map.templateKind || '').toLowerCase(); if (normalizedKind === 'empty') return normalizeMap({ ...map, enrichedV164: true }); const packs = templateContentPacksV164(normalizedKind); if (!packs.length) return normalizeMap({ ...map, enrichedV164: true }); const t = now(); let nodes = { ...map.nodes }; const rootId = map.roots[0]; const root = nodes[rootId]; if (!root) return map; let stamp = 0; const nodeTitle = id => String(nodes[id]?.title || '').trim().toLowerCase(); const hasChildTitle = (parentId, title) => (nodes[parentId]?.children || []).some(id => nodeTitle(id) === String(title || '').trim().toLowerCase()); const makeId = (parentId, title) => `${parentId}-v164-${Math.abs(hashText(`${normalizedKind}-${parentId}-${title}-${stamp++}`))}`; const addChild = (parentId, item, depth = 0) => { if (!parentId || !item?.title || !nodes[parentId] || hasChildTitle(parentId, item.title)) return null; const id = makeId(parentId, item.title); nodes[id] = makeNode(id, item.title, palette[(stamp + depth + 3) % palette.length], [], { parentId, createdAt: t + stamp, symbolKey: item.symbolKey || nodes[parentId]?.symbolKey || 'diamond', text: item.text || '', blocks: Array.isArray(item.blocks) ? item.blocks : [], scales: Array.isArray(item.scales) ? item.scales : [], }); nodes[parentId] = { ...nodes[parentId], children: [...(nodes[parentId].children || []), id], updatedAt: t + stamp }; (item.items || []).forEach(sub => addChild(id, sub, depth + 1)); return id; }; packs.forEach(pack => addChild(rootId, pack, 1)); const rootBlocks = Array.isArray(nodes[rootId].blocks) ? nodes[rootId].blocks : []; const hasDeepStart = rootBlocks.some(b => String(b.title || '').toLowerCase() === 'arbeitsmodus v164'); nodes[rootId] = { ...nodes[rootId], updatedAt: t, blocks: hasDeepStart ? rootBlocks : [...rootBlocks, block('Arbeitsmodus v164', templateContentGuideV164(normalizedKind))], }; return normalizeMap({ ...map, nodes, updatedAt: t, enrichedV164: true }); } function templateContentGuideV164(kind = '') { const guides = { befundung: 'Nutze diese Vorlage wie eine Befundwerkstatt: erst Alltag und Beobachtung sammeln, dann Hypothesen sichtbar halten, dann Ziele und Interventionen ableiten. Unklare Punkte bleiben eigene Kreise.', gerg: 'Nutze die Map als Lernnetz: Begriff, Modell, Praxisbeispiel, Gegenbeispiel und Prüfungsfrage werden getrennte Kreise. So wird Wissen nicht nur gelesen, sondern benutzt.', icf: 'Nutze die ICF nicht als Diagnoseliste, sondern als Übersetzungsraum: Funktion, Aktivität, Teilhabe, Umwelt und personenbezogene Faktoren werden sichtbar unterschieden.', icd: 'Nutze ICD als ruhige Orientierung für Gesundheitszustände. Die ergotherapeutische Frage bleibt: Was bedeutet das für Handlung, Teilhabe, Sicherheit, Gewohnheit und Kontext?', amdp: 'Nutze AMDP deskriptiv: beobachtbar, zitierbar, graduierbar. Keine Interpretation ohne Belegkreis. Bei Risiko oder Unsicherheit: weiterleiten, nicht schönreden.', persoenlichkeit: 'Nutze die Vorlage nicht etikettierend, sondern funktional: Muster, Schutz, Ressource, Beziehungskosten, Auslöser und neue Handlungsmöglichkeiten werden getrennt.', anatomie: 'Nutze Anatomie mit Transfer: Struktur, Bewegung, Innervation, Palpation, Alltagshandlung und klinischer Bezug gehören zusammen. Keine Merksatzdeko.', gefuehl: 'Nutze Gefühle als Signale, nicht als Urteil. Trenne Gefühl, Gedanke, Körperzeichen, Bedürfnis, Grenze und Bitte.', beduerfnis: 'Nutze Bedürfnisse als Orientierungswörter. Trenne Bedürfnis von Strategie, Lieblingslösung, Forderung oder Person.', }; return guides[kind] || 'Sammeln, trennen, verknüpfen, prüfen und erst danach handeln.'; } function templateContentPacksV164(kind = '') { const item = (title, text, symbolKey = 'diamond', extra = {}) => ({ title, text, symbolKey, ...extra }); const learnSet = [ item('Fragekreis', 'Formuliere eine echte Frage. Nicht: Thema wiederholen. Sondern: Woran erkenne ich es? Was unterscheidet es? Wie zeigt es sich im Alltag?', 'book'), item('Antwortkreis', 'Kurze Antwort mit einem Beispiel und einer Grenze. Gute Übungsfragen enthalten auch: Was wäre ein häufiger Irrtum?', 'check'), item('Prüfungsbrücke', 'Welche Formulierung könnte in Schule, Bericht, Sichtstunde oder Prüfung gefragt sein?', 'scale'), item('Praxisbeispiel', 'Konkrete Situation aus Therapie, Alltag oder Praktikum. Ohne Beispiel bleibt Wissen flach.', 'hand'), ]; const sourceSet = [ item('Beleg', 'Welche Beobachtung, Quelle, Aussage oder Situation trägt diese Annahme?', 'shield'), item('Unsicher', 'Was weiß ich noch nicht sicher? Welche Daten fehlen?', 'help'), item('Grenze', 'Was darf aus dieser Information nicht geschlossen werden?', 'warning'), item('Nächster Prüfschritt', 'Was wäre die kleinste faire Prüfung im nächsten Kontakt?', 'compass'), ]; const packs = { befundung: [ item('Befundwerkstatt', 'Hier werden Informationen nicht vermischt, sondern in Arbeitsformen getrennt.', 'pulse', { items: [ item('Anamnese', 'Biografie, Alltag, Rollen, Gewohnheiten, aktuelle Belastungen, Wünsche und relevante medizinische Angaben.', 'book'), item('Betätigung', 'Welche Handlung ist bedeutungsvoll, eingeschränkt, vermieden, gefährdet oder therapeutisch nutzbar?', 'hand', { scales: [scale('Bedeutung', 6), scale('Selbstständigkeit', 5)] }), item('Beobachtung', 'Was ist in Verhalten, Bewegung, Ausdauer, Aufmerksamkeit, Affekt, Kommunikation un


## // v4.0.179: sichtbare Vorlagenordner getrennt vom Modellkern.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/templates/definitions.js

// v4.0.179: sichtbare Vorlagenordner getrennt vom Modellkern. export const TEMPLATE_DEFINITIONS = [ { kind: 'grematik_logbook', folder: 'GREMATIK', title: 'Logbook', subtitle: 'Unbearbeitbarer Orientierungsfaden: Standort, Vorgang, Optionen, Appnachrichten und Fortführung.', symbolKey: 'book' }, { kind: 'empty', folder: 'Start', title: 'Neu', subtitle: 'Leere, ruhige Arbeitskarte für eigene Kreise, Wörter, Bilder, Skalen und Print.', symbolKey: 'add' }, { kind: 'kompass', folder: 'Start', title: 'Kompass', subtitle: 'Strikte Richtungsprobe: ein Zentrum, neun stabile Richtungskinder, keine Enkel-Dopplungen.', symbolKey: 'compass' }, { kind: 'anatomie', folder: 'Start', title: 'Anatomie', subtitle: 'Körperkarte als ruhige Lern- und Befundstruktur. Später wird diese Vorlage vertieft ausgebaut.', symbolKey: 'body' }, { kind: 'gefuehl', folder: 'Innenwelt', title: 'Gefühle', subtitle: 'GFK-Gefühlsfinder mit echten Gefühlen, unechten Gefühlen, Gedanken und Bedürfnisbezug.', symbolKey: 'heart' }, { kind: 'beduerfnis', folder: 'Innenwelt', title: 'Bedürfnisse', subtitle: 'GFK-Bedürfnisfinder mit inneren Kreisen, Hauptsegmenten und konkreten Bedürfnisworten.', symbolKey: 'leaf' }, ];


## // v4.0.212: Kapitel/Unterkapitel-Struktur wird aus Polygonbaum + Textblöcken abgeleitet.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/templates/templateStructureV212.js

// v4.0.212: Kapitel/Unterkapitel-Struktur wird aus Polygonbaum + Textblöcken abgeleitet. // Kreis = Kapitel. Polygonkind = Unterkapitel. Textblock = tragender Abschnitt des jeweiligen Kapitels. const TEXT_FOR_KIND = { empty: { intro: 'Freier Startpunkt. Lege Kinder als Unterkapitel an und sammle die tragenden Textblöcke direkt im passenden Polygon.', question: 'Was gehört als eigenes Unterkapitel in ein Polygonkind, und was bleibt als Textblock im aktuellen Polygon?' }, befundung: { intro: 'Befundung wird als Kapitelbaum geführt: Auftrag, Anamnese, Beobachtung, Betätigung, Funktionen, Umwelt, Ziele, Intervention und Reflexion hängen als Unterkapitel zusammen.', question: 'Welche Beobachtung trägt die Schlussfolgerung, welche Betätigung ist betroffen, und welche Skala prüft Veränderung?' }, gerg: { intro: 'Ergotherapie-Grundlagen werden als Praxisnetz geführt: Modell, Haltung, Prozess, Betätigung und Evidenz werden getrennt, aber verlinkt betrachtet.', question: 'Welche ergotherapeutische Entscheidung wird durch diesen Textblock vorbereitet?' }, anatomie: { intro: 'Anatomie wird körper- und funktionsbezogen geführt: Struktur, Funktion, Palpation, Innervation, Bewegung und klinischer Bezug bleiben unterscheidbar.', question: 'Welche Struktur führt zu welcher Funktion, und woran wäre das im Befund sichtbar?' }, icf: { intro: 'ICF wird als Zusammenhang von Körperfunktionen, Aktivitäten, Teilhabe, Umwelt, Person und Qualifiern geführt.', question: 'Ist dies Funktion, Aktivität, Teilhabe, Umweltfaktor oder personenbezogene Einordnung?' }, icd: { intro: 'ICD wird als Diagnoseordnung mit ergotherapeutischer Anschlussfrage geführt: Was bedeutet die Diagnose für Alltag, Sicherheit und Teilhabe?', question: 'Welche funktionelle Auswirkung ist relevant, ohne aus der Diagnose allein zu viel abzuleiten?' }, amdp: { intro: 'AMDP wird als deskriptiver Befundbaum geführt: Beurteilbarkeit, Beobachtung, Graduierung und Funktionswirkung bleiben getrennt.', question: 'Welche konkrete Situation, welches Zitat oder welche Beobachtung trägt die Graduierung?' }, persoenlichkeit: { intro: 'Persönlichkeitsmuster werden als Motive, Schemata, Schutz, Ressourcen, Kosten und Beziehungsmuster geordnet.', question: 'Was schützt dieses Muster, was kostet es, und welche Beziehungsgestaltung hilft?' }, gefuehl: { intro: 'Gefühle werden als Signale geführt und mit Körperempfinden, Auslöser, Gedanken, Bedürfnis und Bitte verbunden.', question: 'Ist es ein echtes Gefühl, ein Gedanke über andere oder ein Hinweis auf ein Bedürfnis?' }, beduerfnis: { intro: 'Bedürfnisse werden als Qualitäten geordnet. Strategien bleiben unterscheidbar und können als eigene Kinder angelegt werden.', question: 'Welche Qualität ist gemeint, und welche konkrete Strategie versucht sie zu erfüllen?' } }; function cleanKind(kind = '') { const k = String(kind || '').toLowerCase(); if (k === 'gefühl') return 'gefuehl'; if (k === 'bedürfnis') return 'beduerfnis'; if (k === 'persönlichkeit' || k === 'persoenlichkeitsstoerungen' || k === 'persönlichkeitsstörungen') return 'persoenlichkeit'; return k || 'empty'; } function uid(prefix) { return `${prefix}-${Date.now()}-${Math.floor(Math.random() * 99999)}`; } function block(title, text, scales) { return { id: uid('block'), type: 'text', title, text, scales: Array.isArray(scales) ? scales : [], }; } function depthOf(nodes, node) { let d = 0; let cursor = node; const seen = new Set(); while (cursor?.parentId && nodes[cursor.parentId] && !seen.has(cursor.parentId)) { seen.add(cursor.parentId); d += 1; cursor = nodes[cursor.parentId]; } return d; } function pathTitles(nodes, node) { const out = []; let cursor = node; const seen = new Set(); while (cursor && !seen.has(cursor.id)) { seen.add(cursor.id); out.unshift(cursor.title || 'Kreis'); cursor = cursor.parentId ? nodes[cursor.parentId] : null; } return out; } function roleForDepth(depth) { if (depth ({ id: s?.id || uid('scale'), label: s?.label || (index === 0 ? fallbackLabel : 'Skala'), value: Number.isFinite(s?.value) ? s.value : 5, min: Number.isFinite(s?.min) ? s.min : 0, max: Number.isFinite(s?.max) ? s.max : 10, })); return valid; } function normalizeBlocksForNode({ node, nodes, kindInfo }) { const depth = depthOf(nodes, node); const role = roleForDepth(depth); const path = pathTitles(nodes, node); const legacyScales = Array.isArray(node.scales) ? node.scales : []; const existing = Array.isArray(node.blocks) ? node.blocks : []; let blocks = existing.map((b, index) => ({ id: b?.id || uid('block'), type: b?.type || 'text', title: b?.title || (index === 0 ? 'Kern' : `Textblock ${index + 1}`), text: typeof b?.text === 'string' ? b.text : '', scales: normalizeBlockScales(index === 0 ? [...(b?.scales || []), ...legacyScales] : b?.scales, 'Skala'), structureRole: b?.structureRole || role, chapterPath: Array.isArray(b?.chapterPath) && b.chapterPath.length ? b.chapterPath : path, sourceNodeId: b?.sourceNodeId || node.id, })); const nodeText = String(node.text || '').trim(); if (!blocks.length && nodeText) { blocks = [block('Kern', nodeText, legacyScales)]; } if (!blocks.length) { blocks = [block('Kern', kindInfo.intro, legacyScales)]; } const hasQuestion = blocks.some(b => /frage|beobachtung|prüfung|check/i.test(String(b.title || ''))); if (!hasQuestion) { blocks.push(block('Arbeitsfrage', kindInfo.question)); } const hasLinkBlock = blocks.some(b => /verknüpf|unterkapitel|kinder|anschluss/i.test(String(b.title || ''))); if (!hasLinkBlock) { const childHint = (node.children || []).length ? `Unterkapitel: ${(node.children || []).map(id => nodes[id]?.title).filter(Boolean).slice(0, 8).join(', ')}.` : 'Noch keine Unterkapitel. Lege ein Polygonkind an, wenn aus diesem Abschnitt ein eigenes Kapitel wird.'; blocks.push(block('Verknüpfungen', childHint)); } return blocks.map((b, index) => ({ ...b, order: Number.isFinite(b.order) ? b.order : index, structureRole: b.structureRole || role, chapterPath: Array.isArray(b.chapterPath) && b.chapterPath.length ? b.chapterPath : p


## // v4.0.190: Baumstruktur-Pass für alle Vorlagen mit zusätzlicher Blätter-/Wiesenlogik.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/templates/treeV189.js

// v4.0.190: Baumstruktur-Pass für alle Vorlagen mit zusätzlicher Blätter-/Wiesenlogik. // v4.0.189: Baumstruktur-Pass für alle Vorlagen. // Ziel: Root -> Wurzel/Stamm/Hauptäste/Krone/Blätter, damit Vorlagen // nicht als flache Liste starten, sondern als lesbare Baumwelt. const now = () => Date.now(); function norm(value = '') { return String(value || '').trim().toLowerCase(); } function hashText(text = '') { let h = 2166136261; String(text).split('').forEach(ch => { h ^= ch.charCodeAt(0); h = Math.imul(h, 16777619); }); return Math.abs(h | 0); } function branchTitleForKind(kind = '') { const k = norm(kind); const special = { befundung: ['Wurzel: Alltag & Anlass', 'Stamm: Beobachtung & Hypothese', 'Hauptäste: Ziele & Intervention', 'Krone: Transfer & Bericht', 'Blätter: Übungsfragen & Quellen'], gerg: ['Wurzel: Haltung', 'Stamm: Betätigung', 'Hauptäste: Modelle', 'Krone: Praxis', 'Blätter: Übungsfragen & Quellen'], anatomie: ['Wurzel: Struktur', 'Stamm: Funktion', 'Hauptäste: Bewegung & Versorgung', 'Krone: Alltag & Befund', 'Blätter: Übungsfragen & Quellen'], icf: ['Wurzel: Gesundheitsproblem', 'Stamm: Funktionsfähigkeit', 'Hauptäste: Aktivität & Teilhabe', 'Krone: Kontext', 'Blätter: Qualifier & Beispiele'], icd: ['Wurzel: Diagnosekapitel', 'Stamm: Symptome & Verlauf', 'Hauptäste: Funktionswirkung', 'Krone: Risiko & Therapie', 'Blätter: Quellen & Fragen'], amdp: ['Wurzel: Beurteilbarkeit', 'Stamm: Beobachtung', 'Hauptäste: Symptomgruppen', 'Krone: Risiko & Handlung', 'Blätter: Belege & Unsicherheit'], persoenlichkeit: ['Wurzel: Motiv & Schutz', 'Stamm: Muster', 'Hauptäste: Beziehung & Kosten', 'Krone: Ressourcen & Antwort', 'Blätter: Mikroschritte'], gefuehl: ['Wurzel: Körperzeichen', 'Stamm: Gefühl', 'Hauptäste: Bedürfnis', 'Krone: Bitte & Grenze', 'Blätter: Selbstempathie'], beduerfnis: ['Wurzel: Signal', 'Stamm: Bedürfnis', 'Hauptäste: Strategien', 'Krone: Bitte & Kontakt', 'Blätter: Beispiele'], empty: ['Wurzel: Ausgangspunkt', 'Stamm: Leitfrage', 'Hauptäste: Themen', 'Krone: Verbindungen', 'Blätter: Notizen'], }; return special[k] || ['Wurzel', 'Stamm', 'Hauptäste', 'Krone', 'Blätter']; } function guideForBranch(title = '', kind = '') { const t = norm(title); if (t.includes('wurzel')) return 'Was trägt dieses Thema? Anlass, Kontext, Sicherheit, bisherige Erfahrung und erste Beobachtung.'; if (t.includes('stamm')) return 'Was ist der tragende Gedanke? Leitfrage, Kernbegriff, Hauptfunktion oder Hypothese.'; if (t.includes('haupt')) return 'Welche großen Äste wachsen daraus? Trenne wichtige Arbeitsbereiche, statt alles in einen Text zu drücken.'; if (t.includes('krone')) return 'Was wird sichtbar, wenn das Thema in Alltag, Praxis, Prüfung, Bericht oder Beziehung hineinwächst?'; return 'Feine Blätter: Übungsfragen, Belege, Beispiele, offene Fragen und kleine nächste Schritte.'; } function bucketIndexForNode(node = {}) { const text = norm(`${node.title || ''} ${node.text || ''}`); if (/anamnese|alltag|anlass|körperzeichen|diagnose|beurteilbarkeit|motiv|schutz|struktur|gesundheitsproblem|signal/.test(text)) return 0; if (/hypothese|beobachtung|funktion|gefühl|bedürfnis|betätigung|symptom|muster|leitfrage|kern/.test(text)) return 1; if (/ziel|intervention|modell|aktivität|teilhabe|bewegung|versorgung|strategie|symptomgruppe|beziehung/.test(text)) return 2; if (/transfer|bericht|praxis|kontext|risiko|ressource|antwort|bitte|grenze|therapie/.test(text)) return 3; return 4; } function leafSuggestionsForBranch(kind = '', branchIndex = 0) { const k = norm(kind); const common = [ ['Ausgangspunkt', 'Was ist der Ausgangspunkt dieses Astes?'], ['Beobachtung', 'Was ist sichtbar, hörbar, fühlbar oder messbar?'], ['Verbindung', 'Womit hängt dieser Ast zusammen?'], ['Transfer', 'Wo zeigt sich dieser Ast im Alltag oder Lernen?'], ['Quelle', 'Welche Quelle oder Unsicherheit gehört hierher?'], ]; const special = { anatomie: [['Struktur ertasten', 'Welche Struktur ist tastbar, beweglich oder funktionell relevant?'], ['Funktion prüfen', 'Welche Bewegung, Sensibilität oder Belastung gehört dazu?'], ['Alltag übersetzen', 'Wie wird daraus Handlung, Schiene, Übung oder Befund?']], befundung: [['Anlass klären', 'Was führt zur Befundung?'], ['Hypothese prüfen', 'Welche Beobachtung bestätigt oder widerlegt die Annahme?'], ['Ziel ableiten', 'Welche alltagsnahe nächste Stufe entsteht daraus?']], gefuehl: [['Körperzeichen', 'Wo zeigt sich das Gefühl im Körper?'], ['Bedürfnis hören', 'Welches Bedürfnis spricht darunter?'], ['Bitte formen', 'Welche konkrete Bitte wäre möglich?']], beduerfnis: [['Signal', 'Woran erkenne ich dieses Bedürfnis?'], ['Strategie', 'Welche Wege können es nähren?'], ['Grenze', 'Welche Grenze schützt es?']], amdp: [['Beurteilbarkeit', 'Wie zuverlässig ist die Beobachtung?'], ['Symptomhinweis', 'Was ist deskriptiv sichtbar?'], ['Risiko', 'Welche Handlungsrelevanz entsteht?']], icf: [['Funktion', 'Welche Körperfunktion ist beteiligt?'], ['Aktivität', 'Welche Handlung ist betroffen?'], ['Kontext', 'Welche Umwelt hilft oder hemmt?']], gerg: [['Bedeutung', 'Warum ist diese Betätigung bedeutsam?'], ['Prozess', 'Wie wird daraus ergotherapeutisches Handeln?'], ['Beispiel', 'Welcher Praxisfall macht es sichtbar?']], }; const pool = special[k] || common; return [pool[branchIndex % pool.length], pool[(branchIndex + 1) % pool.length]].map(([title, text]) => ({ title, text })); } function createBranchNode({ makeNode, id, title, color, parentId, symbolKey, text, createdAt }) { return makeNode(id, title, color, [], { parentId, createdAt, updatedAt: createdAt, symbolKeys: [symbolKey, 'tree'], symbolKey, text, }); } export function applyTemplateTreeWorldV189(map, kind = '', helpers = {}) { const makeNode = helpers.makeNode; const normalizeMap = helpers.normalizeMap || (value => value); const palette = Array.isArray(helpers.palette) && helpers.palette.length ? helpers.palette : ['#7df0ff', '#7affb7', '#ff8bdc', '#ffe36a']; if (!makeNode || !map?.nodes || !map?.roots?.length || map.treeWorldV189) return map; con


## // v4.0.179: Arbeitsnavigation und sichtbare Vorlagenwelt getrennt vom Modellkern.
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/templates/workflowV162.js

// v4.0.179: Arbeitsnavigation und sichtbare Vorlagenwelt getrennt vom Modellkern. const now = () => Date.now(); const uid = prefix => `${prefix}-${Date.now()}-${Math.floor(Math.random() * 99999)}`; const block = (title, text) => ({ id: uid('block'), type: 'text', title, text }); const scale = (label, value = 5, min = 0, max = 10) => ({ id: uid('scale'), label, value, min, max }); function hashText(text = '') { let h = 2166136261; String(text).split('').forEach(ch => { h ^= ch.charCodeAt(0); h = Math.imul(h, 16777619); }); return h | 0; } export function enrichTemplateWorldV162(map, kind = '', helpers = {}) { const { makeNode, normalizeMap, palette } = helpers; const PALETTE = Array.isArray(palette) && palette.length ? palette : ['#7df0ff', '#ff76d8', '#7affb7', '#fff4c4']; if (!makeNode || !normalizeMap) return map; if (!map?.nodes || !map?.roots?.length || map.enrichedV162) return map; const normalizedKind = String(kind || map.templateKind || '').toLowerCase(); if (normalizedKind === 'empty') return normalizeMap({ ...map, enrichedV162: true }); const t = now(); let nodes = { ...map.nodes }; const rootId = map.roots[0]; const root = nodes[rootId]; if (!root) return map; const existing = new Set((root.children || []).map(id => String(nodes[id]?.title || '').toLowerCase())); const nextChildren = [...(root.children || [])]; const templates = templateWorkflowV162(normalizedKind); templates.forEach((item, index) => { if (!item?.title || existing.has(String(item.title).toLowerCase())) return; const id = `${rootId}-v162-${Math.abs(hashText(`${normalizedKind}-${item.title}-${index}`))}`; nodes[id] = makeNode(id, item.title, PALETTE[(index + 5) % PALETTE.length], [], { parentId: rootId, createdAt: t + index + 1, symbolKey: item.symbolKey || 'diamond', text: item.text || '', blocks: item.blocks || [], scales: item.scales || [], }); nextChildren.push(id); }); const rootBlocks = Array.isArray(root.blocks) ? root.blocks : []; const hasNavigator = rootBlocks.some(b => String(b.title || '').toLowerCase() === 'arbeitsnavigation'); nodes[rootId] = { ...root, children: nextChildren, updatedAt: t, blocks: hasNavigator ? rootBlocks : [ ...rootBlocks, block('Arbeitsnavigation', templateWorkflowGuideV162(normalizedKind)), ], }; return normalizeMap({ ...map, nodes, updatedAt: t, enrichedV162: true }); } function templateWorkflowGuideV162(kind = '') { const map = { befundung: '1. Gespräch und Beobachtung trennen. 2. Betätigung und Teilhabe markieren. 3. ICF-Brücke setzen. 4. Ziel klein, prüfbar und alltagsnah formulieren. 5. Intervention nur aus sichtbarer Hypothese ableiten.', gerg: '1. Begriff klären. 2. Modellbezug herstellen. 3. Praxisbeispiel ergänzen. 4. Übungsfrage anlegen. 5. Offene Frage als Kreis stehen lassen.', icf: '1. Gesundheitsproblem nicht mit Funktionsfähigkeit verwechseln. 2. Aktivität/Teilhabe konkret benennen. 3. Umwelt als Förderfaktor oder Barriere markieren. 4. Qualifier nur mit Begründung setzen.', icd: '1. Diagnosekapitel nur als Orientierung nutzen. 2. Symptome, Risiko und Funktionswirkung sammeln. 3. Ergotherapeutische Konsequenz notieren. 4. Quellen und Unsicherheiten markieren.', amdp: '1. Beurteilbarkeit prüfen. 2. Beobachtung oder Aussage notieren. 3. Symptomgruppe einordnen. 4. Graduierung begründen. 5. Relevanz für Handlung und Sicherheit klären.', persoenlichkeit: '1. Muster nicht bewerten. 2. Schutzfunktion suchen. 3. Ressource benennen. 4. Kosten in Beziehung und Betätigung erkennen. 5. Kleine neue Handlungsmöglichkeit ableiten.', anatomie: '1. Struktur finden. 2. Funktion ableiten. 3. Innervation und Versorgung prüfen. 4. Bewegung oder Alltagshandlung verbinden. 5. Klinischen Bezug ergänzen.', gefuehl: '1. Gefühl von Gedankenurteil trennen. 2. Körperzeichen notieren. 3. Bedürfnisbezug suchen. 4. Bitte oder Grenze formulieren. 5. Auslöser nicht mit Ursache verwechseln.', beduerfnis: '1. Bedürfnis als universell lesen. 2. Strategie davon trennen. 3. Gefühl koppeln. 4. erfüllte und unerfüllte Seite benennen. 5. konkrete Bitte ableiten.', }; return map[kind] || '1. Sammeln. 2. Ordnen. 3. Verknüpfen. 4. Prüfen. 5. Nächsten kleinen Schritt festlegen.'; } function templateWorkflowV162(kind = '') { const common = { start: { title: 'Startfragen', symbolKey: 'compass', text: 'Womit beginne ich? Was ist gerade wichtig, sichtbar, unklar oder betätigungsrelevant?', blocks: [block('Kurzcheck', 'Was sehe ich? Was berichtet die Person? Was ist meine Hypothese? Was wäre der kleinste nächste Prüfschritt?')] }, learn: { title: 'Übungsfragen', symbolKey: 'book', text: 'Hier können Frage-Antwort-Kreise oder Textblockpaare entstehen. Ein Textblock kann die Frage, ein zweiter die Antwort tragen.' }, source: { title: 'Quellen und Unsicherheit', symbolKey: 'shield', text: 'Hier bleiben Quellen, offene Punkte, Prüfbedarf und fachliche Unsicherheit sichtbar, statt im Fließtext zu verschwinden.' }, }; const specific = { befundung: [common.start, { title: 'Betätigungsanker', symbolKey: 'hand', text: 'Welche konkrete Betätigung ist betroffen, bedeutungsvoll oder therapeutisch nutzbar?', scales: [scale('Betätigungsrelevanz', 5)] }, { title: 'Hypothesenprüfung', symbolKey: 'scale', text: 'Welche Beobachtung stützt oder schwächt die Hypothese? Was muss im nächsten Termin geprüft werden?' }, common.learn, common.source], gerg: [common.start, { title: 'Modelle', symbolKey: 'map', text: 'CMOP-E, MOHO, ICF, Betätigung, Klientenzentrierung und therapeutischer Prozess werden hier verknüpft.' }, { title: 'Praxisbeispiele', symbolKey: 'hand', text: 'Beispiele aus Sichtstunde, Praktikum, Schule und Alltag sammeln.' }, common.learn, common.source], icf: [common.start, { title: 'Aktivität und Teilhabe', symbolKey: 'people', text: 'Konkrete Lebenssituation, Aufgabe, Rolle oder Teilhabeform notieren.' }, { title: 'Umweltcheck', symbolKey: 'home', text: 'Welche Umweltfaktoren fördern oder behindern? Raum, Material, Beziehung, Einstellung, System.' }, common.learn, common.source], icd: [common.start, { title: 'Funktions


## export const PALETTE = [
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/core/theme.js

export const PALETTE = [ // v4.0.542: auf 16 klare Regenbogenfarben reduziert und fest sortiert. // Nach Farbe 16 beginnt die App wieder bei Farbe 1. '#ff2f55', // rot '#ff5a1f', // rotorange '#ff8a00', // orange '#ffc400', // gold '#f4ff3d', // gelb '#a3ff00', // gelbgrün '#47ff00', // grün '#23e46c', // smaragd '#00e5b0', // mint '#16e5be', // türkis '#24d9ff', // cyan '#4584ff', // blau '#7656ff', // indigo '#8b2cff', // violett '#d13cff', // magenta '#ff40b4', // pink ]; export const theme = { bg: '#000000', panel: 'rgba(8, 17, 45, 0.82)', panelSoft: 'rgba(19, 36, 82, 0.62)', text: '#fffbe2', textSoft: 'rgba(255,250,226,0.74)', line: 'rgba(130, 246, 255, 0.58)', shadow: 'rgba(0,0,0,0.46)', focusBorder: 'rgba(255,255,255,0.20)', radius: 22, footerBottom: 24, }; export const initialColor = PALETTE[7];


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/CosmosContentField.js

import React from 'react'; import { StyleSheet, Text, View } from 'react-native'; import Svg, { Path, Circle } from 'react-native-svg'; import { fractalStringPath, membraneStringPath } from './fractalStrings'; import { theme } from '../core/theme'; const DEFAULT_W = 390; const DEFAULT_H = 844; const STOP_WORDS = new Set('und oder aber auch der die das den dem des ein eine einer einem einen zu zum zur in im am an auf aus mit von für über unter nach vor bei ist sind war wird werden wurde haben hat nicht nur als wie sich ich du wir ihr sie er es da so dass weil wenn dann noch schon sehr mehr viel hier dort'.split(' ')); export function CosmosContentField({ width = DEFAULT_W, height = DEFAULT_H, items = [], variant = 'stage', intensity = 1, maxItems = 42, selectedKey = null, showGlyphs = true, active = true }) { const [phase, setPhase] = React.useState(0); React.useEffect(() => { if (!active || !items.length || maxItems { if (!alive) return; setPhase(p => (p + 0.096) % (Math.PI * 2000)); id = setTimeout(tick, variant === 'stage' ? 88 : 72); }; tick(); return () => { alive = false; if (id) clearTimeout(id); }; }, [active, items.length, maxItems, variant]); const w = Math.max(1, width || DEFAULT_W); const h = Math.max(1, height || DEFAULT_H); const prepared = React.useMemo(() => active ? prepareItems(items, w, h, maxItems, selectedKey) : [], [active, items, w, h, maxItems, selectedKey]); const moved = React.useMemo(() => prepared.map((item, index) => moveItem(item, index, phase, intensity, variant)), [prepared, phase, intensity, variant]); const links = React.useMemo(() => buildContentLinks(moved, variant), [moved, variant]); if (!active || !prepared.length) return null; return {moved.filter(item => item.surface).slice(0, variant === 'stage' ? 18 : 12).map((item, index) => )} {links.map((link, index) => 1 ? 3 : 2, amplitude: link.weight > 1 ? 20 : 12, speed: link.weight > 1 ? 0.12 : 0.070, drift: 0.58 })} fill="none" stroke={link.color} strokeWidth={link.weight * 0.82} opacity={Math.min(0.66, link.opacity * 1.02)} strokeLinecap="round" />)} {moved.map((item, index) => )} {showGlyphs ? moved.map((item, index) => ) : null} ; } export function wordsFromText(text = '', limit = 14) { const seen = new Set(); return String(text || '') .replace(/[^\p{L}\p{N}äöüÄÖÜß\- ]/gu, ' ') .split(/\s+/) .map(w => w.trim()) .filter(Boolean) .filter(w => w.length > 3) .filter(w => !STOP_WORDS.has(w.toLowerCase())) .filter(w => { const key = w.toLowerCase(); if (seen.has(key)) return false; seen.add(key); return true; }) .slice(0, limit); } export function anchorsFromContentItems(items = [], max = 44) { return (items || []) .filter(item => item && Number.isFinite(Number(item.x)) && Number.isFinite(Number(item.y))) .sort((a, b) => (b.focus ? 1000 : 0) + (b.weight || 0) - ((a.focus ? 1000 : 0) + (a.weight || 0))) .slice(0, max) .map((item, index) => ({ x: Number(item.x), y: Number(item.y), key: item.key || `content-anchor-${index}`, parentKey: item.parentKey || null, kind: item.kind || 'content', color: typeof item.color === 'string' && item.color.startsWith('#') ? item.color : null, primary: !!item.focus || index item && String(item.text || '').trim()) .map((item, index) => ({ ...item, text: compactText(item.text), anchorX: clamp(Number(item.x), -80, w + 80), anchorY: clamp(Number(item.y), -80, h + 80), x: clamp(Number(item.x), -80, w + 80), y: clamp(Number(item.y), -80, h + 80), key: item.key || `content-${index}`, color: item.color || 'rgba(88,231,255,0.46)', depth: Number.isFinite(item.depth) ? item.depth : 1, focus: item.focus || (selectedKey && item.key === selectedKey), surface: item.surface !== false, rank: Number.isFinite(item.rank) ? item.rank : index, kind: item.kind || 'content', })) .sort((a, b) => (b.focus ? 1000 : 0) + (b.weight || 0) - ((a.focus ? 1000 : 0) + (a.weight || 0))) .slice(0, Math.max(4, maxItems)); } function moveItem(item, index, phase, intensity, variant) { const depth = clamp(item.depth || 1, 0, 8); const baseAmp = variant === 'focus' ? 10.4 : variant === 'library' ? 11.6 : 14.8; const amp = baseAmp * intensity * (item.focus ? 0.34 : 0.86) / (1 + depth * 0.14); const macro = item.kind === 'map' || item.kind === 'node'; const slow = phase * (macro ? 0.46 : 0.88) + index * 0.77 + depth * 0.21; const fast = phase * (macro ? 0.20 : 0.52) + index * 1.37; return { ...item, x: item.anchorX + Math.sin(slow) * amp + Math.cos(fast) * amp * 0.48, y: item.anchorY + Math.cos(slow * 0.82) * amp + Math.sin(fast * 0.71) * amp * 0.42, }; } function buildContentLinks(items, variant) { const limit = variant === 'stage' ? 128 : variant === 'library' ? 86 : 82; const out = []; for (let i = 0; i ({ b, j, d: i === j ? Infinity : Math.hypot(a.x - b.x, a.y - b.y) })) .filter(row => row.d p.d - q.d) .slice(0, a.focus ? 5 : a.kind === 'word' ? 2 : 3); nearest.forEach(({ b, j, d }, n) => { if (j a.d - b.d).slice(0, limit); } function ContentGlyph({ item, index }) { const depth = clamp(item.depth || 0, 0, 8); const isWord = item.kind === 'word'; const width = Math.max(isWord ? 46 : 62, Math.min(item.focus ? 204 : 168, 28 + String(item.text).length * (item.focus ? 8.4 : isWord ? 6.1 : 7.0))); const scale = item.focus ? 1.08 : clamp((isWord ? 0.82 : 0.94) - depth * 0.035, 0.58, 0.94); const opacity = item.focus ? 0.96 : clamp((isWord ? 0.20 : 0.36) - depth * 0.030, 0.10, 0.42); const rotate = `${((index % 5) - 2) * (isWord ? 0.9 : 1.2)}deg`; return {item.text} ; } function facetPoints(item, index) { const r = item.focus ? 54 : item.kind === 'word' ? 18 + (index % 3) * 3 : 30 + (index % 4) * 5; return [ { x: item.x - r * 0.9, y: item.y - r * 0.42 }, { x: item.x + r * 0.65, y: item.y - r * 0.56 }, { x: item.x + r, y: item.y + r * 0.36 }, { x: item.x - r * 0.38, y: item.y + r * 0.62 }, ]; } function compactText(text = '') { const clean = String(text || '').replace(/\s+/g, ' ').trim(); if (clean.length <= 28) return clean; return clean.slice(0, 26).trim() + '…'; } function clamp(v, min, max) { return Math.max(min, Math.mi


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/DissolveStructureField.js

import React from 'react'; import { StyleSheet, View } from 'react-native'; import Svg, { Circle, Path } from 'react-native-svg'; import { fractalStringPath, membraneStringPath, relationStringStyle } from './fractalStrings'; const DEFAULT_W = 390; const DEFAULT_H = 844; export function DissolveStructureField({ map, shapes = [], width = DEFAULT_W, height = DEFAULT_H, selectedId = null, intensity = 1, maxLinks = 96, maxSurfaces = 28, active = true }) { const [phase, setPhase] = React.useState(0); React.useEffect(() => { if (!active || !shapes.length || maxLinks { if (!alive) return; setPhase(p => (p + 0.044) % (Math.PI * 2000)); id = setTimeout(tick, 104); }; tick(); return () => { alive = false; if (id) clearTimeout(id); }; }, [active, shapes.length, maxLinks]); const w = Math.max(1, width || DEFAULT_W); const h = Math.max(1, height || DEFAULT_H); const data = React.useMemo(() => active ? buildStructure(map, shapes, selectedId, maxLinks, maxSurfaces) : { anchors: [], links: [], surfaces: [] }, [active, map, shapes, selectedId, maxLinks, maxSurfaces]); const moved = React.useMemo(() => data.anchors.map((p, index) => wobble(p, index, phase, intensity)), [data.anchors, phase, intensity]); const byKey = React.useMemo(() => new Map(moved.map(p => [p.key, p])), [moved]); const links = data.links.map(link => ({ ...link, a: byKey.get(link.aKey), b: byKey.get(link.bKey) })).filter(link => link.a && link.b); const surfaces = data.surfaces.map(surface => surface.keys.map(key => byKey.get(key)).filter(Boolean)).filter(poly => poly.length >= 3); if (!active || !data.anchors.length) return null; return {surfaces.map((poly, index) => )} {links.map((link, index) => { const macro = !link.primary && (link.power || 1) ; })} {moved.map((p, index) => )} ; } function buildStructure(map, shapes = [], selectedId = null, maxLinks = 96, maxSurfaces = 28) { const nodes = map?.nodes || {}; const realShapes = (shapes || []).filter(shape => shape?.center && !shape.labelOnly); const byNode = new Map(realShapes.map(shape => [shape.nodeId, shape]).filter(([id]) => id)); const anchors = []; const links = []; const surfaces = []; realShapes.forEach((shape, index) => { const isSelected = shape.nodeId === selectedId; anchors.push({ key: `node-${shape.nodeId}`, x: shape.center.x, y: shape.center.y, depth: shape.depth || 0, primary: isSelected || index { if (vertexIndex > 5 && vertexIndex % 2) return; const key = `vertex-${shape.nodeId}-${vertexIndex}`; anchors.push({ key, x: p.x, y: p.y, depth: (shape.depth || 0) + 0.4, primary: isSelected && vertexIndex = 3 && (isSelected || index { if (!node?.id || !node.parentId) return; const child = byNode.get(node.id); const parent = byNode.get(node.parentId); if (!child || !parent) return; const primary = node.id === selectedId || node.parentId === selectedId; links.push({ aKey: `node-${node.parentId}`, bKey: `node-${node.id}`, primary, power: primary ? 1.8 : 1.16 }); const parentVertex = nearestVertexKey(parent, child.center); const childVertex = nearestVertexKey(child, parent.center); if (parentVertex && childVertex && surfaces.length { const d = Math.hypot(p.x - point.x, p.y - point.y); if (d { if (!item?.key || seen.has(item.key)) return false; seen.add(item.key); return true; }); } function wobble(p, index, phase, intensity) { const depth = Math.max(0, Math.min(8, p.depth || 0)); const macro = p.kind === 'node'; const amp = (p.primary ? 1.8 : macro ? 2.4 : 3.2) * intensity / (1 + depth * 0.20); const slow = phase * (macro ? 0.46 : 0.72) + index * 0.61 + depth * 0.33; const fast = phase * (macro ? 0.24 : 0.56) + index * 1.47; return { ...p, x: p.x + Math.sin(slow) * amp + Math.cos(fast) * amp * 0.52, y: p.y + Math.cos(slow * 0.82) * amp + Math.sin(fast * 0.66) * amp * 0.45, }; }


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/FocusRoom.js

import React from 'react'; import { Alert, Keyboard, KeyboardAvoidingView, Platform, ScrollView, View, Text, TextInput, Pressable, StyleSheet, Dimensions, Animated, Image } from 'react-native'; import * as ImagePicker from 'expo-image-picker'; import { Ionicons } from '@expo/vector-icons'; import { PALETTE, theme } from '../core/theme'; import { PolygonView } from './PolygonView'; import { SYMBOLS } from '../core/assets'; import { getDesignThemeProfile } from '../core/designThemes'; import { FocusEntryActionBar } from './focus/FocusEntryActionBar'; import { FocusTimelineAxis } from './focus/FocusTimelineAxis'; import { FocusEditField } from './focus/FocusEditField'; import { FocusScaleRow } from './focus/FocusScaleRow'; import { FocusWordText } from './focus/FocusWordText'; export function FocusRoom({ map, nodeId, wordIndex = {}, onClose, onCloseFocus, onSelectNode, onOpenWordLink, onNodeChange, onMapTitleChange, onAddTextBlock, onUpdateTextBlock, onDeleteTextBlock, onAddScale, onUpdateScale, onDeleteScale, onAddBlockScale, onUpdateBlockScale, onDeleteBlockScale, onAddBlockScaleToNode, onUpdateBlockScaleForNode, onDeleteBlockScaleForNode, onDelete, onAddChild, onAddChildTo, onAddWordChildrenTo, onDeleteNode, onDuplicateNode, onPromoteNodeToMap, onAddTextBlockToNode, onUpdateTextBlockForNode, onNext, onUndo, canUndo = false, designTheme = 'gradient', readOnly = false }) { const node = map.nodes[nodeId]; const designProfile = getDesignThemeProfile(designTheme); const [selectedWords, setSelectedWords] = React.useState([]); const [activeTarget, setActiveTarget] = React.useState({ kind: 'main' }); const [editTarget, setEditTarget] = React.useState(null); const [colorMode, setColorMode] = React.useState('black'); const [anchorOpen, setAnchorOpen] = React.useState(false); const [suggestionsOpen, setSuggestionsOpen] = React.useState(false); const [wikiUndo, setWikiUndo] = React.useState(null); const [wikiQuery, setWikiQuery] = React.useState(null); const tapRef = React.useRef({ t: 0, id: null, timer: null }); const scrollRef = React.useRef(null); const currentRailYRef = React.useRef(0); const manualScrollUntilRef = React.useRef(0); const editAutoScrollUntilRef = React.useRef(0); const lastScrollYRef = React.useRef(0); const focusStructure = React.useMemo(() => buildFocusBlockStructure(map, nodeId), [map, nodeId]); React.useEffect(() => () => { if (tapRef.current.timer) clearTimeout(tapRef.current.timer); }, []); React.useEffect(() => { const firstBlockId = map?.nodes?.[nodeId]?.blocks?.[0]?.id; setSelectedWords([]); setActiveTarget(firstBlockId ? { kind: 'block', id: firstBlockId } : { kind: 'main' }); setEditTarget(null); setAnchorOpen(false); setSuggestionsOpen(false); setWikiQuery(null); }, [map?.id, nodeId]); const focusScreen = Dimensions.get('window'); // v4.0.393: Der globale ITMO-/Suchkopf bleibt sichtbar. // Das Fokusfenster fährt darunter hoch, statt am Bildschirmrand zu kleben. const focusTopInset = 0; const focusLandscape = focusScreen.width > focusScreen.height; const focusBottomClearance = focusLandscape ? 188 : 340; const focusTimeline = Array.isArray(focusStructure?.timeline) ? focusStructure.timeline : []; const focusTimelineCurrentIndex = Math.max(0, focusTimeline.findIndex(entry => entry?.current && !entry?.textBlockOnly)); const handleFocusTimelineJump = React.useCallback((entry, index) => { if (!entry) return; const currentNodeId = focusTimeline[focusTimelineCurrentIndex]?.node?.id || nodeId; if (entry.node?.id && entry.node.id !== currentNodeId) { onSelectNode?.(entry.node.id); return; } if (entry.block?.id && !readOnly) { const target = { kind: 'block', id: entry.block.id }; setActiveTarget(target); setEditTarget(null); } }, [focusTimeline, focusTimelineCurrentIndex, nodeId, onSelectNode, readOnly]); const windowDragY = React.useRef(new Animated.Value(focusScreen.height + 80)).current; const didEnterRef = React.useRef(false); React.useEffect(() => { if (didEnterRef.current) return; didEnterRef.current = true; Animated.timing(windowDragY, { toValue: 0, duration: 230, useNativeDriver: true }).start(); }, [windowDragY]); const closeFocusAnimated = React.useCallback(() => { Animated.timing(windowDragY, { toValue: focusScreen.height + 80, duration: 230, useNativeDriver: true }).start(() => { windowDragY.setValue(0); onCloseFocus?.(nodeId); }); }, [focusScreen.height, nodeId, onCloseFocus, windowDragY]); const cloudWords = React.useMemo(() => collectNewWords(node || {}, wordIndex), [node, wordIndex]); const suggestionsCount = cloudWords.length; React.useEffect(() => { if (!editTarget) return undefined; const alignEditor = (options = {}) => { const force = !!options.force; const now = Date.now(); if (!force && now editAutoScrollUntilRef.current) return; const y = Math.max(0, (currentRailYRef.current || 0) - 12); if (typeof requestAnimationFrame === 'function') requestAnimationFrame(() => scrollRef.current?.scrollTo?.({ y, animated: true })); setTimeout(() => scrollRef.current?.scrollTo?.({ y, animated: true }), 160); }; editAutoScrollUntilRef.current = Date.now() + 520; alignEditor({ force: true }); const onKeyboardShift = () => alignEditor({ force: false }); const showSub = Keyboard.addListener?.(Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow', onKeyboardShift); const changeSub = Keyboard.addListener?.(Platform.OS === 'ios' ? 'keyboardWillChangeFrame' : 'keyboardDidChangeFrame', onKeyboardShift); return () => { showSub?.remove?.(); changeSub?.remove?.(); }; }, [editTarget]); if (!node) return null; const beginEdit = target => { if (readOnly) return; editAutoScrollUntilRef.current = Date.now() + 520; manualScrollUntilRef.current = 0; setActiveTarget(target); setEditTarget(target); }; const closeEdit = () => setEditTarget(null); const toggleWord = word => setSelectedWords(list => toggleWordList(list, word)); const makeWordsPolygons = () => { const newWords = selectedWords.filter(w => !wordIndex[normalizeWord(w)]); if (!newWords.length) return; onAddWordChildrenTo?.(


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/LibraryPanel.js

import React from 'react'; import { View, Text, Pressable, TextInput, ScrollView, StyleSheet, Animated, Easing, useWindowDimensions, Alert, Platform, Image } from 'react-native'; import * as ImagePicker from 'expo-image-picker'; import * as Clipboard from 'expo-clipboard'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../core/theme'; import { TEMPLATE_DEFINITIONS as RAW_TEMPLATE_DEFINITIONS } from '../core/templates/definitions'; import { getSymbolDefinition } from '../core/assets'; import { OrganicThreads } from './OrganicThreads'; import { CosmosContentField, anchorsFromContentItems, wordsFromText } from './CosmosContentField'; const ITMO_ORIGIN_STRUCTURE_BACKGROUND = require('../../assets/itmo-origin-structure.jpg'); function classifyPromptImportClipboard(raw = '') { const text = String(raw || '').trim(); if (!text) return { ok: false, title: 'Antwort fehlt', message: 'Kopiere die ChatGPT-Antwort und tippe dann erneut auf Promptimport.' }; const hasHeading = /^\s*#{1,12}\s+\S+/m.test(text) || /^\s*\d+(?:\.\d+)*[.)]\s+\S+/m.test(text) || /^\s*Thema\s*:/im.test(text) || /---ITMO_KAPITEL_TEXT_START---/.test(text) || /---ITMO_JSON_START---/.test(text); const promptLike = /^\s*Erzeuge\s+eine\s+reine\s+ITMO-Kapitel-TXT/im.test(text) || /Antworte ausschließlich mit dem importierbaren Kapiteltext/i.test(text); if (promptLike && !hasHeading) return { ok: false, title: 'Noch der Prompt', message: 'In der Zwischenablage liegt noch der Arbeitsauftrag. Sende ihn zuerst an ChatGPT und kopiere danach die Antwort mit Thema-Zeile und Kapitelnummerierung.' }; const fencedHasHeading = /```[\s\S]*?(^\s*#{1,12}\s+\S+|^\s*\d+(?:\.\d+)*[.)]\s+\S+|^\s*Thema\s*:)[\s\S]*?```/m.test(text); const bareTitleLikely = !hasHeading && /plannedDirection\s*:/i.test(text) && text.split(/\r?\n/).map(line => line.trim()).filter(Boolean).length >= 4; if (!hasHeading && !fencedHasHeading && !bareTitleLikely) { return { ok: true, warning: 'Der Text enthält keine sichtbare Kapitelnummerierung. Ich versuche trotzdem den Reparaturimport.' }; } return { ok: true }; } export function LibraryPanel({ maps, activeMapId, allMapActive, itmoMapActive, allImagesMapActive = false, startOpen = true, footerOnly = false, onFooterThemeButton, onAllMap, onItmoMap, onAllImagesMap, onImportPhotos, onPickBackground, onSelectMap, onNewMap, onDeleteMap, onDuplicateMap, onCopyTemplate, onImport, onImportText, onExportMap, onResetLibrary, onClose, releaseSettings, onReleaseSettingsChange, onShareImage, onPrint, onCameraPress, onCameraLongPress, onUndo, canUndo = false, cameraActive = false, displayMode = 'organism', modeButtonVisible = true, onToggleMode, focusText = '', currentNode = null, focusMap = null, onFocusNodeChange = null }) { const [query, setQuery] = React.useState(''); const size = useWindowDimensions(); const wide = size.width > size.height; const cleanQuery = normalizeLibrarySearch(query); const filtered = React.useMemo(() => { if (!cleanQuery) return maps; return (maps || []).filter(m => mapMatchesLibrarySearch(m, cleanQuery)); }, [maps, cleanQuery]); const activeMap = maps.find(m => m.id === activeMapId) || maps[0]; const templateDefinitions = React.useMemo(() => Array.isArray(RAW_TEMPLATE_DEFINITIONS) ? RAW_TEMPLATE_DEFINITIONS : [], []); const stats = React.useMemo(() => makeLibraryStats(maps, activeMap), [maps, activeMap]); const listMaps = React.useMemo(() => (filtered || []).filter(m => { const kind = String(m?.templateKind || '').trim().toLowerCase(); const systemTemplate = ['kompass', 'anatomie', 'gefuehl', 'gefühl', 'beduerfnis', 'bedürfnis'].includes(kind); return !m?.systemMap && !systemTemplate; }), [filtered]); const photoTemplate = React.useMemo(() => stats.ownImages > 0 ? { kind: 'all-images', folder: 'Start', title: 'Alle Bilder', subtitle: `Alle ${stats.ownImages} Bildreferenzen aus allen Maps als eigene System-Baumkarte.`, symbolKey: 'image', systemTemplate: true } : null, [stats.ownImages]); const aiTemplate = React.useMemo(() => ({ kind: 'ai', folder: 'Start', title: 'AI', subtitle: 'Thema eingeben, Prompt kopieren, Antwort über Import neben der Suche übernehmen.', symbolKey: 'sparkles', systemTemplate: true }), []); const effectiveTemplateDefinitions = React.useMemo(() => [aiTemplate, ...(photoTemplate ? [photoTemplate] : []), ...templateDefinitions], [aiTemplate, photoTemplate, templateDefinitions]); const effectiveFolders = React.useMemo(() => buildTemplateFolders(effectiveTemplateDefinitions), [effectiveTemplateDefinitions]); const [templateFolder, setTemplateFolder] = React.useState('Alle'); const activeTemplateFolder = effectiveFolders.some(f => f.label === templateFolder) ? templateFolder : 'Alle'; const selectedTemplates = React.useMemo(() => { const source = activeTemplateFolder === 'Alle' ? effectiveTemplateDefinitions : effectiveTemplateDefinitions.filter(t => templateFolderForItem(t) === activeTemplateFolder); if (!cleanQuery) return source; return source.filter(t => templateMatchesLibrarySearch(t, cleanQuery)); }, [activeTemplateFolder, cleanQuery, effectiveTemplateDefinitions]); const designTheme = 'gradient'; const designThemeWash = 'rgba(0,0,0,0.18)'; const homeSeed = normalizeHomeSeed(releaseSettings?.homeSeed || ''); const cosmosItems = React.useMemo(() => buildLibraryCosmosItems(maps, filtered, cleanQuery, size.width, size.height, wide, homeSeed, selectedTemplates), [maps, filtered, cleanQuery, size.width, size.height, wide, homeSeed, selectedTemplates]); const [seedDraft, setSeedDraft] = React.useState(homeSeed); const [seedEditing, setSeedEditing] = React.useState(false); const seedInputRef = React.useRef(null); const seedClearingRef = React.useRef(false); const pulse = React.useRef(new Animated.Value(0)).current; const scrollY = React.useRef(new Animated.Value(0)).current; const [sheetMode, setSheetMode] = React.useState(startOpen ? 'start' : 'footer'); const [footerActionPanel, setFooterActionPanel] = React.useState(null); const initialAiPanelOpen = Boolean(releaseSett


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/OrganicThreads.js

import React from 'react'; import { StyleSheet, View } from 'react-native'; import Svg, { Path, Circle } from 'react-native-svg'; import { fractalStringPath, membraneStringPath, relationStringStyle } from './fractalStrings'; const DEFAULT_W = 390; const DEFAULT_H = 844; export function OrganicThreads({ width = DEFAULT_W, height = DEFAULT_H, anchors = [], variant = 'stage', intensity = 1, surface = true, maxAnchors = 34, fieldAnchors = null, active = true }) { const [phase, setPhase] = React.useState(0); React.useEffect(() => { if (!active || maxAnchors { if (!alive) return; setPhase(p => (p + 0.052) % (Math.PI * 2000)); id = setTimeout(tick, variant === 'stage' ? 96 : 78); }; tick(); return () => { alive = false; if (id) clearTimeout(id); }; }, [active, maxAnchors, variant]); const w = Math.max(1, width || DEFAULT_W); const h = Math.max(1, height || DEFAULT_H); const prepared = React.useMemo(() => { if (!active) return []; const real = normalizeAnchors(anchors, w, h); const fieldCount = Number.isFinite(fieldAnchors) ? fieldAnchors : (real.length ? (variant === 'stage' ? 5 : 3) : 10); const fields = buildFieldAnchors(w, h, variant, real, fieldCount); return [...real, ...fields] .filter(p => Number.isFinite(p.x) && Number.isFinite(p.y)) .slice(0, Math.max(10, maxAnchors)); }, [active, anchors, w, h, variant, maxAnchors, fieldAnchors]); const points = React.useMemo(() => prepared.map((p, index) => wobblePoint(p, index, phase, intensity)), [prepared, phase, intensity]); const links = React.useMemo(() => buildLinks(points, variant), [points, variant]); const membranes = React.useMemo(() => buildMembranes(points), [points]); const mainColor = variant === 'focus' ? 'rgba(255,244,197,0.34)' : variant === 'library' ? 'rgba(121,237,255,0.31)' : 'rgba(156,236,255,0.34)'; const realColor = variant === 'focus' ? 'rgba(255,244,197,0.96)' : 'rgba(238,251,255,0.94)'; if (!active || !prepared.length) return null; return {surface ? membranes.map((poly, index) => ) : null} {links.map((link, index) => { const macro = link.macro || (!link.relation && link.weight 1.35, relation: link.relation, macro, color: link.color }); const d = fractalStringPath(link.a, link.b, index, phase, { depth: 1, amplitude: macro ? 12 : 7, speed: macro ? 0.032 : 0.060, drift: 0.20 }); return ; })} {points.map((p, index) => )} ; } function normalizeAnchors(anchors, w, h) { return (anchors || []).map((a, index) => ({ x: clamp(a.x, -80, w + 80), y: clamp(a.y, -80, h + 80), key: a.key || `real-${index}`, parentKey: a.parentKey || null, kind: a.kind || 'anchor', color: a.color || null, real: true, primary: !!a.primary, strength: a.strength || (a.primary ? 1.65 : 1.12), })); } function buildFieldAnchors(w, h, variant, real, count) { if (!count) return []; const center = real.length ? real.reduce((acc, p) => ({ x: acc.x + p.x / real.length, y: acc.y + p.y / real.length }), { x: 0, y: 0 }) : { x: w / 2, y: h / 2 }; const radiusX = variant === 'stage' ? w * 0.46 : w * 0.38; const radiusY = variant === 'stage' ? h * 0.40 : h * 0.34; return Array.from({ length: Math.max(0, count) }, (_, i) => { const a = -Math.PI / 2 + (Math.PI * 2 * i) / Math.max(1, count) + (variant === 'library' ? 0.22 : 0); return { x: clamp(center.x + Math.cos(a) * radiusX * (0.64 + (i % 3) * 0.13), 18, w - 18), y: clamp(center.y + Math.sin(a) * radiusY * (0.62 + (i % 4) * 0.10), 22, h - 22), key: `field-${variant}-${i}`, real: false, strength: 0.82, }; }); } function wobblePoint(p, index, phase, intensity) { const realFactor = p.real ? 0.70 : 0.86; const macro = p.kind === 'stage-root' || p.kind === 'shape' || p.kind === 'ui'; const amp = (p.strength || 1) * realFactor * intensity * (macro ? 2.2 : p.real ? 3.4 : 1.8); const slow = phase * (macro ? 0.42 : 0.86) + index * 0.83; const fast = phase * (macro ? 0.22 : 0.52) + index * 1.71; return { ...p, x: p.x + Math.sin(slow) * amp + Math.cos(fast) * amp * 0.42, y: p.y + Math.cos(slow * 0.89) * amp + Math.sin(fast * 0.73) * amp * 0.36, }; } function buildLinks(points, variant) { const limit = variant === 'stage' ? 128 : variant === 'library' ? 86 : 78; const links = []; const byKey = new Map(points.map(p => [p.key, p])); points.forEach(p => { if (!p.parentKey) return; const parent = byKey.get(p.parentKey); if (!parent) return; links.push({ a: parent, b: p, weight: p.primary || parent.primary ? 1.72 : 1.22, relation: true, color: p.color || parent.color || null, macro: parent.kind === 'stage-root' || p.kind === 'shape' }); }); for (let i = 0; i ({ q, j, d: i === j ? Infinity : distance(p, q) })) .filter(item => item.d a.d - b.d) .slice(0, p.primary ? 5 : p.real ? 3 : 1); nearest.forEach(({ q, j }, n) => { if (j 230 }); }); } return links .sort((a, b) => (b.relation ? 1000 : 0) + b.weight - ((a.relation ? 1000 : 0) + a.weight)) .slice(0, limit); } function buildMembranes(points) { const real = points.filter(p => p.real).slice(0, 28); if (real.length { const key = p.parentKey || p.key; if (!byParent.has(key)) byParent.set(key, []); byParent.get(key).push(p); }); const out = []; Array.from(byParent.values()).forEach(group => { if (group.length >= 3) out.push(group.slice(0, 4)); }); for (let i = 0; i + 2 poly.length >= 3).slice(0, 10); } function distance(a, b) { return Math.hypot(a.x - b.x, a.y - b.y); } function clamp(v, min, max) { return Math.max(min, Math.min(max, Number.isFinite(v) ? v : min)); }


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/PolygonView.js

import React from 'react'; import { View, Text, StyleSheet } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import Svg, { Defs, ClipPath, Polygon as SvgPolygon, Image as SvgImage, Line as SvgLine, Circle as SvgCircle } from 'react-native-svg'; import { edgesOf } from '../core/geometry'; import { getImageSource, getSymbolDefinitions } from '../core/assets'; function segment(a, b) { const dx = b.x - a.x; const dy = b.y - a.y; return { left: a.x, top: a.y, width: Math.hypot(dx, dy), transform: [{ rotate: `${Math.atan2(dy, dx)}rad` }] }; } export function PolygonView({ shape, active = false, label = true, fill = false, showMedia = true, displayOptions }) { const color = shape.color || '#22c3da'; const edges = edgesOf(shape.points); const labelPoint = shape.displayLabel || shape.label || shape.center; const labelLift = shape.labelLift ?? -3; const display = normalizeDisplayOptions(displayOptions, showMedia); const directImage = display.showImages ? getImageSource(shape.imageKey, shape.imageUri) : null; const imageSource = directImage; const symbolKeys = Array.isArray(shape.symbolKeys) && shape.symbolKeys.length ? shape.symbolKeys : (shape.symbolKey ? [shape.symbolKey] : []); const symbols = display.showSymbols ? getSymbolDefinitions(symbolKeys) : []; if (display.dissolveOnly) { if (!active) return null; return ( {label && display.showLabels ? ( {shape.title} ) : null} ); } if (display.labelOnly) { return ( {label && display.showLabels ? ( {shape.title} ) : null} ); } return ( {(fill || imageSource || symbols.length) ? : null} {edges.map(([a, b], i) => ( ))} {label && display.showLabels ? ( {shape.title} ) : null} ); } function normalizeDisplayOptions(options, showMedia = true) { if (options) return { showImages: options.showImages !== false, showSymbols: options.showSymbols !== false, showLabels: options.showLabels !== false, labelOnly: !!options.labelOnly, dissolveOnly: !!options.dissolveOnly, }; return { showImages: showMedia !== false, showSymbols: showMedia !== false, showLabels: true, labelOnly: false }; } function FillShape({ shape, color, active, imageSource, symbols = [], dissolveOnly = false }) { const xs = shape.points.map(p => p.x); const ys = shape.points.map(p => p.y); const minX = Math.min(...xs); const maxX = Math.max(...xs); const minY = Math.min(...ys); const maxY = Math.max(...ys); const pad = Math.max(14, Math.min(34, Math.max(maxX - minX, maxY - minY) * 0.16)); const w = Math.max(1, maxX - minX); const h = Math.max(1, maxY - minY); const boxW = w + pad * 2; const boxH = h + pad * 2; const left = minX - pad; const top = minY - pad; const points = shape.points.map(p => `${p.x},${p.y}`).join(' '); const shadowShift = 2 + (1 - (shape.zScale || 1)) * 3; const shadowPoints = shape.points.map(p => `${p.x + shadowShift},${p.y + shadowShift * 0.72}`).join(' '); const innerPoints = insetPoints(shape.points, shape.center, active ? 0.68 : 0.78).map(p => `${p.x},${p.y}`).join(' '); const rimPoints = insetPoints(shape.points, shape.center, active ? 1.035 : 1.018).map(p => `${p.x},${p.y}`).join(' '); const clipId = `clip-${String(shape.id || 'shape').replace(/[^a-zA-Z0-9_-]/g, '-')}`; const size = Math.min(w, h); const layouts = symbolLayouts(symbols.length, w, h, pad); const symbolSize = Math.max(18, Math.min(58, size * (symbols.length > 1 ? 0.20 : 0.28))); // v4.0.483: Bühnen-Symbole in allen Maps deutlich kleiner const starPoints = constellationPoints(shape.points, shape.center); return {imageSource ? : null} {null} {symbols.map((symbol, index) => { const layout = layouts[index] || layouts[0] || { x: pad + w / 2, y: pad + h / 2 }; const rotationDeg = symbol?.key === 'dir-auto' && Number.isFinite(Number(shape.actualDirectionAngleDeg)) ? Number(shape.actualDirectionAngleDeg) + 90 : 0; const symbolTransform = [{ translateY: symbolSize * 0.010 }, ...(rotationDeg ? [{ rotate: `${rotationDeg}deg` }] : [])]; return {symbol.char ? {symbol.char} : } ; })} ; } function ConstellationOverlay({ shape, color, stars = [], active = false }) { const center = shape.center; return <> {stars.map((point, index) => ( {index > 0 ? : null} ))} ; } function insetPoints(points, center, factor = 0.72) { return points.map(p => ({ x: center.x + (p.x - center.x) * factor, y: center.y + (p.y - center.y) * factor })); } function constellationPoints(points, center) { const mids = []; for (let i = 0; i ({ x: center.x + (p.x - center.x) * (index % 2 === 0 ? 0.92 : 0.78), y: center.y + (p.y - center.y) * (index % 2 === 0 ? 0.92 : 0.78), })); } function VertexDots({ shape, color, active }) { const size = active ? 6.6 : 4.2; return <> {(shape.points || []).map((p, index) => ( ))} ; } function symbolLayouts(count, w, h, pad) { if (!count) return []; const cx = pad + w / 2; const cy = pad + h / 2; if (count === 1) return [{ x: cx, y: cy }]; const radiusX = Math.max(18, w * 0.27); const radiusY = Math.max(18, h * 0.27); return Array.from({ length: count }, (_, i) => { const a = -Math.PI / 2 + (Math.PI * 2 * i) / count; return { x: cx + Math.cos(a) * radiusX, y: cy + Math.sin(a) * radiusY }; }); } const styles = StyleSheet.create({ edge: { position: 'absolute', height: 1.5, borderRadius: 2, opacity: 1, transformOrigin: '0px 1px', shadowOpacity: 0, shadowRadius: 0 }, edgeActive: { height: 1.5, opacity: 1, shadowRadius: 0 }, label: { position: 'absolute', width: 212, minHeight: 34, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 12, paddingVertical: 3, borderRadius: 0, borderWidth: 0, backgroundColor: 'transparent' }, labelText: { color: '#05070b', fontWeight: '900', fontSize: 13.2, letterSpacing: 0.28, textAlign: 'center', textShadowColor: 'transparent', textShadowRadius: 0 }, labelDissolve: { position: 'absolute', width: 220, minHeight: 36, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 12, paddingVertical: 3, backgroundColor: 'transparent' }, labelTextDissolve: { color: '#05070b', fontWeight: '900', fontSize: 13.4, letterSpacing: 0.28, textAlign: 'center', textShado


## import React, { useMemo, useRef, useState } from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/Stage.js

import React, { useMemo, useRef, useState } from 'react'; import { View, Text, Pressable, StyleSheet, PanResponder, useWindowDimensions, Image, Platform, Keyboard } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { buildGeometry, hitTest, shapeBounds, applyKompassActualDirectionLabels } from '../core/geometry'; import { theme } from '../core/theme'; import { anchorsFromContentItems, wordsFromText } from './CosmosContentField'; import { StageSearchHeader, buildStageSearchState, isStageSearchUiHit } from './StageSearch'; import { StageRenderLayers, labelMetricsForShape } from './StageRenderLayers'; import { STAGE_CENTER_Y, animateView, buildPerformanceProfile, buildStageBox, clamp, localPoint, localTouches, panOnlyView, screenToWorld, smoothstep, viewForShapes } from './StageViewMath'; import { buildGravityAnchors, buildGravitySnippets, gravityOffsetFor } from './StageGravity'; import { buildWikiSuggestions, collectMapStats, makeWikiUrl } from '../core/statsWiki'; const FALLBACK_SCREEN = { width: 390, height: 844 }; const TAU = Math.PI * 2; const TAP_MOVE_LIMIT = 6; const LONG_MOVE_LIMIT = 16; const TAP_TIME_LIMIT = 340; const DOUBLE_TAP_WINDOW_MS = 340; const SINGLE_TAP_DELAY_MS = 370; const LONG_PRESS_TIME = 540; const SELECTED_CENTER_Y = 0.408; const IDLE_ORGANIC_START_MS = 6200; // v4.0.336: Ruhe erst nach echter Pause, nicht sofort nach Berührung. const IDLE_ORGANIC_RAMP_MS = 7200; // langsamer Aufbau: eher Qualle im Wasser als hektisches Wackeln. const IDLE_ORGANIC_STEP_MS = 18500; // Aktivierung wandert sehr langsam durch die Struktur. const IDLE_ORGANIC_FRAME_MS = 950; const IDLE_ORGANIC_MAX_OFFSET = 1.55; const STAGE_PREP_SHORT_MS = 320; const STAGE_PREP_LONG_MS = 760; const IDLE_ORGANIC_MIN_VISIBLE_INTENSITY = 0.006; const CAMERA_MOVE_EPS = 0.75; const CAMERA_SCALE_EPS = 0.012; const MIN_STAGE_ZOOM = 0.22; // absolute Untergrenze nur als Fallback; die aktive Buehne nutzt stageMinZoom pro Map. const MAX_STAGE_ZOOM = 1.00; // v4.0.373: Map-Einstieg ist absoluter Reinzoom-Endstand; kein Tiefer-Zoom mehr. const TIMELINE_WORLD_GAP = 78; // v4.0.297: kompaktere Timeline, damit Querformat ruhiger wirkt. const TIMELINE_LANE_HEIGHT = 28; const TIMELINE_LABEL_MAX_PHONE = 118; const TIMELINE_LABEL_MIN_PHONE = 64; const EMPTY_STAGE_SEARCH_STATE = { results: [], points: [], index: new Map() }; export function Stage({ map, selectedId, onSelect, onLongPressNode, onReparentNode, onUpdateRelationWeight, onStageDropIntent, onUndo, canUndo = false, cameraSignal, displayOptions, showMedia = true, stageTitle, onBack, captureMode = false, cameraActive = false, cameraBackgroundUri = null, cameraRef = null, cameraPermissionGranted = false, onCameraReady, cameraCountdown = null, gravityPoints = [], onCreateGravityPoint, onEditGravityPoint, onMoveGravityPoint, suppressOverlays = false, birthSignal = null, designTheme = 'gradient', showSearchHeader = true, onViewChange, onStageTopicTitleSubmit }) { const screen = useWindowDimensions() || FALLBACK_SCREEN; const isLandscape = screen.width > screen.height; const stageBox = React.useMemo(() => buildStageBox(screen, isLandscape && !captureMode), [screen.width, screen.height, isLandscape, captureMode]); const [view, setView] = useState(() => ({ x: stageBox.centerX - 240 * 0.92, y: stageBox.height / 2 - 220 * 0.92, scale: 1.00 })); const [focusOverlayVisible, setFocusOverlayVisible] = useState(true); const [searchText, setSearchText] = useState(''); const [topicTitleDraft, setTopicTitleDraft] = useState(''); const [searchTouched, setSearchTouched] = useState(false); const [searchPaused, setSearchPaused] = useState(false); const [searchCursor, setSearchCursor] = useState(0); const [polygonVisibility, setPolygonVisibility] = useState(74); const [timelineAxisMode, setTimelineAxisMode] = useState('order'); const [folderEditMode, setFolderEditMode] = useState(false); const [editDrag, setEditDrag] = useState(null); const [pendingDrop, setPendingDrop] = useState(null); const [dropNotice, setDropNotice] = useState(null); const [zoomFocus, setZoomFocus] = useState(null); const [rootDirectionPrompt, setRootDirectionPrompt] = useState(null); const rootRef = useRef(null); const rootBoxRef = useRef({ x: 0, y: 0, ready: false }); const viewRef = useRef(view); const animRef = useRef(null); const viewFrameRef = useRef(null); const queuedViewRef = useRef(null); const touchRef = useRef({ mode: 'idle', startX: 0, startY: 0, startTime: 0, view, moved: false, pinchBase: null, longTimer: null, longFired: false, startHitId: null, startGravityId: null }); const lastEmptyTapRef = useRef({ t: 0, x: 0, y: 0 }); const lastAnyTapRef = useRef({ t: 0, x: 0, y: 0 }); const mapIdRef = useRef(map?.id || null); const autoCenteredMapIdRef = useRef(null); const tapSelectTimerRef = useRef(null); const idleFrameRef = useRef(null); const idleLastInteractionRef = useRef(Date.now()); const idleLastFrameRef = useRef(0); const lastCameraTargetRef = useRef(null); const dropNoticeTimerRef = useRef(null); const [idleMotion, setIdleMotion] = useState({ phase: 0, intensity: 0 }); const [gestureActive, setGestureActive] = useState(false); const [stagePrep, setStagePrep] = useState(null); const prepTimerRef = useRef(null); const display = useMemo(() => normalizeDisplayOptions(displayOptions, showMedia), [displayOptions, showMedia]); const stageGeometryViewport = useMemo(() => ({ ...stageBox, geometryMode: display.mode === 'printPreview' ? 'print' : 'bullauge' }), [stageBox.width, stageBox.height, stageBox.centerX, stageBox.centerY, display.mode]); const isKompassMap = String(map?.templateKind || '').trim().toLowerCase() === 'kompass'; const overlaysAllowed = !suppressOverlays && !captureMode; // v4.0.393: ITMO/Header bleibt als feste Orientierung überall stehen. // Fenster dürfen die Bühne beruhigen, aber nicht den Kopf komplett abräumen. const headerAllowed = !captureMode && showSearchHeader; // v4.0.401: Clean/Vollbild ist der einzige Ort fuer echte Ruhebewegung. // Die normale Arbeit


## import { clamp } from './StageViewMath';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/StageGravity.js

import { clamp } from './StageViewMath'; export function buildGravitySnippets(gravityScreenPoints = [], gravityIndex = new Map(), shapes = []) { const snippets = []; const byNode = new Map((shapes || []).map(shape => [shape.nodeId, shape]).filter(([id]) => id)); gravityScreenPoints.forEach((focusPoint) => { const data = gravityIndex.get(focusPoint.id) || { hits: [] }; (data.hits || []).slice(0, 18).forEach((hit, hitIndex) => { const sourceShape = byNode.get(hit.nodeId); const sourceX = sourceShape?.center?.x ?? focusPoint.screenX; const sourceY = sourceShape?.center?.y ?? focusPoint.screenY; const pull = hit.direct ? 0.72 : (0.32 + Math.min(0.18, hitIndex * 0.012)); snippets.push({ id: `${focusPoint.id}-${hitIndex}`, focusId: focusPoint.id, x: focusPoint.screenX, y: focusPoint.screenY, sourceX, sourceY, drawX: sourceX + (focusPoint.screenX - sourceX) * pull, drawY: sourceY + (focusPoint.screenY - sourceY) * pull, label: focusPoint.label, text: hit.snippet, source: hit.nodeTitle || hit.source || '', nodeId: hit.nodeId, color: hit.color || focusPoint.color || '#f2e7c8', index: hitIndex, }); }); }); return snippets; } export function buildGravityAnchors(points = []) { return (points || []).map((p, index) => ({ x: p.screenX, y: p.screenY, key: `gravity-${p.id || index}`, parentKey: 'stage-root', kind: 'gravity', primary: true, strength: 2.2, color: p.color || '#f2e7c8', })); } export function gravityOffsetFor(center, shape, points = [], gravityIndex = new Map(), rootNodeId = null) { if (!points.length) return { x: 0, y: 0 }; const depth = Math.max(0, shape.depth || 0); const isRoot = rootNodeId && shape.nodeId === rootNodeId; const orderPull = (isRoot ? 0.22 : 1) / (1 + depth * 0.06); let ox = 0; let oy = 0; let searchPull = 0; points.forEach((p, index) => { const dx = p.screenX - center.x; const dy = p.screenY - center.y; const d = Math.max(24, Math.hypot(dx, dy)); const data = gravityIndex.get(p.id) || {}; const matched = (data.nodeScores || {})[shape.nodeId] || 0; const related = (data.relatedScores || {})[shape.nodeId] || 0; const semanticBoost = matched ? Math.min(7.2, 1.90 + matched * 0.32) : (related ? Math.min(1.30, 0.42 + related * 0.08) : 0.025); const reach = matched ? 860 : (related ? 390 : 52); const maxInfluence = matched ? (isRoot ? 0.08 : 0.74) : (related ? (isRoot ? 0.035 : 0.15) : 0.010); const influence = Math.min(maxInfluence, (reach / (d + reach)) * 0.42 * (p.strength || 1) * orderPull * semanticBoost); if (p.search && matched) searchPull = Math.max(searchPull, matched); ox += dx * influence; oy += dy * influence; const tangent = ((shape.rank || index || 1) % 2 ? 1 : -1) * Math.min(18, 900 / (d + 90)); ox += (-dy / d) * tangent * 0.32; oy += (dx / d) * tangent * 0.32; }); return { x: clamp(ox, isRoot ? -14 : -190, isRoot ? 14 : 190), y: clamp(oy, isRoot ? -14 : -190, isRoot ? 14 : 190), searchPull, }; }


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/StageRenderLayers.js

import React from 'react'; import { View, Text, Pressable, StyleSheet, useWindowDimensions, Image } from 'react-native'; import Svg, { Circle, Ellipse, Line, Path, Defs, LinearGradient, Stop, Rect, Polygon as SvgPolygon } from 'react-native-svg'; import { Ionicons } from '@expo/vector-icons'; import { PolygonView } from './PolygonView'; import { theme } from '../core/theme'; import { getImageSource, getSymbolDefinitions } from '../core/assets'; import { clamp, smoothstep } from './StageViewMath'; import { connectionCountForHull, nodePolygonSides } from '../core/geometry'; const TAU = Math.PI * 2; const FALLBACK_SCREEN = { width: 390, height: 844 }; const THREAD_MIN_VISIBLE_GAP = 4; // v4.0.534: sichtbarer Mindest-Aussenabstand, ca. 5-mm-Ziel auf Handy. // v4.0.403: Fäden dürfen in den Bildschirmrand hinein-/hinauslaufen, // wenn das verbundene Polygon knapp außerhalb liegt. Der Grenzwert ist // nur noch eine harte Sicherung gegen völlig entfernte Verbindungen. const THREAD_MAX_SCREEN_LENGTH = 760; // v4.0.426: Strukturfarben sind harte, deckende Bühnenfarben. // Keine Pastellpalette, keine Transparenz auf Polygonen/Fäden. // Nur der billig versetzte Schatten darf transparent sein; Schattenabstand kleiner. const FAMILY_LAYER_COLORS = ['#ffe119', '#00e5b0', '#008cff', '#ff1675', '#8b2cff', '#ff6a00', '#47ff00', '#ffffff']; const HARD_SHADOW = { dx: 2, dy: 3, opacity: 0.22 }; const STRUCTURE_ALPHA_V438 = 1.00; // v4.0.624: Hüllen decken Fäden darunter vollständig ab; keine sichtbaren Innenstreifen. const CIRCLE_BODY_FILL_OPACITY_V560 = 1.00; const CIRCLE_BODY_STROKE_WIDTH_V560 = 1.15; const STAGE_NODE_CIRCLE_RADIUS = 34; // v4.0.558: ein Kreisradius fuer alle Knoten; Polygon ist nur Huelle. const STAGE_NODE_HULL_GAP = 2; // v4.0.667: Huelle enger an den Kreis; kein grosses Dreieck mehr. const STAGE_NODE_HULL_FACTOR = 1.18; // Fallback fuer Altstellen; compactStageGlyph nutzt Radius + GAP. const HULL_BACKDROP_VERTEX_FACTOR_V667 = 1.34; // kompakte Rueckwand statt Tangenten-Grosskoerper. const HULL_RING_INNER_GAP = 0.0; const BODY_CIRCLE_STROKE_OPACITY_V636 = 0.0; // v4.0.636/637: kein Innenring; Kreis ist selbst der Vordergrundkoerper. const HULL_BACKDROP_OPACITY_V665 = 0.18; // v4.0.671: Huelle weiter beruhigt; Kreis bleibt eindeutig Vordergrund. const RELATIVE_THREAD_MIN_SCORE_V668 = 3.45; // v4.0.670: Resonanzfaeden weiter beruhigt; nur echte Naehe/Verwandtschaft. const RELATIVE_THREAD_MAX_PER_NODE_V668 = 1; const FAMILY_CHILD_POLYGON_MIN_CHILDREN_V668 = 3; const FAMILY_CHILD_POLYGON_MAX_CHILDREN_V668 = 16; const RELATIVE_THREAD_MAX_DISTANCE_V669 = 390; const RELATIVE_THREAD_GLOBAL_LIMIT_V669 = 14; export function StageRenderLayers({ performance = {}, screen = FALLBACK_SCREEN, organismAnchors = [], visibleShapes = [], view = { scale: 1 }, captureMode = false, map = {}, selectedId = null, birthSignal = null, gravitySnippets = [], overlaysAllowed = false, focusOverlayVisible = true, polygonVisibility = 50, hiddenBloomNodes = {}, onHideBloomNode, onUnhideBloomNode, onSelect, display = {}, cosmosItems = [], idleMotion = null, fullscreenStage = false, }) { const width = screen?.width || FALLBACK_SCREEN.width; const height = screen?.height || FALLBACK_SCREEN.height; const zoom = view?.scale || 1; const birthPhase = useBirthRevealPhase(birthSignal); const renderShapes = React.useMemo(() => applyBirthRolloutShapes(visibleShapes, map, birthSignal, birthPhase), [visibleShapes, map, birthSignal?.childId, birthSignal?.parentId, birthSignal?.t, birthSignal?.previousSiblingShapes?.length, birthPhase]); const fullscreenIdle = !!fullscreenStage && clamp(Number(idleMotion?.intensity || 0), 0, 1) > 0.018; const threadPhase = useFullscreenThreadPhase(fullscreenIdle); const searchActive = (renderShapes || []).some(shape => (shape?.searchPull || 0) > 0.15); const treeLineLimit = searchActive ? 34 : Math.max(18, performance.maxTreeLines || 28); const polygonLimit = performance.maxPolygons || (performance.zoomOut ? 18 : 34); // v4.0.397: Geschützter Bühnenstack. Alte Atmosphären-/Bloom-/Debug-Layer // werden hier nicht mehr als deaktivierte Komponenten mitgerendert. Die // Reihenfolge bleibt absichtlich hart: Fäden unter Flächen, Flächen unter // Labels, UI ganz oben. Dadurch gibt es weniger Nebenwirkungen beim Pan, // Zoom und Fokuswechsel. return <> ; } export function labelMetricsForShape(shape, zoom = 1, depth = 0, active = false, screenWidth = 390) { const title = String(shape?.title || ''); const len = Math.max(1, title.length); const z = Math.max(0.42, Number(zoom) || 1); // v4.0.373: Zoom 1 ist Endstand. Labelgroesse bleibt stabil und // wird nicht mehr aus alter Tiefenlogik abgeleitet. const searchPull = clamp(Number(shape?.searchPull || 0), 0, 1); const depthTighten = clamp(1 - Math.sqrt(Math.max(0, depth)) * 0.018, 0.88, 1); const read = clamp(smoothstep(0.70, 1.00, z) + searchPull * 0.35, 0, 1); const maxWidth = Math.min((screenWidth || 390) * (active ? 0.60 : 0.52), active ? 238 : 214); const width = clamp((74 + len * 4.45) * depthTighten * (0.96 + read * 0.06), 84, maxWidth); const height = clamp((31 + Math.max(0, len - 18) * 0.070) * (0.96 + read * 0.05), 28, active ? 48 : 40); const longLabelT = clamp((len - 16) / 16, 0, 1); const fontSize = clamp((13.1 + read * 0.85 - longLabelT * 0.75) * depthTighten, 11.2, active ? 16.0 : 14.4); const scale = clamp(0.90 + read * 0.08 + (active ? 0.03 : 0), 0.86, active ? 1.02 : 0.98); return { width, height, fontSize, scale }; } function useFullscreenThreadPhase(active = false) { const [phase, setPhase] = React.useState(0); React.useEffect(() => { if (!active) { setPhase(0); return undefined; } let alive = true; const started = Date.now(); const tick = () => { if (!alive) return; setPhase((Date.now() - started) / 1000); requestAnimationFrame(tick); }; requestAnimationFrame(tick); return () => { alive = false; }; }, [active]); return active ? phase : 0; } function useBirthRevealPhase(birthSignal = null) { const [phase, setPhase] = React.useState(1); React.useE


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/StageSearch.js

import React from 'react'; import { View, Text, TextInput, Pressable, ScrollView, StyleSheet, Keyboard, Animated, Easing } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../core/theme'; import { getDesignThemeProfile } from '../core/designThemes'; const FALLBACK_SCREEN = { width: 390, height: 844 }; export function StageSearchHeader({ title = '', selectedTitle = '', value = '', onChangeText, onSubmitText, results = [], paused = false, cursor = 0, onPause, onSelectResult, polygonVisibility = 50, onVisibilityChange, designTheme = 'gradient', mode = 'search', topicTitle = '' }) { // v4.0.310: iPhone-Notch/Dynamic-Island ist Sperrzone. // Die Suche darf nie verschwinden, nur weil kurz kein sauberer Titel geliefert wird. const clean = String(title || selectedTitle || 'Bühne').trim() || 'Bühne'; const profile = getDesignThemeProfile(designTheme); const sub = selectedTitle && selectedTitle !== clean ? selectedTitle : 'ITMO'; const isTitleMode = mode === 'title'; const cleanTopicTitle = String(topicTitle || clean || 'Thematik').trim() || 'Thematik'; const queryActive = !isTitleMode && String(value || '').trim().length > 0; const titleWaiting = isTitleMode && !String(value || '').trim(); const titlePulse = React.useRef(new Animated.Value(1)).current; React.useEffect(() => { if (!titleWaiting) { titlePulse.stopAnimation(); titlePulse.setValue(1); return undefined; } const loop = Animated.loop(Animated.sequence([ Animated.timing(titlePulse, { toValue: 0.54, duration: 720, easing: Easing.inOut(Easing.quad), useNativeDriver: true }), Animated.timing(titlePulse, { toValue: 1, duration: 760, easing: Easing.inOut(Easing.quad), useNativeDriver: true }), ])); loop.start(); return () => { loop.stop(); titlePulse.setValue(1); }; }, [titleWaiting, titlePulse]); const activeIndex = Math.max(0, Math.min((results || []).length - 1, cursor || 0)); const rawChips = queryActive ? uniqueSearchResults(results || [], value).slice(0, 5) : []; const activeResult = queryActive ? rawChips.find(r => r.nodeId === results?.[activeIndex]?.nodeId) || rawChips[0] : null; const chips = activeResult ? [activeResult, ...rawChips.filter(r => r.nodeId !== activeResult.nodeId)].slice(0, 5) : rawChips.slice(0, 5); const clearSearch = () => { onChangeText?.(''); Keyboard.dismiss(); }; return onChangeText?.(text)} placeholder={isTitleMode ? 'Thementitel eingeben' : `In der Thematik „${cleanTopicTitle}“ suchen`} placeholderTextColor="rgba(245,242,215,0.44)" style={[styles.stageSearchInput, { color: profile.text, fontSize: 12.6 * profile.fontScale }]} autoCorrect={false} autoCapitalize="none" selectTextOnFocus={false} returnKeyType={isTitleMode ? 'done' : 'search'} blurOnSubmit={true} onSubmitEditing={() => { if (isTitleMode) onSubmitText?.(value); Keyboard.dismiss(); }} onBlur={() => { if (isTitleMode) onSubmitText?.(value); }} /> {queryActive ? : null} {queryActive && chips.length ? {chips.map((result, index) => { const active = index === 0; return onSelectResult?.(result)} style={[styles.stageSearchChip, { borderRadius: Math.max(999, profile.radius) }, active && styles.stageSearchChipActive, result.color ? { borderColor: active ? '#ffffff' : result.color + '77' } : null]}> {result.title} ; })} : null} ; } export function isStageSearchUiHit(point = { x: 0, y: 0 }, screen = FALLBACK_SCREEN) { const w = screen?.width || 390; const h = screen?.height || 844; const top = Math.max(58, Math.min(112, h * 0.085)); const bottom = Math.max(top + 92, top + 150); return point && point.y >= top && point.y = 18 && point.x r.nodeId !== active.nodeId)] : results; const source = ranked.slice(0, 12); source.forEach((result, i) => { nodeScores[result.nodeId] = active && i === 0 ? 8.2 : Math.max(1.15, 4.8 - i * 0.30); }); results.slice(0, 12).forEach((result, i) => { relatedScores[result.nodeId] = Math.max(0.10, 0.80 - i * 0.055); }); const point = { id: 'stage-search-field', screenX: (width || 390) / 2, screenY: Math.max(78, Math.min(138, (height || 844) * 0.115)), x: 0, y: 0, label: clean, color: active?.color || source[0]?.color || '#7df0ff', strength: paused ? 0.18 : 0.10, search: true }; const hits = source.map((result, index) => ({ nodeId: result.nodeId, nodeTitle: result.title, snippet: result.snippet, color: result.color, direct: index === 0 })); return { results, points: [point], index: new Map([[point.id, { nodeScores, relatedScores, hits }]]) }; } function makeStagePanel(panel = 'rgba(0,0,0,0.20)', alpha = 0.20) { // v4.0.405: Header/Suche dürfen nicht wie eine graue Folie über der // Bühne wirken. Diese Funktion erzeugt nur noch sehr leichte lokale // Panel-Hintergründe, nie eine flächige Abdunkelung. const clean = String(panel || '').trim(); const a = clamp(Number(alpha), 0, 0.05); const rgba = clean.match(/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*[\d.]+\)$/i); if (rgba) return `rgba(${rgba[1]},${rgba[2]},${rgba[3]},${a})`; const rgb = clean.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i); if (rgb) return `rgba(${rgb[1]},${rgb[2]},${rgb[3]},${a})`; if (clean.startsWith('#')) return clean; return `rgba(0,0,0,${a})`; } function buildStageSearchResults(map = {}, query = '') { const clean = normalizeStageQuery(query); if (!clean) return []; const terms = clean.split(/\s+/).filter(Boolean).slice(0, 5); const nodes = Object.values(map?.nodes || {}); return nodes.map(node => { const title = String(node?.title || ''); const body = readableNodeText(node || {}); const hay = normalizeStageQuery(`${title} ${body}`); let score = 0; terms.forEach(term => { if (normalizeStageQuery(title).includes(term)) score += 8; if (hay.includes(term)) score += 3; }); if (!score) return null; const snippet = makeSearchSnippet(body || title, terms); return { nodeId: node.id, title: title || 'Polygon', snippet, color: node.color || '#7df0ff', mapTitle: map.title || '', score }; }).filter(Boolean).sort((a, b) => b.score - a.score).slice(0, 12); } function uniqueSearchResults(results = [], query = '') { const out = []; const queryKey = normali


## import { shapeBounds } from '../core/geometry';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/StageViewMath.js

import { shapeBounds } from '../core/geometry'; const FALLBACK_SCREEN = { width: 390, height: 844 }; export const STAGE_CENTER_Y = 0.500; // v4.0.577: Bildschirmmitte ist das Zentrum. const LANDSCAPE_FOOTER_RESERVE = 104; export function clamp(v, min, max) { return Math.max(min, Math.min(max, Number.isFinite(Number(v)) ? Number(v) : min)); } export function smoothstep(edge0, edge1, x) { const t = clamp(((x || 0) - edge0) / Math.max(0.0001, edge1 - edge0), 0, 1); return t * t * (3 - 2 * t); } export function organicFreeOffset(shape, index, total, zoom = 1) { const depth = Math.max(0, shape?.depth || 0); const rank = Math.max(0, shape?.rank ?? index ?? 0); const child = Math.max(0, shape?.childCount || 0); const phase = rank * 1.618 + depth * 0.73 + child * 0.41; const breath = 1 + Math.max(0, Math.min(1.8, zoom - 1)) * 0.18; const base = 18 + depth * 9 + Math.min(42, child * 5); return { x: Math.cos(phase) * base * breath + Math.sin(phase * 0.37) * 12, y: Math.sin(phase * 1.21) * base * 0.70 * breath + Math.cos(phase * 0.52) * 10, }; } export function freeLabelCenter(shape, index, total, zoom = 1) { const golden = 2.399963229728653; const childWeight = Math.min(5, shape.childCount || 0); const importance = Math.max(0, 6 - (shape.depth || 0)) + childWeight; const rank = Math.max(0, 10 - importance); const angle = index * golden; const radius = 24 + rank * 32 + (index % 3) * 10; const zoomLift = clamp((zoom - 0.95) * 0.72, 0, 1.05); const verticalScale = 0.92 + zoomLift * 1.08; const lane = ((index * 7) % 11) - 5; const laneOffset = lane * (8 + zoomLift * 22); return { x: 240 + Math.cos(angle) * radius, y: 220 + Math.sin(angle) * radius * verticalScale + laneOffset, }; } export function localPoint(nativeEvent, rootBox = { x: 0, y: 0, ready: false }) { const hasPage = Number.isFinite(nativeEvent.pageX) && Number.isFinite(nativeEvent.pageY); const hasLocal = Number.isFinite(nativeEvent.locationX) && Number.isFinite(nativeEvent.locationY); const usePage = hasPage && rootBox.ready; const x = usePage ? nativeEvent.pageX - (rootBox.x || 0) : (hasLocal ? nativeEvent.locationX : 0); const y = usePage ? nativeEvent.pageY - (rootBox.y || 0) : (hasLocal ? nativeEvent.locationY : 0); return { x, y }; } export function localTouches(touches, rootBox = { x: 0, y: 0, ready: false }) { return Array.from(touches || []).map(t => { const hasPage = Number.isFinite(t.pageX) && Number.isFinite(t.pageY); const hasLocal = Number.isFinite(t.locationX) && Number.isFinite(t.locationY); const usePage = hasPage && rootBox.ready; return { x: usePage ? t.pageX - (rootBox.x || 0) : (hasLocal ? t.locationX : 0), y: usePage ? t.pageY - (rootBox.y || 0) : (hasLocal ? t.locationY : 0), }; }); } export function distancePoints(a, b) { return Math.hypot(a.x - b.x, a.y - b.y); } export function midpointPoints(a, b) { return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }; } export function makePinchBase(touches, view) { if (!touches || touches.length { const c = freeLabelCenter(shape, index, shapes.length); return { ...shape, points: [{ x: c.x - 82, y: c.y - 24 }, { x: c.x + 82, y: c.y - 24 }, { x: c.x + 82, y: c.y + 24 }, { x: c.x - 82, y: c.y + 24 }] }; }) : shapes; const boxes = shaped.map(shapeBounds); const minX = Math.min(...boxes.map(b => b.minX)); const minY = Math.min(...boxes.map(b => b.minY)); const maxX = Math.max(...boxes.map(b => b.maxX)); const maxY = Math.max(...boxes.map(b => b.maxY)); const width = Math.max(1, maxX - minX); const height = Math.max(1, maxY - minY); const widthFit = screenBox.isLandscape ? 0.88 : 0.92; const heightFit = screenBox.isLandscape ? 0.88 : 0.84; const maxScale = display.labelOnly ? 1.24 : 1.10; const fitWidth = screenBox.safeWidth || screenBox.width; const scale = clamp(Math.min((fitWidth * widthFit) / width, (screenBox.height * heightFit) / height, display.labelOnly ? 1.18 : 1.10), 0.06, maxScale); const cx = minX + width / 2; const cy = minY + height / 2; const centerY = STAGE_CENTER_Y; return { x: (screenBox.centerX || screenBox.width / 2) - cx * scale, y: screenBox.height * centerY - cy * scale, scale }; } export function buildPerformanceProfile({ nodeCount = 0, visibleCount = 0, zoom = 1, captureMode = false, suppressOverlays = false, idleActive = false }) { // v4.0.313: Brutaler Stage-Cleanup. // Weniger Suppe: nur Hauptstruktur, harte Label-Limits, keine Bud-/Deko-Restfäden. const z = Number.isFinite(Number(zoom)) ? Number(zoom) : 1; const zoomOut = z 42 || visibleCount > 16 || veryZoomOut; const heavy = veryHeavy || nodeCount > 22 || visibleCount > 12 || zoomOut || idleActive; const medium = !heavy && (nodeCount > 10 || visibleCount > 7 || z { // v4.0.389: billigste Bewegung: lineare Kamerafahrt, keine Cubic-Easing-Reste. const e = clamp((Date.now() - t0) / dur, 0, 1); setView({ x: from.x + (to.x - from.x) * e, y: from.y + (to.y - from.y) * e, scale: from.scale + (to.scale - from.scale) * e }); if (e height }; } export function panOnlyView(startView, dx, dy) { return { x: startView.x + dx, y: startView.y + dy, scale: startView.scale }; } export function screenToWorld(point, view) { const scale = Math.max(0.001, view.scale || 1); return { x: (point.x - (view.x || 0)) / scale, y: (point.y - (view.y || 0)) / scale }; } export function applyTreeCrownLayout(shapes = [], map = {}, selectedId = null, zoom = 1, width = 390, height = 844, gravityIndex = new Map()) { if (!Array.isArray(shapes) || shapes.length s?.nodeId && s?.center).map(s => [s.nodeId, s])); const roots = (Array.isArray(map.roots) && map.roots.length ? map.roots : Object.values(map.nodes || {}).filter(n => !n.parentId).map(n => n.id)).filter(id => byId.has(id)); if (!roots.length) return shapes; const allSearchNodeIds = new Set(); if (gravityIndex && typeof gravityIndex.forEach === 'function') { gravityIndex.forEach(data => { Object.keys(data?.nodeScores || {}).forEach(id => allSearchNodeIds.add(id)); Object.keys(data?.relatedScores || {}).forEach(id => allSearchNodeIds.add(id)); }); } const nodeDepth = id => { let depth = 0; 


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/focus/FocusChildPanel.js

import React from 'react'; import { Pressable, StyleSheet, Text, View } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../../core/theme'; export function FocusChildPanel({ node = {}, nodeById = new Map(), color = '#7df0ff', currentNodeId = null, onSelectNode, onAddChild }) { const ids = Array.isArray(node.children) ? node.children.filter(Boolean) : []; const items = ids.map(id => nodeById.get(id)).filter(Boolean); if (!items.length && !onAddChild) return null; return Kinder {items.map(child => { const active = child.id === currentNodeId; const c = child.color || color; return onSelectNode?.(child.id)} style={[styles.chip, active && styles.chipActive, { borderColor: c + (active ? 'aa' : '42') }]}> {child.title || 'Kind'} ; })} onAddChild?.(node.id)} style={[styles.action, { borderColor: color + '38' }]}> Kind ; } const styles = StyleSheet.create({ panel: { marginTop: 8, paddingTop: 7, borderTopWidth: 1, borderTopColor: 'rgba(245,242,215,0.08)' }, title: { color: 'rgba(245,242,215,0.42)', fontSize: 9.4, fontWeight: '900', letterSpacing: 0.7, textTransform: 'uppercase', marginBottom: 5 }, list: { flexDirection: 'row', flexWrap: 'wrap', gap: 9, marginTop: 0, marginBottom: 3 }, chip: { minHeight: 42, maxWidth: 246, flexDirection: 'row', alignItems: 'center', gap: 8, borderWidth: 1, borderRadius: 19, paddingHorizontal: 12, paddingVertical: 7, backgroundColor: 'rgba(255,255,255,0.045)' }, chipActive: { backgroundColor: 'rgba(255,255,255,0.10)' }, mark: { width: 18, height: 18, borderRadius: 9, borderWidth: 1.2 }, markActive: { borderWidth: 1.6 }, text: { color: theme.text, fontSize: 14.2, fontWeight: '900', maxWidth: 182 }, textActive: { color: '#fffbe2' }, action: { minHeight: 42, flexDirection: 'row', alignItems: 'center', gap: 6, borderWidth: 1, borderRadius: 19, paddingHorizontal: 12, paddingVertical: 7, backgroundColor: 'rgba(0,0,0,0.14)' }, actionText: { color: theme.textSoft, fontSize: 12.8, fontWeight: '900' }, });


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/focus/FocusEditField.js

import React from 'react'; import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../../core/theme'; export function FocusEditField({ block = {}, fallbackTitle = 'Polygon', color = '#7df0ff', nodeId = null, blockId = null, displayTitle = '', wikiQuery = null, onWikiTitle, onCloseEdit, onUpdate, canDeleteWiki = false, onDeleteWiki }) { const parts = splitTitleAndBody(block.text || '', fallbackTitle); const initialTitle = cleanTitleFragment(displayTitle || parts.title || fallbackTitle); const [draftTitle, setDraftTitle] = React.useState(initialTitle); React.useEffect(() => { setDraftTitle(cleanTitleFragment(displayTitle || splitTitleAndBody(block.text || '', fallbackTitle).title || fallbackTitle)); }, [blockId, nodeId, displayTitle, fallbackTitle]); const busy = !!(wikiQuery?.busy && wikiQuery?.nodeId === nodeId && (wikiQuery?.blockId || null) === (blockId || null)); const writeTitle = React.useCallback((title) => { setDraftTitle(title); onUpdate?.({ titleOverride: title }); }, [onUpdate]); const runWiki = React.useCallback(() => { const query = cleanTitleFragment(draftTitle || displayTitle || fallbackTitle); if (!query) return; if (canDeleteWiki) onDeleteWiki?.(); else onWikiTitle?.(query, blockId, nodeId); }, [blockId, canDeleteWiki, displayTitle, draftTitle, fallbackTitle, nodeId, onDeleteWiki, onWikiTitle]); return writeTitle('')} inputStyle={[styles.titleEditInput, { borderColor: color + '48', color }]} placeholder="Titel" placeholderTextColor="rgba(245,242,215,0.34)" returnKeyType="done" blurOnSubmit autoFocus /> {wikiQuery?.error && wikiQuery?.nodeId === nodeId && (wikiQuery?.blockId || null) === (blockId || null) ? {wikiQuery.error} : null} onUpdate?.({ text: body })} onClear={() => onUpdate?.({ text: '' })} placeholder="Text" placeholderTextColor="rgba(245,242,215,0.34)" inputStyle={[styles.textInput, { borderColor: color + '55' }]} selectTextOnFocus={false} /> ; } function WikiTitleButton({ busy = false, slashed = false, color = '#7df0ff', onPress }) { return {slashed ? : null} ; } function ClearableInput({ value = '', onChangeText, onClear, inputStyle, style, ...props }) { const hasValue = String(value || '').length > 0; return {hasValue ? onChangeText?.(''))} hitSlop={14} style={styles.inlineClearButton}> : null} ; } function ClearableMultilineInput({ value = '', onChangeText, onClear, inputStyle, style, ...props }) { const hasValue = String(value || '').length > 0; return {hasValue ? onChangeText?.(''))} hitSlop={14} style={styles.inlineClearButtonTextArea}> : null} ; } function splitTitleAndBody(text = '', fallback = 'Polygon') { const raw = String(text || '').trim(); if (!raw) return { title: cleanTitleFragment(fallback) || 'Polygon', body: '' }; const normalized = raw.replace(/\s+/g, ' '); const dash = normalized.match(/^(.{1,64}?)\s*(?:[\-–—:]\s+)(.+)$/); if (dash) { const title = cleanTitleFragment(dash[1]); if (title && title.split(/\s+/).length <= 6) { const prefix = raw.match(/^(.{1,64}?)\s*(?:[\-–—:]\s+)/u)?.[0] || `${dash[1]} - `; return { title, body: raw.slice(prefix.length).trim() }; } } return { title: cleanTitleFragment(fallback || ''), body: raw }; } function cleanTitleFragment(value = '') { return String(value || '').replace(/[\r\n]+/g, ' ').replace(/[„“"'`´]+/g, '').replace(/^[\s\-–—:;,.]+|[\s\-–—:;,.]+$/g, '').replace(/\s+/g, ' ').trim(); } const styles = StyleSheet.create({ titleEditRow: { flexDirection: 'row', alignItems: 'flex-start', gap: 8, marginTop: 4, marginBottom: 5 }, titleEditColumn: { flex: 1 }, titleEditInput: { minHeight: 42, borderBottomWidth: 1, borderRadius: 0, paddingHorizontal: 0, paddingRight: 32, fontSize: 20, fontWeight: '900', backgroundColor: 'transparent' }, titleWikiButton: { width: 38, height: 38, borderRadius: 14, borderWidth: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(245,242,215,0.035)', overflow: 'hidden' }, titleWikiButtonDisabled: { opacity: 0.62 }, wikiSlash: { position: 'absolute', width: 29, height: 2, borderRadius: 999, transform: [{ rotate: '-35deg' }], opacity: 0.95 }, wikiError: { color: '#ffb5b5', fontSize: 11.2, fontWeight: '700', marginTop: 2, marginBottom: 5 }, textInput: { minHeight: 132, color: theme.text, fontSize: 17.2, lineHeight: 28, paddingHorizontal: 0, paddingVertical: 6, paddingRight: 34, backgroundColor: 'transparent', textAlignVertical: 'top' }, editorActions: { flexDirection: 'row', justifyContent: 'flex-end', marginTop: 8 }, editorButton: { minHeight: 34, borderRadius: 13, paddingHorizontal: 15, alignItems: 'center', justifyContent: 'center', borderWidth: 1 }, editorDone: { borderColor: 'rgba(245,242,215,0.20)', backgroundColor: 'rgba(245,242,215,0.08)' }, editorButtonText: { color: theme.text, fontWeight: '900', fontSize: 12.6 }, clearableInputWrap: { position: 'relative' }, clearableMultilineWrap: { position: 'relative', marginTop: 8 }, inputWithInlineClear: { paddingRight: 36 }, textareaWithInlineClear: { paddingRight: 36 }, inlineClearButton: { position: 'absolute', right: 4, top: 9, width: 26, height: 26, borderRadius: 10, alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(245,242,215,0.08)' }, inlineClearButtonTextArea: { position: 'absolute', right: 4, top: 10, width: 26, height: 26, borderRadius: 10, alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(245,242,215,0.08)' }, });


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/focus/FocusEntryActionBar.js

import React from 'react'; import { Pressable, StyleSheet, View } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../../core/theme'; export function FocusEntryActionBar({ anchorOpen = false, editing = false, wikiBusy = false, wikiSlashed = false, onEdit, onWiki, onPalette, onAddScale, onAddChild, onDelete, }) { return {onEdit ? : null} {onWiki ? {wikiSlashed ? : null} : null} {onPalette ? : null} {onAddScale ? : null} {onAddChild ? : null} {onDelete ? : null} ; } const styles = StyleSheet.create({ bar: { flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', flexWrap: 'wrap', gap: 10, marginTop: 8, marginBottom: 6, paddingTop: 8, borderTopWidth: 1, borderTopColor: 'rgba(245,242,215,0.060)' }, button: { width: 44, height: 44, borderRadius: 5, borderWidth: 1, borderColor: 'rgba(245,242,215,0.12)', backgroundColor: 'rgba(5,10,24,0.78)', alignItems: 'center', justifyContent: 'center' }, buttonActive: { backgroundColor: 'rgba(245,242,215,0.12)', borderColor: 'rgba(245,242,215,0.26)' }, buttonDone: { backgroundColor: '#77e49b', borderColor: '#77e49b' }, buttonDanger: { backgroundColor: 'rgba(255,47,85,0.13)', borderColor: 'rgba(255,47,85,0.24)' }, buttonDisabled: { opacity: 0.62 }, iconLayer: { width: 20, height: 20, alignItems: 'center', justifyContent: 'center' }, wikiSlash: { position: 'absolute', width: 26, height: 2, borderRadius: 999, backgroundColor: theme.text, transform: [{ rotate: '-35deg' }], opacity: 0.92 }, });


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/focus/FocusScaleRow.js

import React from 'react'; import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../../core/theme'; export function FocusScaleRow({ scale, color = '#7df0ff', editable = false, hidden = false, editingLabel = false, onToggleHidden, onToggleEdit, onChange, onDelete, onAdd }) { if (!scale) return editable ? : null; const value = Number.isFinite(Number(scale.value)) ? Math.max(0, Math.min(10, Number(scale.value))) : 5; const updateValue = delta => onChange?.({ value: Math.max(0, Math.min(10, value + delta)) }); if (hidden) { return {scale.label || 'Skala'} ausgeblendet {editable ? : null} {editable ? : null} ; } return updateValue(-1)} style={styles.iconButton}> {editingLabel && editable ? onChange?.({ label })} placeholder="Name" placeholderTextColor="rgba(245,242,215,0.42)" style={styles.labelInput} /> { const n = Number(String(raw).replace(',', '.')); if (Number.isFinite(n)) onChange?.({ value: Math.max(0, Math.min(10, n)) }); }} keyboardType="numeric" placeholder="0-10" placeholderTextColor="rgba(245,242,215,0.42)" style={styles.valueInput} /> : {scale.label || 'Skala'} · {value} } updateValue(1)} style={styles.iconButton}> {editable ? : null} ; } const styles = StyleSheet.create({ lineRow: { flexDirection: 'row', alignItems: 'center', gap: 4, marginTop: 3 }, barShell: { flex: 1, minHeight: 22, justifyContent: 'center', position: 'relative' }, track: { height: 10, borderRadius: 999, overflow: 'hidden', backgroundColor: 'rgba(245,242,215,0.060)', borderWidth: 0, borderColor: 'transparent' }, fill: { position: 'absolute', left: 0, top: 0, bottom: 0, borderRadius: 999 }, labelOverlay: { position: 'absolute', left: 0, right: 0, top: 0, bottom: 0, alignItems: 'center', justifyContent: 'center' }, labelPress: { maxWidth: '92%', minHeight: 22, justifyContent: 'center', paddingHorizontal: 8, borderRadius: 999, backgroundColor: 'rgba(0,0,0,0.38)' }, labelInline: { color: 'rgba(255,250,218,0.82)', fontSize: 10.4, fontWeight: '900', letterSpacing: 0.15, textAlign: 'center' }, labelInput: { minWidth: 90, maxWidth: 170, minHeight: 24, borderRadius: 999, paddingHorizontal: 9, paddingVertical: 1, backgroundColor: 'rgba(0,0,0,0.82)', borderWidth: 1, borderColor: 'rgba(255,250,218,0.18)', color: '#fffbe2', fontSize: 10.4, fontWeight: '900', textAlign: 'center' }, valueInput: { width: 44, minHeight: 24, borderRadius: 999, paddingHorizontal: 7, paddingVertical: 1, backgroundColor: 'rgba(0,0,0,0.82)', borderWidth: 1, borderColor: 'rgba(255,250,218,0.18)', color: '#fffbe2', fontSize: 10.4, fontWeight: '900', textAlign: 'center' }, editInline: { flexDirection: 'row', alignItems: 'center', gap: 4 }, iconButton: { width: 25, height: 24, borderRadius: 8, borderWidth: 0, borderColor: 'transparent', backgroundColor: 'rgba(245,242,215,0.050)', alignItems: 'center', justifyContent: 'center' }, iconButtonDanger: { borderColor: 'rgba(255,158,158,0.34)', backgroundColor: 'rgba(255,92,92,0.12)' }, hiddenRow: { minHeight: 25, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', gap: 8, borderRadius: 10, borderWidth: 1, borderColor: 'rgba(245,242,215,0.055)', backgroundColor: 'rgba(245,242,215,0.018)', paddingHorizontal: 8 }, hiddenText: { flex: 1, color: 'rgba(245,242,215,0.34)', fontSize: 10.2, fontWeight: '800' }, });


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/focus/FocusTimelineAxis.js

import React from 'react'; import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; import Svg, { Polygon as SvgPolygon, Circle as SvgCircle } from 'react-native-svg'; function cleanTitleFragment(value = '') { return String(value || '') .replace(/[\r\n]+/g, ' ') .replace(/[„“"'`´]+/g, '') .replace(/^[\s\-–—:;,.]+|[\s\-–—:;,.]+$/g, '') .replace(/\s+/g, ' ') .trim(); } function splitTitleAndBody(text = '', fallback = 'Polygon') { const raw = String(text || '').trim(); if (!raw) return { title: cleanTitleFragment(fallback) || 'Polygon', body: '' }; const normalized = raw.replace(/\s+/g, ' '); const dash = normalized.match(/^(.{1,64}?)\s+[\-–—]\s+(.+)$/); if (dash) { const title = cleanTitleFragment(dash[1]); if (title && title.split(/\s+/).length { const timer = setTimeout(() => { try { axisRef.current?.scrollTo?.({ x: Math.max(0, currentIndex * (compact ? 58 : 66) - 146), animated: true }); } catch (_) {} }, 120); return () => clearTimeout(timer); }, [currentIndex, compact, timeline.length]); if (!timeline.length) return null; return {timeline.map((entry, index) => { const node = entry.node || {}; const active = index === currentIndex; const c = node.color || color; const title = splitTitleAndBody(entry.block?.text || '', node.title || 'Polygon').title || node.title || 'Polygon'; return onJump?.(entry, index)} style={[styles.item, compact && styles.itemCompact]}> {title} ; })} ; } function MiniTimelinePolygon({ color = '#7df0ff', active = false, childCount = 0, compact = false }) { const size = compact ? 28 : 32; const sides = childCount {sides : } ; } function regularPoints(cx, cy, radius, sides = 18) { const count = Math.max(3, Math.round(sides || 18)); const start = count === 4 ? Math.PI / 4 : -Math.PI / 2; return Array.from({ length: count }, (_, index) => { const angle = start + index * Math.PI * 2 / count; return `${(cx + Math.cos(angle) * radius).toFixed(1)},${(cy + Math.sin(angle) * radius).toFixed(1)}`; }).join(' '); } const styles = StyleSheet.create({ axis: { minHeight: 66, marginHorizontal: 10, marginBottom: 5, borderRadius: 0, borderWidth: 0, borderColor: 'transparent', backgroundColor: 'transparent', overflow: 'hidden', justifyContent: 'center' }, axisCompact: { minHeight: 58, marginTop: 0, marginBottom: 4, borderBottomWidth: 1, borderBottomColor: 'rgba(245,242,215,0.060)' }, line: { position: 'absolute', left: 20, right: 20, top: 19, height: 2, borderRadius: 2, backgroundColor: 'rgba(255,250,218,0.11)' }, content: { minHeight: 60, paddingHorizontal: 16, paddingVertical: 5, gap: 9, alignItems: 'flex-start' }, contentCompact: { minHeight: 54, paddingHorizontal: 14, paddingTop: 4, paddingBottom: 4, gap: 8 }, item: { width: 58, minHeight: 52, alignItems: 'center', justifyContent: 'flex-start' }, itemCompact: { width: 58, minHeight: 50 }, polyBox: { width: 30, height: 30, alignItems: 'center', justifyContent: 'center' }, polyBoxActive: { transform: [{ scale: 1.08 }] }, label: { marginTop: 7, width: 58, color: 'rgba(255,250,218,0.54)', fontSize: 9.2, lineHeight: 11, fontWeight: '850', textAlign: 'center' }, labelCompact: { width: 58, marginTop: 3, fontSize: 8.4, lineHeight: 10.2 }, labelActive: { color: '#fffbe2', fontWeight: '950' }, });


## import React from 'react';
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/focus/FocusWordText.js

import React from 'react'; import { Pressable, StyleSheet, Text, View } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { theme } from '../../core/theme'; export function FocusWordText({ text = '', selected = [], wordIndex = {}, color = '#7df0ff', readOnly = false, onToggle, onOpenWordLink, onMakePolygons, onEdit }) { const tokens = splitTextTokens(normalizeDisplayText(text)); const selectedCount = selected?.length || 0; const hasText = tokens.length > 0; return {!hasText ? Text leer : null} {tokens.map((token, index) => { if (token.kind !== 'word') return {token.raw} ; const key = normalizeWord(token.raw); const links = Array.isArray(wordIndex[key]) ? wordIndex[key] : (wordIndex[key] ? [wordIndex[key]] : []); const hasLink = links.length > 0; const firstLink = links[0]; const tint = hasLink ? (firstLink?.color || color) : '#a2a6b2'; const isSelected = selected.some(w => normalizeWord(w) === key); return hasLink ? onOpenWordLink?.(links, token.clean) : (!readOnly ? onToggle?.(token.clean) : undefined)} onLongPress={() => !readOnly && onToggle?.(token.clean)} delayLongPress={250} style={[styles.inlineWord, hasLink && { backgroundColor: tint + '14', borderBottomColor: tint + 'cc', borderBottomWidth: 1 }, !hasLink && { borderBottomColor: 'rgba(245,242,215,0.16)', borderBottomWidth: 1 }, isSelected && { backgroundColor: tint + '24', borderBottomColor: '#fffbe2', borderBottomWidth: 1.4 }]}> {token.raw} ; })} {!readOnly && selectedCount ? als Polygone : null} ; } function normalizeDisplayText(text = '') { return String(text || '').replace(/\r\n/g, '\n').replace(/[ \t]+/g, ' ').replace(/\n{3,}/g, '\n\n').trim(); } function splitTextTokens(text = '') { const out = []; const re = /([\p{L}\p{N}ÄÖÜäöüß][\p{L}\p{N}ÄÖÜäöüß\-]{1,})/gu; let last = 0; let m; while ((m = re.exec(text))) { if (m.index > last) out.push({ kind: 'plain', raw: text.slice(last, m.index) }); out.push({ kind: 'word', raw: m[0], clean: m[0] }); last = m.index + m[0].length; } if (last < text.length) out.push({ kind: 'plain', raw: text.slice(last) }); return out; } function normalizeWord(word) { return String(word || '').trim().toLowerCase().replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu, ''); } const styles = StyleSheet.create({ wordBox: { marginTop: 8, paddingTop: 2 }, wordTextWrap: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'baseline' }, plain: { color: 'rgba(245,242,215,0.72)', fontSize: 15.2, lineHeight: 18 }, inlineWord: { marginHorizontal: 1, marginVertical: 1, borderRadius: 0, paddingHorizontal: 0, paddingVertical: 1 }, inlineWordText: { fontSize: 15.2, lineHeight: 18 }, inlineWordTextMuted: { color: 'rgba(245,242,215,0.74)', fontWeight: '700' }, inlineWordTextSelected: { color: '#fffbe2', fontWeight: '900' }, emptyTextPrompt: { minHeight: 38, flexDirection: 'row', alignItems: 'center', gap: 7, borderRadius: 13, borderWidth: 1, borderColor: 'rgba(245,242,215,0.10)', backgroundColor: 'rgba(245,242,215,0.035)', paddingHorizontal: 12, alignSelf: 'flex-start' }, emptyTextPromptText: { color: theme.textSoft, fontSize: 12.8, fontWeight: '900' }, emptyText: { color: 'rgba(245,242,215,0.42)', fontSize: 13.2, lineHeight: 18, fontWeight: '800', marginTop: 2 }, wordActionsInline: { flexDirection: 'row', flexWrap: 'wrap', gap: 7, marginTop: 9 }, wordAction: { flexDirection: 'row', alignItems: 'center', gap: 5, borderRadius: 4, paddingHorizontal: 10, paddingVertical: 7, borderWidth: 1, borderColor: 'rgba(245,242,215,0.14)', backgroundColor: 'rgba(245,242,215,0.055)' }, wordActionText: { color: theme.text, fontWeight: '800', fontSize: 12 }, wordEditInline: { flexDirection: 'row', alignItems: 'center', gap: 5, marginTop: 8, alignSelf: 'flex-start', paddingVertical: 5, paddingHorizontal: 2 }, wordEditInlineText: { color: theme.textSoft, fontSize: 12.2, fontWeight: '800' }, });


## export function fractalStringPath(a, b, index = 0, phase = 0, options = {}) {
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-arbeitsstand/GREMATIK-app-v4.0.672-fxchs/src/ui/fractalStrings.js

export function fractalStringPath(a, b, index = 0, phase = 0, options = {}) { if (!a || !b) return ''; const p0 = asPoint(a); const p1 = asPoint(b); const dx = p1.x - p0.x; const dy = p1.y - p0.y; const len = Math.max(1, Math.hypot(dx, dy)); const nx = -dy / len; const ny = dx / len; const speed = Number.isFinite(options.speed) ? options.speed : 0.08; const requested = Number.isFinite(options.amplitude) ? options.amplitude : 12; const amp = Math.min(9, Math.max(0, requested * 0.22)); const wave = Math.sin(index * 0.73 + phase * speed); const offset = wave * amp; const cx1 = p0.x + dx * 0.33 + nx * offset; const cy1 = p0.y + dy * 0.33 + ny * offset; const cx2 = p0.x + dx * 0.67 + nx * offset * 0.62; const cy2 = p0.y + dy * 0.67 + ny * offset * 0.62; return `M ${fmt(p0.x)} ${fmt(p0.y)} C ${fmt(cx1)} ${fmt(cy1)} ${fmt(cx2)} ${fmt(cy2)} ${fmt(p1.x)} ${fmt(p1.y)}`; } export function membraneStringPath(points = [], index = 0, phase = 0, options = {}) { const clean = points.filter(p => p && Number.isFinite(Number(p.x)) && Number.isFinite(Number(p.y))).map(asPoint); if (clean.length sum + p.x, 0) / clean.length; const cy = clean.reduce((sum, p) => sum + p.y, 0) / clean.length; const moved = clean.map((p, i) => { const dx = p.x - cx; const dy = p.y - cy; const len = Math.max(1, Math.hypot(dx, dy)); const n = { x: dx / len, y: dy / len }; const wave = Math.sin(phase * speed + index * 0.47 + i * 1.11) * amp; return { x: p.x + n.x * wave, y: p.y + n.y * wave }; }); return `M ${moved.map(p => `${fmt(p.x)} ${fmt(p.y)}`).join(' L ')} Z`; } export function relationStringStyle({ primary = false, relation = false, macro = false, color = null } = {}) { const base = color || (primary ? 'rgba(255,246,198,0.62)' : relation ? 'rgba(178,244,255,0.40)' : 'rgba(116,229,255,0.22)'); return { stroke: base, strokeWidth: macro ? (primary ? 0.88 : 0.52) : primary ? 1.08 : relation ? 0.76 : 0.48, opacity: macro ? (primary ? 0.46 : 0.25) : primary ? 0.56 : relation ? 0.38 : 0.20, }; } function asPoint(p) { return { x: Number(p?.x) || 0, y: Number(p?.y) || 0 }; } function fmt(v) { return Number(v || 0).toFixed(1); }


## App-Button Nullpunkt 0
Pfad: Projekte/Appprojekte/app.grematik.de/Projektdateien/app-button-bild/README.md

# App-Button Nullpunkt 0 Der neue App-Button ist gesetzt als visuelle Richtung für GREMATIK: - weiß-cremige organische Struktur - Fuchs-Zentrum - App-Button-Anmutung - weiche 3D-Oberfläche - Verbindung von App, Buch und Web Dateien: - `button/grematik-app-button-nullpunkt-0.png` - App-Code: `00-app-zum-weitercodieren-hier/GREMATIK-app-v4.0.671-fxchs/assets/icon.png` - App-Code: `00-app-zum-weitercodieren-hier/GREMATIK-app-v4.0.671-fxchs/assets/adaptive-icon.png`


## PROJEKTAUFTRAG AKTUELL
Pfad: Projekte/Appprojekte/app.grematik.de/projekt-memory-projektdaten.txt

PROJEKTAUFTRAG AKTUELL App-Projekt. Enthält den weiterführbaren App-Arbeitsstand und das App-Button-Bild als echte Projektinhalte. Prozesshelfer liegen im System. PROJEKT-MEMORY-PROJEKTDATEN app.grematik.de 2026-06-26T16:10:00Z Projektordner auf neue einfache Struktur umgestellt: Auf oberster Ebene liegen nur noch `Projektdateien`, diese Projektgedächtnis-Datei und bei technischen Projekten optional `project-helfer`. Das alte Logbook ist in diese Datei überführt beziehungsweise unter Projektdateien archiviert. Projekt: app.grematik.de Aktueller Sinn: Die App ist der GREMMATIK-Ort, an dem Eingaben zu Knoten, Verbindungen, Vorlagen, Logik und später druckbaren beziehungsweise teilbaren Mindmap-Strukturen werden. Sie soll als Lupe der eigenen Eingabe funktionieren und zugleich weitercodierbar bleiben. Letzter relevanter Stand: TestFlight-Link für die App: https://testflight.apple.com/join/AgUt8sFr . Dieser Link ist auf der Website als Hauptgriff `App testen` gesetzt. Das App-Button-/Icon-Motiv mit heller organischer Struktur, Fuchs-Zentrum und GREMMATIK-Anmutung ist als Richtung gesetzt. Nächste Aufmerksamkeit: App-Code auffindbar halten, aber nicht doppeln. Bei App-Änderungen hier Datum und Wirkung ergänzen. Bisherige Log-/Wiederaufnahme-Spur: ----- QUELLE: LOGBOOK.md ----- # LOGBOOK · app.grematik.de Stand: 2026-06-26 Zweck: Lauffähige App-Arbeitskopie und App-Logbook. Hier wird die GREMATIK-App weitergeführt. Grundregel: Dieses Logbook ist Quelle, Gedächtnis, Verlauf und Entscheidungsregister. Keine größere Änderung ohne Eintrag. Jeder Durchlauf beantwortet: Wo sind wir? Was passiert gerade? Welche Optionen bestehen? Was wurde verändert? Was bleibt offen? ## 2026-06-26 · Strukturwechsel Die ZIP wurde auf die neue Vertrauensstruktur umgestellt. Oben stehen nur noch `projekte` und `betriebssystem`. Projektordner folgen dem Muster `projektname.grematik.de`. ## Führungsregel Die Stimme führt wie Flugbegleiter und CoPilot: ruhig, klar, mit Ansage, aber nicht künstlich. Sie soll Orientierung schaffen, nicht Nebel. Zitate nur passend und mit Quelle. ## 2026-06-26 · App-Vorlage ergänzt Die App-Arbeitskopie enthält nun eine sichtbare Vorlage `GREMATIK Logbook`. Sie soll den Intro-/Logbook-Faden als read-only Inhalt zeigen. ## 2026-06-26 – App auffindbar gemacht Die App ist jetzt zusätzlich unter `00-app-zum-weitercodieren-hier` sichtbar. Damit muss niemand mehr in `maschine-app` suchen. Die Übergabe-ZIP `app.zip` wird in `00-zips-hier` und zentral in `2-PROJEKTE/00-zips-hier-finden` abgelegt. ## 2026-06-26 · Nullpunkt 0 / Erstappbesuch Der Paketstand `fxchs-grematik-de.zip` setzt Protokoll und Eingangssetting auf 0: Der nächste praktische Start wird als Erstappbesuch geführt. Die alte Herkunft bleibt archiviert; die aktuelle Nutzungsoberfläche führt klar zu App, Web, Buch, ZIPs und Projekt-Logbooks. Gesetzt: neuer organischer App-Button, read-only App-Vorlage `GREMATIK Erstbesuch`, sichtbare ZIP-Sammelstellen, Website als schlichte Ordner- und Inhaltsdarstellung. # Aufräumung ZIP-Politik Stand: 2026-06-26T13:41:30Z Befund: Die vorige Gesamt-ZIP war deutlich zu groß, weil Projekt-ZIPs mehrfach in `projekte`, `betriebssystem` und `web/downloads` eingebettet waren. Zusätzlich lagen Original-ZIPs im Originalarchiv. Das war nachvollziehbar als Sicherungsimpuls, aber als Arbeitsstruktur zu schwer und zu unklar. Entscheidung: Keine großen ZIP-Binärdateien mehr in der Gesamt-ZIP. Die Gesamt-ZIP führt Register, Quellen, Logbooks, App-Code, Web-Code und Buchinhalte. Download-ZIPs werden separat gespeichert. Folge: Die Website kann weiterhin Download-Buttons zeigen. Die Dateien müssen dafür auf dem Server separat in `downloads/` liegen. 2026-06-26T16:19:19Z Root-Struktur für diesen Stand bereinigt: Projekt liegt jetzt unter 2-PROJEKTE/PROJEKT-app.grematik.de. Standard oben: 1-SYSTEM, 2-PROJEKTE, 3-ZIPS-BILDER. 2026-06-26T16:45:00Z Projektdateien bereinigt: keine zweite Logbook-Datei mehr im Projektdateien-Ordner. Die Projektgedächtnisführung liegt ausschließlich in projekt-memory-projektdaten.txt. Entfernt aus Projektdateien: LOGBOOK.md. 2026-06-26T16:45:00Z Projektstandard übernommen: keine Logbook-Datei in Projektdateien; projekt-memory-projektdaten.txt bleibt einzige Projektgedächtnisdatei. App-Projektdateien bleiben als App-Code, App-Bild und Weitercodierstand erhalten. 2026-06-26T16:49:48Z Stand 008 – Originalprompt-Pflicht und Prozessmaschine Änderung: Die Projektgedächtnisse wurden auf komplettes Gehirn ausgerichtet. Betroffene Projektlogik speichert ab jetzt Originalprompts im Wortlaut plus kurze Entscheidungsauswertung. Projektdateien wurden weiter von Hilfslogik entlastet; Prozess-, Wiederaufnahme- und Wenn-dies-dann-jenes-Regeln liegen in 1-SYSTEM. ORIGINALPROMPT: sorg mal dafür, dass auch in jedem loogbuch der prompt gespeichert bleibt in originalem wortlaut. ein wirklich komplettes gehirn will ich. das die ordnerstruktur gezielt anläuft, wie eine perfekte prozessmaschine.. wenn dies dann das dann jenes.. bau das bitte radikal um und sorge für lesbarkeit und einheitliche ordnertitelsystematik. und halt die zip schön stabil was meine inhalte betrifft. Auswertung: Sebastian will keine bloße Zusammenfassung, sondern eine ZIP, die im neuen Chat zuverlässig anlaufen kann. Darum wird die Ordnungsmaschine explizit: System zuerst lesen, Originalprompts lesen, Projektgedächtnisse lesen, dann Inhalte anfassen. Inhalte bleiben stabil; Hilfslogik wandert ins System. 2026-06-26T17:05:00Z App-Stand v4.0.672 – Preflight- und Metadatenkorrektur ORIGINALEREIGNIS: [Dateiupload ohne Begleittext] Dateiname: fxchs-grematik-de(12).zip Befund: Die App-Arbeitskopie v4.0.671 war vorhanden und grundsätzlich strukturell lesbar. Der Preflight brach jedoch an zwei Punkten: Der sichtbare App-Name `GREMATIK` enthielt nicht die Version, obwohl das Skript das verlangte; außerdem wurden fehlende `node_modules` als Fehler statt als erwartbare ZIP-Warnung behandelt. Änderung: Die App-Arbeitskopie wurde auf v4.0.672 gehoben. Der ak


## Projektführung eigene.app
Pfad: Projekte/Appprojekte/eigene.app/00-CHATBOT-FUEHRUNG.txt

Projektführung eigene.app Baue aus dem leeren App-Grundgerüst eine erste App-Führung. Erst Zweck, dann Screens, dann Datenstruktur, dann Testablauf. Keine Funktionswünsche sammeln, bevor der Kern steht. Ausgabe: 1. App-Kern, 2. Startscreen, 3. wichtigste Interaktionen, 4. Dateistruktur, 5. nächster Testgriff.


## Stand 27.06.2026 18:17
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-FEEDBACK-EDELSTEIN-STAND-047.txt

Stand 27.06.2026 18:17 Für die Web-App/App: Der Edelstein kann als Feedback-Navi übernommen werden: - 3x3 Raster - Mitte als Sammel-/Hashtagzentrum - Außenfelder als emotionale Einstiegskanäle - Website hell, Instagram dunkel - Kommentare später als Promptmaterial für neue Gemeinschaftsbilder


## Stand 27.06.2026 15:43
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-HEADER-SCROLLGEFUEHL-STAND-044.txt

Stand 27.06.2026 15:43 Für die spätere App: - Header/Marke darf beim Navigieren kleiner werden - Panels können auf Swipe-Tempo und Richtung reagieren - dieselbe Logik wie Web: Richtung, Geschwindigkeit, Nähe - Bewegung immer reduziert und prüfbar halten - keine einzelnen G-Zierzeichen in der Oberfläche


## Stand 27.06.2026 15:50
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-HIGHLEVEL-UI-STAND-045.txt

Stand 27.06.2026 15:50 Für die App: - Kategoriezeilen statt doppelter Überschriften. - quadratische, scharfe Bild-Crops als Vorlagenbilder. - sanfte 8-Sekunden-Zitat-/Leitsatzübergänge. - YouTube/Vibes als eigener klarer Medienraum. - Text darf nie über Kartenrahmen laufen.


## Stand 27.06.2026 15:24
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-HOCHZEIT-WEB-BUCH-STAND-042.txt

Stand 27.06.2026 15:24 Strategischer App-Start: Die App soll denselben Charme und Informationsgehalt wie die aktuelle GREMMATIK.online-Weboberfläche bekommen. Übernehmen: - Intro mit Skip - GREMMATIK.online-Wortmarke - Weltenbild-Ausschnitte als Vorlagenbilder - quadratische Einstiegspanels für Prompt, App, Lesearten - Bücher/Lesearten-Trennung - Autorantworten als FAQ/Lesekörper - Vibes/Artwork als Atmosphäre - Kapitelwachstumsregel als sichtbarer Projektpuls Günstig und strategisch: Zuerst Inhalte und Assets synchronisieren, dann App-UI nachbauen, dann Maps/Bücher koppeln. Keine teure Neuentwicklung, bevor Website-Datenstruktur stabil bleibt.


## Stand 27.06.2026 15:34
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-SOCIAL-BILDSPUR-HOCHZEIT-STAND-043.txt

Stand 27.06.2026 15:34 Für die App-Hochzeit gilt zusätzlich: - keine einzelnen G-Zeichen als UI-Ziergrafik - Wortmarke GREMMATIK.online als Kopf/Marke - Artwork und Bildspur getrennt führen - #Giraffe nur als benannte Bildspur, nicht als private Ursprungserklärung - Social als eigener Außenbereich: Instagram, YouTube, Facebook - App-Start soll die gleiche Ordnung zeigen wie Web: Bücher, Lesearten, Artwork, Social


## Stand 27.06.2026 18:49
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-WEBAPP-START-STAND-050.txt

Stand 27.06.2026 18:49 Webapp liegt jetzt als erster funktionierender Start unter /app/index.html. Status: - Introbereich - Vorlagenkacheln - Fokusraum - GREMMATIK-Optik - Kristallhintergründe - Link aus Vier-Säulen-Hero Nächster Ausbau: - echte Map/Stage - Import/Export - Bücher/Fokusraum-Kopplung - Feedback-Edelstein als Auswahlinterface


## Stand 27.06.2026 18:30
Pfad: Projekte/Appprojekte/eigene.app/Projektdateien/APP-ZITATORGANISMUS-STAND-049.txt

Stand 27.06.2026 18:30 Für Web-App/App: - Zitate können frei im Raum schweben statt in Karten zu sitzen. - Zeichen werden einzeln animiert und morphologisch neu geordnet. - Die Bewegung bleibt weich und ruhig. - Dadurch kann Sprache selbst als lebendige Oberfläche dienen.


## Projekt: eigene.app
Pfad: Projekte/Appprojekte/eigene.app/projekt-memory-projektdaten.txt

Projekt: eigene.app Stand: 032 Status: vorbereitetes Grundgerüst mit leeren Arbeitsordnern. Regel: Der Chat soll zuerst die Führung lesen, dann nur den benannten Bereich bearbeiten. Öffentliche Webkarte: eigene.app