Files
svsmspcalc/pre-alpha/docs/code-verification.md
2026-03-16 01:42:17 -04:00

125 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Code Verification
## Latest checkpoint
- Date: March 15, 2026
- Verification: automated quote engine tests (88/88 passing) + visual review
- Status: Phases 13 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 IIII
- 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