From 2be5579b95027664f0e2b6be40733cb55ea5ab38 Mon Sep 17 00:00:00 2001 From: Kaan Barmore-Genc Date: Fri, 3 May 2024 00:13:12 -0500 Subject: [PATCH] New logo and updated stuff --- .nvmrc | 1 + package-lock.json | 35 ++++++--- src/app.css | 9 ++- src/routes/+layout.svelte | 2 - src/routes/+page.md | 25 +++--- src/routes/Footer.svelte | 20 +---- src/routes/Header.svelte | 37 ++++----- src/routes/TrackingConsent.svelte | 71 ------------------ src/routes/logo.avif | 3 + src/routes/portfolio/+page.md | 57 ++++++++++++++ src/routes/posts/+page.ts | 2 +- ...ct-redux-triggering-too-many-re-renders.md | 2 +- src/typography.css | 48 +++++++----- static/android-chrome-192x192.png | 3 + static/android-chrome-512x512.png | 3 + static/apple-touch-icon.png | 4 +- static/favicon-16x16.png | 4 +- static/favicon-32x32.png | 4 +- static/favicon.ico | Bin 15406 -> 15406 bytes static/favicon.png | 4 +- 20 files changed, 174 insertions(+), 160 deletions(-) create mode 100644 .nvmrc delete mode 100644 src/routes/TrackingConsent.svelte create mode 100644 src/routes/logo.avif create mode 100644 static/android-chrome-192x192.png create mode 100644 static/android-chrome-512x512.png diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a81deba --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.12.2 diff --git a/package-lock.json b/package-lock.json index ecb24a0..77e30e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -130,8 +130,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } @@ -275,9 +276,10 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.27.6", + "version": "1.30.4", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.30.4.tgz", + "integrity": "sha512-JSQIQT6XvdchCRQEm7BABxPC56WP5RYVONAi+09S8tmzeP43fBsRlr95bFmsTQM2RHBldfgQk+jgdnsKI75daA==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "@sveltejs/vite-plugin-svelte": "^2.5.0", "@types/cookie": "^0.5.1", @@ -291,7 +293,7 @@ "set-cookie-parser": "^2.6.0", "sirv": "^2.0.2", "tiny-glob": "^0.2.9", - "undici": "~5.26.2" + "undici": "^5.28.3" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -1412,6 +1414,19 @@ "dev": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "dev": true, @@ -2941,8 +2956,9 @@ } }, "node_modules/undici": { - "version": "5.26.5", - "license": "MIT", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -2989,8 +3005,9 @@ } }, "node_modules/vite": { - "version": "4.5.0", - "license": "MIT", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", diff --git a/src/app.css b/src/app.css index 2959f9c..5bc48b6 100644 --- a/src/app.css +++ b/src/app.css @@ -3,9 +3,9 @@ html { --color-primary-s: 79%; --color-primary-l: 53%; --color-primary: hsl(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l)); - --color-secondary-h: 27; - --color-secondary-s: 96%; - --color-secondary-l: 48%; + --color-secondary-h: 218; + --color-secondary-s: 81%; + --color-secondary-l: 24%; --color-secondary: hsl( var(--color-secondary-h), var(--color-secondary-s), @@ -37,6 +37,9 @@ html { --color-bg-l: 100%; --color-bg: hsl(var(--color-bg-h), var(--color-bg-s), var(--color-bg-l)); + --animation-speed: 0.2s; + --animation-type: ease-in-out; + --size-container: 640px; --size-modal: 480px; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 69c6c4a..6fce00d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -6,10 +6,8 @@ import Spacer from '$lib/Spacer.svelte'; import Footer from './Footer.svelte'; import Header from './Header.svelte'; - import TrackingConsent from './TrackingConsent.svelte'; -
diff --git a/src/routes/+page.md b/src/routes/+page.md index 4066cdf..496bec6 100644 --- a/src/routes/+page.md +++ b/src/routes/+page.md @@ -12,20 +12,21 @@

Kaan Barmore-Genç

-Hi! I'm a Software Engineer, an avid Linux user, an enthusiast of many -programming languages, a home cook, and an amateur cyclist. I'm working at -[Tailwind](https://tailwindapp.com), where I build microservices and user -interfaces alongside an amazing team. +Hi! I'm a software engineer with a diverse technical toolkit: Linux enthusiast, +polyglot programmer, home chef, and (when time allows) an amateur cyclist. +Currently, I'm building microservices and polished UIs at [Tailwind](https://tailwindapp.com) alongside a +fantastic team. -My interests include building web applications, both front and back end. Over -the years I learned and used many programming languages and technologies, -including TypeScript, React, SvelteKit, TailwindCSS, Rust, Docker, SQL, AWS -(DynamoDB, Lambda, EventBridge, ...), and more. +My focus is building seamless web applications, and I excel in +both front-end and back-end development. My experience includes TypeScript, +React, SvelteKit, TailwindCSS, Rust, Docker, SQL, and AWS technologies +(DynamoDB, Lambda, EventBridge, and more). -Outside work I build open source software, available on my [Github profile](https://github.com/SeriousBug). -I showcase some of my proudest projects on my [portfolio](/portfolio). -You can also find my blog here where I talk about software I'm using, stuff I'm working on, or solutions to -problems I've encountered. +I'm an active contributor to the open-source world: check out +my [Github profile](https://github.com/SeriousBug)! For a closer look at my work, +visit my [portfolio](/portfolio) where I +highlight my favorite projects. I sometimes write about the tools +I use or challenges I've solved on my [blog](/posts). I'm always open to feedback, reach out to me through my socials linked below. diff --git a/src/routes/Header.svelte b/src/routes/Header.svelte index 157682e..17c084d 100644 --- a/src/routes/Header.svelte +++ b/src/routes/Header.svelte @@ -1,36 +1,39 @@
- Kaan Barmore-Genç + + + + Blog Portfolio
diff --git a/src/routes/TrackingConsent.svelte b/src/routes/TrackingConsent.svelte deleted file mode 100644 index a055356..0000000 --- a/src/routes/TrackingConsent.svelte +++ /dev/null @@ -1,71 +0,0 @@ - - - -{#if trackingConsent === 'true' || trackingConsent === 'false'} -
Privacy
-{:else} -
-

Privacy Notice

-

- This site would like to collect anonymous usage data to help improve the site. No personal - information is collected, and no cookies are used. Would you consider opting in? -

-
-

- This website is using Ferrite Analytics to collect anonymous usage data. The tracking is done by creating an anonymized, temporary - ID based on your IP address and your browser user agent. This temporary ID will be only used - on this website, it can't track you on other websites. The temporary ID will expire within a - day, your visits across multiple days can't be linked. -

-
- - -
-{/if} - - diff --git a/src/routes/logo.avif b/src/routes/logo.avif new file mode 100644 index 0000000..9647937 --- /dev/null +++ b/src/routes/logo.avif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3550544bc6223ff9968d76d14bb2154d8b654cb6823f0967cd5d110fedc7f14b +size 31591 diff --git a/src/routes/portfolio/+page.md b/src/routes/portfolio/+page.md index e69de29..5094fa4 100644 --- a/src/routes/portfolio/+page.md +++ b/src/routes/portfolio/+page.md @@ -0,0 +1,57 @@ +This page lists the projects that I'm most proud of, and that I'm actively developing and supporting. + +### [Gandi Live Dns Rust ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/gandi-live-dns-rust) ![Docker Pulls](https://img.shields.io/docker/pulls/seriousbug/gandi-live-dns-rust)](https://github.com/SeriousBug/gandi-live-dns-rust) + +A dynamic DNS system that works with Gandi's live DNS feature. Allows you to +host servers without a static IP address by updating DNS records whenever your +IP changes. Flexible deployments through Docker or system packages with systemd +timers. + +### [Cuttlestore ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/cuttlestore) ![Crates.io](https://img.shields.io/crates/d/cuttlestore)](https://github.com/SeriousBug/cuttlestore) + +A generic key-value storage library for Rust. Cuttlestore allows you to write +your code once and run it on many key-value stores. Right now it comes with +support for Redis and Sqlite, with planned support for CouchDB and DynamoDB. + +### [Rust Embed for Web ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/rust-embed-for-web) ![Crates.io](https://img.shields.io/crates/d/rust-embed-for-web)](https://github.com/SeriousBug/rust-embed-for-web) + +Embed files into your Rust executable. You can embed HTML, CSS, JavaScript +files, all your assets into your server to bundle them together. This simplifies +updates as your assets are always guaranteed to update together with your server. + +This started as a fork of an existing project, but became a significant rewrite +of it. It includes many features useful for web servers like precomputed header +values and precompressed file contents. + +### [Rust Embed Responder for Actix Web ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/actix-web-rust-embed-responder) ![Crates.io](https://img.shields.io/crates/d/actix-web-rust-embed-responder)](https://github.com/SeriousBug/actix-web-rust-embed-responder) + +A sibling project to Rust Embed for Web, this is a responder for Actix Web that +efficiently serves your embedded files. It handles cache validation and content +type negotiation, and is built for high performance. + +### [Bulgur Cloud ![GitHub Repo stars](https://img.shields.io/github/stars/bulgur-cloud/bulgur-cloud) ![Docker Pulls](https://img.shields.io/docker/pulls/seriousbug/bulgur-cloud)](https://github.com/bulgur-cloud/bulgur-cloud) + +![](https://media.githubusercontent.com/media/bulgur-cloud/bulgur-cloud.github.io/main/static/img/homepage-screenshot.png) + +An easy to self host cloud file storage and sharing system. It's similar to Google Drive or NextCloud, but effortless to set up and maintain. Built in Rust and TypeScript, using Actix-Web and React Native. + +### [live limit ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/live-limit) ![npm](https://img.shields.io/npm/dt/live-limit)](https://github.com/SeriousBug/live-limit) + +A TypeScript library that can limit the number of concurrent async operations +running at a time. This is useful for making concurrent requests to a server +without overloading your connection. Works with promises, has no dependencies, +and comes under 1kb minzipped. + +### [Query Method Middleware for Actix Web ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/actix-web-query-method-middleware) ![Crates.io](https://img.shields.io/crates/d/actix-web-query-method-middleware)](https://github.com/SeriousBug/actix-web-query-method-middleware) + +Actix Web middleware that allows you to submit HTML forms using methods other +than `POST`. Forms normally can only be submitted through `GET` or `POST` +methods, but this middleware reroutes requests using a query parameter to other +methods. + +### [Http Drogue](https://github.com/SeriousBug/http-drogue) ![GitHub Repo stars](https://img.shields.io/github/stars/SeriousBug/http-drogue) + +![](https://raw.githubusercontent.com/SeriousBug/http-drogue/main/pub/screenshot.png) + +A tiny self-hosted service to download files over http, with support for resuming and restarting failed downloads. +Built with Rust, basic HTML templates using Askama, TailwindCSS, and DaisyUI. Uses no javascript! diff --git a/src/routes/posts/+page.ts b/src/routes/posts/+page.ts index 2b74dc9..04ee721 100644 --- a/src/routes/posts/+page.ts +++ b/src/routes/posts/+page.ts @@ -8,7 +8,7 @@ export async function load() { iterablePostFiles.map(async ([path, resolver]) => { const { metadata } = await resolver(); - const slug = /[^/]*[/](.*)[.]md/.exec(path)?.[1]; + const slug = /[/]([^/]*)[.]md$/.exec(path)?.[1]; if (!slug) throw new Error(`Could not parse slug from path: ${path}`); return { diff --git a/src/routes/posts/2022.09.18.solving-react-redux-triggering-too-many-re-renders.md b/src/routes/posts/2022.09.18.solving-react-redux-triggering-too-many-re-renders.md index 309ced5..2d14037 100644 --- a/src/routes/posts/2022.09.18.solving-react-redux-triggering-too-many-re-renders.md +++ b/src/routes/posts/2022.09.18.solving-react-redux-triggering-too-many-re-renders.md @@ -12,7 +12,7 @@ tags: --- This might be obvious for some, but I was struggling with a performance issue in -[Bulgur Cloud](/portfolio/#bulgur-cloud), my React (well, React Native) based +[Bulgur Cloud](/portfolio), my React (well, React Native) based web application. Bulgur Cloud is an app like Google Drive or NextCloud, and one of the features is that you can upload files. But I noticed that the page would slow down to a crawl and my computers fans would spin up during uploads. It diff --git a/src/typography.css b/src/typography.css index 446cefd..437eb62 100644 --- a/src/typography.css +++ b/src/typography.css @@ -1,47 +1,59 @@ h1 { - font-size: 2.5rem; + font-size: 2.5rem; } h2 { - font-size: 2rem; + font-size: 2rem; } h3 { - font-size: 1.8rem; + font-size: 1.8rem; } h4 { - font-size: 1.5rem; + font-size: 1.5rem; } h5 { - font-size: 1.25rem; + font-size: 1.25rem; } h6 { - font-size: 1.125rem; + font-size: 1.125rem; } a { - color: var(--color-secondary); - text-decoration: none; + color: var(--color-secondary); + font-weight: 600; + text-decoration-color: transparent; + opacity: 0.8; + transition: all var(--animation-speed) var(--animation-type); +} +a:hover, +a:focus-visible { + opacity: 1; + text-decoration-color: unset; } pre { - white-space: pre-wrap; - margin: 1rem; + white-space: pre-wrap; + margin: 1rem; } -h1, h2, h3, h4, h5, h6 { - margin: 1rem 0 2rem 0; - font-weight: bold; +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 1rem 0 2rem 0; + font-weight: bold; } p { - margin: 1.5rem 0; + margin: 1.5rem 0; } li { - margin: 0.5rem 0 0.5rem 2rem; + margin: 0.5rem 0 0.5rem 2rem; } ul li { - list-style-type: "🬙 "; + list-style-type: '🬙 '; } ul li::marker { - font-size: 0.6rem; + font-size: 0.6rem; } - diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png new file mode 100644 index 0000000..c41f4d4 --- /dev/null +++ b/static/android-chrome-192x192.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0abdac4abf33d383c66826e21e03193896b66656c5188c45f3fdb78b0b7f1758 +size 18318 diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png new file mode 100644 index 0000000..6c59064 --- /dev/null +++ b/static/android-chrome-512x512.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73eaabbfb54beb3db0df0be319b0fed7afb8b8bef4bb59185c555308fbaa8a06 +size 81704 diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png index 5bc435c..889e87e 100644 --- a/static/apple-touch-icon.png +++ b/static/apple-touch-icon.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a27ecea2409cc72320fa78dc1de59a0e1ece93ee9a29d35249ac0102604b0dbb -size 7576 +oid sha256:878a6f0fc9d6c50a852c93fe0830d74017e242dabd11d0ed3a9be8c504340f7d +size 16418 diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png index 9f73657..6683510 100644 --- a/static/favicon-16x16.png +++ b/static/favicon-16x16.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af177b7f4dc5ddb5bc3419f25a2aa1015a5db266416673aa9335a6d6f09a02d3 -size 517 +oid sha256:9c49e89b2b99478daaec80a42e6b9e257300c51085017851b74c3924ae170ea5 +size 540 diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png index 40cb9c2..a97ecfd 100644 --- a/static/favicon-32x32.png +++ b/static/favicon-32x32.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fb18b66f0f4f4c77c86c76b2eab2a5cc94ff5040cca9c99487353aa66fbd3d6 -size 1101 +oid sha256:92f5b6f8b4ff978ad0ab911695b555d27fe3fa931a683dc28a8ff7f5c8a25872 +size 1343 diff --git a/static/favicon.ico b/static/favicon.ico index 47de3bfbd6822565522820e1deb23b89a8699d4d..4d0ff6689c7d6a6ee64ae4c2af21f0d116390a1c 100644 GIT binary patch literal 15406 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 literal 15406 zcmeHO2b7f675-r9MeopF(=7MKf0QtDT=^Oa&y1;@0)!)`_JwaU_ockne+eu``^9yd-vUU z-~I1>t7#@JMzdHnzS^{Tv6^Fj)8rD?}=G_8jFFbPxW?R+u( z^PF}rZtHNJZ1Y}3q5M2d<38-m&!Jl%DirOY2frhqx~S&j0koZY4jZ2? z-T{L@ecj+B!I$U7kp9~*mC;R0^ToTZKdYt1TW#VVdIA24x8~5u85yL~PhF5lz+mm9w?;Q%XAsQzxl^CKK&g&;pA~7(azu0)8S8?wCDXU{Vm^BCdLQZ zv+m2MeSfzL{bBs7yzTGQ(a7l;G<=eU)*q|t_D=1G`^|6Fkca2Xzx{lB<}sfN7ZcN- z^mxNtzgV|!ud~(ADTL4nKV#$HaQ?wR1^Qb;nwi(ny=`9SdyM;k;f^_2I>_*Juq>~$ zg-A2Cc_BMAA9tqudrmtRvA)~S6u;2Te!#x#_k(ERh7y|c&0HEkH=CO8wTk`BXk3SQKWo`Ekgl7ZMWbhCQd3JF zJ-oMq5HI-mfBipBVjoG(t=4Yu9@t$j+9$I-&|rT@zx>j8s=XwMQYhinv4NVI&{#iz*W6qN`FwU&LyleTHKVl{Ogphy$;^DNE2J z_5v1_M^wzE{kt|~6vOZ!7yY{`kG>c#z2DCI*(*#&WwoUX5_rhB^L_Pd@a5qKUu zq+{$&u6(D;N85@Q%7pD>EV2)-QvO;V>)ho9H2eMnQr8{&;5#KQ!9-VHZ|O#>^6|g- zmyh>fU1AmEP`?SJe0BZ#^TP8C)(3P1|A@FAZTOyA$>TEWZzLan^3pG*Qc|j!p8a*5 zpbJ+1(NiwMI)EL3KCdK>OuQy+wTV5}6!1V6^!UP`26e-??;m!({f~Nku=3>?Ve|OT zgMWtY8`-q%8_X59+0$~I){cMVD-s1bk_HUV6jB|g=d3Ny+!pF zwSmu;4Isb#%KHt3TrYB}?5BhNjzHhn{_Ws=c0KLnnl^GqM^EZ`n!fA=xspYjOXv&Z z(rN6htblUAbD)B*o^0W|Y&zi{e32{s%3>?IhNn(wy)6b1a8hMQr|3S{TUpFV4V&fGX z;QYGek85A}p##(+fED!yNh|ZFwz@=dhDNrl*GTZgCt>Zwej$4r`v;kKR%P^sAAON? z1`qf)JcD=r<+^Q*oStb|ze2xo@FOq%(q9H~%}1|c#3!0)++6mlEK|iT?}NdAG1vNl zf7~1$Kk8!xYZ64;jJxxM|C9XGYdH9mc`aSuS?hz{pkDDR`*@YFdfyj**pKuhv%aO< z57sg2YgiL=S9Gs)s=Tp(z(0L$Rbh{{t@cy>C-j6G0j{I?oD=*uFsS|2`@Znwd=cug z_{lx*d%vsaHKF6b*{@Ek^2XlyN_zug9rlJn#h=3Ur@y249KTOvQvVfOubNu&=58g1Ps{FKrFB zn_CnoSmxtI0``6MPU1tn~!Ry~A z5PornV?#05WX-}3P;>LIQ>yr7{DArE%cdc7SZDlzxN{Tl$NsqRjC!=xr_p<~1;Q`r zIo3gJi@8qCFcWmF@-f1%zVGcGHB_7%0dMR(E1vJF#bb@E-d{mOzMRHqG4)tC5U<|w zgXYMmPT`Z_R}t$XCX&1&!H+$0*>k17_yYX%ZE<34XXVF=wTIYs>2_PMbAY+N`^gfz zY*d;!J76?l&+>WH5&Z3fKJ(WU`S#;T@IwcXy}qqV)TVJhCpk^GRZC8cIM0jy6X$S^ zFi9Qa9qbzRi+ZwAU$nsop^v(sM2cTxfSqGsc%JLxI1`1sIpS}$%RXo03OPfsO%rFE zBCVyL4Sd1y#M}UTUp^-oUeP|Et(;DDKBMy)wSlM&oJkwt{f7VNA@u*{I+GY8;l