Compare commits

...

21 Commits

Author SHA1 Message Date
349102301c 🔥 rm duplicate files 2025-08-07 02:35:54 +02:00
e618664f7c update 2025-08-07 02:32:35 +02:00
9ad44ff033 🚀 deploy static files 2025-04-06 19:35:33 +02:00
Lucielle Rosalia Hoerner
30adc7145d Merge pull request 'release 2.0.0' (#5) from develop into release
Reviewed-on: https://git.gay/luciel/web_luciel/pulls/5
2025-03-19 01:08:25 +00:00
Lucielle Rosalia Hoerner
0a203fdb65 Merge pull request 'rust rewrite' (#4) from rewrite/rust into develop
Reviewed-on: https://git.gay/luciel/web_luciel/pulls/4
2025-03-19 01:07:42 +00:00
3788bf81b5 🐛 fixed footer in mobile view
 added own button :3
2025-03-14 03:33:03 +01:00
b8325accb2 add mnet project 2025-03-13 22:23:51 +01:00
f8241695c9 🐛 fix routing
🐛 fix project urls
2025-03-13 02:34:38 +01:00
2e8ecfddd8 add socials
 add padding for hotlink btns
♻️ moved some contents
2025-03-13 01:06:13 +01:00
fd6367eb2d added monocraft font 2025-03-13 00:43:55 +01:00
fbb76210ef 🔥 mov home => about
 add hotlink btns :3
 clean main.scss
🐛 fix height of footer
🐛 fix landing.rs
♻️ refactored code
2025-03-13 00:37:05 +01:00
5797baa64e updated infos in about.rs 2025-03-12 20:50:01 +01:00
ebcc54cc1e 🐛 fixed margins in projects.rs 2025-03-12 19:19:08 +01:00
9d6f05cace add proper header with menu
 add projects tab
 add selection color
♻️ mov home => about
2025-03-12 19:11:45 +01:00
3e4ca7fcf7 updated favicon.ico 2025-03-11 04:05:33 +01:00
d68b9915c0 🎨 new layout
 added landing.rs
 added profile.avif
 added post.bloom.svg
2025-03-11 03:23:49 +01:00
lunarydess
c7b262cd49 add routing
 add bulma
 add favicon
 add justfile
🔥 rm navbar
2025-03-10 14:45:13 +01:00
lunarydess
9a9be89650 🔥 removed redundant draw-calls 2025-03-03 18:39:34 +01:00
lunarydess
af25035bec somewhat fixed shader loading 2025-03-03 14:58:59 +01:00
lunarydess
822725267e 🔥 removed tmp files 2025-03-03 02:13:31 +01:00
lunarydess
6428bcb799 :rocket deploy rewrite 2025-03-03 02:11:41 +01:00
53 changed files with 1279 additions and 2106 deletions

2
.gitignore vendored
View File

@@ -1,2 +0,0 @@
.idea
simplewebserver-*

1
CNAME
View File

@@ -1 +0,0 @@
lunary.celesteflare.cc

24
LICENSE
View File

@@ -1,24 +0,0 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
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 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.
For more information, please refer to <https://unlicense.org>

BIN
aqueer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
artix.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 570 KiB

View File

@@ -1,11 +0,0 @@
{
"name": "Application ~ Chatty",
"link": "https://github.com/lunarydess/Application-Chatty",
"image": "1.png",
"desc": [
"A simple chat-server written in Java 21.",
"I am using Netty 4 for Networking.",
"It has a modern UI built with Swing and FlatLaf. ♡",
"The app is free-to-use but still w.i.p."
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1,10 +0,0 @@
{
"name": "Discord ~ Ashuramaru",
"link": "https://github.com/lunarydess/Discord-Ashuramaru",
"image": "2.png",
"desc": [
"This is a discord bot I wrote in Java.",
"It has basic functions and an advanced captcha system.",
"Built with JavaCord, picocli and Jackson."
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -1,11 +0,0 @@
{
"name": "Library ~ TinyEvents",
"link": "https://github.com/lunarydess/Library-TinyEvents",
"image": "3.png",
"desc": [
"A event-system written in Java 17.",
"It's easy-to-use and blazingly fast.",
"Well-performing benchmarks and reliable error-handling.",
"Usable in any imaginable infra."
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -1,284 +0,0 @@
#version 100
precision lowp float;
const float CAM_FAR = 20.0;
const vec3 BACKGROUND = vec3(0.0, 0.0, 0.0);
const float PI = radians(180.0);
uniform float time;
uniform vec2 resolution;
uniform bool layer_snow;
vec4 vColor;
vec3 artifactOffset;
mat3 artifactRotation;
vec3 artifactAxis;
vec3 camFwd;
vec3 camUp;
float smootherstep(float edge0, float edge1, float x) {
x = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
return x * x * x * (x * (x * 6.0 - 15.0) + 10.0);
}
float rand(float n) {
n = fract(n * 43758.5453);
n *= n;
return fract(n * 43758.5453);
}
float hash(float n) {
return fract(abs(fract(n) * 43758.5453));
}
float noise(float x) {
float i = floor(x);
float f = fract(x);
float u = f * f * (3.0 - 2.0 * f);
return mix(hash(i), hash(i + 1.0), u);
}
mat4 viewMatrix(vec3 dir, vec3 up) {
vec3 f = normalize(dir);
vec3 s = normalize(cross(f, up));
return mat4(vec4(s, 0.0), vec4(cross(s, f), 0.0), vec4(-f, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
}
mat3 rotationAlign(vec3 d, vec3 z) {
vec3 v = cross(z, d);
float c = dot(z, d);
float k = 1.0 / (1.0 + c);
return mat3(
v.x * v.x * k + c,
v.y * v.x * k - v.z,
v.z * v.x * k + v.y,
v.x * v.y * k + v.z,
v.y * v.y * k + c,
v.z * v.y * k - v.x,
v.x * v.z * k - v.y,
v.y * v.z * k + v.x,
v.z * v.z * k + c
);
}
float intersectPlane(vec3 origin, vec3 direction, vec3 point, vec3 normal) {
return clamp(dot(point - origin, normal) / dot(direction, normal), -1.0, 9991999.0);
}
vec3 calcRay(vec2 uv, float fov, float aspect) {
uv = uv * 2.0 - 1.0;
float d = 1.0 / tan(radians(fov) * 0.5);
return normalize(vec3(aspect * uv.x, uv.y, d));
}
vec2 getWave(vec2 position, vec2 dir, float speed, float frequency, float iTimeshift) {
float x = dot(dir, position) * frequency + iTimeshift * speed;
float wave = exp(sin(x) - 1.0);
float dist = wave * cos(x);
return vec2(wave, -dist);
}
float heightmap(vec2 worldPos) {
const float scale = 0.06;
vec2 p = worldPos * scale;
vec2 p2 = (artifactOffset.xz - vec2(0.0, 1.0)) * scale;
float d = (1.0 - smootherstep(0.0, 1.0, clamp(length(p2 - p) * 1.25, 0.0, 1.0))) * 0.87;
float angle = 0.0;
float freq = 5.0;
float speed = 2.0;
float weight = 1.9;
float wave = 0.0;
float waveScale = 0.0;
vec2 dir;
vec2 res;
for (int i = 0; i < 5; i++) {
dir = vec2(cos(angle), sin(angle));
res = getWave(p, dir, speed, freq, time);
p += dir * res.y * weight * 0.05;
wave += res.x * weight - d;
angle += 12.0;
waveScale += weight;
weight = mix(weight, 0.0, 0.2);
freq *= 1.18;
speed *= 1.06;
}
return wave * (1.0 / waveScale);
}
float octahedron(vec3 p, float s) {
p = abs(p);
return (p.x + p.y + p.z - s) * 0.57735027;
}
void artifact(vec3 p, inout float currDist, inout vec3 glowColor, inout int id) {
p -= artifactOffset;
p = artifactRotation * p;
float dist = octahedron(p, 0.8);
const float glowDist = 4.8;
if (dist < glowDist) {
float d = dist + rand(dist) * 1.7;
glowColor += vec3(0.75, 0.55, 0.45) * clamp(1.0 - pow((d * (1.0 / glowDist)), 5.0), 0.0, 1.0) * 0.035;
}
if (dist < currDist) {
currDist = dist;
id = 1;
}
}
float objects(vec3 p, inout vec3 glowColor, inout int objId) {
float dist = CAM_FAR;
artifact(p, dist, glowColor, objId);
return dist;
}
float artifactDist(vec3 p) {
p -= artifactOffset;
p = artifactRotation * p;
return octahedron(p, 1.2);
}
float objectsDist(vec3 p) {
return artifactDist(p);
}
vec3 objectsNormal(vec3 p, float eps) {
vec2 h = vec2(eps, 0);
return normalize(vec3(artifactDist(p + h.xyy) - artifactDist(p - h.xyy), eps * 2.0, artifactDist(p + h.yyx) - artifactDist(p - h.yyx)));
}
vec3 objectsColor(int id, vec3 normal, vec3 ray) {
return id == 1 ? vec3(0.85, 0.65, 0.55) * mix(0.8, 1.5, dot(normal, normalize(vec3(0.0, 1.0, 0.5))) * 0.5 + 0.5) :
id == 2 ? vec3(0.85, 0.65, 0.55) * 1.5 :
vec3(1.0, 1.0, 0.0);
}
void marchObjects(vec3 eye, vec3 ray, float wDepth, inout vec4 color) {
float dist = 0.0;
int id;
vec3 rayPos = eye;
float depth = CAM_FAR;
for (int i = 0; i < 30; i++) {
dist = objects(rayPos, color.rgb, id);
depth = distance(rayPos, eye);
if (depth > wDepth || dist < 0.01) break;
rayPos += ray * dist;
}
color = dist < 0.01 ? vec4(objectsColor(id, objectsNormal(rayPos, 0.01), ray), depth) : color;
}
vec3 waterColor(vec3 ray, vec3 normal, vec3 p) {
vec3 color = vec3(0.0);
float fogDist = length(p - vec3(0.0, 0.0, -6.0));
float dist = 0.0;
int objId = 0;
vec3 refl = reflect(ray, normal);
vec3 rayPos = p + refl * dist;
if (length(p.xz - artifactOffset.xz) < 8.5 && dot(refl, normalize(artifactOffset - p)) > -0.25) {
for (int i = 0; i < 40; i++) {
dist = objects(rayPos, color, objId);
if (dist < 0.01) {
color = objectsColor(objId, objectsNormal(rayPos, 0.001), rayPos);
break;
}
rayPos += refl * dist;
}
}
float fresnel = 0.04 + 0.9 * pow(1.0 - max(0.0, dot(-normal, ray)), 7.0);
float d = length(artifactOffset - p);
const float r = 14.0;
float atten = clamp(1.0 - (d * d) / (r * r), 0.0, 1.0);
atten *= atten;
vec3 point = vec3(0.75, 0.55, 0.45) * atten * (1.0 + fresnel) * 0.07;
vec3 ambient = dot(normal, normalize(vec3(0.0, 1.0, 0.5))) * max(fresnel, 0.06) * vec3(0.1, 0.5, 1.0) * 0.85;
float fog = smootherstep(25.0, 6.0, fogDist) * (1.0 / (fogDist * 0.1));
return color + (point + ambient) * fog;
}
vec3 waterNormal(vec2 p, float eps) {
vec2 h = vec2(eps, 0.0);
return normalize(vec3(heightmap(p - h.xy) - heightmap(p + h.xy), eps * 2.0, heightmap(p - h.yx) - heightmap(p + h.yx)));
}
void marchWater(vec3 eye, vec3 ray, inout vec4 color) {
const vec3 planeNorm = vec3(0.0, 1.0, 0.0);
const float depth = 3.0;
float ceilDist = intersectPlane(eye, ray, vec3(0.0, 0.0, 0.0), planeNorm);
vec3 normal = vec3(0.0);
if (dot(planeNorm, ray) > -0.05) {
color = vec4(vec3(0.0), CAM_FAR);
return;
}
float height = 0.0;
vec3 rayPos = eye + ray * ceilDist;
for (int i = 0; i < 30; i++) {
height = heightmap(rayPos.xz) * depth - depth;
if (rayPos.y - height < 0.1) {
color.w = distance(rayPos, eye);
vec3 normPos = (eye + ray * color.w);
color.rgb = waterColor(ray, waterNormal(normPos.xz, 0.005), normPos);
return;
}
rayPos += ray * max(rayPos.y - height, 0.1);
}
color = vec4(vec3(0.0), CAM_FAR);
}
vec3 march(vec2 uv, vec3 camPos) {
mat4 vm = viewMatrix(camFwd, camUp);
vec3 ray = (vm * vec4(calcRay(uv, 80.0, resolution.x / resolution.y), 1.0)).xyz;
vec4 color = vec4(BACKGROUND, CAM_FAR);
vec3 waterColor;
marchWater(camPos, ray, color);
marchObjects(camPos, ray, color.w, color);
return color.rgb;
}
float snow(vec2 uv, float scale) {
float w = smootherstep(1.0, 0.0, -uv.y * (scale * 0.01));
if (w < 0.1) return 0.0;
uv += time / scale;
uv.y += time / scale;
uv.x += sin(uv.y + time * 0.125) / scale;
uv *= scale;
vec2 s = floor(uv), f = fract(uv);
return smootherstep(0.0, min(length(0.5 + 0.5 * sin(11.0 * fract(sin((s + scale) * mat2(7.0, 3.0, 6.0, 5.0)) * 5.0)) - f), 3.0), sin(f.x + f.y) * 0.01) * w;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = fragCoord * (vec2(1.0) / resolution.xy);
float s = sin(time);
float c = cos(time);
artifactRotation = mat3(c, 0, s, 0, 1, 0, -s, 0, c) * rotationAlign(vec3(0.0, 1.0, 0.0), vec3(s * 0.2, 1.0, c * 0.2 + 0.3));
artifactOffset = vec3(s * 0.4, c * 0.3 - 1.7, -6.0);
camFwd = vec3(0.0, 0.7 + noise(time * 0.8 + 4.0) * 0.08 - 0.04, 1.0);
camUp = vec3(noise(time * 1.2) * 0.02 - 0.01, 1.0, 0.0);
fragColor = vec4(march(uv, vec3(0.0, 1.9, 1.0)) - (length(uv - 0.5) - 0.3) * 0.05, 1.0);
if (layer_snow) {
vec2 p = fragCoord.xy / resolution.xy;
vec2 uvSnow = (fragCoord.xy * 2.0 - resolution.xy) / min(resolution.x, resolution.y);
fragColor += mix(vec4(vec3(snow(uvSnow, 4.0)), 0.5) + vec4(vec3(snow(uvSnow, 3.0)), 0.5), vec4(0.0), vec4(0.7));
}
}
void main(void) {
gl_FragColor = vColor;
mainImage(gl_FragColor, gl_FragCoord.xy);
}

View File

@@ -1,12 +0,0 @@
#version 100
attribute vec3 position;
attribute vec4 color;
uniform mat4 model;
varying vec4 vColor;
void main(void) {
vColor = color;
gl_Position = model * vec4(position, 1.0);
}

View File

@@ -1,285 +0,0 @@
#version 300 es
precision lowp float;
const float CAM_FAR = 20.0;
const vec3 BACKGROUND = vec3(0.0, 0.0, 0.0);
const float PI = radians(180.0);
uniform float time;
uniform vec2 resolution;
uniform bool layer_snow;
in vec4 vColor;
layout (location = 0) out vec4 fragColor;
vec3 artifactOffset;
mat3 artifactRotation;
vec3 artifactAxis;
vec3 camFwd;
vec3 camUp;
float smootherstep(float edge0, float edge1, float x) {
x = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
return x * x * x * (x * (x * 6.0 - 15.0) + 10.0);
}
float rand(float n) {
n = fract(n * 43758.5453);
n *= n;
return fract(n * 43758.5453);
}
float hash(float n) {
return fract(abs(fract(n) * 43758.5453));
}
float noise(float x) {
float i = floor(x);
float f = fract(x);
float u = f * f * (3.0 - 2.0 * f);
return mix(hash(i), hash(i + 1.0), u);
}
mat4 viewMatrix(vec3 dir, vec3 up) {
vec3 f = normalize(dir);
vec3 s = normalize(cross(f, up));
return mat4(vec4(s, 0.0), vec4(cross(s, f), 0.0), vec4(-f, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
}
mat3 rotationAlign(vec3 d, vec3 z) {
vec3 v = cross(z, d);
float c = dot(z, d);
float k = 1.0 / (1.0 + c);
return mat3(
v.x * v.x * k + c,
v.y * v.x * k - v.z,
v.z * v.x * k + v.y,
v.x * v.y * k + v.z,
v.y * v.y * k + c,
v.z * v.y * k - v.x,
v.x * v.z * k - v.y,
v.y * v.z * k + v.x,
v.z * v.z * k + c
);
}
float intersectPlane(vec3 origin, vec3 direction, vec3 point, vec3 normal) {
return clamp(dot(point - origin, normal) / dot(direction, normal), -1.0, 9991999.0);
}
vec3 calcRay(vec2 uv, float fov, float aspect) {
uv = uv * 2.0 - 1.0;
float d = 1.0 / tan(radians(fov) * 0.5);
return normalize(vec3(aspect * uv.x, uv.y, d));
}
vec2 getWave(vec2 position, vec2 dir, float speed, float frequency, float iTimeshift) {
float x = dot(dir, position) * frequency + iTimeshift * speed;
float wave = exp(sin(x) - 1.0);
float dist = wave * cos(x);
return vec2(wave, -dist);
}
float heightmap(vec2 worldPos) {
const float scale = 0.06;
vec2 p = worldPos * scale;
vec2 p2 = (artifactOffset.xz - vec2(0.0, 1.0)) * scale;
float d = (1.0 - smootherstep(0.0, 1.0, clamp(length(p2 - p) * 1.25, 0.0, 1.0))) * 0.87;
float angle = 0.0;
float freq = 5.0;
float speed = 2.0;
float weight = 1.9;
float wave = 0.0;
float waveScale = 0.0;
vec2 dir;
vec2 res;
for (int i = 0; i < 5; i++) {
dir = vec2(cos(angle), sin(angle));
res = getWave(p, dir, speed, freq, time);
p += dir * res.y * weight * 0.05;
wave += res.x * weight - d;
angle += 12.0;
waveScale += weight;
weight = mix(weight, 0.0, 0.2);
freq *= 1.18;
speed *= 1.06;
}
return wave * (1.0 / waveScale);
}
float octahedron(vec3 p, float s) {
p = abs(p);
return (p.x + p.y + p.z - s) * 0.57735027;
}
void artifact(vec3 p, inout float currDist, inout vec3 glowColor, inout int id) {
p -= artifactOffset;
p = artifactRotation * p;
float dist = octahedron(p, 0.8);
const float glowDist = 4.8;
if (dist < glowDist) {
float d = dist + rand(dist) * 1.7;
glowColor += vec3(0.75, 0.55, 0.45) * clamp(1.0 - pow((d * (1.0 / glowDist)), 5.0), 0.0, 1.0) * 0.035;
}
if (dist < currDist) {
currDist = dist;
id = 1;
}
}
float objects(vec3 p, inout vec3 glowColor, inout int objId) {
float dist = CAM_FAR;
artifact(p, dist, glowColor, objId);
return dist;
}
float artifactDist(vec3 p) {
p -= artifactOffset;
p = artifactRotation * p;
return octahedron(p, 1.2);
}
float objectsDist(vec3 p) {
return artifactDist(p);
}
vec3 objectsNormal(vec3 p, float eps) {
vec2 h = vec2(eps, 0);
return normalize(vec3(artifactDist(p + h.xyy) - artifactDist(p - h.xyy), eps * 2.0, artifactDist(p + h.yyx) - artifactDist(p - h.yyx)));
}
vec3 objectsColor(int id, vec3 normal, vec3 ray) {
return id == 1 ? vec3(0.85, 0.65, 0.55) * mix(0.8, 1.5, dot(normal, normalize(vec3(0.0, 1.0, 0.5))) * 0.5 + 0.5) :
id == 2 ? vec3(0.85, 0.65, 0.55) * 1.5 :
vec3(1.0, 1.0, 0.0);
}
void marchObjects(vec3 eye, vec3 ray, float wDepth, inout vec4 color) {
float dist = 0.0;
int id;
vec3 rayPos = eye;
float depth = CAM_FAR;
for (int i = 0; i < 30; i++) {
dist = objects(rayPos, color.rgb, id);
depth = distance(rayPos, eye);
if (depth > wDepth || dist < 0.01) break;
rayPos += ray * dist;
}
color = dist < 0.01 ? vec4(objectsColor(id, objectsNormal(rayPos, 0.01), ray), depth) : color;
}
vec3 waterColor(vec3 ray, vec3 normal, vec3 p) {
vec3 color = vec3(0.0);
float fogDist = length(p - vec3(0.0, 0.0, -6.0));
float dist = 0.0;
int objId = 0;
vec3 refl = reflect(ray, normal);
vec3 rayPos = p + refl * dist;
if (length(p.xz - artifactOffset.xz) < 8.5 && dot(refl, normalize(artifactOffset - p)) > -0.25) {
for (int i = 0; i < 40; i++) {
dist = objects(rayPos, color, objId);
if (dist < 0.01) {
color = objectsColor(objId, objectsNormal(rayPos, 0.001), rayPos);
break;
}
rayPos += refl * dist;
}
}
float fresnel = 0.04 + 0.9 * pow(1.0 - max(0.0, dot(-normal, ray)), 7.0);
float d = length(artifactOffset - p);
const float r = 14.0;
float atten = clamp(1.0 - (d * d) / (r * r), 0.0, 1.0);
atten *= atten;
vec3 point = vec3(0.75, 0.55, 0.45) * atten * (1.0 + fresnel) * 0.07;
vec3 ambient = dot(normal, normalize(vec3(0.0, 1.0, 0.5))) * max(fresnel, 0.06) * vec3(0.1, 0.5, 1.0) * 0.85;
float fog = smootherstep(25.0, 6.0, fogDist) * (1.0 / (fogDist * 0.1));
return color + (point + ambient) * fog;
}
vec3 waterNormal(vec2 p, float eps) {
vec2 h = vec2(eps, 0.0);
return normalize(vec3(heightmap(p - h.xy) - heightmap(p + h.xy), eps * 2.0, heightmap(p - h.yx) - heightmap(p + h.yx)));
}
void marchWater(vec3 eye, vec3 ray, inout vec4 color) {
const vec3 planeNorm = vec3(0.0, 1.0, 0.0);
const float depth = 3.0;
float ceilDist = intersectPlane(eye, ray, vec3(0.0, 0.0, 0.0), planeNorm);
vec3 normal = vec3(0.0);
if (dot(planeNorm, ray) > -0.05) {
color = vec4(vec3(0.0), CAM_FAR);
return;
}
float height = 0.0;
vec3 rayPos = eye + ray * ceilDist;
for (int i = 0; i < 30; i++) {
height = heightmap(rayPos.xz) * depth - depth;
if (rayPos.y - height < 0.1) {
color.w = distance(rayPos, eye);
vec3 normPos = (eye + ray * color.w);
color.rgb = waterColor(ray, waterNormal(normPos.xz, 0.005), normPos);
return;
}
rayPos += ray * max(rayPos.y - height, 0.1);
}
color = vec4(vec3(0.0), CAM_FAR);
}
vec3 march(vec2 uv, vec3 camPos) {
mat4 vm = viewMatrix(camFwd, camUp);
vec3 ray = (vm * vec4(calcRay(uv, 80.0, resolution.x / resolution.y), 1.0)).xyz;
vec4 color = vec4(BACKGROUND, CAM_FAR);
vec3 waterColor;
marchWater(camPos, ray, color);
marchObjects(camPos, ray, color.w, color);
return color.rgb;
}
float snow(vec2 uv, float scale) {
float w = smootherstep(1.0, 0.0, -uv.y * (scale * 0.01));
if (w < 0.1) return 0.0;
uv += time / scale;
uv.y += time / scale;
uv.x += sin(uv.y + time * 0.125) / scale;
uv *= scale;
vec2 s = floor(uv), f = fract(uv);
return smootherstep(0.0, min(length(0.5 + 0.5 * sin(11.0 * fract(sin((s + scale) * mat2(7.0, 3.0, 6.0, 5.0)) * 5.0)) - f), 3.0), sin(f.x + f.y) * 0.01) * w;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = fragCoord * (vec2(1.0) / resolution.xy);
float s = sin(time);
float c = cos(time);
artifactRotation = mat3(c, 0, s, 0, 1, 0, -s, 0, c) * rotationAlign(vec3(0.0, 1.0, 0.0), vec3(s * 0.2, 1.0, c * 0.2 + 0.3));
artifactOffset = vec3(s * 0.4, c * 0.3 - 1.7, -6.0);
camFwd = vec3(0.0, 0.7 + noise(time * 0.8 + 4.0) * 0.08 - 0.04, 1.0);
camUp = vec3(noise(time * 1.2) * 0.02 - 0.01, 1.0, 0.0);
fragColor = vec4(march(uv, vec3(0.0, 1.9, 1.0)) - (length(uv - 0.5) - 0.3) * 0.05, 1.0);
if (layer_snow) {
vec2 p = fragCoord.xy / resolution.xy;
vec2 uvSnow = (fragCoord.xy * 2.0 - resolution.xy) / min(resolution.x, resolution.y);
fragColor += mix(vec4(vec3(snow(uvSnow, 4.0)), 0.5) + vec4(vec3(snow(uvSnow, 3.0)), 0.5), vec4(0.0), vec4(0.7));
}
}
void main() {
fragColor = vColor;
mainImage(fragColor, gl_FragCoord.xy);
}

View File

@@ -1,12 +0,0 @@
#version 300 es
layout(location = 0) in vec3 position;
layout(location = 1) in vec4 color;
uniform mat4 model;
out vec4 vColor;
void main(void) {
vColor = color;
gl_Position = model * vec4(position, 1.0);
}

View File

@@ -1,268 +0,0 @@
@group(0) @binding(0)
var<uniform> time: f32;
@group(0) @binding(0)
var<uniform> resolution: vec2<f32>;
@fragment
// fn mainImage(@builtin(frag_coord) fragCoord: vec4<f32>) -> @location(0) vec4<f32>
fn fragment_main(fragData: VertexOut) -> @location(0) vec4f {
var uv = fragCoord.xy / resolution;
var s = sin(time);
var c = cos(time);
var artifactRotation: mat3x3<f32> = mat3x3<f32>(
vec3<f32>(c, 0.0, s),
vec3<f32>(0.0, 1.0, 0.0),
vec3<f32>(-s, 0.0, c)
) * rotationAlign(vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(s * 0.2, 1.0, c * 0.2 + 0.3));
var artifactOffset = vec3<f32>(s * 0.4, c * 0.3 - 1.7, -6.0);
var camFwd: vec3<f32> = vec3<f32>(0.0, 0.7 + noise(time * 0.8 + 4.0) * 0.08 - 0.04, 1.0);
var camUp: vec3<f32> = vec3<f32>(noise(time * 1.2) * 0.02 - 0.01, 1.0, 0.0);
var color: vec3<f32> = march(uv, vec3<f32>(0.0, 1.9, 1.0)) - (length(uv - vec2<f32>(0.5)) - 0.3) * 0.05;
return vec4<f32>(color, 1.0);
}
fn smootherstep(edge0: f32, edge1: f32, x: f32) -> f32 {
var t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
}
fn rand(n: f32) -> f32 {
var n1 = fract(n * 43758.5453);
n1 = n1 * n1;
return fract(n1 * 43758.5453);
}
fn hash(n: f32) -> f32 {
return fract(abs(fract(n) * 43758.5453));
}
fn noise(x: f32) -> f32 {
var i = floor(x);
var f = fract(x);
var u = f * f * (3.0 - 2.0 * f);
return mix(hash(i), hash(i + 1.0), u);
}
fn viewMatrix(dir: vec3<f32>, up: vec3<f32>) -> mat4x4<f32> {
var f = normalize(dir);
var s = normalize(cross(f, up));
return mat4x4<f32>(
vec4<f32>(s, 0.0),
vec4<f32>(cross(s, f), 0.0),
vec4<f32>(-f, 0.0),
vec4<f32>(0.0, 0.0, 0.0, 1.0)
);
}
fn rotationAlign(d: vec3<f32>, z: vec3<f32>) -> mat3x3<f32> {
var v = cross(z, d);
var c = dot(z, d);
var k = 1.0 / (1.0 + c);
return mat3x3<f32>(
vec3<f32>(v.x * v.x * k + c, v.y * v.x * k - v.z, v.z * v.x * k + v.y),
vec3<f32>(v.x * v.y * k + v.z, v.y * v.y * k + c, v.z * v.y * k - v.x),
vec3<f32>(v.x * v.z * k - v.y, v.y * v.z * k + v.x, v.z * v.z * k + c)
);
}
fn intersectPlane(origin: vec3<f32>, direction: vec3<f32>, pointt: vec3<f32>, normal: vec3<f32>) -> f32 {
return clamp(dot(pointt - origin, normal) / dot(direction, normal), -1.0, 9991999.0);
}
fn calcRay(uv: vec2<f32>, fov: f32, aspect: f32) -> vec3<f32> {
var uv1 = uv * 2.0 - 1.0;
var d = 1.0 / tan(radians(fov) * 0.5);
return normalize(vec3<f32>(aspect * uv1.x, uv1.y, d));
}
fn getWave(position: vec2<f32>, dir: vec2<f32>, speed: f32, frequency: f32, iTimeshift: f32) -> vec2<f32> {
var x = dot(dir, position) * frequency + iTimeshift * speed;
var wave = exp(sin(x) - 1.0);
var dist = wave * cos(x);
return vec2<f32>(wave, -dist);
}
fn heightmap(worldPos: vec2<f32>) -> f32 {
let scale: f32 = 0.06;
var p = worldPos * scale;
var p2 = (artifactOffset.xz - vec2<f32>(0.0, 1.0)) * scale;
var d = (1.0 - smootherstep(0.0, 1.0, clamp(length(p2 - p) * 1.25, 0.0, 1.0))) * 0.87;
var angle: f32 = 0.0;
var freq: f32 = 5.0;
var speed: f32 = 2.0;
var weight: f32 = 1.9;
var wave: f32 = 0.0;
var waveScale: f32 = 0.0;
var dir: vec2<f32>;
var res: vec2<f32>;
for (var i: i32 = 0; i < 5; i = i + 1) {
dir = vec2<f32>(cos(angle), sin(angle));
res = getWave(p, dir, speed, freq, time);
p = p + dir * res.y * weight * 0.05;
wave = wave + res.x * weight - d;
angle = angle + 12.0;
waveScale = waveScale + weight;
weight = mix(weight, 0.0, 0.2);
freq = freq * 1.18;
speed = speed * 1.06;
}
return wave * (1.0 / waveScale);
}
fn octahedron(p: vec3<f32>, s: f32) -> f32 {
p = abs(p);
return (p.x + p.y + p.z - s) * 0.57735027;
}
fn artifact(p: vec3<f32>, currDist: f32, glowColor: vec3<f32>, id: i32) {
p = p - artifactOffset;
p = artifactRotation * p;
var dist = octahedron(p, 0.8);
let glowDist: f32 = 4.8;
if (dist < glowDist) {
var d = dist + rand(dist) * 1.7;
glowColor = glowColor + vec3<f32>(0.75, 0.55, 0.45) * clamp(1.0 - pow((d * (1.0 / glowDist)), 5.0), 0.0, 1.0) * 0.035;
}
if (dist < currDist) {
currDist = dist;
id = 1;
}
}
fn objects(p: vec3<f32>, glowColor: vec3<f32>, objId: i32) -> f32 {
var dist: f32 = CAM_FAR;
artifact(p, dist, glowColor, objId);
return dist;
}
fn artifactDist(p: vec3<f32>) -> f32 {
p = p - artifactOffset;
p = artifactRotation * p;
return octahedron(p, 1.2);
}
fn objectsDist(p: vec3<f32>) -> f32 {
return artifactDist(p);
}
fn objectsNormal(p: vec3<f32>, eps: f32) -> vec3<f32> {
var h = vec2<f32>(eps, 0.0);
return normalize(vec3<f32>(
artifactDist(p + h.xxx) - artifactDist(p - h.xxx),
eps * 2.0,
artifactDist(p + h.yyy) - artifactDist(p - h.yyy)
));
}
fn objectsColor(id: i32, normal: vec3<f32>, ray: vec3<f32>) -> vec3<f32> {
if (id == 1) { return vec3<f32>(0.85, 0.65, 0.55) * mix(0.8, 1.5, dot(normal, normalize(vec3<f32>(0.0, 1.0, 0.5))) * 0.5 + 0.5); }
if (id == 2) { return vec3<f32>(0.85, 0.65, 0.55) * 1.5; }
return vec3<f32>(1.0, 1.0, 0.0);
}
fn marchObjects(eye: vec3<f32>, ray: vec3<f32>, wDepth: f32, color: vec4<f32>) -> vec4<f32> {
var dist: f32 = 0.0;
var id: i32;
var rayPos: vec3<f32> = eye;
var depth: f32 = CAM_FAR;
for (var i: i32 = 0; i < 30; i = i + 1) {
dist = objects(rayPos, color.rgb, id);
depth = distance(rayPos, eye);
if (depth > wDepth || dist < 0.01) {
break;
}
rayPos = rayPos + ray * dist;
}
if (dist < 0.01) {
return vec4<f32>(objectsColor(id, objectsNormal(rayPos, 0.01), ray), depth);
}
return color;
}
fn waterColor(ray: vec3<f32>, normal: vec3<f32>, p: vec3<f32>) -> vec3<f32> {
var color: vec3<f32> = vec3<f32>(0.0);
var fogDist: f32 = length(p - vec3<f32>(0.0, 0.0, -6.0));
var dist: f32 = 0.0;
var objId: i32 = 0;
var refl: vec3<f32> = reflect(ray, normal);
var rayPos: vec3<f32> = p + refl * dist;
if (length(p.xz - artifactOffset.xz) < 8.5 && dot(refl, normalize(artifactOffset - p)) > -0.25) {
for (var i: i32 = 0; i < 40; i = i + 1) {
dist = objects(rayPos, color, objId);
if (dist < 0.01) {
color = objectsColor(objId, objectsNormal(rayPos, 0.001), rayPos);
break;
}
rayPos = rayPos + refl * dist;
}
}
var fresnel: f32 = 0.04 + 0.9 * pow(1.0 - max(0.0, dot(-normal, ray)), 7.0);
var d: f32 = length(artifactOffset - p);
const r: f32 = 14.0;
var atten: f32 = clamp(1.0 - (d * d) / (r * r), 0.0, 1.0);
atten = atten * atten;
var pointt: vec3<f32> = vec3<f32>(0.75, 0.55, 0.45) * atten * (1.0 + fresnel) * 0.07;
var ambient: vec3<f32> = dot(normal, normalize(vec3<f32>(0.0, 1.0, 0.5))) * max(fresnel, 0.06) * vec3<f32>(0.1, 0.5, 1.0) * 0.85;
var fog: f32 = smootherstep(25.0, 6.0, fogDist) * (1.0 / (fogDist * 0.1));
return color + (pointt + ambient) * fog;
}
fn waterNormal(p: vec2<f32>, eps: f32) -> vec3<f32> {
var h: vec2<f32> = vec2<f32>(eps, 0.0);
return normalize(vec3<f32>(
heightmap(p - h.xy) - heightmap(p + h.xy),
eps * 2.0,
heightmap(p - h.yx) - heightmap(p + h.yx)
));
}
fn marchWater(eye: vec3<f32>, ray: vec3<f32>, color: vec4<f32>) -> vec4<f32> {
let planeNorm: vec3<f32> = vec3<f32>(0.0, 1.0, 0.0);
let depth: f32 = 3.0;
var ceilDist: f32 = intersectPlane(eye, ray, vec3<f32>(0.0, 0.0, 0.0), planeNorm);
var normal: vec3<f32> = vec3<f32>(0.0);
if (dot(planeNorm, ray) > -0.05) {
return vec4<f32>(vec3<f32>(0.0), CAM_FAR);
}
var height: f32 = 0.0;
var rayPos: vec3<f32> = eye + ray * ceilDist;
for (var i: i32 = 0; i < 30; i = i + 1) {
height = heightmap(rayPos.xz) * depth - depth;
if (rayPos.y - height < 0.1) {
color.w = distance(rayPos, eye);
var normPos: vec3<f32> = (eye + ray * color.w);
color.rgb = waterColor(ray, waterNormal(normPos.xz, 0.005), normPos);
return color;
}
rayPos = rayPos + ray * max(rayPos.y - height, 0.1);
}
return vec4<f32>(vec3<f32>(0.0), CAM_FAR);
}
fn march(uv: vec2<f32>, camPos: vec3<f32>) -> vec3<f32> {
var vm: mat4x4<f32> = viewMatrix(camFwd, camUp);
var ray: vec3<f32> = (vm * vec4<f32>(calcRay(uv, 80.0, resolution.x / resolution.y), 1.0)).xyz;
var color: vec4<f32> = vec4<f32>(BACKGROUND, CAM_FAR);
var waterColor: vec3<f32>;
color = marchWater(camPos, ray, color);
color = marchObjects(camPos, ray, color.w, color);
return color.rgb;
}

View File

@@ -1,13 +0,0 @@
struct VertexOut {
@builtin(position) position : vec4f,
@location(0) color : vec4f
};
@vertex
fn vertex_main(@location(0) position: vec4f,
@location(1) color: vec4f) -> VertexOut {
var output : VertexOut;
output.position = position;
output.color = color;
return output;
}

BIN
chimera.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
csharp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
dataforest.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
fedora.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1,90 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" class="theme-dark">
<head>
<meta charset="UTF-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>celesteflare.cc ~ lunary</title>
<meta charset="UTF-8" />
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
<title>i0ur.ing ~ welcome</title>
<link href="assets/imgs/logo.ico" rel="icon" type="image/x-icon"/>
<link href="main.css" rel="stylesheet" type="text/css"/>
<script async defer src="js/init.js" type="module"></script>
</head>
<body>
<canvas id="shader-background"></canvas>
<main>
<div class="flexcard" id="cards">
<img alt="oneko.gif" class="oneko" src="assets/imgs/oneko.gif"/>
<div class="card">
<div id="profile-card"></div>
<div id="navigation">
<button class="navi" id="home" type="button">Home</button>
<button class="navi" id="portfolio" type="button">Portfolio</button>
<button class="navi" id="blog" type="button">Blog</button>
</div>
<div class="contents" id="content"></div>
<hr/>
<div class="socials">
<p>&copy; celesteflare.cc</p>
<a href="https://bsky.app/profile/lunary.celesteflare.cc" target="_blank"><i class="bi bi-cloudy-fill"></i></a>
<a href="https://dc.celesteflare.cc" onclick="navigator.clipboard.writeText(`luzey.zip`)"
target="_blank"><i class="bi bi-discord"></i></a>
<a href="https://www.instagram.com/luzl.r.h" target="_blank"><i class="bi bi-instagram"></i></a>
<a href="https://www.github.com/lunarydess" target="_blank"><i class="bi bi-github"></i></a>
</div>
</div>
</div>
<noscript
style="
position: fixed;
top: 0;
left: 0;
z-index: 10;
height: 100%;
width: 100%;
background-color: hsl(240, 21%, 15%);
user-select: none;
"
>
<div
style="
position: fixed;
inset: 0;
width: fit-content;
height: fit-content;
margin: auto;
"
>
<center>
<h1
style="
color: hsl(226, 64%, 88%);
text-decoration-color: hsl(226, 64%, 88%);
text-align: center;
text-rendering: geometricPrecision;
top: 50%;
"
>
JavaScript is mandatory. &#58;&#39;&#40;<br/>
Did you try it yet?
</h1>
<img
alt="yippee.gif"
src="assets/imgs/yippee.gif" style="
width: 25%;
height: 25%;
image-rendering: optimizeQuality;
image-resolution: 498x;
shape-image-threshold: 10;
image-orientation: from-image;
border-radius: 8px;
outline: hsl(53, 93%, 54%) dotted 2px;
pointer-events: none;
"/>
</center>
</div>
</noscript>
</main>
</body>
</html>
<link rel="stylesheet" href="/main-5f0876a079f6ac58.css" integrity="sha384-Sa1ZWpdYJVb1uRRURVr4pvhoJEjjsLIMS2kyltK9FZdLGYa55YVhC47tdfBRErb+"/>
<script type="module">
import init, * as bindings from '/web_iouring-8ac0645919329a76.js';
const wasm = await init({ module_or_path: '/web_iouring-8ac0645919329a76_bg.wasm' });
window.wasmBindings = bindings;
dispatchEvent(new CustomEvent("TrunkApplicationStarted", {detail: {wasm}}));
</script>
<base href="/" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma/css/bulma.min.css" />
<link rel="modulepreload" href="/web_iouring-8ac0645919329a76.js" crossorigin="anonymous" integrity="sha384-KPFxJ5+Aa+ZaSfSE63zjwFcXMH3E+vHNFH4J/VsMxr1NE1pixe0oIzXatlghxyv6"><link rel="preload" href="/web_iouring-8ac0645919329a76_bg.wasm" crossorigin="anonymous" integrity="sha384-NOiLI21zp8RPEUB76WCpoBPABF5V2fkwSiFS7VhnzEbvHeALjfZEWKWN59UWzI71" as="fetch" type="application/wasm"></head>
</html>

BIN
iouring.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
java.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -1,12 +0,0 @@
import {insertFileContentIn as insert} from "./navigator.js";
import {init as initGallery} from "./gallery.js";
export async function init() {
const naviElements = document.getElementsByClassName("navi");
for (let i = 0; i < naviElements.length; i++) {
const element = naviElements.item(i);
element.addEventListener("click", function () {
insert("content", element.id, element.id === "portfolio" ? initGallery : undefined);
});
}
}

View File

@@ -1,53 +0,0 @@
const maxImages = 3;
const currentImage = {
idx: 1,
name: null,
image: null,
link: null,
desc: null,
};
export async function init() {
const previewImage = document.getElementById("portfolio-preview");
const previewTitle = document.getElementById("portfolio-title");
const previewDesc = document.getElementById("portfolio-description");
document.getElementById("portfolio-preview-previous").onclick = function () {
nextImage(previewImage, previewTitle, previewDesc, false)
}
document.getElementById("portfolio-preview-next").onclick = function () {
nextImage(previewImage, previewTitle, previewDesc, true)
}
fetchImage(previewImage, previewTitle, previewDesc);
}
async function nextImage(image, title, description, forward) {
if (forward) ++currentImage.idx;
else --currentImage.idx;
if (currentImage.idx > maxImages) currentImage.idx = 1;
else if (currentImage.idx < 1) currentImage.idx = maxImages;
fetchImage(image, title, description);
}
async function fetchImage(image, title, description) {
fetch(`assets/projects/${currentImage.idx}.json`)
.then(value => value.json().then(currentImageJson => {
currentImage.name = currentImageJson.name;
currentImage.image = currentImageJson.image;
currentImage.link = currentImageJson.link;
currentImage.desc = currentImageJson.desc;
title.innerText = currentImage.name;
description.innerText = currentImage.desc.map(item => JSON.stringify(item)).join('\n').replaceAll("\"", "");
console.info(description.innerText)
image.setAttribute("src", `assets/projects/${currentImage.image}`);
image.onclick = function () {
window.open(currentImage.link, "_blank").focus();
};
}))
.catch(error => console.error(error));
}

View File

@@ -1,13 +0,0 @@
import {init as initThemes} from "./themes.js";
import {init as initShaders} from "./shaders.js";
import {init as initNavigator} from "./navigator.js";
import {init as initButtons} from "./buttons.js";
async function init() {
initThemes();
initShaders();
initNavigator();
initButtons();
}
init();

View File

@@ -1,25 +0,0 @@
import {init as initGallery} from "./gallery.js";
export async function insertContentIn(destination, content, onload = undefined) {
const element = document.getElementById(destination);
element.innerHTML = content;
if (onload) {
element.onload = onload();
}
}
export async function insertFileContentIn(destination, htmlFile, onload = undefined) {
fetch(`./router/${htmlFile}.html`)
.then(response => response.text())
.then(text => insertContentIn(destination, text, onload))
.then(_ => {
document.title = `lunary ~ ${htmlFile}`
window.history.pushState(null, 'Title', `#${htmlFile}`)
}).catch(error => console.error(error));
}
export async function init() {
let meow = window.location.href.match(/https*:\/\/.*#.+/g);
meow = meow === null || meow === undefined || meow.length === 0 ? "home" : String(meow).substring(String(meow).lastIndexOf("#") + 1);
insertFileContentIn("content", meow, meow === "portfolio" ? initGallery : undefined);
}

View File

@@ -1,234 +0,0 @@
import {isWinter, isXmas} from "./util.js";
export async function init() {
const canvas = document.querySelector("#shader-background");
/* TODO: ...
const wgpuContext = canvas.getContext("webgpu");
if (wgpuContext !== null) {
initWGPU(canvas, wgpuContext);
return;
}*/
let context;
const wglVersion =
(context = (canvas.getContext("experimental-webgl2") || canvas.getContext("webgl2"))) != null ? 2 :
(context = (canvas.getContext("experimental-webgl") || canvas.getContext("webgl"))) != null ? 1 : 0;
if (wglVersion !== 0) initGL(canvas, context, wglVersion);
else console.warn("couldn't find webgpu nor webgl, so no-no fancy shader-background. :(");
}
async function initGL(canvas, context, wglVersion) {
console.info(`detected wgl ${wglVersion} meow`);
const positions = context.createBuffer();
context.bindBuffer(context.ARRAY_BUFFER, positions);
context.bufferData(context.ARRAY_BUFFER, new Float32Array([
-1.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0,
1.0, 1.0, 0.0
]), context.STATIC_DRAW);
const colors = context.createBuffer();
context.bindBuffer(context.ARRAY_BUFFER, colors);
context.bufferData(context.ARRAY_BUFFER, new Float32Array([
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0,
1.0, 1.0, 0.0, 1.0
]), context.STATIC_DRAW);
const elements_indices = [3, 2, 1, 3, 1, 0];
const elements = context.createBuffer();
context.bindBuffer(context.ELEMENT_ARRAY_BUFFER, elements);
context.bufferData(context.ELEMENT_ARRAY_BUFFER, new Uint16Array(elements_indices), context.STATIC_DRAW);
const es_key = wglVersion === 2 ? "es3" : "es1";
const vertex_shader = context.createShader(context.VERTEX_SHADER);
let vertex_shader_code = "";
await fetch(`./assets/shaders/glsl/${es_key}/background/bg.vsh.glsl`)
.then(response => response.text())
.then(text => vertex_shader_code = text)
.catch(error => console.error(error));
context.shaderSource(vertex_shader, vertex_shader_code);
context.compileShader(vertex_shader);
let vertex_shader_log = context.getShaderInfoLog(vertex_shader);
if (vertex_shader_log == null || vertex_shader_log.trim().length === 0) {
console.info("vertex shader loaded.");
} else console.warn(`vertex shader couldn't be loaded! (${vertex_shader_log})`);
let fragment_shader_code = "";
await fetch(`./assets/shaders/glsl/${es_key}/background/bg.fsh.glsl`)
.then(response => response.text())
.then(text => fragment_shader_code = text)
.catch(error => console.error(error));
const fragment_shader = context.createShader(context.FRAGMENT_SHADER);
context.shaderSource(fragment_shader, fragment_shader_code);
context.compileShader(fragment_shader);
let fragment_shader_log = context.getShaderInfoLog(fragment_shader);
if (fragment_shader_log == null || fragment_shader_log.trim().length === 0) {
console.info("fragment shader loaded.");
} else console.warn(`fragment shader couldn't be loaded! (${fragment_shader_log})`);
const shaderProgram = context.createProgram();
context.attachShader(shaderProgram, vertex_shader);
context.attachShader(shaderProgram, fragment_shader);
context.linkProgram(shaderProgram);
if (!context.getProgramParameter(shaderProgram, context.LINK_STATUS))
console.warn("shaders couldn't be linked! :(");
context.useProgram(shaderProgram);
const position = context.getAttribLocation(shaderProgram, "position");
context.enableVertexAttribArray(position);
context.bindBuffer(context.ARRAY_BUFFER, positions);
context.vertexAttribPointer(position, 3, context.FLOAT, false, 0, 0);
const color = context.getAttribLocation(shaderProgram, "color");
context.enableVertexAttribArray(color);
context.bindBuffer(context.ARRAY_BUFFER, colors);
context.vertexAttribPointer(color, 4, context.FLOAT, false, 0, 0);
context.bindBuffer(context.ELEMENT_ARRAY_BUFFER, elements);
context.clearColor(0.0, 0.0, 0.0, 1.0);
context.clear(context.COLOR_BUFFER_BIT);
context.enable(context.DEPTH_TEST);
const unimloc_matrix = context.getUniformLocation(shaderProgram, "model");
const default_matrix = new Float32Array([1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]);
const unimloc_time = context.getUniformLocation(shaderProgram, "time");
const unimloc_res = context.getUniformLocation(shaderProgram, "resolution");
const unimloc_overlay_snow = context.getUniformLocation(shaderProgram, "layer_snow");
function renderLoop(time) {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
context.uniformMatrix4fv(unimloc_matrix, false, default_matrix);
context.uniform1f(unimloc_time, time / 1000.0);
context.uniform2fv(unimloc_res, [canvas.width, canvas.height]);
context.uniform1i(unimloc_overlay_snow, isXmas() || isWinter());
context.viewport(0, 0, canvas.width, canvas.height);
context.clear(context.COLOR_BUFFER_BIT | context.DEPTH_BUFFER_BIT);
context.drawElements(context.TRIANGLES, elements_indices.length, context.UNSIGNED_SHORT, 0);
window.requestAnimationFrame(renderLoop);
};
window.requestAnimationFrame(renderLoop);
}
async function initWGPU(canvas, context) {
console.info("detected wgpu");
async function fallback() {
console.info("falling back to gl");
let context;
const wglVersion = (context = (canvas.getContext("experimental-webgl2") || canvas.getContext("webgl2"))) != null ? 2 : (context = (canvas.getContext("experimental-webgl") || canvas.getContext("webgl"))) != null ? 1 : 0;
if (wglVersion !== 0) initGL(canvas, context, wglVersion);
else console.warn("couldn't find webgl, so no-no fancy shader-background. :(");
}
if (!navigator.gpu) {
console.info("wgpu context exists but is not supported.");
fallback();
return;
}
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
console.warn("couldn't find any adapters");
fallback();
return;
}
const device = await adapter.requestDevice();
if (!device) {
console.warn("couldn't find any devices");
fallback();
return;
}
let shaders = "";
await fetch("./assets/shaders/wgsl/background/bg.vsh.wgsl")
.then(response => response.text())
.then(data => shaders += data)
.catch(error => console.error(error));
shaders += '\n';
await fetch("./assets/shaders/wgsl/background/bg.fsh.wgsl")
.then(response => response.text())
.then(data => shaders += data)
.catch(error => console.error(error));
const shaderModule = device.createShaderModule({code: shaders});
context.configure({
device: device,
format: navigator.gpu.getPreferredCanvasFormat(),
alphaMode: "premultiplied",
});
const vertices = new Float32Array([1.0, 1.0, 1.0, 1.0]);
const vertexBuffer = device.createBuffer({
size: vertices.byteLength,
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(vertexBuffer, 0, vertices, 0, vertices.length);
const renderPipeline = device.createRenderPipeline({
vertex: {
module: shaderModule,
entryPoint: 'vertex_main',
buffers: [{
attributes: [{
shaderLocation: 0, // position
offset: 0,
format: 'float32x4'
}, {
shaderLocation: 1, // color
offset: 16,
format: 'float32x4'
}],
arrayStride: 32,
stepMode: 'vertex'
}]
},
fragment: {
module: shaderModule,
entryPoint: 'fragment_main',
targets: [{
format: navigator.gpu.getPreferredCanvasFormat()
}]
},
primitive: {
topology: 'triangle-list'
},
layout: 'auto'
});
const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass({
colorAttachments: [{
clearValue: {r: 0.0, g: 0.0, b: 0.0, a: 1.0},
loadOp: 'clear',
storeOp: 'store',
view: context.getCurrentTexture().createView()
}]
});
passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.draw(3);
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
}

View File

@@ -1,321 +0,0 @@
import {hexToRgb} from "./util.js";
const constants = {
palettes: {
"Catppuccin": {
"Latte": {
"base": "#EFF1F5",
"mantle": "#E6E9EF",
"crust": "#DCE0E8",
"text": "#4C4F69",
"pink": "#EA76CB",
"purple": "#8839EF",
"red": "#D20F39",
"light_red": "#E64553",
"orange": "#FE640B",
"yellow": "#DF8E1D",
"green": "#40A02B",
"light_green": "#179299",
"blue": "#1E66F5",
"light_blue": "#7287FD"
},
"Frappe": {
"base": "#303446",
"mantle": "#292C3C",
"crust": "#232634",
"text": "#C6D0F5",
"pink": "#F4B8E4",
"purple": "#CA9EE6",
"red": "#E78284",
"light_red": "#EA999C",
"orange": "#EF9F76",
"yellow": "#E5C890",
"green": "#A6D189",
"light_green": "#81C8BE",
"blue": "#8CAAEE",
"light_blue": "#85C1DC"
},
"Macchiato": {
"base": "#24273A",
"mantle": "#1E2030",
"crust": "#181926",
"text": "#CAD3F5",
"pink": "#F5bDE6",
"purple": "#C6A0F6",
"red": "#ED8796",
"light_red": "#EE99A0",
"orange": "#F5A97F",
"yellow": "#EED49F",
"green": "#A6DA95",
"light_green": "#8BD5CA",
"blue": "#8AADF4",
"light_blue": "#7DC4E4"
},
"Mocha": {
"base": "#1E1E2E",
"mantle": "#181825",
"crust": "#11111b",
"text": "#CDD6F4",
"pink": "#F5C2E7",
"purple": "#CBA6F7",
"red": "#F38BA8",
"light_red": "#EBA0AC",
"orange": "#FAB387",
"yellow": "#F9E2AF",
"green": "#A6E3A1",
"light_green": "#94E2D5",
"blue": "#89B4FA",
"light_blue": "#74C7EC"
},
},
"Arc": {
"Dark": {
"base": "#282C34",
"mantle": "#333842",
"crust": "#2C313A",
"text": "#ABB2BF",
"pink": "#FF6AC1",
"purple": "#D38AEA",
"red": "#E06C75",
"light_red": "#BE5046",
"orange": "#DA8548",
"yellow": "#E5D07b",
"green": "#98C379",
"light_green": "#87BF70",
"blue": "#61AFEF",
"light_blue": "#4DB5BD"
},
"Light": {
"base": "#FAFAFA",
"mantle": "#EFF0EB",
"crust": "#F2F3F7",
"text": "#545862",
"pink": "#FF75A0",
"purple": "#BF9EEE",
"red": "#F47067",
"light_red": "#F47067",
"orange": "#FF9F50",
"yellow": "#F7BB47",
"green": "#6BC46D",
"light_green": "#42B983",
"blue": "#58A6FF",
"light_blue": "#73D0FF"
}
},
"Material": {
"Oceanic": {
"base": "#015970",
"mantle": "#0a2540",
"crust": "#0c3b62",
"text": "#ECEFF4",
"pink": "#FF3366",
"purple": "#AD82EC",
"red": "#FF5370",
"light_red": "#F78C6C",
"orange": "#FFCB6B",
"yellow": "#FAB795",
"green": "#C3E88D",
"light_green": "#A3BE8C",
"blue": "#82AAFF",
"light_blue": "#80CBC4",
},
"Darker": {
"base": "#1B262C",
"mantle": "#0F4C75",
"crust": "#3282B8",
"text": "#F7F7FF",
"pink": "#FEB236",
"purple": "#6B5B95",
"red": "#D81159",
"light_red": "#DB504A",
"orange": "#FFBC42",
"yellow": "#F0F66E",
"green": "#0EAD69",
"light_green": "#07BEB8",
"blue": "#0A9396",
"light_blue": "#00B2CA",
},
"Lighter": {
"base": "#EAEAEA",
"mantle": "#DADADA",
"crust": "#C4C4C4",
"text": "#141414",
"pink": "#FFB7C5",
"purple": "#D7A9E3",
"red": "#FF6363",
"light_red": "#FF9A8B",
"orange": "#FFD56D",
"yellow": "#FAED26",
"green": "#A8DF65",
"light_green": "#5DD39E",
"blue": "#7FD1B9",
"light_blue": "#68E8A0",
},
"Palenight": {
"base": "#292D3E",
"mantle": "#444267",
"crust": "#444267",
"text": "#ECEFF4",
"pink": "#FF5370",
"purple": "#C792EA",
"red": "#FF5370",
"light_red": "#F07178",
"orange": "#FFCB6B",
"yellow": "#FFCB6B",
"green": "#C3E88D",
"light_green": "#AED581",
"blue": "#82AAFF",
"light_blue": "#80CBC4",
},
"Deep Ocean": {
"base": "#0D2C54",
"mantle": "#144668",
"crust": "#1A5684",
"text": "#CCE7E9",
"pink": "#F77FBE",
"purple": "#B041FF",
"red": "#FF4E50",
"light_red": "#FF6B6B",
"orange": "#FFA07A",
"yellow": "#FFD97D",
"green": "#00CC99",
"light_green": "#00E0B7",
"blue": "#6D5DFC",
"light_blue": "#1EAE98",
},
"Forest": {
"base": "#0C351E",
"mantle": "#1A512D",
"crust": "#247035",
"text": "#E6F1F2",
"pink": "#FF80AB",
"purple": "#8E44AD",
"red": "#FF5252",
"light_red": "#FF7F7F",
"orange": "#FFB74D",
"yellow": "#FFEE58",
"green": "#2ECC71",
"light_green": "#2BD6A6",
"blue": "#3498DB",
"light_blue": "#5BC0EB",
},
"Sky Blue": {
"base": "#2C3E50",
"mantle": "#3F5772",
"crust": "#4D6E88",
"text": "#EAECEE",
"pink": "#FF6B6B",
"purple": "#A37ACC",
"red": "#FF7F50",
"light_red": "#FF8C68",
"orange": "#FFAB70",
"yellow": "#FFD570",
"green": "#1ABC9C",
"light_green": "#20C9A6",
"blue": "#3498DB",
"light_blue": "#5BC0DE",
},
"Sandy Beach": {
"base": "#FFF1E6",
"mantle": "#FFD9B3",
"crust": "#FFC196",
"text": "#4A4A4A",
"pink": "#FF7675",
"purple": "#D6A2E8",
"red": "#FDAC53",
"light_red": "#FFC85B",
"orange": "#F39C12",
"yellow": "#FFD200",
"green": "#91E763",
"light_green": "#A2DE67",
"blue": "#69C9D0",
"light_blue": "#5ECCDD",
},
"Volcano": {
"base": "#1C1116",
"mantle": "#452B30",
"crust": "#752F35",
"text": "#ECEBE4",
"pink": "#FF7582",
"purple": "#D5A5D1",
"red": "#FF3F34",
"light_red": "#FF6F59",
"orange": "#FF974F",
"yellow": "#FFD166",
"green": "#00818A",
"light_green": "#00A69D",
"blue": "#1B9AAA",
"light_blue": "#6AB187",
},
"Space": {
"base": "#2B2D42",
"mantle": "#3C415C",
"crust": "#495A75",
"text": "#D9F0FF",
"pink": "#FF6A88",
"purple": "#D16DFF",
"red": "#FF7171",
"light_red": "#FF8E8E",
"orange": "#FFAF7B",
"yellow": "#FFD066",
"green": "#76E3D6",
"light_green": "#7EE8FA",
"blue": "#3282B8",
"light_blue": "#74B9FF",
}
}
}
};
export let current = constants.palettes["Arc"]["Dark"];
export async function init() {
document.documentElement.style.setProperty("--background-color", "#000000ff");
// TODO: ... | add theme cookie
set("Catppuccin", "Mocha");
update();
}
export async function set(theme, variant) {
current = constants.palettes[theme][variant];
}
export async function update() {
document.documentElement.style.setProperty('--background-color', current.base);
for (let key in current) {
document.documentElement.style.setProperty(`--${key}`, hexToRgb(current[key]).rgb);
}
}

View File

@@ -1,45 +0,0 @@
export function hexToRgb(hex) {
const
red = parseInt(hex.slice(1, 3), 16),
green = parseInt(hex.slice(3, 5), 16),
blue = parseInt(hex.slice(5, 7), 16);
return {
red: red,
green: green,
blue: blue,
rgb: `${red}, ${green}, ${blue}`,
hex: hex
};
}
export function hexToRgba(hex) {
const
red = parseInt(hex.slice(1, 3), 16),
green = parseInt(hex.slice(3, 5), 16),
blue = parseInt(hex.slice(5, 7), 16),
alpha = parseInt(hex.slice(7, 9), 16);
return {
red: red,
green: green,
blue: blue,
alpha: alpha,
rgb: `${red}, ${green}, ${blue}`,
rgba: `${red}, ${green}, ${blue}, ${alpha}`,
hex: hex
};
}
export function isWinter(date = new Date()) {
const month = date.getMonth();
return month === 11 ? date.getDay() >= 21 : month === 2 ? date.getDay() < 21 : month < 2;
}
export function isXmas(date = new Date()) {
return date.getMonth() === 11 && (date.getDay() >= 24 && date.getDay() <= 26);
}
export function isHalloween(date = new Date()) {
return date.getMonth() === 10 && date.getDay() === 31;
}

BIN
kotlin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

70
main-5f0876a079f6ac58.css Normal file
View File

@@ -0,0 +1,70 @@
@font-face {
font-family: monocraft;
src: url("monocraft.ttf");
}
html * {
font-family: monocraft, monospace !important;
scrollbar-color: hsla(232, 97%, 85%, 0.5) hsla(240, 21.05%, 14.9%, 0.7) !important;
scrollbar-width: thin !important;
scroll-behavior: smooth !important;
}
::-webkit-scrollbar {
display: none;
}
.textarea {
-ms-overflow-style: none !important;
scrollbar-width: none !important;
}
.textarea::-webkit-scrollbar {
display: none !important;
}
.box {
backdrop-filter: blur(4px) !important;
--bulma-box-background-color: #1E1E2E80 !important;
--bulma-shadow-h: 232 !important;
--bulma-shadow-s: 97% !important;
--bulma-shadow-l: 85% !important;
--bulma-shadow: 0 0.5em 1em -0.125em hsla(var(--bulma-shadow-h),
var(--bulma-shadow-s),
var(--bulma-shadow-l),
0.3), 0 0px 0 1px hsla(var(--bulma-shadow-h),
var(--bulma-shadow-s),
var(--bulma-shadow-l),
0.02) !important;
}
.input,
.select select,
.textarea {
backdrop-filter: blur(4px);
--bulma-input-h: 232 !important;
--bulma-input-s: 97% !important;
--bulma-input-l: 85% !important;
--bulma-input-background-h: var(--bulma-input-h) !important;
--bulma-input-background-s: var(--bulma-input-s) !important;
--bulma-input-background-l: var(--bulma-input-l) !important;
background-color: hsla(var(--bulma-input-h), var(--bulma-input-s), var(--bulma-input-background-l), 0.213125) !important;
border-color: hsl(var(--bulma-input-h), var(--bulma-input-s), var(--bulma-input-l)) !important;
}
a.navbar-item,
a.navbar-item:hover {
background-color: transparent !important;
}
::-moz-selection {
background: hsla(232, 97%, 85%, 0.4125) !important;
}
::selection {
background: hsla(232, 97%, 85%, 0.4125) !important;
}
a:hover {
text-decoration: underline !important;
filter: url("post.bloom.svg#process") !important;
}

237
main.css
View File

@@ -1,237 +0,0 @@
@charset "UTF-8";
@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.min.css");
@font-face {
font-family: Comfortaa;
src: url("assets/fonts/comfortaa.ttf");
}
:root {
--base: 0, 0, 0;
--mantle: 0, 0, 0;
--crust: 0, 0, 0;
--text: 0, 0, 0;
--pink: 0, 0, 0;
--purple: 0, 0, 0;
--red: 0, 0, 0;
--light_red: 0, 0, 0;
--orange: 0, 0, 0;
--yellow: 0, 0, 0;
--green: 0, 0, 0;
--light_green: 0, 0, 0;
--blue: 0, 0, 0;
--light_blue: 0, 0, 0;
}
@keyframes home {
/* @formatter:off */
from { opacity: 0 !important; }
to { opacity: 1 !important; }
/* @formatter:on */
}
#profile-card {
margin: 0;
image-orientation: from-image;
image-rendering: optimizeQuality;
image-resolution: from-image;
vertical-align: top;
}
#navigation {
text-align: center;
justify-content: center;
justify-items: center;
justify-self: center;
}
#navigation button {
backdrop-filter: blur(4px);
background-color: rgba(var(--base), 0.6125);
border-color: rgba(var(--blue), 0.0);
border-style: inset !important;
border-width: thin !important;
border-radius: 4px;
text-decoration-color: rgba(var(--text), 1.0);
padding: 2px 4px;
margin-top: 12px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
}
.oneko {
image-rendering: optimizeQuality;
image-orientation: from-image;
image-resolution: from-image;
flex-direction: column;
flex-flow: wrap;
text-align: left;
margin-left: 8px;
align-self: self-start;
justify-content: left;
justify-items: left;
justify-self: left;
float: left;
}
#navigation button:hover {
border-color: rgba(var(--text), 1.0);
}
.card {
backdrop-filter: blur(2px);
background-color: rgba(var(--base), 0.4125);
border-radius: 12px;
}
.card hr {
margin: 0.5em auto !important;
border-style: inset !important;
border-width: thin !important;
}
.socials {
text-align: right;
justify-content: right;
justify-items: right;
justify-self: right;
margin-right: 6px;
}
.socials p {
text-align: left;
font-style: italic;
display: inline;
float: left;
margin-top: 0;
margin-left: 6px;
margin-bottom: 8px;
justify-items: left;
justify-self: left;
}
.socials i {
font-size: large;
margin: 0;
font-kerning: normal;
text-align: center;
text-rendering: optimizeLegibility;
text-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
transition: text-shadow 0.6s cubic-bezier(0.76, 0, 0.24, 1);
}
.socials i:hover {
animation: socials-in 0.6s forwards;
}
.socials i:not(:hover) {
animation: socials-out 0.6s backwards;
}
html * {
font-family: Comfortaa, "Verdana Pro", "Verdana", "Courier New", Courier, monospace;
color: rgb(var(--text));
scrollbar-color: rgb(var(--blue)) rgb(var(--mantle));
scrollbar-width: auto;
z-index: 1 !important;
}
.profile-bio {
text-align: left;
}
canvas {
background-color: var(--base);
display: block !important;
position: absolute !important;
left: 0 !important;
top: 0 !important;
z-index: 0 !important;
}
rect {
shape-rendering: geometricPrecision;
fill-opacity: 0.1;
stroke: black;
stroke-width: 2px;
stroke-opacity: 1;
}
::-webkit-scrollbar-track {
background-color: rgb(var(--mantle));
border-radius: 50%;
}
::-webkit-scrollbar-thumb {
background-color: rgb(var(--blue));
border-radius: 50%;
}
body {
background-color: rgba(var(--base), 1);
z-index: -1;
}
main {
display: flex;
flex-wrap: wrap;
justify-content: center;
flex-direction: column;
align-items: center;
width: auto;
height: max-content;
}
::-moz-selection {
background: rgba(var(--blue), 0.3125);
color: rgb(var(--text));
}
::selection {
background: rgba(var(--blue), 0.3125);
color: rgb(var(--text));
}
.flexcard {
display: flex;
padding: 0;
margin: 0;
height: calc(100vh - 16px);
align-items: center;
justify-content: center;
}
@keyframes socials-in {
from {
text-shadow: 0 0 0 #fff,
0 0 1px #fff;
}
to {
text-shadow: 0 0 4px #fff,
0 0 4px #fff;
}
}
@keyframes socials-out {
from {
text-shadow: 0 0 4px #fff,
0 0 4px #fff;
}
to {
text-shadow: 0 0 0 #fff,
0 0 1px #fff;
}
}
#cards {
flex-direction: column;
flex-flow: column;
}
#contents {
width: 100%;
height: auto;
}

BIN
monocraft.ttf Normal file

Binary file not shown.

BIN
nixos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 B

After

Width:  |  Height:  |  Size: 315 B

25
post.bloom.svg Normal file
View File

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="0" height="0">
<filter id="process">
<feGaussianBlur stdDeviation="1"/>
<feComponentTransfer>
<feFuncR type="identity"/>
<feFuncG type="identity"/>
<feFuncB type="identity"/>
<feFuncA type="identity"/>
</feComponentTransfer>
<feMerge>
<feMergeNode/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
<feGaussianBlur stdDeviation="2"/>
<feMerge>
<feMergeNode/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
<feGaussianBlur stdDeviation="3"/>
<feMerge>
<feMergeNode/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 691 B

BIN
profile.avif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@@ -1,28 +0,0 @@
<div class="home" id="intro"><p>
todo! :)
</p></div>
<style>
@import url(main.css);
.home {
display: flex;
padding: 0;
margin: 0;
text-align: center;
flex-wrap: wrap;
flex-flow: row;
animation: home 1s forwards;
justify-content: center;
justify-items: center;
justify-self: center;
}
#intro p {
background: linear-gradient(135deg,
#55cdfc, #55cdfc,
#f7a8b8, #f7a8b8,
#ffffff, #ffffff);
background-clip: text;
color: transparent;
}
</style>

View File

@@ -1,29 +0,0 @@
<div class="home" id="intro"><p>
Hey, I am Lucielle, welcome. &#9825;<br>
she/her &#8226; developer &#8226; artist<br>
</p></div>
<style>
@import url(main.css);
.home {
display: flex;
padding: 0;
margin: 0;
text-align: center;
flex-wrap: wrap;
flex-flow: row;
animation: home 1s forwards;
justify-content: center;
justify-items: center;
justify-self: center;
}
#intro p {
background: linear-gradient(135deg,
#55cdfc, #55cdfc,
#f7a8b8, #f7a8b8,
#ffffff, #ffffff);
background-clip: text;
color: transparent;
}
</style>

View File

@@ -1,91 +0,0 @@
<div class="portfolio">
<img alt="waow.png" height="180" id="portfolio-preview" src="" width="320"/>
<div id="portfolio-navi">
<p id="portfolio-title"></p>
<div id="portfolio-navi-btns">
<button id="portfolio-preview-previous" type="button">&lt;</button>
<button id="portfolio-preview-next" type="button">&gt;</button>
</div>
</div>
<p id="portfolio-description"></p>
</div>
<style>
@import url(main.css);
.portfolio {
display: flex;
padding: 0;
margin: 0;
text-align: center;
flex-direction: column;
flex-flow: column;
animation: home 1s forwards;
justify-content: center;
justify-items: center;
justify-self: center;
}
#portfolio-preview {
image-rendering: optimizeQuality;
image-orientation: from-image;
image-resolution: from-image;
margin-top: 12px;
}
.portfolio button {
backdrop-filter: blur(4px);
background-color: rgba(var(--base), 0.6125);
border-color: rgba(var(--blue), 0.0);
border-style: inset !important;
border-width: thin !important;
border-radius: 4px;
text-decoration-color: rgba(var(--text), 1.0);
padding: 2px 4px;
margin-top: 12px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
}
.portfolio button:hover {
border-color: rgba(var(--text), 1.0);
}
#portfolio-title {
text-align: left;
margin-left: 12px;
}
#portfolio-description {
flex-direction: row;
flex-flow: wrap;
justify-content: space-around;
text-align: left;
margin-top: 0;
max-width: 320px;
}
#portfolio-navi {
display: flex;
flex-direction: column;
flex-flow: wrap;
justify-content: space-between;
}
#portfolio-navi-btns {
display: flex;
flex-direction: column;
flex-flow: wrap;
justify-content: right;
}
#portfolio-navi-btns button {
margin-left: 2px;
}
.portfolio button {
width: 20px;
height: 20px;
}
</style>

BIN
rust.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
servfail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
void.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
wasm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.