add files
675
index.html
Normal file
@ -0,0 +1,675 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="content-language" content="ja">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>falsycat</title>
|
||||
|
||||
<meta name="author" content="falsycat">
|
||||
<meta name="description" content="falsycat's portfolio">
|
||||
<link rel="icon" href="/pf/img/icon/falsycat.webp">
|
||||
|
||||
<meta name="twitter:site" content="@falsycat">
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta property="og:url" content="https://falsy.cat/">
|
||||
<meta property="og:title" content="falsycat">
|
||||
<meta property="og:description" content="falsycat's portfolio">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Black+Ops+One&family=Ubuntu&family=Noto+Serif+JP&display=block" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/destyle.css@2.0.2/destyle.css">
|
||||
<style>
|
||||
:root {
|
||||
--color1: #DDD;
|
||||
--color2: #222831;
|
||||
--color3: #30475E;
|
||||
--color4: #f05454;
|
||||
|
||||
--color1-disabled: #555;
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: 12pt;
|
||||
background-color: var(--color2);
|
||||
font-family: 'Ubuntu', sans-serif;
|
||||
}
|
||||
body {
|
||||
position: relative;
|
||||
min-height: 100vh;
|
||||
}
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-family: 'Black Ops One', sans-serif;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
#background, #frame {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
z-index: -1;
|
||||
overflow: hidden;
|
||||
}
|
||||
#background svg {
|
||||
position: absolute;
|
||||
stroke: var(--color3);
|
||||
fill: var(--color3);
|
||||
stroke-width: 1px;
|
||||
}
|
||||
#background .text {
|
||||
font-family: 'Noto Serif JP', serif;
|
||||
font-size: 3vw;
|
||||
letter-spacing: 1em;
|
||||
line-height: 2em;
|
||||
text-align: right;
|
||||
white-space: pre;
|
||||
}
|
||||
#background:after {
|
||||
display: block;
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
|
||||
background-image: url("/pf/img/tex/clean-gray-paper.webp");
|
||||
background-size: 512px 512px;
|
||||
}
|
||||
|
||||
#frame {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
pointer-events: none;
|
||||
}
|
||||
#frame svg {
|
||||
position: absolute;
|
||||
stroke: none;
|
||||
fill: #000;
|
||||
}
|
||||
|
||||
#foreground {
|
||||
max-width: 60rem;
|
||||
min-width: 16rem;
|
||||
|
||||
padding: 1rem 0;
|
||||
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
|
||||
overflow-x: hidden;
|
||||
color: var(--color1);
|
||||
}
|
||||
|
||||
#header {
|
||||
margin: calc(50vh - 6rem) 0 2rem 0;
|
||||
}
|
||||
#header h1 {
|
||||
font-size: 8rem;
|
||||
line-height: 1em;
|
||||
color: var(--color4);
|
||||
}
|
||||
#header .role {
|
||||
font-size: 1rem;
|
||||
letter-spacing: 2rem;
|
||||
text-indent: 1em;
|
||||
line-height: 1em;
|
||||
}
|
||||
#header .icons {
|
||||
margin: 1rem 0;
|
||||
width: 100%;
|
||||
}
|
||||
#header .icons ul {
|
||||
max-width: 20rem;
|
||||
margin: 0 auto;
|
||||
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
}
|
||||
#header .icons ul li {
|
||||
margin: 0 .2rem;
|
||||
background-color: var(--color2);
|
||||
border-radius: 50%;
|
||||
border: .5em solid var(--color2);
|
||||
}
|
||||
#header .icons img.icon {
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
}
|
||||
|
||||
#works p a {
|
||||
text-decoration: underline;
|
||||
color: var(--color4);
|
||||
}
|
||||
#works h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
#works>ul {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
#works>ul>li {
|
||||
margin: .5rem;
|
||||
}
|
||||
#works>ul>li img.thumb {
|
||||
width: 16rem;
|
||||
height: 9rem;
|
||||
border: solid 1px black;
|
||||
}
|
||||
|
||||
#footer {
|
||||
font-size: .8rem;
|
||||
margin-top: 1rem;
|
||||
color: var(--color1-disabled);
|
||||
}
|
||||
#footer .note {
|
||||
font-size: .6rem;
|
||||
}
|
||||
#footer .note a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.popup-wrapper {
|
||||
display: flex;
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
z-index: 2;
|
||||
|
||||
background-color: rgba(0, 0, 0, .7);
|
||||
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
transition: opacity .2s, visibility .2s;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
.popup-wrapper.shown {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
.popup-wrapper .outside-msg {
|
||||
color: var(--color4);
|
||||
cursor: default;
|
||||
}
|
||||
.popup {
|
||||
padding: 2rem;
|
||||
margin: 0 1rem;
|
||||
background-color: #DDD;
|
||||
max-width: 40rem;
|
||||
max-height: 95%;
|
||||
width: calc(95% - 1rem);
|
||||
overflow: auto;
|
||||
text-align: left;
|
||||
color: var(--color2);
|
||||
border: .5rem solid var(--color3);
|
||||
}
|
||||
.popup h3 {
|
||||
font-size: 2rem;
|
||||
text-align: center;
|
||||
line-height: 4rem;
|
||||
}
|
||||
.popup h4 {
|
||||
font-size: 1.5rem;
|
||||
text-align: center;
|
||||
line-height: 2rem;
|
||||
}
|
||||
.popup h4:before, .popup h4:after {
|
||||
content: " - ";
|
||||
}
|
||||
.popup ul {
|
||||
list-style-type: disc;
|
||||
margin: 1rem 1rem 1rem 2rem;
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
.popup ul li {
|
||||
margin: .25rem 0;
|
||||
}
|
||||
.popup p {
|
||||
text-indent: 1rem;
|
||||
margin: .5rem 0;
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
.popup p.center {
|
||||
text-align: center;
|
||||
}
|
||||
.popup a {
|
||||
text-decoration: underline;
|
||||
color: var(--color3);
|
||||
}
|
||||
.popup figure.thumb {
|
||||
text-align: center;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding-top: 56.25%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.popup table {
|
||||
margin: .5rem;
|
||||
}
|
||||
.popup table td {
|
||||
padding: 0 .5rem;
|
||||
}
|
||||
.popup figure.thumb img, .popup figure.thumb iframe {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
}
|
||||
|
||||
.slideshow {
|
||||
position: relative;
|
||||
}
|
||||
.slideshow > ul.buttons {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
bottom: 0;
|
||||
transform: translateX(-50%);
|
||||
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin: 0;
|
||||
}
|
||||
.slideshow > ul.buttons li {
|
||||
width: .8rem;
|
||||
height: .8rem;
|
||||
background-color: var(--color1);
|
||||
|
||||
opacity: .5;
|
||||
transition: opacity .5s;
|
||||
cursor: pointer;
|
||||
|
||||
border-radius: 50%;
|
||||
margin: .5rem;
|
||||
}
|
||||
.slideshow > ul.buttons li.shown, .slideshow > ul.buttons li:hover {
|
||||
opacity: .8;
|
||||
}
|
||||
.slideshow > :not(.shown) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (max-width: 45rem) {
|
||||
html {
|
||||
font-size: 14pt;
|
||||
}
|
||||
.hide-on-phone {
|
||||
display: none;
|
||||
}
|
||||
#background .text {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
#header {
|
||||
margin: 16vh 0;
|
||||
}
|
||||
#header h1 {
|
||||
font-size: 4rem;
|
||||
}
|
||||
#header .role {
|
||||
letter-spacing: 1rem;
|
||||
}
|
||||
#works img.thumb {
|
||||
width: 90%;
|
||||
}
|
||||
.popup {
|
||||
padding: .5rem;
|
||||
margin: .5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
const lazyLoad = (e) => {
|
||||
e.querySelectorAll("iframe.lazy, img.lazy").forEach((e) => {
|
||||
e.classList.remove("lazy");
|
||||
e.src = e.dataset.src;
|
||||
});
|
||||
};
|
||||
|
||||
const initPopup = () => {
|
||||
const reload = (path) => {
|
||||
/* hide all shown popup */
|
||||
document.querySelectorAll(".popup-wrapper.shown").forEach(p => {
|
||||
p.classList.remove("shown");
|
||||
});
|
||||
|
||||
/* beatiful path */
|
||||
if (path === "/index.html") {
|
||||
path = "/";
|
||||
}
|
||||
if (path.charAt(0) !== "/") {
|
||||
path = "/"+path;
|
||||
}
|
||||
if (path.slice(-1) !== "/") {
|
||||
path += "/";
|
||||
}
|
||||
try {
|
||||
history.replaceState({}, "", path);
|
||||
} catch (e) {
|
||||
path = "";
|
||||
history.replaceState({}, "", "/");
|
||||
}
|
||||
|
||||
path = path.slice(1, -1);
|
||||
if (path === "") {
|
||||
return;
|
||||
}
|
||||
|
||||
/* showing popup */
|
||||
const targets = document.getElementsByName(path);
|
||||
if (targets.length === 0) {
|
||||
reload("/");
|
||||
return;
|
||||
}
|
||||
|
||||
const target = targets[0];
|
||||
if (target.classList.contains("popup-wrapper")) {
|
||||
target.classList.add("shown");
|
||||
lazyLoad(target);
|
||||
}
|
||||
};
|
||||
|
||||
document.querySelectorAll(".popup-wrapper").forEach(p => {
|
||||
p.addEventListener("click", e2 => {
|
||||
p.querySelectorAll("iframe.youtube").forEach(yt => {
|
||||
yt.contentWindow.postMessage(JSON.stringify({
|
||||
event: "command",
|
||||
func: "pauseVideo",
|
||||
args: "",
|
||||
}), "*");
|
||||
});
|
||||
reload("/");
|
||||
});
|
||||
let text = document.createElement("div");
|
||||
text.innerText = "CLOSE";
|
||||
text.classList.add("outside-msg");
|
||||
p.appendChild(text);
|
||||
});
|
||||
document.querySelectorAll(".popup-wrapper .popup").forEach(p => {
|
||||
p.addEventListener("click", e2 => e2.stopPropagation());
|
||||
});
|
||||
document.querySelectorAll("a[href^='/']").forEach(p => {
|
||||
p.addEventListener("click", ev => {
|
||||
ev.preventDefault()
|
||||
reload(p.getAttribute("href"));
|
||||
});
|
||||
});
|
||||
reload(location.pathname);
|
||||
};
|
||||
|
||||
const initSlideshow = () => {
|
||||
document.querySelectorAll(".slideshow").forEach(s => {
|
||||
let items = Array.from(s.children);
|
||||
|
||||
let buttons = document.createElement("ul");
|
||||
buttons.classList.add("buttons");
|
||||
s.appendChild(buttons);
|
||||
|
||||
let timeout = null;
|
||||
let switch_to = (i) => {
|
||||
if (timeout !== null) clearTimeout(timeout);
|
||||
i %= items.length;
|
||||
|
||||
let old = s.querySelector(":scope > .shown");
|
||||
if (old !== null) old.classList.remove("shown");
|
||||
|
||||
old = buttons.querySelector(":scope > .shown");
|
||||
if (old !== null) old.classList.remove("shown");
|
||||
|
||||
items[i].classList.add("shown");
|
||||
buttons.children[i].classList.add("shown");
|
||||
|
||||
timeout = setTimeout(() => switch_to(i+1), 5000);
|
||||
};
|
||||
items.forEach((c, i) => {
|
||||
let button = document.createElement("li");
|
||||
buttons.appendChild(button);
|
||||
button.addEventListener("click", () => { switch_to(i); });
|
||||
});
|
||||
switch_to(0);
|
||||
});
|
||||
};
|
||||
|
||||
const initGraphics = () => {
|
||||
let circles = document.querySelector("#background svg.circles");
|
||||
for (let x = 0; x < 15; ++x) {
|
||||
for (let y = 0; y < 10; ++y) {
|
||||
let c = document.createElementNS("http://www.w3.org/2000/svg", "circle");
|
||||
c.setAttributeNS(null, "cx", x*10+5+"");
|
||||
c.setAttributeNS(null, "cy", y*10+5+"");
|
||||
c.setAttributeNS(null, "r", "2");
|
||||
circles.appendChild(c);
|
||||
}
|
||||
}
|
||||
|
||||
let sinwave = document.querySelector("#background svg.sinwaves");
|
||||
{
|
||||
let paths = sinwave.querySelectorAll("path");
|
||||
|
||||
let t = 0;
|
||||
window.setInterval(() => {
|
||||
paths.forEach((p, i) => {
|
||||
let verts = "M ";
|
||||
for (let x = 0; x < 100; ++x) {
|
||||
verts += x*10+","+(Math.sin(x/4.5/Math.PI+t*.005*(i*(1.08-i*.1)+1)+i)*40+50)+" ";
|
||||
}
|
||||
p.setAttributeNS(null, "d", verts);
|
||||
});
|
||||
++t;
|
||||
}, 50);
|
||||
}
|
||||
|
||||
let squares = document.querySelector("#background svg.squares");
|
||||
for (let i = 0; i < 40; ++i) {
|
||||
let s = document.createElementNS("http://www.w3.org/2000/svg", "use");
|
||||
s.setAttributeNS(null, "href", "#svg-background-square");
|
||||
s.setAttributeNS(null, "transform", "rotate("+i/40*360+")");
|
||||
squares.appendChild(s);
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener("DOMContentLoaded", e => {
|
||||
initPopup();
|
||||
initSlideshow();
|
||||
initGraphics();
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="background">
|
||||
<svg class="circles hide-on-phone"
|
||||
width="60vh" height="40vh"
|
||||
viewBox="0 0 150 100"
|
||||
preserveAspectRatio="none"
|
||||
style="left: 0; bottom: 10%; stroke: none; opacity: .5">
|
||||
</svg>
|
||||
<svg class="sinwaves"
|
||||
width="max(100vw, 150mm)" height="min(10rem, 40mm)"
|
||||
viewBox="0 0 1000 100"
|
||||
preserveAspectRatio="none"
|
||||
style="left: 0; top: calc(50vh - 5rem); fill: none">
|
||||
<path></path>
|
||||
<path></path>
|
||||
<path></path>
|
||||
<path></path>
|
||||
</svg>
|
||||
<svg class="triangles"
|
||||
width="60vh" height="60vh"
|
||||
viewBox="0 0 1000 1000"
|
||||
preserveAspectRatio="none"
|
||||
style="max-width: 70vw; max-height: 70vw; right: -10%; top: 10%; stroke: none">
|
||||
<defs>
|
||||
<path id="svg-background-triangle" d="M 500,500 0,0 1000,0 Z"></path>
|
||||
</defs>
|
||||
<use href="#svg-background-triangle" opacity=".5"></use>
|
||||
<use href="#svg-background-triangle" opacity=".4" y="100"></use>
|
||||
<use href="#svg-background-triangle" opacity=".3" y="200"></use>
|
||||
<use href="#svg-background-triangle" opacity=".2" y="300"></use>
|
||||
<use href="#svg-background-triangle" opacity=".2" y="400"></use>
|
||||
<use href="#svg-background-triangle" opacity=".1" y="500"></use>
|
||||
</svg>
|
||||
<svg class="squares"
|
||||
width="100vh" height="100vh"
|
||||
viewBox="-600 -600 1200 1200"
|
||||
preserveAspectRatio="none"
|
||||
style="min-width: 40rem; min-height: 40rem; left: 50vw; top: 50vh; transform: translateX(-50%) translateY(-50%); fill: none; opacity: .6">
|
||||
<defs>
|
||||
<rect id="svg-background-square" width="300" height="300" x="100" y="100"></rect>
|
||||
</defs>
|
||||
</svg>
|
||||
<svg class="lines hide-on-phone"
|
||||
width="80vw" height="30vw"
|
||||
viewBox="0 0 200 200"
|
||||
preserveAspectRatio="none"
|
||||
style="left: 0; top: 0; stroke: none">
|
||||
<defs>
|
||||
<path id="svg-background-line" d="M 0,0 18,60 16,60 28,100, 38,100 26,60 28,60 10,0 Z"></path>
|
||||
</defs>
|
||||
<use href="#svg-background-line" x="0" ></use>
|
||||
<use href="#svg-background-line" x="30"></use>
|
||||
<use href="#svg-background-line" x="60"></use>
|
||||
<use href="#svg-background-line" x="90"></use>
|
||||
</svg>
|
||||
<div class="text hide-on-phone"
|
||||
style="position: absolute; right: 0; top: 40vh; color: var(--color3); opacity: .6">
|
||||
色蝣しき切み翳しをり
|
||||
灰成憬終葉な揺際一
|
||||
の今た言で唯出の
|
||||
憧蜉末色揺吐せ
|
||||
蝣今唯れ終吐
|
||||
揺翳色言翳
|
||||
末し色せ
|
||||
終灰な
|
||||
贖罪
|
||||
窕
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="foreground">
|
||||
|
||||
<div id="header">
|
||||
<h1>falsycat</h1>
|
||||
<div class="role">PROGRAMMER</div>
|
||||
|
||||
<div class="icons">
|
||||
<ul>
|
||||
<li><a href="https://github.com/falsycat" target="_blank"><img class="icon" src="/pf/img/icon/github.svg"></a></li>
|
||||
<li><a href="https://twitter.com/falsycat" target="_blank"><img class="icon" src="pf/img/icon/twitter.svg"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="works">
|
||||
<h2>WORKS</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<div><a href="/pf/goodmans-invitation"><img class="thumb" src="/pf/img/thumb/goodmans-invitation.webp"></a></div>
|
||||
<div name="pf/goodmans-invitation" class="popup-wrapper"><div class="popup">
|
||||
<h3>Goodman's Invitation</h3>
|
||||
<figure class="thumb"><iframe class="youtube lazy" data-src="https://www.youtube.com/embed/4ZJyPa7GZcE?enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure>
|
||||
<ul>
|
||||
<li>original song</li>
|
||||
<li><a href="https://youtu.be/4ZJyPa7GZcE" target="_blank">宗教勧誘 / Goodman's Invitation - YouTube</a></li>
|
||||
</ul>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<div><a href="/pf/rationalist"><img class="thumb" src="/pf/img/thumb/rationalist.webp"></a></div>
|
||||
<div name="pf/rationalist" class="popup-wrapper"><div class="popup">
|
||||
<h3>RATIONALIST - Shione Lt</h3>
|
||||
<figure class="thumb"><iframe class="youtube lazy" data-src="https://www.youtube.com/embed/VoYQll1F604?enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure>
|
||||
<ul>
|
||||
<li>original song</li>
|
||||
<li><a href="https://youtu.be/VoYQll1F604" target="_blank">RATIONALIST - YouTube</a></li>
|
||||
</ul>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<div><a href="/pf/biner"><img class="thumb" src="/pf/img/thumb/biner.webp"></a></div>
|
||||
<div name="pf/biner" class="popup-wrapper"><div class="popup">
|
||||
<h3>biner</h3>
|
||||
<figure class="thumb"><img class="lazy" data-src="/pf/img/thumb/biner.webp"></figure>
|
||||
<ul>
|
||||
<li>IDL for binary format</li>
|
||||
<li><a href="https://github.com/falsycat/biner" target="_blank">falsycat/biner - GitHub</a></li>
|
||||
</ul>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<div><a href="/pf/protodisco"><img class="thumb" src="/pf/img/thumb/mv-protodisco.webp"></a></div>
|
||||
<div name="pf/protodisco" class="popup-wrapper"><div class="popup">
|
||||
<h3>Protodisco MV</h3>
|
||||
<figure class="thumb"><iframe class="youtube lazy" data-src="https://www.youtube.com/embed/ETHF5SLi1yw?enablejsapi=1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure>
|
||||
<ul>
|
||||
<li>borrowed music: <a href="https://youtu.be/rkkZYzXsxPA" target="_blank">Protodisco - flower / nulut (YouTube)</a></li>
|
||||
<li>independent work</li>
|
||||
<li><a href="https://drive.google.com/file/d/1QP2rHSZ6RF7QKgw9p-dQQGrde0h_mI-5/view?usp=sharing" target="_blank">PF download</a></li>
|
||||
</ul>
|
||||
</div></div>
|
||||
</li>
|
||||
<li>
|
||||
<div><a href="/pf/leftone"><img class="thumb" src="/pf/img/thumb/leftone.webp"></a></div>
|
||||
<div name="pf/leftone" class="popup-wrapper"><div class="popup">
|
||||
<h3>LEFTONE</h3>
|
||||
<figure class="thumb slideshow">
|
||||
<img class="lazy" data-src="/pf/img/thumb/leftone-1.webp">
|
||||
<img class="lazy" data-src="/pf/img/thumb/leftone-2.webp">
|
||||
<img class="lazy" data-src="/pf/img/thumb/leftone-3.webp">
|
||||
<img class="lazy" data-src="/pf/img/thumb/leftone-4.webp">
|
||||
</figure>
|
||||
<ul>
|
||||
<li>2D action game featuring ray marching in backgrounds</li>
|
||||
<li>developed by C11+GLSL</li>
|
||||
<li>got a prize on <a href="https://u22procon.com" target="_blank">2020 41st U22 Programming Contest</a></li>
|
||||
<li><a href="https://github.com/falsycat/LEFTONE" target="_blank">falsycat/LEFTONE - GitHub</a></li>
|
||||
</ul>
|
||||
</div></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<div>Copyright 2021 falsycat <me@falsy.cat></div>
|
||||
<div class="note">.CAT is a top level domain of <a href="https://domini.cat" target="_blank">Catalunya</a>.</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="frame">
|
||||
<svg class="side-triangles hide-on-phone"
|
||||
width="100%" height="100%"
|
||||
viewBox="0 0 100 100"
|
||||
preserveAspectRatio="none"
|
||||
style="fill: #000">
|
||||
<path d="M 0,0 10,0 0,100 Z"></path>
|
||||
<path d="M 100,0 90,100 100,100 Z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
BIN
pf/img/icon/falsycat.webp
Normal file
After Width: | Height: | Size: 3.8 KiB |
1
pf/img/icon/github.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="43.438" height="42.365" viewBox="0 0 11.493 11.209" xmlns:v="https://vecta.io/nano"><path d="M5.746 0A5.75 5.75 0 0 0 0 5.747c0 2.539 1.646 4.693 3.93 5.453.288.053.392-.125.392-.277l-.008-.977c-1.598.347-1.936-.77-1.936-.77-.261-.664-.638-.841-.638-.841-.522-.356.04-.349.04-.349.577.041.88.592.88.592.513.878 1.345.624 1.673.477.052-.371.201-.624.365-.768-1.276-.145-2.618-.638-2.618-2.84a2.22 2.22 0 0 1 .592-1.542c-.059-.145-.256-.73.056-1.521 0 0 .482-.155 1.58.589.458-.128.95-.191 1.439-.194a5.49 5.49 0 0 1 1.439.194c1.097-.744 1.579-.589 1.579-.589.314.791.116 1.375.058 1.521.368.401.591.915.591 1.542 0 2.208-1.344 2.693-2.624 2.836.206.177.39.528.39 1.064l-.007 1.577c0 .154.104.333.395.277A5.75 5.75 0 0 0 5.746 0" fill="#fff" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 815 B |
BIN
pf/img/icon/kofi.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
1
pf/img/icon/note.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="256" height="256" opacity="1" xmlns:v="https://vecta.io/nano"><path d="M256 0C114.617 0 0 114.614 0 256s114.617 256 256 256 256-114.614 256-256S397.386 0 256 0zm-76.59 104v304h-23.562c-19.446 0-35.352-15.906-35.352-35.348V139.348c0-19.442 15.906-35.348 35.352-35.348h23.562zm27.102 304V104h53.023v125.629l38.882-19.934 26.551 13.61 12.176 6.324v-.082l.16.082V104h18.851c19.442 0 35.348 15.906 35.348 35.348v233.304c0 19.442-15.906 35.348-35.348 35.348H206.512z" fill="#ddd"/></svg>
|
After Width: | Height: | Size: 551 B |
1
pf/img/icon/twitter.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" xmlns:v="https://vecta.io/nano"><circle cx="200" cy="200" r="200" fill="#1da1f2"/><path d="M163.4 305.5c88.7 0 137.2-73.5 137.2-137.2 0-2.1 0-4.2-.1-6.2a98.79 98.79 0 0 0 24.1-25c-8.6 3.8-17.9 6.4-27.7 7.6 10-6 17.6-15.4 21.2-26.7-9.3 5.5-19.6 9.5-30.6 11.7-8.8-9.4-21.3-15.2-35.2-15.2-26.6 0-48.2 21.6-48.2 48.2 0 3.8.4 7.5 1.3 11-40.1-2-75.6-21.2-99.4-50.4-4.1 7.1-6.5 15.4-6.5 24.2 0 16.7 8.5 31.5 21.5 40.1-7.9-.2-15.3-2.4-21.8-6v.6c0 23.4 16.6 42.8 38.7 47.3a48.07 48.07 0 0 1-12.7 1.7 46.04 46.04 0 0 1-9.1-.9 48.15 48.15 0 0 0 45 33.5c-16.5 12.9-37.3 20.6-59.9 20.6-3.9 0-7.7-.2-11.5-.7 21.1 13.8 46.5 21.8 73.7 21.8" fill="#fff"/></svg>
|
After Width: | Height: | Size: 707 B |
BIN
pf/img/tex/clean-gray-paper.webp
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
pf/img/thumb/biner.webp
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
pf/img/thumb/goodmans-invitation.webp
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
pf/img/thumb/html-squash-preview.webp
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
pf/img/thumb/leftone-1.webp
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
pf/img/thumb/leftone-2.webp
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
pf/img/thumb/leftone-3.webp
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
pf/img/thumb/leftone-4.webp
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
pf/img/thumb/leftone.webp
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
pf/img/thumb/mv-protodisco.webp
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
pf/img/thumb/rationalist.webp
Normal file
After Width: | Height: | Size: 19 KiB |