{#snippet Setting({ title, description, Component, props }: SettingsList) }

{title}

{description}

{/snippet}
{#if showsSection("account")} {@render Setting({ title: "Connect Mobile App", description: "Link your SEQTA session to DesQTA — the modern desktop and mobile app for SEQTA Learn", id: 0, Component: ConnectMobileApp, props: {} })}

BetterSEQTA Cloud

Account & sync

{#if cloudState.isLoggedIn}
showDisclaimer(onConfirm, onCancel, "Restore from cloud?", "This will replace your local settings with the cloud backup. Continue?")} />
{/if}
{/if} {#if showsSection("general")} {#each [ ...(!isEngage ? [ { title: "Edit Sidebar Layout", description: "Reorder pages on the sidebar", id: 5, Component: Button, props: { onClick: () => browser.runtime.sendMessage({ type: 'currentTab', info: 'EditSidebar' }), text: "Edit" } }, { title: "Icon Only Sidebar", description: "Show only icons in the sidebar for a compact layout", id: 14, Component: Switch, props: { state: $settingsState.iconOnlySidebar ?? false, onChange: (isOn: boolean) => settingsState.iconOnlySidebar = isOn } }, ] : []), { title: "Animations", description: "Enable animations on certain pages", id: 6, Component: Switch, props: { state: $settingsState.animations, onChange: (isOn: boolean) => settingsState.animations = isOn } }, { title: "12 Hour Time", description: "Prefer 12 hour time format for SEQTA", id: 9, Component: Switch, props: { state: $settingsState.timeFormat === "12", onChange: (isOn: boolean) => settingsState.timeFormat = isOn ? "12" : "24" } }, { title: "Default Page", description: "Choose which page loads first when you open SEQTA", id: 10, Component: Select, props: { value: $settingsState.defaultPage ?? "home", onChange: (value: string) => (settingsState.defaultPage = value), options: isEngage ? [ { value: "home", label: "Home" }, { value: "dashboard", label: "Dashboard" }, { value: "timetable", label: "Timetable" }, { value: "messages", label: "Messages" }, { value: "documents", label: "Documents" }, { value: "reports", label: "Reports" }, ] : [ { value: "home", label: "Home" }, { value: "dashboard", label: "Dashboard" }, { value: "timetable", label: "Timetable" }, { value: "welcome", label: "Welcome" }, { value: "messages", label: "Messages" }, { value: "documents", label: "Documents" }, { value: "reports", label: "Reports" }, ], }, }, ...(!isEngage ? [ { title: "News Feed Source", description: "Choose the sources for your news feed", id: 11, Component: Select, props: { value: $settingsState.newsSource, onChange: (value: string) => settingsState.newsSource = value, options: [ { value: "australia", label: "Australia" }, { value: "usa", label: "USA" }, { value: "uk", label: "UK" }, { value: "taiwan", label: "Taiwan" }, { value: "hong_kong", label: "Hong Kong" }, { value: "panama", label: "Panama" }, { value: "canada", label: "Canada" }, { value: "singapore", label: "Singapore" }, { value: "japan", label: "Japan" }, { value: "netherlands", label: "Netherlands" }, ], }, }, ] : []), ] as option (option.id)} {@render Setting(option)} {/each} {/if} {#if showsSection("appearance")} {#each [ { title: "Custom Theme Colour", description: "Customise the overall theme colour of SEQTA Learn", id: 4, Component: PickerSwatch, props: { onClick: showColourPicker } }, { title: "Interface Font", description: "Choose the typeface used across SEQTA Learn", id: 16, Component: Button, props: { onClick: showFontPicker, text: "Change" } }, ] as option (option.id)} {@render Setting(option)} {/each} {#if !isEngage}
{/if}

Adaptive Theme Colour

Change the theme colour based on the current class (e.g. when viewing a course or assessments page)

settingsState.adaptiveThemeColour = isOn} />
{#if $settingsState.adaptiveThemeColour}

Soft Gradient

Use a soft gradient instead of a solid colour when viewing a class

settingsState.adaptiveThemeGradient = isOn} />

Smooth colour transition

Ease between class/subject colours when navigating instead of switching instantly

settingsState.adaptiveThemeColourTransition = isOn} />
{/if}
{/if} {#if showsSection("general")}

Home Page Assessments

Limit upcoming assessments shown on the home page by subject

Include Past Assessments

Show past-due assessments from the upcoming list, matching the Assessments page

(settingsState.homeUpcomingIncludePast = isOn)} />

Maximum Subjects

Number of subjects to include, ordered by soonest due date

(settingsState.homeUpcomingAssessmentsPerSubjectMax = Number(value))} options={[ { value: "0", label: "All" }, { value: "1", label: "1" }, { value: "2", label: "2" }, { value: "3", label: "3" }, { value: "5", label: "5" }, { value: "10", label: "10" }, ]} />
{/if} {#each pluginSettings as plugin (plugin.pluginId)} {#if pluginBelongsInSection(plugin.pluginId)}
{#if (plugin as any).disableToggle}

Enable {plugin.name} {#if plugin.beta} Beta {/if}

{plugin.description}

{ if (plugin.pluginId === 'assessments-average' && value === true) { showDisclaimer( async () => { await updatePluginSetting(plugin.pluginId, 'enabled', true); }, () => {}, "Assessment Averages Disclaimer", "This feature calculates a simple average of your assessment grades. It does not take into account:\n• Assessment weightings\n• Different grading scales\n• Other factors used in official reports\n\nThe displayed average may be inaccurate compared to your actual marks found in reports.\n\nDo you want to enable this feature?" ); return; } await updatePluginSetting(plugin.pluginId, 'enabled', value); }} />
{/if} {#if !((plugin as any).disableToggle) || (pluginSettingsValues[plugin.pluginId]?.enabled ?? true)} {#each Object.entries(plugin.settings) as [key, setting] (key)} {#if key !== 'enabled' && !(key === 'useCloudPfp' && !cloudState.isLoggedIn)}

{setting.title || key}

{setting.description || ''}

{#if setting.type === 'boolean'} updatePluginSetting(plugin.pluginId, key, value)} /> {:else if setting.type === 'number'}
updatePluginSetting(plugin.pluginId, key, value)} min={setting.min} max={setting.max} step={setting.step} />
{:else if setting.type === 'string'} updatePluginSetting(plugin.pluginId, key, e.currentTarget.value)} /> {:else if setting.type === 'select'}

GitHub latest version override

Pretend a newer GitHub release exists to test the update badge. Only applies when dev mode is on.

{ settingsState.devGhReleaseVersionOverride = e.currentTarget.value; }} class="px-2 py-1 text-xs rounded border bg-white dark:bg-zinc-800 border-zinc-300 dark:border-zinc-700 text-zinc-900 dark:text-zinc-100" />
{/if} {/if}