mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-20 14:54:12 +00:00
## Summary Adds the [tailwind lint plugin](https://github.com/francoismassart/eslint-plugin-tailwindcss/?tab=readme-ov-file#eslint-plugin-tailwindcss) and fixes the currently fixable rules ([v4 is still in beta](https://github.com/francoismassart/eslint-plugin-tailwindcss/?tab=readme-ov-file#about-tailwind-css-4-support)). ## Changes - **What**: Enforces things like consistent class order, and eventually can prohibit extra classes that could be utilities instead - **Dependencies**: The plugin and its types ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5984-Lint-Add-tailwind-linter-2866d73d365081d89db0d998232533bb) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action <action@github.com>
74 lines
1.9 KiB
Vue
74 lines
1.9 KiB
Vue
<template>
|
|
<BaseThumbnail :is-hovered="isHovered">
|
|
<LazyImage
|
|
:src="baseImageSrc"
|
|
:alt="alt"
|
|
:image-class="
|
|
isVideoType
|
|
? 'w-full h-full object-cover'
|
|
: 'max-w-full max-h-64 object-contain'
|
|
"
|
|
/>
|
|
<div ref="containerRef" class="absolute inset-0">
|
|
<LazyImage
|
|
:src="overlayImageSrc"
|
|
:alt="alt"
|
|
:image-class="
|
|
isVideoType
|
|
? 'w-full h-full object-cover'
|
|
: 'max-w-full max-h-64 object-contain'
|
|
"
|
|
:image-style="{
|
|
clipPath: `inset(0 ${100 - sliderPosition}% 0 0)`
|
|
}"
|
|
/>
|
|
<div
|
|
class="pointer-events-none absolute inset-y-0 z-10 w-0.5 bg-white/30 backdrop-blur-sm"
|
|
:style="{
|
|
left: `${sliderPosition}%`
|
|
}"
|
|
/>
|
|
</div>
|
|
</BaseThumbnail>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useMouseInElement } from '@vueuse/core'
|
|
import { ref, watch } from 'vue'
|
|
|
|
import LazyImage from '@/components/common/LazyImage.vue'
|
|
import BaseThumbnail from '@/components/templates/thumbnails/BaseThumbnail.vue'
|
|
|
|
const SLIDER_START_POSITION = 50
|
|
|
|
const { baseImageSrc, overlayImageSrc, isHovered, isVideo } = defineProps<{
|
|
baseImageSrc: string
|
|
overlayImageSrc: string
|
|
alt: string
|
|
isHovered?: boolean
|
|
isVideo?: boolean
|
|
}>()
|
|
|
|
const isVideoType =
|
|
isVideo ||
|
|
baseImageSrc?.toLowerCase().endsWith('.webp') ||
|
|
overlayImageSrc?.toLowerCase().endsWith('.webp') ||
|
|
false
|
|
|
|
const sliderPosition = ref(SLIDER_START_POSITION)
|
|
const containerRef = ref<HTMLElement | null>(null)
|
|
|
|
const { elementX, elementWidth, isOutside } = useMouseInElement(containerRef)
|
|
|
|
// Update slider position based on mouse position when hovered
|
|
watch(
|
|
[() => isHovered, elementX, elementWidth, isOutside],
|
|
([isHovered, x, width, outside]) => {
|
|
if (!isHovered) return
|
|
if (!outside) {
|
|
sliderPosition.value = (x / width) * 100
|
|
}
|
|
}
|
|
)
|
|
</script>
|