2022-10-27 19:21:06 +00:00
|
|
|
<!doctype html>
|
|
|
|
|
|
|
|
<html lang='en'>
|
|
|
|
|
|
|
|
<head>
|
|
|
|
<meta charset='utf-8'>
|
|
|
|
<meta name='viewport' content='width=device-width, initial-scale=1, minimum-scale=1'>
|
|
|
|
|
|
|
|
<title>vance.land</title>
|
|
|
|
<meta name='description' content='vance.land'>
|
|
|
|
<meta name='author' content='vance'>
|
|
|
|
<base target='_blank'>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
@font-face {
|
|
|
|
font-family: 'VT323';
|
|
|
|
src: url('VT323.ttf');
|
|
|
|
}
|
2023-04-01 02:11:20 +00:00
|
|
|
|
2022-10-27 19:21:06 +00:00
|
|
|
* {
|
|
|
|
color: #20C20E;
|
|
|
|
font-family: 'VT323', monospace;
|
|
|
|
font-size: 16pt;
|
|
|
|
cursor: url('cursor.cur'), auto !important;
|
|
|
|
}
|
2023-04-01 02:05:23 +00:00
|
|
|
|
2023-04-01 02:09:30 +00:00
|
|
|
html {
|
2023-04-01 02:05:23 +00:00
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
2023-04-01 02:09:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
body {
|
2022-10-27 19:21:06 +00:00
|
|
|
background: #000000;
|
|
|
|
overflow: hidden;
|
|
|
|
}
|
|
|
|
|
|
|
|
a {
|
|
|
|
text-decoration: none;
|
|
|
|
white-space: nowrap;
|
|
|
|
overflow: hidden;
|
|
|
|
}
|
|
|
|
|
|
|
|
p {
|
|
|
|
padding: 0;
|
|
|
|
margin: 0;
|
|
|
|
font-size: 1rem;
|
|
|
|
white-space: normal;
|
|
|
|
width: 420px;
|
|
|
|
}
|
|
|
|
|
|
|
|
span {
|
|
|
|
font-size: 1rem;
|
|
|
|
}
|
|
|
|
|
|
|
|
#live {
|
|
|
|
position: fixed;
|
|
|
|
top: 50%;
|
|
|
|
left: 50%;
|
|
|
|
transform: translate(-50%, -50%);
|
|
|
|
z-index: 0;
|
|
|
|
border: none;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
|
|
|
|
<body>
|
|
|
|
<iframe id='live' src='https://live.vance.land/embed/video' title='live.vance.land' height='350px' width='550px' referrerpolicy='origin' scrolling='no' allowfullscreen>
|
|
|
|
</iframe>
|
|
|
|
<script>
|
|
|
|
if (window.self !== window.top) {
|
|
|
|
document.getElementById('live').remove();
|
|
|
|
}
|
|
|
|
|
|
|
|
const email = (function() {
|
|
|
|
var p = Array.prototype.slice.call(arguments),
|
|
|
|
V = p.shift();
|
|
|
|
return p.reverse().map(function(o, i) {
|
|
|
|
return String.fromCharCode(o - V - 36 - i)
|
|
|
|
}).join('')
|
|
|
|
})(59, 164, 200, 197, 207, 193, 213) + (40559).toString(36).toLowerCase() + (function() {
|
|
|
|
var Q = Array.prototype.slice.call(arguments),
|
|
|
|
O = Q.shift();
|
|
|
|
return Q.reverse().map(function(e, u) {
|
|
|
|
return String.fromCharCode(e - O - 57 - u)
|
|
|
|
}).join('')
|
|
|
|
})(20, 125, 179, 176) + (766).toString(36).toLowerCase() + (function() {
|
|
|
|
var E = Array.prototype.slice.call(arguments),
|
|
|
|
f = E.shift();
|
|
|
|
return E.reverse().map(function(s, C) {
|
|
|
|
return String.fromCharCode(s - f - 33 - C)
|
|
|
|
}).join('')
|
|
|
|
})(24, 158, 167);
|
|
|
|
|
|
|
|
const socials = {
|
|
|
|
'matrix': {
|
|
|
|
'text': '💊 @vance:vance.land',
|
|
|
|
'link': 'https://matrix.to/#/@vance:vance.land'
|
|
|
|
},
|
|
|
|
'feed': {
|
|
|
|
'text': `🥫 @${email}`,
|
|
|
|
'link': 'https://feed.vance.land/@vance'
|
|
|
|
},
|
|
|
|
'live': {
|
|
|
|
'text': '🎥 live.vance.land',
|
|
|
|
'link': 'https://live.vance.land'
|
|
|
|
},
|
|
|
|
'email': {
|
|
|
|
'text': `📧 ${email}`,
|
|
|
|
'link': `mailto:${email}`
|
|
|
|
},
|
|
|
|
'urbit': {
|
|
|
|
'text': '🌐 ~sarsup-figput',
|
|
|
|
'link': 'https://sarsup-figput.vance.land/blog'
|
|
|
|
},
|
|
|
|
'telegram': {
|
|
|
|
'text': '💬 @vanceland',
|
|
|
|
'link': 'https://t.me/vanceland'
|
|
|
|
},
|
|
|
|
'code': {
|
|
|
|
'text': '🐱💻 code.vance.land',
|
|
|
|
'link': 'https://code.vance.land/vance'
|
2022-12-05 01:08:10 +00:00
|
|
|
},
|
|
|
|
'music': {
|
2023-02-24 00:40:44 +00:00
|
|
|
'text': '🎶 @SMOOTHAPPLIANCE',
|
|
|
|
'link': 'https://soundcloud.com/smoothappliance'
|
2022-10-27 19:21:06 +00:00
|
|
|
},
|
|
|
|
'haram': {
|
|
|
|
'text': '🕋',
|
|
|
|
'link': 'https://dreamsinco.de'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
|
|
|
|
const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
|
|
|
|
|
|
|
|
const min_speed = 10;
|
|
|
|
const max_speed = 20;
|
|
|
|
let entities = 0;
|
|
|
|
const max_entities = Math.floor(vw / 30);
|
|
|
|
|
|
|
|
function animate(entity) {
|
|
|
|
let flag = parseInt(entity.style.left, 10);
|
|
|
|
|
|
|
|
setInterval(() => {
|
|
|
|
entity.style.left = `${--flag}px`;
|
|
|
|
|
|
|
|
if (entity.offsetWidth <= -flag) {
|
|
|
|
flag = vw + Math.floor(entity.offsetWidth / 2);
|
|
|
|
let posy = Math.floor(Math.random() * vh) - Math.floor(entity.offsetHeight / 2);
|
|
|
|
entity.style.top = `${posy}px`;
|
|
|
|
}
|
|
|
|
}, Math.floor(Math.random() * (max_speed - min_speed) + min_speed));
|
|
|
|
}
|
|
|
|
|
|
|
|
function createAnchor(link, content) {
|
|
|
|
if (entities >= max_entities) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const entity = document.createElement('a');
|
|
|
|
entity.href = link;
|
|
|
|
entity.target = '_blank';
|
|
|
|
entity.innerHTML = content;
|
|
|
|
|
|
|
|
const posx = Math.floor(Math.random() * vw) - Math.floor(entity.offsetWidth / 2);
|
|
|
|
const posy = Math.floor(Math.random() * vh) - Math.floor(entity.offsetHeight / 2);
|
|
|
|
let z_index = Math.floor(entities - max_entities / 2);
|
|
|
|
z_index = (z_index >= 0) ? z_index + 1 : z_index;
|
|
|
|
|
|
|
|
entity.style.position = 'absolute';
|
|
|
|
entity.style.top = `${posy}px`;
|
|
|
|
entity.style.left = `${posx}px`;
|
|
|
|
entity.style.zIndex = `${z_index}`;
|
|
|
|
|
|
|
|
document.body.prepend(entity);
|
|
|
|
++entities;
|
|
|
|
animate(entity);
|
|
|
|
}
|
|
|
|
|
|
|
|
function htmlDecode(input) {
|
|
|
|
let doc = new DOMParser().parseFromString(input, 'text/html');
|
|
|
|
doc = new DOMParser().parseFromString(doc.documentElement.textContent, 'text/html');
|
|
|
|
return doc;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Always have socials
|
|
|
|
while(entities < max_entities / 4) {
|
|
|
|
for (const key in socials) {
|
|
|
|
createAnchor(socials[key].link, socials[key].text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fetch(`${socials.feed.link}.rss`)
|
|
|
|
.then(response => response.text())
|
|
|
|
.then(str => new DOMParser().parseFromString(str, 'text/xml'))
|
|
|
|
.then(data => {
|
|
|
|
const items = data.querySelectorAll('item');
|
|
|
|
items.forEach(element => {
|
|
|
|
text = document.createElement('p');
|
|
|
|
text.innerHTML = (element.getElementsByTagName('content:encoded')[0] ?? element.getElementsByTagName('title')[0]).textContent;
|
|
|
|
createAnchor(element.querySelector('link').innerHTML, text.outerHTML);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
function absoluteURL(data, query, url) {
|
|
|
|
data.querySelectorAll(query).forEach(element => {
|
|
|
|
element.setAttribute('href', new URL(element.getAttribute('href'), url));
|
|
|
|
element.removeAttribute('rel');
|
|
|
|
});
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
fetch(`${socials.code.link}.atom`)
|
|
|
|
.then(response => response.text())
|
|
|
|
.then(str => new DOMParser().parseFromString(str, 'text/xml'))
|
|
|
|
.then(data => {
|
|
|
|
data = absoluteURL(data, 'link', socials.code.link);
|
|
|
|
const items = data.querySelectorAll('entry');
|
|
|
|
items.forEach(element => {
|
|
|
|
const title = absoluteURL(htmlDecode(element.querySelector('title').innerHTML), 'a', socials.code.link);
|
|
|
|
createAnchor(element.querySelector('link').getAttribute('href'), title.body.innerHTML);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
</script>
|
|
|
|
</body>
|
|
|
|
|
|
|
|
</html>
|