BL-16822 Inline images: the model, its persisted state, and its undo stack - #8320
BL-16822 Inline images: the model, its persisted state, and its undo stack#8320hatton wants to merge 1 commit into
Conversation
ade2a25 to
a2403dd
Compare
dcceab2 to
78244c2
Compare
|
✅ Handled — see the outcome at the end of this comment. [Devin] Bug: Feature failures silently disable access
When [Claude Opus 5 (1M context) from Hatton's machine during devin-review] Agreed, and the change is gone: |
|
✅ Assessed, no change needed — see the outcome at the end of this comment. [Devin] Investigate: PR target conflicts with guidance
The merge base is on [Claude Opus 5 (1M context) from Hatton's machine during devin-review] Not an issue -- same answer as on the first PR of the stack. This work targets |
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin on 2026-09-07 12:46 MDT up to commit It raised 6 things. Each has its own review thread with the reasoning and the outcome; in short:
1 informational observation were also reported and read but not mirrored as threads (low signal). The fixes were amended into this branch after the review, so the commit above is not the current head; a fresh review is running against the new one. The only GitHub check on this PR is |
78244c2 to
471b275
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin again on 2026-09-07 14:00 MDT, on commit It raised 3 new things. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the first round's threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
471b275 to
170d1bd
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a third time on 2026-09-07 15:55 MDT, on commit It raised 1 new thing. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
170d1bd to
8b39889
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a fourth time on 2026-09-07 16:20 MDT, on commit It raised 2 new things. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
8b39889 to
0a0f8b0
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a fifth time on 2026-09-07 16:50 MDT, on commit It raised 1 new thing. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
…stack The whole of what an inline (Word-style) image is on disk, and the operations that read and write it. A picture is a div.bloom-inlineImage wrapper carrying one of four dock classes, contenteditable="false", a data-bloom-inline-image-id shared by its per-language copies, and three custom properties: a width percent, an aspect ratio, and a vertical offset in layout pixels. The one design point worth knowing before reading the code: a float only wraps the text of the block it sits in, so a picture cannot be one element. It exists once in every bloom-editable of the translation group, the hidden lang="z" prototype included, and the copies are kept identical by syncInlineImagesFromEditable at operation time and normalizeInlineImages at page setup. The prototype's copy matters more than it looks: it is what TranslationGroupManager clones when a language is added to the collection later. Also here, because the model owns it: the feature's own undo stack. Inline-image operations change the DOM programmatically in several editables at once, which neither ckeditor nor the image-operation layer can reverse, so workspaceRoot's undo command consults a third stack the way it already consults origami's and the image operations'. A snapshot is taken before an operation and dropped again if the operation ended where it began. Nothing in this commit creates a picture -- the menu item and the gestures are the next one -- so merged alone it changes no behaviour. INLINE-IMAGES-PLAN.md is the design document. featureStatus.ts gains a rejection handler: without it the promise never settles when the api is unreachable, which is the case under unit test, and the error goes to the global reporter. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014DCBGajN5YyAYPBenEf1yy
0a0f8b0 to
b4b0354
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a sixth time on 2026-09-07 17:30 MDT, on commit It raised 1 new thing. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
The whole of what an inline (Word-style) image is on disk, and the operations that
read and write it. A picture is a div.bloom-inlineImage wrapper carrying one of four
dock classes, contenteditable="false", a data-bloom-inline-image-id shared by its
per-language copies, and three custom properties: a width percent, an aspect ratio,
and a vertical offset in layout pixels.
The one design point worth knowing before reading the code: a float only wraps the
text of the block it sits in, so a picture cannot be one element. It exists once in
every bloom-editable of the translation group, the hidden lang="z" prototype
included, and the copies are kept identical by syncInlineImagesFromEditable at
operation time and normalizeInlineImages at page setup. The prototype's copy matters
more than it looks: it is what TranslationGroupManager clones when a language is
added to the collection later.
Also here, because the model owns it: the feature's own undo stack. Inline-image
operations change the DOM programmatically in several editables at once, which
neither ckeditor nor the image-operation layer can reverse, so workspaceRoot's undo
command consults a third stack the way it already consults origami's and the image
operations'. A snapshot is taken before an operation and dropped again if the
operation ended where it began.
Nothing in this commit creates a picture -- the menu item and the gestures are the
next one -- so merged alone it changes no behaviour. INLINE-IMAGES-PLAN.md is the
design document.
featureStatus.ts gains a rejection handler: without it the promise never settles when
the api is unreachable, which is the case under unit test, and the error goes to the
global reporter.
Card: https://issues.bloomlibrary.org/youtrack/issue/BL-16822
🤖 Generated with Claude Code
https://claude.ai/code/session_014DCBGajN5YyAYPBenEf1yy
Devin review
This change is