mirror of
https://github.com/hanzoai/vitest.git
synced 2026-09-24 17:04:25 +00:00
75 lines
2.6 KiB
Vue
75 lines
2.6 KiB
Vue
<script setup lang="ts">
|
|
import type { VisualRegressionArtifact } from 'vitest'
|
|
import { computed, ref, useId } from 'vue'
|
|
import { internalOrExternalUrl } from '~/composables/attachments'
|
|
import VisualRegressionImageContainer from './VisualRegressionImageContainer.vue'
|
|
|
|
type AttachmentWithMeta = Exclude<VisualRegressionArtifact['attachments'][number], { name: 'diff' }>
|
|
|
|
const { actual, reference } = defineProps<{
|
|
reference: AttachmentWithMeta
|
|
actual: AttachmentWithMeta
|
|
}>()
|
|
|
|
const referenceUrl = computed(() => internalOrExternalUrl(reference))
|
|
const actualUrl = computed(() => internalOrExternalUrl(actual))
|
|
|
|
const maxWidth = computed(() =>
|
|
Math.max(reference.width, actual.width),
|
|
)
|
|
const maxHeight = computed(() =>
|
|
Math.max(reference.height, actual.height),
|
|
)
|
|
|
|
const splitPercentage = ref(50)
|
|
|
|
const inputId = useId()
|
|
</script>
|
|
|
|
<template>
|
|
<VisualRegressionImageContainer>
|
|
<div
|
|
aria-label="Image comparison slider showing reference and actual screenshots"
|
|
class="relative max-w-full h-full overflow-hidden"
|
|
:style="{
|
|
'--split': `${splitPercentage}%`,
|
|
'aspectRatio': `${maxWidth} / ${maxHeight}`,
|
|
'width': `${maxWidth}px`,
|
|
}"
|
|
>
|
|
<div
|
|
class="absolute w-full h-full place-content-center place-items-center [clip-path:polygon(0%_0%,var(--split)_0%,var(--split)_100%,0%_100%)]"
|
|
aria-hidden="true"
|
|
role="presentation"
|
|
>
|
|
<img :src="referenceUrl">
|
|
</div>
|
|
<div
|
|
class="absolute w-full h-full place-content-center place-items-center [clip-path:polygon(var(--split)_0%,100%_0%,100%_100%,var(--split)_100%)]"
|
|
aria-hidden="true"
|
|
role="presentation"
|
|
>
|
|
<img :src="actualUrl">
|
|
</div>
|
|
<div
|
|
class="absolute left-[--split] h-full w-[2px] -translate-x-1/2 bg-white shadow-[0_0_3px_rgb(0_0_0/.2),0_0_10px_rgb(0_0_0/.5)] before:content-[''] before:absolute before:top-1/2 before:size-[16px] before:bg-white before:border-[2px] before:border-black before:rounded-full before:-translate-y-1/2 before:translate-x-[calc(-50%+1px)]"
|
|
aria-hidden="true"
|
|
role="presentation"
|
|
/>
|
|
<input
|
|
:id="inputId"
|
|
v-model="splitPercentage"
|
|
type="range"
|
|
min="0"
|
|
max="100"
|
|
step="0.1"
|
|
aria-label="Adjust slider to compare reference and actual images"
|
|
class="absolute inset-0 opacity-0 cursor-col-resize"
|
|
>
|
|
<output :for="inputId" class="sr-only">
|
|
Showing {{ splitPercentage }}% reference, {{ 100 - splitPercentage }}% actual
|
|
</output>
|
|
</div>
|
|
</VisualRegressionImageContainer>
|
|
</template>
|