Compare commits

...

2 Commits

Author SHA1 Message Date
Leopere 70cf8bf47b Add dedicated video pages with HLS streaming support
ci/woodpecker/push/woodpecker Pipeline failed Details
2025-03-10 12:15:33 -04:00
Leopere 1fd7b9f9cf Add Chrome-specific video fallback with play button and lightbox 2025-03-09 17:09:33 -04:00
902 changed files with 730 additions and 1877 deletions

View File

@ -3,7 +3,7 @@
import * as utils from '/js/utils.modern.min.js';
window.utilsModule = utils;
</script><script type=module src=/js/app.modern.min.js defer></script><script type=module src=/js/skip-to-content.modern.min.js defer></script><script type=module src=/js/material.modern.min.js defer></script><script nomodule src=/js/app.min.js defer></script><script nomodule src=/js/skip-to-content.min.js defer></script><script nomodule src=/js/material.min.js defer></script><link rel=stylesheet type=text/css href=/css/app.min.css><link rel=stylesheet type=text/css href=/css/custom.css media=print onload='this.media="all"'><noscript><link rel=stylesheet href=/css/custom.css></noscript><link rel=icon href=/static/favicon.svg type=image/svg+xml><link rel=icon href=/static/favicon.ico type=image/x-icon><script src=/static/js/vendor/hls.min.js defer></script><script src=/static/js/hls-player.min.js defer></script></head><body class=page><body class=page><div class="mdl-layout mdl-js-layout
</script><script type=module src=/js/app.modern.min.js defer></script><script type=module src=/js/skip-to-content.modern.min.js defer></script><script type=module src=/js/material.modern.min.js defer></script><script nomodule src=/js/app.min.js defer></script><script nomodule src=/js/skip-to-content.min.js defer></script><script nomodule src=/js/material.min.js defer></script><link rel=stylesheet type=text/css href=/css/app.min.css><link rel=stylesheet type=text/css href=/css/custom.css media=print onload='this.media="all"'><noscript><link rel=stylesheet href=/css/custom.css></noscript><link rel=icon href=/static/favicon.svg type=image/svg+xml><link rel=icon href=/static/favicon.ico type=image/x-icon><link rel=stylesheet href=/static/css/video-js.min.css><link rel=stylesheet href=/static/css/custom-video.css><link rel=stylesheet href=/static/css/chrome-video-fallback.css><script src=/static/js/vendor/video.min.js></script><script src=/static/js/vendor/videojs-http-streaming.min.js></script><script src=/static/js/videojs-player.min.js></script><script src=/static/js/chrome-video-fallback.min.js></script></head><body class=page><body class=page><div class="mdl-layout mdl-js-layout
mdl-layout--fixed-header"><header class="mdl-layout__header site-header"><div class=mdl-layout__header-row><a href=/ class=mdl-layout-title><img class=logo src=/images/logo2.webp height=50 width=auto alt="ShowerLoop Logo"></a><div class=mdl-layout-spacer></div><nav class="mdl-navigation mdl-layout--large-screen-only"><a class=mdl-navigation__link href=/ title=Home>Home</a>
<a class=mdl-navigation__link href=/how-it-works/ title="How It Works">How It Works</a>
<a class=mdl-navigation__link href=/research/ title=Research>Research</a>
@ -12,10 +12,31 @@ mdl-layout--fixed-header"><header class="mdl-layout__header site-header"><div cl
<a class=mdl-navigation__link href=/how-it-works/ title="How It Works" tabindex=0>How It Works</a>
<a class=mdl-navigation__link href=/research/ title=Research tabindex=0>Research</a>
<a class=mdl-navigation__link href=/posts/ title=Posts tabindex=0>Posts</a>
<a class=mdl-navigation__link href=/components/ title=Components tabindex=0>Components</a></nav></div><div class=chocolate-hero-section style=background-image:url(/images/material-bg.webp)><div class=hero-row-group><div class=hero-row><div class="hero-row-item hero-text-info"><h1 class=mdl-typography--display-3>Shower Loop</h1><h2>Open Source - Open Hardware - Ecological - Economical.</h2><p>Real-time filtration, purification, recycling & heat recovery system for showers. Made in Finland, for Earth.</p></div><div class="hero-row-item hero-video"><div class=video-container><video id=video-hero-1741460284 controls preload=none width=100% height=auto poster=/static/videos/posters/video1.webp>
<source src=/static/videos/hls/video1/index.m3u8 type=application/x-mpegurl><source src=/static/videos/video1.mp4 type=video/mp4><p>To view this video please enable JavaScript, and consider upgrading to a
web browser that supports HTML5 video</p></video></div></div></div></div></div><div class=cta><div class=cta-row-group><div class=cta-row><div class=cta-row-item><p class="mdl-typography--headline mdl-typography--font-thin">Looking to make a change? Want to support the project?</p><a href=/components class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Check Out our Components</a></div></div></div></div><main><div class=homepage-content><div class=home-introduction><div class=chocolate-container><div class=mdl-grid><div class="mdl-cell mdl-cell--12-col"><h2 class=mdl-typography--display-2>Shower Loop vs Normal Shower</h2><p class=intro-description>90% reduction in water usage and 70-90% in energy reduction for a 10 minute shower with a flow rate of 10 l/min. Savings are dependant on user behaviour and can vary. Use Just one bucket of water for a shower of any length. See the savings section for more information.</p><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Save Water</h3><p>Capture, Filter, Reuse</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Saving Energy</h3><p>By reusing warm water.</p></div></div></div><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Save The Planet</h3><p>Save Money</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Open Hardware</h3><p>Copy, improve, adapt, share</p></div></div></div><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Assemble It Yourself</h3><p>With manufactured and off-shell components</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Enjoy Better Showers</h3><p>The single pump provides stable water pressure and the thermostat and heater keep water nice and warm</p></div></div></div><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Off - Grid Ready</h3><p>The entire system can run on a 12V DC</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>No Plumber Needed</h3><p>Shower Loop is like a standalone appliance without connecting to water mains</p></div></div></div></div></div></div></div><div class=home-works><div class=mdl-grid><div class="mdl-cell mdl-cell--12-col"><h2 class="mdl-typography--display-2 section-title">How It Works</h2><p class=intro-description>Showers are great, but pouring hot and almost drinkable water down the drain is not. Besides the obvious costs to the environment and your bills, there is also a conscious on unconscious psychological cost any time you create waste. To solve this problem we created Showerloop. It's a shower that collects, cleans and reuses the water in real time while you are showering. So now you can shower for as long as you like but with a reduced ecological impact.</p><div class="mdl-grid videos" style=justify-content:center><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div class=video-container><video id=video2 controls preload=auto width=100% height=auto poster=/static/videos/posters/video2.webp>
<source src=/static/videos/hls/video2/index.m3u8 type=application/x-mpegurl><source src=/static/videos/video2.mp4 type=video/mp4><p>To view this video please enable JavaScript, and consider upgrading to a
web browser that supports HTML5 video</p></video></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div class=video-container><video id=video3 controls preload=auto width=100% height=auto poster=/static/videos/posters/video3.webp>
<source src=/static/videos/hls/video3/index.m3u8 type=application/x-mpegurl><source src=/static/videos/video3.mp4 type=video/mp4><p>To view this video please enable JavaScript, and consider upgrading to a
web browser that supports HTML5 video</p></video></div></div></div></div></div></div></div><div class=recent-posts><div class=chocolate-container><div class=mdl-grid><div class="mdl-cell mdl-cell--12-col"><h2 class="mdl-typography--display-2 section-title">Recent News</h2><p class=blog-description></p><div class=mdl-grid><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone blog-post mdl-card mdl-shadow--2dp"><div class=mdl-card__title><h3 class=mdl-card__title-text>2 Ways to Be Economical When Showering With an Injury</h3></div><div class=mdl-card__supporting-text><p><p>It's extremely challenging to lead your daily life while sustaining an injury. And yet, dealing with sports injuries is something that most of us will have to go through, with nearly 2 million sports-related injuries affecting high school athletes alone per year. Most of us know the feeling of attempting to take a shower or bath when your arm is wrapped in a cast and cannot get wet. It's a defeated feeling, and it can quickly take away the motivation to shower or bathe in the first place. After all, wouldn't it be easier to not deal with the challenge? Furthermore, you may also be concerned that showering with your sports-related injury will be a longer process than a normal shower, making the entire ordeal less environmentally friendly. While there are ways to make sure you are being economical while showering, like being conscientious of what you put down the drain, you may not always be thinking about the environment when trying to avoid getting your injury wet in the shower. Fortunately, there are two ways you can be economical about your water usage while showering with an injury, including:</p></p></div><div class="mdl-card__actions mdl-card--border"><a href=/posts/blog4/ class="mdl-button mdl-button--colored mdl-button mdl-js-button mdl-button--raised mdl-button--colored" tabindex=0 aria-label="Read more about 2 Ways to Be Economical When Showering With an Injury">Read Article: 2 Ways to Be Economical When Showering With an Injury</a></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone blog-post mdl-card mdl-shadow--2dp"><div class=mdl-card__title><h3 class=mdl-card__title-text>Don't Put These Things Down The Shower Drain!</h3></div><div class=mdl-card__supporting-text><p><p>Natural water in Finland is some of the most polluted water in Europe (read the discussions in the article). You might be contributing to its pollution without realizing it, such as if you're putting things down the drain that you really shouldn't. Making your shower eco-friendly should be about saving water as well as preventing water contamination. Here's what you can do to be greener and cleaner!</p><p>In Finland, people use an average of 140 liters of water every day. By installing a product such as Showerloop into your shower, you can save water and energy. Showerloop reuses water while you shower so that it doesn't go to waste and you don't have to feel guilty about taking longer showers. However, that's just Step One to ensuring a more eco-friendly shower. Step Two involves preventing toxins from ending up in water systems and the environment. That means you can enjoy showering without worrying about how you're harming the water and wildlife.</p></p></div><div class="mdl-card__actions mdl-card--border"><a href=/posts/blog3/ class="mdl-button mdl-button--colored mdl-button mdl-js-button mdl-button--raised mdl-button--colored" tabindex=0 aria-label="Read more about Don't Put These Things Down The Shower Drain!">Read Article: Don't Put These Things Down The Shower Drain!</a></div></div></div></div></div></div></div></main><footer class="mdl-mini-footer site-footer"><div class=mdl-mini-footer__left-section>&copy 2020 Shower Loop | All Rights Reserved</div><div class=mdl-mini-footer__right-section></div></footer></div></body></html>
<a class=mdl-navigation__link href=/components/ title=Components tabindex=0>Components</a></nav></div><div class=chocolate-hero-section style=background-image:url(/images/material-bg.webp)><div class=hero-row-group><div class=hero-row><div class="hero-row-item hero-text-info"><h1 class=mdl-typography--display-3>Shower Loop</h1><h2>Open Source - Open Hardware - Ecological - Economical.</h2><p>Real-time filtration, purification, recycling & heat recovery system for showers. Made in Finland, for Earth.</p></div><div class="hero-row-item hero-video"><div class=video-container>
<a href="/videos/video1.html" class="video-link" title="View full ShowerLoop Introduction video">
<video id=video-hero-1741619071 controls preload=none width=100% height=auto poster=/static/videos/posters/video1.webp>
<source src=/static/videos/hls/video1/master.m3u8 type=application/x-mpegurl><source src=/static/videos/video1.mp4 type=video/mp4><p>To view this video please enable JavaScript, and consider upgrading to a
web browser that supports HTML5 video</p></video>
<div class="video-overlay">
<span class="video-overlay-text">Click to view full video page</span>
</div>
</a>
</div></div></div></div></div><div class=cta><div class=cta-row-group><div class=cta-row><div class=cta-row-item><p class="mdl-typography--headline mdl-typography--font-thin">Looking to make a change? Want to support the project?</p><a href=/components class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Check Out our Components</a></div></div></div></div><main><div class=homepage-content><div class=home-introduction><div class=chocolate-container><div class=mdl-grid><div class="mdl-cell mdl-cell--12-col"><h2 class=mdl-typography--display-2>Shower Loop vs Normal Shower</h2><p class=intro-description>90% reduction in water usage and 70-90% in energy reduction for a 10 minute shower with a flow rate of 10 l/min. Savings are dependant on user behaviour and can vary. Use Just one bucket of water for a shower of any length. See the savings section for more information.</p><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Save Water</h3><p>Capture, Filter, Reuse</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Saving Energy</h3><p>By reusing warm water.</p></div></div></div><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Save The Planet</h3><p>Save Money</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Open Hardware</h3><p>Copy, improve, adapt, share</p></div></div></div><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Assemble It Yourself</h3><p>With manufactured and off-shell components</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Enjoy Better Showers</h3><p>The single pump provides stable water pressure and the thermostat and heater keep water nice and warm</p></div></div></div><div class="mdl-grid reasons"><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>Off - Grid Ready</h3><p>The entire system can run on a 12V DC</p></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div><i class="far fa-lightbulb"></i></div><div><h3>No Plumber Needed</h3><p>Shower Loop is like a standalone appliance without connecting to water mains</p></div></div></div></div></div></div></div><div class=home-works><div class=mdl-grid><div class="mdl-cell mdl-cell--12-col"><h2 class="mdl-typography--display-2 section-title">How It Works</h2><p class=intro-description>Showers are great, but pouring hot and almost drinkable water down the drain is not. Besides the obvious costs to the environment and your bills, there is also a conscious on unconscious psychological cost any time you create waste. To solve this problem we created Showerloop. It's a shower that collects, cleans and reuses the water in real time while you are showering. So now you can shower for as long as you like but with a reduced ecological impact.</p><div class="mdl-grid videos" style=justify-content:center><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div class=video-container>
<a href="/videos/video2.html" class="video-link" title="View full How ShowerLoop Works video">
<video id=video2 controls preload=auto width=100% height=auto poster=/static/videos/posters/video2.webp>
<source src=/static/videos/hls/video2/master.m3u8 type=application/x-mpegurl><source src=/static/videos/video2.mp4 type=video/mp4><p>To view this video please enable JavaScript, and consider upgrading to a
web browser that supports HTML5 video</p></video>
<div class="video-overlay">
<span class="video-overlay-text">Click to view full video page</span>
</div>
</a>
</div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><div class=video-container>
<a href="/videos/video3.html" class="video-link" title="View full ShowerLoop Installation Guide video">
<video id=video3 controls preload=auto width=100% height=auto poster=/static/videos/posters/video3.webp>
<source src=/static/videos/hls/video3/master.m3u8 type=application/x-mpegurl><source src=/static/videos/video3.mp4 type=video/mp4><p>To view this video please enable JavaScript, and consider upgrading to a
web browser that supports HTML5 video</p></video>
<div class="video-overlay">
<span class="video-overlay-text">Click to view full video page</span>
</div>
</a>
</div></div></div></div></div></div></div><div class=recent-posts><div class=chocolate-container><div class=mdl-grid><div class="mdl-cell mdl-cell--12-col"><h2 class="mdl-typography--display-2 section-title">Recent News</h2><p class=blog-description></p><div class=mdl-grid><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone blog-post mdl-card mdl-shadow--2dp"><div class=mdl-card__title><h3 class=mdl-card__title-text>2 Ways to Be Economical When Showering With an Injury</h3></div><div class=mdl-card__supporting-text><p><p>It's extremely challenging to lead your daily life while sustaining an injury. And yet, dealing with sports injuries is something that most of us will have to go through, with nearly 2 million sports-related injuries affecting high school athletes alone per year. Most of us know the feeling of attempting to take a shower or bath when your arm is wrapped in a cast and cannot get wet. It's a defeated feeling, and it can quickly take away the motivation to shower or bathe in the first place. After all, wouldn't it be easier to not deal with the challenge? Furthermore, you may also be concerned that showering with your sports-related injury will be a longer process than a normal shower, making the entire ordeal less environmentally friendly. While there are ways to make sure you are being economical while showering, like being conscientious of what you put down the drain, you may not always be thinking about the environment when trying to avoid getting your injury wet in the shower. Fortunately, there are two ways you can be economical about your water usage while showering with an injury, including:</p></p></div><div class="mdl-card__actions mdl-card--border"><a href=/posts/blog4/ class="mdl-button mdl-button--colored mdl-button mdl-js-button mdl-button--raised mdl-button--colored" tabindex=0 aria-label="Read more about 2 Ways to Be Economical When Showering With an Injury">Read Article: 2 Ways to Be Economical When Showering With an Injury</a></div></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone blog-post mdl-card mdl-shadow--2dp"><div class=mdl-card__title><h3 class=mdl-card__title-text>Don't Put These Things Down The Shower Drain!</h3></div><div class=mdl-card__supporting-text><p><p>Natural water in Finland is some of the most polluted water in Europe (read the discussions in the article). You might be contributing to its pollution without realizing it, such as if you're putting things down the drain that you really shouldn't. Making your shower eco-friendly should be about saving water as well as preventing water contamination. Here's what you can do to be greener and cleaner!</p><p>In Finland, people use an average of 140 liters of water every day. By installing a product such as Showerloop into your shower, you can save water and energy. Showerloop reuses water while you shower so that it doesn't go to waste and you don't have to feel guilty about taking longer showers. However, that's just Step One to ensuring a more eco-friendly shower. Step Two involves preventing toxins from ending up in water systems and the environment. That means you can enjoy showering without worrying about how you're harming the water and wildlife.</p></p></div><div class="mdl-card__actions mdl-card--border"><a href=/posts/blog3/ class="mdl-button mdl-button--colored mdl-button mdl-js-button mdl-button--raised mdl-button--colored" tabindex=0 aria-label="Read more about Don't Put These Things Down The Shower Drain!">Read Article: Don't Put These Things Down The Shower Drain!</a></div></div></div></div></div></div></div></main><footer class="mdl-mini-footer site-footer"><div class=mdl-mini-footer__left-section>&copy 2020 Shower Loop | All Rights Reserved</div><div class=mdl-mini-footer__right-section></div></footer></div></body></html>

View File

@ -0,0 +1,98 @@
/* Chrome-specific video fallback styles */
/* Poster image styling */
.chrome-poster-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
z-index: 1;
border-radius: 4px;
}
/* Play button overlay */
.chrome-play-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 2;
}
.chrome-play-button {
width: 68px;
height: 48px;
transition: transform 0.2s;
filter: drop-shadow(0 0 5px rgba(0,0,0,0.5));
}
.chrome-play-overlay:hover .chrome-play-button {
transform: scale(1.1);
}
/* Video lightbox */
.video-lightbox {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.85);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
.video-lightbox-content {
position: relative;
width: 90%;
max-width: 960px;
}
.video-lightbox video {
width: 100%;
max-height: 90vh;
border-radius: 4px;
}
.close-lightbox {
position: absolute;
top: -40px;
right: 0;
background: none;
border: none;
color: white;
font-size: 30px;
cursor: pointer;
z-index: 10;
width: 40px;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
}
.close-lightbox:hover {
color: #f00;
}
/* Mobile optimizations */
@media (max-width: 768px) {
.video-lightbox-content {
width: 95%;
}
.close-lightbox {
top: -35px;
right: 0;
}
}

View File

@ -0,0 +1,72 @@
/* Custom VideoJS styling */
.video-container {
position: relative;
width: 100%;
/* Add some bottom padding to ensure controls are visible */
margin-bottom: 10px;
overflow: hidden;
}
/* Ensure the video-js player is properly contained */
.video-js {
width: 100%;
height: auto;
/* Ensure controls are within the container */
position: relative;
aspect-ratio: 16/9;
}
/* Fix control bar positioning */
.video-js .vjs-control-bar {
/* Ensure the control bar stays within the player's dimensions */
bottom: 0;
width: 100%;
}
/* Additional responsive adjustments */
@media (max-width: 768px) {
.video-js {
/* Ensure the video fits on smaller screens */
max-height: 300px;
}
.video-container {
/* More bottom space on mobile */
margin-bottom: 15px;
}
}
/* Video link and overlay styles */
.video-link {
display: block;
position: relative;
text-decoration: none;
color: inherit;
}
.video-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
transition: opacity 0.3s ease;
}
.video-link:hover .video-overlay {
opacity: 1;
}
.video-overlay-text {
background-color: rgba(0, 0, 0, 0.7);
color: white;
padding: 10px 20px;
border-radius: 4px;
font-size: 16px;
font-weight: bold;
}

View File

@ -0,0 +1,93 @@
/**
* Chrome-specific video fallback
* Since Chrome has issues with VideoJS/HLS, this script provides a fallback
* that replaces video players with play buttons that open videos in a new page.
*/
document.addEventListener('DOMContentLoaded', function() {
// Only run this script for Chrome browsers
const isChrome = /Chrome/.test(navigator.userAgent) && !/Edge/.test(navigator.userAgent) && !/OPR/.test(navigator.userAgent);
if (!isChrome) {
return; // Exit if not Chrome
}
// Videos to handle with IDs and their mp4 sources
const videoMappings = {
'video-hero': '/static/videos/video1.mp4',
'video2': '/static/videos/video2.mp4',
'video3': '/static/videos/video3.mp4'
};
// Process each video
Object.keys(videoMappings).forEach(function(videoId) {
const videoElement = document.getElementById(videoId);
if (!videoElement) return;
const videoContainer = videoElement.closest('.video-container');
if (!videoContainer) return;
// Get poster image
const posterUrl = videoElement.getAttribute('poster');
// Create play button overlay
const playButtonOverlay = document.createElement('div');
playButtonOverlay.className = 'chrome-play-overlay';
playButtonOverlay.innerHTML = `
<div class="chrome-play-button">
<svg xmlns="http://www.w3.org/2000/svg" width="68" height="48" viewBox="0 0 68 48">
<path fill="#f00" d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z"></path>
<path fill="#fff" d="M 45,24 27,14 27,34"></path>
</svg>
</div>
`;
// Style the container for positioning
videoContainer.style.position = 'relative';
// Create a poster image as background
if (posterUrl) {
const posterImage = document.createElement('div');
posterImage.className = 'chrome-poster-image';
posterImage.style.backgroundImage = `url(${posterUrl})`;
videoContainer.appendChild(posterImage);
}
// Add click event to open the video in a new page/overlay
playButtonOverlay.addEventListener('click', function() {
// Create the lightbox overlay
const lightbox = document.createElement('div');
lightbox.className = 'video-lightbox';
lightbox.innerHTML = `
<div class="video-lightbox-content">
<button class="close-lightbox">&times;</button>
<video controls autoplay>
<source src="${videoMappings[videoId]}" type="video/mp4">
Your browser does not support the video tag.
</video>
</div>
`;
// Add the lightbox to the body
document.body.appendChild(lightbox);
// Add close functionality
const closeButton = lightbox.querySelector('.close-lightbox');
closeButton.addEventListener('click', function() {
document.body.removeChild(lightbox);
});
// Close when clicking outside the video
lightbox.addEventListener('click', function(e) {
if (e.target === lightbox) {
document.body.removeChild(lightbox);
}
});
});
// Hide the original video element
videoElement.style.display = 'none';
// Add the play button to the container
videoContainer.appendChild(playButtonOverlay);
});
});

View File

@ -0,0 +1 @@
document.addEventListener("DOMContentLoaded",function(){const e=/Chrome/.test(navigator.userAgent)&&!/Edge/.test(navigator.userAgent)&&!/OPR/.test(navigator.userAgent);if(!e)return;const t={"video-hero":"/static/videos/video1.mp4",video2:"/static/videos/video2.mp4",video3:"/static/videos/video3.mp4"};Object.keys(t).forEach(function(e){const o=document.getElementById(e);if(!o)return;const n=o.closest(".video-container");if(!n)return;const i=o.getAttribute("poster"),r=document.createElement("div");if(r.className="chrome-play-overlay",r.innerHTML='\n <div class="chrome-play-button">\n <svg xmlns="http://www.w3.org/2000/svg" width="68" height="48" viewBox="0 0 68 48">\n <path fill="#f00" d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z"></path>\n <path fill="#fff" d="M 45,24 27,14 27,34"></path>\n </svg>\n </div>\n ',n.style.position="relative",i){const e=document.createElement("div");e.className="chrome-poster-image",e.style.backgroundImage=`url(${i})`,n.appendChild(e)}r.addEventListener("click",function(){const o=document.createElement("div");o.className="video-lightbox",o.innerHTML=`\n <div class="video-lightbox-content">\n <button class="close-lightbox">&times;</button>\n <video controls autoplay>\n <source src="${t[e]}" type="video/mp4">\n Your browser does not support the video tag.\n </video>\n </div>\n `,document.body.appendChild(o);const n=o.querySelector(".close-lightbox");n.addEventListener("click",function(){document.body.removeChild(o)}),o.addEventListener("click",function(e){e.target===o&&document.body.removeChild(o)})}),o.style.display="none",n.appendChild(r)})});

View File

@ -0,0 +1,45 @@
/**
* VideoJS Player initialization
* This script initializes VideoJS for all video elements, handling both
* videos with data-setup attribute and regular videos.
*/
document.addEventListener('DOMContentLoaded', function() {
// First, initialize all videos with the data-setup attribute
// VideoJS will automatically process these
// Then find any remaining videos (without video-js class) that need to be initialized
const regularVideos = document.querySelectorAll('video:not(.video-js)');
if (regularVideos.length) {
regularVideos.forEach(function(video) {
// Ensure the video has an ID
const id = video.id || 'video-' + Math.floor(Math.random() * 1000000);
video.id = id;
// Add VideoJS class
video.classList.add('video-js');
video.classList.add('vjs-big-play-centered');
// Initialize with default options
videojs(id, {
controls: true,
autoplay: false,
preload: 'auto'
});
});
}
// Additional check to ensure all video.video-js elements are initialized
// This helps with videos that have the class but weren't auto-initialized
const videojsElements = document.querySelectorAll('video.video-js');
videojsElements.forEach(function(videoElement) {
const id = videoElement.id;
if (id) {
// Check if this element already has a VideoJS instance
if (!videojs.getPlayers()[id]) {
// Initialize VideoJS for this element
videojs(id);
}
}
});
});

View File

@ -0,0 +1 @@
document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll("video:not(.video-js)");e.length&&e.forEach(function(e){const t=e.id||"video-"+Math.floor(1e6*Math.random());e.id=t,e.classList.add("video-js"),e.classList.add("vjs-big-play-centered"),videojs(t,{controls:!0,autoplay:!1,preload:"auto"})});const t=document.querySelectorAll("video.video-js");t.forEach(function(e){const t=e.id;t&&!videojs.getPlayers()[t]&&videojs(t)})});

View File

@ -163,7 +163,12 @@
<link rel="icon" href="/static/favicon.svg" type="image/svg+xml">
<link rel="icon" href="/static/favicon.ico" type="image/x-icon">
<!-- HLS Video Support -->
<script src="/static/js/vendor/hls.min.js" defer></script>
<script src="/static/js/hls-player.min.js" defer></script>
<!-- VideoJS for HLS -->
<link rel="stylesheet" href="/static/css/video-js.min.css">
<link rel="stylesheet" href="/static/css/custom-video.css">
<link rel="stylesheet" href="/static/css/chrome-video-fallback.css">
<script src="/static/js/vendor/video.min.js"></script>
<script src="/static/js/vendor/videojs-http-streaming.min.js"></script>
<script src="/static/js/videojs-player.min.js"></script>
<script src="/static/js/chrome-video-fallback.min.js"></script>
</head>

View File

@ -1,12 +0,0 @@
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=200000,RESOLUTION=256:144
video1_144p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=426:240
video1_240p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640:360
video1_360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=854:480
video1_480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280:720
video1_720p.m3u8

View File

@ -1,12 +0,0 @@
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=200000,RESOLUTION=256:144
video1_144p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=426:240
video1_240p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640:360
video1_360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=854:480
video1_480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280:720
video1_720p.m3u8

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,86 +0,0 @@
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:5.760000,
video1_144p_000.ts
#EXTINF:3.840000,
video1_144p_001.ts
#EXTINF:3.840000,
video1_144p_002.ts
#EXTINF:3.840000,
video1_144p_003.ts
#EXTINF:3.840000,
video1_144p_004.ts
#EXTINF:3.840000,
video1_144p_005.ts
#EXTINF:3.840000,
video1_144p_006.ts
#EXTINF:3.840000,
video1_144p_007.ts
#EXTINF:3.840000,
video1_144p_008.ts
#EXTINF:3.840000,
video1_144p_009.ts
#EXTINF:3.840000,
video1_144p_010.ts
#EXTINF:3.840000,
video1_144p_011.ts
#EXTINF:5.760000,
video1_144p_012.ts
#EXTINF:3.840000,
video1_144p_013.ts
#EXTINF:3.840000,
video1_144p_014.ts
#EXTINF:3.840000,
video1_144p_015.ts
#EXTINF:3.840000,
video1_144p_016.ts
#EXTINF:3.840000,
video1_144p_017.ts
#EXTINF:3.840000,
video1_144p_018.ts
#EXTINF:3.840000,
video1_144p_019.ts
#EXTINF:3.840000,
video1_144p_020.ts
#EXTINF:3.840000,
video1_144p_021.ts
#EXTINF:3.840000,
video1_144p_022.ts
#EXTINF:3.840000,
video1_144p_023.ts
#EXTINF:5.760000,
video1_144p_024.ts
#EXTINF:3.840000,
video1_144p_025.ts
#EXTINF:3.840000,
video1_144p_026.ts
#EXTINF:3.840000,
video1_144p_027.ts
#EXTINF:3.840000,
video1_144p_028.ts
#EXTINF:3.840000,
video1_144p_029.ts
#EXTINF:3.840000,
video1_144p_030.ts
#EXTINF:3.840000,
video1_144p_031.ts
#EXTINF:3.840000,
video1_144p_032.ts
#EXTINF:3.840000,
video1_144p_033.ts
#EXTINF:3.840000,
video1_144p_034.ts
#EXTINF:3.840000,
video1_144p_035.ts
#EXTINF:5.760000,
video1_144p_036.ts
#EXTINF:3.840000,
video1_144p_037.ts
#EXTINF:3.840000,
video1_144p_038.ts
#EXTINF:2.600000,
video1_144p_039.ts
#EXT-X-ENDLIST

View File

@ -1,86 +0,0 @@
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:5.760000,
video1_240p_000.ts
#EXTINF:3.840000,
video1_240p_001.ts
#EXTINF:3.840000,
video1_240p_002.ts
#EXTINF:3.840000,
video1_240p_003.ts
#EXTINF:3.840000,
video1_240p_004.ts
#EXTINF:3.840000,
video1_240p_005.ts
#EXTINF:3.840000,
video1_240p_006.ts
#EXTINF:3.840000,
video1_240p_007.ts
#EXTINF:3.840000,
video1_240p_008.ts
#EXTINF:3.840000,
video1_240p_009.ts
#EXTINF:3.840000,
video1_240p_010.ts
#EXTINF:3.840000,
video1_240p_011.ts
#EXTINF:5.760000,
video1_240p_012.ts
#EXTINF:3.840000,
video1_240p_013.ts
#EXTINF:3.840000,
video1_240p_014.ts
#EXTINF:3.840000,
video1_240p_015.ts
#EXTINF:3.840000,
video1_240p_016.ts
#EXTINF:3.840000,
video1_240p_017.ts
#EXTINF:3.840000,
video1_240p_018.ts
#EXTINF:3.840000,
video1_240p_019.ts
#EXTINF:3.840000,
video1_240p_020.ts
#EXTINF:3.840000,
video1_240p_021.ts
#EXTINF:3.840000,
video1_240p_022.ts
#EXTINF:3.840000,
video1_240p_023.ts
#EXTINF:5.760000,
video1_240p_024.ts
#EXTINF:3.840000,
video1_240p_025.ts
#EXTINF:3.840000,
video1_240p_026.ts
#EXTINF:3.840000,
video1_240p_027.ts
#EXTINF:3.840000,
video1_240p_028.ts
#EXTINF:3.840000,
video1_240p_029.ts
#EXTINF:3.840000,
video1_240p_030.ts
#EXTINF:3.840000,
video1_240p_031.ts
#EXTINF:3.840000,
video1_240p_032.ts
#EXTINF:3.840000,
video1_240p_033.ts
#EXTINF:3.840000,
video1_240p_034.ts
#EXTINF:3.840000,
video1_240p_035.ts
#EXTINF:5.760000,
video1_240p_036.ts
#EXTINF:3.840000,
video1_240p_037.ts
#EXTINF:3.840000,
video1_240p_038.ts
#EXTINF:2.600000,
video1_240p_039.ts
#EXT-X-ENDLIST

View File

@ -1,86 +0,0 @@
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:5.760000,
video1_360p_000.ts
#EXTINF:3.840000,
video1_360p_001.ts
#EXTINF:3.840000,
video1_360p_002.ts
#EXTINF:3.840000,
video1_360p_003.ts
#EXTINF:3.840000,
video1_360p_004.ts
#EXTINF:3.840000,
video1_360p_005.ts
#EXTINF:3.840000,
video1_360p_006.ts
#EXTINF:3.840000,
video1_360p_007.ts
#EXTINF:3.840000,
video1_360p_008.ts
#EXTINF:3.840000,
video1_360p_009.ts
#EXTINF:3.840000,
video1_360p_010.ts
#EXTINF:3.840000,
video1_360p_011.ts
#EXTINF:5.760000,
video1_360p_012.ts
#EXTINF:3.840000,
video1_360p_013.ts
#EXTINF:3.840000,
video1_360p_014.ts
#EXTINF:3.840000,
video1_360p_015.ts
#EXTINF:3.840000,
video1_360p_016.ts
#EXTINF:3.840000,
video1_360p_017.ts
#EXTINF:3.840000,
video1_360p_018.ts
#EXTINF:3.840000,
video1_360p_019.ts
#EXTINF:3.840000,
video1_360p_020.ts
#EXTINF:3.840000,
video1_360p_021.ts
#EXTINF:3.840000,
video1_360p_022.ts
#EXTINF:3.840000,
video1_360p_023.ts
#EXTINF:5.760000,
video1_360p_024.ts
#EXTINF:3.840000,
video1_360p_025.ts
#EXTINF:3.840000,
video1_360p_026.ts
#EXTINF:3.840000,
video1_360p_027.ts
#EXTINF:3.840000,
video1_360p_028.ts
#EXTINF:3.840000,
video1_360p_029.ts
#EXTINF:3.840000,
video1_360p_030.ts
#EXTINF:3.840000,
video1_360p_031.ts
#EXTINF:3.840000,
video1_360p_032.ts
#EXTINF:3.840000,
video1_360p_033.ts
#EXTINF:3.840000,
video1_360p_034.ts
#EXTINF:3.840000,
video1_360p_035.ts
#EXTINF:5.760000,
video1_360p_036.ts
#EXTINF:3.840000,
video1_360p_037.ts
#EXTINF:3.840000,
video1_360p_038.ts
#EXTINF:2.600000,
video1_360p_039.ts
#EXT-X-ENDLIST

Some files were not shown because too many files have changed in this diff Show More