feat(): add files

This commit is contained in:
Aleksander Wilczyński 2025-03-19 01:11:21 +01:00
parent 387d5d4129
commit 6498c3a9ac
Signed by: alekswilc
GPG Key ID: D4464A248E5F27FE
30 changed files with 6372 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

28
eslint.config.js Normal file
View File

@ -0,0 +1,28 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
)

37
index.html Normal file
View File

@ -0,0 +1,37 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/jpg" href="./avatar.jpg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Aleksander Wilczyński | wilczyński.me</title>
<meta name="title" content="Aleksander Wilczyński" />
<meta name="description" content="IT Administrator, Fullstack Developer" />
<meta name="theme-color" content="#b942f5">
<meta property="og:type" content="website" />
<meta property="og:url" content="https://wilczyński.me/" />
<meta property="og:title" content="Aleksander Wilczyński" />
<meta property="og:description" content="IT Administrator, Fullstack Developer" />
<meta property="og:image" content="https://wilczynski.me/avatar.jpg" />
<meta property="twitter:card" content="summary" />
<meta property="twitter:url" content="https://wilczyński.me/" />
<meta property="twitter:title" content="Aleksander Wilczyński" />
<meta property="twitter:description" content="IT Administrator, Fullstack Developer" />
<meta property="twitter:image" content="https://wilczynski.me/avatar.jpg" />
<meta property="discord:app:name" content="Aleksander Wilczyński">
<meta property="discord:app:description" content="IT Administrator, Fullstack Developer">
<meta property="discord:app:image" content="https://wilczynski.me/avatar.jpg">
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

3857
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

37
package.json Normal file
View File

@ -0,0 +1,37 @@
{
"name": "wilczynski.me",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"@tailwindcss/cli": "^4.0.12",
"@tailwindcss/postcss": "^4.0.12",
"i18next": "^24.2.3",
"i18next-browser-languagedetector": "^8.0.4",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-i18next": "^15.4.1"
},
"devDependencies": {
"@eslint/js": "^9.21.0",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@vitejs/plugin-react": "^4.3.4",
"autoprefixer": "^10.4.21",
"eslint": "^9.21.0",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^15.15.0",
"postcss": "^8.5.3",
"tailwindcss": "^4.0.12",
"typescript": "~5.7.2",
"typescript-eslint": "^8.24.1",
"vite": "^6.2.0"
}
}

5
postcss.config.mjs Normal file
View File

@ -0,0 +1,5 @@
export default {
plugins: {
"@tailwindcss/postcss": {},
}
}

BIN
public/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

4
public/robots.txt Normal file
View File

@ -0,0 +1,4 @@
User-agent: *
Allow: /
Sitemap: https://wilczynski.me/sitemap.xml

4
public/security.txt Normal file
View File

@ -0,0 +1,4 @@
Contact: mailto:security@wilczynski.me
Expires: 2027-12-02T23:00:00.000Z
Preferred-Languages: en, pl
Canonical: https://wilczynski.me/security.txt

7
public/sitemap.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.wilczynski.me/</loc>
<lastmod>2025-03-19</lastmod>
</url>
</urlset>

22
src/App.tsx Normal file
View File

@ -0,0 +1,22 @@
import { Header } from './components/Header.tsx';
import { Whoami } from './components/Whoami.tsx';
import { Skills } from './components/Skills.tsx';
import { Projects } from './components/Projects.tsx';
import { Contact } from './components/Contact.tsx';
import { Accounts } from './components/Accounts.tsx';
export const App = () => {
return (
<>
<Header />
<div className="flex flex-col mt-25 gap-8 font-sans grow">
<Whoami />
<Skills />
<Projects />
<Contact />
<Accounts />
</div>
</>
);
}

View File

@ -0,0 +1,47 @@
import { DiscordIcon, GiteaIcon, GithubIcon, LinkedInIcon } from './Icons.tsx';
export const Accounts = () => {
return <div className="flex flex-col gap-4 md:flex-row">
<a href='https://discord.com/users/821421438719492136' className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 grow basis-1 '>
<div className="flex flex-row gap-4 h-full">
<div className="flex flex-col justify-center">
<DiscordIcon />
</div>
<div className="flex flex-col justify-center">
<p className='font-bold'>Discord</p>
</div>
</div>
</a>
<a href='https://github.com/alekswilc' className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 grow basis-1'>
<div className="flex flex-row gap-4 h-full">
<div className="flex flex-col justify-center">
<GithubIcon />
</div>
<div className="flex flex-col justify-center">
<p className='font-bold'>Github</p>
</div>
</div>
</a>
<a href='https://git.alekswilc.dev/alekswilc/' className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 grow basis-1'>
<div className="flex flex-row gap-4 h-full">
<div className="flex flex-col justify-center">
<GiteaIcon />
</div>
<div className="flex flex-col justify-center">
<p className='font-bold'>Gitea</p>
</div>
</div>
</a>
<a href='https://linkedin.com/in/alekswilc/' className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 grow basis-1'>
<div className="flex flex-row gap-4">
<div className="flex flex-col justify-center">
<LinkedInIcon />
</div>
<div className="flex flex-col justify-center">
<p className='font-bold'>LinkedIn</p>
</div>
</div>
</a>
</div>;
}

View File

@ -0,0 +1,24 @@
import { useTranslation } from 'react-i18next'
export const Contact = () => {
const { t } = useTranslation();
return <div className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 justify-center font-light'>
<h1 className='text-xl font-bold'>{t("landing.contact.title")}</h1>
<div className='flex flex-row gap-2'>
<svg width="25" height="25" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M29.3333 17.3334V8.00004C29.3333 7.2928 29.0524 6.61452 28.5523 6.11442C28.0522 5.61433 27.3739 5.33337 26.6667 5.33337H5.33332C4.62608 5.33337 3.9478 5.61433 3.4477 6.11442C2.94761 6.61452 2.66666 7.2928 2.66666 8.00004V24C2.66666 25.4667 3.86666 26.6667 5.33332 26.6667H16M29.3333 9.33337L17.3733 16.9334C16.9617 17.1913 16.4857 17.3281 16 17.3281C15.5142 17.3281 15.0383 17.1913 14.6267 16.9334L2.66666 9.33337M25.3333 21.3334V29.3334M21.3333 25.3334H29.3333" stroke="#FABE5E" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
</svg>
<a href='mailto:aleks@wilczynski.me'>{t("landing.contact.email")}</a>
</div>
<div className="flex flex-row gap-2">
<svg width="25" height="25" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M29.3333 14V8.00004C29.3333 7.2928 29.0524 6.61452 28.5523 6.11442C28.0522 5.61433 27.3739 5.33337 26.6667 5.33337H5.33332C4.62608 5.33337 3.9478 5.61433 3.4477 6.11442C2.94761 6.61452 2.66666 7.2928 2.66666 8.00004V24C2.66666 25.4667 3.86666 26.6667 5.33332 26.6667H22M29.3333 9.33337L17.3733 16.9334C16.9617 17.1913 16.4857 17.3281 16 17.3281C15.5142 17.3281 15.0383 17.1913 14.6267 16.9334L2.66666 9.33337M26.6667 18.6667V24M26.6667 29.3334V29.3467" stroke="#FE7979" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
</svg>
<a href='mailto:security@wilczynski.me'>{t("landing.contact.vulb")}</a>
</div>
</div>;
}

38
src/components/Header.tsx Normal file
View File

@ -0,0 +1,38 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
const getTimeFormat = (currentLanguage: string) => new Intl.DateTimeFormat(currentLanguage, {
dateStyle: "full",
timeStyle: "long",
timeZone: "Europe/Warsaw",
}).format(new Date());
export const Header = () => {
const { t, i18n: { changeLanguage, language } } = useTranslation();
const [currentLanguage, setCurrentLanguage] = useState(language);
const [clock, setClock] = useState(getTimeFormat(currentLanguage));
useEffect(() => {
setClock(getTimeFormat(currentLanguage));
const _ = setInterval(() => setClock(getTimeFormat(currentLanguage)), 1000);
return () => clearInterval(_);
}, [currentLanguage]);
const handleChangeLanguage = () => {
const newLanguage = currentLanguage === "en" ? "pl" : "en";
setCurrentLanguage(newLanguage);
changeLanguage(newLanguage);
}
return <div className='sticky flex flex-col gap-24 top-4 select-none'>
<div className='p-4 border-1 border-[#757575] rounded-xl flex flex-col md:flex-row grow justify-around bg-[#1C1C1C]'>
<h1 className='text-white'>{t('header.home')}</h1>
<h1 className='text-white'>{clock}</h1>
<h1 className='text-white'>
<button className='cursor-pointer' onClick={handleChangeLanguage}>{['PL', 'EN'].map<React.ReactNode>(x => currentLanguage.includes(x.toLocaleLowerCase()) ? (<b>{x}</b>) : x).reduce((prev, curr) => [prev, '/', curr])}</button>
</h1>
</div>
</div>;
}

29
src/components/Icons.tsx Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,35 @@
import { useTranslation } from 'react-i18next'
export const Projects = () => {
const { t } = useTranslation();
return <div className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 justify-center font-light'>
<h1 className='text-xl font-bold'>{t("landing.projects.title")}</h1>
<div className="flex flex-col gap-4 pt-4">
<div className="flex flex-row gap-4 basis-1">
<div className='bg-[#1C1C1C] text-white flex border-1 border-[#757575] rounded-xl text-left p-4 flex-col md:flex-row basis-1 grow'>
<div className='flex flex-col justify-center text-center items-center'>
<img alt='image' className='w-20 rounded md:pr-4' src='https://cdn.alekswilc.dev/0dab8e0d-fcc9-481a-9a58-5ebb5a9dda39.png' />
</div>
<div className='flex flex-col justify-center'>
<h1 className='text-xl font-bold'>{t("landing.projects.projects.simrailpro.title")}</h1>
<p className='font-light'>{t("landing.projects.projects.simrailpro.descripton")}</p>
</div>
</div>
<div className='bg-[#1C1C1C] text-white flex border-1 border-[#757575] rounded-xl text-left p-4 flex-col md:flex-row basis-1 grow align-center'>
<div className='flex flex-col justify-center text-center items-center'>
<img alt='image' className='w-20 rounded md:pr-4' src='https://cdn.alekswilc.dev/431d2c3e-746b-41f5-9899-d4e1ee81c0cf.png' />
</div>
<div className='flex flex-col justify-center'>
<h1 className='text-xl font-bold'>{t("landing.projects.projects.cocorp.title")}</h1>
<p className='font-light'>{t("landing.projects.projects.cocorp.descripton")}</p>
</div>
</div>
</div>
</div>
</div>;
}

42
src/components/Skills.tsx Normal file
View File

@ -0,0 +1,42 @@
import { useTranslation } from 'react-i18next';
export const Skills = () => {
const { t } = useTranslation();
return <div className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 justify-center font-light'>
<h1 className='text-xl font-bold'>{t("landing.skills.title")}</h1>
<div className="flex flex-col md:flex-row gap-4 md:gap-0 justify-between">
<div className="flex flex-col">
<p className='text-xl md:text-base'>{t("landing.skills.languages")}</p>
<p className='text-blue-400'>HTML</p>
<p className='text-red-400'>React</p>
<p className='text-orange-300'>TypeScript</p>
<p className='text-blue-500'>C</p>
<p className='text-purple-500'>GO</p>
<p>{t('landing.skills.more')}</p>
</div>
<div className="flex flex-col">
<p className='text-xl md:text-base'>{t("landing.skills.tools")}</p>
<p className='text-blue-400'>JetBrains</p>
<p className='text-red-400'>Visual Studio Code</p>
<p className='text-orange-300'>Termius</p>
<p className='text-blue-500'>AutoCAD</p>
<p className='text-violet-500'>Proxmox</p>
<p className='text-cyan-500'>Cloudflare</p>
<p>{t('landing.skills.more')}</p>
</div>
<div className="flex flex-col">
<p className='text-xl md:text-base'>{t("landing.skills.softskills.title")}</p>
<p className='text-red-400'>{t("landing.skills.softskills.adaptability")}</p>
<p className='text-emerald-500'>{t("landing.skills.softskills.problem_solving")}</p>
<p className='text-cyan-300'>{t("landing.skills.softskills.creativity")}</p>
<p className='text-purple-500'>{t("landing.skills.softskills.time_managment")}</p>
<p className='text-purple'>{t("landing.skills.softskills.hard_work")}</p>
</div>
</div>
</div>;
}

13
src/components/Whoami.tsx Normal file
View File

@ -0,0 +1,13 @@
import { useTranslation } from 'react-i18next'
export const Whoami = () => {
const { t } = useTranslation();
return <div className="flex flex-row gap-4">
<div className='bg-[#1C1C1C] text-white flex flex-col border-1 border-[#757575] rounded-xl text-left p-4 grow basis-1'>
<h1 className='text-xl font-bold'>{t('landing.title')}</h1>
<p className='font-light'>{t('landing.whoami')}</p>
</div>
</div>;
}

41
src/i18n/en.json Normal file
View File

@ -0,0 +1,41 @@
{
"header": {
"home": "Home"
},
"landing": {
"title": "Hi 👋 Im Aleksander Wilczyński",
"whoami": "I am an IT administrator with experience in network infrastructure management and full-stack web application development. I create tools for Windows and Linux systems, as well as scripts for games. My interests include military, firearms, and emergency medical rescue.",
"skills": {
"title": "My Skills 🎓",
"languages": "Languages:",
"tools": "Tools:",
"softskills": {
"title": "Soft skills:",
"adaptability": "Adaptability",
"problem_solving": "Problem solving",
"creativity": "Creativity",
"time_managment": "Time Managment",
"hard_work": "Hard work"
},
"more": "... and more"
},
"projects": {
"title": "Featured Projects",
"projects": {
"simrailpro": {
"title": "Simrail.PRO",
"descripton": "Simrail Stats - The best SimRail logs and statistics site!"
},
"cocorp": {
"title": "CoCoRP",
"descripton": "RolePlay Fivem Server!"
}
}
},
"contact": {
"title": "Contact Me",
"email": "Send me an email: aleks@wilczynski.me",
"vulb": "Report vulnerability: security@wilczynski.me"
}
}
}

28
src/i18n/i18n.ts Normal file
View File

@ -0,0 +1,28 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import en from './en.json';
import pl from './pl.json';
i18n
.use(initReactI18next)
.use(LanguageDetector)
.init({
resources: {
pl: {
"_": pl,
},
en: {
"_": en,
}
},
debug: false,
fallbackLng: "en",
interpolation: {
escapeValue: false,
},
ns: "_",
defaultNS: "_",
});

41
src/i18n/pl.json Normal file
View File

@ -0,0 +1,41 @@
{
"header": {
"home": "Strona Główna"
},
"landing": {
"title": "Hej 👋 jestem Aleksander Wilczyński",
"whoami": "Jestem administratorem IT z doświadczeniem w zarządzaniu infrastrukturą sieciową oraz programowaniu aplikacji webowych w zakresie full stack. Tworzę narzędzia dla systemów Windows i Linux, a także skrypty do gier. Moje zainteresowania obejmują tematykę militarną, broń oraz ratownictwo medyczne.",
"skills": {
"title": "Moje umiejętności 🎓",
"languages": "Języki:",
"tools": "Narzędzia:",
"softskills": {
"title": "Umiejętności miękkie:",
"adaptability": "Adaptacja",
"problem_solving": "Rozwiązywanie problemów",
"creativity": "Kreatywność",
"time_managment": "Zarządzanie czasem",
"hard_work": "Ciężka praca"
},
"more": "... i więcej"
},
"projects": {
"title": "Wybrane projekty",
"projects": {
"simrailpro": {
"title": "Simrail.PRO",
"descripton": "Najlepsza strona z logami i statystykami do gry SimRail!"
},
"cocorp": {
"title": "CoCoRP",
"descripton": "Serwer FiveM, skoncentrowany na RP!"
}
}
},
"contact": {
"title": "Skontaktuj się ze mną",
"email": "Wyślij mi E-Mail: aleks@wilczynski.me",
"vulb": "Zgłoś podatność: security@wilczynski.me"
}
}
}

11
src/main.tsx Normal file
View File

@ -0,0 +1,11 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './style/index.css';
import { App } from './App.tsx'
import './i18n/i18n.ts';
createRoot(document.getElementById('root')!).render(
<StrictMode>
<App />
</StrictMode>,
);

19
src/style/index.css Normal file
View File

@ -0,0 +1,19 @@
@import "tailwindcss";
@import url('https://fonts.googleapis.com/css2?family=Prompt:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
#root {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
:root {
--default-font-family: "Prompt", sans-serif;
--font-sans: "Prompt", sans-serif;
--font-mono: "Prompt", sans-serif;
}
body {
background-color: #0F0F0F;
}

1
src/vite-env.d.ts vendored Normal file
View File

@ -0,0 +1 @@
/// <reference types="vite/client" />

17
tailwind.config.js Normal file
View File

@ -0,0 +1,17 @@
// tailwind.config.js
const { fontFamily } = require('tailwindcss/defaultTheme')
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx}',
],
theme: {
fontFamily: {
sans: [
'"Satoshi"',
'sans-serif',
],
},
},
plugins: [],
}

26
tsconfig.app.json Normal file
View File

@ -0,0 +1,26 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src"]
}

7
tsconfig.json Normal file
View File

@ -0,0 +1,7 @@
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
]
}

24
tsconfig.node.json Normal file
View File

@ -0,0 +1,24 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}

14
vite.config.ts Normal file
View File

@ -0,0 +1,14 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
server: {
host: '0.0.0.0',
allowedHosts: [
'ptb.alekswilc.dev'
]
}
})

1890
yarn.lock Normal file

File diff suppressed because it is too large Load Diff