From d10fca6c0f28d3969a5c3590959e70c443a8fb4d Mon Sep 17 00:00:00 2001 From: Aden Linday Date: Wed, 17 Jun 2026 10:50:26 +0930 Subject: [PATCH] perf: reduce startup work and fix grade analytics bar chart animation 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 --- src/SEQTA.ts | 7 +- src/background.ts | 9 +- src/background/cloudSettingsAutoSync.ts | 11 ++ src/interface/components/ColourPicker.svelte | 60 +++++--- .../components/TabbedContainer.svelte | 25 ++- src/interface/components/store/Header.svelte | 7 +- .../components/themes/ThemeSelector.svelte | 21 ++- src/interface/hooks/SettingsPopup.ts | 54 +------ src/interface/pages/settings.svelte | 15 +- .../built-in/assessmentsOverview/index.ts | 6 +- .../built-in/assessmentsOverview/ui.ts | 44 ++++-- .../src/components/SearchBar.svelte | 28 +++- .../built-in/globalSearch/src/core/index.ts | 4 +- .../globalSearch/src/core/mountSearchBar.ts | 4 +- .../built-in/globalSearch/src/indexing/db.ts | 50 ++++++ .../globalSearch/src/indexing/indexer.ts | 105 ++++++++----- .../src/indexing/passiveObserver.ts | 45 ++---- .../src/indexing/renderComponents.ts | 36 +++++ .../globalSearch/src/search/hybridSearch.ts | 39 ++--- .../globalSearch/src/search/searchUtils.ts | 130 +++++++++++----- .../globalSearch/src/utils/dynamicItems.ts | 19 ++- .../gradeAnalytics/AnalyticsBarChart.svelte | 2 - src/plugins/built-in/themes/ThemeCreator.ts | 13 +- src/plugins/core/createAPI.ts | 58 +++---- src/plugins/core/manager.ts | 55 +++++-- src/plugins/index.ts | 2 - src/plugins/monofile.ts | 53 ++++--- src/plugins/runtime.ts | 6 + src/seqta/ui/AddBetterSEQTAElements.ts | 142 ++++++++++-------- src/seqta/ui/renderStore.ts | 17 ++- .../utils/Adders/AddExtensionSettings.ts | 45 ++++-- .../utils/Closers/closeExtensionPopup.ts | 2 +- .../utils/Openers/OpenThemeOfTheMonthPopup.ts | 2 +- .../utils/ensureSyncableStorageDefaults.ts | 6 + src/seqta/utils/listeners/EventManager.ts | 31 +++- src/seqta/utils/listeners/MessageListener.ts | 91 +++++++---- src/seqta/utils/listeners/SettingsState.ts | 69 +++++++-- .../utils/openThemeStoreWithHighlight.ts | 20 +-- src/seqta/utils/settingsPopup.ts | 33 ++++ src/seqta/utils/setupSettingsButton.ts | 2 +- src/seqta/utils/waitForElm.ts | 88 +++++------ 41 files changed, 919 insertions(+), 537 deletions(-) create mode 100644 src/plugins/runtime.ts create mode 100644 src/seqta/utils/settingsPopup.ts diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 60a6b6a7..60a4b80a 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -6,7 +6,7 @@ import documentLoadCSS from "@/css/documentload.scss?inline"; import icon48 from "@/resources/icons/icon-48.png?base64"; import browser from "webextension-polyfill"; -import * as plugins from "@/plugins"; +import { init as Monofile } from "@/plugins/monofile"; import { main } from "@/seqta/main"; import { delay } from "./seqta/utils/delay"; import { initializeHideSensitiveToggle } from "@/seqta/utils/hideSensitiveToggle"; @@ -104,10 +104,11 @@ async function init() { } await main(); - plugins.Monofile(); + Monofile(); if (settingsState.onoff) { - await plugins.initializePlugins(); + const { initializePlugins } = await import("@/plugins/runtime"); + await initializePlugins(); } if (settingsState.devMode) { diff --git a/src/background.ts b/src/background.ts index 30d2165f..4be354c2 100644 --- a/src/background.ts +++ b/src/background.ts @@ -10,6 +10,7 @@ import { performCloudSettingsUploadWithRetry, requestCloudSettingsDebouncedUpload, runCloudSettingsPoll, + withSuppressedCloudAutoUpload, } from "./background/cloudSettingsAutoSync"; import { isAllowedFetchUrl } from "@/seqta/utils/allowedFetchUrl"; @@ -573,10 +574,10 @@ function getDefaultValues(): SettingsState { return getDefaultSettingsState(); } -function SetStorageValue(object: any) { - for (var i in object) { - browser.storage.local.set({ [i]: object[i] }); - } +function SetStorageValue(object: SettingsState) { + void withSuppressedCloudAutoUpload(() => + browser.storage.local.set(object as Record), + ); } /** One-time migration for 3.6.5: opt upgraders into Global Search + indexing + transparency defaults. */ diff --git a/src/background/cloudSettingsAutoSync.ts b/src/background/cloudSettingsAutoSync.ts index 549b6d9c..54661fdc 100644 --- a/src/background/cloudSettingsAutoSync.ts +++ b/src/background/cloudSettingsAutoSync.ts @@ -457,6 +457,17 @@ function onStorageChanged( })(); } +export async function withSuppressedCloudAutoUpload( + operation: () => T | Promise, +): Promise { + suppressAutoUploadDuringRestore = true; + try { + return await operation(); + } finally { + suppressAutoUploadDuringRestore = false; + } +} + export function initCloudSettingsAutoSync(deps: { reloadSeqtaPages: () => void }): void { reloadSeqtaPagesFn = deps.reloadSeqtaPages; if (autoSyncInitialized) return; diff --git a/src/interface/components/ColourPicker.svelte b/src/interface/components/ColourPicker.svelte index 11e7a335..5d0b035b 100644 --- a/src/interface/components/ColourPicker.svelte +++ b/src/interface/components/ColourPicker.svelte @@ -1,7 +1,6 @@