diff --git a/.checks/pre-push b/.checks/pre-push index 98a9119..a46a9d5 100755 --- a/.checks/pre-push +++ b/.checks/pre-push @@ -9,6 +9,9 @@ RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' echo -e "${GREEN}Running pre-push checks...${NC}" +# Start time tracking +START_TIME=$(date +%s) + # Setting paths REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" CONTENT_DIR="$REPO_ROOT/content" @@ -22,11 +25,11 @@ rm -f "$LOG_DIR/*" # Cleanup function cleanup() { - trap - EXIT INT TERM - if [[ -n "${SERVER_PID:-}" ]] && ps -p "$SERVER_PID" >/dev/null 2>&1; then - kill "$SERVER_PID" >/dev/null 2>&1 || true - for _ in {1..30}; do ps -p "$SERVER_PID" >/dev/null 2>&1 || break; sleep 0.1; done - fi + trap - EXIT INT TERM + if [[ -n "${SERVER_PID:-}" ]] && ps -p "$SERVER_PID" >/dev/null 2>&1; then + kill "$SERVER_PID" >/dev/null 2>&1 || true + for _ in {1..30}; do ps -p "$SERVER_PID" >/dev/null 2>&1 || break; sleep 0.1; done + fi } trap cleanup EXIT INT TERM @@ -86,8 +89,9 @@ if command -v markdownlint-cli2 &>/dev/null; then MD_FILES="$(git diff HEAD~1 HEAD --name-only --diff-filter=ACM | grep -E '\.md$' || true)" if [[ -n "$MD_FILES" ]]; then echo -e "${GREEN}Running markdownlint...${NC}" - echo $MD_FILES | xargs markdownlint-cli2 >"$LOG_DIR/markdownlint.log" 2>&1 || { - echo -e "${RED}markdownlint-cli2 failed. See $LOG_DIR/markdownlint.log${NC}"; exit 1; } + echo "$MD_FILES" | xargs markdownlint-cli2 >"$LOG_DIR/markdownlint.log" 2>&1 || { + echo -e "${RED}markdownlint-cli2 failed. See $LOG_DIR/markdownlint.log${NC}"; exit 1; + } else echo -e "${YELLOW}No committed Markdown files found. Skipping markdown check.${NC}" fi @@ -100,8 +104,9 @@ if command -v vale &>/dev/null && [[ -f "$REPO_ROOT/.vale.ini" ]]; then echo -e "${GREEN}Running Vale...${NC}" VALE_FILES="$(git diff HEAD~1 HEAD --name-only --diff-filter=ACM | grep -E '\.md$' || true)" if [[ -n "$VALE_FILES" ]]; then - echo $VALE_FILES | xargs vale >"$LOG_DIR/vale.log" 2>&1 || { - echo -e "${RED}Vale issues. See $LOG_DIR/vale.log${NC}"; exit 1; } + echo "$VALE_FILES" | xargs vale >"$LOG_DIR/vale.log" 2>&1 || { + echo -e "${RED}Vale issues. See $LOG_DIR/vale.log${NC}"; exit 1; + } else echo -e "${YELLOW}No committed Markdown files found. Skipping Vale check.${NC}" fi @@ -114,3 +119,8 @@ if ! command -v zensical >/dev/null 2>&1; then echo -e "${RED}Zensical not installed; cannot build docs.${NC}"; exit 1 fi run_command "zensical build --clean" "$LOG_DIR/zensical-build.log" + +# End time tracking and calculate duration +END_TIME=$(date +%s) +DURATION=$((END_TIME - START_TIME)) +echo -e "${GREEN}Push checks completed in $DURATION seconds.${NC}" diff --git a/.envrc b/.envrc index 53c34e1..8c884b7 100755 --- a/.envrc +++ b/.envrc @@ -21,13 +21,14 @@ fi # Run pip to update packages inside the venv echo "Running pip update..." "$VIRTUAL_ENV/bin/python3.14" -m pip install --upgrade pip -"$VIRTUAL_ENV/bin/python3.14" -m pip install --no-cache-dir --upgrade $(pip list --format=freeze | grep -v '^\-e' | cut -d = -f 1 | tr '\n' ' ') +"$VIRTUAL_ENV/bin/python3.14" -m pip install --no-cache-dir --upgrade $(pip list --format=freeze | grep -v '^\-e' | grep -v '^griffe==' | cut -d = -f 1 | tr '\n' ' ') # Exclude the griffe package for now +# "$VIRTUAL_ENV/bin/python3.14" -m pip install --no-cache-dir --upgrade $(pip list --format=freeze | grep -v '^\-e' | cut -d = -f 1 | tr '\n' ' ') "$VIRTUAL_ENV/bin/python3.14" -m pip freeze > requirements.txt # Update requirements.txt with pinned versions only if installs succeeded if [[ $? -eq 0 ]]; then "$VIRTUAL_ENV/bin/python3.14" -m pip freeze > requirements.txt - echo "Packages updated successfully" + echo "Packages updated successfully" else echo "pip install failed; requirements.txt not updated" fi diff --git a/content/assets/css/index.css b/content/assets/css/index.css index 6d77b17..8579aff 100755 --- a/content/assets/css/index.css +++ b/content/assets/css/index.css @@ -85,16 +85,6 @@ width: 100%; } -.down-arrow { - animation: flash 1s infinite; - bottom: 20px; - color: var(--tertiary-colour); - font-size: 1rem; - left: 50%; - position: fixed; - transform: translateX(-50%); -} - .faces .slide { border-radius: 10px; left: 50%; @@ -137,15 +127,3 @@ footer { .hidden { display: none; } - -@keyframes flash { - - 0%, - 100% { - opacity: 1; - } - - 50% { - opacity: 0.5; - } -} diff --git a/content/assets/css/resume.css b/content/assets/css/resume.css index e69de29..f576546 100755 --- a/content/assets/css/resume.css +++ b/content/assets/css/resume.css @@ -0,0 +1,313 @@ +@import url("theme.css"); + +/***************************** +* RESUME +* Styling for the resume page. +*****************************/ + +* { + z-index: 1; +} + +body { + color: var(--primary-colour); + font-family: var(--general-sans); +} + +.page-menu { + align-items: center; + background-color: var(--background-colour); + color: var(--primary-colour); + display: flex; + flex-direction: row; + font-size: 0.6rem; + font-weight: 400; + justify-content: center; + padding: 10px; + position: sticky; + text-align: center; + top: 0; + z-index: 100; + + &>*:not(:last-child)::after { + content: " | "; + margin: 0 8px; + } +} + +.hero { + align-items: center; + background-image: url('../media/face-1276x1276.webp'); + background-position: center center; + background-repeat: no-repeat; + background-size: 50vh; + display: flex; + flex-direction: column; + height: 100vh; + justify-content: center; + text-align: center; + z-index: -5 !important; + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.95); + pointer-events: none; + } + + .title { + font-family: var(--general-serif); + font-size: 5rem; + font-variation-settings: "opsz" 8; + font-weight: 900; + } + + .metadetails { + border-bottom: 0.5px solid lightgray; + border-top: 0.5px solid lightgray; + display: flex; + flex-direction: row; + gap: 5rem; + + img { + height: 2.5rem; + } + + figcaption { + color: var(--primary-colour); + font-family: var(--general-sans); + font-size: 0.8rem; + font-style: normal; + font-weight: 400; + } + } +} + +#experience { + color: var(--primary-colour); + min-height: 80vh; + + + &>div { + margin: 30px; + padding: 1.2rem; + + li { + border: none; + + &:hover { + box-shadow: none; + } + } + + h2 { + color: var(--primary-colour); + font-family: var(--general-sans); + font-size: 2.5rem; + margin: 0 0 -18px 0; + } + + .company { + font-family: var(--general-sans); + font-weight: 400; + font-size: 1.2rem; + margin: 0; + + span { + font-size: 0.7rem; + font-weight: 400; + margin: 0 0 0 25px; + } + } + + .job-blurb { + font-family: var(--general-serif); + font-size: 1.2rem; + font-weight: 700; + line-height: 1.5; + margin-bottom: 30px; + margin-top: 30px; + } + + .job-achievements { + font-family: var(--general-serif); + + h5 { + color: var(--primary-colour); + font-size: 0.9rem; + margin: 0; + text-transform: none; + } + + p { + margin: 0 0 10px 0; + } + } + } + + .mambu { + background-image: url("../media/mambu-logo-272x263.png"); + } + + .spread { + background-image: url("../media/spread-ai-logo-125x144.png"); + } + + .mambu, + .spread { + background-size: contain; + background-repeat: no-repeat; + filter: saturate(0); + height: 112px; + margin-left: 3rem; + margin-right: 3rem; + position: relative; + + &::after { + background: rgba(255, 255, 255, 0.70); + bottom: 0; + content: ''; + left: 0; + pointer-events: none; + position: absolute; + right: 0; + top: 0; + z-index: -5; + } + } +} + +#demo { + margin: 0 2.5rem; + + .cards { + + .twemoji { + font-size: 3rem; + margin-bottom: 8px; + } + + ul li { + align-items: center; + display: flex; + flex-direction: column; + font-size: 1.8rem; + height: 300px; + justify-content: center; + } + } +} + +#learning { + margin: 2.5rem; + + .cards { + + ul li { + background-color: var(--tertiary-colour); + border: none; + + &:hover { + box-shadow: none; + } + } + } +} + +.prefooter { + align-items: flex-start; + display: flex; + flex-direction: row; + gap: 2rem; + justify-content: center; + margin-top: 1.3rem; + margin-bottom: 0.5rem; + text-align: center; + + div { + img { + height: 1.2rem; + } + } + + div:last-child { + img { + height: 1.5rem; + } + } +} + +.faq-container { + position: relative; + + .faq { + background: var(--background-colour); + border: 2px solid var(--primary-colour); + border-radius: 5px; + bottom: 50px; + opacity: 0; + padding: 20px; + position: fixed; + right: 20px; + transition: opacity 0.3s, visibility 0.3s; + visibility: hidden; + width: 300px; + z-index: 999; + + h3 { + color: var(--primary-colour); + font-family: var(--general-serif); + } + } + + #faq-toggle:checked+.question-icon .icon.question { + opacity: 0; + } + + #faq-toggle:checked+.question-icon .icon.close { + opacity: 1; + } + + #faq-toggle:checked~.faq { + opacity: 1; + visibility: visible; + } + + .question-icon { + align-items: center; + bottom: 20px; + cursor: pointer; + display: flex; + justify-content: center; + position: fixed; + right: 20px; + width: 50px; + z-index: 1000; + + .icon { + font-size: 1rem; + position: absolute; + transition: opacity 0.3s; + } + + .icon.question { + opacity: 1; + } + + .icon.close { + opacity: 0; + } + } +} + +.visually-hidden { + height: 1px; + left: -9999px; + overflow: hidden; + position: absolute; + width: 1px; +} diff --git a/content/assets/js/index.js b/content/assets/js/index.js index 35e03ba..f9162d9 100755 --- a/content/assets/js/index.js +++ b/content/assets/js/index.js @@ -1,5 +1,5 @@ // INDEX.js -// Manages the animations on the home page +// Manages the animations on the homepage document.addEventListener('DOMContentLoaded', function () { // Register the GSAP plugin to use diff --git a/content/assets/js/resume.js b/content/assets/js/resume.js deleted file mode 100755 index e69de29..0000000 diff --git a/content/assets/media/allan-gray-logo-243x160.png b/content/assets/media/allan-gray-logo-243x160.png deleted file mode 100755 index c091495..0000000 Binary files a/content/assets/media/allan-gray-logo-243x160.png and /dev/null differ diff --git a/content/assets/media/berlin-logo-1000x1000.png b/content/assets/media/berlin-logo-1000x1000.png new file mode 100755 index 0000000..955d9c2 Binary files /dev/null and b/content/assets/media/berlin-logo-1000x1000.png differ diff --git a/content/assets/media/face-1276x1276.png b/content/assets/media/face-1276x1276.png new file mode 100755 index 0000000..e5aa6f7 Binary files /dev/null and b/content/assets/media/face-1276x1276.png differ diff --git a/content/assets/media/git-link-512x512.png b/content/assets/media/git-link-512x512.png new file mode 100755 index 0000000..410103c Binary files /dev/null and b/content/assets/media/git-link-512x512.png differ diff --git a/content/assets/media/gugulet.hu-site-logo-350x350.png b/content/assets/media/gugulet.hu-site-logo-350x350.png deleted file mode 100755 index e10893f..0000000 Binary files a/content/assets/media/gugulet.hu-site-logo-350x350.png and /dev/null differ diff --git a/content/assets/media/id-card-icon-512x512.png b/content/assets/media/id-card-icon-512x512.png new file mode 100755 index 0000000..81e537c Binary files /dev/null and b/content/assets/media/id-card-icon-512x512.png differ diff --git a/content/assets/media/languages-icon-512x512.png b/content/assets/media/languages-icon-512x512.png new file mode 100755 index 0000000..3789997 Binary files /dev/null and b/content/assets/media/languages-icon-512x512.png differ diff --git a/content/assets/media/linkedin-logo-512x512.png b/content/assets/media/linkedin-logo-512x512.png new file mode 100755 index 0000000..565690b Binary files /dev/null and b/content/assets/media/linkedin-logo-512x512.png differ diff --git a/content/assets/media/mambu-logo-110x112.png b/content/assets/media/mambu-logo-110x112.png deleted file mode 100755 index 9a9aab6..0000000 Binary files a/content/assets/media/mambu-logo-110x112.png and /dev/null differ diff --git a/content/assets/media/mambu-logo-272x263.png b/content/assets/media/mambu-logo-272x263.png new file mode 100755 index 0000000..5bfa994 Binary files /dev/null and b/content/assets/media/mambu-logo-272x263.png differ diff --git a/content/assets/media/pcvue-documentation-2728x1756.png b/content/assets/media/pcvue-documentation-2728x1756.png deleted file mode 100755 index 9944248..0000000 Binary files a/content/assets/media/pcvue-documentation-2728x1756.png and /dev/null differ diff --git a/content/assets/media/pcvue-print-layout-1573x1433.png b/content/assets/media/pcvue-print-layout-1573x1433.png deleted file mode 100755 index 099c2af..0000000 Binary files a/content/assets/media/pcvue-print-layout-1573x1433.png and /dev/null differ diff --git a/content/assets/media/site-link-512x512.png b/content/assets/media/site-link-512x512.png new file mode 100755 index 0000000..ee24ef1 Binary files /dev/null and b/content/assets/media/site-link-512x512.png differ diff --git a/content/assets/media/technical-writing-icon-512x512.png b/content/assets/media/technical-writing-icon-512x512.png new file mode 100755 index 0000000..567ca1b Binary files /dev/null and b/content/assets/media/technical-writing-icon-512x512.png differ diff --git a/content/assets/media/the-jupiter-drawing-room-logo-119x118.png b/content/assets/media/the-jupiter-drawing-room-logo-119x118.png deleted file mode 100755 index 804ac3b..0000000 Binary files a/content/assets/media/the-jupiter-drawing-room-logo-119x118.png and /dev/null differ diff --git a/content/assets/media/what-is-hmi.gif b/content/assets/media/what-is-hmi.gif deleted file mode 100755 index 88745d4..0000000 Binary files a/content/assets/media/what-is-hmi.gif and /dev/null differ diff --git a/content/assets/media/windhoek-jazz-festival-50s.mp3 b/content/assets/media/windhoek-jazz-festival-50s.mp3 deleted file mode 100755 index ab2985c..0000000 Binary files a/content/assets/media/windhoek-jazz-festival-50s.mp3 and /dev/null differ diff --git a/content/assets/media/yoco-logo-206x206.png b/content/assets/media/yoco-logo-206x206.png deleted file mode 100755 index a73f05d..0000000 Binary files a/content/assets/media/yoco-logo-206x206.png and /dev/null differ diff --git a/content/index.md b/content/index.md index 9bf1004..a52098d 100755 --- a/content/index.md +++ b/content/index.md @@ -41,7 +41,3 @@ title: Home - -
Documented integrations, such as payment and compliance services, and the low-code orchestrator that clients used for their flows.
+Documented the Mambu CLI for external engineers to connect to the backend directly.
+Promoted to team lead, which shifted the role into more managerial responsibilities on top of working on documentation.
+Built a pipeline that used GitHub Actions to build the documentation site, Vale to lint content, Docker to deploy the site, and shell scripting.
+Socialized the rest of the company to documentation processes and workings; this included onboarding colleagues to edit and use docs.
+Documented the full product range within two quarters. Kept the documentation up to date through two product refreshes.
+Why did you resign from your last job?
+Grey / Gray+
Do you need visa support? Do you have the right to work in Germany?
+Sesame seed+
Do you need visa support? Do you have the right to work in Germany (and the EU)?
+Can you work remotely?
+Are you able to work on your own?
+When can you start?
+
-