# 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-row` pattern (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-row` instead of old `sec-collapsed-counter` ### Dead code removed - `sec-collapsed-counter` CSS and HTML (replaced by `sec-controls-row`) - `floorProgress` span (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-expanded` on all section toggles and collapsible headers (12 elements) - Focus trap on reset confirm modal (Tab cycles within modal) - `aria-label` on all stepper buttons (12 elements: "Decrease/Increase users/endpoints/etc.") - Glass theme `background-attachment: scroll` on 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-label` added 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+xml` URIs - 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