An agent run found that connecting to a grouped shape answered ok but left
the connector's end unset: the sites of a group member were computed in the
group's child space, and rerouting only looked at the slide's top-level
shapes, so the glue was dropped at once. Both now locate the shape anywhere
in the tree with the affine onto the slide, as PowerPoint glues to grouped
shapes. shape.sites answers in the same slide space. A line inside a group is
refused as `id`: its ends would land in the group's space, and rerouting
does not follow grouped connectors.
Split out of the connector default sites PR at review.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`cells` must be a list of exact [row, col] pairs inside the table; an entry
that is not one, a cell past the table, or more than 100000 entries is refused
and names the command, instead of being dropped or read as absent (which acted
on the selection or the whole table). Borders use checked arithmetic for the
neighbour cell. Split out of the 0-based index PR at review.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With rotateWithShape false, the renderer lays linear and radial gradients
out upright on the slide, while rectangular and path gradients still turn
with the shape. The shape.fill params doc now says so.
Review follow-up on #1658 (CodeRabbit), both from storing the slide's
mapped scheme in 30ccc38e:
- Copying in Slide Master view used the current slide's colour map. Use
`ctx_for`, so the theme is that of what is being edited.
- `ColorScheme` shares an entry between `dk1` and `tx1`, so a mapped scheme
changed direct `dk1` colours too: a dark fill pasted white. `SourceTheme`
keeps the theme's colours and the map apart, and `bake_theme` maps only
`tx1`, `bg1`, `tx2` and `bg2`, as `Ctx::color` does.
The browser image test now checks that non-picture pastes keep their text.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-up on #1658 (CodeRabbit): `source_theme` stored the master's
scheme, so a slide or layout that overrides the colour map had its colours
fixed through the wrong map. Detaching made this reach a placeholder's
inherited colours: a title drawn white under an override pasted black.
Store the scheme the slide draws with. Paste as Picture reads the same
value.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-up on #1658:
- The drag duplicate cleared `ph` without detaching, so a title or body
dragged off with Alt lost its size and bullets. Copy, Duplicate and the
drag now share `detach_on_slide`.
- Detaching at copy time turned a slide placeholder pasted in Slide Master
view into a regular shape. The clipboard keeps the originals, and a paste
there takes them, so it stays a placeholder as before this PR. Keep
Source Formatting bakes them too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Ogg: include recovered tail packets in Opus duration
Keep the existing missing-granule recovery cursor in step with the packet ends it assigns. Add a regression for a partially and entirely unanchored stream; existing valid end-trimming coverage remains unchanged.
Validation: rustc --edition=2024 --test crates/ogg/src/lib.rs: all 12 tests pass. Scoped rustfmt check passes. Full cargo --offline xtask ci is blocked before build by the uncached pinned egui checkout.
* Ogg: record recovery duration correction
A file the page sent without a name opens untitled and unchanged, like the
empty start presentation, so the page's next file closed it. Host mode now
records the start presentation (start_for_host) and only the first file
that opens takes its place, as packaging/web/README.md says.
Save As > Save under the presentation's own name changed neither the path
nor the dirty flag, so the Save As page stayed open and a second click sent
the file again. The page now also compares the revision, which every save
bumps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fonts: bound font-controlled work in enumeration, outlines and carets
An embedded font could make each lookup do far more than real fonts need:
- enumerating a collection read up to 256 faces times 1024 named instances,
each then built with its own shaper; now 4096 per file across all faces,
with a set for the duplicate-style check instead of a scan;
- composite and VARC glyphs could expand one dense outline without limit,
and the outline cache only counted entries; outlines now stop at 32768
path elements (drawing nothing past it) and the cache is also bounded by
the elements it holds;
- the 64-caret limit applied after filtering, so a ligature lookup could
read every caret record; it now applies to the records read.
* address review: bound thread-local glyph cache by path elements
* render: look up a table's style once, keep the skip list as a set, count each dash
* render: index chart point fills, scatter x presence and waterfall bars once per chart
A same-origin page that frames DeckCraft's web build with ?host=parent
sends a file with deckcraft:open and gets every save back as
deckcraft:save {name, saveAs, bytes} instead of a download, with
deckcraft:ready, deckcraft:dirty and deckcraft:failed, as GridCraft,
WordCraft and PdfCraft do. Without ?host=parent nothing changes.
Save follows the desktop app. Every file from the page opens through
file.adopt like File > Open on the desktop; a presentation sent with a
presentation name keeps that name as its file, so Save (Ctrl+S, the
File tab, the Close prompt or the command palette) writes it back under
that name and format with saveAs: false. Anything else (no name, an
outline, a damaged file opened as a repaired copy, a dropped file) is
untitled, and its first Save is a new <title>.deckcraft with saveAs:
true, as is Save As. Exports and Print are copies (saveAs: false).
Host mode starts with an empty presentation that gives way to the first
file while untouched, &author= signs comments, and the URL flags are
read as whole parameters so a free-text author can't set ?show.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* PPTX export: index animation targets, cache a paragraph's build roles, serialize run properties once per text run
* address review: warn once when a by-paragraph build is truncated
* av1: count repeated-frame outputs as they are added
* hevc: give each slice segment its own entry-point list instead of keeping the copied one's allocation