5.7 KiB
5.7 KiB
Code Verification
Latest checkpoint
- Date: March 15, 2026
- Verification: automated quote engine tests (88/88 passing) + visual review
- Status: Phases 1–3 complete (bug fixes, visual polish, UX hardening)
Automated test suite
Location: svsmspcalc/tests/test-quote-engine.js
Run: node svsmspcalc/tests/test-quote-engine.js
Result: 88 tests passing across 21 test groups
What's covered
| Area | Tests |
|---|---|
| M365 vs BYOL rates | User base rates, rate switching |
| Admin fee scaling | Floor ($150), minimum ($650), ZT premium ($250), 1Password markup (10%) |
| Admin waiver | Fee calculated but excluded from MRR |
| User add-ons | Extended Hours, 1Password, INKY, Zero Trust per-user |
| Endpoint add-ons | USB Blocking, Bare Metal Backup |
| Server pricing | Per-server rate, inclusion in subtotals |
| Contract discounts | m2m (0%), 12mo (3%), 24mo (5%) |
| HST | 13% applied after discount, disabled = 0, combo with discount |
| VoIP | All 3 tiers, phone + fax add-ons |
| Zero Trust networking | Seats + routers |
| Edge cases | Zero users, per-user breakdowns |
| MRR integrity | MRR = sum of components across 5 different configs |
| Realistic scenario | Full 22-user quote with all features |
How to extend
- Add
describe()/it()blocks in the test file - Uses
eq(actual, expected, label)for exact assertions - Uses
near(actual, expected, tolerance, label)for floating-point - Ask Claude to add tests for new scenarios
What is currently known-good
Section header redesign (completed this session)
- All 6 sections use unified
sec-controls-rowpattern (stepper + badge + price on row 2) - Subtitles moved to row 3, visible only when expanded
- Section headers use CSS grid: numeral + title + chevron on row 1
- Container query at ≤520px and media query at ≤600px handle small-screen stacking
- Cascade order issues resolved (container query overrides placed after base rules)
UI/UX changes (completed this session)
- ~15-20% spacing optimization across all tokens, layout, components, and responsive CSS
- All sections default to collapsed state on load
- Inner collapsibles (What's Included, Add-Ons) default to collapsed
- "What This Fee Supports" card removed from SEC-01
- "Protection First, Recovery Optional" card removed from SEC-03
- Progress bar always visible when SEC-01 is collapsed
- Floor note restyled to match title font (DM Mono, 12px, uppercase)
- Summary badges show price only (no counts — stepper already shows quantity)
Print/export changes
- Print now respects user's HST toggle (Phase 1 fix — no longer forces HST on)
- JSON export includes
version: '1.0'schema field (Phase 1 addition) - Print CSS hides
sec-controls-rowinstead of oldsec-collapsed-counter
Dead code removed
sec-collapsed-counterCSS and HTML (replaced bysec-controls-row)floorProgressspan (right-side threshold text)
Runtime areas that must stay intact
- Quote calculations (now verified by automated tests)
- Exports
- Local persistence
- Theme switching
- Mobile quote sync/parity
Phase 1 bug fixes (verified)
- ADDON_INKY default: $5 → $8 in quote-pricing.js (test expectations updated)
- Onboarding fee manual override preserved across term switches (data-manual-value attribute)
- VoIP fax CSV comment: "Flat/mo" → "Per seat/mo"
- Print HST: now respects user toggle instead of forcing HST on
- JSON export: schema version '1.0' added
- ZT admin supplement: amber nudge warning when ztActive
Phase 2 visual polish (verified)
- Hardcoded danger icon color →
var(--text-danger) - Hardcoded pill-savings active color →
var(--text-pill-savings-active)(new token in all 4 themes) - All 4 themes fully token-covered for Sections I–III
- No remaining hardcoded colors in active section CSS
Phase 3 UX hardening (verified)
- Smooth theme-switch transition (0.25s crossfade via
.theme-transitioning) - Nudge crossfade on rotation/nav (180ms fade-out → swap → fade-in)
- Summary badge fade-in on collapse (0.25s animation)
- Addon toggle micro-feedback (0.2s scale pulse)
- Touch targets ≥44px on mobile (close btn, nudge nav, section toggles)
- Mobile focus trap in panel (Tab cycles within, focus returns to pill on close)
- Safe-area insets for notch phones (pill position, panel padding)
Phase 5 accessibility & performance fixes (verified)
aria-expandedon all section toggles and collapsible headers (12 elements)- Focus trap on reset confirm modal (Tab cycles within modal)
aria-labelon all stepper buttons (12 elements: "Decrease/Increase users/endpoints/etc.")- Glass theme
background-attachment: scrollon mobile (≤1100px) to prevent iOS scroll jank - Mobile sync guard: skips 35+ element sync when panel closed on desktop
- Mobile sync gaps fixed:
sidebarFocusClientName,sl-discount-detail,sl-value-onboarding-labeladded to sync map - Full sync forced on
openMobilePanel()to ensure fresh data
Font Awesome icon fix (verified)
- All 36 FA Sharp Solid icon references in components.css converted from file paths to inline
data:image/svg+xmlURIs - Icons now render on
file://protocol without a server - If adding new icons: use inline data URI format, not file path references
What still needs caution
- DOM rendering tests (sidebar values, warnings, mobile sync) are not yet automated
- Export/persistence tests are not yet automated
Required check standard for future edits
- After pricing/engine edits: run
node svsmspcalc/tests/test-quote-engine.js - After JS edits: run syntax checks
- After logic edits: review quote math, persistence, export, and mobile parity impact
- After sidebar changes: verify the mobile clone/sync map still covers the changed elements
- After copy or styling edits in sales-critical areas: check readability and messaging