Skip to content

Commit

Permalink
add support image/video lightbox via data-preview-image/video, move o…
Browse files Browse the repository at this point in the history
…verlay into standalone controller
  • Loading branch information
hakimel committed Jan 31, 2025
1 parent 0524ae8 commit 1b2c39a
Show file tree
Hide file tree
Showing 9 changed files with 538 additions and 226 deletions.
101 changes: 71 additions & 30 deletions css/reveal.scss
Original file line number Diff line number Diff line change
Expand Up @@ -1432,6 +1432,11 @@ $controlsArrowAngleActive: 36deg;
$overlayHeaderHeight: 40px;
$overlayHeaderPadding: 5px;

.reveal [data-preview-image],
.reveal [data-preview-video] {
cursor: zoom-in;
}

.reveal > .overlay {
position: absolute;
top: 0;
Expand All @@ -1455,9 +1460,8 @@ $overlayHeaderPadding: 5px;
z-index: 10;
background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);

visibility: visible;
opacity: 0.6;
transition: all 0.3s ease;
visibility: hidden;
opacity: 0;
}

.reveal .overlay-header {
Expand All @@ -1471,20 +1475,27 @@ $overlayHeaderPadding: 5px;
box-sizing: border-box;
align-items: center;
justify-content: flex-end;
gap: 6px;
}
.reveal .overlay-header a {
.reveal .overlay-header .overlay-button {
all: unset;
display: flex;
align-items: center;
justify-content: center;
width: $overlayHeaderHeight;
height: $overlayHeaderHeight;
min-width: $overlayHeaderHeight;
min-height: $overlayHeaderHeight;
padding: 0 10px;
opacity: 0.6;
opacity: 1;
border-radius: 6px;
font-size: 18px;
gap: 8px;
cursor: pointer;

box-sizing: border-box;
}
.reveal .overlay-header a:hover {
.reveal .overlay-header .overlay-button:hover {
opacity: 1;
background-color: rgba( 255, 255, 255, 0.15 );
}
.reveal .overlay-header .icon {
display: inline-block;
Expand All @@ -1504,14 +1515,16 @@ $overlayHeaderPadding: 5px;

.reveal .overlay-viewport {
position: absolute;
display: flex;
display: grid;
place-items: center;
top: $overlayHeaderHeight + $overlayHeaderPadding*2;
right: 10px;
bottom: 10px;
left: 10px;
border-radius: 10px;
right: 6px;
bottom: 6px;
left: 6px;
border-radius: 6px;
overflow: hidden;
background-color: rgba(20, 20, 20, 0.8);
color: #fff;
}

// Preview overlay
Expand All @@ -1527,12 +1540,38 @@ $overlayHeaderPadding: 5px;
transition: all 0.3s ease;
}

.reveal .overlay-preview.loaded iframe {
.reveal .overlay-preview[data-state="loaded"] iframe {
opacity: 1;
visibility: visible;
}

.reveal .overlay-preview.loaded .overlay-viewport-inner {
.reveal .overlay-preview img,
.reveal .overlay-preview video {
position: absolute;
max-width: 100%;
max-height: 100%;
width: 100%;
height: 100%;
margin: 0;
object-fit: none;
}

.reveal .overlay-preview[data-object-fit="none"] img,
.reveal .overlay-preview[data-object-fit="none"] video {
object-fit: none;
}

.reveal .overlay-preview[data-object-fit="contain"] img,
.reveal .overlay-preview[data-object-fit="contain"] video {
object-fit: contain;
}

.reveal .overlay-preview[data-object-fit="cover"] img,
.reveal .overlay-preview[data-object-fit="cover"] video {
object-fit: cover;
}

.reveal .overlay-preview[data-state="loaded"] .overlay-viewport-inner {
position: absolute;
z-index: -1;
left: 0;
Expand All @@ -1541,55 +1580,57 @@ $overlayHeaderPadding: 5px;
text-align: center;
letter-spacing: normal;
}
.reveal .overlay-preview .overlay-error {
font-size: 18px;
color: orange;
}

.reveal .overlay-preview .x-frame-error {
opacity: 0;
transition: opacity 0.3s ease 0.3s;
}
.reveal .overlay-preview.loaded .x-frame-error {
.reveal .overlay-preview[data-state="loaded"] .x-frame-error {
opacity: 1;
}

.reveal .overlay-preview.loaded .overlay-spinner {
opacity: 0;
visibility: hidden;
transform: scale(0.2);
.reveal .overlay-preview[data-state="loading"] .overlay-spinner {
opacity: 0.6;
visibility: visible;
}

// Help overlay
.reveal .overlay-help .overlay-viewport {
overflow: auto;
color: #fff;
display: grid;
place-items: center;
}

.reveal .overlay-help .overlay-viewport-inner {
width: 600px;
.reveal .overlay-help-content {
width: 100%;
max-width: 600px;
margin: auto;
text-align: center;
letter-spacing: normal;
}

.reveal .overlay-help .overlay-viewport-inner .title {
.reveal .overlay-help-content .title {
font-size: 20px;
margin-top: 0;
}

.reveal .overlay-help .overlay-viewport-inner table {
.reveal .overlay-help-content table {
border: 1px solid #fff;
border-collapse: collapse;
font-size: 16px;
}

.reveal .overlay-help .overlay-viewport-inner table th,
.reveal .overlay-help .overlay-viewport-inner table td {
.reveal .overlay-help-content table th,
.reveal .overlay-help-content table td {
width: 200px;
padding: 14px;
border: 1px solid #fff;
vertical-align: middle;
}

.reveal .overlay-help .overlay-viewport-inner table th {
.reveal .overlay-help-content table th {
padding-top: 20px;
padding-bottom: 20px;
}
Expand Down
2 changes: 1 addition & 1 deletion dist/reveal.css

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/reveal.esm.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/reveal.esm.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/reveal.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/reveal.js.map

Large diffs are not rendered by default.

102 changes: 102 additions & 0 deletions examples/preview-overlays.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<!doctype html>
<html lang="en">

<head>
<meta charset="utf-8">

<title>reveal.js - Slide Transitions</title>

<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/black.css" id="theme">

<style>
.reveal {
font-size: 24px;
}
.reveal figure {
margin: 0 0 1rem 0;
text-align: left;
}
.reveal figure img,
.reveal figure video {
margin: 0.25rem 0 0 0;
}
figcaption, a {
font-size: 16px;
}
</style>
</head>

<body>

<div class="reveal">

<div class="slides">

<section>

<h2>Preview Overlays</h2>

<div class="r-hstack items-start">
<div class="r-vstack items-start">
<h5>Images</h5>
<figure>
<figcaption>Preview with default settings:</figcaption>
<img height="50" src="https://static.slid.es/images/alphabet/v1/a.png" data-preview-image>
</figure>
<figure>
<figcaption>Preview with data-object-fit="contain"</figcaption>
<img height="50" src="https://static.slid.es/images/alphabet/v1/a.png" data-preview-image data-object-fit="contain">
</figure>
<figure>
<figcaption>Preview another image (c)</figcaption>
<img height="50" src="https://static.slid.es/images/alphabet/v1/b.png" data-preview-image="https://static.slid.es/images/alphabet/v1/c.png">
</figure>
<a href="#" data-preview-image="https://static.slid.es/images/alphabet/v1/x.png">
Preview image from a link.
</a>
</div>

<div style="width: 1px; height: 30vh; margin: 0 3rem;background-color: #999;"></div>

<div class="r-vstack items-start">
<h5>Videos</h5>
<figure>
<figcaption>Preview video</figcaption>
<img height="50" src="https://static.slid.es/images/alphabet/v1/x.png" data-preview-video="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4">
</figure>
<figure>
<figcaption>Preview video</figcaption>
<video height="50" src="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4" data-preview-video></video>
</figure>
<a href="#" data-preview-video="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4">
Preview video from a link.
</a>
</div>

<div style="width: 1px; height: 30vh; margin: 0 3rem;background-color: #999;"></div>

<div class="r-vstack items-start">
<h5>Iframes</h5>
<a data-preview-link href="https://hakim.se">https://hakim.se | data-preview-link</a>
<a data-preview-link="false" href="https://hakim.se">https://hakim.se | data-preview-link=false</a>
</div>
</div>

</section>

</div>

</div>

<script src="../dist/reveal.js"></script>
<script>
Reveal.initialize({
previewLinks: true,
width: 1280,
height: 720
});
</script>

</body>
</html>
Loading

0 comments on commit 1b2c39a

Please sign in to comment.