Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions app/components/Toggle.client.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<script setup lang="ts">
defineProps<{
label?: string
description?: string
}>()

const checked = defineModel<boolean>({
default: false,
})
</script>

<template>
<button
type="button"
class="w-full flex items-center justify-between gap-4 group"
role="switch"
:aria-checked="checked"
@click="checked = !checked"
>
<span v-if="label" class="text-sm text-fg font-medium text-start">
{{ label }}
</span>
<span
class="relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out motion-reduce:transition-none shadow-sm cursor-pointer"
:class="checked ? 'bg-accent' : 'bg-bg border border-border'"
aria-hidden="true"
>
<span
class="pointer-events-none inline-block h-5 w-5 rounded-full shadow-sm ring-0 transition-transform duration-200 ease-in-out motion-reduce:transition-none"
:class="checked ? 'bg-bg' : 'bg-fg-muted'"
/>
</span>
</button>
<p v-if="description" class="text-sm text-fg-muted">
{{ description }}
</p>
</template>

<style scoped>
button[aria-checked='false'] > span:last-of-type > span {
translate: 0;
}
button[aria-checked='true'] > span:last-of-type > span {
translate: calc(100%);
}
html[dir='rtl'] button[aria-checked='true'] > span:last-of-type > span {
translate: calc(-100%);
}
</style>
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
<script setup lang="ts">
defineProps<{
label: string
label?: string
description?: string
}>()
</script>

<template>
<div class="w-full flex items-center justify-between gap-4">
<span class="text-sm text-fg font-medium text-start">
<span v-if="label" class="text-sm text-fg font-medium text-start">
{{ label }}
</span>
<span class="skeleton block h-6 w-11 shrink-0 rounded-full" />
</div>
<p v-if="description" class="text-sm text-fg-muted">
{{ description }}
</p>
</template>
118 changes: 11 additions & 107 deletions app/pages/settings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -100,114 +100,30 @@ defineOgImageComponent('Default', {
</h2>
<div class="bg-bg-subtle border border-border rounded-lg p-4 sm:p-6 space-y-4">
<!-- Relative dates toggle -->
<div class="space-y-2">
<ClientOnly>
<button
type="button"
class="w-full flex items-center justify-between gap-4 group"
role="switch"
:aria-checked="settings.relativeDates"
@click="settings.relativeDates = !settings.relativeDates"
>
<span class="text-sm text-fg font-medium text-start">
{{ $t('settings.relative_dates') }}
</span>
<span
class="relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out motion-reduce:transition-none shadow-sm cursor-pointer"
:class="settings.relativeDates ? 'bg-accent' : 'bg-bg border border-border'"
aria-hidden="true"
>
<span
class="pointer-events-none inline-block h-5 w-5 rounded-full shadow-sm ring-0 transition-transform duration-200 ease-in-out motion-reduce:transition-none"
:class="settings.relativeDates ? 'bg-bg' : 'bg-fg-muted'"
/>
</span>
</button>
<template #fallback>
<ToggleSkeleton :label="$t('settings.relative_dates')" />
</template>
</ClientOnly>
<p class="text-sm text-fg-muted">
{{ $t('settings.relative_dates_description') }}
</p>
</div>
<Toggle :label="$t('settings.relative_dates')" v-model="settings.relativeDates" />

<!-- Divider -->
<div class="border-t border-border" />

<!-- Include @types in install toggle -->
<div class="space-y-2">
<ClientOnly>
<button
type="button"
class="w-full flex items-center justify-between gap-4 group"
role="switch"
:aria-checked="settings.includeTypesInInstall"
@click="settings.includeTypesInInstall = !settings.includeTypesInInstall"
>
<span class="text-sm text-fg font-medium text-start">
{{ $t('settings.include_types') }}
</span>
<span
class="relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out motion-reduce:transition-none shadow-sm cursor-pointer"
:class="
settings.includeTypesInInstall ? 'bg-accent' : 'bg-bg border border-border'
"
aria-hidden="true"
>
<span
class="pointer-events-none inline-block h-5 w-5 rounded-full shadow-sm ring-0 transition-transform duration-200 ease-in-out motion-reduce:transition-none"
:class="settings.includeTypesInInstall ? 'bg-bg' : 'bg-fg-muted'"
/>
</span>
</button>
<template #fallback>
<ToggleSkeleton :label="$t('settings.include_types')" />
</template>
</ClientOnly>
<p class="text-sm text-fg-muted">
{{ $t('settings.include_types_description') }}
</p>
<Toggle
:label="$t('settings.include_types')"
:description="$t('settings.include_types_description')"
v-model="settings.includeTypesInInstall"
/>
</div>

<!-- Divider -->
<div class="border-t border-border" />

<!-- Hide platform-specific packages toggle -->
<div class="space-y-2">
<ClientOnly>
<button
type="button"
class="w-full flex items-center justify-between gap-4 group"
role="switch"
:aria-checked="settings.hidePlatformPackages"
@click="settings.hidePlatformPackages = !settings.hidePlatformPackages"
>
<span class="text-sm text-fg font-medium text-start">
{{ $t('settings.hide_platform_packages') }}
</span>
<span
class="relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out motion-reduce:transition-none shadow-sm cursor-pointer"
:class="
settings.hidePlatformPackages ? 'bg-accent' : 'bg-bg border border-border'
"
aria-hidden="true"
>
<span
class="pointer-events-none inline-block h-5 w-5 rounded-full shadow-sm ring-0 transition-transform duration-200 ease-in-out motion-reduce:transition-none"
:class="settings.hidePlatformPackages ? 'bg-bg' : 'bg-fg-muted'"
/>
</span>
</button>
<template #fallback>
<p class="text-sm text-fg-muted">
{{ $t('settings.hide_platform_packages') }}
</p>
</template>
</ClientOnly>
<p class="text-sm text-fg-muted">
{{ $t('settings.hide_platform_packages_description') }}
</p>
<Toggle
:label="$t('settings.hide_platform_packages')"
:description="$t('settings.hide_platform_packages')"
v-model="settings.hidePlatformPackages"
/>
</div>
</div>
</section>
Expand Down Expand Up @@ -271,15 +187,3 @@ defineOgImageComponent('Default', {
</article>
</main>
</template>

<style scoped>
button[aria-checked='false'] > span:last-of-type > span {
translate: 0;
}
button[aria-checked='true'] > span:last-of-type > span {
translate: calc(100%);
}
html[dir='rtl'] button[aria-checked='true'] > span:last-of-type > span {
translate: calc(-100%);
}
</style>
Loading