home to your local SPACEGIRL 馃挮
arimelody.space
1import "./header.js";
2import "./config.js";
3import "./cursor.js";
4
5function type_out(e) {
6 const text = e.innerText;
7 const original = e.innerHTML;
8 const delay = 25;
9 let chars = 0;
10
11 function insert_char(character, parent) {
12 if (chars == 0) parent.innerHTML = "";
13 const c = document.createElement("span");
14 c.innerText = character;
15 parent.appendChild(c);
16 c.classList.add("newchar");
17 }
18
19 function normalize() {
20 e.innerHTML = original;
21 }
22
23 function increment_char() {
24 const newchar = text.substring(chars, chars + 1);
25 insert_char(newchar, e);
26 chars++;
27 if (chars <= text.length) {
28 setTimeout(increment_char, delay);
29 } else {
30 setTimeout(normalize, 250);
31 }
32 }
33
34 increment_char();
35}
36
37function fill_list(list) {
38 const items = list.querySelectorAll("li a, li span");
39 items.innerText = "";
40 const delay = 100;
41
42 items.forEach((item, iter) => {
43 item.style.animationDelay = `${iter * delay}ms`;
44 item.style.animationPlayState = "playing";
45 });
46}
47
48export function hijackClickEvent(container, link) {
49 container.addEventListener('click', event => {
50 if (event.target.tagName.toLowerCase() === 'a') return;
51 event.preventDefault();
52 link.dispatchEvent(new MouseEvent('click', {
53 bubbles: true,
54 cancelable: true,
55 view: window,
56 ctrlKey: event.ctrlKey,
57 metaKey: event.metaKey,
58 shiftKey: event.shiftKey,
59 altKey: event.altKey,
60 button: event.button,
61 }));
62 });
63}
64
65document.addEventListener("DOMContentLoaded", () => {
66 [...document.querySelectorAll(".typeout")]
67 .filter((e) => e.innerText != "")
68 .forEach((e) => {
69 type_out(e);
70 });
71 [...document.querySelectorAll("ol, ul")]
72 .filter((e) => e.innerText != "")
73 .forEach((e) => {
74 fill_list(e);
75 });
76
77 const top_button = document.getElementById("backtotop");
78 window.onscroll = () => {
79 if (!top_button) return;
80 const btt_threshold = 100;
81 if (
82 document.body.scrollTop > btt_threshold ||
83 document.documentElement.scrollTop > btt_threshold
84 ) {
85 top_button.classList.add("active");
86 } else {
87 top_button.classList.remove("active");
88 }
89 }
90});