Files
LlamaCasty/HANDOFF.md
T
gramps fdb27f0758 feat(ui): gear to the rail, EDIT on the panel edge, preview undo/redo
Three creator directives (2026-11-01), done ahead of the surge.

**Gear moved to the preview rail** — first tab, orange (Brush.Attention), gear icon
only. Left-click opens the same app menu the top bar gear owned (Settings / Bug /
Feature / About), right-click goes straight to App Settings; both behaviours moved
with it, so nothing lost an entry point. TopBar keeps the wordmark and EDIT.

**EDIT right edge aligned to the layers panel.** The work area is margin 8 + a 360px
column, the top bar is padding 16, so the shared edge is 352 inside the bar. TopBar
column 0 is now a fixed 352 grid with EDIT right-aligned in it — alignment by
arithmetic instead of by eye.

**Preview undo/redo: Ctrl+Z / Ctrl+Shift+Z.** Models/PreviewHistory snapshots element
REFERENCES plus geometry, visibility, order and membership — a deep clone would mirror
every property of a dozen element subclasses and quietly miss the next one added.
One snapshot per gesture (pushed at drag/resize start, never in the move loop), bounded
at 50, redo survives multiple undos, cleared on layout load. Gated on EditingActive:
undo while the preview shows program output would rewrite a scene nobody is looking at.

Honest scope, in the type's doc comment: layout edits only. Colour/opacity/border/font
edits are not captured yet, so Ctrl+Z after one of those restores the last layout change.

6 tests in PreviewHistoryTests; 19 pass across it and the neighbouring UI classes; Debug
and Release both build at 0 warnings.
2026-11-01 07:46:10 -08:00

2.7 KiB
Raw Blame History

HANDOFF — 2026-11-01 (exe renamed, depot builds, output rule enforced)

State

  • Branch main, level with origin through 8f79b20; this unit is local.
  • The shipped exe is LlamaCasty.exe (AssemblyName renamed; four pack URIs fixed — the docs said three, KeepBroadcastDialog.xaml:5 was the fourth). Guarded by AssemblyIdentityTests.
  • scripts/publish.sh stages artifacts/steam-stage and refuses to finish if ffmpeg\, the licence, privacy or notices file is missing, or test assemblies leaked in. Output 257 MB.
  • The output-profile rule is built and enforced: Models/OutputProfile.cs (921,600 px / 30 fps, fail closed) resolved once in BuildEncoderOptions — one ffmpeg process, two outputs. MainViewModel.DeveloperMode bypasses it in Debug only.
  • Distribution is Steam-exclusive (2026-10-31): free app + paid edition as a Steam DLC; the $10/month plan sold off-Steam by Polar, stated, never sold, in-app. Entitlement is steamDlcOwned || polarKeyValid; the app must start without Steam, falling back to free.
  • Site live with Steam (a9d07ce); www.llamacasty.com 301s to the apex.

Next action

Surge, 2026-11-02 → 11-07 — six days, all remaining code. Undo/redo, the rail gear and the EDIT alignment landed early on 11-01, so day 6 has room. Day 1 unchanged: licensing — IEntitlement + Steam DLC + fake, HasProOutput on the seam, greyed tiers, licence UI's four states, system messages, licence ID in About. Days 2–6 in TASKS.md → "The surge". No scope beyond that list. No polish before day 6.

Landmines

  • ⛔ ExcludeFromSingleFile="true" on the ffmpeg content — without it the publisher bundles libav*.dll into the exe and the app ships unable to find ffmpeg. Recipe in MyMistakes.md.
  • Dev affordances are compiled out, not hidden — DeveloperPanel is removed from the Release build; Helpers/DevBuild.cs is the single source for the flag (never const).
  • Nothing may gate a feature. The only paid delta is the output profile; ShowBrandFlash stays false and entitlement must never enable it.
  • No checkout inside a Steam build — the Wallet rule. The monthly is named, never sold, in-app.
  • The org access token never ships. organization_id is public; the token is not.
  • The site publishes the model, never the numbers, and never takes payment or links a checkout.
  • No self-updater and no version banner: Steam updates the app.
  • Pre-existing: the full test suite hangs (WASAPI teardown) — per-class runs; ytLive.Tests carries 3 xUnit warnings the app-only gate does not see.
  • Not every hex is a theme colour — BorderColorPalette/chat defaults are USER DATA, not tokens.