The ribbon now asks for one more frame when a tab's spare room changes by
more than half a point, so the row is sized for the new width even when no
input follows the resize. The test resizes 1440 to 1920 and back and checks
the harness settles.
The gallery put all 24 picture styles in the ribbon row, about 1370 px, so
Alt Text, Arrange, Crop and Size sat past the ribbon's edge in any window
narrower than about 2500 px, the default 1440 px window and a maximized
1920 px one included. The row now shows as many styles as leave room for
the groups after it (at least two), sized from the width the tab left free
on the last frame, and an arrow opens all 24 in a menu, as the Transitions
and Animations galleries do.
Layout added the paragraph's start to the running count, so start k set
paragraph by paragraph read 1, 3, 5. A change of start_at between
neighbouring numbered paragraphs now restarts the count, as PowerPoint's
Start at does; the same start on every paragraph still counts on.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Found while testing crates/engine/src/cmd/ideas.rs:254 (apply_cmd); same pattern in ideas_cmd :248
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Found while testing crates/engine/src/cmd/animation.rs:342 (clear)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Back from slide B to slide A played A's own entrance transition. PowerPoint
plays the transition B came in with, backwards.
ShowState now remembers that the current slide was reached by Back
(`backward`, set by `prev`, cleared by every other way in). The show then
takes the transition of the slide it left and runs its frames from the end
to the start, with the old and new slides trading places
(`transition_layers`). Morph needs no reversing: a Morph from the slide
left to the one come back to already is the reversed Morph. A jump (Go to
Slide, links, See All Slides) still plays the target slide's transition.
Co-Authored-By: Claude <noreply@anthropic.com>
Found while testing crates/model/src/edit.rs:420-439 (replace_text), reached from crates/engine/src/cmd/slide.rs:556 (notes)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found while testing crates/model/src/chart.rs:1273 (Chart::histogram_bins, bin index computation)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found while testing crates/engine/src/cmd/richclip.rs:121-170 (html_to_body, opening-tag handling; is_block at :190)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A group that keeps a gradient, pattern or picture fill for its pictures
no longer shows that fill's editor while its shapes have the slide
background fill, so editing it cannot replace their fill.
A group whose picture uses the group's fill keeps that fill when its
shapes take the slide background fill. The pane now shows Slide
background fill chosen for that group.
Found while testing crates/engine/src/cmd/richclip.rs:121-139 (html_to_body), with tag_kind at :175
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
slide.reset drops a placeholder's stored box, and compare called that
"rotated" because None differed from a stored rotation of 0. Absent now
equals 0 for rotation and no flips; a real flip difference reads "flipped".
PowerPoint's Compare reports a rotation only when the angle differs.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
shape.move or shape.setBounds on a group's child left the group's box as it
was, so inspect_slide reported stale bounds. After any edit that changes a
child's box or the child list, the group's box is refitted to the union of its
children (its child space too, so every child keeps its place on the slide).
A group that was itself moved or resized, and SmartArt groups (regenerated
inside their own box), are left alone.
PowerPoint: a group's bounding box always hugs its children; dragging one
child out grows the group, dragging it back shrinks it.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
It already does: insert.actionButton gives the shape the accent1 style with no explicit fill, as
PowerPoint's gallery button has, so a theme change recolours it. No code change; a test pins it.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Not a bug: file.export writes the second PNG over the first with the edit in
it. The test pins it (export, edit, export to the same path, files differ).
PowerPoint: Save As / Export to an existing file name replaces the file.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The answer was null. Presenter view is its own window beside the show window,
so window is true; the doc says where it appears.
PowerPoint: Presenter View opens in a separate window on the second display
when the show starts (the Use Presenter View option); same here.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
align: left|center|right|justify sets every paragraph of the target cells;
anchor stays the vertical alignment and is optional when align is given.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Dictionary::check splits a word at every point looking for compound
parts, so a check costs O(n²) in the word's length under a compounding
dictionary (German, Dutch, …). A 100,000-character "word" took about
17 s per check in release, and spell check runs again on every edit.
suggest() was already capped at 64 characters; check() wasn't.
Words longer than MAX_CHECK_CHARS (100, Hunspell's word length limit)
now pass unchecked.
set_max_width(CONTENT_W) widened the page past the margin whenever the window was
narrower than CONTENT_W, so the last tile in each row ran off the screen edge.
changed() also fires when the slider rounds the value it shows, on focus too. Compare the rounded
values, so keyboard and accessibility edits commit without focus and rounding does not.