Compare commits

...

29 Commits

Author SHA1 Message Date
c14501061f feat(master): version 2.0.2, changed to use articles in blogs, as well as many other things I do not remember 2025-06-03 22:52:11 -06:00
5e52c6dea1 feat(master): added backend project, fixed dixous 2.0.1, css and added dockerhub option to project card 2025-05-26 18:33:01 -06:00
2806d654a7 feat(blog): done with ui, just need to deploy backend and hookup 2025-05-22 15:11:34 -06:00
9bc7175e5b feat(blog): done with ui, just need to deploy backend and hookup 2025-05-22 15:10:40 -06:00
ff6f6c8424 feat(blog): able to recieve blogs, links scrubbed because mentally ill people exist 2025-05-21 18:02:55 -06:00
e249c1acc2 fix(blog): meta tag that works, I will add the rest of the commented out ones later 2025-05-20 18:00:27 -06:00
f22456a72f feat(dioxus): added meta tags to most pages, now with the blog page 2025-05-20 17:45:04 -06:00
1bd70c4eb2 feat(dioxus): added meta tags to most pages, except the blog page-asaddsasd 2025-05-20 17:44:02 -06:00
bff6a997be feat(dioxus): added backend offline error handling, added titles to each page, and now using stylesheet as it removed content preloading before css 2025-05-20 17:18:20 -06:00
0ec9ee66f2 feat(blogs): Started on blogs page and reading blogs 2025-05-15 17:47:00 -06:00
ff6b56d8c6 feat(home): css layout for home finished 2025-05-15 14:20:04 -06:00
14b4648b57 feat(FUNDING): added funding links to repo 2025-05-14 18:23:26 -06:00
13d3237efb feat(readme): fixed links to repo, and added readme start 2025-05-14 18:20:21 -06:00
c3525b5099 fix(projects): changed url link to the new repo and website links 2025-05-14 18:07:31 -06:00
dc67f71f55 feat(dixous): started groundwork for blogs, UI now more consistent and contact me works 2025-05-14 17:57:24 -06:00
b292bea28b feat(blog): ready to hook up to backend, need to generate blogs page naviagation 2025-05-13 16:34:07 -06:00
3fa74f8fd0 feat(contact-me): added webhook integration into contact me 2025-05-12 17:22:18 -06:00
4f5eff6cdb feat(dioxus): dioxus is not ready for production 2025-05-08 15:30:58 -06:00
3bd2c4041b feat(contact_me): started on new form 2025-05-07 21:30:58 -06:00
fdea3d2f15 feat(dioxusRefresh): version 1 of the site is finished, TODO more projects and additional pages, and backend 2025-04-25 20:18:47 -06:00
03082a1904 feat(dioxus): added all links to navbar, intro finished, and new pages set up. TODO: final img sizing and projects assignment 2025-04-25 16:07:10 -06:00
8ab01ca725 feat(home): homepage finished 2025-04-25 14:03:33 -06:00
05cb8cfc73 feat(dioxus): Stable point, todo change from list to using by category string 2025-04-24 20:01:02 -06:00
b79c109876 revert(helper_fun): made web app unstabel 2025-04-24 18:07:25 -06:00
4d1e45359c feat(CSS): cards, colouration and placement finished for all 3 different supported sizes, phone, 1920p and ultrawide 2025-04-24 11:48:21 -06:00
33c933d455 feat(home): started on home layout, may need to use display:grid 2025-04-23 19:56:45 -06:00
c5fa636b39 feat(dioxus): added all techs/tools to hashmap 2025-04-23 12:27:47 -06:00
c286ebaa5f feat(dioxus): refactored to use more table lookups, ready to start on doubling up everythning 2025-04-23 10:58:22 -06:00
25238dea05 feat(projectcard): halfway done, need to make it so that 2 can be accepted 2025-04-22 17:38:29 -06:00
38 changed files with 3096 additions and 452 deletions

2
.gitea/FUNDING.yml Normal file
View File

@ -0,0 +1,2 @@
github: darkicewolf50
ko_fi: darkicewolf50

2
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,2 @@
github: darkicewolf50
ko_fi: darkicewolf50

View File

@ -3,7 +3,7 @@ name: github pages
on:
push:
branches:
- main
- masasasasdasdasd
jobs:
build-deploy:

315
Cargo.lock generated
View File

@ -402,7 +402,7 @@ dependencies = [
"cocoa-foundation 0.1.2",
"core-foundation 0.9.4",
"core-graphics 0.23.2",
"foreign-types",
"foreign-types 0.5.0",
"libc",
"objc",
]
@ -418,7 +418,7 @@ dependencies = [
"cocoa-foundation 0.2.0",
"core-foundation 0.10.0",
"core-graphics 0.24.0",
"foreign-types",
"foreign-types 0.5.0",
"libc",
"objc",
]
@ -571,7 +571,7 @@ dependencies = [
"bitflags 1.3.2",
"core-foundation 0.9.4",
"core-graphics-types 0.1.3",
"foreign-types",
"foreign-types 0.5.0",
"libc",
]
@ -584,7 +584,7 @@ dependencies = [
"bitflags 2.9.0",
"core-foundation 0.10.0",
"core-graphics-types 0.2.0",
"foreign-types",
"foreign-types 0.5.0",
"libc",
]
@ -796,6 +796,7 @@ dependencies = [
"dioxus-signals",
"dioxus-web",
"manganis",
"serde",
"warnings",
]
@ -1310,6 +1311,15 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]]
name = "encoding_rs"
version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [
"cfg-if",
]
[[package]]
name = "endi"
version = "1.1.0"
@ -1446,6 +1456,15 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foreign-types"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
dependencies = [
"foreign-types-shared 0.1.1",
]
[[package]]
name = "foreign-types"
version = "0.5.0"
@ -1453,7 +1472,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
dependencies = [
"foreign-types-macros",
"foreign-types-shared",
"foreign-types-shared 0.3.1",
]
[[package]]
@ -1467,6 +1486,12 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "foreign-types-shared"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "foreign-types-shared"
version = "0.3.1"
@ -1955,6 +1980,25 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "h2"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5"
dependencies = [
"atomic-waker",
"bytes",
"fnv",
"futures-core",
"futures-sink",
"http",
"indexmap 2.9.0",
"slab",
"tokio",
"tokio-util",
"tracing",
]
[[package]]
name = "half"
version = "2.6.0"
@ -2079,6 +2123,7 @@ dependencies = [
"bytes",
"futures-channel",
"futures-util",
"h2",
"http",
"http-body",
"httparse",
@ -2089,6 +2134,39 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.27.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
dependencies = [
"futures-util",
"http",
"hyper",
"hyper-util",
"rustls",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
]
[[package]]
name = "hyper-tls"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes",
"http-body-util",
"hyper",
"hyper-util",
"native-tls",
"tokio",
"tokio-native-tls",
"tower-service",
]
[[package]]
name = "hyper-util"
version = "0.1.11"
@ -2671,6 +2749,23 @@ dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "native-tls"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
dependencies = [
"libc",
"log",
"openssl",
"openssl-probe",
"openssl-sys",
"schannel",
"security-framework",
"security-framework-sys",
"tempfile",
]
[[package]]
name = "ndk"
version = "0.9.0"
@ -2962,6 +3057,50 @@ version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "openssl"
version = "0.10.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
dependencies = [
"bitflags 2.9.0",
"cfg-if",
"foreign-types 0.3.2",
"libc",
"once_cell",
"openssl-macros",
"openssl-sys",
]
[[package]]
name = "openssl-macros"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.100",
]
[[package]]
name = "openssl-probe"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]]
name = "openssl-sys"
version = "0.9.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "option-ext"
version = "0.2.0"
@ -3040,9 +3179,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "personal_site"
version = "0.1.0"
version = "2.0.2"
dependencies = [
"dioxus",
"reqwest",
"serde",
"serde_json",
]
[[package]]
@ -3490,26 +3632,34 @@ checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
dependencies = [
"base64",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-tls",
"hyper-util",
"ipnet",
"js-sys",
"log",
"mime",
"mime_guess",
"native-tls",
"once_cell",
"percent-encoding",
"pin-project-lite",
"rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"system-configuration",
"tokio",
"tokio-native-tls",
"tokio-util",
"tower",
"tower-service",
@ -3544,6 +3694,20 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "ring"
version = "0.17.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
dependencies = [
"cc",
"cfg-if",
"getrandom 0.2.15",
"libc",
"untrusted",
"windows-sys 0.52.0",
]
[[package]]
name = "rustc-demangle"
version = "0.1.24"
@ -3591,6 +3755,48 @@ dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "rustls"
version = "0.23.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321"
dependencies = [
"once_cell",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
[[package]]
name = "rustls-pemfile"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
dependencies = [
"zeroize",
]
[[package]]
name = "rustls-webpki"
version = "0.103.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437"
dependencies = [
"ring",
"rustls-pki-types",
"untrusted",
]
[[package]]
name = "rustversion"
version = "1.0.20"
@ -3612,12 +3818,44 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "schannel"
version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "security-framework"
version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [
"bitflags 2.9.0",
"core-foundation 0.9.4",
"core-foundation-sys",
"libc",
"security-framework-sys",
]
[[package]]
name = "security-framework-sys"
version = "2.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "selectors"
version = "0.22.0"
@ -4003,6 +4241,12 @@ dependencies = [
"quote",
]
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
version = "1.0.109"
@ -4045,6 +4289,27 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "system-configuration"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags 2.9.0",
"core-foundation 0.9.4",
"system-configuration-sys",
]
[[package]]
name = "system-configuration-sys"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
]
[[package]]
name = "system-deps"
version = "6.2.2"
@ -4234,6 +4499,26 @@ dependencies = [
"syn 2.0.100",
]
[[package]]
name = "tokio-native-tls"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
dependencies = [
"native-tls",
"tokio",
]
[[package]]
name = "tokio-rustls"
version = "0.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
dependencies = [
"rustls",
"tokio",
]
[[package]]
name = "tokio-util"
version = "0.7.14"
@ -4458,6 +4743,12 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
version = "2.5.4"
@ -4500,6 +4791,12 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version-compare"
version = "0.2.0"
@ -5413,6 +5710,12 @@ dependencies = [
"synstructure",
]
[[package]]
name = "zeroize"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
[[package]]
name = "zerovec"
version = "0.10.4"

View File

@ -1,13 +1,15 @@
[package]
name = "personal_site"
version = "0.1.0"
version = "2.0.2"
authors = ["darkicewolf50 <brock.tomlinson@ucalgary.ca>"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
dioxus = { version = "0.6.0", features = ["router"] }
reqwest = { version = "0.12.15", features = ["json"] }
serde_json = "1"
serde = { version = "1.0", features = ["derive"] }
[features]
default = ["web"]
@ -17,7 +19,9 @@ web = ["dioxus/web"]
desktop = ["dioxus/desktop"]
# The feature that are only required for the mobile = ["dioxus/mobile"] build target should be optional and only enabled in the mobile = ["dioxus/mobile"] feature
mobile = ["dioxus/mobile"]
ssg = ["dioxus/fullstack"]
# "fullstack"
[profile]
[profile.wasm-dev]

View File

@ -1,9 +1,15 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 OPR/117.0.0.0" version="26.2.13" pages="2">
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 OPR/118.0.0.0" version="26.2.14" pages="2">
<diagram id="A2VB4WInwAW6etmFULTm" name="Sitemap">
<mxGraphModel dx="1171" dy="812" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<mxGraphModel dx="1756" dy="678" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="tu1BIFyJs8wWzZwwhIyV-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-20" target="tu1BIFyJs8wWzZwwhIyV-24">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-20" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="960" y="420" width="140" height="280" as="geometry" />
</mxCell>
<mxCell id="e5eKH99aat-bvalqy8uv-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;fillColor=#FFFFFF;" parent="1" source="e5eKH99aat-bvalqy8uv-2" target="e5eKH99aat-bvalqy8uv-16" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
@ -13,6 +19,12 @@
<mxCell id="e5eKH99aat-bvalqy8uv-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#000000;fillColor=#FFFFFF;" parent="1" source="e5eKH99aat-bvalqy8uv-2" target="e5eKH99aat-bvalqy8uv-28" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="e5eKH99aat-bvalqy8uv-2" target="tu1BIFyJs8wWzZwwhIyV-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="e5eKH99aat-bvalqy8uv-2" target="tu1BIFyJs8wWzZwwhIyV-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5eKH99aat-bvalqy8uv-2" value="Header" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fontColor=default;fillColor=#FFFFFF;" parent="1" vertex="1">
<mxGeometry x="330" y="110" width="120" height="60" as="geometry" />
</mxCell>
@ -54,7 +66,7 @@
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="Q4E33S6IXDZPZFDXlPAv-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="e5eKH99aat-bvalqy8uv-8" target="Q4E33S6IXDZPZFDXlPAv-1">
<mxCell id="Q4E33S6IXDZPZFDXlPAv-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="e5eKH99aat-bvalqy8uv-8" target="Q4E33S6IXDZPZFDXlPAv-1" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="e5eKH99aat-bvalqy8uv-8" value="Contact" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fontColor=default;fillColor=#FFFFFF;" parent="1" vertex="1">
@ -119,8 +131,7 @@
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="520" y="640" />
<mxPoint x="520" y="990" />
<mxPoint x="450" y="990" />
<mxPoint x="520" y="1000" />
</Array>
</mxGeometry>
</mxCell>
@ -158,7 +169,7 @@
<mxPoint x="-13" y="-113" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="e5eKH99aat-bvalqy8uv-35" value="Email Form" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fontColor=default;fillColor=#FFFFFF;" parent="1" vertex="1">
<mxCell id="e5eKH99aat-bvalqy8uv-35" value="Discord Webhook Form" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fontColor=default;fillColor=#FFFFFF;" parent="1" vertex="1">
<mxGeometry x="640" y="720" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="e5eKH99aat-bvalqy8uv-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#000000;fillColor=#FFFFFF;" parent="1" source="e5eKH99aat-bvalqy8uv-46" target="e5eKH99aat-bvalqy8uv-48" edge="1">
@ -170,8 +181,7 @@
<mxCell id="e5eKH99aat-bvalqy8uv-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#000000;fillColor=#FFFFFF;" parent="1" source="e5eKH99aat-bvalqy8uv-48" target="e5eKH99aat-bvalqy8uv-9" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="850" y="990" />
<mxPoint x="450" y="990" />
<mxPoint x="850" y="1000" />
</Array>
</mxGeometry>
</mxCell>
@ -190,27 +200,172 @@
<mxCell id="e5eKH99aat-bvalqy8uv-50" value="Name" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fontColor=default;fillColor=#FFFFFF;" parent="1" vertex="1">
<mxGeometry x="790" y="640" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="Q4E33S6IXDZPZFDXlPAv-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="Q4E33S6IXDZPZFDXlPAv-1" target="Q4E33S6IXDZPZFDXlPAv-2">
<mxCell id="Q4E33S6IXDZPZFDXlPAv-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="Q4E33S6IXDZPZFDXlPAv-1" target="Q4E33S6IXDZPZFDXlPAv-2" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Q4E33S6IXDZPZFDXlPAv-1" value="Experience" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxCell id="Q4E33S6IXDZPZFDXlPAv-1" value="Experience" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="330" y="790" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="Q4E33S6IXDZPZFDXlPAv-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="Q4E33S6IXDZPZFDXlPAv-2" target="e5eKH99aat-bvalqy8uv-9">
<mxCell id="Q4E33S6IXDZPZFDXlPAv-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="Q4E33S6IXDZPZFDXlPAv-2" target="e5eKH99aat-bvalqy8uv-9" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Q4E33S6IXDZPZFDXlPAv-2" value="Education" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxCell id="Q4E33S6IXDZPZFDXlPAv-2" value="Education" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="330" y="880" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-1" target="tu1BIFyJs8wWzZwwhIyV-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-1" value="Blogs" style="rounded=1;whiteSpace=wrap;html=1;glass=0;shadow=0;" vertex="1" parent="1">
<mxGeometry x="970" y="230" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-4" target="tu1BIFyJs8wWzZwwhIyV-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-4" value="Blog" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1230" y="230" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-6" target="tu1BIFyJs8wWzZwwhIyV-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-11" value="almost&amp;nbsp;&lt;div&gt;no point&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="tu1BIFyJs8wWzZwwhIyV-9">
<mxGeometry x="0.0048" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-66" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-6" target="tu1BIFyJs8wWzZwwhIyV-39">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-6" value="Go back&lt;div&gt;to page 0&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1230" y="320" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-10" target="tu1BIFyJs8wWzZwwhIyV-20">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-23" value="10 per page (default?)" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="tu1BIFyJs8wWzZwwhIyV-22">
<mxGeometry x="-0.0848" y="3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-10" value="Blogs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="320" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-16" target="tu1BIFyJs8wWzZwwhIyV-54">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-16" value="Blog Title" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="430" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-17" target="tu1BIFyJs8wWzZwwhIyV-45">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-17" value="First paragraph" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="570" width="120" height="65" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-24" target="tu1BIFyJs8wWzZwwhIyV-32">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-24" value="&amp;lt;-- Back" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="720" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-26" target="tu1BIFyJs8wWzZwwhIyV-20">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="920" y="535" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-26" value="hidden property,&lt;div&gt;name of file&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="870" y="455" width="100" height="30" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-28" target="e5eKH99aat-bvalqy8uv-9">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1030" y="1000" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-28" value="Next --&amp;gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="880" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-29" target="tu1BIFyJs8wWzZwwhIyV-24">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-29" value="Hide when on id 0" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="1150" y="735" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-32" target="tu1BIFyJs8wWzZwwhIyV-28">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-32" value="Drop down with how many per page?" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="800" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-33" target="tu1BIFyJs8wWzZwwhIyV-32">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-33" value="Options&lt;div&gt;10&lt;div&gt;25&lt;/div&gt;&lt;div&gt;50&lt;/div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="1150" y="815" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-67" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-39" target="tu1BIFyJs8wWzZwwhIyV-41">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-39" value="Title" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1230" y="400" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-70" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-40" target="tu1BIFyJs8wWzZwwhIyV-42">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-40" value="Date" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1230" y="560" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-41" target="tu1BIFyJs8wWzZwwhIyV-40">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-41" value="Tags" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1230" y="480" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-65" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-42" target="e5eKH99aat-bvalqy8uv-9">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1290" y="1000" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-42" value="Main Content" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1230" y="655" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-43" target="tu1BIFyJs8wWzZwwhIyV-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-43" value="Date" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="527.5" width="120" height="25" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-45" value="Read More --&amp;gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="655" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-53" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-51" target="tu1BIFyJs8wWzZwwhIyV-40">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-69" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-51" target="tu1BIFyJs8wWzZwwhIyV-43">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-51" value="If Possible" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="1130" y="575" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="tu1BIFyJs8wWzZwwhIyV-54" target="tu1BIFyJs8wWzZwwhIyV-43">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tu1BIFyJs8wWzZwwhIyV-54" value="Tags" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="970" y="480" width="120" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram name="Wireframes" id="FFrjymaV3XqdK7QtWSJo">
<mxGraphModel dx="2021" dy="812" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<mxGraphModel dx="3163" dy="565" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="cChhu68VZKLTFEiYYllV-33" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-33" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="110" y="2630" width="690" height="400" as="geometry" />
</mxCell>
<mxCell id="UZYojl2K0HOaq53XvgF2-174" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=default;fontColor=#000000;fillColor=#FFFFFF;" parent="1" vertex="1">
@ -758,111 +913,435 @@
<mxCell id="UZYojl2K0HOaq53XvgF2-234" value="Brock Tomlinson Copyright 2025-this year" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=default;" parent="1" vertex="1">
<mxGeometry x="110" y="1920" width="690" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="110" y="2070" width="720" height="500" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-1" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span style=&quot;&quot;&gt;Experience&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-1" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span style=&quot;&quot;&gt;Experience&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" parent="1" vertex="1">
<mxGeometry x="120" y="2090" width="190" height="40" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="187.5" y="2230" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-5" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span&gt;Professional&lt;/span&gt;&lt;/font&gt;&lt;/h2&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-5" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span&gt;Professional&lt;/span&gt;&lt;/font&gt;&lt;/h2&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" parent="1" vertex="1">
<mxGeometry x="187.5" y="2160" width="190" height="40" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-6" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span style=&quot;&quot;&gt;Volunteering&lt;/span&gt;&lt;/font&gt;&lt;/h2&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-6" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span style=&quot;&quot;&gt;Volunteering&lt;/span&gt;&lt;/font&gt;&lt;/h2&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" parent="1" vertex="1">
<mxGeometry x="487.5" y="2160" width="190" height="40" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-10" value="Project Coordinator" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-10" value="Project Coordinator" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="235.5" y="2225" width="112" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-11" value="Project Controller" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-11" value="Project Controller" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="235.5" y="2290" width="97" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-12" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-12" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="187.5" y="2295" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-13" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-13" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="502.5" y="2295" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-14" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-14" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="502.5" y="2230" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-15" value="Software Lead" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-15" value="Software Lead" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="537.5" y="2225" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-18" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-18" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="350" y="2225" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-20" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;UCalgary Baja, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-20" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;UCalgary Baja, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="677.5" y="2225" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-21" value="Software &amp;amp; Logistics Lead" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-21" value="Software &amp;amp; Logistics Lead" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="537.5" y="2290" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-22" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Schulich Off-Road, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-22" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Schulich Off-Road, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="680" y="2290" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-23" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="cChhu68VZKLTFEiYYllV-12" target="cChhu68VZKLTFEiYYllV-3">
<mxCell id="cChhu68VZKLTFEiYYllV-23" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="cChhu68VZKLTFEiYYllV-12" target="cChhu68VZKLTFEiYYllV-3" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="160" y="2390" as="sourcePoint" />
<mxPoint x="210" y="2340" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-24" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="cChhu68VZKLTFEiYYllV-13" target="cChhu68VZKLTFEiYYllV-14">
<mxCell id="cChhu68VZKLTFEiYYllV-24" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="cChhu68VZKLTFEiYYllV-13" target="cChhu68VZKLTFEiYYllV-14" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="208" y="2305" as="sourcePoint" />
<mxPoint x="208" y="2260" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-25" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-25" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="350" y="2290" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-26" value="Chassis Junior" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-26" value="Chassis Junior" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="537.5" y="2360" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-27" value="Labourer" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-27" value="Labourer" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="235.5" y="2360" width="97" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-28" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Ghostrider Storage, BC" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-28" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Ghostrider Storage, BC" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="347.5" y="2360" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-29" value="Staff" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-29" value="Staff" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="235.5" y="2420" width="97" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-30" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Red Deer Farmers Market, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-30" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Red Deer Farmers Market, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="347.5" y="2420" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-31" value="Volunteer Coach, Fundraising" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-31" value="Volunteer Coach, Fundraising" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="537.5" y="2430" width="170" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-32" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span style=&quot;&quot;&gt;Education&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-32" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;font&gt;&lt;span style=&quot;&quot;&gt;Education&lt;/span&gt;&lt;/font&gt;&lt;/h1&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;labelBackgroundColor=default;" parent="1" vertex="1">
<mxGeometry x="115" y="2640" width="190" height="40" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-35" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-35" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="302.5" y="2755" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-36" value="University of Calgary&lt;div&gt;Software Engineering&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-36" value="University of Calgary&lt;div&gt;Software Engineering&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="350.5" y="2750" width="112" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-37" value="The Fernie Academy" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-37" value="The Fernie Academy" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="350.5" y="2815" width="97" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-38" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-38" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="302.5" y="2820" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-39" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-39" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="465" y="2750" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-40" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="cChhu68VZKLTFEiYYllV-38" target="cChhu68VZKLTFEiYYllV-35">
<mxCell id="cChhu68VZKLTFEiYYllV-40" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="cChhu68VZKLTFEiYYllV-38" target="cChhu68VZKLTFEiYYllV-35" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="275" y="2915" as="sourcePoint" />
<mxPoint x="325" y="2865" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="cChhu68VZKLTFEiYYllV-41" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxCell id="cChhu68VZKLTFEiYYllV-41" value="&lt;div&gt;Month 2024 - Month2025&lt;/div&gt;Rally Engineering, AB" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="465" y="2815" width="142.5" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-1" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-830" y="350" width="470" height="1070" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-2" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;Blogs&lt;/span&gt;&lt;/h1&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="-820" y="360" width="180" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-820" y="430" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-4" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-815" y="440" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-5" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-4">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-6" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-4" source="Eo5ilUiPJB2txGRp4zdG-5" target="Eo5ilUiPJB2txGRp4zdG-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="Eo5ilUiPJB2txGRp4zdG-8" target="Eo5ilUiPJB2txGRp4zdG-5">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-843" y="458" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-8" value="1-2svh padding" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-930" y="440" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-10" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="510" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-11" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="550" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="Eo5ilUiPJB2txGRp4zdG-12" target="Eo5ilUiPJB2txGRp4zdG-5">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Eo5ilUiPJB2txGRp4zdG-12" target="Eo5ilUiPJB2txGRp4zdG-11">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-860" y="495" />
<mxPoint x="-860" y="565" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-12" value="Link to blog" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-930" y="480" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-15" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-580" y="430" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-16" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-575" y="440" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-17" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-16">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-18" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-16" source="Eo5ilUiPJB2txGRp4zdG-17" target="Eo5ilUiPJB2txGRp4zdG-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-19" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="510" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-20" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="550" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-21" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-820" y="600" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-22" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-815" y="610" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-23" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-22">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-24" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-22" source="Eo5ilUiPJB2txGRp4zdG-23" target="Eo5ilUiPJB2txGRp4zdG-23">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-25" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="680" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-26" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="720" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-27" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-580" y="600" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-28" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-575" y="610" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-29" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-28">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-30" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-28" source="Eo5ilUiPJB2txGRp4zdG-29" target="Eo5ilUiPJB2txGRp4zdG-29">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-31" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="680" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-32" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="720" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-33" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-820" y="760" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-34" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-815" y="770" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-35" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-34">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-36" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-34" source="Eo5ilUiPJB2txGRp4zdG-35" target="Eo5ilUiPJB2txGRp4zdG-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-37" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="840" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-38" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="880" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-39" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-580" y="760" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-40" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-575" y="770" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-41" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-40">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-42" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-40" source="Eo5ilUiPJB2txGRp4zdG-41" target="Eo5ilUiPJB2txGRp4zdG-41">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-43" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="840" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-44" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="880" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-45" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-820" y="930" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-46" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-815" y="940" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-47" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-46">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-48" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-46" source="Eo5ilUiPJB2txGRp4zdG-47" target="Eo5ilUiPJB2txGRp4zdG-47">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-49" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="1010" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-50" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="1050" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-51" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-580" y="930" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-52" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-575" y="940" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-53" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-52">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-54" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-52" source="Eo5ilUiPJB2txGRp4zdG-53" target="Eo5ilUiPJB2txGRp4zdG-53">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-55" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="1010" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-56" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="1050" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-57" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-820" y="1100" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-58" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-815" y="1110" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-59" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-58">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-60" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-58" source="Eo5ilUiPJB2txGRp4zdG-59" target="Eo5ilUiPJB2txGRp4zdG-59">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-61" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="1180" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-62" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-815" y="1220" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-63" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-580" y="1100" width="200" height="150" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-64" value="" style="group;fillColor=#FFFFFF;strokeColor=none;fontColor=#000000;" vertex="1" connectable="0" parent="1">
<mxGeometry x="-575" y="1110" width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-65" value="&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font style=&quot;font-size: 16px;&quot;&gt;Blog Title&lt;/font&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;margin-top: 0px;&quot;&gt;&lt;span style=&quot;font-size: x-small; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); color: light-dark(rgb(0, 0, 0), rgb(237, 237, 237)); font-weight: normal;&quot;&gt;#tag #tag #tag&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Date&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;background-color: light-dark(#ffffff, var(--ge-dark-color, #121212));&quot;&gt;&lt;font size=&quot;1&quot; style=&quot;&quot;&gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;fillColor=#FFFFFF;strokeColor=none;" vertex="1" parent="Eo5ilUiPJB2txGRp4zdG-64">
<mxGeometry width="185" height="70" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-66" value="" style="endArrow=none;html=1;rounded=0;strokeColor=#9673a6;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;strokeWidth=4;fillColor=#e1d5e7;fontColor=#000000;" edge="1" parent="Eo5ilUiPJB2txGRp4zdG-64" source="Eo5ilUiPJB2txGRp4zdG-65" target="Eo5ilUiPJB2txGRp4zdG-65">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="-140" as="sourcePoint" />
<mxPoint x="-60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-67" value="First Para" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="1180" width="185" height="50" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-68" value="Read More --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-575" y="1220" width="85" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-70" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-830" y="1320" width="470" height="60" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-69" value="&amp;lt;-- Back" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-790" y="1335" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-72" value="Next --&amp;gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-490" y="1335" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-75" value="How Many Per Page" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-680" y="1330" width="75" height="40" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-76" value="Dropdown" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-605" y="1330" width="75" height="40" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="Eo5ilUiPJB2txGRp4zdG-77" target="Eo5ilUiPJB2txGRp4zdG-76">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-77" value="10&lt;div&gt;25&lt;/div&gt;&lt;div&gt;50&lt;/div&gt;&lt;div&gt;100&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="-340" y="1380" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-81" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1" source="Eo5ilUiPJB2txGRp4zdG-3" target="Eo5ilUiPJB2txGRp4zdG-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-930" y="660" as="sourcePoint" />
<mxPoint x="-880" y="610" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-82" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-820" y="750" as="sourcePoint" />
<mxPoint x="-620" y="750" as="targetPoint" />
<Array as="points">
<mxPoint x="-730" y="750" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-83" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-580" y="580" as="sourcePoint" />
<mxPoint x="-380" y="580" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-84" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-580" y="750" as="sourcePoint" />
<mxPoint x="-380" y="750" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-85" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-820" y="910" as="sourcePoint" />
<mxPoint x="-620" y="910" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-86" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-580" y="910" as="sourcePoint" />
<mxPoint x="-380" y="910" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-87" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-820" y="1080" as="sourcePoint" />
<mxPoint x="-620" y="1080" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-88" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-580" y="1080" as="sourcePoint" />
<mxPoint x="-380" y="1080" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-89" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-820" y="1250" as="sourcePoint" />
<mxPoint x="-620" y="1250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="Eo5ilUiPJB2txGRp4zdG-90" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;fillColor=#f5f5f5;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-580" y="1250" as="sourcePoint" />
<mxPoint x="-380" y="1250" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>

111
README.md
View File

@ -1,110 +1,11 @@
<h2 align="left">Hi! My name is Brock and I'm a Full-stack web developer, I am passionate about bringing the backend to low-cost high availably self-hosted servers</h2>
# Personal Site
###
#rust #dioxus
<div align="left">
<img src="https://github-readme-stats.vercel.app/api?username=darkicewolf50&hide_title=false&hide_rank=false&show_icons=true&include_all_commits=true&count_private=true&disable_animations=false&theme=dracula&locale=en&hide_border=false" height="150" alt="stats graph" />
<img src="https://github-readme-stats.vercel.app/api/top-langs?username=darkicewolf50&locale=en&hide_title=false&layout=compact&card_width=320&langs_count=5&theme=dracula&hide_border=false" height="150" alt="languages graph" />
</div>
This is the code that runs my WASM site. It currently uses dioxus 0.6 and eagerly awaiting for diouxs 0.7 as it looks to be a great update.
###
This is a mirror of the repo, live code is hosted [here](https://gitea.bajacloud.duckdns.org/darkicewolf50/personal_site) as well as any testing of the code.
<img align="right" height="120" src="https://media.tenor.com/dEoasElm-JgAAAAM/helldivers2-helldiver.gif" />
###
<div align="left">
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/rust/rust-original.svg" height="30" alt="rust logo" />
<img width="12" />
<img src="https://skillicons.dev/icons?i=actix" height="30" alt="actix logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/python/python-original.svg" height="30" alt="python logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/fastapi/fastapi-original.svg" height="30" alt="fastapi logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg" height="30" alt="react logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/html5/html5-original.svg" height="30" alt="html5 logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/css3/css3-original.svg" height="30" alt="css3 logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/javascript/javascript-original.svg" height="30" alt="javascript logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/c/c-original.svg" height="30" alt="c logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/cplusplus/cplusplus-original.svg" height="30" alt="cplusplus logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/git/git-original.svg" height="30" alt="git logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/github/github-original.svg" height="30" alt="github logo" />
<img width="12" />
<img src="https://cdn.simpleicons.org/githubactions/2088FF" height="30" alt="githubactions logo" />
<img width="12">
<img src="https://img.shields.io/badge/Gitea-34495E?style=for-the-badge&logo=gitea&logoColor=5D9425" height="30" alt="gitea logo">
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/amazonwebservices/amazonwebservices-line-wordmark.svg" height="30" alt="amazonwebservices logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/terraform/terraform-original.svg" height="30" alt="terraform logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/kubernetes/kubernetes-plain.svg" height="30" alt="kubernetes logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/docker/docker-original.svg" height="30" alt="docker logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/raspberrypi/raspberrypi-original.svg" height="30" alt="raspberrypi logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nginx/nginx-original.svg" height="30" alt="nginx logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/vscode/vscode-original.svg" height="30" alt="vscode logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/firefox/firefox-original.svg" height="30" alt="firefox logo" />
<img width="12" />
<img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/markdown/markdown-original.svg" height="30" alt="markdown logo" />
![Prettier](https://img.shields.io/badge/prettier-%23F7B93E.svg?style=for-the-badge&logo=prettier&logoColor=black)
![React Router](https://img.shields.io/badge/React_Router-CA4245?style=for-the-badge&logo=react-router&logoColor=white)
![AmazonDynamoDB](https://img.shields.io/badge/Amazon%20DynamoDB-4053D6?style=for-the-badge&logo=Amazon%20DynamoDB&logoColor=white)
![Cloudflare](https://img.shields.io/badge/Cloudflare-F38020?style=for-the-badge&logo=Cloudflare&logoColor=white)
![Netlify](https://img.shields.io/badge/netlify-%23000000.svg?style=for-the-badge&logo=netlify&logoColor=#00C7B7)
![Vercel](https://img.shields.io/badge/vercel-%23000000.svg?style=for-the-badge&logo=vercel&logoColor=white)
![Pandas](https://img.shields.io/badge/pandas-%23150458.svg?style=for-the-badge&logo=pandas&logoColor=white)
![ESLint](https://img.shields.io/badge/ESLint-4B3263?style=for-the-badge&logo=eslint&logoColor=white)
</div>
###
<div align="left">
<a href="https://www.youtube.com/@darkicewolf50" target="_blank">
<img src="https://img.shields.io/static/v1?message=Youtube&logo=youtube&label=&color=FF0000&logoColor=white&labelColor=&style=for-the-badge" height="35" alt="youtube logo" />
</a>
<a href="https://www.instagram.com/darkicewolf50/" target="_blank">
<img src="https://img.shields.io/static/v1?message=Instagram&logo=instagram&label=&color=E4405F&logoColor=white&labelColor=&style=for-the-badge" height="35" alt="instagram logo" />
</a>
<a href="https://www.instagram.com/darkicewolf50/" target="_blank">
<img src="https://img.shields.io/static/v1?message=Twitch&logo=twitch&label=&color=9146FF&logoColor=white&labelColor=&style=for-the-badge" height="35" alt="twitch logo" />
</a>
<a href="darkicewolf50" target="_blank">
<img src="https://img.shields.io/static/v1?message=Discord&logo=discord&label=&color=7289DA&logoColor=white&labelColor=&style=for-the-badge" height="35" alt="discord logo" />
</a>
<a href="darkicewolf50@gmail.com" target="_blank">
<img src="https://img.shields.io/static/v1?message=Gmail&logo=gmail&label=&color=D14836&logoColor=white&labelColor=&style=for-the-badge" height="35" alt="gmail logo" />
</a>
<a href="https://www.linkedin.com/in/brock-tomlinson/" target="_blank">
<img src="https://img.shields.io/static/v1?message=LinkedIn&logo=linkedin&label=&color=0077B5&logoColor=white&labelColor=&style=for-the-badge" height="35" alt="linkedin logo" />
</a>
</div>
###
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/darkicewolf50/darkicewolf50/output/github-snake-dark.svg" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/darkicewolf50/darkicewolf50/output/github-snake.svg" />
<img alt="github-snake" src="https://raw.githubusercontent.com/darkicewolf50/darkicewolf50/output/github-snake.svg" />
</picture>
###
![](https://github-profile-trophy.vercel.app/?username=darkicewolf50&theme=radical&no-frame=false&no-bg=false&margin-w=4)
![](https://quotes-github-readme.vercel.app/api?type=horizontal&theme=radical)
I do not consent for this code to be used in any training data for AI or AI like products or services.
This is only uploaded here so that I can bet those sweet sweet green marks on my gituhb profile.

2
assets/robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-agent: *
Disallow: /blogs/

View File

@ -1,8 +1,246 @@
#blog {
margin-top: 50px;
margin-top: 2svh;
min-height: 80svh;
}
#blog_info {
display: flex;
flex-direction: column;
}
#blog_info ul {
display: flex;
flex-direction: row;
list-style-type: none;
margin: 0px;
padding: 0px;
}
#blog_info p {
padding: 2svh 0svw;
margin: 0px;
}
#blog_info h1 {
padding: 1svh 1svw;
margin: 2svh 0svw;
margin-bottom: 0px;
font-size: 2em;
}
#blog_info div {
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 1svh 0svw;
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
}
#blog_info div p {
padding: 0px;
margin: 0px;
}
#blog_info div div {
margin: 0px;
padding: 0px;
border: none;
}
#blog_info div p:last-child {
margin-right: 10svh;
}
#blog_info div ul li {
background-color: rgba(128, 0, 128, 0.2);
border-radius: 1rem;
padding: 0.25svh 8px;
margin: 0svh 0.25svh;
text-align: center;
}
#blog a {
color: #ffffff;
margin-top: 50px;
}
color: #ffffff;
margin-top: 50px;
}
#blog a:hover {
color: #91a4d2;
}
#blog_content {
padding: 2svh 0svw;
}
#blog_content h1,
h2,
h3 {
margin: 0px;
padding: 1svh 0svw;
border-bottom: none;
}
#blog_content p {
padding: 1svh 0svw;
margin: 0px;
text-wrap: wrap;
max-width: 25rem;
}
#blog #blog_content p {
max-width: max-content;
}
#blogs {
display: flex;
flex-direction: column;
min-height: 80svh;
}
#blogs h1 {
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
margin: 1svh 2svw;
padding: 1svh 2svw;
display: flex;
}
#blogs button {
/* background-color: transparent; */
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border: none;
color: inherit;
font-size: x-large;
padding: 0.5rem;
margin: 1svh 0svw;
}
#blogs p {
margin: 0px;
padding: 0px;
}
#blogs a {
text-decoration: none;
color: inherit;
}
#blogs a:hover {
color: #91a4d2;
}
.blog-preview {
display: flex;
flex-direction: column;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
padding: 0svh 2svw;
}
#blogs .blog-preview h1 {
border-bottom: none;
padding: 0svh 1svw;
margin: 0px;
}
#blogs .blog-preview button {
width: max-content;
border: 2px solid rgba(145, 164, 210, 0.4);
border-radius: var(--card-border-radius);
font-size: medium;
margin-top: auto;
margin-bottom: 4svh;
}
#blogs .blog-preview #blog_info div p:last-child {
margin-right: 0svh;
margin-left: 2svw;
}
#blogs .blog-preview #blog_info div div p:last-child {
margin: 0svh 0.25svh;
padding: 0.25svh 8px;
}
#blogs-title {
display: flex;
flex-direction: column;
padding-bottom: 1svh;
}
#blogs-title p {
margin: 0svh 1svw;
padding: 1svh 0svw;
}
#blogs-on-show {
display: flex;
flex-flow: row wrap;
justify-content: center;
padding: 2svh 0svw;
row-gap: 2svh;
column-gap: 2svw;
}
#blog-loading {
display: flex;
flex-direction: column;
justify-self: center;
align-self: center;
justify-content: center;
align-items: center;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
padding: 2svh 2svw;
margin: 8svh 0svw;
}
#blog-out-of {
display: flex;
flex-direction: column;
justify-self: center;
align-self: center;
justify-content: center;
align-items: center;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
padding: 2svh 2svw;
margin: 8svh 0svw;
}
#blog-nav {
display: flex;
align-items: center;
position: relative;
padding: 0svh 2svw;
margin-top: auto;
margin-bottom: 2svh;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
}
#blog-nav a:last-child {
margin-left: auto;
}
#blog-nav div {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
justify-self: center;
margin: 1svh 0svw;
padding: 0.5rem;
column-gap: 1svw;
min-height: 28px;
font-size: large;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
position: absolute;
left: 50%;
transform: translateX(-50%);
}

View File

@ -3,20 +3,27 @@
flex-direction: row;
gap: 2svw;
align-items: center;
justify-content: center;
}
#contact img {
flex: 1 1 50%;
border-radius: 100%;
max-width: 40%;
object-fit: cover;
max-height: 250px;
display: block;
background-color: var(--card-background-color);
padding: 0.5rem;
}
#contact div {
display: flex;
justify-content: center;
/* flex: 0 0 48%; */
}
#contact div div {
display: flex;
flex-direction: column;
flex: 1;
flex-basis: auto;
}
#contact div ul {
@ -46,9 +53,14 @@
}
#contact div ul li {
justify-content: flex-start;
border: 1px solid whitesmoke;
/* display: flex;
justify-content: flex-start; */
/* text-wrap: nowrap; */
padding-right: 1svw;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
/* border: 1px solid whitesmoke; */
padding: 0.5svh 1svw;
}
#contact div ul li a {
@ -68,7 +80,29 @@
}
#contact ul li img {
height: 80px;
height: var(--img-width);
width: var(--img-height);
object-fit: contain;
border-radius: 0px;
background-color: transparent;
filter: invert() hue-rotate(180deg);
}
#contact ul li a:hover {
cursor: pointer;
color: #91a4d2;
filter: brightness(0) saturate(100%) invert(65%) sepia(13%) saturate(733%)
hue-rotate(187deg) brightness(95%) contrast(90%);
}
@media only screen and (max-width: 500px) {
#contact ul li img {
display: none;
}
#contact img {
border-radius: 100%;
max-width: 100%;
max-height: 250px;
display: block;
}
}

View File

@ -0,0 +1,100 @@
#ContactMe {
display: flex;
flex-flow: row wrap;
column-gap: 2svw;
row-gap: 4svh;
min-height: 70svh;
margin-top: 4svh;
justify-content: space-evenly;
}
#ContactMe div {
display: flex;
flex-grow: 1;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
flex-direction: column;
justify-content: center;
margin: 2svh 0.5svw;
padding: 2svh 1svw;
max-width: 600px;
}
#ContactMe p {
margin: 2svh 0svw;
padding: 0svh 0svw;
}
/* #contact-me input {
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.5);
border-width: 2px;
padding: 1svh 0svw;
margin: 1svh 0.5svw;
color: inherit;
align-items: start;
}
#contact-me textarea {
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.4);
border-width: 2px;
padding: 1svh 0svw;
margin: 1svh 0.5svw;
color: inherit;
align-items: start;
min-height: 25svh;
} */
/* #contact-me button {
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.5);
padding: 1svh 0svw;
margin: 1svh 0.5svw;
color: inherit;
align-items: start;
background-color: rgba(0, 128, 0, 0.6);
border-color: transparent;
} */
#ContactMe input {
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.5);
border-width: 2px;
padding: 1svh 0svw;
margin: 1svh 0.5svw;
color: inherit;
align-items: start;
}
#ContactMe textarea {
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.4);
border-width: 2px;
padding: 1svh 0svw;
margin: 1svh 0.5svw;
color: inherit;
align-items: start;
min-height: 25svh;
}
#ContactMe button {
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.5);
padding: 1svh 0svw;
margin: 1svh 0.5svw;
color: inherit;
align-items: start;
background-color: rgba(0, 128, 0, 0.6);
border-color: transparent;
}
#ContactMe button:hover {
cursor: pointer;
color: #91a4d2;
background-color: rgba(0, 150, 0, 0.6);
}

View File

@ -3,26 +3,35 @@ footer {
flex-direction: column;
text-align: center;
background-color: #d3d3d3;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
/* background-color: #d3d3d3; */
}
footer div {
display: flex;
flex-direction: row;
flex: 1 1 2;
justify-content: space-between;
justify-content: space-evenly;
}
footer img {
height: 100px;
height: 60px;
filter: invert() hue-rotate(180deg);
}
footer a {
display: flex;
flex-direction: column;
align-items: center;
border: 1px solid lightgray;
text-decoration: none;
color: inherit;
}
footer a:hover {
color: #91a4d2;
cursor: pointer;
filter: brightness(0) saturate(100%) invert(65%) sepia(13%) saturate(733%)
hue-rotate(187deg) brightness(95%) contrast(90%);
}

View File

@ -0,0 +1,88 @@
.experience-comp {
display: flex;
flex-direction: column;
flex-wrap: wrap;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
/* flex-basis: 50%; */
}
.experience-comp h3 {
display: flex;
/* width: 90%; */
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
margin: 2svh 2svw;
padding: 0svh 2svw;
padding-bottom: 1svh;
}
.experience-comp table {
border-collapse: separate;
border-spacing: 0svh 0px;
}
.experience-comp td {
position: relative;
margin: 0px;
padding: 0.25svh 2svw;
}
.experience-comp tr:nth-child(even) td {
padding-bottom: 2svh;
}
.postion {
text-wrap: nowrap;
}
.date-location {
text-wrap: nowrap;
}
.symbol {
position: relative;
width: 30px;
text-align: center;
}
.symbol[rowspan]::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 50%;
width: 2px;
background-color: rgb(120, 120, 120);
transform: translateX(-50%);
z-index: 0;
}
.symbol::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 18px;
height: 18px;
z-index: 1;
}
.dot {
display: inline-block;
background-color: rgb(120, 120, 120);
border-radius: 100%;
width: 16px;
height: 16px;
line-height: 16px;
font-size: 12px;
font-weight: bold;
position: relative;
z-index: 2;
}
tr:nth-child(1) > .symbol::before {
top: 50%;
}
tr:nth-last-child(2) > .symbol::before {
bottom: 50%;
}

73
assets/styling/home.css Normal file
View File

@ -0,0 +1,73 @@
#home-intro {
display: flex;
flex-direction: column;
width: 90%;
margin: 2svh auto;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
}
#home-intro h1 {
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
display: flex;
margin: 2svh 2svw;
padding: 0svh 2svw;
padding-bottom: 1svh;
}
#home-intro p {
margin: 1svh 4svw;
padding: 0svh 2svw;
padding-bottom: 1svh;
}
#home-intro button {
display: block;
background-color: transparent;
color: inherit;
border-radius: var(--card-border-radius);
background-color: var(--card-background-color);
border: 2px solid purple;
padding: 2svh 0.5svw;
margin: 2svh 0svw;
}
#home-intro button {
cursor: pointer;
}
#home-intro a {
text-decoration: none;
color: inherit;
}
#home-intro a:hover {
color: #91a4d2;
}
.technologies {
display: flex;
flex-direction: column;
}
.technologies-cat {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
column-gap: 1svw;
row-gap: 1svh;
}
#experience {
display: flex;
flex-direction: column;
margin-bottom: 4svh;
}
#experience div {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
margin: 4svh 0px;
}

View File

@ -5,13 +5,21 @@ body {
margin: 20px;
}
h2 {
width: 80%;
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
display: flex;
margin: 2svh 2svw;
padding: 0svh 2svw;
padding-bottom: 1svh;
}
/*
p {
width: 90%;
margin: 2svh 0px;
margin-left: 2svw;
padding-left: 2svw;
padding-bottom: 1svh;
}
} */
#hero {
margin: 0;

View File

@ -1,16 +1,16 @@
#navbar {
display: flex;
flex-direction: row;
display: flex;
flex-direction: row;
}
#navbar a {
color: #ffffff;
margin-right: 20px;
text-decoration: none;
transition: color 0.2s ease;
color: #ffffff;
margin-right: 20px;
text-decoration: none;
transition: color 0.2s ease;
}
#navbar a:hover {
cursor: pointer;
color: #91a4d2;
}
cursor: pointer;
color: #91a4d2;
}

View File

@ -0,0 +1,36 @@
#not-found {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 80svh;
}
#not-found h1 {
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
}
#not-found button {
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border: none;
color: inherit;
font-size: xx-large;
padding: 1rem;
}
#not-found button:hover {
cursor: pointer;
}
#not-found a {
text-decoration: none;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
color: inherit;
}
#not-found a:hover {
color: #91a4d2;
}

View File

@ -0,0 +1,122 @@
.project-section {
display: flex;
flex-direction: row;
flex-wrap: wrap;
column-gap: 1svw;
}
.project-card {
flex: 0 1 30%;
margin-bottom: 3svh;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
}
@media only screen and (max-width: 800px) {
.project-card {
flex: 0 1 auto;
}
}
.project-card img {
max-width: 96%;
max-height: 200px;
justify-self: center;
margin: 0svh 1svw;
padding-top: 1svh;
object-fit: contain;
color: transparent;
display: flex;
}
.project-title-info {
display: flex;
flex-direction: row;
height: 50px;
border-bottom: var(--underlineTitle);
border-radius: var(--underlineTitleBorderRadius);
margin: 0px 2svw;
padding: 0px 2svw;
justify-content: space-between;
align-items: center;
flex-wrap: nowrap;
}
.project-title-info h3 {
margin: 0px;
text-align: start;
white-space: nowrap;
align-self: center;
font-weight: normal;
text-wrap: wrap;
border-radius: var(--underlineTitleBorderRadius);
}
.project-title-info img {
height: var(--img-width);
width: var(--img-height);
margin: 1svh 6px;
padding: 0px;
filter: invert() hue-rotate(180deg);
}
.project-title-info #gitea img {
filter: grayscale(100%) invert(100%) brightness(2.5);
}
.project-title-info #dockerhub img {
filter: grayscale(100%) invert(100%) brightness(2.5);
}
.project-title-info img:hover {
filter: brightness(0) saturate(100%) invert(65%) sepia(13%) saturate(733%)
hue-rotate(187deg) brightness(95%) contrast(90%);
}
.project-title-info #gitea img:hover {
filter: grayscale(100%) invert(165%) sepia(15%) saturate(733%)
hue-rotate(185deg) brightness(1.3) contrast(90%) saturate(100%);
}
.project-title-info #dockerhub img:hover {
filter: grayscale(100%) invert(165%) sepia(15%) saturate(733%)
hue-rotate(185deg) brightness(1.3) contrast(90%) saturate(100%);
}
.project-title-info div {
display: flex;
gap: 1svw;
justify-content: flex-end;
border-bottom: none;
}
.project-card div p {
display: flex;
width: 90%;
justify-self: center;
text-align: start;
}
.project-tech-logos {
display: flex;
flex-flow: row wrap;
align-items: center;
align-self: center;
width: 90%;
justify-content: flex-start;
column-gap: 0.5svw;
row-gap: 1svw;
padding-left: 2svw;
padding-bottom: 1svh;
}
.project-tech-logos img {
aspect-ratio: 1;
height: var(--img-width);
width: var(--img-height);
/* flex: 0 1 19%; */
}

View File

@ -1,3 +1,8 @@
:root {
--underlineTitle: 4px solid purple;
--underlineTitleBorderRadius: 4px;
--img-width: 32px;
--img-height: 32px;
--card-background-color: rgba(38, 38, 38, 0.5);
--card-border-radius: 0.5rem;
}

View File

@ -2,45 +2,55 @@
--tech-gap: 4svw;
}
.tech-cat {
border: 1px solid salmon;
display: flex;
flex-direction: column;
padding-left: 4svw;
/* border: 1px solid salmon; */
padding: 0px 1svw;
padding-bottom: 2svh;
margin-bottom: 3svh;
flex: 1 1 auto;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
}
.tech-cat h3 {
display: flex;
width: 80%;
border-bottom: var(--underlineTitle);
margin: 2svh 0px;
margin-left: 4svw;
padding-left: 2svw;
border-radius: var(--underlineTitleBorderRadius);
display: flex;
margin: 2svh 2svw;
padding: 0svh 2svw;
padding-bottom: 1svh;
}
.tech-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: var(--tech-gap);
flex-flow: row wrap;
justify-content: space-evenly;
/* column-gap: 0.5svw; */
row-gap: 1svh;
}
.tech-card {
border: 1px solid whitesmoke;
flex: 0 1 calc(33.3% - var(--tech-gap));
/* border: 1px solid whitesmoke; */
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
margin-bottom: 1svh;
flex: 0 1 70px;
text-decoration: none;
color: inherit;
padding: 0px 0.5svw;
padding-top: 2svh;
padding-bottom: 0.5svh;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
}
.tech-card img {
/* height: 40px; */
padding-top: 2svh;
height: 100px;
width: 32px;
height: 32px;
aspect-ratio: 1;
object-fit: contain;
}
.tech-card progress {
@ -49,6 +59,15 @@
overflow: hidden;
appearance: none;
border-radius: 999px;
justify-self: flex-end;
align-self: center;
}
.tech-card h4 {
margin: 1svh 0.5svw;
width: 80px;
text-align: center;
font-weight: normal;
}
/* for chromium browsers */
@ -62,3 +81,5 @@
background-color: steelblue;
/* border-radius: 999px; */
}
/* 48.19 , 68.58*/

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,113 @@
use dioxus::{document, prelude::*};
#[component]
pub fn Experience(professional_jobs: bool) -> Element {
let experience: [ExpDes; 4] = match professional_jobs {
true => EXPERIENCE_JOBS,
false => EXPERIENCE_VOL,
};
rsx! {
div { class: "experience-comp",
document::Stylesheet { href: asset!("/assets/styling/experience.css") }
if professional_jobs {
h3 { "Professional" }
} else {
h3 { "Volunteering" }
}
table {
colgroup {
col { class: "symbol" }
col { class: "postion" }
col { class: "date-location" }
}
tbody {
for exp in experience {
tr {
td { class: "symbol", rowspan: 2,
span { class: "dot", "" }
}
td { "{exp.postition}" }
td { "{exp.start_month} - {exp.end_month}" }
}
tr {
td { "{exp.company}" }
td { "{exp.location}" }
}
}
}
}
}
}
}
#[derive(PartialEq, Props, Clone)]
struct ExpDes {
pub postition: &'static str,
pub company: &'static str,
pub location: &'static str,
pub start_month: &'static str,
pub end_month: &'static str,
}
const EXPERIENCE_JOBS: [ExpDes; 4] = [
ExpDes {
postition: "Project Coordinator",
company: "Rally Engineering",
location: "Ab",
start_month: "Jan 2025",
end_month: "May 2025",
},
ExpDes {
postition: "Project Controller Student",
company: "Rally Engineering",
location: "Ab",
start_month: "May 2024",
end_month: "Jan 2025",
},
ExpDes {
postition: "Staff",
company: "Red Deer Farmer's Market",
location: "Ab",
start_month: "Mar 2013",
end_month: "Present",
},
ExpDes {
postition: "Staff",
company: "Ghostrider Storage",
location: "BC",
start_month: "Mar 2020",
end_month: "Present",
},
];
const EXPERIENCE_VOL: [ExpDes; 4] = [
ExpDes {
postition: "Software Subteam Lead",
company: "UCalgary Baja",
location: "Ab",
start_month: "Sept 2024",
end_month: "Present",
},
ExpDes {
postition: "Software, Logistics and Business Sub Team Lead",
company: "Schulich Off-Road",
location: "Ab",
start_month: "May 2023",
end_month: "Sept 2024",
},
ExpDes {
postition: "Chassis Junior Member",
company: "Schulich Off-Road",
location: "Ab",
start_month: "Sept 2022",
end_month: "May 2023",
},
ExpDes {
postition: "Coaching with Elk Valley Special Olympics",
company: "Elk Valley Dolphins",
location: "BC",
start_month: "May 2019",
end_month: "May 2019",
},
];

33
src/components/footer.rs Normal file
View File

@ -0,0 +1,33 @@
use std::collections::HashMap;
use crate::helper_fun::{tech_table_lookup, TechDes};
use dioxus::prelude::*;
#[component]
pub fn Ender() -> Element {
// gets list of items to get
let footer_info_to_get = vec!["Github", "Email", "LinkedIn", "Twitch", "Youtube"];
// used so that I dont need to copy paste the same link/info everywhere
let mut footer_info: HashMap<&str, TechDes> = HashMap::new();
for used_tech_item in footer_info_to_get {
footer_info.insert(used_tech_item, *tech_table_lookup(used_tech_item));
}
rsx! {
document::Stylesheet { href: asset!("/assets/styling/ender.css") }
footer {
p { "Brock Tomlinson © 2025" }
div {
for (footer_name , footer_item) in footer_info {
a { href: "{footer_item.project_site}",
img {
src: "{footer_item.tech_logo}",
alt: "{footer_name}'s logo/icon",
}
p { "{footer_name}" }
}
}
}
}
}
}

View File

@ -1,6 +1,6 @@
use dioxus::prelude::*;
const HEADER_SVG: Asset = asset!("/assets/header.svg");
// const HEADER_SVG: Asset = asset!("/assets/header.svg");
#[component]
pub fn Hero() -> Element {
@ -10,14 +10,16 @@ pub fn Hero() -> Element {
// Attributes should be defined in the element before any children
id: "hero",
// After all attributes are defined, we can define child elements and components
img { src: HEADER_SVG, id: "header" }
// img { src: HEADER_SVG, id: "header" }
div { id: "links",
// The RSX macro also supports text nodes surrounded by quotes
a { href: "https://dioxuslabs.com/learn/0.6/", "📚 Learn Dioxus" }
a { href: "https://dioxuslabs.com/awesome", "🚀 Awesome Dioxus" }
a { href: "https://github.com/dioxus-community/", "📡 Community Libraries" }
a { href: "https://github.com/DioxusLabs/sdk", "⚙️ Dioxus Development Kit" }
a { href: "https://marketplace.visualstudio.com/items?itemName=DioxusLabs.dioxus", "💫 VSCode Extension" }
a { href: "https://marketplace.visualstudio.com/items?itemName=DioxusLabs.dioxus",
"💫 VSCode Extension"
}
a { href: "https://discord.gg/XgGxMSkvUM", "👋 Community Discord" }
}
}

View File

@ -2,8 +2,14 @@
//! They can be used to defined common UI elements like buttons, forms, and modals. In this template, we define a Hero
//! component to be used in our app.
mod hero;
pub use hero::Hero;
// mod hero;
// pub use hero::Hero;
mod techs;
pub use techs::{TechCat, TechDes};
pub use techs::TechCat;
mod footer;
pub use footer::Ender;
mod experience;
pub use experience::Experience;

View File

@ -1,17 +1,13 @@
use std::collections::HashMap;
use std::hash::{BuildHasherDefault, DefaultHasher};
use crate::helper_fun::tech_table_lookup;
use dioxus::prelude::*;
const TECHS_CSS: Asset = asset!("/assets/styling/techs.css");
#[component]
pub fn TechCard(tech_props: &'static str) -> Element {
let props_tech = tech_table_lookup(tech_props);
rsx! {
a { class: "tech-card", href: "{props_tech.project_site}",
img { src: "{props_tech.lang_logo}", alt: "{tech_props}'s logo" }
img { src: "{props_tech.tech_logo}", alt: "{tech_props}'s logo" }
h4 { "{tech_props}" }
progress { value: props_tech.skill_level, max: 100 }
}
@ -19,13 +15,11 @@ pub fn TechCard(tech_props: &'static str) -> Element {
}
#[component]
pub fn TechCat(cat: String, tech_vec: Vec<&'static str>) -> Element {
pub fn TechCat(cat: &'static str, tech_vec: Vec<&'static str>) -> Element {
rsx! {
document::Link { rel: "stylesheet", href: TECHS_CSS }
document::Stylesheet { href: asset!("/assets/styling/techs.css") }
div { class: "tech-cat",
div {
h3 { "{cat}" }
}
h3 { "{cat}" }
div { class: "tech-row",
for tech in tech_vec {
TechCard { tech_props: tech }
@ -34,66 +28,3 @@ pub fn TechCat(cat: String, tech_vec: Vec<&'static str>) -> Element {
}
}
}
#[derive(PartialEq, Props, Clone, Copy)]
pub struct TechDes {
// to be removed soon
pub lang_logo: &'static str,
pub project_site: &'static str,
pub skill_level: u8,
}
pub fn tech_table_lookup(to_lookup: &str) -> TechDes {
let techs_tools_frameworks_lookup = HashMap::from([
(
"Rust",
TechDes {
lang_logo: "https://www.rust-lang.org/static/images/rust-logo-blk.svg",
project_site: "https://www.rust-lang.org",
skill_level: 40,
},
),
(
"Python",
TechDes {
lang_logo: "https://www.svgrepo.com/show/452091/python.svg",
project_site: "https://www.python.org",
skill_level: 50,
},
),
(
"JavaScript",
TechDes {
lang_logo: "https://www.svgrepo.com/show/303206/javascript-logo.svg",
project_site: "https://www.python.org",
skill_level: 60,
},
),
(
"YAML",
TechDes {
lang_logo: "https://yaml.org/favicon.svg",
project_site: "https://yaml.org",
skill_level: 95,
},
),
(
"C",
TechDes {
lang_logo: "https://www.c-language.org/logo.svg",
project_site: "https://www.c-language.org",
skill_level: 30,
},
),
(
"C++",
TechDes {
lang_logo: "https://www.svgrepo.com/show/452183/cpp.svg",
project_site: "https://cplusplus.com",
skill_level: 30,
},
),
]);
techs_tools_frameworks_lookup[to_lookup]
}

281
src/helper_fun.rs Normal file
View File

@ -0,0 +1,281 @@
use dioxus::prelude::*;
use std::rc::Rc;
#[component]
pub fn get_tech_logos_from_str(used_tech: &'static str) -> Element {
let raw_data: TechDes = *tech_table_lookup(used_tech);
rsx! {
img { src: "{raw_data.tech_logo}", alt: "{used_tech}'s logo/icon" }
}
}
#[component]
pub fn set_meta_tags(description: &'static str, keywords: &'static str) -> Element {
rsx! {
document::Meta { name: "description", content: description }
document::Meta { name: "keywords", content: keywords }
document::Meta { name: "author", content: "Brock Tomlinson" }
}
}
#[derive(PartialEq, Props, Clone, Copy)]
pub struct TechDes {
pub tech_name: &'static str,
pub tech_logo: &'static str,
pub project_site: &'static str,
pub skill_level: u8,
}
#[derive(PartialEq, Props, Clone)]
pub struct ProjectDes {
website_prop: Option<&'static str>,
github_prop: Option<&'static str>,
project_name: &'static str,
techs_used: Vec<&'static str>,
project_des: &'static str,
}
pub fn tech_table_lookup(to_lookup: &str) -> Rc<TechDes> {
let mut tech_to_return: TechDes = TechDes {
tech_name: "Not in table",
tech_logo: "",
project_site: "",
skill_level: 0,
};
for tech in TECH_TABLE {
if tech.tech_name == to_lookup {
tech_to_return = tech.into();
}
}
tech_to_return.into()
}
const TECH_TABLE:[TechDes; 37] = [
TechDes {
tech_name: "Rust",
tech_logo: "https://www.svgrepo.com/show/374056/rust.svg",
project_site: "https://www.rust-lang.org",
skill_level: 60,
},
TechDes {
tech_name: "Python",
tech_logo: "https://www.svgrepo.com/show/452091/python.svg",
project_site: "https://www.python.org",
skill_level: 50,
},
TechDes {
tech_name: "JavaScript",
tech_logo: "https://www.svgrepo.com/show/303206/javascript-logo.svg",
project_site: "https://www.python.org",
skill_level: 60,
},
TechDes {
tech_name: "YAML",
tech_logo: "https://yaml.org/favicon.svg",
project_site: "https://yaml.org",
skill_level: 95,
},
TechDes {
tech_name: "Github",
tech_logo: "https://www.svgrepo.com/show/512317/github-142.svg",
project_site: "https://github.com/darkicewolf50",
skill_level: 80,
},
TechDes {
tech_name: "Email",
tech_logo: "https://www.svgrepo.com/show/491226/email.svg",
project_site: "mailto:darkicewolf50@gmail.com",
skill_level: 100,
},
TechDes {
tech_name: "LinkedIn",
tech_logo: "https://www.svgrepo.com/show/521725/linkedin.svg",
project_site: "https://www.linkedin.com/in/brock-tomlinson/",
skill_level: 40,
},
TechDes {
tech_name: "Twitch",
tech_logo: "https://www.svgrepo.com/show/519925/twitch.svg",
project_site: "https://www.twitch.tv/darkicewolf50",
skill_level: 60,
},
TechDes {
tech_name: "Youtube",
tech_logo: "https://www.svgrepo.com/show/521936/youtube.svg",
project_site: "https://www.youtube.com/@darkicewolf50",
skill_level: 40,
},
TechDes {
tech_name: "Internet",
tech_logo: "https://www.svgrepo.com/show/490809/internet.svg",
project_site: "https://google.com",
skill_level: 99,
},
TechDes {
tech_name: "React",
tech_logo: "https://www.svgrepo.com/show/452092/react.svg",
project_site: "https://react.dev",
skill_level: 70,
},
TechDes {
tech_name: "Docker",
tech_logo: "https://www.svgrepo.com/show/448221/docker.svg",
project_site: "https://www.docker.com",
skill_level: 70,
},
TechDes {
tech_name: "FastAPI",
tech_logo: "https://fastapi.tiangolo.com/img/favicon.png",
project_site: "https://fastapi.tiangolo.com",
skill_level: 80,
},
TechDes {
tech_name: "Actix",
tech_logo: "https://actix.rs/img/logo.png",
project_site: "https://actix.rs",
skill_level: 20,
},
TechDes {
tech_name: "HTML5",
tech_logo: "https://www.svgrepo.com/show/452228/html-5.svg",
project_site: "https://google.com",
skill_level: 90,
},
TechDes {
tech_name: "CSS",
tech_logo: "https://www.svgrepo.com/show/452185/css-3.svg",
project_site: "https://google.com",
skill_level: 65,
},
TechDes {
tech_name: "Git",
tech_logo: "https://www.svgrepo.com/show/452210/git.svg",
project_site: "https://git-scm.com",
skill_level: 55,
},
TechDes {
tech_name: "Github Actions",
tech_logo: "https://cdn.simpleicons.org/githubactions/2088FF",
project_site: "https://github.com/",
skill_level: 50,
},
TechDes {
tech_name: "Vs Code",
tech_logo: "https://www.svgrepo.com/show/452129/vs-code.svg",
project_site: "https://code.visualstudio.com",
skill_level: 60,
},
TechDes {
tech_name: "Gitea",
tech_logo: "https://about.gitea.com/gitea.png",
project_site: "https://about.gitea.com",
skill_level: 85,
},
TechDes {
tech_name: "AWS",
tech_logo: "https://www.svgrepo.com/show/448266/aws.svg",
project_site: "https://aws.amazon.com",
skill_level: 30,
},
TechDes {
tech_name: "Firefox",
tech_logo: "https://www.svgrepo.com/show/378808/firefox-developer-edition-57-70.svg",
project_site: "https://www.mozilla.org/en-CA/firefox/developer/",
skill_level: 80,
},
TechDes {
tech_name: "Markdown",
tech_logo: "https://www.svgrepo.com/show/510065/markdown.svg",
project_site: "https://www.markdownguide.org",
skill_level: 90,
},
TechDes {
tech_name: "Prettier",
tech_logo: "https://prettier.io/icon.png",
project_site: "https://prettier.io",
skill_level: 90,
},
TechDes {
tech_name: "Cloudflare",
tech_logo: "https://qualified-production.s3.us-east-1.amazonaws.com/uploads/3b522ef84c409e4457032e4b4e3b984abbc92522c6f100f4ccc55c0ccfd3062b.png",
project_site: "https://www.cloudflare.com/en-ca/",
skill_level: 65,
},
TechDes {
tech_name: "Netlify",
tech_logo: "https://qualified-production.s3.us-east-1.amazonaws.com/uploads/0f63ae7280d8d193e346973a1915bf99aea8c63e254eb062bad0bde99b43a9b7.png",
project_site: "https://www.netlify.com",
skill_level: 60,
},
TechDes {
tech_name: "Vercel",
tech_logo: "https://www.svgrepo.com/show/361653/vercel-logo.svg",
project_site: "https://vercel.com/home",
skill_level: 60,
},
TechDes {
tech_name: "Dioxus",
tech_logo: "https://dioxuslabs.com/assets/smalllogo-b1926fd214dc8427.png",
project_site: "https://dioxuslabs.com",
skill_level: 70,
},
TechDes {
tech_name: "Vue",
tech_logo: "https://vuejs.org/logo.svg",
project_site: "https://vuejs.org",
skill_level: 1,
},
TechDes {
tech_name: "Mongodb",
tech_logo: "https://www.svgrepo.com/show/331488/mongodb.svg",
project_site: "https://www.mongodb.com",
skill_level: 10,
},
TechDes {
tech_name: "Sqlite",
tech_logo: "https://www.svgrepo.com/show/374094/sqlite.svg",
project_site: "https://www.sqlite.org",
skill_level: 10,
},
TechDes {
tech_name: "PostgreSQL",
tech_logo: "https://www.svgrepo.com/show/303301/postgresql-logo.svg",
project_site: "https://www.postgresql.org",
skill_level: 10,
},
TechDes {
tech_name: "DynamoDB",
tech_logo: "https://www.svgrepo.com/show/473526/amazondynamodb.svg",
project_site: "https://aws.amazon.com/dynamodb/",
skill_level: 70,
},
TechDes {
tech_name: "Diesel",
tech_logo: "https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745443276/diesel_logo_ujtvia.png",
project_site: "https://diesel.rs",
skill_level: 10,
},
TechDes {
tech_name: "Kubernetes",
tech_logo: "https://kubernetes.io/images/kubernetes.png",
project_site: "https://kubernetes.io",
skill_level: 5,
},
TechDes {
tech_name: "Terraform",
tech_logo: "https://www.svgrepo.com/show/448253/terraform.svg",
project_site: "https://www.terraform.io",
skill_level: 15,
},
TechDes {
tech_name: "Traefik",
tech_logo: "https://hub.docker.com/api/media/repos_logo/v1/library%2Ftraefik",
project_site: "https://traefik.io/traefik/",
skill_level: 60,
},
];

View File

@ -1,13 +1,16 @@
use dioxus::prelude::*;
// use components::Hero;
use views::{Blog, Home, Navbar, NewHome};
use views::{Blog, Blogs, ContactMe, Home, Navbar, Projects};
/// Define a components module that contains all shared components for our app.
mod components;
/// Define a views module that contains the UI for all Layouts and Routes for our app.
mod views;
/// Defines where to place all helper functions
mod helper_fun;
/// The Route enum is used to define the structure of internal routes in our app. All route enums need to derive
/// the [`Routable`] trait, which provides the necessary methods for the router to work.
///
@ -25,23 +28,38 @@ pub enum Route {
Home {},
// The route attribute can include dynamic parameters that implement [`std::str::FromStr`] and [`std::fmt::Display`] with the `:` syntax.
// In this case, id will match any integer like `/blog/123` or `/blog/-456`.
#[route("/blog/:id")]
#[route("/blogs/:page_num")]
// Fields of the route variant will be passed to the component as props. In this case, the blog component must accept
// an `id` prop of type `i32`.
Blog { id: i32 },
Blogs { page_num: u32 },
#[route("/test")]
Hello {},
#[route("/blogs/:blog_title")]
Blog {blog_title: String},
#[route("/new_home")]
NewHome {},
#[route("/projects")]
Projects {},
#[route("/contact")]
ContactMe {},
// #[route("/new_home")]
// NewHome {},
// PageNotFound is a catch all route that will match any route and placing the matched segments in the route field
#[route("/:..route")]
PageNotFound { route: Vec<String> },
}
#[component]
fn Hello() -> Element {
rsx!(
div {
h1 { "hello" }
fn PageNotFound(route: Vec<String>) -> Element {
rsx! {
document::Stylesheet { href: asset!("/assets/styling/notFound.css") }
document::Title { "Brock Tomlinson - Not Found" }
div { id: "not-found",
h1 { "Page not found" }
p { "We are terribly sorry, but the page you requested doesn't exist." }
dioxus::prelude::Link { to: Route::Home {},
button { "Return Home Here" }
}
}
)
}
}

View File

@ -7,12 +7,36 @@ use personal_site::Route;
// The macro returns an `Asset` type that will display as the path to the asset in the browser or a local path in desktop bundles.
const FAVICON: Asset = asset!("/assets/favicon.ico");
// The asset macro also minifies some assets like CSS and JS to make bundled smaller
const MAIN_CSS: Asset = asset!("/assets/styling/main.css");
// const MAIN_CSS: Asset = asset!("/assets/styling/main.css");
fn main() {
// The `launch` function is the main entry point for a dioxus app. It takes a component and renders it with the platform feature
// you have enabled
dioxus::launch(App);
// for compiling the app
// dioxus::LaunchBuilder::new()
// // Set the server config only if we are building the server target
// .with_cfg(server_only! {
// ServeConfig::builder()
// // Enable incremental rendering
// .incremental(
// IncrementalRendererConfig::new()
// // Store static files in the public directory where other static assets like wasm are stored
// .static_dir(
// std::env::current_exe()
// .unwrap()
// .parent()
// .unwrap()
// .join("public")
// )
// // Don't clear the public folder on every build. The public folder has other files including the wasm
// // binary and static assets required for the app to run
// .clear_cache(false)
// )
// .enable_out_of_order_streaming()
// })
// .launch(App);
}
/// App is the main component of our app. Components are the building blocks of dioxus apps. Each component is a function
@ -26,10 +50,23 @@ fn App() -> Element {
// In addition to element and text (which we will see later), rsx can contain other components. In this case,
// we are using the `document::Link` component to add a link to our favicon and main CSS file into the head of our app.
document::Link { rel: "icon", href: FAVICON }
document::Link { rel: "stylesheet", href: MAIN_CSS }
// document::Link { rel: "stylesheet", href: MAIN_CSS }
document::Stylesheet { href: asset!("/assets/styling/main.css") }
// The router component renders the route enum we defined above. It will handle synchronization of the URL and render
// the layouts and components for the active route.
Router::<Route> {}
}
}
// The server function at the endpoint "static_routes" will be called by the CLI to generate the list of static
// routes. You must explicitly set the endpoint to `"static_routes"` in the server function attribute instead of
// the default randomly generated endpoint.
// #[server(endpoint = "static_routes", output = server_fn::codec::Json)]
// async fn static_routes() -> Result<Vec<String>, ServerFnError> {
// // The `Routable` trait has a `static_routes` method that returns all static routes in the enum
// Ok(Route::static_routes()
// .iter()
// .map(ToString::to_string)
// .collect())
// }

View File

@ -1,39 +1,253 @@
use crate::Route;
// use dioxus::logger::tracing::info;
use dioxus::prelude::*;
const BLOG_CSS: Asset = asset!("/assets/styling/blog.css");
use reqwest;
use serde::{Deserialize, Serialize};
/// The Blog page component that will be rendered when the current route is `[Route::Blog]`
///
/// The component takes a `id` prop of type `i32` from the route enum. Whenever the id changes, the component function will be
/// re-run and the rendered HTML will be updated.
#[component]
pub fn Blog(id: i32) -> Element {
rsx! {
document::Link { rel: "stylesheet", href: BLOG_CSS }
pub fn Blog(blog_title: String) -> Element {
let blog_resource = use_resource({
let title = blog_title.clone();
move || {
let value = title.clone();
async move {
get_blog(value).await.unwrap_or(BlogContent {
blog_file_name: String::new(),
date_last_edit: "9999-12-01".to_string(),
blog_title: "Not Found".to_string(),
tags: vec!["#error".to_string()],
html_blog_content: "<p>Blog not found</p>".to_string(),
})
}
}
});
div {
id: "blog",
rsx! {
document::Stylesheet { href: asset!("/assets/styling/blog.css") }
document::Title { "Brock Tomlinson - {blog_title.clone()}" }
// document::Meta { name: "author", content: "Brock Tomlinson" }
document::Meta { name: "robots", content: "noindex, nofollow" }
div { id: "blog",
// Content
h1 { "This is blog #{id}!" }
p { "In blog #{id}, we show how the Dioxus router works and how URL parameters can be passed as props to our route components." }
// h1 { "This is blog #{blog_title}!" }
// p {
// "In blog #{blog_title}, we show how the Dioxus router works and how URL parameters can be passed as props to our route components."
// }
// Navigation links
// The `Link` component lets us link to other routes inside our app. It takes a `to` prop of type `Route` and
// any number of child nodes.
Link {
// The `to` prop is the route that the link should navigate to. We can use the `Route` enum to link to the
// blog page with the id of -1. Since we are using an enum instead of a string, all of the routes will be checked
// at compile time to make sure they are valid.
to: Route::Blog { id: id - 1 },
"Previous"
}
span { " <---> " }
Link {
to: Route::Blog { id: id + 1 },
"Next"
// // Navigation links
// // The `Link` component lets us link to other routes inside our app. It takes a `to` prop of type `Route` and
// // any number of child nodes.
// Link {
// // The `to` prop is the route that the link should navigate to. We can use the `Route` enum to link to the
// // blog page with the id of -1. Since we are using an enum instead of a string, all of the routes will be checked
// // at compile time to make sure they are valid.
// to: Route::Blog { id: id - 1 },
// "Previous"
// }
// span { " <---> " }
Link { to: Route::Blogs { page_num: 0 }, "Go Back" }
if let Some(blog_content) = &*blog_resource.read() {
article {
header { id: "blog_info",
h1 { "{blog_content.blog_title}" }
div {
ul {
for tag in &blog_content.tags {
li { "{tag}" }
}
}
p { "{&blog_content.date_last_edit}" }
}
}
section {
id: "blog_content",
dangerous_inner_html: *&blog_content.html_blog_content.as_str(),
}
}
} else {
p { "Loading..." }
}
}
}
}
async fn get_blog(blog_name: String) -> Result<BlogContent, reqwest::Error> {
let client = reqwest::Client::new();
let res = client
.get(format!("blogs/blog/{}", blog_name))
.timeout(std::time::Duration::from_secs(10))
.send()
.await?
.json::<BlogContent>()
// .text()
.await?;
// tracing::info!("{:?}", res);
Ok(res)
// to be removed
// let blog = serde_json::from_str(&res).unwrap_or(BlogContent {
// blog_file_name: "blog_title".to_string(),
// blog_title: "This is a blog #blog_title".to_string(),
// date_last_edit: "2025-5-20".to_string(),
// tags: "#test".to_string(),
// html_blog_content: "<p>
// In blog #{blog_title}, we show how the Dioxus router works and
// how URL parameters can be passed as props to our route components.
// </p>"
// .to_string(),
// });
// Ok(blog)
// Ok(BlogContent {
// blog_file_name: "blog_title".to_string(),
// blog_title: "This is a blog #blog_title".to_string(),
// date_last_edit: "2025-5-20".to_string(),
// tags: "#test".to_string(),
// html_blog_content: "<p>
// In blog #{blog_title}, we show how the Dioxus router works and
// how URL parameters can be passed as props to our route components.
// </p>"
// .to_string(),
// })
}
#[component]
pub fn Blogs(page_num: u32) -> Element {
let mut _num_limit: Signal<u8> = use_signal(|| 10);
let blogs_resource: Resource<Vec<BlogContent>> =
use_resource(use_reactive!(|(_num_limit, page_num)| async move {
get_blogs_preview(_num_limit(), page_num)
.await
.unwrap_or_else(|_| vec![])
}));
rsx! {
document::Stylesheet { href: asset!("/assets/styling/blog.css") }
document::Meta { name: "robots", content: "noindex, nofollow" }
document::Title { "Brock Tomlinson - Blogs" }
div { id: "blogs",
div { id: "blogs-title",
h1 { "Blogs" }
p {
"This is a collection of blog posts, ranging from tutorials, technologies I found interesting, and opinion pieces"
}
p { "These blogs are my opinion and mine alone" }
}
div { id: "blogs-on-show",
if let Some(blogs) = &*blogs_resource.read() {
if blogs.len() > 0 {
for blog in blogs.iter() {
Link {
class: "blog-preview",
to: Route::Blog {
blog_title: blog.blog_file_name.clone(),
},
div { id: "blog_info",
h1 { "{blog.blog_title}" }
div {
div {
for tag in &blog.tags {
p { "{tag}" }
}
}
p { "{&blog.date_last_edit}" }
}
}
div {
id: "blog_content",
dangerous_inner_html: *&blog.html_blog_content.as_str(),
}
button { "Read More Here" }
}
}
} else {
div { id: "blog-out-of",
p { "No more blogs available" }
Link { to: Route::Blogs { page_num: 0 },
button { "Go Back" }
}
}
}
} else {
div { id: "blog-loading",
p { "Loading blogs..." }
}
}
}
div { id: "blog-nav",
if page_num > 0 {
Link {
to: Route::Blogs {
page_num: page_num - 1,
},
button { "<-- Go Back" }
}
}
div {
label { "display: " }
select {
onchange: move |event| {
_num_limit.set(event.value().parse::<u8>().unwrap_or(10));
},
option { "10" }
option { "25" }
option { "50" }
option { "100" }
}
}
Link {
to: Route::Blogs {
page_num: page_num + 1,
},
button { "Next -->" }
}
}
}
}
}
#[derive(Deserialize, Serialize, Debug)]
struct BlogContent {
pub blog_file_name: String,
pub date_last_edit: String,
pub blog_title: String,
pub tags: Vec<String>,
pub html_blog_content: String,
}
async fn get_blogs_preview(
_num_limit: u8,
page_num: u32,
) -> Result<Vec<BlogContent>, reqwest::Error> {
let client = reqwest::Client::new();
let res = client
.get(format!("blogs/{}/{}", _num_limit, page_num))
.timeout(std::time::Duration::from_secs(10))
.send()
.await?
.json::<Vec<BlogContent>>()
// .text()
.await?;
Ok(res)
// let json: serde_json::Value = serde_json::from_str(&res).unwrap();
// let blogs: Vec<BlogContent> = serde_json::from_value(json).unwrap_or_default();
// // Extract the "Blogs" array and deserialize it into Vec<BlogContent>
// let blogs: Vec<BlogContent> = serde_json::from_value(
// json.get("Blogs")
// .cloned()
// .unwrap_or(serde_json::Value::Null),
// )
// .unwrap_or_default();
}

View File

@ -1,84 +1,88 @@
use dioxus::prelude::*;
const PROFESSIONAL_PHOTO_JPG: Asset = asset!("assets/professional_photo_2023.jpg");
const CONTACT_CSS: Asset = asset!("/assets/styling/contact.css");
#[component]
pub fn Contact() -> Element {
rsx! {
document::Link { href: CONTACT_CSS, rel: "stylesheet" }
document::Stylesheet { href: asset!("/assets/styling/contact.css") }
h2 { "Contact" }
div { id: "contact",
img {
src: PROFESSIONAL_PHOTO_JPG,
alt: "Borck's professional photo",
div {
div {
img {
src: PROFESSIONAL_PHOTO_JPG,
alt: "Brock's professional photo",
}
}
}
div {
h4 { "Brock Tomlinson" }
ul {
li { "FullStack Webdev and Student Software Engineer" }
li {
a { href: "mailto:darkicewolf50@gmail.com",
img {
src: "https://www.svgrepo.com/show/491226/email.svg",
alt: "Email icon/logo",
}
div {
p { "Email I check:" }
p { "darkicewolf50@gmail.com" }
div {
h4 { "Brock Tomlinson" }
ul {
li { "FullStack Webdev and Student Software Engineer" }
li {
a { href: "mailto:darkicewolf50@gmail.com",
img {
src: "https://www.svgrepo.com/show/491226/email.svg",
alt: "Email icon/logo",
}
div {
p { "Email I check:" }
p { "darkicewolf50@gmail.com" }
}
}
}
}
li {
a { href: "mailto:brock@eatsleepski.com",
img {
src: "https://www.svgrepo.com/show/491226/email.svg",
alt: "Email icon/logo",
}
div {
p { "Professional Email:" }
p { "brock@eatsleepski.com" }
li {
a { href: "mailto:brock@eatsleepski.com",
img {
src: "https://www.svgrepo.com/show/491226/email.svg",
alt: "Email icon/logo",
}
div {
p { "Professional Email:" }
p { "brock@eatsleepski.com" }
}
}
}
}
li {
a {
img {
src: "https://www.svgrepo.com/show/512317/github-142.svg",
alt: "Github logo",
li {
a {
img {
src: "https://www.svgrepo.com/show/512317/github-142.svg",
alt: "Github logo",
}
p { "darkicewolf50" }
}
p { "darkicewolf50" }
}
}
li {
a {
img {
src: "https://www.svgrepo.com/show/521725/linkedin.svg",
alt: "LinkedIn logo",
li {
a {
img {
src: "https://www.svgrepo.com/show/521725/linkedin.svg",
alt: "LinkedIn logo",
}
p { "Brock Tomlinson" }
}
p { "Brock Tomlinson" }
}
}
li {
a {
img {
src: "https://www.svgrepo.com/show/519925/twitch.svg",
alt: "Twitch logo",
li {
a {
img {
src: "https://www.svgrepo.com/show/519925/twitch.svg",
alt: "Twitch logo",
}
p { "darkicewolf50" }
}
p { "darkicewolf50" }
}
}
li {
a {
img {
src: "https://www.svgrepo.com/show/521936/youtube.svg",
alt: "Youtube logo",
li {
a {
img {
src: "https://www.svgrepo.com/show/521936/youtube.svg",
alt: "Youtube logo",
}
p { "@darkicewolf50" }
}
p { "@darkicewolf50" }
}
}
}
}
}
}

130
src/views/contact_me.rs Normal file
View File

@ -0,0 +1,130 @@
use reqwest::Client;
use serde_json;
// use dioxus::logger::tracing;
use dioxus::prelude::*;
use crate::views::Contact;
#[component]
pub fn ContactMe() -> Element {
let mut contact_me_name = use_signal(|| String::new());
let mut contact_me_email = use_signal(|| String::new());
let mut contact_me_message = use_signal(|| String::new());
let mut _error_box_message = use_signal(|| String::new());
rsx! {
document::Stylesheet { href: asset!("/assets/styling/contactme.css") }
document::Title { "Brock Tomlinson - Contact" }
div { id: "ContactMe",
div {
h2 { "Get in Touch" }
p {
"Please feel free to reach out about questions, opporunities or just want to connect.
Feel free to either fill out this form or contact me through one of the many of the platforms below"
}
}
div {
label { "Name" }
input {
oninput: move |event| {
contact_me_name.set(event.value());
},
}
label { "Email" }
input {
oninput: move |event| {
contact_me_email.set(event.value());
},
}
label { "Message" }
textarea {
oninput: move |event| {
contact_me_message.set(event.value());
},
}
p { "{_error_box_message}" }
button {
onclick: move |_| async move {
send_message(
contact_me_name(),
contact_me_email(),
contact_me_message(),
_error_box_message,
)
.await
},
"Submit"
}
}
}
Contact {}
}
}
async fn send_message(name: String, email: String, message: String, mut recived: Signal<String>) {
if name == "".to_string() && email == "".to_string() && message == "".to_string() {
recived.set("Please fill fill out the form first".to_string());
return ();
} else if name == "".to_string() {
recived.set("Please fill in your name so I know who I am contacting".to_string());
return ();
} else if email == "".to_string() {
recived.set("Please fill in your email so I can get into contact".to_string());
return ();
} else if message == "".to_string() {
recived.set("Please write a message so I know why you wanted to be in contact".to_string());
return ();
}
if is_valid_email_basic(&email) == false {
recived.set("Please write a vaild email".to_string());
return ();
}
let json_to_send = serde_json::json!({
"content": format!("***New Message***\n*Name*: {name}\n*Email*: [{email}](mailto:{email})\n*Message*: {message}")
});
let client = Client::new();
let res = client.post("").json(&json_to_send).send().await;
match res {
Ok(_) => {
recived.set("Sent Sucessfully, I will be in contact with you soon".to_string());
}
Err(_) => {
recived.set("An Error Occured".to_string());
}
}
}
fn is_valid_email_basic(email: &str) -> bool {
// Find the position of '@'
if let Some(at_pos) = email.find('@') {
// Ensure there's only one '@'
if email.rfind('@') != Some(at_pos) {
return false;
}
// Split into local and domain parts
let local = &email[..at_pos];
let domain = &email[at_pos + 1..];
// Check both parts are non-empty
if local.is_empty() || domain.is_empty() {
return false;
}
// Check domain contains at least one '.' and it's not at the start or end
if let Some(dot_pos) = domain.find('.') {
// '.' must not be at the beginning or end of the domain
if dot_pos == 0 || dot_pos == domain.len() - 1 {
return false;
}
return true;
}
}
false
}

View File

@ -1,50 +0,0 @@
use dioxus::prelude::*;
const ENDER_CSS: Asset = asset!("/assets/styling/ender.css");
#[component]
pub fn Ender() -> Element {
rsx! {
document::Link { rel: "stylesheet", href: ENDER_CSS }
footer {
p { "Brock Tomlinson © 2025" }
div {
a { href: "https://github.com/darkicewolf50",
img {
src: "https://www.svgrepo.com/show/512317/github-142.svg",
alt: "Github logo",
}
p { "Github" }
}
a { href: "mailto:darkicewolf50@gmail.com",
img {
src: "https://www.svgrepo.com/show/491226/email.svg",
alt: "Email logo/icon",
}
p { "Email" }
}
a { href: "https://www.linkedin.com/in/brock-tomlinson/",
img {
src: "https://www.svgrepo.com/show/521725/linkedin.svg",
alt: "LinkedIn logo",
}
p { "LinkedIn" }
}
a { href: "https://www.twitch.tv/darkicewolf50",
img {
src: "https://www.svgrepo.com/show/519925/twitch.svg",
alt: "Twitch logo",
}
p { "Twitch" }
}
a { href: "https://www.youtube.com/@darkicewolf50",
img {
src: "https://www.svgrepo.com/show/521936/youtube.svg",
alt: "Youtube logo",
}
p { "Youtube" }
}
}
}
}
}

View File

@ -1,14 +1,88 @@
use crate::components::{TechCat, TechDes};
use crate::views::Contact;
use crate::components::{Experience, TechCat};
use crate::views::{Contact, Projects};
use crate::Route;
use dioxus::prelude::*;
#[component]
pub fn Home() -> Element {
let languages: Vec<&'static str> = vec!["Rust", "Python", "JavaScript", "YAML", "C", "C++"];
let languages = vec![
"Rust",
"Python",
"YAML",
"HTML5",
"CSS",
"JavaScript",
"Markdown",
];
let backend = vec!["Actix", "FastAPI", "Dioxus", "Diesel"];
let frontend = vec!["React", "Dioxus", "Vue"];
let databases = vec!["Sqlite", "PostgreSQL", "Mongodb", "DynamoDB"];
let tools = vec![
"Vs Code",
"Git",
"Prettier",
"Firefox",
"Github Actions",
"Traefik",
"Docker",
"Kubernetes",
"Terraform",
];
let platforms = vec!["AWS", "Cloudflare", "Vercel", "Netlify", "Gitea", "Github"];
rsx!(
h1 { "Hi I'm Brock" }
TechCat { cat: "Languages".to_string(), tech_vec: languages }
Contact {}
document::Title { "Brock Tomlinson - Home" }
document::Stylesheet { href: asset!("/assets/styling/home.css") }
div {
div { id: "home-intro",
h1 { "Hi I'm Brock" }
p {
"a fourth year Software Engineering Student specializing in full-stack development with a strong focus on backend technologies.
I am developing the language of how to design, develop, and create programs that are to industry standards and reasonably efficent.
I bring the lessons learned from each project I have completed,
learning from the mistakes I have made and bringing improved versions forward into the next project."
}
p {
"As of writing this I intend to bring the knowledge learned from my time at university in Software Engineering onto a Baja SAE car,
where we can collect data remotely and graph data for instantaneous and future analysis,
during vechile operation."
}
p {
"I grew up in a small ski town where, I started learning about programming, from of course Minecraft,
where I thought the application of this was so futuristic and downright cool that I knew I wanted to persue it further.
While living there I spend a majority of my time outside of school swimming competitively, where I ranked top 10 in BC.
Along with swimming I spend a lot of time volunteering with fundraising events and coaching the local Special Olympics swim team."
}
p {
"I adore problem solving and building cool stuff, I'm happy to jump in and get started! "
Link { to: Route::ContactMe {},
button { "Let's create something great together!" }
}
}
}
div { class: "technologies",
h2 { "Technology" }
p { "Here is what I prefer to use and their self assessed skill" }
// p { "Here is what I developed skills in." }
div { class: "technologies-cat",
TechCat { cat: "Languages", tech_vec: languages }
TechCat { cat: "Backend", tech_vec: backend }
TechCat { cat: "Frontend", tech_vec: frontend }
TechCat { cat: "Databases", tech_vec: databases }
TechCat { cat: "Platforms", tech_vec: platforms }
TechCat { cat: "Tools", tech_vec: tools }
}
}
Contact {}
Projects { independent_page: false }
div { id: "experience",
h2 { "Experience" }
div {
Experience { professional_jobs: true }
Experience { professional_jobs: false }
}
}
}
)
}

View File

@ -8,11 +8,11 @@
//! The [`Navbar`] component will be rendered on all pages of our app since every page is under the layout. The layout defines
//! a common wrapper around all child routes.
mod new_home;
pub use new_home::NewHome;
// mod new_home;
// pub use new_home::NewHome;
mod blog;
pub use blog::Blog;
pub use blog::{Blog, Blogs};
mod navbar;
pub use navbar::Navbar;
@ -20,10 +20,11 @@ pub use navbar::Navbar;
mod home;
pub use home::Home;
mod footer;
pub use footer::Ender;
mod contact;
pub use contact::Contact;
mod projects;
pub use projects::Projects;
mod contact_me;
pub use contact_me::ContactMe;

View File

@ -1,9 +1,10 @@
use crate::views::Ender;
use crate::components::Ender;
use crate::helper_fun::set_meta_tags;
use crate::Route;
use dioxus::prelude::*;
const NAVBAR_CSS: Asset = asset!("/assets/styling/navbar.css");
const STD_COLOUR_AND_FONTS_CSS: Asset = asset!("assets/styling/standardColoursandFonts.css");
const _ROBOTS_TXT: Asset = asset!("/assets/robots.txt");
const PROFESSIONAL_PHOTO_JPG: Asset = asset!("assets/professional_photo_2023.jpg");
/// The Navbar component that will be rendered on all pages of our app since every page is under the layout.
///
@ -12,13 +13,49 @@ const STD_COLOUR_AND_FONTS_CSS: Asset = asset!("assets/styling/standardColoursan
/// routes will be rendered under the outlet inside this component
#[component]
pub fn Navbar() -> Element {
let PHOTO_FORMAT_URL = format!("https://darkicewolf50.pages.dev{PROFESSIONAL_PHOTO_JPG}");
rsx! {
document::Link { rel: "stylesheet", href: NAVBAR_CSS }
document::Link { rel: "stylesheet", href: STD_COLOUR_AND_FONTS_CSS }
document::Stylesheet { href: asset!("/assets/styling/navbar.css") }
document::Stylesheet { href: asset!("assets/styling/standardColoursandFonts.css") }
set_meta_tags {
description: "Fourth year Software Engineering student specializing in full-stack development with a backend focus. Always improving through experience.",
keywords: "webdev Rust software engineer projects blog darkicewol50",
}
document::Meta { name: "robots", content: "index, follow" }
document::Link { rel: "canonical", href: "https://darkicewolf50.pages.dev/" }
document::Meta {
name: "google-site-verification",
content: "lsAs9c2Pv7c6Sm26z1hd2YqR2depbp4sJddIDYKHkxY",
}
document::Meta {
property: "og:title",
content: "Brock Tomlinson - Software Engineering Student",
}
document::Meta {
property: "og:description",
content: "Fourth year Software Engineering student specializing in full-stack development with a backend focus. Always improving through experience.",
}
document::Meta { property: "og:type", content: "website" }
document::Meta { property: "og:url", content: "https://darkicewolf50.pages.dev/" }
document::Meta { name: "twitter:card", content: "summary_large_image" }
document::Meta {
name: "twitter:title",
content: "Brock Tomlinson - Software Engineer",
}
document::Meta {
name: "twitter:description",
content: "Fourth year Software Engineering student specializing in full-stack development with a backend focus. Always improving through experience.",
}
document::Meta { name: "twitter:image", content: PHOTO_FORMAT_URL.clone() }
document::Meta { property: "og:image", content: PHOTO_FORMAT_URL.clone() }
div { id: "navbar",
Link { to: Route::NewHome {}, "Home" }
Link { to: Route::Blog { id: 1 }, "Blog" }
Link { to: Route::Home {}, "Home" }
Link { to: Route::Projects {}, "Projects" }
Link { to: Route::Blogs { page_num: 0 }, "Blogs" }
Link { to: Route::ContactMe {}, "Contact" }
}
// The `Outlet` component is used to render the next component inside the layout. In this case, it will render either

View File

@ -1,7 +1,158 @@
use crate::helper_fun::get_tech_logos_from_str;
use dioxus::prelude::*;
#[component]
pub fn Projects() -> Element {
todo!();
rsx! {}
pub fn Projects(#[props(default = true)] independent_page: bool) -> Element {
rsx! {
if independent_page {
document::Title { "Brock Tomlinson - Projects" }
}
div {
h2 { "Projects" }
p { "Top Featured and Recent Projects" }
}
div { class: "project-section",
ProjectCards {
project_name: "Personal Backend",
gitea_link: "https://gitea.bajacloud.duckdns.org/darkicewolf50/darkicewolf50Cloud",
dockerhub_link: "https://hub.docker.com/r/darkicewolf50/darkicewolf50cloud",
project_img: "https://actix.rs/img/logo.png",
techs_used: vec![
"Rust",
"Actix",
"Github Actions",
"Docker",
"Traefik",
"Gitea",
"Git",
"Github",
],
project_des: "I find that this is a much better option in compareision to FastAPI as it does not require a post request
to input data instead it give the option for the url to give the parameters it needs. I don't have any complains about using Actix, its mature stable and fairly popular.
This backend application also uses comrak to convert markdown blogs into html docuemnts that are then seen by you the user.
This honestly was a fun challenge getting the blogs previews, ensuring correctness and not allowing for any unknown states,
this will serve as a great basis for any future backend requirements that I may have.",
}
ProjectCards {
project_name: "Portfolio Site Version 2.0.1",
website_link: "https://darkicewolf50.pages.dev",
gitea_link: "https://gitea.bajacloud.duckdns.org/darkicewolf50/personal_site",
project_img: "https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png",
techs_used: vec!["Rust", "CSS", "Dioxus", "Git", "Gitea"],
project_des: "This project was a great test of my newly learned Rust.
This major update added functionality for the contact me, the blogs part of the site, as well as many minor
UI consistencies to ensure that all of the buttons and links felt like buttons and links.
I was surprise how easy it was to set up a discord webhook using the 'reqwest' crate.
As I continue on I find myself struggling with how and why to use databases for content I generate.
I think using tools like disocrd webhooks and email notifications are great for users but certainly not great for reading data from.
I was very satisfied with serde, and comrak for converting markdown fiels into html.
I use this extensively for the blogs search menu and the blog itself to display the blog itself in a consistent way without needing to write a whole library.",
}
ProjectCards {
project_name: "Portfolio Site 1.0.0",
website_link: "https://darkicewolf50.github.io",
github_link: "https://github.com/darkicewolf50/darkicewolf50.github.io",
project_img: "https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745630861/Portfolio_site_k4mhmj.png",
techs_used: vec!["Rust", "CSS", "Dioxus", "Git", "Github"],
project_des: "This project was a great test of my newly learned Rust.
It was certainly interesting to go through all of the stages of front end web developement, while the orignal and new found scope is not currently achieved, it will be on a later pass through.
I am very happy with how it turned out in compairison to my origanl site map, and wireframes.
Considering this phase one was accomplished in 3 working days I believe it is an excellent show of my skill.",
}
ProjectCards {
project_name: "UCalgary Baja Backend",
project_img: "https://www.svgrepo.com/show/448221/docker.svg",
dockerhub_link: "https://hub.docker.com/r/darkicewolf50/uofcbajacloud",
techs_used: vec!["Python", "FastAPI", "Github Actions", "Docker", "Traefik", "Git", "Github"],
project_des: "This is going to be extremely cost saving for the non-profit club UCalgary Baja.
Using automated uploads and linting to check the Python and FastAPI code was excellent for learning how to self-host a web server.
This was then upgraded later with the addition of treafik so that it could be SSL certified, this is also known as supporting HTTPS transmissions.
Ultimately it will serve as a great stepping stone for both myself an anyone else in UCalgary Baja Software subteam.
This will lead into using Actixs in the migration Soon™ to be.",
}
ProjectCards {
project_name: "UCalgary Baja Website",
website_link: "https://uofcbaja.pages.dev",
project_img: "https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745633714/ucalgary-baja-site-April.png",
techs_used: vec![
"HTML5",
"CSS",
"JavaScript",
"Markdown",
"YAML",
"React",
"Git",
"Github",
"Cloudflare",
],
project_des: "The flexibility that we achieved using React,
rather than a locked down platform or framework has allows all the Software members of UCalgary Baja to learn infinitely more.
This isn't to say that it is faster or have additional perks of using 'non-code website builders'.
This is provided massive opportunities to learn teach and save on cost compaired to the website builders.
Overall I would say this will be worth it in the long run and opened my eyes to different website hosting providers,
with their associated perks and costs.
When we change it, it will most likely we re-written in Vue as there is a good non-depreciated way to initalize the framework.",
}
}
}
}
#[component]
pub fn ProjectCards(
website_link: Option<&'static str>,
github_link: Option<&'static str>,
gitea_link: Option<&'static str>,
dockerhub_link: Option<&'static str>,
project_name: &'static str,
techs_used: Vec<&'static str>,
project_des: &'static str,
#[props(default = "https://picsum.photos/200")] project_img: &'static str,
) -> Element {
rsx! {
document::Stylesheet { href: asset!("/assets/styling/projectCards.css") }
div { class: "project-card",
img {
src: "{project_img}",
alt: "dashboard of project or the logo of the project",
}
div { class: "project-title-info",
h3 { "{project_name}" }
div {
if let Some(github_site) = github_link {
a { href: "{github_site}",
get_tech_logos_from_str { used_tech: "Github" }
}
}
if let Some(gitea_site) = gitea_link {
a { href: "{gitea_site}", id: "gitea",
get_tech_logos_from_str { used_tech: "Gitea" }
}
}
if let Some(dockerhub) = dockerhub_link {
a { href: "{dockerhub}", id: "dockerhub",
get_tech_logos_from_str { used_tech: "Docker" }
}
}
if let Some(site) = website_link {
a { href: "{site}",
get_tech_logos_from_str { used_tech: "Internet" }
}
}
}
}
div {
p { "{project_des}" }
}
div { class: "project-tech-logos",
for tech in techs_used {
get_tech_logos_from_str { used_tech: tech }
}
}
}
}
}
// img {
// src: "https://www.svgrepo.com/show/512317/github-142.svg",
// alt: "Github logo",
// }

235
techs.json Normal file
View File

@ -0,0 +1,235 @@
{
"Rust": {
"tech_logo": "https://www.svgrepo.com/show/374056/rust.svg",
"project_site": "https://www.rust-lang.org",
"skill_level": 65
},
"Python": {
"tech_logo": "https://www.svgrepo.com/show/452091/python.svg",
"project_site": "https://www.python.org",
"skill_level": 60
},
"JavaScript": {
"tech_logo": "https://www.svgrepo.com/show/303206/javascript-logo.svg",
"project_site": "https://www.python.org",
"skill_level": 60
},
"YAML": {
"tech_logo": "https://yaml.org/favicon.svg",
"project_site": "https://yaml.org",
"skill_level": 95
},
"C": {
"tech_logo": "https://www.c-language.org/logo.svg",
"project_site": "https://www.c-language.org",
"skill_level": 50
},
"C++": {
"tech_logo": "https://www.svgrepo.com/show/452183/cpp.svg",
"project_site": "https://cplusplus.com",
"skill_level": 50
},
"Github": {
"tech_logo": "https://www.svgrepo.com/show/512317/github-142.svg",
"project_site": "https://github.com/darkicewolf50",
"skill_level": 80
},
"Email": {
"tech_logo": "https://www.svgrepo.com/show/491226/email.svg",
"project_site": "mailto:darkicewolf50@gmail.com",
"skill_level": 100
},
"LinkedIn": {
"tech_logo": "https://www.svgrepo.com/show/521725/linkedin.svg",
"project_site": "https://www.linkedin.com/in/brock-tomlinson/",
"skill_level": 4
},
"Twitch": {
"tech_logo": "https://www.svgrepo.com/show/519925/twitch.svg",
"project_site": "https://www.twitch.tv/darkicewolf50",
"skill_level": 6
},
"Youtube": {
"tech_logo": "https://www.svgrepo.com/show/521936/youtube.svg",
"project_site": "https://www.youtube.com/@darkicewolf50",
"skill_level": 4
},
"Internet": {
"tech_logo": "https://www.svgrepo.com/show/490809/internet.svg",
"project_site": "https://google.com",
"skill_level": 99
},
"React": {
"tech_logo": "https://www.svgrepo.com/show/452092/react.svg",
"project_site": "https://react.dev",
"skill_level": 60
},
"Docker": {
"tech_logo": "https://www.svgrepo.com/show/448221/docker.svg",
"project_site": "https://www.docker.com",
"skill_level": 70
},
"FastAPI": {
"tech_logo": "https://fastapi.tiangolo.com/img/favicon.png",
"project_site": "https://fastapi.tiangolo.com",
"skill_level": 80
},
"Actix": {
"tech_logo": "https://actix.rs/img/logo.png",
"project_site": "https://actix.rs",
"skill_level": 20
},
"HTML5": {
"tech_logo": "https://www.svgrepo.com/show/452228/html-5.svg",
"project_site": "https://google.com",
"skill_level": 90
},
"CSS": {
"tech_logo": "https://www.svgrepo.com/show/452185/css-3.svg",
"project_site": "https://google.com",
"skill_level": 60
},
"Git": {
"tech_logo": "https://www.svgrepo.com/show/452210/git.svg",
"project_site": "https://git-scm.com",
"skill_level": 50
},
"Github Actions": {
"tech_logo": "https://cdn.simpleicons.org/githubactions/2088FF",
"project_site": "https://github.com/",
"skill_level": 40
},
"Vs Code": {
"tech_logo": "https://www.svgrepo.com/show/452129/vs-code.svg",
"project_site": "https://code.visualstudio.com",
"skill_level": 60
},
"Gitea": {
"tech_logo": "https://about.gitea.com/gitea.png",
"project_site": "https://about.gitea.com",
"skill_level": 85
},
"AWS": {
"tech_logo": "https://www.svgrepo.com/show/448266/aws.svg",
"project_site": "https://aws.amazon.com",
"skill_level": 40
},
"Firefox": {
"tech_logo": "https://www.svgrepo.com/show/378808/firefox-developer-edition-57-70.svg",
"project_site": "https://www.mozilla.org/en-CA/firefox/developer/",
"skill_level": 80
},
"Markdown": {
"tech_logo": "https://www.svgrepo.com/show/510065/markdown.svg",
"project_site": "https://www.markdownguide.org",
"skill_level": 90
},
"Prettier": {
"tech_logo": "https://prettier.io/icon.png",
"project_site": "https://prettier.io",
"skill_level": 90
},
"DynamoDB": {
"tech_logo": "https://www.svgrepo.com/show/353450/aws-dynamodb.svg",
"project_site": "https://aws.amazon.com/dynamodb/",
"skill_level": 50
},
"Cloudflare": {
"tech_logo": "https://qualified-production.s3.us-east-1.amazonaws.com/uploads/3b522ef84c409e4457032e4b4e3b984abbc92522c6f100f4ccc55c0ccfd3062b.png",
"project_site": "https://www.cloudflare.com/en-ca/",
"skill_level": 40
},
"Netlify": {
"tech_logo": "https://qualified-production.s3.us-east-1.amazonaws.com/uploads/0f63ae7280d8d193e346973a1915bf99aea8c63e254eb062bad0bde99b43a9b7.png",
"project_site": "https://www.netlify.com",
"skill_level": 70
},
"Vercel": {
"tech_logo": "https://www.svgrepo.com/show/361653/vercel-logo.svg",
"project_site": "https://vercel.com/home",
"skill_level": 60
},
"Dioxus": {
"tech_logo": "https://dioxuslabs.com/assets/smalllogo-b1926fd214dc8427.png",
"project_site": "https://dioxuslabs.com",
"skill_level": 60
},
"Vue": {
"tech_logo": "https://vuejs.org/logo.svg",
"project_site": "https://vuejs.org",
"skill_level": 1
},
"Mongodb": {
"tech_logo": "https://www.svgrepo.com/show/331488/mongodb.svg",
"project_site": "https://www.mongodb.com",
"skill_level": 10
},
"Sqlite": {
"tech_logo": "https://www.svgrepo.com/show/374094/sqlite.svg",
"project_site": "https://www.sqlite.org",
"skill_level": 10
},
"PostgreSQL": {
"tech_logo": "https://www.svgrepo.com/show/303301/postgresql-logo.svg",
"project_site": "https://www.postgresql.org",
"skill_level": 10
},
"Diesel": {
"tech_logo": "https://res.cloudinary.com/dpgrgsh7g/image/upload/v1745443276/diesel_logo_ujtvia.png",
"project_site": "https://diesel.rs",
"skill_level": 10
},
"Kubernetes": {
"tech_logo": "https://kubernetes.io/images/kubernetes.png",
"project_site": "https://kubernetes.io",
"skill_level": 5
},
"Terraform": {
"tech_logo": "https://www.svgrepo.com/show/448253/terraform.svg",
"project_site": "https://www.terraform.io",
"skill_level": 10
},
"Traefik": {
"tech_logo": "https://hub.docker.com/api/media/repos_logo/v1/library%2Ftraefik",
"project_site": "https://traefik.io/traefik/",
"skill_level": 60
}
}