@@ -138,7 +138,7 @@
diff --git a/css/style.css b/css/style.css
index cdb272e..9978ec3 100644
--- a/css/style.css
+++ b/css/style.css
@@ -287,6 +287,8 @@ textarea {
.mobile-nav {
position: fixed;
inset: 4.5rem 1rem auto 1rem;
+ max-height: calc(100vh - 6rem);
+ overflow-y: auto;
padding: var(--space-8);
border-radius: var(--radius-lg);
background: rgba(255, 255, 255, 0.97);
@@ -1054,6 +1056,446 @@ textarea {
display: none !important;
}
+.projects-page {
+ padding-bottom: var(--space-12);
+}
+
+.projects-intro-section {
+ padding-bottom: var(--space-10);
+}
+
+.projects-hero {
+ max-width: 62rem;
+ display: grid;
+ gap: var(--space-6);
+}
+
+.projects-hero__title {
+ margin: 0;
+ font-size: clamp(2.6rem, 7.2vw, 4.5rem);
+ line-height: 0.98;
+ letter-spacing: -0.048em;
+}
+
+.projects-hero__lede {
+ margin: 0;
+ max-width: 52rem;
+ color: var(--color-text-muted);
+ font-size: 1.04rem;
+ line-height: 1.72;
+}
+
+.projects-featured-section {
+ padding-top: 0;
+}
+
+.projects-section-heading {
+ display: grid;
+ gap: var(--space-4);
+ margin-bottom: var(--space-8);
+}
+
+.projects-section-heading .section-intro {
+ max-width: 46rem;
+}
+
+.projects-featured-grid {
+ display: grid;
+ gap: var(--space-6);
+}
+
+.projects-featured-card {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ color: inherit;
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(248, 250, 255, 0.94));
+ border: 1px solid rgba(196, 197, 215, 0.3);
+ border-radius: calc(var(--radius-lg) + 0.25rem);
+ box-shadow: var(--shadow-card);
+ overflow: hidden;
+ transition: transform var(--transition-standard), box-shadow var(--transition-standard), border-color var(--transition-standard);
+}
+
+.projects-featured-card:hover,
+.projects-featured-card:focus-within {
+ transform: translateY(-4px);
+ box-shadow: 0 22px 48px rgba(0, 45, 167, 0.12);
+ border-color: rgba(0, 45, 167, 0.22);
+}
+
+.projects-featured-card:focus-visible {
+ outline: 2px solid var(--color-primary-strong);
+ outline-offset: 3px;
+}
+
+.projects-featured-card__media {
+ position: relative;
+ overflow: hidden;
+ aspect-ratio: 16 / 10;
+ background: var(--color-surface-high);
+}
+
+.projects-featured-card__media img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ transition: transform var(--transition-slow);
+}
+
+.projects-featured-card:hover .projects-featured-card__media img {
+ transform: scale(1.04);
+}
+
+.projects-featured-card__body {
+ padding: var(--space-6);
+ display: grid;
+ gap: var(--space-4);
+ flex: 1;
+}
+
+.projects-meta {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: var(--space-3);
+}
+
+.projects-date {
+ color: var(--color-text-soft);
+ font-size: 0.68rem;
+ font-weight: 800;
+ text-transform: uppercase;
+ letter-spacing: 0.14em;
+}
+
+.projects-tag {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.36rem 0.62rem;
+ border-radius: var(--radius-pill);
+ color: var(--color-primary);
+ background: rgba(0, 45, 167, 0.08);
+ font-size: 0.64rem;
+ font-weight: 800;
+ text-transform: uppercase;
+ letter-spacing: 0.13em;
+}
+
+.projects-featured-card__title {
+ margin: 0;
+ font-family: var(--font-display);
+ font-size: 1.32rem;
+ line-height: 1.1;
+ letter-spacing: -0.03em;
+ color: var(--color-surface-ink);
+}
+
+.projects-featured-card__summary {
+ margin: 0;
+ color: var(--color-text-muted);
+ line-height: 1.68;
+}
+
+.projects-featured-card__cta {
+ margin-top: auto;
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-2);
+ color: var(--color-primary);
+ font-family: var(--font-display);
+ font-size: 0.86rem;
+ font-weight: 800;
+ letter-spacing: -0.01em;
+}
+
+.projects-timeline-section {
+ padding-top: var(--space-12);
+}
+
+.projects-timeline-section--alt {
+ background: rgba(255, 255, 255, 0.56);
+ border-top: 1px solid rgba(196, 197, 215, 0.2);
+ border-bottom: 1px solid rgba(196, 197, 215, 0.2);
+}
+
+.projects-timeline-chapters {
+ display: grid;
+ gap: var(--space-16);
+}
+
+.projects-chapter {
+ display: grid;
+ gap: var(--space-8);
+}
+
+.projects-chapter__header {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: end;
+ justify-content: space-between;
+ gap: var(--space-4);
+}
+
+.projects-chapter__title {
+ margin: 0;
+ font-family: var(--font-display);
+ font-size: clamp(1.9rem, 4.3vw, 3rem);
+ line-height: 1.05;
+ letter-spacing: -0.04em;
+ color: var(--color-surface-ink);
+}
+
+.projects-chapter__range {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.45rem 0.78rem;
+ border-radius: var(--radius-pill);
+ background: rgba(0, 45, 167, 0.09);
+ color: var(--color-primary);
+ font-size: 0.68rem;
+ font-weight: 800;
+ text-transform: uppercase;
+ letter-spacing: 0.14em;
+}
+
+.projects-timeline {
+ position: relative;
+ display: grid;
+ gap: var(--space-8);
+ padding-left: var(--space-8);
+}
+
+.projects-timeline::before {
+ content: "";
+ position: absolute;
+ left: 0.72rem;
+ top: 0.5rem;
+ bottom: 0.5rem;
+ width: 2px;
+ background: linear-gradient(180deg, rgba(0, 45, 167, 0.28), rgba(196, 197, 215, 0.62));
+}
+
+.projects-entry {
+ position: relative;
+ display: grid;
+ gap: var(--space-5);
+ scroll-margin-top: 6.5rem;
+}
+
+.projects-entry__dot {
+ position: absolute;
+ left: -1.85rem;
+ top: 1.1rem;
+ width: 0.95rem;
+ height: 0.95rem;
+ border-radius: 50%;
+ border: 3px solid var(--color-white);
+ background: var(--color-primary);
+ box-shadow: 0 0 0 5px rgba(0, 45, 167, 0.08);
+}
+
+.projects-entry__media {
+ overflow: hidden;
+ border-radius: var(--radius-lg);
+ border: 1px solid rgba(196, 197, 215, 0.26);
+ background: var(--color-surface-high);
+ box-shadow: var(--shadow-soft);
+}
+
+.projects-entry__media img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ aspect-ratio: 16 / 10;
+}
+
+.projects-entry__content {
+ background: rgba(255, 255, 255, 0.92);
+ border: 1px solid rgba(196, 197, 215, 0.26);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-soft);
+ padding: var(--space-6);
+ display: grid;
+ gap: var(--space-4);
+ transition: transform var(--transition-standard), box-shadow var(--transition-standard), border-color var(--transition-standard);
+}
+
+.projects-entry:hover .projects-entry__content,
+.projects-entry:focus-within .projects-entry__content {
+ transform: translateY(-2px);
+ box-shadow: var(--shadow-card);
+ border-color: rgba(0, 45, 167, 0.2);
+}
+
+.projects-entry:target .projects-entry__content {
+ border-color: rgba(0, 45, 167, 0.42);
+ box-shadow: 0 0 0 3px rgba(0, 45, 167, 0.12), var(--shadow-card);
+}
+
+.projects-entry__title {
+ margin: 0;
+ font-family: var(--font-display);
+ font-size: 1.34rem;
+ line-height: 1.12;
+ letter-spacing: -0.028em;
+ color: var(--color-surface-ink);
+}
+
+.projects-entry__text {
+ margin: 0;
+ color: var(--color-text-muted);
+ line-height: 1.7;
+}
+
+.projects-entry__impact {
+ margin: 0;
+ padding-top: var(--space-4);
+ border-top: 1px solid rgba(196, 197, 215, 0.26);
+ color: var(--color-text);
+ line-height: 1.64;
+}
+
+.projects-entry__impact strong {
+ color: var(--color-primary);
+}
+
+.projects-final-cta-section {
+ padding-top: var(--space-14);
+}
+
+.projects-final-cta {
+ padding: var(--space-10);
+ border-radius: calc(var(--radius-xl) + 0.35rem);
+ border: 1px solid rgba(196, 197, 215, 0.26);
+ background: linear-gradient(160deg, rgba(255, 255, 255, 0.96), rgba(223, 231, 255, 0.42));
+ box-shadow: var(--shadow-soft);
+ text-align: center;
+}
+
+.projects-final-cta__title {
+ margin: 0;
+ font-family: var(--font-display);
+ font-size: clamp(1.8rem, 4vw, 2.65rem);
+ line-height: 1.08;
+ letter-spacing: -0.04em;
+ color: var(--color-surface-ink);
+}
+
+.projects-final-cta__actions {
+ margin-top: var(--space-8);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-4);
+}
+
+@media (max-width: 39.999rem) {
+ .projects-featured-card__body,
+ .projects-entry__content {
+ padding: var(--space-6);
+ }
+
+ .projects-featured-card__title,
+ .projects-entry__title {
+ font-size: 1.2rem;
+ }
+
+ .projects-timeline {
+ padding-left: var(--space-6);
+ }
+
+ .projects-entry__dot {
+ left: -1.55rem;
+ top: 0.95rem;
+ width: 0.9rem;
+ height: 0.9rem;
+ }
+}
+
+@media (min-width: 40rem) {
+ .projects-final-cta__actions {
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ }
+}
+
+@media (min-width: 56rem) {
+ .projects-intro-section {
+ padding-bottom: var(--space-12);
+ }
+
+ .projects-hero__title {
+ white-space: nowrap;
+ }
+
+ .projects-featured-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ align-items: stretch;
+ }
+
+ .projects-featured-card__body {
+ padding: var(--space-8);
+ }
+
+ .projects-timeline {
+ padding-left: var(--space-10);
+ gap: var(--space-10);
+ }
+
+ .projects-timeline::before {
+ left: 0.92rem;
+ }
+
+ .projects-entry__dot {
+ left: -2.15rem;
+ }
+
+ .projects-entry--split {
+ grid-template-columns: minmax(0, 0.84fr) minmax(0, 1.16fr);
+ align-items: stretch;
+ gap: var(--space-6);
+ }
+
+ .projects-entry--split .projects-entry__media {
+ height: 100%;
+ }
+
+ .projects-entry--split .projects-entry__media img {
+ height: 100%;
+ min-height: 100%;
+ aspect-ratio: auto;
+ }
+
+ .projects-entry--split.projects-entry--offset .projects-entry__media {
+ order: 2;
+ }
+
+ .projects-entry--split.projects-entry--offset .projects-entry__content {
+ order: 1;
+ }
+
+ .projects-final-cta {
+ padding: var(--space-12);
+ }
+
+}
+
+@media (min-width: 70rem) {
+ .projects-timeline-chapters {
+ gap: var(--space-20);
+ }
+
+ .projects-timeline {
+ gap: var(--space-12);
+ }
+
+ .projects-entry__content {
+ padding: var(--space-8);
+ }
+}
+
.cv-hero {
display: grid;
gap: var(--space-8);
diff --git a/cv.html b/cv.html
index 01c87b8..041e697 100644
--- a/cv.html
+++ b/cv.html
@@ -8,6 +8,7 @@
+
Redirecting to cv/...
diff --git a/designs/CV - Kristijan Popovski - 28.02.2026.pdf b/designs/CV - Kristijan Popovski - 28.02.2026.pdf
new file mode 100644
index 0000000..fb5f09f
Binary files /dev/null and b/designs/CV - Kristijan Popovski - 28.02.2026.pdf differ
diff --git a/designs/design-projects/Meet Student Slovenia.jpg b/designs/design-projects/Meet Student Slovenia.jpg
new file mode 100644
index 0000000..bd23c8d
Binary files /dev/null and b/designs/design-projects/Meet Student Slovenia.jpg differ
diff --git a/designs/design-projects/1774111499144.jfif b/designs/design-projects/NLB project INR 2026.jfif
similarity index 100%
rename from designs/design-projects/1774111499144.jfif
rename to designs/design-projects/NLB project INR 2026.jfif
diff --git a/designs/design-projects/123456.jfif b/designs/design-projects/Perles-Atech Project 2025.jfif
similarity index 100%
rename from designs/design-projects/123456.jfif
rename to designs/design-projects/Perles-Atech Project 2025.jfif
diff --git a/export_code.ps1 b/export_code.ps1
index 9c807ce..e4b7544 100644
--- a/export_code.ps1
+++ b/export_code.ps1
@@ -127,7 +127,7 @@ function Test-ShouldSkipFile {
}
}
- if ($ExcludedExtensions -contains $File.Extension) {
+ if ($ExcludedExtensions -contains $File.Extension.ToLowerInvariant()) {
return $true
}
diff --git a/export_code.sh b/export_code.sh
index 3736992..dc7fa63 100755
--- a/export_code.sh
+++ b/export_code.sh
@@ -37,24 +37,23 @@ if [[ "${OS:-}" == "Windows_NT" ]]; then
exit 0
fi
-# Nastavitev imena izhodne datoteke
OUTPUT_FILE="${1:-code_export.txt}"
+OUTPUT_PATH="$SCRIPT_DIR/$OUTPUT_FILE"
-# Odstrani izhodno datoteko, če že obstaja, da začnemo s čisto datoteko
-if [ -f "$OUTPUT_FILE" ]; then
- rm "$OUTPUT_FILE"
-fi
+rm -f "$OUTPUT_PATH"
-# Poišči vse datoteke, razen skritih datotek in določenih map (npr. node_modules).
-# Dodane so izjeme za slike, videoposnetke, PDF-je, arhive in druge binarne datoteke
-# neposredno v ukaz 'find' za boljšo zmogljivost.
-find . -type f \
+find "$SCRIPT_DIR" -type f \
-not -path "*/\.*" \
- -not -path "*node_modules*" \
- -not -path "*vendor*" \
- -not -path "*dist*" \
- -not -path "*build*" \
+ -not -path "*/node_modules/*" \
+ -not -path "*/vendor/*" \
+ -not -path "*/dist/*" \
+ -not -path "*/build/*" \
-not -path "*/images/*" \
+ -not -name "code_export*.txt" \
+ -not -name "gitea-token*.txt" \
+ -not -name "gitea-token*.txt.sig" \
+ -not -name "export_code.sh" \
+ -not -name "export_code.ps1" \
-not -iname "*.jpg" -not -iname "*.jpeg" \
-not -iname "*.png" -not -iname "*.gif" \
-not -iname "*.bmp" -not -iname "*.tiff" \
@@ -66,36 +65,29 @@ find . -type f \
-not -iname "*.mp3" -not -iname "*.wav" \
-not -iname "*.ogg" -not -iname "*.flac" \
-not -iname "*.pdf" \
- -not -iname "*.zip" \
- -not -iname "*.tar" \
- -not -iname "*.gz" \
- -not -iname "*.bz2" \
- -not -iname "*.rar" \
- -not -iname "*.7z" \
+ -not -iname "*.zip" -not -iname "*.tar" \
+ -not -iname "*.gz" -not -iname "*.bz2" \
+ -not -iname "*.rar" -not -iname "*.7z" \
-not -iname "*.doc" -not -iname "*.docx" \
-not -iname "*.xls" -not -iname "*.xlsx" \
-not -iname "*.ppt" -not -iname "*.pptx" \
-not -iname "*.eot" -not -iname "*.ttf" \
-not -iname "*.woff" -not -iname "*.woff2" \
- | sort | while read -r file; do
-
- # Preskoči samo izhodno datoteko in to skripto
- if [[ "$file" == "./$OUTPUT_FILE" || "$file" == "./export_code.sh" || "$file" == "./export_code.ps1" ]]; then
+ | sort | while IFS= read -r file; do
+
+ rel_path="./${file#"$SCRIPT_DIR"/}"
+
+ if file --mime-type -b "$file" | grep -qiE '^(image|video|audio|application/octet-stream)'; then
continue
fi
-
- # Dodatna varnostna preverba: preskoči slikovne datoteke po MIME tipu
- if file --mime-type -b "$file" | grep -qiE '^(image)/'; then
- continue
+
+ printf '"%s" : \n' "$rel_path" >> "$OUTPUT_PATH"
+ printf '"""\n' >> "$OUTPUT_PATH"
+ cat "$file" >> "$OUTPUT_PATH"
+ if [[ -n "$(tail -c 1 "$file" 2>/dev/null || true)" ]]; then
+ printf '\n' >> "$OUTPUT_PATH"
fi
-
- # Dodaj ime datoteke in njeno vsebino v izhodno datoteko
- echo "\"$file\" : " >> "$OUTPUT_FILE"
- echo "\"\"\"" >> "$OUTPUT_FILE"
- cat "$file" >> "$OUTPUT_FILE"
- echo "\"\"\"" >> "$OUTPUT_FILE"
- echo "" >> "$OUTPUT_FILE"
- echo "" >> "$OUTPUT_FILE"
+ printf '"""\n\n\n' >> "$OUTPUT_PATH"
done
-echo "Izvoz kode končan. Vsebina je shranjena v datoteko $OUTPUT_FILE"
+echo "Code export finished. Output saved to $OUTPUT_PATH"
diff --git a/index.html b/index.html
index 7055d21..0d83e59 100644
--- a/index.html
+++ b/index.html
@@ -5,28 +5,26 @@
Kristijan Popovski | Structured Leadership and Strategic Execution
-
-