Fix: Basic Auth Fall-back Management & Settings Drop-down Portal (WIP)

This commit is contained in:
Youwes09
2026-06-14 04:02:10 -05:00
parent 3747497041
commit ab61e12153
18 changed files with 301 additions and 141 deletions
+18 -7
View File
@@ -4,6 +4,7 @@
import { settingsState, updateSettings } from '$lib/state/settings.svelte'
import { eventToKeybind } from '$lib/core/keybinds/keybindEngine'
import type { Keybinds } from '$lib/core/keybinds/defaultBinds'
import { anchorToModal } from '$lib/core/ui/selectPortal'
import GeneralSettings from './sections/GeneralSettings.svelte'
import AppearanceSettings from './sections/AppearanceSettings.svelte'
@@ -49,6 +50,7 @@
let tabSlideDir = $state<'up'|'down'>('down')
let tabIconKey = $state(0)
let contentBodyEl: HTMLDivElement
let modalEl: HTMLDivElement
let bugReporterOpen = $state(false)
$effect(() => { tab; tick().then(() => contentBodyEl?.scrollTo({ top: 0 })) })
@@ -89,6 +91,7 @@
let selectOpen: string | null = $state(null)
let closingSelect: string | null = $state(null)
const CLOSE_ANIM_MS = 120
const selectTriggers = new Map<string, HTMLElement>()
function closeSelect() {
if (!selectOpen) return
@@ -102,6 +105,14 @@
else { closingSelect = null; selectOpen = id }
}
function registerTrigger(id: string, el: HTMLElement) {
selectTriggers.set(id, el)
}
function getTrigger(id: string): HTMLElement | undefined {
return selectTriggers.get(id)
}
$effect(() => {
const handler = (e: MouseEvent) => {
if (!selectOpen) return
@@ -118,7 +129,7 @@
<div class="s-backdrop" role="presentation" tabindex="-1"
onclick={(e) => { if (e.target === e.currentTarget) close() }}
onkeydown={(e) => { if (e.key === 'Escape') { e.stopPropagation(); close() } }}>
<div class="s-modal" role="dialog" aria-label="Settings">
<div class="s-modal" role="dialog" aria-label="Settings" bind:this={modalEl}>
<div class="s-sidebar">
<p class="s-sidebar-title">Settings</p>
@@ -164,13 +175,13 @@
<div class="s-content-body" bind:this={contentBodyEl}>
{#if tab === 'general'}
<GeneralSettings {selectOpen} {closingSelect} {toggleSelect} {anims} />
<GeneralSettings {selectOpen} {closingSelect} {toggleSelect} {registerTrigger} {getTrigger} {anchorToModal} {modalEl} {anims} />
{:else if tab === 'appearance'}
<AppearanceSettings {selectOpen} {closingSelect} {toggleSelect} {anims} {onOpenThemeEditor} />
<AppearanceSettings {selectOpen} {closingSelect} {toggleSelect} {registerTrigger} {getTrigger} {anchorToModal} {modalEl} {anims} {onOpenThemeEditor} />
{:else if tab === 'reader'}
<ReaderSettings {selectOpen} {closingSelect} {toggleSelect} {anims} />
<ReaderSettings {selectOpen} {closingSelect} {toggleSelect} {registerTrigger} {getTrigger} {anchorToModal} {modalEl} {anims} />
{:else if tab === 'library'}
<LibrarySettings {selectOpen} {closingSelect} {toggleSelect} {anims} />
<LibrarySettings {selectOpen} {closingSelect} {toggleSelect} {registerTrigger} {getTrigger} {anchorToModal} {modalEl} {anims} />
{:else if tab === 'automation'}
<AutomationSettings />
{:else if tab === 'performance'}
@@ -178,13 +189,13 @@
{:else if tab === 'keybinds'}
<KeybindsSettings bind:listeningKey />
{:else if tab === 'storage'}
<StorageSettings {selectOpen} {closingSelect} {toggleSelect} />
<StorageSettings {selectOpen} {closingSelect} {toggleSelect} {registerTrigger} {getTrigger} {anchorToModal} {modalEl} />
{:else if tab === 'folders'}
<FoldersSettings />
{:else if tab === 'tracking'}
<TrackingSettings />
{:else if tab === 'security'}
<SecuritySettings {selectOpen} {toggleSelect} />
<SecuritySettings {selectOpen} {toggleSelect} {registerTrigger} {getTrigger} {anchorToModal} {modalEl} />
{:else if tab === 'content'}
<ContentSettings />
{:else if tab === 'about'}
@@ -4,15 +4,22 @@
const isTauri = platformService.platform === 'tauri'
import { selectPortal as _defaultPortal } from '$lib/core/ui/selectPortal'
import type { Action } from 'svelte/action'
interface Props {
selectOpen: string | null
closingSelect: string | null
toggleSelect: (id: string) => void
anims: boolean
selectOpen: string | null
closingSelect: string | null
toggleSelect: (id: string) => void
registerTrigger: (id: string, el: HTMLElement) => void
getTrigger: (id: string) => HTMLElement | undefined
selectPortal: Action<HTMLElement, HTMLElement | undefined>
anims: boolean
}
let { selectOpen, closingSelect, toggleSelect, anims }: Props = $props()
let { selectOpen, closingSelect, toggleSelect, registerTrigger, getTrigger, selectPortal, anims }: Props = $props()
let triggerIdleTimeout = $state<HTMLButtonElement>(null!)
$effect(() => { if (triggerIdleTimeout) registerTrigger('idle-timeout', triggerIdleTimeout) })
let serverAdvancedOpen = $state(false)
async function pickServerBinary() {
@@ -138,7 +145,7 @@
<svg class="s-select-caret" class:open={selectOpen === 'idle-timeout'} width="10" height="6" viewBox="0 0 10 6"><path d="M0 0l5 6 5-6" fill="currentColor"/></svg>
</button>
{#if selectOpen === 'idle-timeout' || closingSelect === 'idle-timeout'}
<div class="s-select-menu" class:anims class:closing={closingSelect === 'idle-timeout'}>
<div use:selectPortal={getTrigger('idle-timeout')} class="s-select-menu" class:anims class:closing={closingSelect === 'idle-timeout'}>
{#each [['0','Never'],['1','1 minute'],['2','2 minutes'],['5','5 minutes'],['10','10 minutes'],['15','15 minutes'],['30','30 minutes']] as [v, l]}
<button class="s-select-option" class:active={String(settingsState.settings.idleTimeoutMin ?? 5) === v} onclick={() => { updateSettings({ idleTimeoutMin: Number(v) }); toggleSelect('idle-timeout') }}>{l}</button>
{/each}