Forge
markdowndeeb25a2
1# Playbook: Skia text surface (composer) v1
2
3Семейство TCI (composer, CCL, navigator): см. `playbook-tci-v1.md`.
4
5**Связь:** [ADR 0123](../adr/0123-intercom-full-skia-surface-evolution.md), `Views/SkiaKit/SkiaPlainTextLayout.cs`, `SkiaComposerStrip.cs`.
6
7## Инварианты (PR-review)
8
91. **Measure = Draw = Caret = Hit-test** — только `SkiaPlainTextLayout` / `SkiaRichTextKitMarkdown.TryMeasurePlain`; не добавлять отдельный `WrapLines` для UI.
102. **Истина текста в control** — `ComposerText` + `ComposerCaretIndex` (+ `ComposerPreeditText`); VM синхронизируется через `ComposerDraftChanged`, каретка **до** `ChatInput`.
113. **Preedit в measure** — `SkiaIntercomCommandDeckLayout` и `MeasureHeight` получают `composerPreeditText`.
124. **Invalidation** — мигание каретки: `InvalidateComposerChrome()` (кэш ленты); полный `InvalidateVisual()` при смене snapshot/текста ленты.
135. **Pointer** — клик в composer → `TryPlaceComposerCaretAtPoint`; wheel при переполнении → `TryScrollComposer`.
14
15## Чеклист новой фичи ввода
16
17- [ ] Shift+стрелки / выделение / Ctrl+A,C,X,V
18- [ ] IME: `SetPreeditText`, высота deck с preedit
19- [ ] Headless-тест на caret/hit-test (см. `SkiaPlainTextLayoutTests`)
20- [ ] Automation: `SkiaComposerAutomationPeer` Value = `ComposerText`
21
22## Известные границы (v1)
23
24- Clarification batch остаётся на Avalonia `TextBox` (ADR 0123 фаза 4).
25- CCL — упрощённый caret (`SkiaCommandLineStrip`), без полного parity composer.
26
View only · write via MCP/CIDE