new site
This commit is contained in:
4
.env.example
Normal file
4
.env.example
Normal file
@@ -0,0 +1,4 @@
|
||||
APP_HOST=127.0.0.1
|
||||
APP_PORT=5000
|
||||
DEBUG=True
|
||||
SECRET_KEY=yoursecretkey
|
||||
132
.gitignore
vendored
Normal file
132
.gitignore
vendored
Normal 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
15
app.py
Normal 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
17
config.py
Normal 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
3
hypercorn_config.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
bind = "127.0.0.1:5000"
|
||||
workers = 1
|
||||
reload = true
|
||||
22
requirements.txt
Normal file
22
requirements.txt
Normal 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
12
routes/home.py
Normal 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
110
static/css/styles.css
Normal 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
10
static/js/main.js
Normal 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)';
|
||||
});
|
||||
7
templates/content/link.html
Normal file
7
templates/content/link.html
Normal 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>
|
||||
10
templates/content/skills.html
Normal file
10
templates/content/skills.html
Normal 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
26
templates/head.html
Normal 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
17
templates/index.html
Normal 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>
|
||||
Reference in New Issue
Block a user