feat(ui): click left pill scrolls to and highlights right preview
This commit is contained in:
parent
b8b92f094e
commit
63f40f8364
|
|
@ -141,10 +141,30 @@ const currentArrangement = computed(() => {
|
||||||
|
|
||||||
const arrangementGroups = ref([])
|
const arrangementGroups = ref([])
|
||||||
const hoveredIndex = ref(null)
|
const hoveredIndex = ref(null)
|
||||||
|
const clickedIndex = ref(null)
|
||||||
|
let clickedTimeout = null
|
||||||
|
const rightItems = ref([])
|
||||||
|
|
||||||
|
function setRightItemRef(el, index) {
|
||||||
|
if (el) rightItems.value[index] = el
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollToRight(index) {
|
||||||
|
const el = rightItems.value[index]
|
||||||
|
if (!el) return
|
||||||
|
el.scrollIntoView({ behavior: 'smooth', block: 'nearest' })
|
||||||
|
clickedIndex.value = index
|
||||||
|
if (clickedTimeout) clearTimeout(clickedTimeout)
|
||||||
|
clickedTimeout = setTimeout(() => {
|
||||||
|
clickedIndex.value = null
|
||||||
|
}, 1500)
|
||||||
|
}
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
currentArrangementId,
|
currentArrangementId,
|
||||||
(id) => {
|
(id) => {
|
||||||
|
rightItems.value = []
|
||||||
|
clickedIndex.value = null
|
||||||
if (id === MASTER_ID) {
|
if (id === MASTER_ID) {
|
||||||
arrangementGroups.value = props.availableGroups.map((g, i) => ({ ...g, slides: g.slides ?? [], _uid: `${g.id}-master-${i}-${Date.now()}` }))
|
arrangementGroups.value = props.availableGroups.map((g, i) => ({ ...g, slides: g.slides ?? [], _uid: `${g.id}-master-${i}-${Date.now()}` }))
|
||||||
return
|
return
|
||||||
|
|
@ -555,15 +575,16 @@ function closeOnBackdrop(e) {
|
||||||
v-for="(element, index) in arrangementGroups"
|
v-for="(element, index) in arrangementGroups"
|
||||||
:key="element._uid"
|
:key="element._uid"
|
||||||
data-testid="arrangement-pill"
|
data-testid="arrangement-pill"
|
||||||
class="flex items-center gap-2 rounded-lg border-2 px-3 py-2"
|
class="flex items-center gap-2 rounded-lg border-2 px-3 py-2 transition-shadow"
|
||||||
:class="[
|
:class="[
|
||||||
{ 'ring-2 ring-indigo-400 ring-offset-1': hoveredIndex === index },
|
{ 'ring-2 ring-indigo-400 ring-offset-1': hoveredIndex === index || clickedIndex === index },
|
||||||
isMasterSelected ? 'cursor-default' : 'cursor-grab',
|
isMasterSelected ? 'cursor-default' : 'cursor-grab',
|
||||||
]"
|
]"
|
||||||
:style="{
|
:style="{
|
||||||
borderColor: element.color ?? '#6b7280',
|
borderColor: element.color ?? '#6b7280',
|
||||||
backgroundColor: (element.color ?? '#6b7280') + '20',
|
backgroundColor: (element.color ?? '#6b7280') + '20',
|
||||||
}"
|
}"
|
||||||
|
@click="scrollToRight(index)"
|
||||||
>
|
>
|
||||||
<!-- Group name -->
|
<!-- Group name -->
|
||||||
<span class="flex-1 text-sm font-medium">
|
<span class="flex-1 text-sm font-medium">
|
||||||
|
|
@ -652,8 +673,9 @@ function closeOnBackdrop(e) {
|
||||||
<div
|
<div
|
||||||
v-for="(element, index) in arrangementGroups"
|
v-for="(element, index) in arrangementGroups"
|
||||||
:key="element._uid"
|
:key="element._uid"
|
||||||
|
:ref="(el) => setRightItemRef(el, index)"
|
||||||
class="rounded-r-lg border-l-4 bg-white p-3 shadow-sm transition-shadow"
|
class="rounded-r-lg border-l-4 bg-white p-3 shadow-sm transition-shadow"
|
||||||
:class="{ 'ring-2 ring-indigo-400 ring-offset-1': hoveredIndex === index }"
|
:class="{ 'ring-2 ring-indigo-400 ring-offset-1': hoveredIndex === index || clickedIndex === index }"
|
||||||
:style="{ borderColor: element.color ?? '#6b7280' }"
|
:style="{ borderColor: element.color ?? '#6b7280' }"
|
||||||
@mouseenter="hoveredIndex = index"
|
@mouseenter="hoveredIndex = index"
|
||||||
@mouseleave="hoveredIndex = null"
|
@mouseleave="hoveredIndex = null"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue