PresentationSpace.Formats 0.6.0

dotnet add package PresentationSpace.Formats --version 0.6.0
                    
NuGet\Install-Package PresentationSpace.Formats -Version 0.6.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PresentationSpace.Formats" Version="0.6.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PresentationSpace.Formats" Version="0.6.0" />
                    
Directory.Packages.props
<PackageReference Include="PresentationSpace.Formats" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PresentationSpace.Formats --version 0.6.0
                    
#r "nuget: PresentationSpace.Formats, 0.6.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PresentationSpace.Formats@0.6.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PresentationSpace.Formats&version=0.6.0
                    
Install as a Cake Addin
#tool nuget:?package=PresentationSpace.Formats&version=0.6.0
                    
Install as a Cake Tool

<div align="center">

PresentationSpace

A familiar presentation workspace. An independent, reusable engine.

Office-style slide editing in C# with Uno Platform and SkiaSharp. One document engine and application for the browser and native desktop.

Build and test Browser and Pages License: MIT

Open browser editor · Architecture · Compatibility · Changelog · Releases

</div>

0.6 development preview. PresentationSpace is inspired by the PowerPoint desktop workflow. It is not Microsoft software, a pixel-exact reproduction, a complete PowerPoint implementation, or a lossless editor for arbitrary PPTX files. Keep original imported presentations. Supported functionality and remaining gaps are documented below.

What is new in 0.6

Aligned, responsive editor chrome. A reusable compact AutoSave toggle centers its complete pill and thumb inside a keyboard-operable hit target. Ribbon buttons and font controls use explicit compact minimum sizes rather than clipping larger theme templates. The title and document name share constrained columns; quick actions adapt to the available width. Hidden command search stays available through Alt+Q and the More presentation actions menu. Ribbon tabs and commands expose scroll arrows only when they overflow.

Table Design. Four palette presets, first/last-column emphasis, column banding and ten border scopes are available in the new ribbon tab, the table inspector and command search. Border operations update both sides of shared edges and retain untouched text, styles, geometry and merges. Unsupported partial changes along a neighboring merged-cell edge are rejected as one transaction. Column flags are written as native DrawingML attributes; native documents with those flags use schema 4, while earlier schemas remain readable.

Indexed table editing and layout. An immutable, weak-keyed TableGridIndex shares validated ownership and reading order across table layouts and cell navigation. Warm lookup is constant-time and layouts rebuild only their coordinate edges, not the table's ownership map. Diagnostics coalesce UI updates and reuse table statistics until the table changes. See Performance for measured workloads and the cost of first use.

Earlier direct Skia composition, retained drawing, virtualized slide views, rich text, native chart/workbook and merged-table features remain available. Use Open large-deck sample for a 1,000-slide workspace and Rendering statistics for draw/cache counters. These counters are not GPU duration or FPS.

The workspace

The custom Uno workspace combines a compact title bar, quick-access commands, tabbed ribbon, resizable filmstrip, Skia canvas, notes, formatting/selection/comment panes, slide sorter and slide show. The browser uses the same .NET application compiled to WebAssembly, not an HTML mock-up or a separate JavaScript presentation engine.

Area Implemented functionality
Slides New, duplicate, delete, reorder, hide, non-destructive predefined layouts, backgrounds, slide sizing and numbers
Objects Text, basic geometric shapes, lines/arrows, raster pictures, merged/styled tables and six categorical chart types
Manipulation Multi-selection, marquee, dragging, eight resize handles, rotation, aspect constraints, snapping, nudging, pan and zoom
Arrangement Selection groups, front/back ordering, alignment/distribution, object locking and visibility
Text Mixed character styles, bullets, paragraph alignment/spacing, wrapping, vertical alignment and text editing
Presentation Basic fade/push/wipe transitions; appear/fade/fly-in effects; hidden-slide skipping; black/white screen
Workflow Transactional undo/redo, internal clipboard, command search, local comments, notes, find/replace and device-local recovery
Files Native .pspace, documented PPTX subset, slide PNG and vector PDF export

The ribbon includes Home, Insert, Draw, Design, Transitions, Animations, Slide Show, Review, View, Shape Format, Table Design and Help, plus the File workspace. Commands use the shared document session. Unsupported cloud features are not simulated.

Start developing

Install the .NET 10 SDK and wasm-tools for browser builds. global.json pins Uno SDK 6.7.30, whose matched bundle uses Uno 6.7.135 and SkiaSharp 3.119.2. Skia package versions are intentionally aligned.

git clone https://github.com/wieslawsoltes/PresentationSpace.git
cd PresentationSpace
dotnet workload install wasm-tools

# Headless engine, rendering, PPTX and embedded-workbook tests
dotnet test tests/PresentationSpace.Tests/PresentationSpace.Tests.csproj -c Release

# Browser development
dotnet run --project src/PresentationSpace.App/PresentationSpace.App.csproj \
  -f net10.0-browserwasm -p:PresentationTargetFrameworks=net10.0-browserwasm

# Native desktop
dotnet run --project src/PresentationSpace.App/PresentationSpace.App.csproj \
  -f net10.0-desktop -p:PresentationTargetFrameworks=net10.0-desktop

PresentationTargetFrameworks restricts Uno projects only. Do not override TargetFrameworks globally: that incorrectly retargets UI-independent libraries.

Browser publishing

dotnet publish src/PresentationSpace.App/PresentationSpace.App.csproj \
  -f net10.0-browserwasm -c Release \
  -p:PresentationTargetFrameworks=net10.0-browserwasm \
  -p:WasmShellWebAppBasePath=/PresentationSpace/ -o artifacts/browser
python3 tools/prepare-pages.py artifacts/browser artifacts/site

Serve the distribution over HTTP(S) at the configured base path. file:// loading is unsupported. CI tests the published application in Chromium before deploying to GitHub Pages.

Download

Every release ships a self-contained, single-file desktop app — no .NET install needed:

OS x64 Arm64
Windows PresentationSpace-<version>-win-x64.zip PresentationSpace-<version>-win-arm64.zip
macOS PresentationSpace-<version>-osx-x64.tar.gz PresentationSpace-<version>-osx-arm64.tar.gz
Linux PresentationSpace-<version>-linux-x64.tar.gz PresentationSpace-<version>-linux-arm64.tar.gz

Extract and run PresentationSpace (PresentationSpace.exe on Windows). Builds are not code-signed yet: on macOS clear the quarantine flag with xattr -d com.apple.quarantine PresentationSpace; on Windows choose More info → Run anyway in SmartScreen. Verify downloads against SHA256SUMS.

The libraries below are published to NuGet.org, e.g. dotnet add package PresentationSpace.Editor.Uno.

Six independently reusable libraries

Package Responsibility Dependencies
PresentationSpace.Core Immutable documents, rich-text operations, layouts, tables, chart data/axes, geometry, commands, selection and undo No UI framework
PresentationSpace.Formats Bounded PPTX ZIP/XML, native chart/table parts and embedded chart workbooks Core
PresentationSpace.Rendering.Skia Slides, merged/styled tables, six chart types, mixed text, images, thumbnails, selection, PNG/PDF Core + SkiaSharp
PresentationSpace.Ribbon.Uno Ribbon tabs, overflow scrolling, groups, buttons, compact toggle and Office-style palette Uno
PresentationSpace.Controls.Uno Viewport, filmstrip, sorter, inspector, table/chart data editors, notes, splitters, status and slide show Uno + renderer
PresentationSpace.Editor.Uno Embeddable complete editor and injectable storage contract Reusable libraries above

PresentationSpace.App is the executable host. No library references the app. CI produces six NuGet packages; tagged releases publish them to nuget.org.

Embed the editor

using PresentationSpace.Core;
using PresentationSpace.Editor.Uno;

var session = new EditorSession(SlideFactory.Welcome());
var editor = new PresentationEditor(session, myStorageService);
myPage.Content = editor;

Implement IWorkspaceStorage for your host's pickers, saves and recovery. Return false on canceled saves. The app supplies a device-local Uno implementation.

Use the engine without Uno

using PresentationSpace.Core;
using PresentationSpace.Formats;
using PresentationSpace.Rendering.Skia;

var session = new EditorSession();
var title = SlideFactory.Text("Hello, slides", 80, 100, 900, 130, 56);
title = RichText.Format(title, 0, 5,
    style => style with { Bold = true, Color = "#D35230" });
session.Insert(title);
session.ApplyLayout("Title only"); // Unmatched content is retained.

using var renderer = new SlideRenderer();
byte[] png = renderer.ExportPng(session.Document, session.CurrentSlide);
ExportResult pptx = PptxCodec.Export(session.Document);
// Display pptx.Warnings; valid OOXML is not a guarantee of visual equivalence.

Headless hosts must provide the operating system's Skia native-assets package. Sessions and renderers are single-thread-affine; use one renderer per concurrent worker and dispose it.

Use charts independently

var data = new ChartSpec
{
    Kind = ChartKind.Line,
    Title = "Quarterly performance",
    Categories = ["Q1", "Q2", "Q3"],
    Series = [
        new() { Name = "Actual", Color = "#D35230", Values = [10, null, 25] },
        new() { Name = "Plan", Color = "#4472C4", Values = [15, 18, 22] }
    ]
};
var shape = ChartModel.Apply(new SlideShape
{
    Name = "Performance chart", Bounds = new(100, 180, 960, 540)
}, data);
session.Insert(shape);

// Or draw directly on an existing Skia canvas, without an editor or document.
renderer.RenderChart(canvas, data, new RectF(0, 0, 640, 360), new TextStyle());

ChartDataEditor.SetValue(data) loads the standalone Uno control; ValueChanged emits a validated ChartSpec. ChartTabularData.Format/Parse support spreadsheet copy/paste. ChartModel.Apply maintains legacy projection fields; use the chart API rather than editing those projections directly. Existing Shape Fill commands recolor the first series.

Use tables independently

var table = TableModel.Create(rows: 4, columns: 3);
table = TableModel.SetText(table, 0, 0, "Quarterly results");
table = TableModel.Merge(table, new TableRange(0, 0, 1, 3));
table = TableModel.EditCells(table, new TableRange(1, 0, 3, 3),
    cell => cell with { Fill = "#EAF1FA", MarginLeft = 12 });
var shape = TableModel.Apply(new SlideShape
{
    Name = "Results table", Bounds = new(100, 180, 960, 400)
}, table);
session.Insert(shape);
renderer.RenderTable(canvas, table, new RectF(0, 0, 640, 300));

TableDataEditor.SetValue(table) loads the standalone Uno control; ValueChanged emits validated snapshots. TableLayout supplies normalized edges, merge-origin bounds and grid lookup. TableModel.Apply maintains compatibility projections; edit the table model rather than Cells/TableColumns directly. Limits are 100 rows, 100 columns and one million text characters per table.

Select a table and open Format Shape → Table design & layout, or search Edit table data. Click a cell, Shift+click to extend the selection, or click row/column headers. Apply text with Apply cell text or Ctrl+Enter before selecting another cell. Structural/style actions apply the current valid text draft. The navigator pages through eight rows and four columns; the slide shows the entire table.

Files, privacy and recovery

Native .pspace preserves this application's model, including mixed text, notes, local comments and animation settings. Structured tables use schema version 3 and charts require at least version 2, so older builds reject unsupported structure rather than silently losing it. Version 0.5 reads schemas 1, 2 and 3. PNG/PDF are delivery formats. PPTX supports real text runs, preset shapes, embedded pictures, merged/styled native tables, native supported multi-series charts, notes and basic transitions. It does not preserve arbitrary unsupported OOXML parts.

Editing needs no account or server. AutoSave means device-local recovery, not OneDrive, cloud backup or coauthoring. Download a native file for durable storage. Browser storage can be cleared or evicted. Share exports files.

Input checks bound ZIP/XML sizes, reject invalid geometry and ranges, prohibit DTDs and avoid external-relationship retrieval. Chart cache sizes and point indexes are validated before allocation. Formula-looking chart labels remain text in the embedded workbook. See Security.

Keyboard and pointer workflow

Action Shortcut
New slide / save / open Ctrl+M / Ctrl+S / Ctrl+O
Undo / redo outside text inputs Ctrl+Z / Ctrl+Y or Ctrl+Shift+Z
Bold / italic / underline Ctrl+B / Ctrl+I / Ctrl+U; character selection or selected objects
Copy / cut / paste / duplicate objects Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D
Select all / group / ungroup Ctrl+A / Ctrl+G / Ctrl+Shift+G
Edit text Double-click, F2, or Enter
Move selection Arrows; Shift for ten-unit steps
Constrain resize / rotate Hold Shift
Temporarily disable snapping Hold Alt while dragging
Pan / zoom Middle-button or Space-drag / Ctrl+wheel, zoom slider, Fit
Command search Alt+Q
Present beginning / current slide F5 / Shift+F5
Navigate / end show Arrows, Page Up/Down, Space / Esc
Black / white screen B / W during slide show

Browser/OS interception can vary; ribbon alternatives are available. Search includes Apply Blank layout, Apply Title only layout, text-format commands, Edit chart data, Chart type Line, Chart type Doughnut and Chart grouping Stacked. In the chart data input, Ctrl+Enter applies the draft. Apply the draft before closing the pane or changing selection.

Automation and validation

The normal workflows are deliberately limited to three responsibilities:

  • Build and test: Linux, Windows and macOS matrix; headless editing/geometry/rendering tests, native serialization, PPTX round trips, independent Open XML validation of presentations and chart workbooks, desktop compilation, and same-runner CPU/raster baseline comparisons.
  • Browser and GitHub Pages: production WebAssembly publish, real Chromium keyboard interactions, selected-word formatting, undo/redo, content-preserving layouts, multi-series chart data/type/grouping table editing/merge/track workflows, direct on-slide cell input, row auto-fit, bounded 1,000-slide navigation and responsive title-bar/table-design regressions, screenshots, six-library packaging and Pages deployment.
  • Release: runs for v* tags or a supplied manual version. It runs the tests, publishes self-contained single-file desktop executables for Windows, macOS and Linux (x64 and arm64), builds the browser output, packs the six libraries with symbols and emits SHA256SUMS. Tags attach all assets to a GitHub Release and publish the packages to NuGet.org with Trusted Publishing (OIDC, no stored API key) from the protected nuget environment. Manual runs are dry runs: they build and upload every asset as workflow artifacts but publish nothing. Signing is not configured.

Read each run's results rather than treating configured coverage as completed qualification. Tests establish behavior for their covered cases, not every PowerPoint file, accessibility standard, GPU, browser or production-scale workload.

Remaining major work

Complete master/layout/theme inheritance and authoring; full WYSIWYG rich text and complex-script shaping; full Office table-style/theme fidelity and advanced chart families/axis formatting; SmartArt, media, freeform inking and advanced drawing effects; attached connectors; Office timing trees, motion paths and second-display presenter view; .ppt/.pptm; complete accessibility and touch qualification; secure cloud coauthoring/history/administration; and pixel-level PowerPoint UI parity remain unfinished.

See Compatibility for precise boundaries, including typed text-overlay behavior and non-lossless PPTX import. Contributions should add tests alongside functionality and keep modules independently consumable. See Contributing.

License and attribution

MIT. Uno Platform and SkiaSharp are open-source dependencies. This project does not bundle Microsoft PowerPoint code, logos or proprietary fonts. PowerPoint and Microsoft are trademarks of Microsoft Corporation. PresentationSpace is independent and is not endorsed by or affiliated with Microsoft.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on PresentationSpace.Formats:

Package Downloads
PresentationSpace.Editor.Uno

Embeddable Office-style presentation editing workspace with pluggable storage for Uno Platform.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.6.0 25 9/29/2026