Novolis Docs
novolis-apps / sketch-studio/architecture.md

Architecture

dotnetavaloniadesktopnovolis

← Documentation index · Smoke and release

Placement

KindLocation
Product hostnovolis-apps/src/SketchStudio (this app)
Sketch enginePackable Novolis.Avalonia.Controls.Sketch
Shared dialogsNovolis.Avalonia.Controls (ChoiceDialog, …)
Dogfoodnovolis-dogfooding/.../SketchLab

Follows app-host placement and nuget-only policy: the app uses PackageReference to published packages; local iteration uses Platform ProjectReference mode (-p:NovolisUseProjectReferences=true), never sibling path refs in the csproj.

Layering

SketchStudio (Apps)
  ├── Avalonia Desktop / Fluent / Inter
  ├── Novolis.Avalonia.Controls          (dialogs)
  ├── Novolis.Avalonia.Controls.Sketch   (SketchControl, SketchJson, document)
  ├── Novolis.Avalonia.Packaging.Inno    (installer targets)
  └── Optris.Icons (Font Awesome chrome)

Gaming / Simulation packages are not involved. Avalonia stays in Apps + Avalonia library layers only.

Host modules

TypeRole
ProgramHost DI; --smoke early exit; Avalonia bootstrap
AppFluentTheme light
MainWindowToolbar, files, export, F1, key chords
SketchShortcutsTooltip copy + F1 dialog tables
SketchStudioSettingsLocalAppData last path + MRU
SketchExportPNG / SVG snapshot (not in the package)
SmokeRunnerHeadless document → JSON → export checks

Ownership split

ConcernOwner
Pointer tools, hit-test, undo, meetup/gridify, JSON modelControls.Sketch
File pickers, dirty title, MRU, F1, opaque PNG policySketch Studio host
Wire format documentationGovernance sketchjson.md
Installer / GitHub Release assetsnovolis-apps catalog + Packaging.Inno

Data flow

flowchart LR
  ui[MainWindow]
  ctrl[SketchControl]
  doc[SketchDocument]
  json[SketchJson]
  disk[".sketchjson"]
  export[SketchExport]
  settings[SketchStudioSettings]
  ui --> ctrl
  ctrl --> doc
  ui -->|"Open Save"| json
  json --> disk
  ui --> export
  ui --> settings

See also