<template> <div class="filter"> <RangeFilter label="bra size" :min="0" :max="cups.length - 1" :value="filters.braSize" :values="cups" :disabled="!filters.braSizeRequired" @enable="(checked) => emit('update', 'braSizeRequired', checked, true)" @input="(range) => emit('update', 'braSize', range, false)" @change="(range) => emit('update', 'braSize', range, true)" > <template #start><Icon icon="boobs-small" /></template> <template #end><Icon icon="boobs-big" /></template> </RangeFilter> <span class="filter-label">Enhanced Boobs</span> <span :class="{ [['off', 'default', 'on'][naturalBoobsValues.indexOf(filters.naturalBoobs)]]: true }" class="toggle-container noclick" > <span class="toggle-label off" @click="emit('update', 'naturalBoobs', true, true)" ><Icon icon="leaf" /></span> <input :value="naturalBoobsValues.indexOf(filters.naturalBoobs)" class="toggle" type="range" min="0" max="2" @change="emit('update', 'naturalBoobs', naturalBoobsValues[$event.target.value], true)" > <span class="toggle-label on" @click="emit('update', 'naturalBoobs', false, true)" ><Icon icon="magic-wand2" /></span> </span> </div> </template> <script setup> import { computed } from 'vue'; import RangeFilter from '#/components/filters/range.vue'; const props = defineProps({ filters: { type: Object, default: null, }, // cup range should probably not be used, because it becomes impossible to filter for larger values than the current results cupRange: { type: Array, default: null, }, }); function cupRangeToCups(cupA, cupB) { const smallestCode = cupA.charCodeAt(0); const biggestCode = cupB.charCodeAt(0); return Array.from({ length: biggestCode - smallestCode + 1 }, (value, index) => String.fromCharCode(smallestCode + index)); } const emit = defineEmits(['update']); const naturalBoobsValues = [true, undefined, false]; const cups = computed(() => (props.cupRange ? cupRangeToCups(props.cupRange[0], props.cupRange[1]) : 'ABCDEFGHIJKZ'.split(''))); // add Z to allow for 'bigger than K' without wasting fidelity </script>