Sweep all .cshtml files for encoding corruption; add pre-commit guard

Replace all corruption variants with HTML entities across 226 view files:
- 3-char UTF-8-as-Win1252 sequences (ae-corruption)
- Standalone smart/curly quotes that break C# Razor expressions
- Partially re-corrupted variants where the 3rd byte was normalised to ASCII

tools/Fix-Encoding.ps1: re-runnable sweep; uses [char] code points so the
script itself never contains a literal non-ASCII character; supports -DryRun

.githooks/pre-commit: blocks commits containing the ae-corruption byte
signature (xc3xa2xe2x82xac); git core.hooksPath = .githooks so the
hook is repo-committed and active for all future work on this machine.

Build clean; 225 unit tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 21:37:10 -04:00
parent 21b39161a3
commit a0bdd2b5b4
252 changed files with 1785 additions and 1633 deletions
@@ -212,7 +212,7 @@
</div>
<h1>Welcome, @firstName!</h1>
<p class="subtitle">
Your account is created and ready but <strong style="color:white;">it still needs to be configured
Your account is created and ready &mdash; but <strong style="color:white;">it still needs to be configured
before it's ready to use.</strong> Run the Setup Wizard to get your shop up and running.
We <strong style="color:#4fc3f7;">strongly recommend</strong> completing it before doing anything else.
</p>
@@ -241,7 +241,7 @@
</div>
<div class="tile-text">
<h6>Lookups Pre-Seeded</h6>
<p>Job statuses, priorities, quote statuses, appointment types, and inventory categories are ready to use and fully customizable.</p>
<p>Job statuses, priorities, quote statuses, appointment types, and inventory categories are ready to use &mdash; and fully customizable.</p>
</div>
</div>
<div class="info-tile">
@@ -259,18 +259,18 @@
<div class="screenshot-rotator">
<p class="rotator-label"><i class="bi bi-grid-1x2 me-1"></i>A quick look around</p>
<div class="rotator-track" id="rotatorTrack">
<img src="/images/welcome/Dashboard.png" alt="Dashboard" class="active" data-caption="Dashboard live KPIs, alerts, and daily tips at a glance" />
<img src="/images/welcome/Jobs.png" alt="Jobs" data-caption="Jobs track every job from intake through delivery across 16 statuses" />
<img src="/images/welcome/JobBoard.png" alt="Job Board" data-caption="Job Board drag-and-drop priority view of all active work" />
<img src="/images/welcome/Quotes.png" alt="Quotes" data-caption="Quotes multi-item pricing engine with AI photo quoting" />
<img src="/images/welcome/Schedule.png" alt="Schedule" data-caption="Schedule calendar view for appointments and job deadlines" />
<img src="/images/welcome/ShopDisplay.png" alt="Shop Display" data-caption="Shop Display full-screen board for the shop floor" />
<img src="/images/welcome/SetupWizard.png" alt="Setup Wizard" data-caption="Setup Wizard 10-step guided configuration for your shop" />
<img src="/images/welcome/CompanySettings.png" alt="Company Settings" data-caption="Company Settings pricing rates, branding, notifications, and more" />
<img src="/images/welcome/DailyBoard.png" alt="Daily Board" data-caption="Daily Board at-a-glance view of today's work" />
<img src="/images/welcome/QBMigrationWizard.png" alt="QB Migration" data-caption="QuickBooks Migration Wizard import your existing customers and data" />
<img src="/images/welcome/Tools.png" alt="Tools" data-caption="Tools equipment management and maintenance scheduling" />
<img src="/images/welcome/Help.png" alt="Help Center" data-caption="Help Center built-in documentation and AI assistant" />
<img src="/images/welcome/Dashboard.png" alt="Dashboard" class="active" data-caption="Dashboard &mdash; live KPIs, alerts, and daily tips at a glance" />
<img src="/images/welcome/Jobs.png" alt="Jobs" data-caption="Jobs &mdash; track every job from intake through delivery across 16 statuses" />
<img src="/images/welcome/JobBoard.png" alt="Job Board" data-caption="Job Board &mdash; drag-and-drop priority view of all active work" />
<img src="/images/welcome/Quotes.png" alt="Quotes" data-caption="Quotes &mdash; multi-item pricing engine with AI photo quoting" />
<img src="/images/welcome/Schedule.png" alt="Schedule" data-caption="Schedule &mdash; calendar view for appointments and job deadlines" />
<img src="/images/welcome/ShopDisplay.png" alt="Shop Display" data-caption="Shop Display &mdash; full-screen board for the shop floor" />
<img src="/images/welcome/SetupWizard.png" alt="Setup Wizard" data-caption="Setup Wizard &mdash; 10-step guided configuration for your shop" />
<img src="/images/welcome/CompanySettings.png" alt="Company Settings" data-caption="Company Settings &mdash; pricing rates, branding, notifications, and more" />
<img src="/images/welcome/DailyBoard.png" alt="Daily Board" data-caption="Daily Board &mdash; at-a-glance view of today's work" />
<img src="/images/welcome/QBMigrationWizard.png" alt="QB Migration" data-caption="QuickBooks Migration Wizard &mdash; import your existing customers and data" />
<img src="/images/welcome/Tools.png" alt="Tools" data-caption="Tools &mdash; equipment management and maintenance scheduling" />
<img src="/images/welcome/Help.png" alt="Help Center" data-caption="Help Center &mdash; built-in documentation and AI assistant" />
<div class="rotator-nav">
<button id="rotatorPrev" aria-label="Previous"><i class="bi bi-chevron-left"></i></button>
<button id="rotatorNext" aria-label="Next"><i class="bi bi-chevron-right"></i></button>