Commit Graph
25 Commits
Author SHA1 Message Date
Brandon Thomas b56d5792b0 Merge the format, canvas and dialog PRs integrated on land-r4 (#567 #569 #630 #637 #536 #559 #519 #506 #549 #556 #525)
# Conflicts:
#	crates/engine/src/cmd/review.rs
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/dialogs.rs
#	crates/ui-egui/src/panes.rs
2026-10-14 15:06:35 -04:00
Brandon ThomasandClaude Opus 5.5 2e727a3ccf Merge PR #492 from NikitkaRa: Shapes: smooth a rectangle's corners into a squircle (#286)
Fix-up in the merge (review): shape.smoothCorners re-smooths a custom outline only when it is a
squircle it drew with the given radius, so a freeform is never replaced by a rectangle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:05:10 -04:00
Brandon ThomasandClaude Opus 5.5 e6862f18ae Fix up merged PRs: WordArt warp handles on main's warp catalog and hover hit list
- #519's handle test iterated the old `ALL` preset list; main has `CATALOG` now.
- The hover hit-test match lists every Hit variant; add #519's Hit::Warp.
- Drop the duplicate "tabs" dialog title that #569 and #637 both added.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:49:10 -04:00
Brandon Thomas b267a921cd Merge PR #519 from NikitkaRa: UI: WordArt adjust handles drag a text warp
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/engine/src/tools.rs
#	crates/geom/src/warp.rs
2026-10-14 14:46:54 -04:00
Brandon Thomas 2c57da32ad Merge PR #643 from NikitkaRa: Shapes: chevron text rectangle per presetShapeDefinitions 2026-10-14 13:09:03 -04:00
Brandon Thomas bd8e227596 Merge PR #642 from NikitkaRa: Shapes: star4/star5 text rectangles as the standard defines them 2026-10-14 13:09:03 -04:00
Nikita Rakitin 3fd1083468 Shapes: chevron text rectangle as presetShapeDefinitions give it 2026-10-14 03:27:58 +03:00
Nikita Rakitin 111f029112 Shapes: star4 and star5 text rectangles as ECMA-376 defines them 2026-10-14 03:23:17 +03:00
Nikita RakitinandCursor a7bc932cc8 UI: WordArt adjust handles drag a text warp
A selected text warp shows one yellow handle per adjust.
Dragging it sets that guide value in one undo step.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:38:16 +03:00
Nikita RakitinandCursor 283b30f12d UI: WordArt Transform gallery applies a text warp
Shape Format ▸ Text Effects lists the 40 prstTxWarp presets and
No Transform. format.textWarp sets or clears that warp on the
selected text, with optional adjust values.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:58:35 +03:00
Nikita RakitinandCursor 2a79cb7671 Shapes: smooth a rectangle's corners into a squircle (#286)
deckcraft_geom::squircle builds a rectangle outline whose corners start
curving earlier along the edge and keep a shorter circular arc, as design
tools' corner smoothing does. shape.smoothCorners turns rectangles and
rounded rectangles into that outline (custom geometry, so it round-trips
through PPTX), and Edit Shape gains a Smooth Corners slider.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:17:39 +03:00
Brandon ThomasandClaude Opus 5.5 4e2cbaed79 Geom: moon, magnetic disk and drum by the standard
- The magnetic disk's and drum's end ellipses were half the size of
  PowerPoint's: ECMA-376 makes them h/6 high (disk) and w/6 across
  (drum); measured on PowerPoint's outlines.
- The moon's inner edge was a half ellipse of the box's height; the
  standard's is an arc of a larger ellipse through the right corners and
  (adj * w, middle) whose centre lies right of that point (radius g18w
  across, dy1 down), and so it is fuller. Text rectangle from the standard
  too.

Wild synthetic set: preset galleries 3.76 -> 3.47, 3.45 -> 3.21,
4.31 -> 4.00 and others slightly.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 c0dcfc1db5 Geom: stars stretched by the standard's hf/vf factors
Five-, six-, seven- and ten-pointed stars used their own normalisation
and came out narrower or shifted against PowerPoint's. ECMA-376 places a
star's points on an ellipse around (hc, vc * vf) with radii half the box
times hf / vf (star5 1.05146 / 1.10557, star6 1.15470, star7 1.02572 /
1.05210, star10 1.05146), so the points touch the box's edges; now done
for all stars (checked exactly against PowerPoint's outlines at three
sizes and inner-radius adjusts).

Wild synthetic set: star galleries 4.08 -> 3.76, 3.77 -> 3.45,
4.62 -> 4.31 and the adjust galleries slightly.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 9238a915a2 Render: presets PowerPoint mitres by default get sharp corners; miter limit 8
An outline naming no join was always rounded. PowerPoint rounds most
presets but mitres some by default: classified per preset by comparing
its export (8 pt outline, no join) with round- and miter-joined renders:
the plus, right/up/down block arrows (not the left one), chevrons, stars
from five points up, the equation shapes, curved ribbons and the action
buttons. Miter joins also take PowerPoint's default limit of 8 widths
(kurbo's default was 4), so sharp star points no longer bevel off.

Wild synthetic set: joins slide 0.43 -> 0.21, outline-on-pattern slide
3.95 -> 3.76, preset galleries slightly better.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 4012cea0bf Geom: sun, wave and double wave by the standard's formulas
The sun's rays were thin spikes around a smaller core, and the waves'
curves had the wrong amplitude and shift. They now follow ECMA-376: the
sun's eight triangular rays with bases at the standard's fractions of the
core's margin around a circle of radius 50% - adj (with its handle), and
the waves' cubic edges whose control points sit 10/3 of the amplitude off
the edge, shifted by adj2 (text rectangles too). Checked against
PowerPoint's outlines at three sizes and adjust values (within 0.13 pt).

Wild synthetic set: sun 30 -> 9 per-shape diff; group fill slide (waves)
7.88 -> 5.82; whole set 4.71 -> 4.65.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 2965e69e2f Geom: equation shapes by the standard's formulas
Plus, minus, multiply, divide, equal and not-equal were approximations
(bars spanning the wrong width, the X's arms too long, the not-equal slash
at the wrong angle and length, dots sized off the shorter side). They now
follow ECMA-376's guide formulas: bars span 73.49% of the width; adjusts
pin as the standard pins them; the X's arms follow the box's diagonals
cut at 51.965%; the slash leans at adj2 through the full height. Each was
checked against PowerPoint's outline at three aspect ratios and custom
adjust values (max deviation 0.002 pt). Text rectangles follow the
standard too.

Wild synthetic set: equation galleries 10.20 -> 5.32, 10.06 -> 5.31,
5.45 -> 2.47; whole set 4.84 -> 4.71.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 ee4712f829 Geom: lightning bolt, explosions, heart, cloud and document flowcharts as the standard defines them
These presets were hand-drawn approximations and looked visibly different
from PowerPoint's (the lightning bolt had 7 points instead of 11, the
explosions were different polygons, the cloud a ring of lobes without
creases). They now follow ECMA-376's preset geometry, checked against the
outlines PowerPoint gives for them (black-box: merging each preset with a
far-away square and reading the resulting freeform):
- lightningBolt, irregularSeal1/2: the standard's polygons (21600ths);
- heart: its two cubic curves;
- cloud (and cloudCallout's outline): the standard's eleven arcs drawn in
  the path's own 43200-unit square, plus the crease arcs, stretched to the
  box; arcs take DrawingML's angle convention (direction from the
  centre), new Pb::arc_spec;
- flowChartDocument, flowChartMultidocument (three pages, outlined where
  they show), flowChartPunchedTape (half-ellipse edges).

Wild synthetic set (per-shape mean diff, 1:1 gallery): lightningBolt
64.1 -> 2.8, irregularSeal1 41.1 -> 5.3, irregularSeal2 41.2 -> 4.8, cloud
28.2 -> 4.0, multidocument 30.9 -> 7.0, punched tape 27.7 -> 4.1, heart
20.9 -> 3.9, document 15.3 -> 3.8. Whole set 5.05 -> 4.84.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 9a7e7e133e Geom/Render: brackets and braces fill; arrowheads follow open paths, not brackets
- Left/right brackets and braces drew only their curve: a filled bracket
  showed no fill. PowerPoint fills them out to the straight side they open
  to (the fill path is the curve closed), outlining only the curve.
- Arrowheads were drawn on any shape with nothing filled (brackets among
  them) but not on open freeforms that had a fill. PowerPoint puts them on
  lines, arcs and open freeforms whether filled or not, never on brackets.

Wild synthetic set: preset galleries 9.44 -> 4.65, 9.55 -> 4.94,
9.60 -> 5.38; extreme-adjust galleries 10.7 -> 6.6.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 a293b68258 Shapes: add 38 missing preset geometries (#315)
lineInv, nonIsoscelesTrapezoid, pieWedge, the left-right / up-down / quad
arrow callouts, circularArrow / leftCircularArrow / leftRightCircularArrow,
the four curved arrows, swooshArrow, callout1-3, accentCallout1-3,
borderCallout2-3, accentBorderCallout1-3, ellipseRibbon / ellipseRibbon2,
leftRightRibbon, flowChartOfflineStorage, gear6 / gear9, funnel, the corner
tabs (corner, square, plaque) and chartX / chartStar / chartPlus no longer
fall back to plain rectangles.

Each outline is our own construction in crates/geom/src/preset/extra.rs,
fitted black-box against PowerPoint renders of synthetic probe decks at
default, changed and extreme adjust values and several aspect ratios
(outline within ~1pt on 300-480pt shapes). Tests cover catalog presence,
hostile sizes/adjusts and measured outline points.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 18:15:54 -04:00
Brandon ThomasandClaude Opus 5.5 dedb20890b Text: WordArt transforms (prstTxWarp) draw, and their adjusts round-trip (#312)
* Text warps: draw WordArt prstTxWarp presets, round-trip their adjusts

All 40 DrawingML text-warp presets now render instead of drawing flat text.
A warp is a list of bands over the shape's text rectangle (insets ignored):
fill bands stretch the ink of their lines between a top and a bottom guide
(positions by arc length, one horizontal scale for the whole text), follow
bands (arch, circle, button) set lines at natural size along an ellipse arc,
lines stacking outwards on parallel curves, with no wrapping. Lines are
shared over multi-band presets in order (ceil(n/k) per band).

The guide curves were fitted to PowerPoint renders of synthetic decks of
"I" bars (black-box observation, defaults and changed adjusts, 1-3 lines);
most presets match within about a point on a 420 x 200 pt box.

- geom: warp module (guides, presets, band mapping) with unit tests
- render: glyph outlines and underlines flattened, subdivided and mapped
- text: follow warps lay out without wrapping
- model/pptx: BodyProps.warp_adj read from and written to prstTxWarp/avLst

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Text warps: bands with fewer lines keep the fuller band's text height

Multi-band fill warps (Deflate-Inflate, Button Pour) map a box as tall as
the tallest band's ink onto every band, centred on the band's own ink, as
PowerPoint does: a band holding one line next to a band of two keeps the
line at the same size instead of stretching it over the whole band.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 18:12:58 -04:00
alexanderalberandBrandon Thomas 788831834b Morph: a changed geometry morphs its outline (a circle turns into a star) (#27)
* Morph: a changed geometry morphs its outline (a circle turns into a star)

Paired shapes that differ only in geometry (another preset, other adjust
values, a custom path) and fill colour no longer cross-fade: one shape moves
and its outline turns from the old geometry into the new one.

- geom::morph aligns two outlines the way manim does: the same number of
  contours, the same number of cubic curves per contour pair, then every
  point moves in a straight line. Closed contours are turned and reversed so
  the points travel least (a triangle does not twist into a circle), extra
  points go to the longest curves, and a sub-path without partner grows out
  of (or shrinks into) a point, so a cube's faces appear and a donut's hole
  closes. Fill mode, outline and fill rule switch at the midpoint.
- anim::morph_frame lists such shapes in MorphFrame::paths; the renderer
  draws them with the morphed geometry (PathMorph, a new render_blend
  argument next to TextMorph).

Ported from the path morph in alexplain (MIT, same author).

generated with Claude Code

* Morph: differing looks of an outline cross-fade instead of switching

When a sub-path pair differs in fill mode, outline or fill rule, the two
looks no longer switch at the midpoint. A fill or outline only one side has
fades out (or in), so a filled shape turning into a line loses its fill
gradually. When both fill, the even-odd side lies opaque underneath and the
other fades over it, so a donut's hole fills smoothly while it shrinks.

generated with Claude Code

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-10 06:19:32 -04:00
Brandon ThomasandClaude Opus 5.5 ae9d525bce Rename SlideCraft to DeckCraft: crates, apps, binaries, app id, file extension (.deckcraft; .slidecraft files still open), packaging, docs; ROADMAP alpha and parity estimates
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 01:46:40 -04:00
Brandon ThomasandClaude Opus 5.5 e273d60f22 PPTX import/export: full OPC package, themes, masters/layouts, shapes, text, pictures, media, tables, charts, transitions, animations, comments; verified opening in PowerPoint
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:50:02 -04:00
Brandon ThomasandClaude Opus 5.5 e62b7ccd15 M0: PowerPoint-style egui UI, slide show engine, icons, desktop app
- ui-egui: title bar, ribbon with every tab (Home, Insert, Draw, Design, Transitions,
  Animations, Slide Show, Record, Review, View) plus contextual Shape/Picture Format,
  Table Design/Layout, Chart Design, Playback and Slide Master tabs; thumbnail pane with
  sections and drag reorder; canvas with selection handles, smart guides, marquee,
  in-place text editing; notes pane; status bar with views and zoom; task panes
  (Format Shape, Background, Animation, Selection, Comments, Design Ideas); dialogs;
  Slide Sorter, Notes Page, Outline view; command palette; control channel
- anim: timelines for every animation effect, transition layers for every transition,
  morph pairing, show navigation (hidden slides, custom shows, loops)
- show: full-screen slide show with transitions, animations, pen, black/white
  screens, presenter view window, rehearse timings, reading view
- icons: 238 original icons drawn in code
- render: filters force single-threaded rendering (regression test), panic guard
- engine: chart type/data/options, SmartArt-style graphics
- apps/slidecraft: desktop host with control server, file dialogs, clipboard images
- placeholder app icon rendered by SlideCraft itself

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:08:13 -04:00
Brandon ThomasandClaude Opus 5.5 6078b68e97 M0: workspace, model, geometry, fonts, text, renderer, engine, MCP and CLI
Clean-room PowerPoint-class presentation engine in pure Rust:
- geom: units, transforms and 150+ re-derived preset shapes with adjust handles
- color: theme slots and colour transforms
- model: presentations, masters, 11 layouts, placeholder inheritance, themes,
  text, tables, charts, transitions, animations, text edit operations
- fonts: font DB with craft-fonts, system fonts and open substitutes
- text: shaping, line breaking, bullets/numbering, alignment, autofit, caret hit tests
- render: vello_cpu slides with fills, gradients, pictures, effects, tables, charts
- format: native .slidecraft (zip + JSON)
- engine: ~200 commands, undo/redo, clipboard, pointer tools, keys, sample deck
- mcp: MCP server (headless or bridged to the app); slidecraft-cli

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 23:27:20 -04:00