This commit is contained in:
2025-01-04 14:40:52 +01:00
commit 053272b71a
13 changed files with 385 additions and 0 deletions

4
.env.example Normal file
View File

@@ -0,0 +1,4 @@
APP_HOST=127.0.0.1
APP_PORT=5000
DEBUG=True
SECRET_KEY=yoursecretkey

132
.gitignore vendored Normal file
View File

@@ -0,0 +1,132 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
.idea/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# app
.vsls.json
.vscode
.vs
/core/webapp/.fleet/run.json

15
app.py Normal file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright Hersel Giannella
from quart import Quart
from config import config
from routes.home import route_home
app = Quart(__name__)
app.register_blueprint(route_home)
if __name__ == '__main__':
app.run(debug=config.DEBUG, host=config.APP_HOST, port=config.APP_PORT)

17
config.py Normal file
View File

@@ -0,0 +1,17 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright Hersel Giannella
from pydantic_settings import BaseSettings
class Config(BaseSettings):
APP_HOST: str = "127.0.0.1"
APP_PORT: int = 5000
DEBUG: bool = True
SECRET_KEY: str = "default_secret_key"
class Config:
env_file = ".env"
config = Config()

3
hypercorn_config.toml Normal file
View File

@@ -0,0 +1,3 @@
bind = "127.0.0.1:5000"
workers = 1
reload = true

22
requirements.txt Normal file
View File

@@ -0,0 +1,22 @@
aiofiles==24.1.0
annotated-types==0.7.0
blinker==1.9.0
click==8.1.8
Flask==3.1.0
h11==0.14.0
h2==4.1.0
hpack==4.0.0
Hypercorn==0.17.3
hyperframe==6.0.1
itsdangerous==2.2.0
Jinja2==3.1.5
MarkupSafe==3.0.2
priority==2.0.0
pydantic==2.10.4
pydantic-settings==2.7.1
pydantic_core==2.27.2
python-dotenv==1.0.1
Quart==0.20.0
typing_extensions==4.12.2
Werkzeug==3.1.3
wsproto==1.2.0

12
routes/home.py Normal file
View File

@@ -0,0 +1,12 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright Hersel Giannella
from quart import Blueprint, render_template
route_home = Blueprint('route_home', __name__)
@route_home.route('/')
async def home():
return await render_template('index.html')

110
static/css/styles.css Normal file
View File

@@ -0,0 +1,110 @@
/* styles.css */
body {
margin: 0;
padding: 0;
background: radial-gradient(circle, #000000, #1a1a1a);
color: white;
font-family: 'Courier New', Courier, monospace;
overflow: hidden;
}
.black-hole-container {
position: relative;
width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
color: antiquewhite;
}
.black-hole {
position: absolute;
width: 250px;
height: 250px;
background: radial-gradient(circle, rgba(0, 0, 0, 0.8), #000000);
border-radius: 50%;
box-shadow: 0 0 80px 40px rgba(0, 0, 0, 0.7);
animation: spin 2s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.content {
opacity: 0;
transform: translateY(30px);
animation: fadeIn 2s ease-in-out forwards 0.5s;
}
@keyframes fadeIn {
to {
opacity: 1;
transform: translateY(0);
}
}
#name {
font-size: 3.5rem;
letter-spacing: 3px;
margin-bottom: 10px;
color: #bfbfbf; /* Grigio chiaro per armonizzare con il tema */
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.7); /* Ombra scura per contrasto */
font-weight: bold;
}
#subtitle {
font-size: 1.5rem;
margin-bottom: 30px;
}
#skills .icon-link {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
transition: color 0.3s ease;
}
#skills .icon-link i {
font-size: 1.5rem;
}
#skills .icon-link:hover {
color: #00c1ff;
}
#social-links .social-link {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
padding: 5px 10px;
border: 1px solid #ffffff;
border-radius: 5px;
transition: all 0.3s ease;
}
#social-links .social-link i {
font-size: 1.5rem;
}
#social-links .social-link:hover {
color: #000000;
background-color: #ffffff;
}

10
static/js/main.js Normal file
View File

@@ -0,0 +1,10 @@
const blackHole = document.querySelector('.black-hole');
blackHole.addEventListener('mouseover', () => {
blackHole.style.transform = 'scale(1.2)';
blackHole.style.transition = 'transform 0.2s ease';
});
blackHole.addEventListener('mouseout', () => {
blackHole.style.transform = 'scale(1)';
});

View File

@@ -0,0 +1,7 @@
<div id="social-links" class="d-flex flex-wrap justify-content-center gap-3">
<a href="https://blog.hersel.it/" target="_blank" class="social-link"><i class="bi bi-journal-code"></i> Blog</a>
<a href="https://linkedin.com/in/hersel" target="_blank" class="social-link"><i class="bi bi-linkedin"></i> LinkedIn</a>
<a href="https://github.com/blulupo" target="_blank" class="social-link"><i class="bi bi-github"></i> GitHub</a>
<a href="https://stackoverflow.com/users/11765177/hersel-giannella" target="_blank" class="social-link"><i class="bi bi-stack-overflow"></i> StackOverflow</a>
<a href="https://www.codewars.com/users/BluLupo" target="_blank" class="social-link"><i class="bi bi-terminal"></i>CodeWars</a>
</div>

View File

@@ -0,0 +1,10 @@
<div id="skills" class="mb-4">
<a href="https://www.python.org" target="_blank" class="icon-link"><i class="bi bi-file-earmark-code"></i>Python</a>
<a href="https://flask.palletsprojects.com" target="_blank" class="icon-link"><i class="bi bi-cup-hot"></i>Flask</a>
<a href="https://www.postgresql.org" target="_blank" class="icon-link"><i class="bi bi-database"></i> PostgreSQL</a>
<a href="https://php.net" target="_blank" class="icon-link"><i class="bi bi-code-slash"></i> PHP</a>
<a href="https://docker.com" target="_blank" class="icon-link"><i class="bi bi-box-seam"></i> Docker</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/HTML" target="_blank" class="icon-link"><i class="bi bi-file-earmark-text"></i> HTML</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/CSS" target="_blank" class="icon-link"><i class="bi bi-palette"></i> CSS</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank" class="icon-link"><i class="bi bi-braces"></i> JavaScript</a>
</div>

26
templates/head.html Normal file
View File

@@ -0,0 +1,26 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hersel Giannella - PortFolio</title>
<meta name="title" content="Hersel Giannella | Analista Programmatore | Python Developer | Linux SysAdmin">
<meta name="description" content="Hersel Giannella | Analista Programmatore | Python Developer | Linux SysAdmin">
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css">
</head>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.hersel.it/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->

17
templates/index.html Normal file
View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
{% include "head.html" %}
<body>
<div class="black-hole-container">
<div class="black-hole"></div>
<div class="content">
<h1 id="name">Hersel Giannella</h1>
<p id="subtitle">Analista Programmatore / Linux SysAdmin</p>
{% include "content/skills.html" %}
{% include "content/link.html" %}
</div>
</div>
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
</body>
</html>