chore: Migrate to next Switch component (#12005)
This commit is contained in:
@@ -6,7 +6,7 @@ import DropdownBody from './base/DropdownBody.vue';
|
|||||||
import DropdownSection from './base/DropdownSection.vue';
|
import DropdownSection from './base/DropdownSection.vue';
|
||||||
import DropdownItem from './base/DropdownItem.vue';
|
import DropdownItem from './base/DropdownItem.vue';
|
||||||
import DropdownSeparator from './base/DropdownSeparator.vue';
|
import DropdownSeparator from './base/DropdownSeparator.vue';
|
||||||
import WootSwitch from 'components/ui/Switch.vue';
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
const currentUserAutoOffline = ref(false);
|
const currentUserAutoOffline = ref(false);
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ const menuItems = ref([
|
|||||||
<DropdownItem label="Contact Support" class="justify-between">
|
<DropdownItem label="Contact Support" class="justify-between">
|
||||||
<span>{{ $t('SIDEBAR.SET_AUTO_OFFLINE.TEXT') }}</span>
|
<span>{{ $t('SIDEBAR.SET_AUTO_OFFLINE.TEXT') }}</span>
|
||||||
<div class="flex-shrink-0">
|
<div class="flex-shrink-0">
|
||||||
<WootSwitch v-model="currentUserAutoOffline" />
|
<ToggleSwitch v-model="currentUserAutoOffline" />
|
||||||
</div>
|
</div>
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
</DropdownSection>
|
</DropdownSection>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
} from 'next/dropdown-menu/base';
|
} from 'next/dropdown-menu/base';
|
||||||
import Icon from 'next/icon/Icon.vue';
|
import Icon from 'next/icon/Icon.vue';
|
||||||
import Button from 'next/button/Button.vue';
|
import Button from 'next/button/Button.vue';
|
||||||
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
@@ -48,6 +49,16 @@ const activeStatus = computed(() => {
|
|||||||
return availabilityStatuses.value.find(status => status.active);
|
return availabilityStatuses.value.find(status => status.active);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const autoOfflineToggle = computed({
|
||||||
|
get: () => currentUserAutoOffline.value,
|
||||||
|
set: autoOffline => {
|
||||||
|
store.dispatch('updateAutoOffline', {
|
||||||
|
accountId: currentAccountId.value,
|
||||||
|
autoOffline,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
function changeAvailabilityStatus(availability) {
|
function changeAvailabilityStatus(availability) {
|
||||||
if (isImpersonating.value) {
|
if (isImpersonating.value) {
|
||||||
useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.IMPERSONATING_ERROR'));
|
useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.IMPERSONATING_ERROR'));
|
||||||
@@ -62,13 +73,6 @@ function changeAvailabilityStatus(availability) {
|
|||||||
useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.SET_AVAILABILITY_ERROR'));
|
useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.SET_AVAILABILITY_ERROR'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateAutoOffline(autoOffline) {
|
|
||||||
store.dispatch('updateAutoOffline', {
|
|
||||||
accountId: currentAccountId.value,
|
|
||||||
autoOffline,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -118,11 +122,7 @@ function updateAutoOffline(autoOffline) {
|
|||||||
class="size-4 text-n-slate-10"
|
class="size-4 text-n-slate-10"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<woot-switch
|
<ToggleSwitch v-model="autoOfflineToggle" />
|
||||||
class="flex-shrink-0"
|
|
||||||
:model-value="currentUserAutoOffline"
|
|
||||||
@input="updateAutoOffline"
|
|
||||||
/>
|
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
</div>
|
</div>
|
||||||
</DropdownSection>
|
</DropdownSection>
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ const updateValue = () => {
|
|||||||
<template>
|
<template>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="relative h-4 transition-colors duration-200 ease-in-out rounded-full w-7 focus:outline-none focus:ring-1 focus:ring-n-brand focus:ring-offset-n-slate-2 focus:ring-offset-2"
|
class="relative h-4 transition-colors duration-200 ease-in-out rounded-full w-7 focus:outline-none focus:ring-1 focus:ring-n-brand focus:ring-offset-n-slate-2 focus:ring-offset-2 flex-shrink-0"
|
||||||
:class="modelValue ? 'bg-n-brand' : 'bg-n-alpha-1 dark:bg-n-alpha-2'"
|
:class="modelValue ? 'bg-n-brand' : 'bg-n-slate-6 disabled:bg-n-slate-6/60'"
|
||||||
role="switch"
|
role="switch"
|
||||||
:aria-checked="modelValue"
|
:aria-checked="modelValue"
|
||||||
@click="updateValue"
|
@click="updateValue"
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
<script>
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
modelValue: { type: Boolean, default: false },
|
|
||||||
size: { type: String, default: '' },
|
|
||||||
},
|
|
||||||
emits: ['update:modelValue', 'input'],
|
|
||||||
methods: {
|
|
||||||
onClick() {
|
|
||||||
this.$emit('update:modelValue', !this.modelValue);
|
|
||||||
this.$emit('input', !this.modelValue);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="toggle-button p-0"
|
|
||||||
:class="{ active: modelValue, small: size === 'small' }"
|
|
||||||
role="switch"
|
|
||||||
:aria-checked="modelValue.toString()"
|
|
||||||
@click="onClick"
|
|
||||||
>
|
|
||||||
<span aria-hidden="true" :class="{ active: modelValue }" />
|
|
||||||
</button>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.toggle-button {
|
|
||||||
@apply bg-n-slate-5;
|
|
||||||
--toggle-button-box-shadow: rgb(255, 255, 255) 0px 0px 0px 0px,
|
|
||||||
rgba(59, 130, 246, 0.5) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px,
|
|
||||||
rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;
|
|
||||||
border-radius: 0.5625rem;
|
|
||||||
border: 2px solid transparent;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
flex-shrink: 0;
|
|
||||||
height: 1.188rem;
|
|
||||||
position: relative;
|
|
||||||
transition-duration: 200ms;
|
|
||||||
transition-property: background-color;
|
|
||||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
width: 2.125rem;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
@apply bg-n-brand;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.small {
|
|
||||||
width: 1.375rem;
|
|
||||||
height: 0.875rem;
|
|
||||||
|
|
||||||
span {
|
|
||||||
@apply size-2.5;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
@apply ltr:translate-x-[0.5rem] ltr:translate-y-0 rtl:translate-x-[-0.5rem] rtl:translate-y-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
@apply bg-n-background;
|
|
||||||
|
|
||||||
border-radius: 100%;
|
|
||||||
box-shadow: var(--toggle-button-box-shadow);
|
|
||||||
display: inline-block;
|
|
||||||
height: 0.9375rem;
|
|
||||||
transform: translate(0, 0);
|
|
||||||
transition-duration: 200ms;
|
|
||||||
transition-property: transform;
|
|
||||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
||||||
width: 0.9375rem;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
@apply ltr:translate-x-[0.9375rem] ltr:translate-y-0 rtl:translate-x-[-0.9375rem] rtl:translate-y-0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
import { messageStamp } from 'shared/helpers/timeHelper';
|
import { messageStamp } from 'shared/helpers/timeHelper';
|
||||||
import Button from 'dashboard/components-next/button/Button.vue';
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
automation: {
|
automation: {
|
||||||
@@ -19,14 +21,17 @@ const readableDate = date => messageStamp(new Date(date), 'LLL d, yyyy');
|
|||||||
const readableDateWithTime = date =>
|
const readableDateWithTime = date =>
|
||||||
messageStamp(new Date(date), 'LLL d, yyyy hh:mm a');
|
messageStamp(new Date(date), 'LLL d, yyyy hh:mm a');
|
||||||
|
|
||||||
const toggle = () => {
|
const automationActive = computed({
|
||||||
const { id, name, active } = props.automation;
|
get: () => props.automation.active,
|
||||||
emit('toggle', {
|
set: active => {
|
||||||
id,
|
const { id, name } = props.automation;
|
||||||
name,
|
emit('toggle', {
|
||||||
status: active,
|
id,
|
||||||
});
|
name,
|
||||||
};
|
status: !active,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -34,7 +39,7 @@ const toggle = () => {
|
|||||||
<td class="py-4 ltr:pr-4 rtl:pl-4 min-w-[200px]">{{ automation.name }}</td>
|
<td class="py-4 ltr:pr-4 rtl:pl-4 min-w-[200px]">{{ automation.name }}</td>
|
||||||
<td class="py-4 ltr:pr-4 rtl:pl-4">{{ automation.description }}</td>
|
<td class="py-4 ltr:pr-4 rtl:pl-4">{{ automation.description }}</td>
|
||||||
<td class="py-4 ltr:pr-4 rtl:pl-4">
|
<td class="py-4 ltr:pr-4 rtl:pl-4">
|
||||||
<woot-switch :model-value="automation.active" @input="toggle" />
|
<ToggleSwitch v-model="automationActive" />
|
||||||
</td>
|
</td>
|
||||||
<td
|
<td
|
||||||
class="py-4 ltr:pr-4 rtl:pl-4 min-w-[12px]"
|
class="py-4 ltr:pr-4 rtl:pl-4 min-w-[12px]"
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<script>
|
<script>
|
||||||
import Draggable from 'vuedraggable';
|
import Draggable from 'vuedraggable';
|
||||||
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { Draggable },
|
components: { Draggable, ToggleSwitch },
|
||||||
props: {
|
props: {
|
||||||
preChatFields: {
|
preChatFields: {
|
||||||
type: Array,
|
type: Array,
|
||||||
@@ -45,9 +46,9 @@ export default {
|
|||||||
<tr class="border-b border-n-weak">
|
<tr class="border-b border-n-weak">
|
||||||
<td class="pre-chat-field"><fluent-icon icon="drag" /></td>
|
<td class="pre-chat-field"><fluent-icon icon="drag" /></td>
|
||||||
<td class="pre-chat-field">
|
<td class="pre-chat-field">
|
||||||
<woot-switch
|
<ToggleSwitch
|
||||||
:model-value="item['enabled']"
|
:model-value="item['enabled']"
|
||||||
@input="handlePreChatFieldOptions($event, 'enabled', item)"
|
@change="handlePreChatFieldOptions($event, 'enabled', item)"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td
|
<td
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ import {
|
|||||||
verifyServiceWorkerExistence,
|
verifyServiceWorkerExistence,
|
||||||
} from 'dashboard/helper/pushHelper.js';
|
} from 'dashboard/helper/pushHelper.js';
|
||||||
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
||||||
import FormSwitch from 'v3/components/Form/Switch.vue';
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
import { NOTIFICATION_TYPES } from './constants';
|
import { NOTIFICATION_TYPES } from './constants';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
TableHeaderCell,
|
TableHeaderCell,
|
||||||
FormSwitch,
|
ToggleSwitch,
|
||||||
CheckBox,
|
CheckBox,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -284,9 +284,9 @@ export default {
|
|||||||
{{ $t('PROFILE_SETTINGS.FORM.NOTIFICATIONS.BROWSER_PERMISSION') }}
|
{{ $t('PROFILE_SETTINGS.FORM.NOTIFICATIONS.BROWSER_PERMISSION') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<FormSwitch
|
<ToggleSwitch
|
||||||
:model-value="hasEnabledPushPermissions"
|
v-model="hasEnabledPushPermissions"
|
||||||
@update:model-value="onRequestPermissions"
|
@change="onRequestPermissions"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import ReportsFiltersRatings from './Filters/Ratings.vue';
|
|||||||
import subDays from 'date-fns/subDays';
|
import subDays from 'date-fns/subDays';
|
||||||
import { DATE_RANGE_OPTIONS } from '../constants';
|
import { DATE_RANGE_OPTIONS } from '../constants';
|
||||||
import { getUnixStartOfDay, getUnixEndOfDay } from 'helpers/DateHelper';
|
import { getUnixStartOfDay, getUnixEndOfDay } from 'helpers/DateHelper';
|
||||||
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -21,6 +22,7 @@ export default {
|
|||||||
ReportsFiltersInboxes,
|
ReportsFiltersInboxes,
|
||||||
ReportsFiltersTeams,
|
ReportsFiltersTeams,
|
||||||
ReportsFiltersRatings,
|
ReportsFiltersRatings,
|
||||||
|
ToggleSwitch,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
showGroupByFilter: {
|
showGroupByFilter: {
|
||||||
@@ -106,11 +108,6 @@ export default {
|
|||||||
return this.validGroupOptions[0];
|
return this.validGroupOptions[0];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
businessHoursSelected() {
|
|
||||||
this.emitChange();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.emitChange();
|
this.emitChange();
|
||||||
},
|
},
|
||||||
@@ -224,7 +221,7 @@ export default {
|
|||||||
{{ $t('REPORT.BUSINESS_HOURS') }}
|
{{ $t('REPORT.BUSINESS_HOURS') }}
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<woot-switch v-model="businessHoursSelected" />
|
<ToggleSwitch v-model="businessHoursSelected" @change="emitChange" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import startOfDay from 'date-fns/startOfDay';
|
|||||||
import subDays from 'date-fns/subDays';
|
import subDays from 'date-fns/subDays';
|
||||||
import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue';
|
import Thumbnail from 'dashboard/components/widgets/Thumbnail.vue';
|
||||||
import WootDateRangePicker from 'dashboard/components/ui/DateRangePicker.vue';
|
import WootDateRangePicker from 'dashboard/components/ui/DateRangePicker.vue';
|
||||||
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
import { GROUP_BY_FILTER } from '../constants';
|
import { GROUP_BY_FILTER } from '../constants';
|
||||||
const CUSTOM_DATE_RANGE_ID = 5;
|
const CUSTOM_DATE_RANGE_ID = 5;
|
||||||
@@ -13,6 +14,7 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
WootDateRangePicker,
|
WootDateRangePicker,
|
||||||
Thumbnail,
|
Thumbnail,
|
||||||
|
ToggleSwitch,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
currentFilter: {
|
currentFilter: {
|
||||||
@@ -125,9 +127,6 @@ export default {
|
|||||||
groupByFilterItemsList() {
|
groupByFilterItemsList() {
|
||||||
this.currentSelectedGroupByFilter = this.selectedGroupByFilter;
|
this.currentSelectedGroupByFilter = this.selectedGroupByFilter;
|
||||||
},
|
},
|
||||||
businessHoursSelected() {
|
|
||||||
this.$emit('businessHoursToggle', this.businessHoursSelected);
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.onDateRangeChange();
|
this.onDateRangeChange();
|
||||||
@@ -140,6 +139,9 @@ export default {
|
|||||||
groupBy: this.groupBy,
|
groupBy: this.groupBy,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onBusinessHoursToggle() {
|
||||||
|
this.$emit('businessHoursToggle', this.businessHoursSelected);
|
||||||
|
},
|
||||||
fromCustomDate(date) {
|
fromCustomDate(date) {
|
||||||
return getUnixTime(startOfDay(date));
|
return getUnixTime(startOfDay(date));
|
||||||
},
|
},
|
||||||
@@ -303,7 +305,10 @@ export default {
|
|||||||
{{ $t('REPORT.BUSINESS_HOURS') }}
|
{{ $t('REPORT.BUSINESS_HOURS') }}
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<woot-switch v-model="businessHoursSelected" />
|
<ToggleSwitch
|
||||||
|
v-model="businessHoursSelected"
|
||||||
|
@change="onBusinessHoursToggle"
|
||||||
|
/>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import validations from './validations';
|
|||||||
import SlaTimeInput from './SlaTimeInput.vue';
|
import SlaTimeInput from './SlaTimeInput.vue';
|
||||||
import NextButton from 'dashboard/components-next/button/Button.vue';
|
import NextButton from 'dashboard/components-next/button/Button.vue';
|
||||||
import { useVuelidate } from '@vuelidate/core';
|
import { useVuelidate } from '@vuelidate/core';
|
||||||
|
import ToggleSwitch from 'dashboard/components-next/switch/Switch.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
SlaTimeInput,
|
SlaTimeInput,
|
||||||
NextButton,
|
NextButton,
|
||||||
|
ToggleSwitch,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
selectedResponse: {
|
selectedResponse: {
|
||||||
@@ -203,7 +205,7 @@ export default {
|
|||||||
<span for="sla_bh" class="text-n-slate-11">
|
<span for="sla_bh" class="text-n-slate-11">
|
||||||
{{ $t('SLA.FORM.BUSINESS_HOURS.PLACEHOLDER') }}
|
{{ $t('SLA.FORM.BUSINESS_HOURS.PLACEHOLDER') }}
|
||||||
</span>
|
</span>
|
||||||
<woot-switch id="sla_bh" v-model="onlyDuringBusinessHours" />
|
<ToggleSwitch id="sla_bh" v-model="onlyDuringBusinessHours" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center justify-end w-full gap-2 mt-8">
|
<div class="flex items-center justify-end w-full gap-2 mt-8">
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import hljsVuePlugin from '@highlightjs/vue-plugin';
|
|||||||
|
|
||||||
import Multiselect from 'vue-multiselect';
|
import Multiselect from 'vue-multiselect';
|
||||||
import { plugin, defaultConfig } from '@formkit/vue';
|
import { plugin, defaultConfig } from '@formkit/vue';
|
||||||
import WootSwitch from 'components/ui/Switch.vue';
|
|
||||||
import WootWizard from 'components/ui/Wizard.vue';
|
import WootWizard from 'components/ui/Wizard.vue';
|
||||||
import FloatingVue from 'floating-vue';
|
import FloatingVue from 'floating-vue';
|
||||||
import WootUiKit from 'dashboard/components';
|
import WootUiKit from 'dashboard/components';
|
||||||
@@ -90,7 +89,6 @@ app.use(FloatingVue, {
|
|||||||
app.use(hljsVuePlugin);
|
app.use(hljsVuePlugin);
|
||||||
|
|
||||||
app.component('multiselect', Multiselect);
|
app.component('multiselect', Multiselect);
|
||||||
app.component('woot-switch', WootSwitch);
|
|
||||||
app.component('woot-wizard', WootWizard);
|
app.component('woot-wizard', WootWizard);
|
||||||
app.component('fluent-icon', FluentIcon);
|
app.component('fluent-icon', FluentIcon);
|
||||||
|
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
<script>
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
modelValue: { type: Boolean, default: false },
|
|
||||||
},
|
|
||||||
emits: ['update:modelValue'],
|
|
||||||
methods: {
|
|
||||||
onClick() {
|
|
||||||
this.$emit('update:modelValue', !this.modelValue);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="relative flex-shrink-0 h-4 p-0 border-none shadow-inner w-7 rounded-3xl"
|
|
||||||
:class="
|
|
||||||
modelValue ? 'bg-n-brand shadow-n-brand' : 'shadow-n-slate-6 bg-n-slate-5'
|
|
||||||
"
|
|
||||||
role="switch"
|
|
||||||
:aria-checked="modelValue.toString()"
|
|
||||||
@click="onClick"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
aria-hidden="true"
|
|
||||||
class="rounded-full bg-n-background top-0.5 absolute w-3 h-3 translate-y-0 duration-200 transition-transform ease-in-out"
|
|
||||||
:class="
|
|
||||||
modelValue
|
|
||||||
? 'ltr:translate-x-0 rtl:translate-x-[0.75rem]'
|
|
||||||
: 'ltr:-translate-x-[0.75rem] rtl:translate-x-0'
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
</button>
|
|
||||||
</template>
|
|
||||||
Reference in New Issue
Block a user