This commit is contained in:
Jetomit_Bio 2026-01-23 19:07:57 +01:00
parent 7ada5a5ee1
commit 89b97d8b6c
4 changed files with 77 additions and 53 deletions

View File

@ -1,59 +1,77 @@
#!/bin/bash
# Farby pre krajší terminál
# --- FARBY PRE TERMINÁL ---
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
NC='\033[0m'
echo -e "${BLUE}==========================================${NC}"
echo -e "${BLUE} Jetomit_Bio - Automatická Inštalácia ${NC}"
echo -e "${BLUE} JETOMIT_BIO - AUTOMATICKÝ DEPLOY ${NC}"
echo -e "${BLUE}==========================================${NC}"
# 1. Kontrola prostredia
echo -e "\n${YELLOW}🔍 Kontrolujem prostredie...${NC}"
if ! command -v npm &> /dev/null; then
echo -e "${RED}❌ Chyba: NPM nie je nainštalované. Nainštaluj si Node.js.${NC}"
exit 1
fi
# 1. ZBER ÚDAJOV
read -p "Zadaj svoju doménu (napr. jetomit.bio): " DOMAIN
read -p "Zadaj svoj e-mail (pre SSL/Certbot): " EMAIL
read -p "Vlož svoj RESEND_API_KEY: " RESEND_KEY
# 2. Inštalácia závislostí
echo -e "${GREEN}📦 Inštalujem balíčky (Next.js, Framer Motion, Resend, Lucide, Tailwind)...${NC}"
# 2. INŠTALÁCIA SYSTÉMOVÝCH BALÍKOV
echo -e "\n${YELLOW}📦 Inštalujem Nginx, Node.js a Certbot...${NC}"
sudo apt update
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs nginx certbot python3-certbot-nginx
# 3. PRÍPRAVA APLIKÁCIE
echo -e "${GREEN}📦 Inštalujem NPM balíky a buildujem projekt...${NC}"
npm install
npm run build
# 3. Kontrola .env súboru
echo -e "${GREEN}🔑 Kontrolujem konfiguračné súbory...${NC}"
if [ ! -f .env ]; then
echo -e "${YELLOW}📝 Súbor .env nebol nájdený. Vytváram šablónu...${NC}"
echo "RESEND_API_KEY=re_tvoj_kluc_tu" > .env
echo -e "${RED}⚠ DOPLŇ SI API KĽÚČ DO SÚBORU .env!${NC}"
else
echo -e "${BLUE}✅ Súbor .env už existuje.${NC}"
fi
# 4. NASTAVENIE .env
echo -e "${GREEN}🔑 Vytváram .env súbor...${NC}"
echo "RESEND_API_KEY=$RESEND_KEY" > .env
echo "NEXT_PUBLIC_DOMAIN=$DOMAIN" >> .env
# 4. Kontrola dátových súborov (JSON)
echo -e "${GREEN}📂 Kontrolujem dátovú štruktúru...${NC}"
FILES=("src/data/navbar.json" "src/data/main_page.json" "src/data/socials.json" "src/data/mainprojects.json" "src/data/contact.json")
# 5. AUTOMATICKÁ KONFIGURÁCIA NGINX
echo -e "${GREEN}🌐 Konfigurujem Nginx pre doménu $DOMAIN...${NC}"
for file in "${FILES[@]}"; do
if [ ! -f "$file" ]; then
echo -e "${YELLOW}⚠ Varovanie: Súbor $file chýba. Skontroluj si priečinok src/data/.${NC}"
fi
done
NGINX_CONF="/etc/nginx/sites-available/$DOMAIN"
# 5. Príprava priečinkov pre obrázky
echo -e "${GREEN}🖼️ Pripravujem priečinky pre médiá...${NC}"
mkdir -p public/images
# Vytvorenie konfiguračného súboru pre Nginx
sudo bash -c "cat <<EOF > $NGINX_CONF
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
if [ ! -f public/images/me1.jpg ] || [ ! -f public/images/me2.jpg ]; then
echo -e "${YELLOW}📸 Nezabudni pridať fotky me1.jpg a me2.jpg do public/images/ pre správne zobrazenie polaroidov.${NC}"
fi
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host \$host;
proxy_cache_bypass \$http_upgrade;
}
}
EOF"
# 6. Finálne nastavenie práv pre skripty
chmod +x install.sh
# Aktivácia konfigurácie a reštart Nginxu
sudo ln -sf $NGINX_CONF /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl restart nginx
# 6. AUTOMATICKÉ SSL (HTTPS)
echo -e "${YELLOW}🔒 Spúšťam Certbot pre automatické SSL...${NC}"
# Certbot sám upraví Nginx konfig a pridá SSL certifikáty
sudo certbot --nginx -d $DOMAIN -d www.$DOMAIN --non-interactive --agree-tos -m $EMAIL --redirect
# 7. NASTAVENIE PM2 (Proces manažér)
echo -e "${GREEN}🚀 Spúšťam aplikáciu cez PM2, aby bežala nonstop...${NC}"
sudo npm install -g pm2
pm2 delete jetomit-bio 2>/dev/null || true
pm2 start npm --name "jetomit-bio" -- start
pm2 save
pm2 startup | bash
echo -e "\n${BLUE}==========================================${NC}"
echo -e "${GREEN}✅ Všetko je pripravené!${NC}"
echo -e "${BLUE}Spusti projekt príkazom:${NC} ${YELLOW}npm run dev${NC}"
echo -e "${GREEN}✅ HOTOVO! Tvoj web je live na: https://$DOMAIN${NC}"
echo -e "${BLUE}==========================================${NC}"

View File

@ -10,7 +10,6 @@ export default function Navbar() {
const [isMounted, setIsMounted] = useState(false);
const [activeTab, setActiveTab] = useState("");
// Funkcia na plynulý scroll
const performScroll = (id: string) => {
const element = document.getElementById(id);
if (element) {
@ -22,11 +21,10 @@ export default function Navbar() {
useEffect(() => {
setIsMounted(true);
// Detekcia počiatočného stavu a scrollu po príchode z inej stránky
if (pathname === "/") {
const hash = window.location.hash.replace("#", "");
if (hash) {
setTimeout(() => performScroll(hash), 400); // Dlhší timeout pre istotu
setTimeout(() => performScroll(hash), 400);
} else {
setActiveTab("/#home");
}
@ -41,14 +39,13 @@ export default function Navbar() {
return;
}
// Dynamické sledovanie sekcií z JSONu
navbarData.navItems.forEach((item) => {
if (item.href.includes("#")) {
const id = item.href.replace("/#", "");
const el = document.getElementById(id);
if (el) {
const rect = el.getBoundingClientRect();
if (rect.top <= 200 && rect.bottom >= 200) {
if (rect.top <= 250 && rect.bottom >= 250) {
setActiveTab(item.href);
}
}
@ -67,18 +64,19 @@ export default function Navbar() {
performScroll(id);
window.history.pushState(null, "", href);
}
// Ak ideme na /projects alebo z /projects na Home, necháme Next.js pracovať
};
return (
<nav className="fixed top-8 left-0 w-full z-50 px-8 pointer-events-none">
<div className="max-w-7xl mx-auto flex justify-between items-center">
{/* LOGO Z JSONU */}
<Link href="/" className="text-2xl font-black text-white pointer-events-auto">
<nav className="fixed top-6 md:top-8 left-0 w-full z-50 px-4 md:px-8 pointer-events-none">
<div className="max-w-7xl mx-auto flex flex-row justify-between items-center w-full">
{/* LOGO - Ponechaná veľkosť pre čitateľnosť */}
<Link href="/" className="text-xl md:text-2xl font-black text-white pointer-events-auto shrink-0 mr-4">
{navbarData.logo}
</Link>
<div className="flex bg-[#1a1a1c]/80 backdrop-blur-md p-1.5 rounded-full border border-white/5 relative pointer-events-auto">
{/* MENU CONTAINER - Trochu vyšší a priestrannejší */}
<div className="flex bg-[#1a1a1c]/80 backdrop-blur-md p-1.5 rounded-full border border-white/5 relative pointer-events-auto items-center shadow-2xl">
{navbarData.navItems.map((item) => {
const isActive = activeTab === item.href;
@ -87,8 +85,9 @@ export default function Navbar() {
key={item.href}
href={item.href}
onClick={(e) => handleLinkClick(e, item.href)}
className="relative px-6 py-2 text-sm font-bold transition-colors duration-500 z-10"
style={{ color: isActive ? "#000000" : "#9ca3af" }} // Explicitná čierna pre aktívny tab
/* ZVÄČŠENÉ: px-4 a text-xs na mobile (predtým px-3 a text-[11px]) */
className="relative px-4 md:px-7 py-2 md:py-2.5 text-xs md:text-sm font-bold transition-colors duration-500 z-10 whitespace-nowrap"
style={{ color: isActive ? "#000000" : "#9ca3af" }}
>
<AnimatePresence>
{isActive && isMounted && (
@ -98,7 +97,7 @@ export default function Navbar() {
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ type: "spring", stiffness: 380, damping: 30 }}
className="absolute inset-0 bg-white rounded-full -z-10 shadow-xl"
className="absolute inset-0 bg-white rounded-full -z-10 shadow-lg"
/>
)}
</AnimatePresence>

View File

@ -9,7 +9,7 @@
{ "name": "UI/UX", "color": "bg-orange-500/20 text-orange-400 border-orange-500/20" }
],
"config": {
"from_email": "test@kadernictvotama.sk",
"from_email": "system@jetomit.bio",
"to_email": "hello@jetomit.bio"
}
}

View File

@ -47,5 +47,12 @@
"url": "https://github.com/Jetomit-Bio/ticket-system",
"category": "Support",
"year": "2026"
},
{
"title": "Stroj Na Jednotky (Extention)",
"description": "Help with school tests in Slovak Language",
"url": "https://chromewebstore.google.com/detail/stroj-na-jednotky/jopboaofnkkbmmpllbjfgiimfinhekoi",
"category": "AI, Help",
"year": "2026"
}
]