diff --git a/NathanWoodburn.bsdesign b/NathanWoodburn.bsdesign index 9f199bd..02be6b4 100644 Binary files a/NathanWoodburn.bsdesign and b/NathanWoodburn.bsdesign differ diff --git a/data/resume.pdf b/data/resume.pdf index 5173ebc..8abd9b0 100644 Binary files a/data/resume.pdf and b/data/resume.pdf differ diff --git a/data/resume_support.pdf b/data/resume_support.pdf new file mode 100644 index 0000000..7e5cee8 Binary files /dev/null and b/data/resume_support.pdf differ diff --git a/server.py b/server.py index ecaf549..77324a5 100644 --- a/server.py +++ b/server.py @@ -661,13 +661,20 @@ def hosting_post(): return json_response(request, "Failed to send enquiry", 500) return json_response(request, "Enquiry sent", 200) +@app.route("/resume") +def resume(): + # Check if arg for support is passed + support = request.args.get("support") + return render_template( + "resume.html", support=support) @app.route("/resume.pdf") def resume_pdf(): - # Check if file exists - if os.path.isfile("data/resume.pdf"): - return send_file("data/resume.pdf") - return error_response(request, message="Resume not found") + # Check if arg for support is passed + support = request.args.get("support") + if support: + return send_file("data/resume_support.pdf") + return send_file("data/resume.pdf") @app.route("/tools") diff --git a/templates/assets/css/brand-reveal.min.css b/templates/assets/css/brand-reveal.min.css index 6fc6619..9416fd9 100644 --- a/templates/assets/css/brand-reveal.min.css +++ b/templates/assets/css/brand-reveal.min.css @@ -1 +1 @@ -.name-container{display:inline-flex;align-items:center;overflow:hidden;position:absolute;width:fit-content;left:50%;transform:translateX(-50%)}.slider{position:relative;left:0;animation:1s linear 1s forwards slide}@keyframes slide{0%{left:0}100%{left:calc(100%)}}.brand{mask-image:linear-gradient(to right,black 50%,transparent 50%);-webkit-mask-image:linear-gradient(to right,black 50%,transparent 50%);mask-position:100% 0;-webkit-mask-position:100% 0;mask-size:200%;-webkit-mask-size:200%;animation:1s linear 1s forwards reveal}@keyframes reveal{0%{mask-position:100% 0;-webkit-mask-position:100% 0}100%{mask-position:0 0;-webkit-mask-position:0 0}}.now-playing{position:fixed;bottom:0;right:0;border-top-left-radius:10px;background:#10101039;padding:1em} \ No newline at end of file +.name-container{display:inline-flex;align-items:center;overflow:hidden;position:absolute;width:fit-content;left:50%;transform:translateX(-50%)}.slider{position:relative;left:0;animation:1s linear 1s forwards slide}@keyframes slide{0%{left:0}100%{left:calc(100%)}}.brand{mask-image:linear-gradient(to right,black 50%,transparent 50%);-webkit-mask-image:linear-gradient(to right,black 50%,transparent 50%);mask-position:100% 0;-webkit-mask-position:100% 0;mask-size:200%;-webkit-mask-size:200%;animation:1s linear 1s forwards reveal}@keyframes reveal{0%{mask-position:100% 0;-webkit-mask-position:100% 0}100%{mask-position:0 0;-webkit-mask-position:0 0}}.now-playing{position:fixed;bottom:0;right:0;border-top-left-radius:10px;background:#10101039;padding:1em}.hr-l{width:80%;border-width:2px;border-color:var(--bs-light);margin-top:0;opacity:.8}.hr-l-primary{border-width:3px;border-color:var(--bs-primary);margin-top:0;opacity:1}.float-right{position:absolute;right:3em} \ No newline at end of file diff --git a/templates/assets/css/resume-print.css b/templates/assets/css/resume-print.css new file mode 100644 index 0000000..21108a6 --- /dev/null +++ b/templates/assets/css/resume-print.css @@ -0,0 +1,104 @@ +/* print.css */ +@media print { + + /* Page margins */ + @page { + size: A4; + margin: 10mm 10mm; + } + + /* Reset body */ + body, html { + margin: 0; + padding: 0; + font-size: 10pt; /* smaller for print */ + line-height: 1.3; + background: #fff !important; + color: #000 !important; + } + + /* Container adjustments */ + .container-fluid, .resume-row, .resume-column { + padding: 0 !important; + margin: 0 !important; + box-sizing: border-box; + /* background: none !important; */ + } + + /* Flex layout for 33/66 split */ + .resume-row { + display: flex !important; + flex-wrap: nowrap !important; + width: 100% !important; + } + + .resume-column-left { + flex: 0 0 33.3333% !important; + max-width: 33.3333% !important; + padding-left: 5mm !important; + padding-right: 5mm !important; + color: #fff !important; + border: none !important; + break-inside: avoid !important; + page-break-inside: avoid !important; + } + .resume-column-left a { + color: #fff !important; + text-decoration: none !important; + } + + .resume-column-right { + flex: 0 0 66.6667% !important; + max-width: 66.6667% !important; + padding-left: 5mm !important; + padding-right: 5mm !important; + background: #fff !important; + color: #000 !important; + border: none !important; + break-inside: avoid !important; + page-break-inside: avoid !important; + } + + /* Images adjustments */ + img { + max-width: 100% !important; + height: auto !important; + display: block; + margin: 10mm auto !important; + } + + /* Text adjustments for print */ + h1 { font-size: 14pt; margin-bottom: 3mm; } + h2 { font-size: 12pt; margin-bottom: 2mm; } + h3 { font-size: 11pt; margin-bottom: 2mm; } + h4 { font-size: 10pt; margin-bottom: 1mm; } + h5, h6 { font-size: 9pt; margin-bottom: 1mm; } + p, li, .r-body, .l-body { font-size: 10pt; line-height: 1.3; } + + .title { + font-size: 36px !important; + } + .subtitle { + font-size: 18px !important; + } + + .r-heading1 { + margin-top: 4mm !important; + } + + /* Links as plain text */ + a { + color: #000 !important; + text-decoration: none !important; + } + + /* Avoid page breaks inside blocks */ + .noprintbreak { + break-inside: avoid !important; + page-break-inside: avoid !important; + /* margin-bottom: 5mm !important; */ + } + .r-body { + margin-bottom: 0 !important; + } +} diff --git a/templates/assets/css/resume.min.css b/templates/assets/css/resume.min.css index dce144d..3a9c9bd 100644 --- a/templates/assets/css/resume.min.css +++ b/templates/assets/css/resume.min.css @@ -1 +1 @@ -.profile-container{height:170px;width:170px;z-index:2;left:10%}.title{position:absolute;margin-left:calc(100px);width:calc(100% - 100px);padding:1em;margin-top:-240px;z-index:0}.title>*{width:100%;margin-bottom:0}img.profile{left:10px;width:150px;position:absolute;aspect-ratio:1;transform:scale(1);transition:.5s;z-index:2}img.background2{left:0;width:170px!important;margin-top:-10px;pointer-events:none;z-index:1}img.foreground{border-radius:50%;pointer-events:none;z-index:3}img.background:hover,img.backgroundsml:hover{filter:blur(5px)}.spacer{height:100px}img.profilesml{width:150px;position:absolute;left:50%;margin-left:-85px;aspect-ratio:1;padding-top:calc(var(--s)/5);transform:scale(1);transition:.5s}img.foregroundsml{border-radius:50%;pointer-events:none}img.background2sml{width:170px!important;left:calc(50% - 10px);margin-top:-10px;pointer-events:none;z-index:0}print_text{color:#000!important}@media print{.noprintbreak{page-break-inside:avoid}*{color:#000;background-color:#fff}body{background-color:#fff}.hideprint{display:none}.print_text{color:#000!important}.profile-container{margin-top:10px!important}.r-heading1{font-size:16pt!important;margin-bottom:10px!important}.r-heading2{font-size:14pt!important}.r-heading3{font-size:12pt!important}.r-body,.r-small{font-size:10pt!important}.spacer{height:25px!important}}.r-heading1{margin-bottom:20px}.r-heading2{margin-bottom:0}.r-heading3{margin-bottom:.5em}@media (max-width:500px){.print_text{font-size:10px}}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-transform:none} \ No newline at end of file +img.profile-side{width:200px;aspect-ratio:1;z-index:2;border:6px solid #fff;margin:3em 0;border-radius:50%}.spacer{height:100px}.l-heading1,.l-heading2,.r-heading2{margin-bottom:0}.l-heading3,.r-heading3{margin-bottom:.5em}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-transform:none}.side-column{margin-top:2em}.noprintbreak{margin-bottom:1.5em}.resume-column-left{background:var(--bs-primary);padding-left:3em;padding-right:3em;max-width:320px}.resume-column-right{padding-right:3em;padding-left:3em;background:var(--bs-light);color:var(--bs-black)}.row-fill div{padding:0}.r-heading1{font-size:28px;margin-bottom:0;color:var(--bs-primary)}.title-hr{width:15%;color:var(--bs-primary);border-width:5px;border-color:var(--bs-primary);opacity:1}.l-body{margin-left:1em;line-height:initial}.r-body{line-height:initial}.l-summary{margin-top:3em}::selection{color:#fff;background-color:#0c4279}body{max-width:1400px;margin:0 auto} \ No newline at end of file diff --git a/templates/assets/css/styles.min.css b/templates/assets/css/styles.min.css index 3e252b8..1d73a33 100644 --- a/templates/assets/css/styles.min.css +++ b/templates/assets/css/styles.min.css @@ -1 +1 @@ -:root,[data-bs-theme=light]{--bs-primary:#6E0E9C;--bs-primary-rgb:110,14,156;--bs-primary-text-emphasis:#2C063E;--bs-primary-bg-subtle:#E2CFEB;--bs-primary-border-subtle:#C59FD7;--bs-link-color:#6E0E9C;--bs-link-color-rgb:110,14,156;--bs-link-hover-color:#a41685;--bs-link-hover-color-rgb:164,22,133}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#6E0E9C;--bs-btn-border-color:#6E0E9C;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5E0C85;--bs-btn-hover-border-color:#580B7D;--bs-btn-focus-shadow-rgb:233,219,240;--bs-btn-active-color:#fff;--bs-btn-active-bg:#580B7D;--bs-btn-active-border-color:#530B75;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6E0E9C;--bs-btn-disabled-border-color:#6E0E9C}.btn-outline-primary{--bs-btn-color:#6E0E9C;--bs-btn-border-color:#6E0E9C;--bs-btn-focus-shadow-rgb:110,14,156;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6E0E9C;--bs-btn-hover-border-color:#6E0E9C;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6E0E9C;--bs-btn-active-border-color:#6E0E9C;--bs-btn-disabled-color:#6E0E9C;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6E0E9C}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}@media (min-width:992px){.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}} \ No newline at end of file +:root,[data-bs-theme=light]{--bs-primary:#6E0E9C;--bs-primary-rgb:110,14,156;--bs-primary-text-emphasis:#2C063E;--bs-primary-bg-subtle:#E2CFEB;--bs-primary-border-subtle:#C59FD7;--bs-link-color:#6E0E9C;--bs-link-color-rgb:110,14,156;--bs-link-hover-color:#a41685;--bs-link-hover-color-rgb:164,22,133}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#6E0E9C;--bs-btn-border-color:#6E0E9C;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5E0C85;--bs-btn-hover-border-color:#580B7D;--bs-btn-focus-shadow-rgb:233,219,240;--bs-btn-active-color:#fff;--bs-btn-active-bg:#580B7D;--bs-btn-active-border-color:#530B75;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6E0E9C;--bs-btn-disabled-border-color:#6E0E9C}.btn-outline-primary{--bs-btn-color:#6E0E9C;--bs-btn-border-color:#6E0E9C;--bs-btn-focus-shadow-rgb:110,14,156;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6E0E9C;--bs-btn-hover-border-color:#6E0E9C;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6E0E9C;--bs-btn-active-border-color:#6E0E9C;--bs-btn-disabled-color:#6E0E9C;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6E0E9C} \ No newline at end of file diff --git a/templates/resume.html b/templates/resume.html index fe341bf..886e358 100644 --- a/templates/resume.html +++ b/templates/resume.html @@ -35,240 +35,141 @@ - + -
-contact@nathan.woodburn.au | 0493129562 | Canberra, ACT
-@nathanwoodburn | @nathanwoodburn | nathan.woodburn.au
+ +
{% if support %}Technical Support Specialist with expertise in Linux, DNS, and network troubleshooting. Experienced in resolving critical domain and network issues, supporting end-users, and collaborating with engineering teams to ensure stable and secure systems. Skilled in Python automation to streamline repetitive tasks and improve operational efficiency.{% else %}System Administrator specializing in Linux, Docker, and server deployments. Experienced in managing Proxmox, networks, and CI/CD pipelines. Implementing Python automations to optimize system operations. Ability to deploy and maintain server environments, self-hosted services, and web applications while ensuring reliability, scalability, and security.{% endif %}
+
Technical Support Specialist and System Administrator specializing in Linux environments, Docker, and DNS management. Proven ability to deploy and maintain secure server environments, including Proxmox hypervisors and VLAN-isolated networks, while leveraging Python for automation and service deployment. Expertly troubleshoot critical domain and network issues, providing front-line support and collaborating with engineering teams for continuous improvement.
-