Compare commits

...

1 Commits

Author SHA1 Message Date
pratyush090506 a80bd7d417 fix: improve-toggle-switch-placement (#208) 2026-04-17 21:58:44 +00:00
5 changed files with 141 additions and 78 deletions
+16 -10
View File
@@ -9,16 +9,22 @@
const {...props}: Props = $props() const {...props}: Props = $props()
</script> </script>
<div class="grid grid-cols-1 gap-2 lg:gap-6 lg:grid-cols-3 {props.class}"> <div class="flex flex-col gap-2 {props.class}">
<label class="flex items-center gap-2 font-bold"> <div class="flex items-center justify-between w-full gap-2">
{@render props.label?.()} {#if props.label}
<label class="flex items-center gap-2 max-w-[80%] md:max-w-none">
{@render props.label()}
</label> </label>
<div class="col-span-2 flex items-center gap-2">
{@render props.input?.()}
</div>
<p class="flex-end text-sm opacity-50 lg:col-span-3">
{#if props.info}
{@render props.info?.()}
{/if} {/if}
</p> <div class="flex items-center gap-2 justify-end shrink-0">
{#if props.input}
{@render props.input()}
{/if}
</div>
</div>
{#if props.info}
<p class="text-sm opacity-50">
{@render props.info()}
</p>
{/if}
</div> </div>
+8 -1
View File
@@ -13,7 +13,12 @@
placeholder?: string placeholder?: string
} }
let {value = $bindable(), addLabel, placeholder = "Enter text..."}: Props = $props() let {
value = $bindable(),
addLabel,
placeholder = "Enter text...",
allowAdd = true,
}: Props & {allowAdd?: boolean} = $props()
let draggedIndex: number | null = $state(null) let draggedIndex: number | null = $state(null)
const onChange = (newValue: string[]) => { const onChange = (newValue: string[]) => {
@@ -72,6 +77,7 @@
</div> </div>
</div> </div>
{/each} {/each}
{#if allowAdd}
<Button onclick={addItem} class="btn btn-link w-fit px-0"> <Button onclick={addItem} class="btn btn-link w-fit px-0">
<Icon icon={AddCircle} size={5} /> <Icon icon={AddCircle} size={5} />
{#if addLabel} {#if addLabel}
@@ -80,4 +86,5 @@
Add Item Add Item
{/if} {/if}
</Button> </Button>
{/if}
</div> </div>
+37 -12
View File
@@ -5,6 +5,7 @@
import {Badge} from "@capawesome/capacitor-badge" import {Badge} from "@capawesome/capacitor-badge"
import Bell from "@assets/icons/bell.svg?dataurl" import Bell from "@assets/icons/bell.svg?dataurl"
import {preventDefault} from "@lib/html" import {preventDefault} from "@lib/html"
import FieldInline from "@lib/components/FieldInline.svelte"
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
@@ -63,40 +64,64 @@
<!-- pass --> <!-- pass -->
{:then { isSupported }} {:then { isSupported }}
{#if isSupported} {#if isSupported}
<div class="flex justify-between"> <FieldInline>
{#snippet label()}
<p>Show badge for unread alerts</p> <p>Show badge for unread alerts</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.badge} /> <input type="checkbox" class="toggle toggle-primary" bind:checked={settings.badge} />
</div> {/snippet}
</FieldInline>
{/if} {/if}
{/await} {/await}
{#if !Capacitor.isNativePlatform()} {#if !Capacitor.isNativePlatform()}
<div class="flex justify-between"> <FieldInline>
{#snippet label()}
<p>Play sound for new activity</p> <p>Play sound for new activity</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.sound} /> <input type="checkbox" class="toggle toggle-primary" bind:checked={settings.sound} />
</div> {/snippet}
</FieldInline>
{/if} {/if}
<div class="flex justify-between"> <FieldInline>
{#snippet label()}
<p>Enable push notifications</p> <p>Enable push notifications</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.push} /> <input type="checkbox" class="toggle toggle-primary" bind:checked={settings.push} />
</div> {/snippet}
</FieldInline>
</div> </div>
<div <div
class={cx("card2 bg-alt col-4 shadow-md", { class={cx("card2 bg-alt col-4 shadow-md", {
"pointer-events-none opacity-50": !settings.badge && !settings.sound && !settings.push, "pointer-events-none opacity-50": !settings.badge && !settings.sound && !settings.push,
})}> })}>
<strong class="text-lg">Alert Types</strong> <strong class="text-lg">Alert Types</strong>
<div class="flex justify-between"> <FieldInline>
{#snippet label()}
<p>Notify me about new activity</p> <p>Notify me about new activity</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.spaces} /> <input type="checkbox" class="toggle toggle-primary" bind:checked={settings.spaces} />
</div> {/snippet}
<div class="flex justify-between"> </FieldInline>
<FieldInline>
{#snippet label()}
<p>Always notify me when mentioned</p> <p>Always notify me when mentioned</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" checked={settings.mentions} /> <input type="checkbox" class="toggle toggle-primary" checked={settings.mentions} />
</div> {/snippet}
<div class="flex justify-between"> </FieldInline>
<FieldInline>
{#snippet label()}
<p>Notify me about new messages</p> <p>Notify me about new messages</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.messages} /> <input type="checkbox" class="toggle toggle-primary" bind:checked={settings.messages} />
</div> {/snippet}
</FieldInline>
</div> </div>
<div <div
class="card2 bg-alt sticky -bottom-3 shadow-md flex flex-row items-center justify-between gap-4"> class="card2 bg-alt sticky -bottom-3 shadow-md flex flex-row items-center justify-between gap-4">
+17 -8
View File
@@ -11,6 +11,7 @@
import {Router} from "@welshman/router" import {Router} from "@welshman/router"
import {userMuteList, tagPubkey, publishThunk, userBlossomServerList} from "@welshman/app" import {userMuteList, tagPubkey, publishThunk, userBlossomServerList} from "@welshman/app"
import NotesMinimalistic from "@assets/icons/notes-minimalistic.svg?dataurl" import NotesMinimalistic from "@assets/icons/notes-minimalistic.svg?dataurl"
import AddCircle from "@assets/icons/add-circle.svg?dataurl"
import {preventDefault} from "@lib/html" import {preventDefault} from "@lib/html"
import Field from "@lib/components/Field.svelte" import Field from "@lib/components/Field.svelte"
import FieldInline from "@lib/components/FieldInline.svelte" import FieldInline from "@lib/components/FieldInline.svelte"
@@ -28,6 +29,10 @@
blossomServers = getTagValues("server", getListTags($userBlossomServerList)) blossomServers = getTagValues("server", getListTags($userBlossomServerList))
} }
const addServer = () => {
blossomServers = [...blossomServers, ""]
}
const onsubmit = preventDefault(async () => { const onsubmit = preventDefault(async () => {
await publishSettings($state.snapshot(settings)) await publishSettings($state.snapshot(settings))
@@ -104,7 +109,7 @@
{/snippet} {/snippet}
{#snippet input()} {#snippet input()}
<input <input
class="range range-primary" class="range range-primary w-full"
type="range" type="range"
min="0.8" min="0.8"
max="1.3" max="1.3"
@@ -115,13 +120,13 @@
</div> </div>
<div class="card2 bg-alt col-4 shadow-md"> <div class="card2 bg-alt col-4 shadow-md">
<strong class="text-lg">Editor Settings</strong> <strong class="text-lg">Editor Settings</strong>
<FieldInline> <Field>
{#snippet label()} {#snippet label()}
<p>Send Delay</p> <p>Send Delay</p>
{/snippet} {/snippet}
{#snippet input()} {#snippet input()}
<input <input
class="range range-primary" class="range range-primary w-full"
type="range" type="range"
min="0" min="0"
max="10000" max="10000"
@@ -134,17 +139,21 @@
{settings.send_delay === 1000 ? "second" : "seconds"}. {settings.send_delay === 1000 ? "second" : "seconds"}.
</p> </p>
{/snippet} {/snippet}
</FieldInline> </Field>
<Field> <Field>
{#snippet label()} {#snippet label()}
<p>Media Server</p> <p>Media Server</p>
{/snippet} {/snippet}
{#snippet input()} {#snippet secondary()}
<InputList bind:value={blossomServers}> <Button
{#snippet addLabel()} class="btn btn-link w-fit px-0 decoration-solid underline text-[#7161ff] h-auto min-h-0 flex items-center gap-[5px]"
onclick={addServer}>
<Icon icon={AddCircle} size={4} />
Add Server Add Server
</Button>
{/snippet} {/snippet}
</InputList> {#snippet input()}
<InputList allowAdd={false} bind:value={blossomServers} />
{/snippet} {/snippet}
{#snippet info()} {#snippet info()}
<p>Choose a media server type and url for files you upload to {PLATFORM_NAME}.</p> <p>Choose a media server type and url for files you upload to {PLATFORM_NAME}.</p>
+32 -16
View File
@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import ShieldMinimalistic from "@assets/icons/shield-minimalistic.svg?dataurl" import ShieldMinimalistic from "@assets/icons/shield-minimalistic.svg?dataurl"
import {preventDefault} from "@lib/html" import {preventDefault} from "@lib/html"
import FieldInline from "@lib/components/FieldInline.svelte"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import {pushToast} from "@app/util/toast" import {pushToast} from "@app/util/toast"
@@ -30,31 +31,46 @@
<Icon icon={ShieldMinimalistic} /> <Icon icon={ShieldMinimalistic} />
Privacy Settings Privacy Settings
</strong> </strong>
<div class="grid grid-cols-2 gap-2"> <FieldInline>
{#snippet label()}
<p>Authenticate with unknown relays?</p> <p>Authenticate with unknown relays?</p>
{/snippet}
{#snippet input()}
<input <input
type="checkbox" type="checkbox"
class="toggle toggle-primary" class="toggle toggle-primary"
onchange={onAuthModeChange} onchange={onAuthModeChange}
checked={settings.auth_mode === RelayAuthMode.Aggressive} /> checked={settings.auth_mode === RelayAuthMode.Aggressive} />
<p class="col-span-2 text-sm opacity-70"> {/snippet}
Controls whether {PLATFORM_NAME} will identify you to relays not in your lists. {#snippet info()}
</p> <p>Controls whether {PLATFORM_NAME} will identify you to relays not in your lists.</p>
</div> {/snippet}
<div class="grid grid-cols-2 gap-2"> </FieldInline>
<FieldInline>
{#snippet label()}
<p>Report errors?</p> <p>Report errors?</p>
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.report_errors} /> {/snippet}
<p class="col-span-2 text-sm opacity-70"> {#snippet input()}
Allow {PLATFORM_NAME} to send error reports to help improve the app. <input
</p> type="checkbox"
</div> class="toggle toggle-primary"
<div class="grid grid-cols-2 gap-2"> bind:checked={settings.report_errors} />
{/snippet}
{#snippet info()}
<p>Allow {PLATFORM_NAME} to send error reports to help improve the app.</p>
{/snippet}
</FieldInline>
<FieldInline>
{#snippet label()}
<p>Report usage?</p> <p>Report usage?</p>
{/snippet}
{#snippet input()}
<input type="checkbox" class="toggle toggle-primary" bind:checked={settings.report_usage} /> <input type="checkbox" class="toggle toggle-primary" bind:checked={settings.report_usage} />
<p class="col-span-2 text-sm opacity-70"> {/snippet}
Allow {PLATFORM_NAME} to collect anonymous usage data. {#snippet info()}
</p> <p>Allow {PLATFORM_NAME} to collect anonymous usage data.</p>
</div> {/snippet}
</FieldInline>
</div> </div>
<div <div
class="card2 bg-alt sticky -bottom-3 shadow-md flex flex-row items-center justify-between gap-4"> class="card2 bg-alt sticky -bottom-3 shadow-md flex flex-row items-center justify-between gap-4">