Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a4cc12d763 | |||
| 7408168160 |
@@ -17,6 +17,7 @@ import {
|
||||
Smartphone,
|
||||
BarChart3,
|
||||
Building,
|
||||
HardHat,
|
||||
} from "lucide-react";
|
||||
import GlassCard from "@/components/ui/GlassCard";
|
||||
import { fadeUp, stagger, viewportConfig } from "@/lib/animations";
|
||||
@@ -25,6 +26,7 @@ import type { Dictionary, Locale } from "@/lib/dictionaries";
|
||||
const projectIcons: Record<string, typeof ShoppingCart> = {
|
||||
"security-consultancy": ShieldCheck,
|
||||
"ecommerce-platform": ShoppingCart,
|
||||
"pramoal": HardHat,
|
||||
"infra-dashboard": Server,
|
||||
"mobile-companion": Smartphone,
|
||||
"analytics-service": BarChart3,
|
||||
@@ -35,6 +37,7 @@ const projectIcons: Record<string, typeof ShoppingCart> = {
|
||||
const projectColors: Record<string, string> = {
|
||||
"security-consultancy": "from-blue-500/20 to-blue-600/5 text-blue-300",
|
||||
"ecommerce-platform": "from-emerald-500/20 to-emerald-600/5 text-emerald-300",
|
||||
"pramoal": "from-orange-500/20 to-orange-600/5 text-orange-300",
|
||||
"infra-dashboard": "from-purple-500/20 to-purple-600/5 text-purple-300",
|
||||
"mobile-companion": "from-rose-500/20 to-rose-600/5 text-rose-300",
|
||||
"analytics-service": "from-amber-500/20 to-amber-600/5 text-amber-300",
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
Smartphone,
|
||||
BarChart3,
|
||||
Building,
|
||||
HardHat,
|
||||
} from "lucide-react";
|
||||
import GlassCard from "@/components/ui/GlassCard";
|
||||
import ProjectModal from "@/components/ui/ProjectModal";
|
||||
@@ -19,6 +20,7 @@ import type { Dictionary, Locale } from "@/lib/dictionaries";
|
||||
|
||||
const projectIcons: Record<string, typeof ShoppingCart> = {
|
||||
"client-ecommerce": ShoppingCart,
|
||||
"pramoal": HardHat,
|
||||
"booking-platform": Calendar,
|
||||
"infra-dashboard": Server,
|
||||
"mobile-companion": Smartphone,
|
||||
@@ -29,6 +31,7 @@ const projectIcons: Record<string, typeof ShoppingCart> = {
|
||||
|
||||
const projectColors: Record<string, string> = {
|
||||
"client-ecommerce": "from-blue-500/20 to-blue-600/5 text-blue-300",
|
||||
"pramoal": "from-orange-500/20 to-orange-600/5 text-orange-300",
|
||||
"booking-platform": "from-emerald-500/20 to-emerald-600/5 text-emerald-300",
|
||||
"infra-dashboard": "from-purple-500/20 to-purple-600/5 text-purple-300",
|
||||
"mobile-companion": "from-rose-500/20 to-rose-600/5 text-rose-300",
|
||||
|
||||
+9
-6
@@ -17,13 +17,14 @@ export type Dictionary = typeof dictionaries.en;
|
||||
// independently of type. Lower numbers come first. `inCarousel: false` hides
|
||||
// a project from the homepage carousel while keeping it on the projects page.
|
||||
const projectsMeta = {
|
||||
"security-consultancy": { order: 1, carouselOrder: 3, inCarousel: true, tags: ["React", "Node.js", "Express", "JavaScript"], live: true, type: "client" as const, url: "https://obzor.rs/", github: "", download: "", inProgress: false, screenshots: ["/site1.png"] as string[] },
|
||||
"ecommerce-platform": { order: 2, carouselOrder: 4, inCarousel: true, tags: ["React", "Express.js", "Docker", "CI/CD"], live: true, type: "client" as const, url: "https://kupitri.com", github: "", download: "", inProgress: false, screenshots: ["/site2.png"] as string[] },
|
||||
"mobile-companion": { order: 3, carouselOrder: 3, inCarousel: false, tags: ["Java", "Spring Boot", "React Native", "PostgreSQL"], live: false, type: "client" as const, url: "", github: "", download: "", inProgress: true, screenshots: ["/tba.png"] as string[] },
|
||||
"business-landing": { order: 4, carouselOrder: 4, inCarousel: false, tags: ["Next.js", "Tailwind CSS"], live: false, type: "client" as const, url: "", github: "", download: "", inProgress: true, screenshots: ["/tba.png"] as string[] },
|
||||
"security-consultancy": { order: 1, carouselOrder: 4, inCarousel: true, tags: ["React", "Node.js", "Express", "JavaScript"], live: true, type: "client" as const, url: "https://obzor.rs/", github: "", download: "", inProgress: false, screenshots: ["/site1.png"] as string[] },
|
||||
"ecommerce-platform": { order: 2, carouselOrder: 5, inCarousel: true, tags: ["React", "Express.js", "Docker", "CI/CD"], live: true, type: "client" as const, url: "https://kupitri.com", github: "", download: "", inProgress: false, screenshots: ["/site2.png"] as string[] },
|
||||
"pramoal": { order: 3, carouselOrder: 3, inCarousel: true, tags: ["Next.js", "Tailwind CSS", "SEO"], live: true, type: "client" as const, url: "https://pramoal.rs", github: "", download: "", inProgress: false, screenshots: ["/pramoal.png"] as string[] },
|
||||
"mobile-companion": { order: 4, carouselOrder: 3, inCarousel: false, tags: ["Java", "Spring Boot", "React Native", "PostgreSQL"], live: false, type: "client" as const, url: "", github: "", download: "", inProgress: true, screenshots: ["/tba.png"] as string[] },
|
||||
"business-landing": { order: 5, carouselOrder: 4, inCarousel: false, tags: ["Next.js", "Tailwind CSS"], live: false, type: "client" as const, url: "", github: "", download: "", inProgress: true, screenshots: ["/tba.png"] as string[] },
|
||||
"etf-oglasi": { order: 1, carouselOrder: 1, inCarousel: true, tags: ["React Native", "Node.js"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/etf-oglasi", download: "https://git.ksan.dev/ksan/etf-oglasi/releases/tag/mobile-v6", inProgress: false, screenshots: ["/etfoglasi.png", "/etf2.png", "/etfoglasiapp.jpg", "/etf1.png"] as string[] },
|
||||
"ssh-portfolio": { order: 2, carouselOrder: 6, inCarousel: true, tags: ["Go", "Bubble Tea", "Wish", "SSH"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/ssh-portfolio", download: "", inProgress: true, screenshots: ["/sshksan.png"] as string[] },
|
||||
"botinator": { order: 3, carouselOrder: 5, inCarousel: true, tags: ["Java", "JDA", "Lavalink"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/Botinator", download: "", inProgress: false, screenshots: ["/botinator.png"] as string[] },
|
||||
"ssh-portfolio": { order: 2, carouselOrder: 7, inCarousel: true, tags: ["Go", "Bubble Tea", "Wish", "SSH"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/ssh-portfolio", download: "", inProgress: true, screenshots: ["/sshksan.png"] as string[] },
|
||||
"botinator": { order: 3, carouselOrder: 6, inCarousel: true, tags: ["Java", "JDA", "Lavalink"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/Botinator", download: "", inProgress: false, screenshots: ["/botinator.png"] as string[] },
|
||||
"ksan-dev": { order: 4, carouselOrder: 2, inCarousel: true, tags: ["Next.js", "TypeScript", "Tailwind CSS"], live: true, type: "personal" as const, url: "https://ksan.dev", github: "https://git.ksan.dev/ksan/ksan.dev", download: "", inProgress: false, screenshots: ["/kd.svg"] as string[] },
|
||||
"gpufand": { order: 5, carouselOrder: 9, inCarousel: false, tags: ["C++", "Qt", "Linux", "NVIDIA"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/gpufand", download: "", inProgress: true, screenshots: ["/tba.png"] as string[] },
|
||||
"e-voting": { order: 6, carouselOrder: 10, inCarousel: false, tags: ["Java", "BouncyCastle", "JavaFX", "Gradle"], live: false, type: "personal" as const, url: "", github: "https://git.ksan.dev/ksan/e-voting", download: "", inProgress: false, screenshots: ["/evoting.png"] as string[] },
|
||||
@@ -80,6 +81,7 @@ export const dictionaries = {
|
||||
items: [
|
||||
{ slug: "security-consultancy", title: "Security Consultancy Website", description: "A modern website built for a professional security consultancy specializing in protecting confidential conversations and advising businesses on information security.", about: "A modern website built for a professional security consultancy specializing in protecting confidential conversations and advising businesses on information security. Designed to clearly present services, build trust, and make it easy for clients to get in touch.", ...projectsMeta["security-consultancy"] },
|
||||
{ slug: "ecommerce-platform", title: "E-Commerce Platform", description: "A full-stack e-commerce website built with React and Express.js, featuring product browsing, shopping cart management, and a streamlined checkout experience.", about: "A full-stack e-commerce website built with React and Express.js, featuring product browsing, shopping cart management, and a streamlined checkout experience. Containerized with Docker and deployed through a CI/CD pipeline for reliable updates.", ...projectsMeta["ecommerce-platform"] },
|
||||
{ slug: "pramoal", title: "Pramoal", description: "A product catalogue and marketing site for a manufacturer of aluminium ladders, scaffolding, and work platforms, built for fast browsing and local search visibility.", about: "A marketing and product catalogue site for a Serbian manufacturer of aluminium work-at-height equipment — ladders, scaffolding, work platforms, TRUSS stage structures, and custom-built solutions. Built with Next.js and Tailwind CSS, with the product range organised into browsable categories, optimised imagery, and clear paths to enquiry for customers looking for manufacturing, delivery, and installation.", ...projectsMeta["pramoal"] },
|
||||
{ slug: "botinator", title: "Botinator", description: "A hobby Discord bot for personal use. A small JDA bot with a few fun slash commands and music playback powered by Lavalink.", about: "A hobby Discord bot built for personal use with Java and JDA. Handles a handful of fun slash commands alongside music playback powered by Lavalink, running as a small self-hosted service.", ...projectsMeta["botinator"] },
|
||||
{ slug: "mobile-companion", title: "Client meeting manager", description: "A Java Spring Boot app for note-taking, scheduling, and tracking client meetings, with a React Native companion app.", about: "A Java Spring Boot backend paired with a React Native app for managing client relationships — take notes, schedule meetings, and track follow-ups in one place. Uses PostgreSQL for storage. Currently in progress.", ...projectsMeta["mobile-companion"] },
|
||||
{ slug: "ssh-portfolio", title: "SSH Portfolio", description: "A terminal-based portfolio you can explore over SSH — no browser required. Being updated with new stuff I've learned.", about: "A TUI portfolio built with Go and Bubble Tea, served through a Wish SSH server. Just `ssh` in from any terminal and navigate projects, skills, and contact info entirely with the keyboard — no browser, no JavaScript, no web server. Still being updated with new stuff I've learned along the way.", ...projectsMeta["ssh-portfolio"] },
|
||||
@@ -329,6 +331,7 @@ export const dictionaries = {
|
||||
items: [
|
||||
{ slug: "security-consultancy", title: "Sajt za sigurnosno savjetovanje", description: "Moderan sajt napravljen za profesionalnu sigurnosnu konsultantsku firmu specijalizovanu za zaštitu povjerljivih razgovora i savjetovanje biznisa o informacionoj sigurnosti.", about: "Moderan sajt napravljen za profesionalnu sigurnosnu konsultantsku firmu specijalizovanu za zaštitu povjerljivih razgovora i savjetovanje biznisa o informacionoj sigurnosti. Napravljen da jasno predstavi usluge, izgradi povjerenje i olakša klijentima da stupe u kontakt.", ...projectsMeta["security-consultancy"] },
|
||||
{ slug: "ecommerce-platform", title: "E-Commerce platforma", description: "Full-stack e-commerce sajt napravljen u React-u i Express.js-u, sa pregledom proizvoda, upravljanjem korpom i pojednostavljenim checkout procesom.", about: "Full-stack e-commerce sajt napravljen u React-u i Express.js-u, sa pregledom proizvoda, upravljanjem korpom i pojednostavljenim checkout procesom. Kontejnerizovan sa Docker-om i deployovan kroz CI/CD pipeline za pouzdana ažuriranja.", ...projectsMeta["ecommerce-platform"] },
|
||||
{ slug: "pramoal", title: "Pramoal", description: "Sajt sa katalogom proizvoda i prezentacijom za proizvođača aluminijumskih merdevina, skela i radnih platformi, napravljen za brzo pregledanje i vidljivost u lokalnoj pretrazi.", about: "Prezentacioni sajt sa katalogom proizvoda za domaćeg proizvođača aluminijumske opreme za rad na visini — merdevine, skele, radne platforme, TRUSS konstrukcije za bine i rješenja po mjeri. Napravljen u Next.js-u i Tailwind CSS-u, sa asortimanom organizovanim u pregledne kategorije, optimizovanim slikama i jasnim putem do upita za kupce kojima trebaju izrada, isporuka i montaža.", ...projectsMeta["pramoal"] },
|
||||
{ slug: "botinator", title: "Botinator", description: "Hobi Discord bot za ličnu upotrebu. Mali JDA bot sa nekoliko zabavnih slash komandi i puštanjem muzike preko Lavalink-a.", about: "Hobi Discord bot napravljen za ličnu upotrebu u Javi i JDA-u. Ima nekoliko zabavnih slash komandi i puštanje muzike preko Lavalink-a, radi kao mali self-hosted servis.", ...projectsMeta["botinator"] },
|
||||
{ slug: "mobile-companion", title: "Menadžer klijentskih sastanaka", description: "Java Spring Boot aplikacija za beleške, zakazivanje i praćenje sastanaka sa klijentima, uz React Native prateću aplikaciju.", about: "Java Spring Boot backend uparen sa React Native aplikacijom za upravljanje odnosima sa klijentima — beleške, zakazivanje sastanaka i praćenje follow-up-ova na jednom mestu. Koristi PostgreSQL za skladištenje podataka. Trenutno u izradi.", ...projectsMeta["mobile-companion"] },
|
||||
{ slug: "ssh-portfolio", title: "SSH Portfolio", description: "Terminalski portfolio koji možeš istražiti preko SSH-a — bez potrebe za browserom. Trenutno se ažurira novim stvarima koje sam naučio.", about: "TUI portfolio napravljen u Go-u i Bubble Tea-u, servovan kroz Wish SSH server. Samo se konektuj preko `ssh` iz bilo kog terminala i pregledaj projekte, vještine i kontakt informacije potpuno preko tastature — bez browsera, bez JavaScript-a, bez web servera. I dalje se ažurira novim stvarima koje sam usput naučio.", ...projectsMeta["ssh-portfolio"] },
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 672 KiB |
Reference in New Issue
Block a user