TextSpace.Controls 0.5.1-alpha.1

This is a prerelease version of TextSpace.Controls.
dotnet add package TextSpace.Controls --version 0.5.1-alpha.1
                    
NuGet\Install-Package TextSpace.Controls -Version 0.5.1-alpha.1
                    
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="TextSpace.Controls" Version="0.5.1-alpha.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="TextSpace.Controls" Version="0.5.1-alpha.1" />
                    
Directory.Packages.props
<PackageReference Include="TextSpace.Controls" />
                    
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 TextSpace.Controls --version 0.5.1-alpha.1
                    
#r "nuget: TextSpace.Controls, 0.5.1-alpha.1"
                    
#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 TextSpace.Controls@0.5.1-alpha.1
                    
#: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=TextSpace.Controls&version=0.5.1-alpha.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=TextSpace.Controls&version=0.5.1-alpha.1&prerelease
                    
Install as a Cake Tool

<div align="center">

TextSpace

A writing room built with Uno Platform and SkiaSharp

Rich text · Paginated paper · Familiar office workflows · Reusable .NET components

Build Pages MIT

Open the browser app · Architecture · Recovery · Performance · Publishing · Compatibility

</div>


TextSpace is an independent, local-first word processor built in C#, Uno Platform, SkiaSharp, and HarfBuzz. Its ribbon, editing surface, navigation panes, review tools and file workflows are reusable controls—not an embedded web editor or a screenshot of another application.

Development preview: 0.5.1-alpha.1. This is not Microsoft Word. Complete feature parity, identical pagination, pixel-identical appearance and lossless DOCX round-tripping are not implemented. Keep independent file copies of important documents. The live site's version is determined by its last successful Pages deployment, not this source version alone.

Workspace

The custom ribbon groups commands into Home, Insert, Design, Layout, References, Mailings, Review, View and Help, with contextual table/picture tabs. File backstage provides templates, import/export and rolling local history. Hosts with protected archive support also expose a Recovery tab.

Area Implemented scope
Editing Rich runs, paragraph splitting/joining, grapheme-safe selections, transactional editing, bounded undo/redo and native input
Typography Font metadata, emphasis, colors, styles, paragraph spacing/alignment, aligned tab stops/leaders and discretionary/nonbreaking characters
Layout Mixed-size sections, next/odd/even-page, continuous and next-column starts, per-section numbering, first/even/default plain-text headers/footers, paragraph keeps and widow controls
Fields and contents 17 supported field types, cached results, F9 updates, locks, sequences, bookmark/page references and linked contents entries
Tables and pictures Rectangular merges, split-to-grid, nested tables, first-header repetition, vertical alignment, row splitting, span-aware edits and in-cell/in-flow pictures
Navigation/review Heading outline, page previews, search/replace, bookmarks, safe links, comments/replies and guarded local change rejection
Interchange Native .textspace, bounded DOCX import/export, PDF/PNG rendering, HTML/plain text and CSV mail merge
Recovery IndexedDB/native rolling snapshots, actionable startup recovery, explicit tab repair and non-evicting checksum-verified protected originals

Unsupported commands are disabled rather than producing simulated results. SkiaSharp renders the document; a UI-independent C# editing session owns its content. Uno provides the platform text-input bridge.

Recover a document without clearing its data

Invalid saved workspaces open the Recovery Center. Download the unchanged original first. Preview tab-stop repair reports invalid, duplicate and excess stops without writing anything. Protect original and open repaired copy commits a separate SHA-256-addressed original before creating an editable copy and enabling its AutoSave. Other explicit choices protect the original and start blank, retry, or restore an earlier valid snapshot.

Missing/null/empty legacy tab arrays mean no custom stops. A genuinely oversized array still fails strict validation: explicit repair retains the first 128 valid unique positions, discloses removals and may change tab layout. This is not a general-purpose corruption converter. Other document structures and supported metadata remain subject to their existing validators.

Recovery → Open and Repair applies the same workflow to native files. Protected Originals downloads retained originals after editing/reload. Valid UTF-8 file bytes, including a BOM, are retained; only the separate parsing copy removes the marker. Browser/native original transport uses generated JSON framing and byte-count/checksum verification so leading markers remain data across interop boundaries.

Protected archives are bounded and never automatically evicted. Failed/full protection blocks replacement of active recovery. Local archives can still be cleared by the browser/device owner and are not external backups. Recovery API and workflow · Validation evidence · Recovery/input performance.

Sections, fields and typography

Layout → Section Break / Section Settings controls page dimensions, orientation, columns, numbering and inherited header/footer variants. Compatible continuous sections share physical pages with region-aware fields, carets and rulers. Bounded paragraph-only bands can balance; incompatible geometry produces notices. Shared pages retain the first region's header/footer ownership. Sections and fields · Continuous sections.

Insert → Field, Manage Fields and F9 support metadata, date/time, sequence and reference workflows. Generated contents use hidden bookmarks and real REF/PAGEREF fields with geometric right-aligned dot leaders. Update Table rebuilds entries. This is not an enclosing native Word TOC field or the full field grammar.

Layout → Tabs / Pagination configures aligned stops, leaders, a default interval, paragraph keeps and widow controls. Insert → Special Characters exposes discretionary and nonbreaking characters. Rich-run boundaries inside words do not create artificial break opportunities. Typography.

Table Layout → Merge Cells / Split Cell / Nested Table / Row Options exposes supported rectangular spans, recursive editing, vertical alignment and row pagination. Structural edits preserve surviving paragraph identities and remap review/bookmark/field anchors. DOCX uses real gridSpan/vMerge; HTML uses row/column spans. Tables.

Create, rename, move, delete and navigate bookmarks through Insert. Renaming updates matching internal hyperlinks atomically. DOCX contains real bookmark markers; HTML contains safe named targets and escaped CSS under a restrictive content-security policy. Bookmarks.

Download

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

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

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

The libraries below are published to NuGet.org, e.g. dotnet add package TextSpace.Core --prerelease.

Ten reusable libraries

Library Responsibility
TextSpace.Core Rich document model, typography, blocks, tables, review/bookmark anchors and text indexing
TextSpace.Documents Native serialization/validation, explicit repair plans, templates, HTML, CSV merge and offline writing checks
TextSpace.Editing Atomic editing, selections, formatting, structure, history and revision-bound presentation text
TextSpace.Layout Renderer-independent geometry, pagination, caret queries, section regions and hit testing
TextSpace.Skia HarfBuzz metrics, font registration, page rendering and PDF/PNG export
TextSpace.OpenXml Bounded DOCX import/export; Open XML SDK is a validation-only test dependency
TextSpace.Storage Recovery contracts, atomic files, protected archives and checksum-verified transport
TextSpace.Controls Custom ribbon, galleries, menus, icons, palettes, dialogs, panes and scrolling
TextSpace.Editor Embeddable paginated editor, native input, rulers and previews
TextSpace.Workbench Composable office shell, commands, backstage, recovery, navigation and review

TextSpace.App supplies browser and native desktop hosts. IWorkspaceHost abstracts files, clipboard, printing, URI launching and recovery. Dispose owned surfaces/workbenches when their hosts close. Hosts implementing IRecoveryArchiveStore can enable recovery tools.

using TextSpace.Documents;
using TextSpace.Editing;
using TextSpace.OpenXml;
using TextSpace.Skia;

var document = DocumentJson.FromText("Introduction\nDetails", "Example");
var editor = new EditorSession(document);
editor.SetSelection(13, 20);
editor.SetBookmark("Details");
File.WriteAllBytes("Example.docx", new DocxWriter().Write(document));

using var renderer = new DocumentRenderer();
// Register required faces before layout for predictable typography.
var layout = renderer.Layout(document);
File.WriteAllBytes("Example.pdf", renderer.ExportPdf(document, layout));

Embed new TextSpace.Editor.DocumentSurface(session) or new TextSpace.Workbench.WordWorkbench(session, workspaceHost) in an Uno application. Ribbon hosts can insert lazy groups with RibbonBar.InsertGroup; office-button appearance properties support XAML binding.

Build and run

The repository pins .NET SDK 10.0.401 and Uno SDK 6.7.30 in global.json, with Uno-compatible SkiaSharp 3.119.2. Native Skia updates require compatibility checks against the chosen Uno renderer.

git clone https://github.com/wieslawsoltes/TextSpace.git
cd TextSpace
python3 scripts/fetch-assets.py
dotnet test tests/TextSpace.Tests -c Release
dotnet run --project src/TextSpace.App -f net10.0-desktop -p:TextSpaceDesktopOnly=true
dotnet workload install wasm-tools
dotnet publish src/TextSpace.App -f net10.0-browserwasm -c Release \
  -p:WasmShellWebAppBasePath=/TextSpace/ -o artifacts/publish
python3 scripts/collect-site.py artifacts/publish site
python3 scripts/serve-site.py site --port 4173

Open http://127.0.0.1:4173/TextSpace/. Browser builds require HTTP/HTTPS; file:// is unsupported.

Validation and delivery

Build runs engine tests, Windows/Linux/macOS compilation, real-input Chromium acceptance and ten-library NuGet packaging. Pages consumes only a successful main Build artifact, verifies source provenance, deploys, and repeats browser acceptance against the public URL. Runtime-module preflight rejects missing assets and HTML fallback responses.

Browser diagnostics expose read-only state/geometry. Tests use actual mouse/keyboard/filechooser input; storage mutation is limited to deliberate persisted-input/failure fixtures. Native compilation does not establish exhaustive native interaction, and Chromium results do not establish Safari/Firefox/mobile/IME/accessibility parity.

Release runs for v* tags or a supplied manual version. It consumes a successful main browser build for the exact commit, reruns engine tests, publishes self-contained single-file desktop executables for Windows, macOS and Linux (x64 and arm64), packs the ten libraries with symbols and produces versioned source/browser archives and checksums. 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. Publishing.

Performance and compatibility

Bounded paragraph/glyph caches, caret/table interval indexes, visible-page queries, canonical-run fast paths and print pagination reuse reduce repeated work. SessionTextProjection reuses presentation text during input synchronization/selection events. It is not a live model index: raw external mutations require document notification or explicit invalidation/relayout. Transaction indexing and snapshot history remain unchanged.

Performance and recovery/input measurements provide harnesses, raw evidence, allocation costs and limitations. Validation/query timings are not browser FPS or end-to-end typing guarantees.

Native .textspace represents TextSpace's full model, not arbitrary Word structures. DOCX remains an interchange subset. Rich independent header/footer stories, footnotes/endnotes, equations, floating drawings, full Word revision and field/TOC semantics, advanced table cases, bibliography databases, embedded objects, collaboration, macros and add-ins remain unfinished. HarfBuzz shaping alone does not establish full bidi layout. The offline Editor checks repetition/spacing/long sentences, not full spelling or AI grammar. Compatibility ledger.

Privacy, fonts and license

Documents are processed locally: no account, analytics, document upload or AI service is required. AutoSave is device-local, and abrupt termination can lose debounced edits. Keep independent backups. Imports bound compressed/expanded package sizes, prohibit XML DTDs and never fetch external document relationships.

Font acquisition retrieves Inter, Carlito, Tinos and Cousine with their licenses and a source/SHA-256 manifest. Proprietary family names remain metadata; substitutes do not guarantee Word font metrics/pagination. Microsoft fonts and proprietary branding assets are not redistributed.

Source: MIT. Third-party dependencies/fonts retain their licenses. Microsoft Word and Microsoft 365 are Microsoft trademarks. TextSpace is not affiliated with or endorsed by Microsoft.

Product Compatible and additional computed target framework versions.
.NET net10.0-browserwasm1.0 is compatible.  net10.0-desktop1.0 is compatible. 
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 TextSpace.Controls:

Package Downloads
TextSpace.Editor

Embeddable Uno Skia paginated document editor, native text input bridge, rulers and direct manipulation.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.5.1-alpha.1 17 9/29/2026