Additional fixes and improvements
ci/woodpecker/push/woodpecker Pipeline failed Details

This commit is contained in:
Leopere 2025-03-07 10:48:50 -05:00
parent 5398cba92b
commit a897e57154
29 changed files with 311 additions and 47 deletions

View File

@ -13,6 +13,14 @@
# Enable compression for text-based resources
encode gzip zstd
# MIME type overrides for HLS streaming
mime {
# HLS playlist files
.m3u8 application/x-mpegURL
# HLS segment files
.ts video/MP2T
}
# Security headers
header {
# Cross-Origin headers
@ -38,8 +46,8 @@
# Frame Options (prevents clickjacking)
X-Frame-Options "SAMEORIGIN"
# Frame ancestors (prevents embedding in other sites)
Content-Security-Policy "frame-ancestors 'none'"
# Update CSP to allow media content, scripts, and blob URLs
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' blob:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'; block-all-mixed-content;"
# Remove Server header
-Server
@ -67,6 +75,14 @@
}
header @htmlFiles Cache-Control "public, max-age=86400, must-revalidate"
# HLS file handling
@hlsFiles {
path *.m3u8 *.ts
method GET HEAD
}
header @hlsFiles Cache-Control "public, max-age=300"
header @hlsFiles Access-Control-Allow-Origin "*"
# Static file server
file_server {
root /srv # Root directory for serving static files

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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" fill="#00D0FF"/><text x="16" y="22" font-family="Arial" font-size="20" text-anchor="middle" fill="#000">SL</text></svg>

After

Width:  |  Height:  |  Size: 209 B

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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

View File

@ -0,0 +1 @@
logo2.webp

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View File

@ -1,9 +1,9 @@
<!doctype html><html lang=en><head><meta name=generator content="Hugo 0.144.0"><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script><title>Home | ShowerLoop</title>
<meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="ShowerLoop - Real-time filtration, purification, recycling & heat recovery system for showers. Open source and sustainable water conservation technology."><script>let liveReloadSocket=null;const OriginalWebSocket=window.WebSocket;window.WebSocket=function(e,t){if(e.includes("/__livereload")){if(document.readyState==="complete"){liveReloadSocket=new OriginalWebSocket(e,t);const n={onmessage:null,onclose:null};return Object.defineProperty(liveReloadSocket,"onmessage",{set:function(e){n.onmessage=e},get:function(){return n.onmessage}}),Object.defineProperty(liveReloadSocket,"onclose",{set:function(e){n.onclose=e},get:function(){return n.onclose}}),liveReloadSocket.addEventListener("message",function(e){n.onmessage&&n.onmessage(e)}),liveReloadSocket.addEventListener("close",function(e){liveReloadSocket=null,n.onclose&&n.onclose(e)}),liveReloadSocket}return{send:function(){},close:function(){},addEventListener:function(){},removeEventListener:function(){},set onmessage(e){},set onclose(e){}}}return new OriginalWebSocket(e,t)};for(const e in OriginalWebSocket)OriginalWebSocket.hasOwnProperty(e)&&(window.WebSocket[e]=OriginalWebSocket[e]);window.WebSocket.prototype=OriginalWebSocket.prototype,document.addEventListener("pageshow",function(e){if(e.persisted){console.log("Page restored from bfcache");const e=window.location.protocol==="https:"?"wss:":"ws:";liveReloadSocket=new OriginalWebSocket(`${e}//${window.location.host}/__livereload`),liveReloadSocket.onmessage=function(e){e.data==="reload"&&window.location.reload()}}}),window.addEventListener("pagehide",function(){liveReloadSocket&&(liveReloadSocket.onclose=null,liveReloadSocket.close(),liveReloadSocket=null)})</script><link rel=preload href=/css/vendor/material-icons.css as=style><link rel=preload href=/images/logo2.webp as=image><link rel=stylesheet href=/css/vendor/material-icons.css><link rel=stylesheet href=/css/vendor/material.indigo-pink.min.css media=print onload='this.media="all"'><noscript><link rel=stylesheet href=/css/vendor/material.indigo-pink.min.css></noscript><link rel=stylesheet href=/css/vendor/fontawesome.min.css media=print onload='this.media="all"'><noscript><link rel=stylesheet href=/css/vendor/fontawesome.min.css></noscript><script type=module>
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/video-init.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/video-init.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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><div class="mdl-layout mdl-js-layout
<!doctype html><html lang=en><head><meta name=generator content="Hugo 0.143.1"><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script><title>Home | ShowerLoop</title>
<meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="ShowerLoop - Real-time filtration, purification, recycling & heat recovery system for showers. Open source and sustainable water conservation technology."><script>let liveReloadSocket=null;const OriginalWebSocket=window.WebSocket;window.WebSocket=function(e,t){if(e.includes("/__livereload")){if(document.readyState==="complete"){liveReloadSocket=new OriginalWebSocket(e,t);const n={onmessage:null,onclose:null};return Object.defineProperty(liveReloadSocket,"onmessage",{set:function(e){n.onmessage=e},get:function(){return n.onmessage}}),Object.defineProperty(liveReloadSocket,"onclose",{set:function(e){n.onclose=e},get:function(){return n.onclose}}),liveReloadSocket.addEventListener("message",function(e){n.onmessage&&n.onmessage(e)}),liveReloadSocket.addEventListener("close",function(e){liveReloadSocket=null,n.onclose&&n.onclose(e)}),liveReloadSocket}return{send:function(){},close:function(){},addEventListener:function(){},removeEventListener:function(){},set onmessage(e){},set onclose(e){}}}return new OriginalWebSocket(e,t)};for(const e in OriginalWebSocket)OriginalWebSocket.hasOwnProperty(e)&&(window.WebSocket[e]=OriginalWebSocket[e]);window.WebSocket.prototype=OriginalWebSocket.prototype,document.addEventListener("pageshow",function(e){if(e.persisted){console.log("Page restored from bfcache");const e=window.location.protocol==="https:"?"wss:":"ws:";liveReloadSocket=new OriginalWebSocket(`${e}//${window.location.host}/__livereload`),liveReloadSocket.onmessage=function(e){e.data==="reload"&&window.location.reload()}}}),window.addEventListener("pagehide",function(){liveReloadSocket&&(liveReloadSocket.onclose=null,liveReloadSocket.close(),liveReloadSocket=null)})</script><link rel=preload href=/css/vendor/material-icons.css as=style><link rel=preload href=/images/logo2.webp as=image><link rel=stylesheet href=/css/vendor/material-icons.css><link rel=stylesheet href=/css/vendor/material.indigo-pink.min.css media=print onload='this.media="all"'><noscript><link rel=stylesheet href=/css/vendor/material.indigo-pink.min.css></noscript><link rel=stylesheet href=/css/vendor/fontawesome.min.css media=print onload='this.media="all"'><noscript><link rel=stylesheet href=/css/vendor/fontawesome.min.css></noscript><script type=module>
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/video-init.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/video-init.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></head><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,7 +12,7 @@ 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-1741286064 class="video-js vjs-default-skin vjs-big-play-centered" controls preload=none width=100% height=auto poster=/videos/thumbnails/video1.webp data-setup='{"fluid": true, "responsive": true, "html5": {"vhs": {"overrideNative": true, "enableLowInitialPlaylist": true, "limitRenditionsByPlayerDimensions": true}}, "controlBar": {"pictureInPictureToggle": false}, "playbackRates": [0.75, 1, 1.25, 1.5, 2], "preload": "none"}'>
<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-1741301232 class="video-js vjs-default-skin vjs-big-play-centered" controls preload=none width=100% height=auto poster=/videos/thumbnails/video1.webp data-setup='{"fluid": true}'>
<source src=/videos/hls/video1/index.m3u8 type=application/x-mpegurl><p class=vjs-no-js>To view this video please enable JavaScript, and consider upgrading to a
web browser that <a href=https://videojs.com/html5-video-support/ target=_blank>supports HTML5 video</a></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"><link href=/css/vendor/video-js.min.css rel=stylesheet><script src=/js/videojs/video.min.js></script><div class=responsive-video-container><video id=video2 class="video-js vjs-default-skin vjs-big-play-centered" controls preload=auto width=640 height=360 poster=/videos/hls/video2/poster.webp data-setup='{"fluid": true}'>
<source src=/videos/hls/video2/index.m3u8 type=application/x-mpegurl><p class=vjs-no-js>To view this video please enable JavaScript, and consider upgrading to a
@ -20,4 +20,5 @@ web browser that
<a href=https://videojs.com/html5-video-support/ target=_blank>supports HTML5 video</a></p></video></div><style>.responsive-video-container{position:relative;width:100%;margin-bottom:2rem}.video-js{width:100%;height:auto;aspect-ratio:16/9}</style><script>document.addEventListener("DOMContentLoaded",function(){var e=videojs("video2")})</script></div><div class="mdl-cell mdl-cell--6-col mdl-cell--12-col-tablet mdl-cell--12-col-phone"><link href=/css/vendor/video-js.min.css rel=stylesheet><script src=/js/videojs/video.min.js></script><div class=responsive-video-container><video id=video3 class="video-js vjs-default-skin vjs-big-play-centered" controls preload=auto width=640 height=360 poster=/videos/hls/video3/poster.webp data-setup='{"fluid": true}'>
<source src=/videos/hls/video3/index.m3u8 type=application/x-mpegurl><p class=vjs-no-js>To view this video please enable JavaScript, and consider upgrading to a
web browser that
<a href=https://videojs.com/html5-video-support/ target=_blank>supports HTML5 video</a></p></video></div><style>.responsive-video-container{position:relative;width:100%;margin-bottom:2rem}.video-js{width:100%;height:auto;aspect-ratio:16/9}</style><script>document.addEventListener("DOMContentLoaded",function(){var e=videojs("video3")})</script></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 href=https://videojs.com/html5-video-support/ target=_blank>supports HTML5 video</a></p></video></div><style>.responsive-video-container{position:relative;width:100%;margin-bottom:2rem}.video-js{width:100%;height:auto;aspect-ratio:16/9}</style><script>document.addEventListener("DOMContentLoaded",function(){var e=videojs("video3")})</script></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,68 @@
// Initialize videos when the DOM is fully loaded
document.addEventListener('DOMContentLoaded', function() {
console.log('[VIDEOJS] Initialization starting...');
if (typeof videojs === 'undefined') {
console.error('[VIDEOJS ERROR] VideoJS is not loaded!');
return;
}
// Hero video
try {
var heroVideo = videojs('video-hero-1741299175', {
html5: {
vhs: {
overrideNative: true
}
}
});
heroVideo.on('error', function() {
console.error('[VIDEOJS ERROR] Hero video error:', heroVideo.error());
});
console.log('[VIDEOJS] Hero video initialized');
} catch (e) {
console.error('[VIDEOJS ERROR] Failed to initialize hero video:', e);
}
// Video 2
try {
var video2 = videojs('video2', {
html5: {
vhs: {
overrideNative: true
}
}
});
video2.on('error', function() {
console.error('[VIDEOJS ERROR] Video2 error:', video2.error());
});
console.log('[VIDEOJS] Video2 initialized');
} catch (e) {
console.error('[VIDEOJS ERROR] Failed to initialize video2:', e);
}
// Video 3
try {
var video3 = videojs('video3', {
html5: {
vhs: {
overrideNative: true
}
}
});
video3.on('error', function() {
console.error('[VIDEOJS ERROR] Video3 error:', video3.error());
});
console.log('[VIDEOJS] Video3 initialized');
} catch (e) {
console.error('[VIDEOJS ERROR] Failed to initialize video3:', e);
}
console.log('[VIDEOJS] Initialization completed');
});

View File

@ -0,0 +1,79 @@
// Initialize videos when the DOM is fully loaded
document.addEventListener('DOMContentLoaded', function() {
console.log('[VIDEOJS] Initialization starting...');
if (typeof videojs === 'undefined') {
console.error('[VIDEOJS ERROR] VideoJS is not loaded!');
return;
}
// Helper function to configure and initialize a video player
function initializeVideoPlayer(elementId, options) {
try {
var defaultOptions = {
html5: {
vhs: {
overrideNative: true,
enableLowInitialPlaylist: true,
limitRenditionsByPlayerDimensions: true,
useBandwidthFromLocalStorage: true
},
nativeAudioTracks: false,
nativeVideoTracks: false
},
controlBar: {
pictureInPictureToggle: false
},
playbackRates: [0.75, 1, 1.25, 1.5, 2],
techOrder: ["html5"]
};
// Merge options
var mergedOptions = {};
for (var key in defaultOptions) {
mergedOptions[key] = defaultOptions[key];
}
for (var key in options || {}) {
mergedOptions[key] = options[key];
}
var player = videojs(elementId, mergedOptions);
// Fix MIME type issues in Chromium
var hlsSource = player.el().querySelector('source[type="application/x-mpegurl"], source[type="application/vnd.apple.mpegurl"]');
if (hlsSource) {
// Ensure consistent MIME type
hlsSource.type = 'application/x-mpegurl';
// Force HLS reload to ensure proper initialization
var currentSrc = hlsSource.src;
setTimeout(function() {
// Only reload if player hasn't started yet
if (!player.hasStarted_) {
player.src({
src: currentSrc,
type: 'application/x-mpegurl'
});
}
}, 100);
}
player.on('error', function() {
console.error('[VIDEOJS ERROR] Player "' + elementId + '" error:', player.error());
});
console.log('[VIDEOJS] Player "' + elementId + '" initialized');
return player;
} catch (e) {
console.error('[VIDEOJS ERROR] Failed to initialize player "' + elementId + '":', e);
return null;
}
}
// Initialize all videos
var heroVideo = initializeVideoPlayer('video-hero-1741299175');
var video2 = initializeVideoPlayer('video2');
var video3 = initializeVideoPlayer('video3');
console.log('[VIDEOJS] Initialization completed');
});

View File

@ -2,28 +2,18 @@
* Initialize Video.js players
*/
document.addEventListener('DOMContentLoaded', function() {
// Find all video.js players
var videoElements = document.querySelectorAll('.video-js');
// Initialize each player with error handling
videoElements.forEach(function(videoElement) {
if (videoElement.id) {
var player = videojs(videoElement.id, {
// Enable responsive mode
responsive: true,
// Provide a default source if none is found
sources: videoElement.querySelector('source') ? undefined : [
{ src: '/static/videos/hls/blank/index.m3u8', type: 'application/x-mpegURL' }
]
});
// Add error handling
player.on('error', function() {
var errorDisplay = videoElement.querySelector('.vjs-error-display');
if (errorDisplay) {
errorDisplay.innerHTML = '<div class="vjs-modal-dialog-content">Video unavailable or still processing. Please check back later.</div>';
}
// Wait for Video.js to be loaded
function checkVideoJS() {
if (window.videojs) {
// Initialize any video players on the page
var players = document.querySelectorAll('.video-js');
players.forEach(function(player) {
videojs(player.id);
});
} else {
setTimeout(checkVideoJS, 50);
}
});
}
checkVideoJS();
});

File diff suppressed because one or more lines are too long

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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

View File

@ -0,0 +1,94 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Native Video Test</title>
<style>
body {
margin: 20px;
font-family: Arial, sans-serif;
}
.video-container {
max-width: 800px;
margin: 0 auto 40px;
}
h1, h2 {
text-align: center;
}
</style>
</head>
<body>
<h1>Native Video Test</h1>
<div class="video-container">
<h2>Direct MP4 Test (Video 1)</h2>
<video controls width="100%">
<source src="/videos/video1.mp4.f136.mp4" type="video/mp4">
<source src="/videos/video1.mp4.mkv" type="video/mkv">
Your browser does not support the video tag.
</video>
</div>
<div class="video-container">
<h2>Direct MP4 Test (Video 2)</h2>
<video controls width="100%">
<source src="/videos/video2.mp4.f398.mp4" type="video/mp4">
<source src="/videos/video2.mp4.webm" type="video/webm">
Your browser does not support the video tag.
</video>
</div>
<div class="video-container">
<h2>Direct MP4 Test (Video 3)</h2>
<video controls width="100%">
<source src="/videos/video3.mp4.f136.mp4" type="video/mp4">
<source src="/videos/video3.mp4.mkv" type="video/mkv">
Your browser does not support the video tag.
</video>
</div>
<div class="video-container">
<h2>HLS Test (Video 1)</h2>
<video controls width="100%">
<source src="/videos/hls/video1/index.m3u8" type="application/x-mpegURL">
Your browser does not support the video tag.
</video>
</div>
<div class="video-container">
<h2>HLS Test with VideoJS</h2>
<link href="/css/vendor/video-js.min.css" rel="stylesheet">
<script src="/js/videojs/video.min.js"></script>
<script src="/js/videojs/videojs-http-streaming.min.js"></script>
<video id="test-video" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="640" height="360">
<source src="/videos/hls/video1/index.m3u8" type="application/x-mpegURL">
Your browser does not support the video tag.
</video>
<script>
document.addEventListener('DOMContentLoaded', function() {
if (typeof videojs === 'undefined') {
console.error('VideoJS is not loaded');
return;
}
try {
var player = videojs('test-video', {
html5: {
vhs: {
overrideNative: true
}
}
});
player.on('error', function() {
console.error('Video error:', player.error());
});
} catch (e) {
console.error('Error initializing video:', e);
}
});
</script>
</div>
</body>
</html>

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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=posts><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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></head><body class=page><div class=skip-to-content role=button tabindex=0>Skip to Content</div><style>.mdl-navigation .mdl-button.mdl-navigation__link{display:flex;align-items:center;justify-content:center;height:36px;line-height:36px;padding:0 16px;margin:8px 0}.logo{height:50px;width:auto;max-width:150px;transition:none!important}</style><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>

View File

@ -0,0 +1 @@
../favicon.ico

View File

@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="#EB2078" />
<path d="M30,40 Q50,10 70,40 T70,60 Q50,90 30,60 T30,40" fill="#00D0FF" />
</svg>

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 14 B

View File

@ -0,0 +1 @@
../favicon.svg

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 14 B

View File

@ -0,0 +1,7 @@
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:1
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.000,
blank0.ts
#EXT-X-ENDLIST

2
temp_download/video-js.min.css vendored Normal file
View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>3AMEHSTYRW2ZD234</RequestId><HostId>TVa2heNdlxT1XxrL3cG7nWh7QjRaB2FqkQiexkDA/3Czs5KAVGsfvFbFYzxBl4DjqBAFbp7rkEc=</HostId></Error>

2
temp_download/video.min.js vendored Normal file
View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>63B2F35WS2RDBDXK</RequestId><HostId>1NGQngL8ov6RydKGFwST/92E4VUO5u8eKQwwyvYnh5qwh5Tg8JdPama7E2Cy3uOab4xMtYmaelg=</HostId></Error>

File diff suppressed because one or more lines are too long