web: data-driven switcher & save mode switcher

also:
- disabled ssr to enable localstorage
- removed the workaround for hover, as it looks bad
This commit is contained in:
wukko 2024-06-19 23:04:09 +06:00
parent 0ce73e03d3
commit 00cdb2121d
No known key found for this signature in database
GPG key ID: 3E30B3F26C7B4AA2
7 changed files with 52 additions and 24 deletions

View file

@ -3,13 +3,6 @@
export let click = () => { alert('no function assigned') }; export let click = () => { alert('no function assigned') };
</script> </script>
<button id={id} class="button" on:click={click}> <button id="button-{id}" class="button" on:click={click}>
<slot></slot> <slot></slot>
</button> </button>
<style>
:global(.button.selected) {
background: var(--secondary);
color: var(--primary);
}
</style>

View file

@ -0,0 +1,32 @@
<script
lang="ts"
generics="
Context extends Exclude<keyof CobaltSettings, 'schemaVersion'>,
Id extends keyof CobaltSettings[Context],
Key extends CobaltSettings[Context][Id]
"
>
import settings, { updateSetting } from "$lib/settings";
import type { CobaltSettings } from "$lib/types/settings";
export let settingContext: Context;
export let settingId: Id;
export let settingKey: Key;
$: setting = $settings[settingContext][settingId];
$: isSelected = setting === settingKey;
</script>
<button
id="setting-button-{settingContext}-{String(settingId)}-{settingKey}"
class="button"
class:selected={isSelected}
on:click={() =>
updateSetting({
[settingContext]: {
[settingId]: settingKey,
},
})}
>
<slot></slot>
</button>

View file

@ -1,8 +1,4 @@
<script lang="ts"> <div id="switcher-container" class="switcher">
export let settingId: string;
</script>
<div id="switcher-{settingId}" class="switcher">
<slot></slot> <slot></slot>
</div> </div>
@ -31,7 +27,8 @@
border-radius: 0; border-radius: 0;
} }
/* clumsy hack to get rid of double border in a list of switches */
.switcher > :global(:not(.button:first-child)) { .switcher > :global(:not(.button:first-child)) {
margin-left: -1.5px; /* hack to get rid of double border in a list of switches */ margin-left: -1.5px;
} }
</style> </style>

View file

@ -12,6 +12,7 @@
import IconMute from "$lib/icons/Mute.svelte"; import IconMute from "$lib/icons/Mute.svelte";
import IconClipboard from "$lib/icons/Clipboard.svelte"; import IconClipboard from "$lib/icons/Clipboard.svelte";
import SettingsContextButton from "../buttons/SettingsContextButton.svelte";
let link: string = ""; let link: string = "";
let isFocused = false; let isFocused = false;
@ -66,18 +67,18 @@
</div> </div>
<div id="action-container"> <div id="action-container">
<Switcher settingId="save-downloadMode"> <Switcher>
<ActionButton id="auto-mode-button"> <SettingsContextButton settingContext="save" settingId="downloadMode" settingKey="auto">
<IconSparkles /> auto <IconSparkles /> auto
</ActionButton> </SettingsContextButton>
<ActionButton id="audio-mode-button"> <SettingsContextButton settingContext="save" settingId="downloadMode" settingKey="audio">
<IconMusic /> audio <IconMusic /> audio
</ActionButton> </SettingsContextButton>
<ActionButton id="mute-mode-button"> <SettingsContextButton settingContext="save" settingId="downloadMode" settingKey="mute">
<IconMute /> mute <IconMute /> mute
</ActionButton> </SettingsContextButton>
</Switcher> </Switcher>
<ActionButton id="paste-button" click={pasteClipboard}> <ActionButton id="paste" click={pasteClipboard}>
<IconClipboard /> <IconClipboard />
<span id="paste-desktop-text">paste</span> <span id="paste-desktop-text">paste</span>
<span id="paste-mobile-text">paste and download</span> <span id="paste-mobile-text">paste and download</span>

View file

@ -18,7 +18,7 @@ const writeToStorage = (settings: CobaltSettings) => {
const loadFromStorage = () => { const loadFromStorage = () => {
const settings = localStorage.getItem('settings'); const settings = localStorage.getItem('settings');
if (!settings) { if (!settings) {
return writeToStorage(defaultSettings); return defaultSettings;
} }
return JSON.parse(settings) as CobaltSettings; return JSON.parse(settings) as CobaltSettings;

View file

@ -133,10 +133,14 @@
transform: scale(0.95); transform: scale(0.95);
} }
:global(.button.selected) {
background: var(--secondary);
color: var(--primary);
}
@media (hover: hover) { @media (hover: hover) {
:global(button:hover) { :global(button:hover) {
background-color: var(--button-hover); background-color: var(--button-hover);
z-index: 1;
} }
} }

View file

@ -1 +1,2 @@
export const prerender = true; export const prerender = true;
export const ssr = false;