mirror of
https://github.com/jbowdre/runtimeterror.git
synced 2024-11-23 23:42:19 +00:00
move shared js resources to cdn
This commit is contained in:
parent
d27e2846f9
commit
a2c7211b67
6 changed files with 3 additions and 218 deletions
|
@ -1,25 +0,0 @@
|
||||||
// manipulates the post upvote "kudos" button behavior
|
|
||||||
|
|
||||||
window.onload = function() {
|
|
||||||
// get the button and text elements
|
|
||||||
const kudosButton = document.querySelector('.kudos-button');
|
|
||||||
const kudosText = document.querySelector('.kudos-text');
|
|
||||||
const emojiSpan = kudosButton.querySelector('.emoji');
|
|
||||||
|
|
||||||
kudosButton.addEventListener('click', function(event) {
|
|
||||||
// send the event to Cabin
|
|
||||||
cabin.event('kudos')
|
|
||||||
// disable the button
|
|
||||||
kudosButton.disabled = true;
|
|
||||||
kudosButton.classList.add('clicked');
|
|
||||||
// change the displayed text
|
|
||||||
kudosText.textContent = 'Thanks!';
|
|
||||||
kudosText.classList.add('thanks');
|
|
||||||
// spin the emoji
|
|
||||||
emojiSpan.style.transform = 'rotate(360deg)';
|
|
||||||
// change the emoji to celebrate
|
|
||||||
setTimeout(function() {
|
|
||||||
emojiSpan.textContent = '🎉';
|
|
||||||
}, 150); // half of the css transition time for a smooth mid-rotation change
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
// retreives the latest link from a musicthread thread and displays it on the page
|
|
||||||
const themeSongScript = document.currentScript
|
|
||||||
const urlParams = new URLSearchParams(themeSongScript.src.split('.js')[1])
|
|
||||||
const params = Object.fromEntries(urlParams.entries())
|
|
||||||
|
|
||||||
if (params.id)
|
|
||||||
{
|
|
||||||
const musicthread = `https://musicthread.app/api/v0/thread/${params.id}`
|
|
||||||
fetch(musicthread)
|
|
||||||
.then((response) => response.json())
|
|
||||||
.then((thread) => {
|
|
||||||
let themeSong = thread.links[0]
|
|
||||||
console.log(themeSong)
|
|
||||||
themeSongContainer = document.createElement('div')
|
|
||||||
themeSongContainer.className = 'theme-song'
|
|
||||||
themeSongContainer.style
|
|
||||||
themeSongContainer.innerHTML = `<a href="${themeSong.page_url}"><img src="${themeSong.thumbnail_url}"></a><br><a href="${themeSong.page_url}">${themeSong.title}</a><br><i>${themeSong.artist}</i>`
|
|
||||||
themeSongScript.parentNode.insertBefore(themeSongContainer, themeSongScript)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -1,167 +0,0 @@
|
||||||
/*
|
|
||||||
|
|
||||||
Typo, a more natural web typing thing
|
|
||||||
|
|
||||||
https://neatnik.net/typo
|
|
||||||
https://github.com/neatnik/typo
|
|
||||||
|
|
||||||
Copyright (c) 2021 Neatnik LLC
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
function num_between(min, max) {
|
|
||||||
return Math.floor(Math.random() * (max- min + 1) + min);
|
|
||||||
}
|
|
||||||
|
|
||||||
function chance(val) {
|
|
||||||
if(num_between(0, 100) < val) return true;
|
|
||||||
else return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sleep(ms) {
|
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
|
||||||
}
|
|
||||||
|
|
||||||
var typos = {
|
|
||||||
q:['w','a'],
|
|
||||||
w:['q','r','s'],
|
|
||||||
e:['w','d','r'],
|
|
||||||
r:['e','f','t'],
|
|
||||||
t:['r','g','y'],
|
|
||||||
y:['t','h','u'],
|
|
||||||
u:['y','j','i'],
|
|
||||||
i:['u','k','o'],
|
|
||||||
o:['i','l','p'],
|
|
||||||
p:['o',';','['],
|
|
||||||
a:['q','s','z'],
|
|
||||||
s:['w','a','x','d'],
|
|
||||||
d:['e','s','c','f'],
|
|
||||||
f:['r','d','v','g'],
|
|
||||||
g:['t','f','b','h'],
|
|
||||||
h:['y','g','n','j'],
|
|
||||||
j:['u','h','m','k'],
|
|
||||||
k:['i','j',',','l'],
|
|
||||||
l:['o','k','.',';'],
|
|
||||||
z:['a','x'],
|
|
||||||
x:['z','s','c'],
|
|
||||||
c:['x','d','v'],
|
|
||||||
v:['c','f','b'],
|
|
||||||
b:['v','g','n'],
|
|
||||||
n:['b','h','m'],
|
|
||||||
m:['n','j',','],
|
|
||||||
}
|
|
||||||
|
|
||||||
async function typo(element, text) {
|
|
||||||
var buffer = '';
|
|
||||||
var typo_active = false;
|
|
||||||
var typing_typos = (element.dataset.typoChance) ? element.dataset.typoChance : 10;
|
|
||||||
var typing_speed = (element.dataset.typingDelay) ? element.dataset.typingDelay : 50;
|
|
||||||
var typing_jitter = (element.dataset.typingJitter) ? element.dataset.typingJitter : 15;
|
|
||||||
|
|
||||||
for (var i = 0; i < text.length; i++) {
|
|
||||||
// Get the letter that we're supposed to type
|
|
||||||
letter = text.charAt(i);
|
|
||||||
|
|
||||||
// Trigger a typo
|
|
||||||
if(chance(typing_typos) && typo_active === false && i > 1 && i < text.length - 3) {
|
|
||||||
if(typeof typos[letter] !== 'undefined') {
|
|
||||||
// Swap the letter with a random typo
|
|
||||||
typo = typos[letter][Math.floor(Math.random() * typos[letter].length)];
|
|
||||||
|
|
||||||
// Append the letter to the buffer
|
|
||||||
buffer = buffer + typo;
|
|
||||||
|
|
||||||
// Write the buffer
|
|
||||||
element.innerHTML = buffer;
|
|
||||||
|
|
||||||
typo_active = true;
|
|
||||||
var seed = num_between(2,5); // Reduced max seed to ensure correction
|
|
||||||
realization_delay = seed;
|
|
||||||
realization_delay_counter = seed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append the letter to the buffer
|
|
||||||
buffer = buffer + letter;
|
|
||||||
|
|
||||||
// Write the buffer
|
|
||||||
element.innerHTML = buffer;
|
|
||||||
|
|
||||||
// Typical typing speed
|
|
||||||
var speed_lower = parseFloat(typing_speed) - parseInt(typing_jitter);
|
|
||||||
var speed_upper = parseFloat(typing_speed) + parseInt(typing_jitter);
|
|
||||||
|
|
||||||
delay = num_between(speed_lower,speed_upper);
|
|
||||||
|
|
||||||
// Chance of longer delay though
|
|
||||||
if(chance(5)) delay = num_between(100, 200);
|
|
||||||
await sleep(delay);
|
|
||||||
|
|
||||||
if(typo_active) {
|
|
||||||
realization_delay_counter--;
|
|
||||||
|
|
||||||
if(realization_delay_counter == 0) {
|
|
||||||
for (var k = 0; k < seed+1; k++) {
|
|
||||||
// Pause at realization of typo
|
|
||||||
await sleep(typing_jitter);
|
|
||||||
|
|
||||||
// Rewind the buffer!
|
|
||||||
buffer = buffer.substring(0, buffer.length - 1);
|
|
||||||
|
|
||||||
// Write rewound buffer
|
|
||||||
element.innerHTML = buffer;
|
|
||||||
|
|
||||||
// Brief pause before continuing
|
|
||||||
await sleep(30);
|
|
||||||
}
|
|
||||||
|
|
||||||
typo_active = false;
|
|
||||||
|
|
||||||
// Add the letters back
|
|
||||||
i = i - seed;
|
|
||||||
await sleep(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure any remaining typo is corrected
|
|
||||||
if(typo_active) {
|
|
||||||
await sleep(typing_jitter * 2);
|
|
||||||
for (var k = 0; k < seed+1; k++) {
|
|
||||||
buffer = buffer.substring(0, buffer.length - 1);
|
|
||||||
element.innerHTML = buffer;
|
|
||||||
await sleep(30);
|
|
||||||
}
|
|
||||||
for (var k = 0; k < seed; k++) {
|
|
||||||
buffer += text.charAt(text.length - seed + k);
|
|
||||||
element.innerHTML = buffer;
|
|
||||||
await sleep(typing_speed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Promise(resolve => setTimeout(resolve, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
var element = document.getElementById('tagline');
|
|
||||||
var text = element.innerHTML;
|
|
||||||
typo(element, text);
|
|
||||||
});
|
|
|
@ -47,8 +47,7 @@
|
||||||
</button>
|
</button>
|
||||||
<span class="kudos-text">Enjoyed this?</span>
|
<span class="kudos-text">Enjoyed this?</span>
|
||||||
</div>
|
</div>
|
||||||
{{ $kudos := resources.Get "js/kudos.js" | minify }}
|
<script src="https://res.runtimeterror.dev/js/kudos.js" async></script>
|
||||||
<script src="{{ $kudos.RelPermalink }}"></script>
|
|
||||||
<span class="post_email_reply"><a href="mailto:wheel.east.brief@clkdmail.com?Subject=Re: {{ .Title }}">📧 Reply by email</a></span>
|
<span class="post_email_reply"><a href="mailto:wheel.east.brief@clkdmail.com?Subject=Re: {{ .Title }}">📧 Reply by email</a></span>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
<footer class="content__footer"></footer>
|
<footer class="content__footer"></footer>
|
||||||
|
|
|
@ -59,7 +59,6 @@
|
||||||
{{ with .Site.Params.musicThreadId }}
|
{{ with .Site.Params.musicThreadId }}
|
||||||
<hr>
|
<hr>
|
||||||
<h3>current theme song</h3>
|
<h3>current theme song</h3>
|
||||||
{{ $jsThemeSong := resources.Get "js/theme-song.js" | minify }}
|
<script src="https://res.runtimeterror.dev/js/theme-song.js?id={{ . }}" defer></script>
|
||||||
<script src="{{ $jsThemeSong.RelPermalink }}?id={{ . }}"></script>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
|
@ -49,5 +49,4 @@
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<!-- typo text animation -->
|
<!-- typo text animation -->
|
||||||
{{ $jsTypo := resources.Get "js/typo.js" | minify }}
|
<script src="https://res.runtimeterror.dev/js/typo.js" defer></script>
|
||||||
<script src="{{ $jsTypo.RelPermalink }}"></script>
|
|
Loading…
Reference in a new issue