forked from DebaucheryLibrarian/traxxx
116 lines
1.8 KiB
Vue
Executable File
116 lines
1.8 KiB
Vue
Executable File
<template>
|
|
<label
|
|
class="toggle-container noselect"
|
|
:class="{ light: $store.state.ui.theme === 'dark' }"
|
|
>
|
|
<input
|
|
:id="`toggle-${id}`"
|
|
:checked="checked"
|
|
:true-value="trueValue"
|
|
:false-value="falseValue"
|
|
:disabled="disabled"
|
|
type="checkbox"
|
|
class="toggle-input"
|
|
@change="$emit('change', $event.target.checked)"
|
|
>
|
|
|
|
<label
|
|
:for="`toggle-${id}`"
|
|
class="toggle"
|
|
/>
|
|
</label>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
checked: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
trueValue: {
|
|
type: null,
|
|
default: true,
|
|
},
|
|
falseValue: {
|
|
type: null,
|
|
default: false,
|
|
},
|
|
disabled: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
},
|
|
emits: ['change'],
|
|
data() {
|
|
return {
|
|
id: Math.floor(new Date().getTime() * Math.random()),
|
|
};
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
@import 'breakpoints';
|
|
|
|
.toggle-container {
|
|
display: inline-block;
|
|
cursor: pointer;
|
|
|
|
&.light {
|
|
.toggle {
|
|
background: var(--lighten-weak);
|
|
}
|
|
|
|
.toggle-input:checked + .toggle {
|
|
background: var(--lighten);
|
|
}
|
|
}
|
|
}
|
|
|
|
.toggle {
|
|
width: 2rem;
|
|
height: .9rem;
|
|
display: flex;
|
|
align-items: center;
|
|
position: relative;
|
|
background: var(--shadow-hint);
|
|
border-radius: 1rem;
|
|
cursor: pointer;
|
|
|
|
&::after {
|
|
content: '';
|
|
background-color: var(--background-light);
|
|
width: 1rem;
|
|
height: 1rem;
|
|
display: inline-block;
|
|
position: absolute;
|
|
left: 0;
|
|
border-radius: 50%;
|
|
box-shadow: 0 0 2px var(--darken-strong);
|
|
transition: background-color .2s ease, left .2s ease;
|
|
}
|
|
}
|
|
|
|
.toggle-input {
|
|
display: none;
|
|
|
|
&:checked + .toggle {
|
|
background: var(--primary-faded);
|
|
|
|
&::after {
|
|
background: var(--primary);
|
|
left: calc(100% - 1rem);
|
|
}
|
|
}
|
|
|
|
&[disabled] + .toggle {
|
|
background: var(--shadow-weak);
|
|
|
|
&::after {
|
|
background: var(--shadow);
|
|
}
|
|
}
|
|
}
|
|
</style>
|