diff --git a/CHANGELOG.md b/CHANGELOG.md
index d9a76c3..b4b2388 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,13 @@ broke. The heading is parsed by `scripts/release-notes.ps1`, so keep its shape;
under it is ordinary Markdown, and the renderer handles paragraphs, lists, links, `code`
and **bold**.
+## 1.7.7 - 29 October 2026
+
+### Clear strokes
+**Edit → Clear strokes** removes every ink stroke on the board in one step, including strokes
+linked to a container, and leaves images, text, shapes, and frames in place. Undo brings the
+strokes back, so a board can be exported without its ink and then restored.
+
## 1.7.6 - 20 October 2026
### Panning with a mouse
diff --git a/Directory.Build.props b/Directory.Build.props
index c791ca0..1f0747a 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -5,7 +5,7 @@
scripts/build-installer.ps1 both read it from here, so releasing is a reviewed change
to this line rather than an edit in a pipeline variable group.
-->
- 1.7.6
+ 1.7.7latestenableenable
diff --git a/README.md b/README.md
index bdce648..2355bcb 100644
--- a/README.md
+++ b/README.md
@@ -219,6 +219,7 @@ Use **Copy settings** after finding a useful combination so the exact values can
| Ctrl+E | Export the board to PowerPoint or PDF |
| Delete | Delete the selected container and its linked strokes |
| Ctrl+A / Ctrl+Shift+A | Select everything an area could take, or the ink strokes only |
+| Edit > Clear strokes | Remove every ink stroke on the board, including strokes linked to containers, as one step that Undo restores. Letter S while the Edit strip is open |
| Ctrl+D | Duplicate the selection 24 pixels down and to the right, and select the copy |
| … on the property bar | Delete, Copy, Duplicate, and the four depth commands for whatever is selected |
| Alt+L | Laser pointer |
diff --git a/site/guide.html b/site/guide.html
index 7b414b1..4b08f76 100644
--- a/site/guide.html
+++ b/site/guide.html
@@ -911,7 +911,7 @@
Ink and tools
Eraser
- Removes whole strokes. The eraser end of a pen does the same — and so does the upper side button, because Windows reports the two identically — and hovering with it draws a dashed square around what a tap would clear.
+ Removes whole strokes. The eraser end of a pen does the same — and so does the upper side button, because Windows reports the two identically — and hovering with it draws a dashed square around what a tap would clear. Edit → Clear strokes removes every stroke on the board at once.
F11Fill the current monitor and hide the title and tabs. Press again or Escape to leave.
Ctrl+F11Canvas only: hide the title and tabs, keep this window’s size and place. Press again or Escape to leave.
-
Alt+F/E/V/I/HOpen or switch the File, Edit, View, Insert, or Help strip. Alt always selects a tab. With a strip open, letters without Alt run a command. File: N New, O Open, S Save, A Save As, I Import, E Export. Edit: Z Undo, Y Redo, C Copy, V Paste. View: F Full screen, C Canvas only, G Grid, B Bring to front, W Bring forward, K Send backward, S Send to back, A Frame, H Show frames, L LiveView, Z Freeze, D Disconnect, R Reconnect. Insert: T Text, P Palette. Help: P Preferences, A About. Left, right, Home, and End move between commands.
+
Alt+F/E/V/I/HOpen or switch the File, Edit, View, Insert, or Help strip. Alt always selects a tab. With a strip open, letters without Alt run a command. File: N New, O Open, S Save, A Save As, I Import, E Export. Edit: Z Undo, Y Redo, C Copy, V Paste, S Clear strokes. View: F Full screen, C Canvas only, G Grid, B Bring to front, W Bring forward, K Send backward, S Send to back, A Frame, H Show frames, L LiveView, Z Freeze, D Disconnect, R Reconnect. Insert: T Text, P Palette. Help: P Preferences, A About. Left, right, Home, and End move between commands.
diff --git a/src/SQLBI.Whiteboard/MainWindow.xaml.cs b/src/SQLBI.Whiteboard/MainWindow.xaml.cs
index 9db8dd3..4f5419a 100644
--- a/src/SQLBI.Whiteboard/MainWindow.xaml.cs
+++ b/src/SQLBI.Whiteboard/MainWindow.xaml.cs
@@ -617,6 +617,7 @@ private void Document_Changed(object? sender, EventArgs e)
}
SessionBar.SetFramesChecked(_document.ShowFrames);
+ SessionBar.SetClearStrokesEnabled(_document.Objects.Any(item => item is InkStrokeObject));
PublishSelection();
SceneSurface.InvalidateVisual();
UpdateLiveViewActionOverlay();
@@ -4163,6 +4164,30 @@ private void DeleteSelection()
SceneSurface.InvalidateVisual();
}
+ ///
+ /// Every ink stroke on the board, including those linked to a container, as
+ /// one step, so one undo brings them all back. The rest of the selection
+ /// stays selected.
+ ///
+ private void ClearStrokes()
+ {
+ if (_textEditBefore is not null ||
+ _labelEditBefore is not null ||
+ _shapeEditBefore is not null)
+ {
+ return;
+ }
+
+ BoardObject[] strokes = _document.Objects.OfType().ToArray();
+ if (strokes.Length == 0)
+ {
+ return;
+ }
+
+ _history.Execute(DeleteCommandFor(strokes), _document);
+ SceneSurface.InvalidateVisual();
+ }
+
///
/// A copy of the selection, 24 screen pixels down and to the right of it and
/// above everything on the board, which becomes the selection: pressing the
@@ -7307,6 +7332,9 @@ private void SessionChrome_CommandRequested(SessionCommand command)
case SessionCommand.Paste:
PasteButton_Click(this, new RoutedEventArgs());
break;
+ case SessionCommand.ClearStrokes:
+ ClearStrokes();
+ break;
case SessionCommand.FullScreen:
SetChromeMode(
_chromeMode == SessionChromeMode.FullScreen
diff --git a/src/SQLBI.Whiteboard/SessionChrome.xaml b/src/SQLBI.Whiteboard/SessionChrome.xaml
index 01523b5..e35a591 100644
--- a/src/SQLBI.Whiteboard/SessionChrome.xaml
+++ b/src/SQLBI.Whiteboard/SessionChrome.xaml
@@ -222,6 +222,24 @@
Text="Ctrl+V" />
+
/// The four depth commands need two flags, because a selection can be brought
/// to the front exactly when it has something above it to pass, and sent to
@@ -493,6 +505,7 @@ item.Tag is string name &&
'Y' when EditRow.Visibility == Visibility.Visible => SessionCommand.Redo,
'C' when EditRow.Visibility == Visibility.Visible => SessionCommand.Copy,
'V' when EditRow.Visibility == Visibility.Visible => SessionCommand.Paste,
+ 'S' when EditRow.Visibility == Visibility.Visible => SessionCommand.ClearStrokes,
'F' when ViewRow.Visibility == Visibility.Visible => SessionCommand.FullScreen,
'C' when ViewRow.Visibility == Visibility.Visible => SessionCommand.CanvasOnly,
'G' when ViewRow.Visibility == Visibility.Visible => SessionCommand.ToggleGrid,