Initial CV lib commit
This commit is contained in:
11
.cargo/config.toml
Normal file
11
.cargo/config.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[unstable]
|
||||
codegen-backend = true
|
||||
build-std = ["std", "panic_abort", "core", "alloc"]
|
||||
build-std-features = ["panic_immediate_abort"]
|
||||
|
||||
[profile.server-dev]
|
||||
codegen-backend = "cranelift"
|
||||
|
||||
[build]
|
||||
rustflags = ["--cfg=has_std", "-Z", "threads=8"]
|
||||
target = "x86_64-unknown-linux-gnu"
|
||||
103
.gitignore
vendored
Normal file
103
.gitignore
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
# Rust / Leptos
|
||||
target/
|
||||
dist/
|
||||
debug/
|
||||
Cargo.lock
|
||||
**/*.rs.bk
|
||||
*.pdb
|
||||
|
||||
# Ides
|
||||
.idea
|
||||
.vscode/settings.json
|
||||
*.sublime*
|
||||
|
||||
# runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# miscellaneous
|
||||
/.vs
|
||||
.DS_Store
|
||||
.Thumbs.db
|
||||
debug.log
|
||||
TODO.md
|
||||
|
||||
### Javascript
|
||||
.npm/
|
||||
.yarn/
|
||||
package-lock.json
|
||||
node_modules
|
||||
yarn.lock
|
||||
bun.lockb
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
*.tgz
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
|
||||
# Android
|
||||
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Local configuration file (sdk path, etc)
|
||||
local.properties
|
||||
|
||||
# Log/OS Files
|
||||
*.log
|
||||
|
||||
# Android Studio generated files and folders
|
||||
captures/
|
||||
.externalNativeBuild/
|
||||
.cxx/
|
||||
*.apk
|
||||
output.json
|
||||
|
||||
# IntelliJ
|
||||
*.iml
|
||||
.idea/
|
||||
misc.xml
|
||||
deploymentTargetDropDown.xml
|
||||
render.experimental.xml
|
||||
|
||||
# Keystore files
|
||||
*.jks
|
||||
*.keystore
|
||||
|
||||
# Google Services (e.g. APIs or Firebase)
|
||||
google-services.json
|
||||
|
||||
# Android Profiling
|
||||
*.hprof
|
||||
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
4
.ignore
Normal file
4
.ignore
Normal file
@@ -0,0 +1,4 @@
|
||||
frontend/assets/fonts/*
|
||||
src-tauri/icons/*
|
||||
src-tauri/gen/*
|
||||
target/*
|
||||
45
Cargo.toml
Normal file
45
Cargo.toml
Normal file
@@ -0,0 +1,45 @@
|
||||
[package]
|
||||
name = "portfolio_website"
|
||||
version = "0.1.0"
|
||||
authors = ["Stephen Power"]
|
||||
categories = ["wasm", "web-programming"]
|
||||
edition = "2021"
|
||||
keywords = ["leptos", "cv", "portfolio"]
|
||||
license = "AGPL-3.0"
|
||||
readme = "README.md"
|
||||
repository = "https://github.com/opensourcecheemsburgers/portfolio-website"
|
||||
rust-version = "1.75"
|
||||
description = "My CV built with Leptos and Tailwind."
|
||||
|
||||
[lints.rust]
|
||||
unsafe_code = "forbid"
|
||||
|
||||
[lints.clippy]
|
||||
all = "warn"
|
||||
pedantic = "warn"
|
||||
nursery = "warn"
|
||||
cargo = "warn"
|
||||
|
||||
[profile.release]
|
||||
panic = "abort"
|
||||
codegen-units = 1
|
||||
lto = "fat"
|
||||
opt-level = "z"
|
||||
strip = true
|
||||
|
||||
[profile.dev]
|
||||
panic = "abort"
|
||||
opt-level = 0
|
||||
codegen-units = 256
|
||||
lto = "off"
|
||||
incremental = true
|
||||
debug = false # Enable if debugging is necessary.
|
||||
|
||||
[target.x86_64-unknown-linux-gnu]
|
||||
linker = "clang"
|
||||
rustflags = ["-C", "link-arg=-fuse-ld=/usr/bin/mold"]
|
||||
|
||||
[dependencies]
|
||||
leptos = { version = "0.6.12", features = ["csr", "nightly"] }
|
||||
leptos_router = { version = "0.6.12", features = ["csr", "nightly"] }
|
||||
phosphor-leptos = "0.5.0"
|
||||
25
Trunk.toml
Normal file
25
Trunk.toml
Normal file
@@ -0,0 +1,25 @@
|
||||
[build]
|
||||
release = false
|
||||
dist = "./dist"
|
||||
filehash = true
|
||||
target = "./index.html"
|
||||
|
||||
# [watch]
|
||||
# watch = ["./src", "./index.html", "./assets"]
|
||||
# ignore = ["../target", "./dist", "../src-tauri"]
|
||||
|
||||
[serve]
|
||||
addresses = ["127.0.0.1"]
|
||||
port = 42069
|
||||
open = false
|
||||
no_autoreload = false
|
||||
ws_protocol = "ws"
|
||||
|
||||
[clean]
|
||||
dist = "./dist"
|
||||
cargo = false
|
||||
|
||||
[tools]
|
||||
wasm_bindgen = "0.2.99"
|
||||
wasm_opt = "version_118"
|
||||
tailwindcss = "3.4.10"
|
||||
342
css/input.css
Normal file
342
css/input.css
Normal file
@@ -0,0 +1,342 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
.crisp-edges {
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
image-rendering: -moz-crisp-edges;
|
||||
}
|
||||
/* comfortaa-300 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Comfortaa";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url("../../fonts/comfortaa/comfortaa-v45-latin-300.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* comfortaa-regular - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Comfortaa";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/comfortaa/comfortaa-v45-latin-regular.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* comfortaa-500 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Comfortaa";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url("../../fonts/comfortaa/comfortaa-v45-latin-500.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* comfortaa-600 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Comfortaa";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: url("../../fonts/comfortaa/comfortaa-v45-latin-600.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* comfortaa-700 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Comfortaa";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url("../../fonts/comfortaa/comfortaa-v45-latin-700.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-300 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-300.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-300italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-300italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-regular - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-regular.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-500 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-500italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-500italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-600 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-600italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-600italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-700 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-700italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-700italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-800 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-800.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-800italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-800italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-900 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-900.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* figtree-900italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Figtree";
|
||||
font-style: italic;
|
||||
font-weight: 900;
|
||||
src: url("../../fonts/figtree/figtree-v5-latin-900italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* cousine-regular - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Cousine";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/cousine/cousine-v27-latin-regular.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* cousine-italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Cousine";
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/cousine/cousine-v27-latin-italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* cousine-700 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Cousine";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url("../../fonts/cousine/cousine-v27-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* cousine-700italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Cousine";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url("../../fonts/cousine/cousine-v27-latin-700italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-300 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-300.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-300italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-300italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-regular - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-regular.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-500 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-500.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-500italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 500;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-500italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-600 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-600.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-600italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 600;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-600italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-700italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-700italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-800 - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: normal;
|
||||
font-weight: 800;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-800.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
|
||||
/* open-sans-800italic - latin */
|
||||
@font-face {
|
||||
font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
|
||||
font-family: "Open Sans";
|
||||
font-style: italic;
|
||||
font-weight: 800;
|
||||
src: url("../../fonts/open-sans/open-sans-v40-latin-800italic.woff2")
|
||||
format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
|
||||
}
|
||||
}
|
||||
BIN
fonts/comfortaa/comfortaa-v45-latin-300.woff2
Normal file
BIN
fonts/comfortaa/comfortaa-v45-latin-300.woff2
Normal file
Binary file not shown.
BIN
fonts/comfortaa/comfortaa-v45-latin-500.woff2
Normal file
BIN
fonts/comfortaa/comfortaa-v45-latin-500.woff2
Normal file
Binary file not shown.
BIN
fonts/comfortaa/comfortaa-v45-latin-600.woff2
Normal file
BIN
fonts/comfortaa/comfortaa-v45-latin-600.woff2
Normal file
Binary file not shown.
BIN
fonts/comfortaa/comfortaa-v45-latin-700.woff2
Normal file
BIN
fonts/comfortaa/comfortaa-v45-latin-700.woff2
Normal file
Binary file not shown.
BIN
fonts/comfortaa/comfortaa-v45-latin-regular.woff2
Normal file
BIN
fonts/comfortaa/comfortaa-v45-latin-regular.woff2
Normal file
Binary file not shown.
BIN
fonts/cousine/cousine-v27-latin-700.woff2
Normal file
BIN
fonts/cousine/cousine-v27-latin-700.woff2
Normal file
Binary file not shown.
BIN
fonts/cousine/cousine-v27-latin-700italic.woff2
Normal file
BIN
fonts/cousine/cousine-v27-latin-700italic.woff2
Normal file
Binary file not shown.
BIN
fonts/cousine/cousine-v27-latin-italic.woff2
Normal file
BIN
fonts/cousine/cousine-v27-latin-italic.woff2
Normal file
Binary file not shown.
BIN
fonts/cousine/cousine-v27-latin-regular.woff2
Normal file
BIN
fonts/cousine/cousine-v27-latin-regular.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-300.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-300.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-300italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-300italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-500.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-500.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-500italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-500italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-600.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-600.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-600italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-600italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-700.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-700.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-700italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-700italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-800.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-800.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-800italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-800italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-900.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-900.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-900italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-900italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-italic.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-italic.woff2
Normal file
Binary file not shown.
BIN
fonts/figtree/figtree-v5-latin-regular.woff2
Normal file
BIN
fonts/figtree/figtree-v5-latin-regular.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-300.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-300.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-300italic.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-300italic.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-500.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-500.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-500italic.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-500italic.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-600.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-600.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-600italic.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-600italic.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-700italic.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-700italic.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-800.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-800.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-800italic.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-800italic.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-italic.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-italic.woff2
Normal file
Binary file not shown.
BIN
fonts/open-sans/open-sans-v40-latin-regular.woff2
Normal file
BIN
fonts/open-sans/open-sans-v40-latin-regular.woff2
Normal file
Binary file not shown.
BIN
fonts/rufina/rufina-v15-latin-700.woff2
Normal file
BIN
fonts/rufina/rufina-v15-latin-700.woff2
Normal file
Binary file not shown.
BIN
fonts/rufina/rufina-v15-latin-regular.woff2
Normal file
BIN
fonts/rufina/rufina-v15-latin-regular.woff2
Normal file
Binary file not shown.
12
index.html
Normal file
12
index.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>CV</title>
|
||||
<link data-trunk rel="tailwind-css" href="./css/input.css" />
|
||||
<link data-trunk rel="copy-dir" href="./fonts" />
|
||||
<link data-trunk rel="copy-dir" href="./images" />
|
||||
<link data-trunk rel="rust"/>
|
||||
</head>
|
||||
</html>
|
||||
7
package.json
Normal file
7
package.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"daisyui": "^4.12.23",
|
||||
"picocolors": "^1.1.1",
|
||||
"tailwindcss": "3.4.10"
|
||||
}
|
||||
}
|
||||
29
src/education.rs
Normal file
29
src/education.rs
Normal file
@@ -0,0 +1,29 @@
|
||||
use crate::section::Section;
|
||||
use leptos::{component, view, Children, IntoView};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn EducationExperience(children: Children) -> impl IntoView {
|
||||
view! { <Section title="Education">{children()}</Section> }
|
||||
}
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Education(
|
||||
institution: &'static str,
|
||||
degree: &'static str,
|
||||
time_period: &'static str,
|
||||
) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-1">
|
||||
<div class="flex flex-row justify-between w-full text-sm">
|
||||
<div class="flex flex-row font-sans text-black">
|
||||
<h4>{institution} {" - "} {degree}</h4>
|
||||
</div>
|
||||
<div class="flex flex-row font-sans text-gray-500">
|
||||
<p>{time_period}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
67
src/header.rs
Normal file
67
src/header.rs
Normal file
@@ -0,0 +1,67 @@
|
||||
use leptos::{component, view, IntoView};
|
||||
use phosphor_leptos::{Browser, IconWeight, Mailbox, MapPin, Phone};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Header(
|
||||
name: &'static str,
|
||||
job_title: &'static str,
|
||||
location: &'static str,
|
||||
location_osm_link: &'static str,
|
||||
phone_number: &'static str,
|
||||
email: &'static str,
|
||||
website: &'static str,
|
||||
) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-row justify-between w-full">
|
||||
<HeaderLeft name=name job_title=job_title />
|
||||
<HeaderRight
|
||||
location=location
|
||||
location_osm_link=location_osm_link
|
||||
phone_number
|
||||
email=email
|
||||
website=website
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
#[component]
|
||||
fn HeaderLeft(name: &'static str, job_title: &'static str) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-4">
|
||||
<h1 class="font-serif text-3xl font-semibold text-black">{name}</h1>
|
||||
<h2 class="font-sans text-xl text-gray-500">{job_title}</h2>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
#[component]
|
||||
fn HeaderRight(
|
||||
location: &'static str,
|
||||
location_osm_link: &'static str,
|
||||
phone_number: &'static str,
|
||||
email: &'static str,
|
||||
website: &'static str,
|
||||
) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-0.5 font-sans text-gray-600 text-[11px]">
|
||||
<div class="flex flex-row gap-2 items-center hover:cursor-pointer hover:text-info">
|
||||
<MapPin weight=IconWeight::Fill class="fill-gray-300 w-[18px] h-[18px]" />
|
||||
<a href=location_osm_link>{location}</a>
|
||||
</div>
|
||||
<div class="flex flex-row gap-2 items-center hover:cursor-pointer fill-gray-400 hover:text-info">
|
||||
<Phone weight=IconWeight::Fill class="fill-gray-300 w-[18px] h-[18px]" />
|
||||
<a href=format!("tel:{}", phone_number)>{phone_number}</a>
|
||||
</div>
|
||||
<div class="flex flex-row gap-2 items-center hover:cursor-pointer fill-gray-400 hover:text-info">
|
||||
<Mailbox weight=IconWeight::Fill class="fill-gray-300 w-[18px] h-[18px]" />
|
||||
<a href=format!("mailto:{}", email)>{email}</a>
|
||||
</div>
|
||||
<div class="flex flex-row gap-2 items-center hover:text-info">
|
||||
<Browser weight=IconWeight::Fill class="fill-gray-300 w-[18px] h-[18px]" />
|
||||
<a href=format!("https://{}", website)>{website}</a>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
8
src/lib.rs
Normal file
8
src/lib.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
pub mod education;
|
||||
pub mod header;
|
||||
pub mod page;
|
||||
pub mod projects;
|
||||
pub mod section;
|
||||
pub mod skills;
|
||||
pub mod summary;
|
||||
pub mod work;
|
||||
13
src/page.rs
Normal file
13
src/page.rs
Normal file
@@ -0,0 +1,13 @@
|
||||
use leptos::{component, view, Children, IntoView};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Page(children: Children) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col justify-center items-center place-content-center leading-[1.15]">
|
||||
<div class="py-8 bg-white rounded px-[72px] px-18 h-a4 w-a4 inset-shadow-black inset-shadow-sm">
|
||||
<div class="flex flex-col space-y-4 w-full h-full">{children()}</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
27
src/projects.rs
Normal file
27
src/projects.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use crate::section::Section;
|
||||
use leptos::{component, view, Children, For, IntoView};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn PersonalExperience(children: Children) -> impl IntoView {
|
||||
view! { <Section title="Personal Experience">{children()}</Section> }
|
||||
}
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Project(title: &'static str, achievements: Vec<&'static str>) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-1.5">
|
||||
<div class="flex flex-row justify-between w-full text-sm">
|
||||
<div class="flex flex-row font-sans font-medium text-black">
|
||||
<h4>{title}</h4>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="space-y-1 font-sans list-disc list-inside">
|
||||
<For each=move || achievements.clone() key=std::clone::Clone::clone let:achievement>
|
||||
<li class="px-2">{achievement}</li>
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
14
src/section.rs
Normal file
14
src/section.rs
Normal file
@@ -0,0 +1,14 @@
|
||||
use leptos::{component, view, Children, IntoView};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Section(children: Children, title: &'static str) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-2 text-black text-[11px] text-pretty">
|
||||
<div class="h-px divider divider-neutral divider-start">
|
||||
<h3 class="font-sans text-lg font-medium text-black">{title}</h3>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-3">{children()}</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
34
src/skills.rs
Normal file
34
src/skills.rs
Normal file
@@ -0,0 +1,34 @@
|
||||
use leptos::{component, view, Children, For, IntoView};
|
||||
|
||||
use crate::section::Section;
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Skills(children: Children) -> impl IntoView {
|
||||
view! {
|
||||
<Section title="Skills">
|
||||
<div class="flex flex-row justify-between w-full">{children()}</div>
|
||||
</Section>
|
||||
}
|
||||
}
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Skill(title: &'static str, items: Vec<&'static str>) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-1">
|
||||
<div class="flex flex-row justify-between w-full text-sm">
|
||||
<div class="flex flex-row font-sans font-medium text-black">
|
||||
<h4>{title}</h4>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="font-sans list-disc list-inside leading-[1.5]">
|
||||
<For each=move || items.clone() key=std::clone::Clone::clone let:item>
|
||||
<div class="flex flex-row gap-1 items-center">
|
||||
<li class="text-[11px]">{item}</li>
|
||||
</div>
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
9
src/summary.rs
Normal file
9
src/summary.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
use leptos::{component, view, IntoView};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Summary(summary: &'static str) -> impl IntoView {
|
||||
view! {
|
||||
<div class="pt-3 font-sans text-justify text-black text-[11px] text-pretty">{summary}</div>
|
||||
}
|
||||
}
|
||||
35
src/work.rs
Normal file
35
src/work.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
use crate::section::Section;
|
||||
use leptos::{component, view, Children, For, IntoView};
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn WorkExperience(children: Children) -> impl IntoView {
|
||||
view! { <Section title="Work Experience">{children()}</Section> }
|
||||
}
|
||||
|
||||
#[component]
|
||||
#[must_use]
|
||||
pub fn Job(
|
||||
company: &'static str,
|
||||
title: &'static str,
|
||||
time_period: &'static str,
|
||||
achievements: Vec<&'static str>,
|
||||
) -> impl IntoView {
|
||||
view! {
|
||||
<div class="flex flex-col space-y-1">
|
||||
<div class="flex flex-row justify-between w-full text-sm">
|
||||
<div class="flex flex-row font-sans font-medium text-black">
|
||||
<h4>{company} {" - "} {title}</h4>
|
||||
</div>
|
||||
<div class="flex flex-row font-sans text-gray-500">
|
||||
<p>{time_period}</p>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="space-y-1 font-sans list-disc list-inside">
|
||||
<For each=move || achievements.clone() key=std::clone::Clone::clone let:achievement>
|
||||
<li class="px-2">{achievement}</li>
|
||||
</For>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
27
tailwind.config.js
Normal file
27
tailwind.config.js
Normal file
@@ -0,0 +1,27 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
mode: "jit",
|
||||
content: [
|
||||
"./css/*.{js,ts,jsx,tsx,css,scss,html}",
|
||||
"./css/**/*.{js,ts,jsx,tsx}",
|
||||
"./src/**/*.{js,ts,jsx,tsx,rs,scss,css,html}",
|
||||
"./index.html",
|
||||
"./src/main.rs",
|
||||
],
|
||||
plugins: [require("daisyui"), require("@tailwindcss/typography")],
|
||||
theme: {
|
||||
extend: {
|
||||
fontFamily: {
|
||||
sans: ["Figtree"],
|
||||
serif: ["Rufina"],
|
||||
mono: ["Cousine"],
|
||||
},
|
||||
width: {
|
||||
a4: "210mm",
|
||||
},
|
||||
height: {
|
||||
a4: "297mm",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user