Compare commits

...

9 Commits

24 changed files with 1425 additions and 324 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

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 = "1.0.0"
version = "1.6.0"
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 = "1.0.0"
version = "1.6.0"
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.

View File

@ -7,30 +7,122 @@
margin-top: 50px;
}
#blog a:hover {
color: #91a4d2;
}
#blogs {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 80svh;
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: #ffffff;
font-size: xx-large;
padding: 1rem;
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;
}
#blogs-title {
display: flex;
flex-direction: column;
padding-bottom: 1svh;
}
#blogs-title p {
margin: 0svh 1svw;
padding: 1svh 0svw;
}
#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

@ -88,6 +88,13 @@
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;

View File

@ -15,24 +15,17 @@
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 2svw;
padding: 0svh 2svw;
margin: 2svh 0svw;
padding: 0svh 0svw;
}
#contact-me {
display: flex;
justify-content: center;
flex-direction: column;
background-color: transparent;
border-radius: 0px;
margin: 2svh 0.5svw;
padding: 0svh 1svw;
}
#contact-me input {
/* #contact-me input {
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.5);
@ -53,9 +46,9 @@
color: inherit;
align-items: start;
min-height: 25svh;
}
} */
#contact-me button {
/* #contact-me button {
border-radius: var(--card-border-radius);
border-color: rgba(245, 245, 245, 0.5);
padding: 1svh 0svw;
@ -64,17 +57,7 @@
align-items: start;
background-color: rgba(0, 128, 0, 0.6);
border-color: transparent;
}
#ContactMe form {
display: flex;
justify-content: center;
flex-direction: column;
background-color: transparent;
border-radius: 0px;
margin: 2svh 0.5svw;
padding: 0svh 1svw;
}
} */
#ContactMe input {
background-color: var(--card-background-color);
@ -109,3 +92,9 @@
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

@ -28,3 +28,10 @@ footer a {
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

@ -2,7 +2,7 @@
display: flex;
flex-direction: column;
width: 90%;
margin-top: 2svh;
margin: 2svh auto;
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
}
@ -22,6 +22,30 @@
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;

View File

@ -15,13 +15,22 @@
background-color: var(--card-background-color);
border-radius: var(--card-border-radius);
border: none;
color: #ffffff;
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

@ -63,6 +63,20 @@
filter: invert() hue-rotate(180deg);
}
.project-title-info #gitea 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 div {
display: flex;
gap: 1svw;

View File

@ -1,6 +1,4 @@
use dioxus::prelude::*;
const EXPERIENCE_CSS: Asset = asset!("/assets/styling/experience.css");
use dioxus::{document, prelude::*};
#[component]
pub fn Experience(professional_jobs: bool) -> Element {
@ -10,7 +8,7 @@ pub fn Experience(professional_jobs: bool) -> Element {
};
rsx! {
div { class: "experience-comp",
document::Link { rel: "stylesheet", href: EXPERIENCE_CSS }
document::Stylesheet { href: asset!("/assets/styling/experience.css") }
if professional_jobs {
h3 { "Professional" }
} else {
@ -32,7 +30,6 @@ pub fn Experience(professional_jobs: bool) -> Element {
td { "{exp.start_month} - {exp.end_month}" }
}
tr {
// td { "" }
td { "{exp.company}" }
td { "{exp.location}" }
}

View File

@ -3,8 +3,6 @@ use std::collections::HashMap;
use crate::helper_fun::{tech_table_lookup, TechDes};
use dioxus::prelude::*;
const ENDER_CSS: Asset = asset!("/assets/styling/ender.css");
#[component]
pub fn Ender() -> Element {
// gets list of items to get
@ -16,7 +14,7 @@ pub fn Ender() -> Element {
footer_info.insert(used_tech_item, *tech_table_lookup(used_tech_item));
}
rsx! {
document::Link { rel: "stylesheet", href: ENDER_CSS }
document::Stylesheet { href: asset!("/assets/styling/ender.css") }
footer {
p { "Brock Tomlinson © 2025" }
div {

View File

@ -1,8 +1,6 @@
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);
@ -19,14 +17,12 @@ pub fn TechCard(tech_props: &'static str) -> Element {
#[component]
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",
h3 { "{cat}" }
div { class: "tech-row",
for tech in tech_vec {
TechCard {
tech_props: tech,
}
TechCard { tech_props: tech }
}
}
}

View File

@ -28,10 +28,10 @@ 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("/blogs/: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`.
Blogs { id: i32 },
Blogs { page_num: u32 },
#[route("/blogs/:blog_title")]
Blog {blog_title: String},
@ -40,7 +40,7 @@ pub enum Route {
Projects {},
#[route("/contact")]
ContactMe,
ContactMe {},
#[route("/new_home")]
NewHome {},
@ -49,12 +49,10 @@ pub enum Route {
PageNotFound { route: Vec<String> },
}
const NOT_FOUND_CSS: Asset = asset!("/assets/styling/notFound.css");
#[component]
fn PageNotFound(route: Vec<String>) -> Element {
rsx! {
document::Link { rel: "stylesheet", href: NOT_FOUND_CSS }
document::Stylesheet { href: asset!("/assets/styling/notFound.css") }
div { id: "not-found",
h1 { "Page not found" }
p { "We are terribly sorry, but the page you requested doesn't exist." }
@ -64,3 +62,15 @@ fn PageNotFound(route: Vec<String>) -> Element {
}
}
}
// 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

@ -7,7 +7,7 @@ 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
@ -26,10 +26,34 @@ 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> {}
}
}
#[cfg(feature = "ssg")]
fn main() {
use dioxus_fullstack::{incremental::IncrementalRendererConfig, prelude::*};
LaunchBuilder::new()
.with_cfg(
ServeConfig::builder()
.incremental(
IncrementalRendererConfig::new()
.static_dir(
std::env::current_exe()
.unwrap()
.parent()
.unwrap()
.join("public"),
)
.clear_cache(false),
)
.enable_out_of_order_streaming(),
)
.launch(app);
}

View File

@ -1,7 +1,9 @@
use crate::Route;
use dioxus::{document::Link, prelude::*};
use dioxus::{logger::tracing, prelude::*};
use reqwest;
use serde::{Deserialize, Serialize};
const BLOG_CSS: Asset = asset!("/assets/styling/blog.css");
// const BLOG_CSS: Asset = asset!("/assets/styling/blog.css");
/// The Blog page component that will be rendered when the current route is `[Route::Blog]`
///
@ -9,43 +11,206 @@ const BLOG_CSS: Asset = asset!("/assets/styling/blog.css");
/// re-run and the rendered HTML will be updated.
#[component]
pub fn Blog(blog_title: String) -> Element {
rsx! {
document::Link { rel: "stylesheet", href: BLOG_CSS }
let blog_content = use_signal(move || {
"<h1>This is a blog #blog_title</h1><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()
});
// let blog_content = use_signal(move || 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(),
// });
let blog = blog_content();
// let last_edit = &blog.date_last_edit;
// let tag = &blog.tags;
rsx! {
document::Stylesheet { href: asset!("/assets/styling/blog.css") }
document::Title { "Brock Tomlinson - {blog_title}" }
div { id: "blog",
// Content
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."
}
// 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" }
// div { dangerous_inner_html: *&blog.html_blog_content.as_str(),
// h1 { "{blog_title}" }
// div {
// p { "{&blog.tags}" }
// p { "{&blog.date_last_edit}" }
// }
// }
div { dangerous_inner_html: blog_content }
}
}
}
async fn get_blog(blog_name: String) {
let res = reqwest::get("https://www.rust-lang.org")
.await
.unwrap()
.text()
.await
.unwrap_or("".to_string());
tracing::info!("{}", res);
}
#[component]
pub fn Blogs(id: i32) -> Element {
pub fn Blogs(page_num: u32) -> Element {
let mut _num_limit: Signal<u8> = use_signal(|| 10);
let blogs_resource: Resource<Vec<BlogContent>> = use_resource(move || async move {
get_blogs_preview(_num_limit(), page_num)
.await
.unwrap_or_else(|_| vec![])
});
rsx! {
document::Link { rel: "stylesheet", href: BLOG_CSS }
document::Stylesheet { href: asset!("/assets/styling/blog.css") }
div { id: "blogs",
h1 { "Page Under Development" }
p { "Please Try Again Later" }
dioxus::prelude::Link { to: Route::Home {},
button { "Home" }
document::Title { "Brock Tomlinson - 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" }
}
// Link { to: Route::Home {},
// button { "Home" }
// }
// Link {
// to: Route::Blog {
// blog_title: "Test_Blog".to_string(),
// },
// button { "To Test Blog" }
// }
div {
if let Some(blogs) = &*blogs_resource.read() {
if blogs.len() > 0 {
for blog in blogs.iter() {
Link {
to: Route::Blog {
blog_title: blog.blog_file_name.clone(),
},
div { dangerous_inner_html: blog.html_blog_content.as_str(),
h1 { "{blog.blog_title}" }
div {
p { "{blog.tags}" }
p { "{blog.date_last_edit}" }
}
}
}
}
} 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| {
tracing::info!("Change happened {:?}", event.value());
_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: 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: String = client
.get(format!(
"http://localhost:8000/blogs/{}/{}",
_num_limit, page_num
))
.timeout(std::time::Duration::from_secs(10))
.send()
.await?
.text()
.await?;
let json: serde_json::Value = serde_json::from_str(&res).unwrap();
// 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();
// tracing::info!("{:?}", blogs);
Ok(blogs)
}

View File

@ -1,19 +1,18 @@
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",
div {
div {
img {
src: PROFESSIONAL_PHOTO_JPG,
alt: "Borck's professional photo",
alt: "Brock's professional photo",
}
}
}

View File

@ -1,25 +1,22 @@
use std::collections::HashMap;
use reqwest::Client;
use serde_json;
use dioxus::{logger::tracing, prelude::*};
// use dioxus::logger::tracing;
use dioxus::prelude::*;
use crate::views::Contact;
const CONTACTME_CSS: Asset = asset!("/assets/styling/contactme.css");
#[component]
pub fn ContactMe() -> Element {
let mut pre_form: Signal<HashMap<&'static str, String>> = use_signal(|| {
HashMap::from([
("Name", "".to_string()),
("Email", "".to_string()),
("Message", "".to_string()),
])
});
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: Signal<String> = use_signal(|| "".to_string());
let mut _error_box_message = use_signal(|| String::new());
rsx! {
document::Link { rel: "stylesheet", href: CONTACTME_CSS }
document::Stylesheet { href: asset!("/assets/styling/contactme.css") }
document::Title { "Brock Tomlinson - Contact" }
div { id: "ContactMe",
div {
h2 { "Get in Touch" }
@ -29,32 +26,36 @@ pub fn ContactMe() -> Element {
}
}
div {
div { id: "contact-me",
label { "Name" }
input {
oninput: move |event| {
pre_form.write().insert("Name", event.value());
},
}
label { "Email" }
input {
r#type: "email",
oninput: move |event| {
pre_form.write().insert("Email", event.value());
},
}
label { "Message" }
textarea {
oninput: move |event| {
pre_form.write().insert("Message", event.value());
},
}
p { "{error_box_message}" }
button {
r#type: "submit",
onclick: move |_| tracing::info!("Clicked!\n{:?}", pre_form),
"Submit"
}
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"
}
}
}
@ -62,13 +63,72 @@ pub fn ContactMe() -> Element {
}
}
// onsubmit:move |event| { log::info!("Submitted! {event:?}"),
// FormEvent {
// value: "NameEmailMessageSubmit",
// values: {
// "name": FormValue(["asdasd"]),
// "message": FormValue(["asdads"]),
// "email": FormValue(["adasdad@asdasd.asdads"])
// },
// valid: false
// }
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("https://discord.com/api/webhooks/1371617469281861772/uARm18pvzzs4DVNLSYNYCyl7CQk_7eglqGmBabQASow2L7NHgGRHzQhkSAKaOIZmLnn1")
.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

@ -3,8 +3,6 @@ use crate::views::{Contact, Projects};
use crate::Route;
use dioxus::prelude::*;
const HOME_CSS: Asset = asset!("/assets/styling/home.css");
#[component]
pub fn Home() -> Element {
let languages = vec![
@ -32,30 +30,33 @@ pub fn Home() -> Element {
];
let platforms = vec!["AWS", "Cloudflare", "Vercel", "Netlify", "Gitea", "Github"];
rsx!(
document::Link { rel: "stylesheet", href: HOME_CSS }
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."
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."
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 persure it further.
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 advore problem solving and building cool stuff, I'm happy to jump in and get started! "
Link { to: Route::ContactMe {}, "Let's create something great together!" }
"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",
@ -73,7 +74,7 @@ pub fn Home() -> Element {
}
}
Contact {}
Projects {}
Projects { independent_page: false }
div { id: "experience",
h2 { "Experience" }
div {

View File

@ -2,9 +2,6 @@ use crate::components::Ender;
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");
/// The Navbar component that will be rendered on all pages of our app since every page is under the layout.
///
///
@ -13,13 +10,13 @@ const STD_COLOUR_AND_FONTS_CSS: Asset = asset!("assets/styling/standardColoursan
#[component]
pub fn Navbar() -> Element {
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") }
div { id: "navbar",
Link { to: Route::Home {}, "Home" }
Link { to: Route::Projects {}, "Projects" }
Link { to: Route::Blogs { id: 0 }, "Blogs" }
Link { to: Route::Blogs { page_num: 0 }, "Blogs" }
Link { to: Route::ContactMe {}, "Contact" }
}

View File

@ -2,19 +2,36 @@ use crate::helper_fun::get_tech_logos_from_str;
use dioxus::prelude::*;
#[component]
pub fn Projects() -> Element {
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: "Portfolio Site",
website_prop: "https://darkicewolf50.github.io",
github_prop: "https://github.com/darkicewolf50/darkicewolf50.github.io",
project_name: "Portfolio Site Version 1.1.0",
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", "Github Actions", "Git", "Github"],
techs_used: vec!["Rust", "CSS", "Dioxus", "Git", "Gitea"],
project_des: "This project was a great test of my newly learned Rust.
This minor update added functionality for the contact me, the ground work for 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.
The part I am both excited for and deading is going to be the blogs component which I believe I have solved for now.",
}
ProjectCards {
project_name: "Portfolio Site",
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.
@ -32,7 +49,7 @@ pub fn Projects() -> Element {
}
ProjectCards {
project_name: "UCalgary Baja Website",
website_prop: "https://uofcbaja.pages.dev",
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",
@ -57,19 +74,18 @@ pub fn Projects() -> Element {
}
}
const PROJECT_CARDS_CSS: Asset = asset!("/assets/styling/projectCards.css");
#[component]
pub fn ProjectCards(
website_prop: Option<&'static str>,
github_prop: Option<&'static str>,
website_link: Option<&'static str>,
github_link: Option<&'static str>,
gitea_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::Link { href: PROJECT_CARDS_CSS, rel: "stylesheet" }
document::Stylesheet { href: asset!("/assets/styling/projectCards.css") }
div { class: "project-card",
img {
src: "{project_img}",
@ -78,12 +94,17 @@ pub fn ProjectCards(
div { class: "project-title-info",
h3 { "{project_name}" }
div {
if let Some(github_site) = github_prop {
if let Some(github_site) = github_link {
a { href: "{github_site}",
get_tech_logos_from_str { used_tech: "Github" }
}
}
if let Some(site) = website_prop {
if let Some(gitea_site) = gitea_link {
a { href: "{gitea_site}", id: "gitea",
get_tech_logos_from_str { used_tech: "Gitea" }
}
}
if let Some(site) = website_link {
a { href: "{site}",
get_tech_logos_from_str { used_tech: "Internet" }
}