Compare commits

...

4 Commits

Author SHA1 Message Date
Mark aa40b0803d Add security cleanup documentation
Deploy to Production / deploy (push) Successful in 10s Details
2026-04-09 10:51:53 +02:00
Mark bce5d5720e Add .gitignore and remove sensitive export files from tracking 2026-04-09 10:50:30 +02:00
Kristijan Popovski bc95b632f7 Changes in code after first review from Google AI Studio 2026-04-09 09:29:55 +02:00
Kristijan Popovski 63d160f484 Renaming projects site html link 2026-04-08 23:24:41 +02:00
13 changed files with 746 additions and 52 deletions

18
.gitignore vendored
View File

@ -1,4 +1,16 @@
Thumbs.db
# Sensitive exports
code_export.txt
code_export.ps1.test.txt
*.test.txt
# OS files
.DS_Store
gitea-token*.txt
gitea-token*.txt.sig
Thumbs.db
# IDE
.vscode/
.idea/
# Temporary files
*.tmp
*.log

29
SECURITY_CLEANUP.md Normal file
View File

@ -0,0 +1,29 @@
# Security Cleanup - April 9, 2026
## What happened
Sensitive data (code exports containing potential tokens) was accidentally committed to git history in commit 2807a55.
## Actions taken
1. ✅ Removed sensitive files from tracking (code_export.txt, code_export.ps1.test.txt)
2. ✅ Added proper .gitignore to prevent future leaks
3. ✅ Used git-filter-repo to completely remove files from entire git history
4. ✅ Prepared for force-push to rewrite remote history
## Next steps (MANUAL)
1. **CRITICAL**: Revoke the exposed Gitea token immediately in Gitea settings
2. Generate a new Gitea token
3. Update any services using the old token
4. Execute: `git push --force origin master` to rewrite remote history
5. Notify any collaborators to re-clone the repository
## Prevention
- .gitignore now blocks code_export.txt and similar files
- export_code.ps1 already has exclusions for sensitive patterns
- Always review git status before committing
## Verification
After force-push, verify that sensitive files are not in history:
```bash
git log --all --full-history -- code_export.txt
# Should return nothing
```

View File

@ -5,6 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Contact | Kristijan Popovski</title>
<meta name="description" content="Contact Kristijan Popovski for strategic partnerships, governance initiatives, consulting conversations, or collaboration opportunities.">
<meta http-equiv="refresh" content="0; url=contact/">
<meta name="robots" content="noindex">
<link rel="canonical" href="contact/">
<script>window.location.replace("contact/");</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet">

148
contact/index.html Normal file
View File

@ -0,0 +1,148 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Contact | Kristijan Popovski</title>
<meta name="description" content="Contact Kristijan Popovski for strategic partnerships, governance initiatives, consulting conversations, or collaboration opportunities.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../css/style.css">
<script>document.documentElement.classList.add('js-enabled');</script>
</head>
<body>
<div class="site-shell">
<header class="site-header">
<div class="site-header__inner">
<a class="brand" href="../">Kristijan Popovski</a>
<nav class="site-nav" aria-label="Primary">
<ul class="site-nav__list">
<li><a class="site-nav__link" href="../">Home</a></li>
<li><a class="site-nav__link" href="../projects/">Projects</a></li>
<li><a class="site-nav__link" href="../cv/">CV</a></li>
<li><a class="site-nav__link is-current" href="./">Contact</a></li>
</ul>
</nav>
<div class="site-header__actions">
<a class="button button--primary button--small" href="./">Get in Touch</a>
<button class="menu-toggle" type="button" aria-label="Open menu" aria-expanded="false" data-menu-toggle>
<span class="menu-toggle__line"></span>
</button>
</div>
</div>
<nav class="mobile-nav" aria-label="Mobile" data-mobile-nav>
<ul class="mobile-nav__list">
<li><a class="mobile-nav__link" href="../">Home</a></li>
<li><a class="mobile-nav__link" href="../projects/">Projects</a></li>
<li><a class="mobile-nav__link" href="../cv/">CV</a></li>
<li><a class="mobile-nav__link is-current" href="./">Contact</a></li>
</ul>
</nav>
</header>
<main class="page-main">
<section class="section section--tight">
<div class="container">
<div class="contact-intro">
<div data-animate>
<div class="eyebrow eyebrow--plain">Contact</div>
<h1 class="page-title">Let's architect <strong>your next vision.</strong></h1>
<p class="page-lede">Interested in working together? Open to discussions around strategic collaboration, governance initiatives, advisory work, and thoughtfully run projects.</p>
</div>
<div class="image-frame" data-animate>
<img src="../assets/images/portrait-main.jpg" alt="Portrait of Kristijan Popovski on the contact page" width="870" height="1160">
</div>
</div>
</div>
</section>
<section class="section section--tight">
<div class="container--narrow">
<article class="form-card" data-animate>
<h2 class="form-card__title">Fill out to connect</h2>
<div class="form-card__accent"></div>
<form class="form" action="https://formspree.io/f/YOUR_ID_HERE" method="post" novalidate data-contact-form>
<div class="form__grid">
<div class="form-field">
<label class="form-field__label" for="full-name">Full Name</label>
<input class="form-field__control" id="full-name" name="full_name" type="text" placeholder="John Doe" data-label="Full name" data-required>
<div class="form-field__error" aria-live="polite"></div>
</div>
<div class="form-field">
<label class="form-field__label" for="title-org">Title / Organization</label>
<input class="form-field__control" id="title-org" name="title_org" type="text" placeholder="CTO at Visionary" data-label="Title / Organization" data-required>
<div class="form-field__error" aria-live="polite"></div>
</div>
<div class="form-field">
<label class="form-field__label" for="email">Email</label>
<input class="form-field__control" id="email" name="email" type="email" placeholder="john@example.com" data-label="Email" data-required>
<div class="form-field__error" aria-live="polite"></div>
</div>
<div class="form-field">
<label class="form-field__label" for="phone">Phone</label>
<input class="form-field__control" id="phone" name="phone" type="tel" placeholder="+1 555 000 0000" data-label="Phone">
<div class="form-field__error" aria-live="polite"></div>
</div>
</div>
<div class="form-field">
<label class="form-field__label" for="message">Message</label>
<textarea class="form-field__control" id="message" name="message" rows="5" placeholder="Tell me about your project or idea..." data-label="Message" data-required></textarea>
<div class="form-field__error" aria-live="polite"></div>
</div>
<button class="button button--dark button--block" type="submit">Send Message</button>
<div class="form-status" aria-live="polite" data-form-status></div>
<p class="form-note">Replace the placeholder Formspree action with your real form ID to enable live submissions.</p>
</form>
</article>
<div class="link-grid link-grid--two">
<a class="contact-link" href="mailto:popovskik02@yahoo.com" data-animate>
<span class="contact-link__main">
<span class="contact-link__icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4-8 5-8-5V6l8 5 8-5v2z"/></svg>
</span>
<span>
<span class="contact-link__eyebrow">Direct Email</span>
<span class="contact-link__title">popovskik02@yahoo.com</span>
</span>
</span>
<svg class="contact-link__arrow" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M12 4v2h4.59L7.76 14.83l1.41 1.41L18 7.41V12h2V4z"/></svg>
</a>
<a class="contact-link" href="https://www.linkedin.com/in/popovski-k/" target="_blank" rel="noreferrer" data-animate>
<span class="contact-link__main">
<span class="contact-link__icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M19 3A2 2 0 0 1 21 5v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm-8.34 14.34V10.5H8.38v6.84zM9.52 9.56a1.33 1.33 0 1 0 0-2.66 1.33 1.33 0 0 0 0 2.66zm8.16 7.78v-3.73c0-2-1.08-2.93-2.51-2.93-1.16 0-1.68.64-1.97 1.08V10.5H10.9c.03.84 0 6.84 0 6.84h2.3v-3.82c0-.2.01-.4.07-.54.16-.4.52-.82 1.14-.82.8 0 1.12.62 1.12 1.53v3.65z"/></svg>
</span>
<span>
<span class="contact-link__eyebrow">LinkedIn Network</span>
<span class="contact-link__title">Kristijan Popovski</span>
</span>
</span>
<svg class="contact-link__arrow" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M12 4v2h4.59L7.76 14.83l1.41 1.41L18 7.41V12h2V4z"/></svg>
</a>
</div>
</div>
</section>
</main>
<footer class="site-footer site-footer--light">
<div class="site-footer__inner">
<div>
<div class="site-footer__brand">Kristijan Popovski</div>
<p class="site-footer__text">Open for thoughtful conversations around partnerships, leadership, governance, and project execution.</p>
</div>
<div class="site-footer__links">
<a class="site-footer__link" href="../">Home</a>
<a class="site-footer__link" href="../projects/">Projects</a>
<a class="site-footer__link" href="../cv/">CV</a>
<a class="site-footer__link" href="mailto:popovskik02@yahoo.com">Email</a>
</div>
<div class="site-footer__meta">Static contact form ready for future integration</div>
</div>
</footer>
</div>
<script src="../js/script.js"></script>
</body>
</html>

View File

@ -71,6 +71,8 @@ body {
body.menu-open {
overflow: hidden;
height: 100vh;
touch-action: none;
}
img {
@ -1541,7 +1543,7 @@ textarea {
color: var(--color-text-soft);
}
[data-animate] {
.js-enabled [data-animate] {
opacity: 0;
transform: translateY(18px);
transition: opacity 520ms ease, transform 520ms ease;

View File

@ -5,6 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CV | Kristijan Popovski</title>
<meta name="description" content="Curriculum vitae of Kristijan Popovski, including education, experience, governance roles, skills, languages, and awards.">
<meta http-equiv="refresh" content="0; url=cv/">
<meta name="robots" content="noindex">
<link rel="canonical" href="cv/">
<script>window.location.replace("cv/");</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet">

248
cv/index.html Normal file
View File

@ -0,0 +1,248 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CV | Kristijan Popovski</title>
<meta name="description" content="Curriculum vitae of Kristijan Popovski, including education, experience, governance roles, skills, languages, and awards.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../css/style.css">
<script>document.documentElement.classList.add('js-enabled');</script>
</head>
<body>
<div class="site-shell">
<header class="site-header">
<div class="site-header__inner">
<a class="brand" href="../">Kristijan Popovski</a>
<nav class="site-nav" aria-label="Primary">
<ul class="site-nav__list">
<li><a class="site-nav__link" href="../">Home</a></li>
<li><a class="site-nav__link" href="../projects/">Projects</a></li>
<li><a class="site-nav__link is-current" href="./">CV</a></li>
<li><a class="site-nav__link" href="../contact/">Contact</a></li>
</ul>
</nav>
<div class="site-header__actions">
<a class="button button--primary button--small" href="../contact/">Get in Touch</a>
<button class="menu-toggle" type="button" aria-label="Open menu" aria-expanded="false" data-menu-toggle>
<span class="menu-toggle__line"></span>
</button>
</div>
</div>
<nav class="mobile-nav" aria-label="Mobile" data-mobile-nav>
<ul class="mobile-nav__list">
<li><a class="mobile-nav__link" href="../">Home</a></li>
<li><a class="mobile-nav__link" href="../projects/">Projects</a></li>
<li><a class="mobile-nav__link is-current" href="./">CV</a></li>
<li><a class="mobile-nav__link" href="../contact/">Contact</a></li>
</ul>
</nav>
</header>
<main class="page-main">
<section class="section section--tight">
<div class="container">
<div class="cv-hero" data-animate>
<div>
<h1 class="page-title">Curriculum Vitae</h1>
<p class="page-lede">BA of Business and Economics - MSc in Business and Organisation (IMB)</p>
</div>
<div class="cv-hero__actions">
<a class="button button--secondary" href="../assets/documents/cv_onepage.pdf">Download One-Page CV</a>
<a class="button button--primary" href="../assets/documents/cv_full.pdf">Download Full CV</a>
</div>
</div>
<div class="cv-layout">
<div>
<section class="timeline-section section--tight">
<div class="section-badge" data-animate>
<span class="section-badge__icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M20 6h-3V4h-2v2H9V4H7v2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 14H4V11h16v9z"/></svg>
</span>
Work Experience
</div>
<div class="timeline">
<article class="timeline__item" data-animate>
<span class="timeline__dot"></span>
<span class="timeline__period">2022 - now</span>
<h2 class="timeline__title">Founder and President</h2>
<p class="timeline__subtitle">Macedonian Student Organisation in Slovenia</p>
<p class="timeline__content">Founded and led a student organization that grew to more than 120 members, organized over 50 events, and built more than 20 partnerships with institutions, embassies, and sponsors.</p>
</article>
<article class="timeline__item" data-animate>
<span class="timeline__dot"></span>
<span class="timeline__period">2021 - now</span>
<h2 class="timeline__title">Board Member</h2>
<p class="timeline__subtitle">Leaders for Education, Activism, and Development (LEAD)</p>
<p class="timeline__content">Active board member of a youth-focused NGO working on education, activism, and civic engagement.</p>
</article>
<article class="timeline__item" data-animate>
<span class="timeline__dot"></span>
<span class="timeline__period">2024 - 2025</span>
<h2 class="timeline__title">Intern in Finance and Accounting</h2>
<p class="timeline__subtitle">CVS Mobile d.d. (a Eurowag company)</p>
<p class="timeline__content">Supported finance operations across four subsidiaries, reviewing reports, processing invoice-related data, and contributing to daily operational workflows.</p>
</article>
<article class="timeline__item" data-animate>
<span class="timeline__dot"></span>
<span class="timeline__period">2024</span>
<h2 class="timeline__title">Student Intern</h2>
<p class="timeline__subtitle">Department for Internationalisation and Strategic Partnerships, University of Ljubljana</p>
<p class="timeline__content">Organized webinars for incoming students, prepared data reports, and supported regional university cooperation activities.</p>
</article>
</div>
</section>
<section class="section section--tight">
<div class="section-badge" data-animate>
<span class="section-badge__icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M12 3 1 9l11 6 9-4.91V17h2V9L12 3zm0 9.58L5.96 9 12 5.42 18.04 9 12 12.58zM5 12.69V17l7 4 7-4v-4.31l-7 3.82-7-3.82z"/></svg>
</span>
Education
</div>
<div class="list-grid list-grid--two">
<article class="list-card" data-animate>
<span class="list-card__meta">2022 - 2026</span>
<h2 class="list-card__title">University of Ljubljana, School of Economics and Business</h2>
<p class="list-card__text"><strong>MSc in Business and Organisation (IMB)</strong><br>Ranked 44th globally in Financial Times Masters in Management 2025.</p>
<p class="list-card__text"><strong>Bachelor's Degree in Economics and Business</strong><br>Major in Entrepreneurship.</p>
</article>
<article class="list-card" data-animate>
<span class="list-card__meta">2024</span>
<h2 class="list-card__title">Resilient Cities Summer School</h2>
<p class="list-card__text">Slovak University of Technology in Bratislava.</p>
<p class="list-card__text"><strong>2017 - 2021</strong><br>Nikola Karev Skopje, Natural Sciences and Mathematics.</p>
</article>
</div>
</section>
<section class="section section--tight">
<div class="section-badge" data-animate>
<span class="section-badge__icon">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5C15 14.17 10.33 13 8 13zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>
</span>
Leadership and Governance
</div>
<div class="list-grid list-grid--two">
<article class="list-card" data-animate>
<h2 class="list-card__title">Student Ambassador</h2>
<p class="list-card__text">Supported prospective students through one-on-one mentorship and onboarding support at the University of Ljubljana.</p>
</article>
<article class="list-card" data-animate>
<h2 class="list-card__title">Student Senate Member</h2>
<p class="list-card__text">Represented around 5,000 students at faculty level and contributed within university governance structures.</p>
</article>
<article class="list-card" data-animate>
<h2 class="list-card__title">Volunteering</h2>
<p class="list-card__text">Served in the Red Cross Youth Club and twice as President of the high school student council.</p>
</article>
<article class="list-card" data-animate>
<h2 class="list-card__title">Selected Projects</h2>
<p class="list-card__text">22nd International Youth Conference Krushevo and consulting support for ATech Electronics.</p>
</article>
</div>
</section>
<section class="section section--tight">
<div class="quote-panel" data-animate>
<div class="quote-panel__bg">
<img src="../assets/images/portrait-cv.jpg" alt="Portrait background of Kristijan Popovski" width="536" height="745" loading="lazy">
</div>
<div class="quote-panel__content">
<p class="quote-panel__quote">"Building a career in management, leadership, and organizational growth."</p>
</div>
</div>
</section>
</div>
<aside class="cv-sidebar">
<div class="image-frame" data-animate>
<img src="../assets/images/portrait-cv.jpg" alt="Kristijan Popovski portrait for CV page" width="536" height="745">
</div>
<section class="section section--tight">
<article class="skill-card" data-animate>
<span class="mini-label">Skills</span>
<h2 class="card__title">Hard Skills</h2>
<div class="skill-tags">
<span class="skill-tag">Microsoft Office 365</span>
<span class="skill-tag">MS Dynamics NAV</span>
<span class="skill-tag">ChatGPT</span>
<span class="skill-tag">Canva</span>
<span class="skill-tag">Cluster Analysis</span>
<span class="skill-tag">Segmentation</span>
</div>
</article>
</section>
<section class="section section--tight">
<article class="award-card" data-animate>
<span class="mini-label award-card__eyebrow">Recognition</span>
<h2 class="award-card__title">Top Graduate of Generation 2017-2021</h2>
<p class="award-card__text">Recognized by the Mayor of the City of Skopje as the top graduate of High School Gymnasium "Nikola Karev".</p>
</article>
</section>
<section class="section section--tight">
<article class="language-card" data-animate>
<span class="mini-label">Languages</span>
<h2 class="card__title">Language Proficiency</h2>
<div class="language-card__row">
<strong>Macedonian</strong>
<span class="language-card__level">Native</span>
</div>
<div class="language-card__bar"><div class="language-card__fill language-card__fill--100"></div></div>
<div class="language-card__row">
<strong>English</strong>
<span class="language-card__level">B2</span>
</div>
<div class="language-card__bar"><div class="language-card__fill language-card__fill--75"></div></div>
<div class="language-card__row">
<strong>Slovenian</strong>
<span class="language-card__level">B2</span>
</div>
<div class="language-card__bar"><div class="language-card__fill language-card__fill--75"></div></div>
<div class="language-card__row">
<strong>Serbo-Croatian</strong>
<span class="language-card__level">B2</span>
</div>
<div class="language-card__bar"><div class="language-card__fill language-card__fill--75"></div></div>
<div class="language-card__row">
<strong>French</strong>
<span class="language-card__level">A2</span>
</div>
<div class="language-card__bar"><div class="language-card__fill language-card__fill--40"></div></div>
</article>
</section>
</aside>
</div>
</div>
</section>
</main>
<footer class="site-footer site-footer--light">
<div class="site-footer__inner">
<div>
<div class="site-footer__brand">Kristijan Popovski</div>
<p class="site-footer__text">A structured overview of education, leadership, governance, and professional development.</p>
</div>
<div class="site-footer__links">
<a class="site-footer__link" href="../">Home</a>
<a class="site-footer__link" href="../projects/">Projects</a>
<a class="site-footer__link" href="../assets/documents/cv_full.pdf">Full CV</a>
<a class="site-footer__link" href="mailto:popovskik02@yahoo.com">Email</a>
</div>
<div class="site-footer__meta">Readable, structured, and ready for download</div>
</div>
</footer>
</div>
<script src="../js/script.js"></script>
</body>
</html>

170
export_code.ps1 Normal file
View File

@ -0,0 +1,170 @@
param(
[string]$OutputFile = "code_export.txt"
)
$ErrorActionPreference = "Stop"
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
if ([System.IO.Path]::IsPathRooted($OutputFile)) {
$OutputPath = $OutputFile
}
else {
$OutputPath = Join-Path $ScriptDir $OutputFile
}
$ExcludedDirectories = @("node_modules", "vendor", "dist", "build", "images")
$ExcludedExtensions = @(
".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg", ".ico", ".webp",
".mp4", ".mov", ".avi", ".mkv", ".webm",
".mp3", ".wav", ".ogg", ".flac",
".pdf",
".zip", ".tar", ".gz", ".bz2", ".rar", ".7z",
".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
".eot", ".ttf", ".woff", ".woff2"
)
function Get-RelativePath {
param(
[string]$BasePath,
[string]$FullPath
)
$baseUri = [System.Uri](([System.IO.Path]::GetFullPath($BasePath)).TrimEnd("\") + "\")
$fullUri = [System.Uri]([System.IO.Path]::GetFullPath($FullPath))
$relativeUri = $baseUri.MakeRelativeUri($fullUri)
return [System.Uri]::UnescapeDataString($relativeUri.ToString()).Replace("/", "\")
}
function Test-IsProbablyBinary {
param(
[string]$Path
)
try {
$stream = [System.IO.File]::OpenRead($Path)
try {
$buffer = New-Object byte[] 4096
$bytesRead = $stream.Read($buffer, 0, $buffer.Length)
}
finally {
$stream.Dispose()
}
}
catch {
return $true
}
if ($bytesRead -ge 2) {
if (
($buffer[0] -eq 0xFF -and $buffer[1] -eq 0xFE) -or
($buffer[0] -eq 0xFE -and $buffer[1] -eq 0xFF)
) {
return $false
}
}
if ($bytesRead -ge 3) {
if ($buffer[0] -eq 0xEF -and $buffer[1] -eq 0xBB -and $buffer[2] -eq 0xBF) {
return $false
}
}
if ($bytesRead -ge 4) {
if (
($buffer[0] -eq 0xFF -and $buffer[1] -eq 0xFE -and $buffer[2] -eq 0x00 -and $buffer[3] -eq 0x00) -or
($buffer[0] -eq 0x00 -and $buffer[1] -eq 0x00 -and $buffer[2] -eq 0xFE -and $buffer[3] -eq 0xFF)
) {
return $false
}
}
for ($index = 0; $index -lt $bytesRead; $index++) {
if ($buffer[$index] -eq 0) {
return $true
}
}
return $false
}
function Test-ShouldSkipFile {
param(
[System.IO.FileInfo]$File
)
$fullPath = [System.IO.Path]::GetFullPath($File.FullName)
if ($fullPath -eq [System.IO.Path]::GetFullPath($OutputPath)) {
return $true
}
$relativePath = Get-RelativePath -BasePath $ScriptDir -FullPath $File.FullName
if ($relativePath -eq "export_code.sh" -or $relativePath -eq "export_code.ps1") {
return $true
}
$segments = $relativePath -split "[\\/]+"
foreach ($segment in $segments) {
if ($segment.StartsWith(".")) {
return $true
}
if ($ExcludedDirectories -contains $segment) {
return $true
}
}
if ($ExcludedExtensions -contains $File.Extension) {
return $true
}
return $false
}
if (Test-Path -LiteralPath $OutputPath) {
Remove-Item -LiteralPath $OutputPath -Force
}
$builder = New-Object System.Text.StringBuilder
$files = Get-ChildItem -LiteralPath $ScriptDir -File -Recurse | Sort-Object {
(Get-RelativePath -BasePath $ScriptDir -FullPath $_.FullName).Replace("\", "/")
}
foreach ($file in $files) {
if (Test-ShouldSkipFile -File $file) {
continue
}
if (Test-IsProbablyBinary -Path $file.FullName) {
continue
}
try {
$content = Get-Content -LiteralPath $file.FullName -Raw -ErrorAction Stop
}
catch {
continue
}
$relativePath = (Get-RelativePath -BasePath $ScriptDir -FullPath $file.FullName).Replace("\", "/")
[void]$builder.AppendLine(("`"./{0}`" : " -f $relativePath))
[void]$builder.AppendLine('"""')
[void]$builder.Append($content)
if (-not $content.EndsWith("`n")) {
[void]$builder.AppendLine()
}
[void]$builder.AppendLine('"""')
[void]$builder.AppendLine()
[void]$builder.AppendLine()
}
$utf8NoBom = New-Object System.Text.UTF8Encoding $false
[System.IO.File]::WriteAllText($OutputPath, $builder.ToString(), $utf8NoBom)
Write-Host ("Code export finished. Output saved to {0}" -f $OutputPath)

View File

@ -1,7 +1,44 @@
#!/bin/bash
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
run_powershell_export() {
local ps_script="$SCRIPT_DIR/export_code.ps1"
if command -v pwsh >/dev/null 2>&1; then
pwsh -NoLogo -NoProfile -ExecutionPolicy Bypass -File "$ps_script" "$@"
return
fi
if command -v powershell.exe >/dev/null 2>&1; then
if command -v cygpath >/dev/null 2>&1; then
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "$(cygpath -w "$ps_script")" "$@"
else
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "$ps_script" "$@"
fi
return
fi
echo "PowerShell was not found. Run export_code.ps1 manually." >&2
exit 1
}
case "$(uname -s 2>/dev/null || printf '')" in
CYGWIN*|MINGW*|MSYS*)
run_powershell_export "$@"
exit 0
;;
esac
if [[ "${OS:-}" == "Windows_NT" ]]; then
run_powershell_export "$@"
exit 0
fi
# Nastavitev imena izhodne datoteke
OUTPUT_FILE="code_export.txt"
OUTPUT_FILE="${1:-code_export.txt}"
# Odstrani izhodno datoteko, če že obstaja, da začnemo s čisto datoteko
if [ -f "$OUTPUT_FILE" ]; then
@ -43,7 +80,7 @@ find . -type f \
| sort | while read -r file; do
# Preskoči samo izhodno datoteko in to skripto
if [[ "$file" == "./$OUTPUT_FILE" || "$file" == "./export_code.sh" ]]; then
if [[ "$file" == "./$OUTPUT_FILE" || "$file" == "./export_code.sh" || "$file" == "./export_code.ps1" ]]; then
continue
fi

View File

@ -10,22 +10,23 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/style.css">
<script>document.documentElement.classList.add('js-enabled');</script>
</head>
<body>
<div class="site-shell">
<header class="site-header">
<div class="site-header__inner">
<a class="brand" href="index.html">Kristijan Popovski</a>
<a class="brand" href="./">Kristijan Popovski</a>
<nav class="site-nav" aria-label="Primary">
<ul class="site-nav__list">
<li><a class="site-nav__link is-current" href="index.html">Home</a></li>
<li><a class="site-nav__link" href="projects.html">Projects</a></li>
<li><a class="site-nav__link" href="cv.html">CV</a></li>
<li><a class="site-nav__link" href="contact.html">Contact</a></li>
<li><a class="site-nav__link is-current" href="./">Home</a></li>
<li><a class="site-nav__link" href="projects/">Projects</a></li>
<li><a class="site-nav__link" href="cv/">CV</a></li>
<li><a class="site-nav__link" href="contact/">Contact</a></li>
</ul>
</nav>
<div class="site-header__actions">
<a class="button button--primary button--small" href="contact.html">Get in Touch</a>
<a class="button button--primary button--small" href="contact/">Get in Touch</a>
<button class="menu-toggle" type="button" aria-label="Open menu" aria-expanded="false" data-menu-toggle>
<span class="menu-toggle__line"></span>
</button>
@ -33,10 +34,10 @@
</div>
<nav class="mobile-nav" aria-label="Mobile" data-mobile-nav>
<ul class="mobile-nav__list">
<li><a class="mobile-nav__link is-current" href="index.html">Home</a></li>
<li><a class="mobile-nav__link" href="projects.html">Projects</a></li>
<li><a class="mobile-nav__link" href="cv.html">CV</a></li>
<li><a class="mobile-nav__link" href="contact.html">Contact</a></li>
<li><a class="mobile-nav__link is-current" href="./">Home</a></li>
<li><a class="mobile-nav__link" href="projects/">Projects</a></li>
<li><a class="mobile-nav__link" href="cv/">CV</a></li>
<li><a class="mobile-nav__link" href="contact/">Contact</a></li>
</ul>
</nav>
</header>
@ -54,7 +55,7 @@
<p class="hero__lede">Delivering institutional excellence across governance, finance, and project execution. From policy and representation to operational detail, the focus is always on clarity, trust, and outcomes.</p>
<div class="button-row">
<a class="button button--primary" href="assets/documents/cv_full.pdf">Download CV</a>
<a class="button button--secondary" href="contact.html">Get in touch</a>
<a class="button button--secondary" href="contact/">Get in touch</a>
</div>
</div>
<div class="hero-media" data-animate>
@ -106,7 +107,7 @@
<h2 class="section-title">Selected Experience</h2>
<p class="section-intro">A concise view of leadership, representation, and operational roles that shape the broader body of work.</p>
</div>
<a class="text-link" href="cv.html">
<a class="text-link" href="cv/">
View full CV
<svg class="text-link__icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M5 12h11.17l-4.58 4.59L13 18l7-7-7-7-1.41 1.41L16.17 10H5z"/></svg>
</a>
@ -212,7 +213,7 @@
<span class="project-card__meta">IMB x NLB Slovenia</span>
<h3 class="project-card__title">Individual Investment Accounts Strategy</h3>
<p class="project-card__text">Developed a go-to-market and marketing strategy for NLB's Individual Investment Accounts (INR) in Slovenia through primary research, segmentation, personas, and customer journey design.</p>
<a class="text-link" href="projects.html">
<a class="text-link" href="projects/">
View project details
<svg class="text-link__icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M5 12h11.17l-4.58 4.59L13 18l7-7-7-7-1.41 1.41L16.17 10H5z"/></svg>
</a>
@ -228,7 +229,7 @@
<span class="project-card__meta">Perles / ATech Electronics</span>
<h3 class="project-card__title">Business Model &amp; Marketing Strategy</h3>
<p class="project-card__text">Researched the power tools market and customer needs for the Perles brand, then helped shape an updated business model with refurbished products and a digital community concept.</p>
<a class="text-link" href="projects.html">
<a class="text-link" href="projects/">
Explore all projects
<svg class="text-link__icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M5 12h11.17l-4.58 4.59L13 18l7-7-7-7-1.41 1.41L16.17 10H5z"/></svg>
</a>
@ -271,7 +272,10 @@
<h2 class="cta-banner__title">Start a conversation.</h2>
<p class="cta-banner__text">Whether it is a strategic partnership, a governance initiative, or a project that needs measured leadership, the next step can start here.</p>
<div class="cta-banner__actions">
<a class="button button--secondary" href="mailto:popovskik02@yahoo.com">Email</a>
<a class="button button--secondary" href="mailto:popovskik02@yahoo.com">
<svg class="button__icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4-8 5-8-5V6l8 5 8-5v2z"/></svg>
Email Me
</a>
<a class="button button--secondary" href="https://www.linkedin.com/in/popovski-k/" target="_blank" rel="noreferrer">LinkedIn</a>
</div>
</div>
@ -287,8 +291,8 @@
<p class="site-footer__text">Built around institutional trust, structured thinking, and practical execution across Europe.</p>
</div>
<div class="site-footer__links">
<a class="site-footer__link" href="projects.html">Projects</a>
<a class="site-footer__link" href="cv.html">Download CV</a>
<a class="site-footer__link" href="projects/">Projects</a>
<a class="site-footer__link" href="assets/documents/cv_full.pdf" target="_blank" rel="noreferrer">Download CV</a>
<a class="site-footer__link" href="mailto:popovskik02@yahoo.com">Email</a>
<a class="site-footer__link" href="https://www.linkedin.com/in/popovski-k/" target="_blank" rel="noreferrer">LinkedIn</a>
</div>

View File

@ -136,6 +136,9 @@ function setupContactForm() {
const fields = Array.from(form.querySelectorAll("[data-required], [type='email']"));
const status = form.querySelector("[data-form-status]");
const action = (form.getAttribute("action") || "").trim();
const hasExternalEndpoint = /^https?:\/\//i.test(action);
const hasPlaceholderEndpoint = action.includes("YOUR_ID_HERE");
const validators = {
email: (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)
@ -209,14 +212,30 @@ function setupContactForm() {
return;
}
if (status) {
status.classList.remove("is-success");
}
if (!hasExternalEndpoint || hasPlaceholderEndpoint) {
event.preventDefault();
if (status) {
status.textContent = "Thanks. Your message structure is validated and ready for backend integration.";
status.classList.add("is-success");
status.textContent = hasPlaceholderEndpoint
? "Replace the Formspree form ID to enable live message delivery."
: "Thanks. Your message structure is validated and ready for backend integration.";
status.classList.toggle("is-success", !hasPlaceholderEndpoint);
}
if (!hasPlaceholderEndpoint) {
form.reset();
fields.forEach((field) => setFieldError(field, ""));
}
return;
}
if (status) {
status.textContent = "Submitting your message...";
}
});
}

16
projects.html Normal file
View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Redirecting to Projects | Kristijan Popovski</title>
<meta name="description" content="Redirecting to the projects page for Kristijan Popovski.">
<meta http-equiv="refresh" content="0; url=projects/">
<meta name="robots" content="noindex">
<link rel="canonical" href="projects/">
<script>window.location.replace("projects/");</script>
</head>
<body>
<p>Redirecting to <a href="projects/">projects/</a>...</p>
</body>
</html>

View File

@ -8,23 +8,24 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="../css/style.css">
<script>document.documentElement.classList.add('js-enabled');</script>
</head>
<body>
<div class="site-shell">
<header class="site-header">
<div class="site-header__inner">
<a class="brand" href="index.html">Kristijan Popovski</a>
<a class="brand" href="../">Kristijan Popovski</a>
<nav class="site-nav" aria-label="Primary">
<ul class="site-nav__list">
<li><a class="site-nav__link" href="index.html">Home</a></li>
<li><a class="site-nav__link is-current" href="projects.html">Projects</a></li>
<li><a class="site-nav__link" href="cv.html">CV</a></li>
<li><a class="site-nav__link" href="contact.html">Contact</a></li>
<li><a class="site-nav__link" href="../">Home</a></li>
<li><a class="site-nav__link is-current" href="./">Projects</a></li>
<li><a class="site-nav__link" href="../cv/">CV</a></li>
<li><a class="site-nav__link" href="../contact/">Contact</a></li>
</ul>
</nav>
<div class="site-header__actions">
<a class="button button--primary button--small" href="contact.html">Get in Touch</a>
<a class="button button--primary button--small" href="../contact/">Get in Touch</a>
<button class="menu-toggle" type="button" aria-label="Open menu" aria-expanded="false" data-menu-toggle>
<span class="menu-toggle__line"></span>
</button>
@ -32,10 +33,10 @@
</div>
<nav class="mobile-nav" aria-label="Mobile" data-mobile-nav>
<ul class="mobile-nav__list">
<li><a class="mobile-nav__link" href="index.html">Home</a></li>
<li><a class="mobile-nav__link is-current" href="projects.html">Projects</a></li>
<li><a class="mobile-nav__link" href="cv.html">CV</a></li>
<li><a class="mobile-nav__link" href="contact.html">Contact</a></li>
<li><a class="mobile-nav__link" href="../">Home</a></li>
<li><a class="mobile-nav__link is-current" href="./">Projects</a></li>
<li><a class="mobile-nav__link" href="../cv/">CV</a></li>
<li><a class="mobile-nav__link" href="../contact/">Contact</a></li>
</ul>
</nav>
</header>
@ -62,7 +63,7 @@
<div class="project-grid">
<article class="card project-card" data-category="consulting" data-animate>
<div class="project-card__media">
<img src="assets/images/project-nlb-inr.jfif" alt="Presentation of an Individual Investment Accounts strategy project for NLB at the IMB programme" width="576" height="768">
<img src="../assets/images/project-nlb-inr.jfif" alt="Presentation of an Individual Investment Accounts strategy project for NLB at the IMB programme" width="576" height="768">
<span class="project-card__tag">Consulting</span>
</div>
<div class="project-card__body">
@ -83,11 +84,11 @@
<article class="card project-card" data-category="consulting" data-animate>
<div class="project-card__media">
<img src="assets/images/project-perles-atech.jfif" alt="Student consulting team in discussion with Perles and ATech Electronics" width="1024" height="768">
<img src="../assets/images/project-perles-atech.jfif" alt="Student consulting team in discussion with Perles and ATech Electronics" width="1024" height="768">
<span class="project-card__tag">Consulting</span>
</div>
<div class="project-card__body">
<span class="project-card__meta">Student Intern Consultant • Feb 2025 - Jun 2025</span>
<span class="project-card__meta">Student Intern Consultant - Feb 2025 to Jun 2025</span>
<h2 class="project-card__title">Perles / ATech Business Model &amp; Marketing Strategy</h2>
<p class="project-card__text">Worked as part of a student consulting team researching the power tools market for the Perles brand, mapping customer needs, and co-developing a refreshed business model together with a sharper marketing strategy.</p>
<div class="project-card__outcome">
@ -104,7 +105,7 @@
<article class="card project-card" data-category="innovation" data-animate>
<div class="project-card__media">
<img src="assets/images/project-greenie.jpg" alt="Interior green wall and glass architecture in a sustainable building" width="1440" height="900" loading="lazy">
<img src="../assets/images/project-greenie.jpg" alt="Interior green wall and glass architecture in a sustainable building" width="1440" height="900" loading="lazy">
<span class="project-card__tag">Innovation</span>
</div>
<div class="project-card__body">
@ -125,7 +126,7 @@
<article class="card project-card" data-category="moderation institutional" data-animate>
<div class="project-card__media">
<img src="assets/images/project-youth.jpg" alt="Moderator speaking to a youth audience at a leadership event" width="1440" height="900" loading="lazy">
<img src="../assets/images/project-youth.jpg" alt="Moderator speaking to a youth audience at a leadership event" width="1440" height="900" loading="lazy">
<span class="project-card__tag">Moderation</span>
</div>
<div class="project-card__body">
@ -154,8 +155,8 @@
<h2 class="cta-banner__title">Ready to collaborate?</h2>
<p class="cta-banner__text">Open to conversations around institutional advisory work, project leadership, and structured collaboration.</p>
<div class="cta-banner__actions">
<a class="button button--secondary" href="contact.html">Request Collaboration</a>
<a class="button button--secondary" href="cv.html">View Full CV</a>
<a class="button button--secondary" href="../contact/">Request Collaboration</a>
<a class="button button--secondary" href="../cv/">View Full CV</a>
</div>
</div>
</div>
@ -170,15 +171,15 @@
<p class="site-footer__text">Selected work across governance, consulting, and leadership initiatives.</p>
</div>
<div class="site-footer__links">
<a class="site-footer__link" href="index.html">Home</a>
<a class="site-footer__link" href="contact.html">Contact</a>
<a class="site-footer__link" href="../">Home</a>
<a class="site-footer__link" href="../contact/">Contact</a>
<a class="site-footer__link" href="mailto:popovskik02@yahoo.com">Email</a>
<a class="site-footer__link" href="assets/documents/cv_full.pdf">Download CV</a>
<a class="site-footer__link" href="../cv/">Download CV</a>
</div>
<div class="site-footer__meta">Curated projects and measurable outcomes</div>
</div>
</footer>
</div>
<script src="js/script.js"></script>
<script src="../js/script.js"></script>
</body>
</html>