diff --git a/.gitignore b/.gitignore index 97ba621..bd6126c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ dist/ pkg/ target/ Cargo.lock -bulma.min.css diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d47d104..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: '3' -services: - web: - build: ./ - ports: - - "8080:8080" diff --git a/index.html b/index.html index c92de83..4de0ed2 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + @@ -7,6 +7,7 @@ i0ur.ing ~ welcome + @@ -30,8 +31,7 @@ - - + diff --git a/justfile b/justfile index 48b4a71..5c8fd8f 100644 --- a/justfile +++ b/justfile @@ -7,9 +7,7 @@ install: cargo install --locked wasm-pack trunk --force debug: - rm bulma.min.css && curl --proto '=https' --tlsv1.3 -LO https://cdn.jsdelivr.net/npm/bulma/css/bulma.min.css trunk serve build: - rm bulma.min.css && curl --proto '=https' --tlsv1.3 -LO https://cdn.jsdelivr.net/npm/bulma/css/bulma.min.css trunk build --release diff --git a/main.scss b/main.scss index 68fc74a..585ae14 100644 --- a/main.scss +++ b/main.scss @@ -27,49 +27,18 @@ html * { .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; } .card { backdrop-filter: blur(4px) !important; - --bulma-card-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; + background-color: white, 0.213125 !important; + border-color: white !important; } a.navbar-item, diff --git a/public/misc/404.png b/public/misc/404.png new file mode 100644 index 0000000..2882f03 Binary files /dev/null and b/public/misc/404.png differ diff --git a/public/misc/profile.avif b/public/misc/profile.avif index 4a0b5c3..b5bdd4b 100644 Binary files a/public/misc/profile.avif and b/public/misc/profile.avif differ diff --git a/public/shaders/es3/bg.frag b/public/shaders/es3/bg.frag index 1359e64..3230ee1 100644 --- a/public/shaders/es3/bg.frag +++ b/public/shaders/es3/bg.frag @@ -4,8 +4,6 @@ precision highp 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; @@ -19,48 +17,42 @@ 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)); + return fract(sin(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); + return mix(rand(i), rand(i + 1.0), f * f * (3.0 - 2.0 * f)); } 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)); + vec3 u = cross(s, f); + + return mat4( + vec4(s, 0.0), + vec4(u, 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); + + float k_vx = v.x * k; + float k_vy = v.y * k; + float k_vz = v.z * k; + 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 + k_vx * v.x + c, k_vx * v.y - v.z, k_vx * v.z + v.y, + k_vy * v.x + v.z, k_vy * v.y + c, k_vy * v.z - v.x, + k_vz * v.x - v.y, k_vz * v.y + v.x, k_vz * v.z + c ); } @@ -74,48 +66,10 @@ vec3 calcRay(vec2 uv, float fov, float aspect) { 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) { + const float factor = 0.57735027; p = abs(p); - return (p.x + p.y + p.z - s) * 0.57735027; + return (p.x + p.y + p.z - s) * factor; } void artifact(vec3 p, inout float currDist, inout vec3 glowColor, inout int id) { @@ -145,10 +99,6 @@ float artifactDist(vec3 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))); @@ -174,96 +124,41 @@ void marchObjects(vec3 eye, vec3 ray, float wDepth, inout vec4 color) { 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)); + float w = smoothstep(1.0, 0.0, -uv.y * (scale * 0.01)); if (w < 0.1) return 0.0; - uv += time / scale; - uv.y += time / scale; + + float timeScale = time / scale; + uv += vec2(timeScale, timeScale); 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; + + vec2 s = floor(uv); + vec2 f = fract(uv); + + float sinValueX = sin((s.x + scale) * 7.0) * 5.0; + float sinValueY = sin((s.y + scale) * 5.0) * 5.0; + float combinedSinValue = sinValueX + sinValueY; + + float lengthValue = length(0.5 + 0.5 * sin(11.0 * fract(combinedSinValue)) - f); + + return smoothstep(0.0, min(lengthValue, 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); - + vec2 uv = fragCoord / 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); @@ -273,9 +168,8 @@ void mainImage(out vec4 fragColor, in vec2 fragCoord) { 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)); + vec2 uvSnow = (fragCoord * 2.0 - resolution.xy) / min(resolution.x, resolution.y); + fragColor += vec4(vec3(snow(uvSnow, 4.0)), 0.5) * 0.7; } } diff --git a/src/main.rs b/src/main.rs index 18742e9..5ad6393 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,18 +2,19 @@ use js_sys::Float32Array; use log::{info, warn}; use std::cell::RefCell; use std::sync::Arc; -use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; -use web_sys::{window, HtmlCanvasElement, WebGl2RenderingContext as GL2}; +use wasm_bindgen::prelude::*; +use web_sys::{HtmlCanvasElement, WebGl2RenderingContext as GL2, window}; use yew::prelude::*; use yew_router::prelude::*; mod pages; use crate::pages::about::About; +use crate::pages::blog::author::Author; +use crate::pages::blog::authors::Authors; use crate::pages::blog::entries::Entries; use crate::pages::blog::entry::Entry; -use crate::pages::blog::authors::Authors; -use crate::pages::blog::author::Author; +use crate::pages::findme::FindMe; use crate::pages::projects::Projects; use pages::not_found::PageNotFound; @@ -34,6 +35,9 @@ pub enum Route { #[at("/projects")] Projects, + #[at("/findme")] + FindMe, + #[not_found] #[at("/404")] NotFound, @@ -53,7 +57,10 @@ impl Component for App { type Properties = (); fn create(_ctx: &Context) -> Self { - Self { node_ref: NodeRef::default(), navbar_active: false } + Self { + node_ref: NodeRef::default(), + navbar_active: false, + } } fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { @@ -68,115 +75,132 @@ impl Component for App { fn view(&self, _ctx: &Context) -> Html { html! { <> - -
+ +
- -
render={switch} /> -
-
{ self.view_header(_ctx) }
-
-
{ self.view_footer() }
-
+ flex-direction: row !important; + align-items: center; + max-width: 100vw !important; + filter: url(post.bloom.svg#process) !important; + "> +

{r"-»{ "}

+ to={Route::About}> + {r"about"} + > + /*

{r"."}

+ to={Route::Entries}> + {r"blog"} + >*/ +

{r"."}

+ to={Route::FindMe}> + {r"findme"} + > +

{r"."}

+ to={Route::Projects}> + {r"projects"} + > +

{r" }«-"}

+ +
render={switch} />
+ + } } fn rendered(&mut self, _ctx: &Context, first_render: bool) { - if first_render { self.view_canvas(); } + if first_render { + self.view_canvas(); + } } } fn switch(routes: Route) -> Html { match routes { - Route::About => { html! { } } + Route::About => { + html! { } + } - Route::Entries => { html! { } } - Route::Entry { id } => { html! { } } - Route::Authors => { html! { } } - Route::Author { id } => { html! { } } + Route::Entries => { + html! { } + } + Route::Entry { id } => { + html! { } + } + Route::Authors => { + html! { } + } + Route::Author { id } => { + html! { } + } - Route::Projects => { html! { } } - Route::NotFound => { html! { } } + Route::FindMe => { + html! { } + } + + Route::Projects => { + html! { } + } + Route::NotFound => { + html! { } + } } } impl App { - fn view_header(&self, _ctx: &Context) -> Html { - let active_class = if self.navbar_active { "is-active" } else { "" }; - html! { - - } + fn view_list(&self, _ctx: &Context) -> Html { + html! {} } - fn view_footer(&self) -> Html { + fn view_buttons(&self) -> Html { html! { <> -
-
+
servfail + " href="https://i0ur.ing/">iouring wasm + " href="https://webassembly.org/">wasm servfail + " href="https://beta.servfail.network/">servfail dataforest + " href="https://www.dataforest.net/en/">dataforest fedora + " href="https://fedoraproject.org/">fedora artix + " href="https://artixlinux.org/">artix nixos + " href="https://nixos.org/">nixos void + " href="https://chimera-linux.org/">void void + " href="https://voidlinux.org/">void rust + " href="https://www.rust-lang.org/">rust csharp + " href="https://dotnet.microsoft.com/en-us/">csharp kotlin + " href="https://kotlinlang.org/">kotlin java + " href="https://www.java.com/">java aqueer + ">aqueer
@@ -251,27 +282,37 @@ impl App { let canvas = self.node_ref.cast::().unwrap(); let gl = canvas - .get_context("webgl2") - .unwrap_or(canvas.get_context("webgl").unwrap()) - .unwrap().dyn_into::().unwrap(); + .get_context("webgl2") + .unwrap_or(canvas.get_context("webgl").unwrap()) + .unwrap() + .dyn_into::() + .unwrap(); let vertex_buffer = gl.create_buffer().unwrap(); gl.bind_buffer(GL2::ARRAY_BUFFER, Some(&vertex_buffer)); - gl.buffer_data_with_array_buffer_view(GL2::ARRAY_BUFFER, &Float32Array::from(vec![ - -1.0, 1.0, 0.0, - -1.0, -1.0, 0.0, - 1.0, -1.0, 0.0, - 1.0, 1.0, 0.0 - ].as_slice()), GL2::STATIC_DRAW); + gl.buffer_data_with_array_buffer_view( + GL2::ARRAY_BUFFER, + &Float32Array::from( + vec![ + -1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, + ] + .as_slice(), + ), + GL2::STATIC_DRAW, + ); let color_buffer = gl.create_buffer().unwrap(); gl.bind_buffer(GL2::ARRAY_BUFFER, Some(&color_buffer)); - gl.buffer_data_with_array_buffer_view(GL2::ARRAY_BUFFER, &Float32Array::from(vec![ - 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 - ].as_slice()), GL2::STATIC_DRAW); + gl.buffer_data_with_array_buffer_view( + GL2::ARRAY_BUFFER, + &Float32Array::from( + vec![ + 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, + ] + .as_slice(), + ), + GL2::STATIC_DRAW, + ); let element_buffer = gl.create_buffer().unwrap(); gl.bind_buffer(GL2::ELEMENT_ARRAY_BUFFER, Some(&element_buffer)); @@ -307,7 +348,11 @@ impl App { gl.attach_shader(&shader_program, &fragment_shader); gl.link_program(&shader_program); - if !gl.get_program_parameter(&shader_program, GL2::LINK_STATUS).as_bool().unwrap() { + if !gl + .get_program_parameter(&shader_program, GL2::LINK_STATUS) + .as_bool() + .unwrap() + { warn!("shader couldn't be linked!"); } gl.use_program(Some(&shader_program)); @@ -328,7 +373,9 @@ impl App { gl.clear_color(0.0, 0.0, 0.0, 1.0); gl.clear(GL2::COLOR_BUFFER_BIT | GL2::DEPTH_BUFFER_BIT); - let default_matrix = vec![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]; + let default_matrix = vec![ + 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, + ]; let unim_matrix = gl.get_uniform_location(&shader_program, "model"); let unim_time = gl.get_uniform_location(&shader_program, "time"); let unim_res = gl.get_uniform_location(&shader_program, "resolution"); @@ -336,11 +383,18 @@ impl App { let mut timestamp = 0.0; gl.uniform1f(unim_time.as_ref(), timestamp / 2000.0); - gl.draw_elements_with_i32(GL2::TRIANGLES, element_indices.len() as i32, GL2::UNSIGNED_SHORT, 0); + gl.draw_elements_with_i32( + GL2::TRIANGLES, + element_indices.len() as i32, + GL2::UNSIGNED_SHORT, + 0, + ); fn request_animation_frame(f: &Closure) { - window().unwrap().request_animation_frame(f.as_ref().unchecked_ref()) - .expect("should register `requestAnimationFrame` OK"); + window() + .unwrap() + .request_animation_frame(f.as_ref().unchecked_ref()) + .expect("should register `requestAnimationFrame` OK"); } let cb = Arc::new(RefCell::new(None)); @@ -355,13 +409,21 @@ impl App { gl.uniform_matrix4fv_with_f32_array(unim_matrix.as_ref(), false, default_matrix.as_slice()); gl.uniform1f(unim_time.as_ref(), timestamp / 2000.0); - gl.uniform2fv_with_f32_array(unim_res.as_ref(), vec![canvas.width() as f32, canvas.height() as f32].as_slice()); + gl.uniform2fv_with_f32_array( + unim_res.as_ref(), + vec![canvas.width() as f32, canvas.height() as f32].as_slice(), + ); gl.uniform1i(unim_overlay_time.as_ref(), 0); // TODO: ... | add is xmas check gl.viewport(0, 0, canvas.width() as i32, canvas.height() as i32); gl.clear(GL2::COLOR_BUFFER_BIT | GL2::DEPTH_BUFFER_BIT); - gl.draw_elements_with_i32(GL2::TRIANGLES, element_indices.len() as i32, GL2::UNSIGNED_SHORT, 0); + gl.draw_elements_with_i32( + GL2::TRIANGLES, + element_indices.len() as i32, + GL2::UNSIGNED_SHORT, + 0, + ); request_animation_frame(cb.borrow().as_ref().unwrap()); } diff --git a/src/pages/about.rs b/src/pages/about.rs index efc0223..e5cb014 100644 --- a/src/pages/about.rs +++ b/src/pages/about.rs @@ -12,28 +12,82 @@ impl Component for About { fn view(&self, _ctx: &Context) -> Html { html! { <> -
- insert pfp here -
-

ket{r" Lucielle R. Hoerner"}

-

-

{r"they/she · transfem"}

-

{r"certified catgirl™"}

-

{r"software engineer"}

+
+ insert pfp here +
+

+ ket{r" lia · they/she · transfemby"}

+

+

{r"certified catgirl™"}

+

{r"software engineer"}

+

{r"professional yapper"}

+

{r"neurospicy and disabled"}

-
-

{r#"about me"#}

-
{r#" - haj! i'm luciel, but you can also just call me lucie. - i have lots of interests including music, cooking, development and learning new things. - in my free-time i mostly work on my private projects or spent time with my partners or online friends. - my knowledge is based on autodidactics and experiences with (former) friends. - looking for an apprenticeship or job atm. because i wasn't able to finish my previous one due to some financial circumstances. - you can find public projects i work on somewhere in the header. - i may or may not update information stated here. - "#} -
+

{r"intro"}

{r#" + name's lia or lucy. we are creating. + trying to provide a safe space in the internet. + our goal's to make this world a better ~ less trashy ~ place. + may sound naive as fuck but fuck it we ball. + audhd (certified) and probably bpd or ptsd. i'm not a psychologist tho. + interact with caution, may bite. + political view's prolly too rad. should be enough to mention i'm social. + figure it yourself. use your brain. + "#}

{r"hobbies"}

{r#" + watching anime, designing something kewl, playing games, starting a new project or just yapping with friends, nearly everything's included. + i especially enjoy cooking or even baking if enough spoons are to avail. + which anime? has to be very specific, i'm really picky and judgy regarding them. + i uh - design stuff when enough creativity is there. nothing specific. maybe just a button, banner, icon or just anything. + has to be something i can somewhat imagine in my fucky-wucky head. + gaymes? gay! no uhh - i play ranging from minecraft and stardew, to puzzly metroidvanias like hollow knight and pseudoregalia, or challenging platformers like celeste, nearly anything. + i also enjoy playing rhythm games like osu! or muse dash. returning to terraria sometimes and also some old-ish games. + projects? you can find public ones in my projects tab. + "#}/*

{r"hobbies"}

{r#" + watching anime, designing something kewl, playing games, starting a new project or just yapping/meeting up with friends, nearly everything's included. + i especially enjoy cooking or even baking if enough spoons are to avail. + which anime? has to be very specific, i'm really picky and judgy regarding them. + i uh - design stuff when enough creativity is there. nothing specific. maybe just a button, banner, icon or just anything. + has to be something i can somewhat imagine in my fucky-wucky head. + gaymes? gay! no uhh - i play ranging from minecraft and stardew, to puzzly metroidvanias like hollow knight and pseudoregalia, or challenging platformers like celeste, nearly anything. + i also enjoy playing rhythm games like osu! or muse dash. returning to terraria sometimes and also some old-ish games. + projects? you can find public ones in my projects tab. + "#}*/

+

} diff --git a/src/pages/findme.rs b/src/pages/findme.rs new file mode 100644 index 0000000..f5f310d --- /dev/null +++ b/src/pages/findme.rs @@ -0,0 +1,67 @@ +use yew::prelude::*; + +pub struct FindMe; +impl Component for FindMe { + type Message = (); + type Properties = (); + + fn create(_ctx: &Context) -> Self { + Self + } + + fn view(&self, _ctx: &Context) -> Html { + html! { + <> +

{r"follow us"}

{" × "}{r"fediverse"}
+ {" × "}{r"bluesky"}
+

{r"write us"}

{r" × matrix » @iouring:hi.stellaris.fyi"}
+ {r" × telegr » @luc1ell3"}
+ {r" × ewcord » @donotusedisc0rdkthxbye"} +

{r"git gud"}

{" × "}{r"my own!!!"}
+ {" × "}{r"the gay one"}
+ {" × "}{r"git of fren"}
+ {" × "}{r"a mountain what"} +

+ + } + } +} diff --git a/src/pages/mod.rs b/src/pages/mod.rs index 83de40a..37486fc 100644 --- a/src/pages/mod.rs +++ b/src/pages/mod.rs @@ -1,5 +1,6 @@ pub mod about; pub mod blog; +pub mod findme; pub mod projects; pub mod not_found; diff --git a/src/pages/not_found.rs b/src/pages/not_found.rs index d430d70..b577b7e 100644 --- a/src/pages/not_found.rs +++ b/src/pages/not_found.rs @@ -11,16 +11,11 @@ impl Component for PageNotFound { } fn view(&self, _ctx: &Context) -> Html { - // TODO: ... | personalize html! { -
-
-
-

{ "Page not found" }

-

{ "Page page does not seem to exist" }

-
-
-
+
+ huh +

{ "what" }

+
} } } diff --git a/src/pages/projects.rs b/src/pages/projects.rs index 3f2ddef..a09c205 100644 --- a/src/pages/projects.rs +++ b/src/pages/projects.rs @@ -25,7 +25,7 @@ impl Projects { html! { <>

{r#"ongoing projects"#}

-