InstantPage V2: implementation
Initial design, plan, scaffold, and the full incremental implementation of InstantPage V2 used by ChatMessageRichDataBubbleContentNode: layout data types and driver, shared text helpers, text view / divider / anchor, lists, code blocks, block/pull quotes, media placeholders, details (with recursion), tables, hit-test / selection / last-line helpers, V1→V2 swap in the rich-data bubble, and post-swap fix-ups (cache key, RTL paragraphs, list geometry, lazy pageView construction, fitToWidth horizontal inset, V2View.update() no longer writes self.frame).
This commit is contained in:
parent
cea2846249
commit
c32ef046b7
4 changed files with 3211 additions and 434 deletions
11
CLAUDE.md
11
CLAUDE.md
|
|
@ -35,6 +35,17 @@ The build needs `TELEGRAM_CODESIGNING_GIT_PASSWORD` in the environment. It is se
|
|||
- External code is located in `third-party/`
|
||||
- No tests are used at the moment
|
||||
|
||||
## View frame ownership
|
||||
|
||||
A view does not control its own `frame`. The parent (or a layout system) sets the frame; the view positions its own subviews against `self.bounds` in response.
|
||||
|
||||
This matters in two places specifically:
|
||||
|
||||
- **Reusable components (`UIView`/`ASDisplayNode` subclasses).** Public methods like `update(...)` / `apply(...)` rebuild internal state, mutate child frames, and read `self.bounds` to lay them out — but they do not write `self.frame`. The caller has already chosen the frame; mutating it from inside the component overrides that choice and fights the parent's next layout pass.
|
||||
- **`asyncLayout`-style content nodes.** The measure pass runs off-main and returns a size; the apply step runs on main and the chat layout system positions the node. A child view that writes `self.frame` from `update()` corrupts the size the parent just measured.
|
||||
|
||||
Rare exceptions: top-level view-controller views integrating with the system's first-responder/inset model. If you find yourself wanting `self.frame = …` from inside a child view, refactor so the parent positions it instead.
|
||||
|
||||
## Postbox → TelegramEngine refactor (in progress)
|
||||
|
||||
A gradual migration is underway to eliminate direct `import Postbox` from consumer submodules in favor of `TelegramEngine`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue