1
0
mirror of https://github.com/immich-app/immich.git synced 2025-07-13 07:00:55 +02:00
Files
.github
.vscode
cli
deployment
design
docker
docs
e2e
fastlane
i18n
machine-learning
misc
mobile
open-api
readme_i18n
server
web
bin
src
lib
__mocks__
actions
assets
components
admin-page
album-page
asset-viewer
assets
elements
buttons
badge.svelte
checkbox.svelte
date-input.svelte
dropdown.svelte
group-tab.svelte
icon.svelte
radio-button.svelte
search-bar.svelte
slider.svelte
faces-page
forms
i18n
layouts
map-page
memory-page
onboarding-page
photos-page
share-page
shared-components
sharedlinks-page
user-settings-page
utilities-page
error.svelte
slideshow-settings.svelte
models
stores
utils
constants.ts
i18n.spec.ts
utils.ts
params
routes
test-data
app.css
app.d.ts
app.html
hooks.client.ts
hooks.server.ts
static
.dockerignore
.gitignore
.npmrc
.nvmrc
.prettierignore
.prettierrc
Dockerfile
README.md
eslint.config.mjs
package-lock.json
package.json
postcss.config.cjs
svelte.config.js
tailwind.config.js
tsconfig.json
vite.config.js
.dockerignore
.editorconfig
.gitattributes
.gitignore
.gitmodules
CODEOWNERS
CODE_OF_CONDUCT.md
LICENSE
Makefile
README.md
SECURITY.md
install.sh
localizely.yml
renovate.json
immich/web/src/lib/components/elements/slider.svelte

85 lines
2.4 KiB
Svelte
Raw Normal View History

<script lang="ts">
/**
* Unique identifier for the checkbox element, used to associate labels with the input element.
*/
export let id: string;
/**
* Optional aria-describedby attribute to associate the checkbox with a description.
*/
export let ariaDescribedBy: string | undefined = undefined;
export let checked = false;
export let disabled = false;
export let onToggle: ((checked: boolean) => void) | undefined = undefined;
const handleToggle = (event: Event) => onToggle?.((event.target as HTMLInputElement).checked);
</script>
<label class="relative inline-block h-[10px] w-[36px] flex-none">
<input
{id}
class="disabled::cursor-not-allowed h-0 w-0 opacity-0 peer"
type="checkbox"
bind:checked
on:click={handleToggle}
{disabled}
aria-describedby={ariaDescribedBy}
/>
{#if disabled}
<span
class="slider slider-disabled cursor-not-allowed border border-transparent before:border before:border-transparent"
/>
{:else}
<span
class="slider slider-enabled cursor-pointer border-2 border-transparent before:border-2 before:border-transparent peer-focus-visible:outline before:peer-focus-visible:outline peer-focus-visible:dark:outline-gray-200 before:peer-focus-visible:dark:outline-gray-200 peer-focus-visible:outline-gray-600 before:peer-focus-visible:outline-gray-600 peer-focus-visible:dark:border-black before:peer-focus-visible:dark:border-black peer-focus-visible:border-white before:peer-focus-visible:border-white"
/>
{/if}
</label>
<style>
.slider {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: transform 0.4s;
transition: transform 0.4s;
border-radius: 34px;
}
input:disabled {
cursor: not-allowed;
}
.slider:before {
position: absolute;
content: '';
height: 20px;
width: 20px;
left: -2px;
right: 0px;
bottom: -6px;
background-color: gray;
-webkit-transition: transform 0.4s;
transition: transform 0.4s;
border-radius: 50%;
}
input:checked + .slider:before {
-webkit-transform: translateX(18px);
-ms-transform: translateX(18px);
transform: translateX(18px);
background-color: #4250af;
}
input:checked + .slider-disabled {
background-color: gray;
}
input:checked + .slider-enabled {
background-color: #adcbfa;
}
</style>