A luma matte
A layer shows through where a matte is bright and is hidden where it is dark, and the matte moves, so a photo is revealed by a sweep with a soft edge.
mask-image on the layer takes the matte, a gradient here, or an image such as a photograph of smoke, with mask-mode: luminance so its brightness is the matte rather than its alpha.
The gradient is twice the layer's width with a soft step in its middle, and a maskPosition track slides it across: at 100% the dark half covers the layer and at 0% the bright half does.
Nothing here is an SVG <mask> referenced by id, which the page draws and a render does not.
<div class="layer" data-component="reveal" data-start="0" data-duration="4">
<img class="photo" src="harbour.jpg" alt="" data-bind-style="matte">
</div>
.photo { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
mask-image: linear-gradient(to right, #fff 45%, #000 55%); mask-mode: luminance;
mask-size: 200% 100%; mask-repeat: no-repeat; }
scene('reveal', {
keyframes: {
matte: { maskPosition: { at: [0.3, 1.8], to: [100, 0], unit: '%', ease: 'power2.inOut' } },
},
});
No demo uses this pattern yet.