Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
261 lines (232 loc) · 15.6 KB
/
Copy pathscript.js
File metadata and controls
261 lines (232 loc) · 15.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
const themeSwitch = document.getElementById('theme-switch');
let currentTheme = localStorage.getItem('theme') || 'light';
if (currentTheme === 'dark') {
document.body.setAttribute('data-theme', 'dark');
}
themeSwitch.addEventListener('click', () => {
const isDark = document.body.getAttribute('data-theme') === 'dark';
if (isDark) {
document.body.removeAttribute('data-theme');
localStorage.setItem('theme', 'light');
currentTheme = 'light';
} else {
document.body.setAttribute('data-theme', 'dark');
localStorage.setItem('theme', 'dark');
currentTheme = 'dark';
}
});
const translations = {
en: {
admin_title: "Management & Administration Experience",
admin_text: "Successfully managing and administering a game server both in-game and on Discord. Leading and curating the moderation team, configuring server hosting, permission systems (LuckPerms), and maintaining community guidelines.",
nav_about: "About", nav_projects: "Projects", nav_contact: "Contact", nav_skills: "Tech Stack", nav_edu: "Goals",
status_open: "🚀 Open to Work & Internships",
btn_contacts: "📬 Contacts & Other links",
about_text: "Computer science student at DSW IDEIS with hands-on experience in Java, C#, Python, and web development. I build Minecraft mods, Discord bots, and websites — mostly for fun, always learning something new. Sometimes I use AI tools (ChatGPT, Gemini, Claude) as part of my workflow — not just to generate code, but to understand, debug, and improve it. Currently, I am continuing to deeply study C# (independently and at the university), and I am also mastering JavaScript as part of my university studies.",
edu_uni: "DSW IDEIS, Krakow",
edu_date: "2025 — Present",
edu_degree: "Applied Informatics — Completed 1st Year, starting 2nd Year",
edu_goal: "As a student of Applied Informatics, I am focused on bridging theoretical knowledge with practical challenges. I am currently seeking an internship or a Junior Developer position where I can contribute to meaningful projects, solve complex technical problems, and further develop my skills. I am highly motivated to deliver tangible results, gain hands-on professional experience, and demonstrate my dedication to a high-standard engineering culture.",
proj_university: "A collection of academic projects, laboratory works, and practical assignments developed during my university studies, focusing on programming logic, data structures, and algorithms.",
proj_afterlight: "Website for a Minecraft server. Custom design, navigation, server IP copy and online counter.",
proj_tense: "Interactive platform for learning English grammar tenses with quizzes.",
proj_markt: "Dynamic website integrated with an online database for real-time data.",
proj_alert: "Python bot for Discord that sends air raid alerts via button interactions.",
proj_mods: "8 published mods, datapacks and resource packs with 2,000+ total downloads. Includes Safe Pets, Lava Detector and more.",
footer_tagline: "Let's build something awesome together."
},
uk: {
admin_title: "Досвід менеджменту та адміністрування",
admin_text: "Успішно адмініструю та керую ігровим сервером як безпосередньо у грі, так і в Discord. Займаюся кураторством команди модерації, налаштуванням хостингу, систем прав (LuckPerms) та підтримкою правил спільноти.",
nav_about: "Про мене", nav_projects: "Проєкти", nav_contact: "Контакти", nav_skills: "Стек технологій", nav_edu: "Цілі",
status_open: "🚀 Відкритий до роботи та стажувань",
btn_contacts: "📬 Контакти та інші посилання",
about_text: "Студент прикладної інформатики в DSW IDEIS з практичним досвідом у Java, C#, Python та веб-розробці. Створюю моди для Minecraft, Discord ботів та сайти — переважно для задоволення та постійного вивчення нового. Використовую ШІ (ChatGPT, Gemini, Claude) у своїй роботі не просто для генерації коду, а для його розуміння, дебагінгу та покращення. Зараз продовжую поглиблено вивчати C# (самостійно та в університеті), а також освоюю JavaScript в рамках університетської програми.",
edu_uni: "DSW IDEIS, Краків",
edu_date: "2025 — Поточний час",
edu_degree: "Прикладна інформатика (Informatyka Stosowana) — Закінчив 1-й курс, перехід на 2-й",
edu_goal: "Як студент прикладної інформатики, я зосереджений на інтеграції теоретичних знань із реальними бізнес-завданнями. Зараз я шукаю стажування або позицію Junior-розробника, де зможу робити вагомий внесок у проєкти, розв'язувати складні технічні задачі та професійно зростати. Моя мета — приносити користь команді, отримувати практичний досвід та дотримуватися високих стандартів розробки.",
proj_university: "Колекція академічних проєктів, лабораторних робіт та практичних завдань, виконаних під час навчання в університеті. Фокус на логіці програмування, структурах даних та алгоритмах.",
proj_university: "Колекція академічних проектів, лабораторних робіт та практичних завдань, розроблених під час навчання в університеті, зосереджених на логіці програмування, структурах даних та алгоритмах.",
proj_afterlight: "Сайт для сервера Minecraft. Кастомний дизайн, навігація, копіювання IP та лічильник онлайну.",
proj_tense: "Інтерактивна платформа для вивчення часів англійської граматики з тестами.",
proj_markt: "Динамічний сайт, інтегрований з онлайн-базою для роботи з даними в реальному часі.",
proj_alert: "Python-бот для Discord, який надсилає сповіщення про повітряну тривогу через взаємодію з кнопками.",
proj_mods: "8 опублікованих модів, датапаків та ресурспаків із 2000+ завантаженнями. Включає Safe Pets, Lava Detector тощо.",
footer_tagline: "Створимо щось круте разом."
},
pl: {
admin_title: "Doświadczenie w zarządzaniu i administracji",
admin_text: "Z powodzeniem zarządzam i administruję serwerem gier zarówno w grze, jak i na Discordzie. Zajmuję się kuratorstwem zespołu moderacji, konfiguracją hostingu, systemów uprawnień (LuckPerms) oraz utrzymaniem porządku w społeczności.",
nav_about: "O mnie", nav_projects: "Projekty", nav_contact: "Kontakt", nav_skills: "Stack technologiczny", nav_edu: "Cele",
status_open: "🚀 Otwarty na pracę i staże",
btn_contacts: "📬 Kontakty i inne linki",
about_text: "Student informatyki stosowanej na DSW IDEIS z praktycznym doświadczeniem w Javie, C#, Pythonie i tworzeniu stron WWW. Tworzę mody do Minecrafta, boty na Discorda i strony internetowe. Czasami używam narzędzi AI (ChatGPT, Gemini, Claude) nie tylko do generowania kodu, ale także do jego analizy, debugowania i ulepszania. Obecnie nadal intensywnie studiuję C# (zarówno samodzielnie, jak i na uniwersytecie), a także opanowuję JavaScript w ramach studiów uniwersyteckich.",
edu_uni: "DSW IDEIS, Kraków",
edu_date: "2025 — Obecnie",
edu_degree: "Informatyka Stosowana — Ukończony 1. rok, przejście na 2. rok",
edu_goal: "Jako student inżynierii oprogramowania skupiam się na łączeniu wiedzy teoretycznej z wyzwaniami praktycznymi. Aktywnie poszukuję stażu lub stanowiska Junior Developer, gdzie mógłbym wspierać zespół w tworzeniu wartościowych rozwiązań, mierzyć się z ambitnymi wyzwaniami technicznymi i rozwijać swoje kompetencje. Jestem zmotywowany do dostarczania realnych rezultatów i pracy zgodnie z wysokimi standardami inżynierskimi.",
proj_university: "Kolekcja projektów akademickich, prac laboratoryjnych i zadań praktycznych zrealizowanych podczas studiów uniwersyteckich, skupiająca się na logice programowania, strukturach danych i algorytmach.",
proj_afterlight: "Strona dla serwera Minecraft. Niestandardowy projekt, kopiowanie IP i licznik graczy online.",
proj_tense: "Interaktywna platforma do nauki czasów w gramatyce angielskiej z quizami.",
proj_markt: "Dynamiczna strona internetowa zintegrowana z bazą danych online.",
proj_alert: "Bot w Pythonie na Discorda wysyłający alarmy przeciwlotnicze poprzez interakcje z przyciskami.",
proj_mods: "8 opublikowanych modów z ponad 2000+ pobraniami (w tym m.in. Safe Pets).",
footer_tagline: "Stwórzmy cośl niesamowitego razem."
}
};
const savedLang = localStorage.getItem('language') || 'en';
function updateLanguage(lang) {
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.getAttribute('data-i18n');
if (translations[lang] && translations[lang][key]) {
el.textContent = translations[lang][key];
}
});
document.querySelectorAll('.lang-btn').forEach(btn => {
if (btn.getAttribute('data-value') === lang) {
btn.classList.add('active');
} else {
btn.classList.remove('active');
}
});
localStorage.setItem('language', lang);
}
updateLanguage(savedLang);
document.querySelectorAll('.lang-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
updateLanguage(e.target.getAttribute('data-value'));
});
});
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.skill-tag').forEach(tag => {
const level = parseInt(tag.dataset.level) || 1;
const labels = ['Beginner', 'Basic', 'Intermediate', 'Pro'];
const tooltip = document.createElement('div');
tooltip.className = 'skill-tooltip';
let segmentsHtml = '';
for(let i = 1; i <= 4; i++) {
segmentsHtml += `<div class="tooltip-segment ${i <= level ? 'filled' : ''}"></div>`;
}
tooltip.innerHTML = `
<div class="tooltip-labels"><span>Beginner</span><span>Pro</span></div>
<div class="tooltip-bar">${segmentsHtml}</div>
<div class="tooltip-level-name">${labels[level - 1]}</div>
`;
tag.appendChild(tooltip);
});
const headerName = document.querySelector('.header-name');
const heroTitle = document.querySelector('h1.gradient-text');
if (headerName && heroTitle) {
const titleObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (!entry.isIntersecting) {
headerName.classList.add('visible');
} else {
headerName.classList.remove('visible');
}
});
}, {
threshold: 0,
rootMargin: "-68px 0px 0px 0px"
});
titleObserver.observe(heroTitle);
}
});
const revealElements = document.querySelectorAll('.reveal');
const revealOptions = { threshold: 0.05, rootMargin: "0px 0px -40px 0px" };
const revealOnScroll = new IntersectionObserver(function(entries, observer) {
entries.forEach(entry => {
if (!entry.isIntersecting) return;
entry.target.classList.add('active');
observer.unobserve(entry.target);
});
}, revealOptions);
revealElements.forEach(el => { revealOnScroll.observe(el); });
const canvas = document.getElementById('particles');
const ctx = canvas.getContext('2d');
let particles = [];
const particleCount = window.innerWidth < 600 ? 30 : 70;
let mouse = { x: null, y: null, radius: 100 };
window.addEventListener('mousemove', (e) => {
mouse.x = e.x;
mouse.y = e.y;
});
window.addEventListener('mouseout', () => {
mouse.x = null;
mouse.y = null;
});
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
window.addEventListener('resize', resizeCanvas);
resizeCanvas();
class Particle {
constructor() {
this.x = Math.random() * canvas.width;
this.y = Math.random() * canvas.height;
this.size = Math.random() * 2 + 1;
this.speedX = (Math.random() - 0.5) * 0.3;
this.speedY = (Math.random() - 0.5) * 0.3;
}
update() {
this.x += this.speedX;
this.y += this.speedY;
if (this.x < 0 || this.x > canvas.width) this.speedX *= -1;
if (this.y < 0 || this.y > canvas.height) this.speedY *= -1;
if (mouse.x != null) {
let dx = mouse.x - this.x;
let dy = mouse.y - this.y;
let distance = Math.sqrt(dx * dx + dy * dy);
if (distance < mouse.radius) {
const forceDirectionX = dx / distance;
const forceDirectionY = dy / distance;
const force = (mouse.radius - distance) / mouse.radius;
this.x -= forceDirectionX * force * 0.8;
this.y -= forceDirectionY * force * 0.8;
}
}
}
draw() {
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fillStyle = currentTheme === 'dark' ? 'rgba(255, 255, 255, 0.4)' : 'rgba(0, 0, 0, 0.15)';
ctx.fill();
}
}
function initParticles() {
particles = [];
for (let i = 0; i < particleCount; i++) {
particles.push(new Particle());
}
}
function connectParticles() {
for (let a = 0; a < particles.length; a++) {
for (let b = a; b < particles.length; b++) {
let dx = particles[a].x - particles[b].x;
let dy = particles[a].y - particles[b].y;
let distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 120) {
let opacity = 1 - (distance / 120);
ctx.strokeStyle = currentTheme === 'dark' ? `rgba(255, 255, 255, ${opacity * 0.15})` : `rgba(0, 0, 0, ${opacity * 0.08})`;
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(particles[a].x, particles[a].y);
ctx.lineTo(particles[b].x, particles[b].y);
ctx.stroke();
}
}
}
}
function animateParticles() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < particles.length; i++) {
particles[i].update();
particles[i].draw();
}
connectParticles();
requestAnimationFrame(animateParticles);
}
initParticles();
animateParticles();