<template> <ul class="actors nolist" :class="{ disabled: !editing.has(item.key) }" > <li v-for="actor in [...item.value, ...newActors]" :key="`actor-${actor.id}`" class="actor" :class="{ deleted: edits.actors && !edits.actors.some((actorId) => actorId === actor.id) }" > <span class="actor-name">{{ actor.name }}</span> <Icon v-if="edits.actors && !edits.actors.some((actorId) => actorId === actor.id)" icon="checkmark" class="add" @click="emit('actors', edits.actors.concat(actor.id))" /> <Icon v-else icon="cross2" class="remove" @click="emit('actors', edits.actors.filter((actorId) => actorId !== actor.id))" /> </li> <li class="new"> <ActorSearch :disabled="!editing.has(item.key)" @actor="addActor" > <Icon icon="plus3" class="add" /> </ActorSearch> </li> </ul> </template> <script setup> import { ref, watch } from 'vue'; import ActorSearch from '#/components/actors/search.vue'; const newActors = ref([]); const props = defineProps({ item: { type: Object, default: null, }, scene: { type: Object, default: null, }, edits: { type: Object, default: () => {}, }, editing: { type: Set, default: null, }, }); const emit = defineEmits(['actors']); function addActor(actor) { newActors.value = newActors.value.concat(actor); emit('actors', props.edits.actors.concat(actor.id)); } watch(() => props.scene, () => { newActors.value = []; }); </script> <style scoped> .actors { display: flex; flex-wrap: wrap; gap: .35rem .25rem; &.disabled { .actor { background: var(--glass-weak-50); color: var(--glass-strong-10); .remove, .add { fill: var(--shadow-weak-30); background: var(--shadow-weak-50); } } .new .icon { background: var(--shadow-weak-40); } } .new { display: flex; align-items: center; margin-left: .25rem; &:hover { box-shadow: 0 0 3px var(--shadow-weak-20); } .icon { height: 100%; padding: 0 .5rem; background: var(--success); fill: var(--text-light); } } } .actor { display: flex; align-items: stretch; border-radius: .25rem; background: var(--background); box-shadow: 0 0 3px var(--shadow-weak-30); &.deleted { color: var(--glass); text-decoration: line-through; } } .actor, .new { .remove, .add { height: auto; padding: .25rem .3rem; border-radius: .25rem; fill: var(--highlight-strong-10); &:hover { fill: var(--text-light); cursor: pointer; } } .remove { fill: var(--error); &:hover { background: var(--error); } } .add { fill: var(--success); &:hover { background: var(--success); } } } .actor-name { padding: .25rem .5rem; } </style>