Batch settings storage writes, tier plugin startup, lazy-load heavy UI
chunks, and optimize global search indexing. Stop tweening bar height in
grade analytics to prevent invalid negative SVG rect values.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve CodeQL incomplete string escaping alerts by centralizing escJsSingleQuoted for all values embedded in injected script content.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move filters into a left sidebar, tighten spacing, match homepage checkboxes, fix forecast line domain/looping, and remove the redundant page subtitle. Also fix crxjs dev service worker live reload after Vite upgrade.
- Add WEIGHTING_SCHEMA_VERSION constant; bump to force a global lazy reindex
- Migrate legacy Record<id, string> storage to { weight, fingerprint, pluginVersion }
- Fingerprint per-assessment on status, graded, availability, score, due, title (sourced from the React fiber)
- Refetch weighting only when fingerprint or schema version mismatches
- Preserve previous weight as refreshing placeholder during background refetch
- Render subject average immediately from cache; run parseAssessments off the critical path
- Coalesce concurrent renderSubjectAverage calls instead of dropping them
- Dispatch betterseqta:weightingsChanged on refetch start and completion
- Show row-level refresh indicator and "Refreshing weightings" notice while refreshing
- Leave weightingOverrides untouched by all reindex paths
What it does:
- Makes the course navigator focused on the currently selected lesson instead of the top upon opening
- Adds arrows to the course page, to allow for easier navigation.
Harden theme list fetching with normalized API responses, timeouts, retries,
and a visible error state so the store no longer stays blank when messaging
or payloads fail (common after extension updates without a SEQTA tab reload).