Commit Graph
105 Commits
Author SHA1 Message Date
Brandon Thomas 02b502b69d Merge PR #514 from NikitkaRa: Shapes: Edit Points — drag, add and delete a shape's vertices
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-14 13:08:48 -04:00
Brandon Thomas e12f40a05a Merge PR #511 from NikitkaRa: UI: WordArt Transform gallery applies a text warp 2026-10-14 13:08:48 -04:00
Brandon Thomas 16138fc03d Merge PR #503 from NikitkaRa: Format Shape: shadow, glow and reflection detail controls
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-14 13:08:47 -04:00
Brandon Thomas ca7140c1ff Merge PR #500 from NikitkaRa: Format Shape: line compound, cap, join, arrows and sizes; lock aspect ratio
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-14 13:08:46 -04:00
Brandon Thomas 44f4b037e2 Merge PR #244 from pierrevbc: Canvas: right click selects the shape under the pointer
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-14 12:58:01 -04:00
Brandon Thomas b6721fe32f Merge PR #246 from pierrevbc: Title bar: Export button next to Save 2026-10-14 12:57:22 -04:00
Nikita RakitinandCursor fa4b80ed65 UI: Slide Master Preserve and Title or Footers placeholders
Preserve the open master or layout, and turn its title and footer
placeholders on or off. Each change is one undo step, and a value that
is already set is not.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:40:11 +03:00
Nikita RakitinandCursor 5d9f47c81a Clipboard: rich text and pictures for other apps
Copy puts HTML on the pasteboard with the same plain words, so Pages keeps
bold, italic and underline, and a paste of that HTML keeps them here. A
shape with no text copies out as a picture.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:37:49 +03:00
Nikita RakitinandCursor 26d8bfdd3a UI: Design Effects applies a theme effect scheme
design.effects replaces the theme's format scheme (fills, lines and
effects) with DeckCraft, Soft, Crisp, Lift, Glow or Plain. Colours and
fonts stay. The scheme already in use is not an undo step.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:21:07 +03:00
Nikita RakitinandCursor 2f3a525568 UI: Format Shape fill transparency follows the selection
The Fill slider seeded itself at 0% and wrote that when it lost focus, so a
solid fill that was already transparent opened as opaque and could be cleared.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:16:14 +03:00
Nikita RakitinandCursor 1e6292306a UI: Format Background picture fill sets transparency and tiling
A picture background can set transparency, tile, offset, scale,
alignment and mirror. A solid fill can set transparency. Apply to All
copies the current slide's background, including a picture, onto every
slide. Unchanged options are not an undo step.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 06:08:40 +03:00
Nikita RakitinandCursor 256612b232 UI: Trim Media dialog follows the selection
Trim Media opened at zero for start, end and both fades, so OK
cleared a clip that was already trimmed. The fields now start from
the selected audio or video.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:54:32 +03:00
Nikita RakitinandCursor 0fcaabc370 UI: Create New Theme Fonts dialog edits the theme in one step
Design › Fonts › Customize Fonts… opens Create New Theme Fonts.
Empty design.fonts params open the dialog; a name and heading or body
faces apply to the open master in one undo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:45:53 +03:00
Nikita Rakitin 8c0147cfa7 UI: Hyperlink dialog follows the selection
Insert Hyperlink opened on https:// with an empty ScreenTip, so OK
replaced a web address, email, slide link or tip. The dialog now
starts from the link it would edit, and leaves actions it cannot
edit in place.
2026-10-14 05:40:06 +03:00
Nikita RakitinandCursor 65e465a611 UI: Create New Theme Colors dialog edits the theme in one step
Design › Colors › Customize Colors… opens the dialog when design.colors
is called with no name and no colours. Save applies that scheme name and
the twelve theme colours together, as one undo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 05:24:47 +03:00
Nikita Rakitin 29c24aa07c UI: Alt Text's decorative checkbox follows the selection
The dialog always opened with Mark as decorative unchecked, so OK
cleared a shape that was already decorative. It now starts checked
when every selected shape is.
2026-10-14 05:19:44 +03:00
Nikita Rakitin 9f5de924ad View: Zoom dialog applies a percent or Fit
The dialog waits for OK. View ▸ Zoom opens it, and the arrow keeps the preset list.
2026-10-14 04:53:21 +03:00
Nikita RakitinandCursor b6aa6ab4e4 UI: Date and Time dialog inserts a format in one step
Insert › Date & Time opens the format list instead of placing a date
immediately. With no format, update flag or language, insert.dateTime
opens the dialog and does not edit. OK applies one undo: a field when
Update automatically is on, or the shown text when it is off.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 04:41:01 +03:00
Nikita Rakitin f0647e1bd8 Review: previous and next comment
Walk every comment in the deck from the Review tab, and list every slide in the Comments pane.
2026-10-14 04:37:49 +03:00
Nikita RakitinandCursor dbffbab59d UI: Edit Photo Album reflows the album in one step
Reopen the Photo Album dialog on the current album and replace those slides
in one undo, with black and white, rotation, brightness, contrast and a theme.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 04:16:00 +03:00
Nikita RakitinandCursor 4575d19ac7 UI: Photo Album dialog inserts pictures as slides
Insert › Images opens Photo Album. insert.photoAlbum adds the pictures
and text boxes as slides in the open presentation, one undo step, with
layouts, frames and captions. Omitting pictures opens the dialog.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 03:43:28 +03:00
Nikita RakitinandCursor bd017b861d UI: Size and Position dialog sets geometry in one step
Shape Format › Size and the shape menu open a dialog for position,
size, rotation, scale and lock aspect ratio. One command writes them
together, so undo restores the whole change.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 03:20:35 +03:00
Nikita RakitinandCursor e4022e6702 UI: Paragraph dialog sets alignment, indents and spacing
format.paragraphDialog applies alignment, first-line and hanging
indents, spacing and line spacing in one undo step. With no fields it
opens the dialog from the Home › Paragraph launcher. Tabs… opens a
standalone Tabs dialog and returns to Paragraph.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:59:40 +03:00
Nikita RakitinandCursor 68ab3a4839 UI: Font dialog sets character formatting in one step
format.fontDialog applies family, size, bold, italic, underline, colour,
strikethrough, baseline, caps and spacing together, so one undo restores
them. With no fields it asks the UI to open the dialog, seeded from the
selection. Home › Font, the shape menu and Cmd+T open it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:41:28 +03:00
Nikita RakitinandCursor 304bf06290 Insert: Lucide icon gallery as stroked shapes
Insert › Icons places seventy Lucide 1.56.0 stroke icons as custom
geometry: no fill, round caps, and a line width scaled from the
24-unit design. The gallery searches by name. SVG paths, including
arcs, are converted when the icon is inserted so the renderer strokes
the outline.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 02:31:54 +03:00
Nikita RakitinandCursor 0cbee85ea8 File: six original starter decks
File › New and the start screen offer Briefing, Lesson, Pitch, Field Notes,
Quarterly and Evening Talk. Each is a few slides of our own text on one of
our themes. file.new takes template, and file.templates lists them. Passing
a theme as well, or blank, is refused. PowerPoint's large gallery is still
open.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 01:12:38 +03:00
Nikita RakitinandCursor afd058a8ff UI: sections in the Slide Sorter
The sorter draws a bar for each section. Add Section splits at the current
slide, double-click renames in place, the chevron collapses that section, and
dragging the bar moves the section and its slides together.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 00:50:34 +03:00
Nikita RakitinandCursor b89c9cafd7 UI: preview slide animations on the editor canvas
Animations › Preview and Animation Pane › Play All play the current
slide on the canvas instead of opening the slide show. Escape or a
click stops playback. Transitions › Preview still opens the show.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 00:21:42 +03:00
Nikita RakitinandCursor 88bea399e5 UI: customizable Quick Access Toolbar
The title bar's quick access buttons become a list the user controls:
a Customize menu with PowerPoint's common commands and Reset, right-click
any ribbon button to add it, right-click a toolbar button to remove it.
The toolbar is saved with the UI state; app.qat scripts it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 00:04:51 +03:00
Nikita RakitinandCursor 4dbea3256f UI: View › New Window opens a second window
The editor had one window, so looking at another slide meant leaving
the one you were editing. View › New Window opens one more window on
the same presentation. That window keeps its own slide and shows edits
from the first window. Closing it leaves the presentation open.
Arrange All is not included.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:52:40 +03:00
Nikita RakitinandCursor 4ba7deb5ff Text: Find and Replace across slides, tables and notes
Adds text.find (match case, whole words; matches in shape text, table
cells and speaker notes) and text.replace (one match or all, as one
undo step, keeping the first run's formatting). Home gets Find and
Replace buttons, Ctrl+F / Ctrl+H and Edit › Find… / Replace… open a
Find and Replace dialog that steps through matches slide by slide.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:44:40 +03:00
Nikita RakitinandCursor 37559f793c UI: Grid Options sets spacing, snap and the on-screen grid
View › Grid Options sets the grid spacing, snap to grid, snap to
other objects, and whether gridlines and guides are drawn. The
canvas grid follows that spacing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 23:14:52 +03:00
Nikita RakitinandCursor 10ad8d7ba7 UI: keep editor slides on the Retina pixel grid
The editing canvas, thumbnails and layout previews were drawn between
physical pixels, so a linear filter blurred small text. The slide show
draws much larger glyphs, which is why presenting still looked sharp (#184).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:44:42 +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 4ea79d4c5e Shapes: Edit Points — point types, Bézier handles, right-click menu
shape.pointType makes a vertex smooth (handles in line and equal),
straight (in line) or corner (independent), turning its segments into
curves so it has handles. shape.moveHandle drags a control handle; the
other one follows as the point's type says (given, or read from the
handles). shape.points also reports each vertex's type.

Canvas: clicking a vertex shows its handles, which drag (one undo step
per drag) and follow the type chosen for it. Right-click a vertex for
Smooth / Straight / Corner Point and Delete Point, or anywhere for Exit
Edit Points; a shape's context menu gets Edit Points. The selection box
is hidden while points are edited.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:29:57 +03:00
Nikita RakitinandCursor 733522d528 Shapes: Edit Points — drag, add and delete a shape's vertices
New cmd::points with shape.editPoints (enter/leave; a preset becomes a
freeform in shape-local points), shape.points (vertices in slide points),
shape.movePoint, shape.addPoint (splits a line, quadratic or cubic
segment) and shape.deletePoint. After each change the box is fitted
around the outline and kept in place on the slide, rotation and flips
included. Closing edges are made explicit so they take points too.

On the canvas the edited shape shows its vertices as handles: drag one
(one undo step per drag), Cmd/Ctrl-click a vertex to delete it or the
outline to add one; Escape, Enter or a click elsewhere leaves Edit
Points. Shape Format ▸ Edit Shape gets an Edit Points item.

Not yet: smooth/straight/corner point types and Bézier control handles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:22:57 +03:00
Nikita RakitinandCursor 37bd53c62e Home: Replace Fonts dialog and font.replace command
font.replace {from, to} renames a font family everywhere it is named
explicitly: runs (latin, east Asian, complex script and symbol faces), end
marks, bullet fonts, list styles of shapes, layouts and masters, the master
text styles, the deck default style, notes, tables and the theme fonts, so
placeholders that follow the theme change too. Names compare
case-insensitively, theme references (+mn-lt) are left alone, a replace that
finds nothing adds no undo step, and missing fonts are recomputed.
font.used lists the families the slides draw in, for the dialog's Replace
list.

Home gets a Replace Fonts… button opening the dialog: Replace (fonts in the
deck), With (type or pick from installed fonts), and it stays open with a
confirmation like PowerPoint's. Ribbon small buttons now expose their label
to accessibility, which the UI test uses to click it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:20:09 +03:00
Nikita RakitinandCursor 36ec1dc0ca Format Shape: 3-D Format and 3-D Rotation controls
shape.effects gains `threeD`: top and bottom bevel (preset, width,
height), depth, contour, material, lighting, camera preset, X/Y/Z
rotation, distance from ground, and reset. The settings are read from and
written back to the shape's kept a:scene3d / a:sp3d XML (new
cmd::three_d), so they render through the existing camera and bevel code
and survive a PPTX save; extrusion and contour colours are kept as is.

The `bevel` key used to set only Effects::bevel, which neither the
renderer nor the PPTX writer reads, so a bevel set from the app vanished
on save; it now goes through the same path.

The Effects page of the Format Shape pane gets 3-D Format and 3-D
Rotation sections.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:13:36 +03:00
Nikita RakitinandCursor ad24f545e2 Format Shape: picture or texture fill options
shape.fill gains pictureProps for a picture fill: tile on/off, tile
offset X/Y (pt), scale X/Y, alignment and mirror type, stretch offsets
(left/top/right/bottom), and rotate with shape. `transparency` now also
sets a picture fill's opacity. Values are clamped and unknown keywords or
non-finite numbers ignored. The Fill page of the Format Shape pane gets a
"Picture or texture fill" option with a picture source button and these
controls. The model, renderer and PPTX reader/writer already carry the
fields; a new engine test checks they survive a PPTX save and reopen.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:09:33 +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 14bc6a7ef9 Format Shape: shadow, glow and reflection detail controls
shape.effects gains shadowProps / glowProps / reflectionProps that adjust
the current effect (or add a default one): shadow colour, transparency,
blur, angle and distance; glow colour, transparency and size; reflection
transparency, size, distance and blur. Values are clamped, non-finite ones
ignored. The Effects page of the Format Shape pane exposes them as sliders
and colour pickers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:52:56 +03:00
Nikita RakitinandCursor 16c5d6a6a3 Format Shape: line compound, cap, join, arrows and sizes; lock aspect ratio
The Format Shape pane's Line page had only colour, width and dash. It now
has PowerPoint's compound type, cap type, join type, begin/end arrow type
and begin/end arrow size drop-downs, and the Size page has Lock aspect
ratio for the width and height fields. shape.line gains compound,
headSize and tailSize, and changing an arrow's kind keeps its size.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:45:42 +03:00
NikitaandCursor 525b7ed3f9 Palette: skip commands that need a value
Searching for Export ran file.export with an empty object and reported a missing path. The palette now offers only commands that accept that call, so Export opens the dialog.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 18:31:02 +03:00
NetterSilver 12dd392705 Docs: update the progress docs for this change 2026-10-13 16:41:57 +02:00
pierrevbc 8392081976 Progress docs: table cell editing and border resizing 2026-10-13 11:30:13 +02:00
pierrevbc 71ddbc59dc Progress docs: Export button in the title bar
- ui-parity.md: title bar row; status line and history.
- ROADMAP.md: progress log line. Quick Access toolbar / title bar commands stays P (no
  customization); no gaps.md entry covered this.
2026-10-13 11:27:10 +02:00
pierrevbc 09d6a6c715 Progress docs: right click selects the shape under the pointer
- ui-parity.md: context menu row; status line and history.
- ROADMAP.md: progress log line. No checklist row changes score; no gaps.md entry covered this.
2026-10-13 11:26:29 +02:00
pierrevbc 8c5f101e68 Progress docs: drag the frame of edited text to move the box
- ui-parity.md: Direct manipulation row added; status line and history.
- ROADMAP.md: progress log line. The checklist rows involved (Text boxes, In-place text editing)
  are already D; no gaps.md entry covered this.
2026-10-13 11:26:11 +02:00
Brandon ThomasandClaude Opus 5.5 1660982e58 File tab: PowerPoint's File view (Home, New, Open, Info, Save As, Print, Export, Close) (#76) (#344)
* Engine: file.info and PowerPoint-style print slide ranges (#76)

file.info reports what File › Info shows (name, path, format, unsaved
changes, slide and hidden-slide counts, sections, size on disk,
properties). file.export's PDF `slides` also takes the range typed in
PowerPoint's Print page ("1-3, 5", 1-based); bad or out-of-range text is
an error instead of a silent full export.

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

* UI: the File tab (Backstage) like PowerPoint's (#76)

File (first ribbon tab) or Alt+F opens a full-window view in place of the
ribbon, slides and status bar: a side menu (Back, Home, New, Open, Info,
Save, Save As, Print, Export, Close; Account and Options at the bottom)
and the chosen page. Esc or Back returns; Up/Down walk the side menu and
show each page as it gets the focus; Enter runs Save/Close/Options.
Laid out after PowerPoint for Windows as observed: 160-pt menu a step
darker than the page, outline icons, current page in the accent colour.

The start screen is now File › Home (as in PowerPoint), with only Home,
New and Open at the top and no Back. Pages call existing commands and
file helpers: file.new {theme} and the sample deck (Home, New); recent
files with search, Browse and Recover Unsaved (Open); file.info and
file.properties, Accessibility Checker, Revert (Info); file.save /
file.saveAs / file.export by type (Save, Save As); a PDF with the Print
page's slides, layout (full page, notes, handouts 1-9), hidden slides and
frames, opened in the system viewer or downloaded on the web, with a
page preview (Print, Ctrl+P); Create PDF, Create Handouts and Change File
Type (Export); appearance and About (Account); Preferences (Options).
Share (cloud) is left out.

Close and Ctrl+W now ask Save / Don't Save / Cancel about unsaved
changes instead of closing at once. The Export dialog shares
SlideApp::export_as with the Export page. New UI commands: app.backstage
{page}, app.closePresentation, app.print; ui.inspect reports the page.
New icons drawn in code: back, save as, account, recent, new file, open
folder.

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

* Docs: File tab (Backstage) in ui-parity, gaps, checklist and progress log (#76)

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 23:56:02 -04:00
NetterSilver c4f355773d Docs: update the progress docs for this change 2026-10-12 22:44:18 -04:00