mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-28 12:11:08 -04:00
882 lines
20 KiB
Vue
Executable File
882 lines
20 KiB
Vue
Executable File
<template>
|
||
<div
|
||
:tabindex="searchable ? -1 : tabindex"
|
||
:class="multiSelectStyle"
|
||
:aria-owns="'listbox-' + id"
|
||
role="combobox"
|
||
@focus="activate()"
|
||
@blur="searchable ? false : deactivate()"
|
||
@keydown.self.down.prevent="pointerForward()"
|
||
@keydown.self.up.prevent="pointerBackward()"
|
||
@keypress.enter.tab.stop.self="addPointerElement($event)"
|
||
@keyup.esc="deactivate()"
|
||
>
|
||
<slot :toggle="toggle" name="caret">
|
||
<div :class="multiselectSelectStyle" @mousedown.prevent.stop="toggle()" />
|
||
</slot>
|
||
<!-- <slot name="clear" :search="search"></slot> -->
|
||
<div ref="tags" :class="multiSelectTagsStyle">
|
||
<slot
|
||
:search="search"
|
||
:remove="removeElement"
|
||
:values="visibleValues"
|
||
:is-open="isOpen"
|
||
name="selection"
|
||
>
|
||
<div
|
||
v-show="visibleValues.length > 0"
|
||
:class="multiselectTagsWrapStyle"
|
||
>
|
||
<template v-for="(option, index) of visibleValues" @mousedown.prevent>
|
||
<slot
|
||
:option="option"
|
||
:search="search"
|
||
:remove="removeElement"
|
||
name="tag"
|
||
>
|
||
<span :key="index" :class="multiselectTagStyle">
|
||
<span v-text="getOptionLabel(option)" />
|
||
<i
|
||
:class="multiselectTagIconStyle"
|
||
tabindex="1"
|
||
@keypress.enter.prevent="removeElement(option)"
|
||
@mousedown.prevent="removeElement(option)"
|
||
/>
|
||
</span>
|
||
</slot>
|
||
</template>
|
||
</div>
|
||
<template v-if="internalValue && internalValue.length > limit">
|
||
<slot name="limit">
|
||
<strong
|
||
:class="multiselectStrongStyle"
|
||
v-text="limitText(internalValue.length - limit)"
|
||
/>
|
||
</slot>
|
||
</template>
|
||
</slot>
|
||
<transition name="multiselect__loading">
|
||
<slot name="loading">
|
||
<div v-show="loading" :class="multiselectSpinnerStyle" />
|
||
</slot>
|
||
</transition>
|
||
<input
|
||
ref="search"
|
||
:name="name"
|
||
:id="id"
|
||
:placeholder="placeholder"
|
||
:style="inputStyle"
|
||
:value="search"
|
||
:disabled="disabled"
|
||
:tabindex="tabindex"
|
||
:aria-controls="'listbox-' + id"
|
||
:class="multiselectInputStyle"
|
||
type="text"
|
||
autocomplete="off"
|
||
spellcheck="false"
|
||
@input="updateSearch($event.target.value)"
|
||
@focus.prevent="activate()"
|
||
@blur.prevent="deactivate()"
|
||
@keyup.esc="deactivate()"
|
||
@keydown.down.prevent="pointerForward()"
|
||
@keydown.up.prevent="pointerBackward()"
|
||
@keypress.enter.prevent.stop.self="addPointerElement($event)"
|
||
@keydown.delete.stop="removeLastElement()"
|
||
/>
|
||
<span
|
||
v-if="isSingleLabelVisible"
|
||
:class="multiselectSingleStyle"
|
||
@mousedown.prevent="toggle"
|
||
>
|
||
<slot :option="singleValue" name="singleLabel">
|
||
<template>{{ currentOptionLabel }}</template>
|
||
</slot>
|
||
</span>
|
||
</div>
|
||
<transition name="multiselect">
|
||
<div
|
||
v-show="isOpen"
|
||
ref="list"
|
||
:style="{ maxHeight: optimizedHeight + 'px' }"
|
||
:class="multiselectContentWrapperStyle"
|
||
tabindex="-1"
|
||
@focus="activate"
|
||
@mousedown.prevent
|
||
>
|
||
<ul
|
||
:style="contentStyle"
|
||
:id="'listbox-' + id"
|
||
:class="multiselectContentStyle"
|
||
role="listbox"
|
||
>
|
||
<slot name="beforeList" />
|
||
<li v-if="multiple && max === internalValue.length">
|
||
<span :class="multiselectOptionStyle">
|
||
<slot name="maxElements">
|
||
{{ $t('validation.maximum_options_error', { max: max }) }}
|
||
</slot>
|
||
</span>
|
||
</li>
|
||
<template v-if="!max || internalValue.length < max">
|
||
<li
|
||
v-for="(option, index) of filteredOptions"
|
||
:key="index"
|
||
:id="id + '-' + index"
|
||
:role="
|
||
!(option && (option.$isLabel || option.$isDisabled))
|
||
? 'option'
|
||
: null
|
||
"
|
||
:class="multiselectElementStyle"
|
||
>
|
||
<span
|
||
v-if="!(option && (option.$isLabel || option.$isDisabled))"
|
||
:class="optionHighlight(index, option)"
|
||
:data-select="
|
||
option && option.isTag ? tagPlaceholder : selectLabelText
|
||
"
|
||
:data-selected="selectedLabelText"
|
||
:data-deselect="deselectLabelText"
|
||
@click.stop="select(option)"
|
||
@mouseenter.self="pointerSet(index)"
|
||
>
|
||
<slot :option="option" :search="search" name="option">
|
||
<span>{{ getOptionLabel(option) }}</span>
|
||
</slot>
|
||
</span>
|
||
<span
|
||
v-if="option && (option.$isLabel || option.$isDisabled)"
|
||
:data-select="groupSelect && selectGroupLabelText"
|
||
:data-deselect="groupSelect && deselectGroupLabelText"
|
||
:class="groupHighlight(index, option)"
|
||
@mouseenter.self="groupSelect && pointerSet(index)"
|
||
@mousedown.prevent="selectGroup(option)"
|
||
>
|
||
<slot :option="option" :search="search" name="option">
|
||
<span>{{ getOptionLabel(option) }}</span>
|
||
</slot>
|
||
</span>
|
||
</li>
|
||
</template>
|
||
<li
|
||
v-if="showNoOptions && (options.length === 0 && !search && !loading)"
|
||
>
|
||
<span :class="multiselectOptionStyle">
|
||
<slot name="noOptions">{{ $t('general.list_is_empty') }}</slot>
|
||
</span>
|
||
</li>
|
||
</ul>
|
||
<slot name="afterList" />
|
||
</div>
|
||
</transition>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import CraterTheme from '../theme/index'
|
||
import multiselectMixin from './multiselectMixin'
|
||
import pointerMixin from './pointerMixin'
|
||
|
||
const {
|
||
activeBaseSelectContainer,
|
||
disabledBaseSelectContainer,
|
||
baseSelectContainer,
|
||
multiSelect,
|
||
disabledMultiSelect,
|
||
multiSelectTags,
|
||
multiSelectTagsInvalid,
|
||
multiSelectTagsDefaultColor,
|
||
disabledMultiSelectTags,
|
||
multiselectTagsWrap,
|
||
multiselectTag,
|
||
multiselectTagIcon,
|
||
multiselectStrong,
|
||
multiselectSpinner,
|
||
multiselectInput,
|
||
multiselectSingle,
|
||
multiselectContentWrapper,
|
||
multiselectContent,
|
||
multiselectOption,
|
||
multiselectElement,
|
||
} = CraterTheme.BaseSelect
|
||
|
||
export default {
|
||
name: 'VueMultiselect',
|
||
mixins: [multiselectMixin, pointerMixin],
|
||
props: {
|
||
/**
|
||
* name attribute to match optional label element
|
||
* @default ''
|
||
* @type {String}
|
||
*/
|
||
name: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
/**
|
||
* String to show when pointing to an option
|
||
* @default 'Press enter to select'
|
||
* @type {String}
|
||
*/
|
||
selectLabel: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
/**
|
||
* String to show when pointing to an option
|
||
* @default 'Press enter to select'
|
||
* @type {String}
|
||
*/
|
||
selectGroupLabel: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
/**
|
||
* String to show next to selected option
|
||
* @default 'Selected'
|
||
* @type {String}
|
||
*/
|
||
selectedLabel: {
|
||
type: String,
|
||
default: 'Selected',
|
||
},
|
||
/**
|
||
* String to show when pointing to an already selected option
|
||
* @default 'Press enter to remove'
|
||
* @type {String}
|
||
*/
|
||
deselectLabel: {
|
||
type: String,
|
||
default: 'Press enter to remove',
|
||
},
|
||
/**
|
||
* String to show when pointing to an already selected option
|
||
* @default 'Press enter to remove'
|
||
* @type {String}
|
||
*/
|
||
deselectGroupLabel: {
|
||
type: String,
|
||
default: 'Press enter to deselect group',
|
||
},
|
||
/**
|
||
* Decide whether to show pointer labels
|
||
* @default true
|
||
* @type {Boolean}
|
||
*/
|
||
showLabels: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
/**
|
||
* Limit the display of selected options. The rest will be hidden within the limitText string.
|
||
* @default 99999
|
||
* @type {Integer}
|
||
*/
|
||
limit: {
|
||
type: Number,
|
||
default: 99999,
|
||
},
|
||
/**
|
||
* Sets maxHeight style value of the dropdown
|
||
* @default 300
|
||
* @type {Integer}
|
||
*/
|
||
maxHeight: {
|
||
type: Number,
|
||
default: 300,
|
||
},
|
||
/**
|
||
* Function that process the message shown when selected
|
||
* elements pass the defined limit.
|
||
* @default 'and * more'
|
||
* @param {Int} count Number of elements more than limit
|
||
* @type {Function}
|
||
*/
|
||
limitText: {
|
||
type: Function,
|
||
default: (count) => `and ${count} more`,
|
||
},
|
||
/**
|
||
* Set true to trigger the loading spinner.
|
||
* @default False
|
||
* @type {Boolean}
|
||
*/
|
||
loading: {
|
||
type: Boolean,
|
||
default: false,
|
||
},
|
||
/**
|
||
* Disables the multiselect if true.
|
||
* @default false
|
||
* @type {Boolean}
|
||
*/
|
||
disabled: {
|
||
type: Boolean,
|
||
default: false,
|
||
},
|
||
/**
|
||
* Fixed opening direction
|
||
* @default ''
|
||
* @type {String}
|
||
*/
|
||
openDirection: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
/**
|
||
* Shows slot with message about empty options
|
||
* @default true
|
||
* @type {Boolean}
|
||
*/
|
||
showNoOptions: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
showNoResults: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
tabindex: {
|
||
type: Number,
|
||
default: 0,
|
||
},
|
||
invalid: {
|
||
type: Boolean,
|
||
default: false,
|
||
},
|
||
},
|
||
computed: {
|
||
isSingleLabelVisible() {
|
||
return (
|
||
(this.singleValue || this.singleValue === 0) &&
|
||
(!this.isOpen || !this.searchable) &&
|
||
!this.visibleValues.length
|
||
)
|
||
},
|
||
isPlaceholderVisible() {
|
||
return !this.internalValue.length && (!this.searchable || !this.isOpen)
|
||
},
|
||
visibleValues() {
|
||
return this.multiple ? this.internalValue.slice(0, this.limit) : []
|
||
},
|
||
singleValue() {
|
||
return this.internalValue[0]
|
||
},
|
||
deselectLabelText() {
|
||
return this.showLabels ? this.deselectLabel : ''
|
||
},
|
||
deselectGroupLabelText() {
|
||
return this.showLabels ? this.deselectGroupLabel : ''
|
||
},
|
||
selectLabelText() {
|
||
return this.showLabels ? this.selectLabel : ''
|
||
},
|
||
selectGroupLabelText() {
|
||
return this.showLabels ? this.selectGroupLabel : ''
|
||
},
|
||
selectedLabelText() {
|
||
return this.showLabels ? this.selectedLabel : ''
|
||
},
|
||
inputStyle() {
|
||
if (
|
||
this.searchable ||
|
||
(this.multiple && this.value && this.value.length)
|
||
) {
|
||
// Hide input by setting the width to 0 allowing it to receive focus
|
||
|
||
return this.isOpen
|
||
? { width: '100%' }
|
||
: this.value
|
||
? { width: '0', position: 'absolute', padding: '0' }
|
||
: ''
|
||
}
|
||
},
|
||
contentStyle() {
|
||
return this.options.length
|
||
? { display: 'inline-block' }
|
||
: { display: 'block' }
|
||
},
|
||
isAbove() {
|
||
if (this.openDirection === 'above' || this.openDirection === 'top') {
|
||
return true
|
||
} else if (
|
||
this.openDirection === 'below' ||
|
||
this.openDirection === 'bottom'
|
||
) {
|
||
return false
|
||
} else {
|
||
return this.preferredOpenDirection === 'above'
|
||
}
|
||
},
|
||
showSearchInput() {
|
||
return (
|
||
this.searchable &&
|
||
(this.hasSingleSelectedSlot &&
|
||
(this.visibleSingleValue || this.visibleSingleValue === 0)
|
||
? this.isOpen
|
||
: true)
|
||
)
|
||
},
|
||
multiSelectStyle() {
|
||
let style = ['multiselect--active', baseSelectContainer]
|
||
if (this.isOpen) {
|
||
style.push(activeBaseSelectContainer)
|
||
}
|
||
if (this.disabled) {
|
||
style.push(disabledBaseSelectContainer)
|
||
}
|
||
if (this.isAbove) {
|
||
style.push('multiselect--above')
|
||
}
|
||
return style
|
||
},
|
||
multiselectSelectStyle() {
|
||
let style = [multiSelect]
|
||
|
||
if (this.disabled) {
|
||
style.push(disabledMultiSelect)
|
||
}
|
||
|
||
return style
|
||
},
|
||
multiSelectTagsStyle() {
|
||
let style = [multiSelectTags]
|
||
|
||
if (this.invalid) {
|
||
style.push(multiSelectTagsInvalid)
|
||
} else {
|
||
style.push(multiSelectTagsDefaultColor)
|
||
}
|
||
|
||
if (this.disabled) {
|
||
style.push(disabledMultiSelectTags)
|
||
}
|
||
|
||
return style
|
||
},
|
||
multiselectTagsWrapStyle() {
|
||
return [multiselectTagsWrap]
|
||
},
|
||
multiselectTagStyle() {
|
||
return [multiselectTag]
|
||
},
|
||
multiselectTagIconStyle() {
|
||
return [multiselectTagIcon]
|
||
},
|
||
multiselectStrongStyle() {
|
||
return [multiselectStrong]
|
||
},
|
||
multiselectSpinnerStyle() {
|
||
return [multiselectSpinner]
|
||
},
|
||
multiselectInputStyle() {
|
||
return [multiselectInput]
|
||
},
|
||
multiselectSingleStyle() {
|
||
return [multiselectSingle]
|
||
},
|
||
multiselectContentWrapperStyle() {
|
||
return [multiselectContentWrapper]
|
||
},
|
||
multiselectContentStyle() {
|
||
return [multiselectContent]
|
||
},
|
||
multiselectOptionStyle() {
|
||
return [multiselectOption]
|
||
},
|
||
multiselectElementStyle() {
|
||
return [multiselectElement]
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
<style lang="scss">
|
||
fieldset[disabled] .multiselect {
|
||
pointer-events: none;
|
||
}
|
||
|
||
.multiselect {
|
||
min-height: 40px;
|
||
}
|
||
|
||
.multiselect__spinner {
|
||
right: 1px;
|
||
top: 1px;
|
||
}
|
||
|
||
.multiselect__spinner:before,
|
||
.multiselect__spinner:after {
|
||
position: absolute;
|
||
content: '';
|
||
top: 50%;
|
||
left: 50%;
|
||
margin: -8px 0 0 -8px;
|
||
z-index: 5;
|
||
width: 16px;
|
||
height: 16px;
|
||
border-radius: 100%;
|
||
border-color: #41b883 transparent transparent;
|
||
border-style: solid;
|
||
border-width: 2px;
|
||
box-shadow: 0 0 0 1px transparent;
|
||
}
|
||
|
||
.multiselect__spinner:before {
|
||
animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62);
|
||
animation-iteration-count: infinite;
|
||
}
|
||
|
||
.multiselect__spinner:after {
|
||
animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8);
|
||
animation-iteration-count: infinite;
|
||
}
|
||
|
||
.multiselect__loading-enter-active,
|
||
.multiselect__loading-leave-active {
|
||
transition: opacity 0.4s ease-in-out;
|
||
opacity: 1;
|
||
}
|
||
|
||
.multiselect__loading-enter,
|
||
.multiselect__loading-leave-active {
|
||
opacity: 0;
|
||
}
|
||
|
||
.multiselect,
|
||
.multiselect__input,
|
||
.multiselect__single {
|
||
font-family: inherit;
|
||
// font-size: 14px;
|
||
touch-action: manipulation;
|
||
}
|
||
|
||
.multiselect {
|
||
box-sizing: content-box;
|
||
display: block;
|
||
position: relative;
|
||
width: 100%;
|
||
min-height: 40px;
|
||
text-align: left;
|
||
color: #35495e;
|
||
}
|
||
|
||
.multiselect * {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.multiselect:focus {
|
||
border: 1px solid #817ae3 !important;
|
||
}
|
||
|
||
.multiselect--disabled {
|
||
pointer-events: none;
|
||
opacity: 0.6;
|
||
}
|
||
|
||
.multiselect--active:not(.multiselect--above) .multiselect__current,
|
||
.multiselect--active:not(.multiselect--above) .multiselect__input,
|
||
.multiselect--active:not(.multiselect--above) .multiselect__tags {
|
||
border-bottom-left-radius: 0;
|
||
border-bottom-right-radius: 0;
|
||
}
|
||
|
||
.multiselect--active .multiselect__select {
|
||
transform: rotateZ(180deg);
|
||
}
|
||
.multiselect--above.multiselect--active .multiselect__current,
|
||
.multiselect--above.multiselect--active .multiselect__input,
|
||
.multiselect--above.multiselect--active .multiselect__tags {
|
||
border-top-left-radius: 0;
|
||
border-top-right-radius: 0;
|
||
}
|
||
|
||
.multiselect__input,
|
||
.multiselect__single {
|
||
min-height: 20px;
|
||
transition: border 0.1s ease;
|
||
}
|
||
|
||
.multiselect__input::placeholder {
|
||
color: #b9c1d1;
|
||
}
|
||
|
||
.multiselect__tag ~ .multiselect__input,
|
||
.multiselect__tag ~ .multiselect__single {
|
||
width: auto;
|
||
}
|
||
.multiselect__input:hover,
|
||
.multiselect__single:hover {
|
||
border-color: #cfcfcf;
|
||
}
|
||
.multiselect__input:focus,
|
||
.multiselect__single:focus {
|
||
border-color: #a8a8a8;
|
||
outline: none;
|
||
}
|
||
.multiselect__tag {
|
||
background: #41b883;
|
||
text-overflow: ellipsis;
|
||
}
|
||
.multiselect__tag-icon {
|
||
font-style: initial;
|
||
}
|
||
.multiselect__tag-icon:after {
|
||
content: '×';
|
||
color: #266d4d;
|
||
font-size: 14px;
|
||
}
|
||
.multiselect__tag-icon:focus,
|
||
.multiselect__tag-icon:hover {
|
||
background: #369a6e;
|
||
}
|
||
.multiselect__tag-icon:focus:after,
|
||
.multiselect__tag-icon:hover:after {
|
||
color: white;
|
||
}
|
||
.multiselect__current {
|
||
line-height: 16px;
|
||
min-height: 40px;
|
||
box-sizing: border-box;
|
||
display: block;
|
||
overflow: hidden;
|
||
padding: 8px 12px 0;
|
||
padding-right: 30px;
|
||
white-space: nowrap;
|
||
margin: 0;
|
||
text-decoration: none;
|
||
border-radius: 5px;
|
||
border: 1px solid #ebf1fa;
|
||
cursor: pointer;
|
||
}
|
||
.multiselect__select {
|
||
right: 1px;
|
||
top: 1px;
|
||
transition: transform 0.2s;
|
||
}
|
||
.multiselect__select:before {
|
||
position: relative;
|
||
right: 0;
|
||
top: 65%;
|
||
color: #a5acc1;
|
||
margin-top: 4px;
|
||
border-style: solid;
|
||
border-width: 5px 5px 0 5px;
|
||
border-color: #a5acc1 transparent transparent transparent;
|
||
content: '';
|
||
}
|
||
.multiselect__placeholder {
|
||
color: #b9c1d1;
|
||
display: inline-block;
|
||
margin-bottom: 10px;
|
||
padding-top: 2px;
|
||
}
|
||
.multiselect--active .multiselect__placeholder {
|
||
display: none;
|
||
}
|
||
.multiselect__content-wrapper {
|
||
max-height: 240px;
|
||
-webkit-overflow-scrolling: touch;
|
||
}
|
||
.multiselect--above .multiselect__content-wrapper {
|
||
bottom: 100%;
|
||
border-bottom-left-radius: 0;
|
||
border-bottom-right-radius: 0;
|
||
border-top-left-radius: 5px;
|
||
border-top-right-radius: 5px;
|
||
border-bottom: none;
|
||
border-top: 1px solid #e8e8e8;
|
||
}
|
||
.multiselect__content::webkit-scrollbar {
|
||
display: none;
|
||
}
|
||
.multiselect__option {
|
||
min-height: 40px;
|
||
}
|
||
.multiselect__option:after {
|
||
top: 0;
|
||
right: 0;
|
||
position: absolute;
|
||
line-height: 40px;
|
||
padding-right: 12px;
|
||
padding-left: 20px;
|
||
font-size: 13px;
|
||
}
|
||
.multiselect__option--highlight {
|
||
background: #41b883;
|
||
outline: none;
|
||
color: white;
|
||
}
|
||
.multiselect__option--highlight:after {
|
||
content: attr(data-select);
|
||
background: #41b883;
|
||
color: white;
|
||
}
|
||
.multiselect__option--selected {
|
||
background: #f3f3f3;
|
||
color: #35495e;
|
||
font-weight: bold;
|
||
}
|
||
.multiselect__option--selected:after {
|
||
content: attr(data-selected);
|
||
color: silver;
|
||
}
|
||
.multiselect__option--selected.multiselect__option--highlight {
|
||
background: #ff6a6a;
|
||
color: #fff;
|
||
}
|
||
.multiselect__option--selected.multiselect__option--highlight:after {
|
||
background: #ff6a6a;
|
||
content: attr(data-deselect);
|
||
color: #fff;
|
||
}
|
||
|
||
.multiselect--disabled .multiselect__current,
|
||
.multiselect--disabled .multiselect__select {
|
||
background: #ebf1fa;
|
||
color: #b9c1d1;
|
||
}
|
||
|
||
.multiselect--disabled .multiselect__input,
|
||
.multiselect--disabled .multiselect__single {
|
||
background: #ebf1fa;
|
||
color: #b9c1d1;
|
||
}
|
||
|
||
.multiselect__option--disabled {
|
||
background: transparent !important;
|
||
color: #dddddd !important;
|
||
cursor: text;
|
||
pointer-events: none;
|
||
}
|
||
|
||
.multiselect__option--group {
|
||
background: #ededed;
|
||
color: #35495e;
|
||
}
|
||
|
||
.multiselect__option--group.multiselect__option--highlight {
|
||
background: #35495e;
|
||
color: #fff;
|
||
}
|
||
|
||
.multiselect__option--group.multiselect__option--highlight:after {
|
||
background: #35495e;
|
||
}
|
||
|
||
.multiselect__option--disabled.multiselect__option--highlight {
|
||
background: #dedede;
|
||
}
|
||
|
||
.multiselect__option--group-selected.multiselect__option--highlight {
|
||
background: #ff6a6a;
|
||
color: #fff;
|
||
}
|
||
|
||
.multiselect__option--group-selected.multiselect__option--highlight:after {
|
||
background: #ff6a6a;
|
||
content: attr(data-deselect);
|
||
color: #fff;
|
||
}
|
||
|
||
.multiselect-enter-active,
|
||
.multiselect-leave-active {
|
||
transition: all 0.15s ease;
|
||
}
|
||
|
||
.multiselect-enter,
|
||
.multiselect-leave-active {
|
||
opacity: 0;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect {
|
||
text-align: right;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect__select {
|
||
right: auto;
|
||
left: 1px;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect__tags {
|
||
padding: 8px 8px 0px 40px;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect__content {
|
||
text-align: right;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect__option:after {
|
||
right: auto;
|
||
left: 0;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect__clear {
|
||
right: auto;
|
||
left: 12px;
|
||
}
|
||
|
||
*[dir='rtl'] .multiselect__spinner {
|
||
right: auto;
|
||
left: 1px;
|
||
}
|
||
|
||
@keyframes spinning {
|
||
from {
|
||
transform: rotate(0);
|
||
}
|
||
to {
|
||
transform: rotate(2turn);
|
||
}
|
||
}
|
||
|
||
.multiselect {
|
||
.multiselect__option--highlight {
|
||
background: #5851d8;
|
||
color: #040405;
|
||
font-weight: normal !important;
|
||
|
||
&.multiselect__option--selected {
|
||
background: #ebf1fa;
|
||
color: #040405;
|
||
font-size: 1rem;
|
||
font-weight: normal !important;
|
||
|
||
&::after {
|
||
background: #040405;
|
||
color: #fff;
|
||
}
|
||
}
|
||
|
||
&::after {
|
||
background: #040405;
|
||
color: #fff;
|
||
}
|
||
}
|
||
|
||
.multiselect__option--selected {
|
||
font-weight: normal !important;
|
||
background: #ebf1fa;
|
||
}
|
||
|
||
.multiselect__tags-wrap .multiselect__tag {
|
||
background: #5851d8;
|
||
color: #040405;
|
||
|
||
.multiselect__tag-icon {
|
||
&:hover {
|
||
background: #5851d8;
|
||
}
|
||
|
||
&::after {
|
||
color: #040405;
|
||
}
|
||
}
|
||
}
|
||
|
||
&.error {
|
||
border: 1px solid #fb7178;
|
||
border-radius: 5px;
|
||
}
|
||
}
|
||
</style>
|