Compare commits

...

7 Commits

13 changed files with 581 additions and 658 deletions

View File

@ -56,15 +56,7 @@ def reload_config_in_dev():
@app.route('/')
def index():
return render_template("pages/index.html.j2", cards=config_data.get("cards", []), networks=config_data.get("networks", []), company=config_data["company"])
@app.route('/imprint')
def imprint():
return render_template('pages/imprint.html.j2')
@app.route('/agb')
def agb():
return render_template('pages/agb.html.j2')
return render_template("pages/index.html.j2", cards=config_data.get("cards", []), networks=config_data.get("networks", []), company=config_data["company"], navigation=config_data["navigation"])
if __name__ == "__main__":
app.run(debug=(FLASK_ENV == "development"), host="0.0.0.0", port=5000)

View File

@ -86,18 +86,6 @@
}
],
"networks": [
{
"name": "GitHub",
"icon": "bi bi-github",
"link": "https://github.com/kevinveenbirkenbach"
},
{
"name": "Instagram",
"icon": "fa-brands fa-instagram",
"link": "https://www.instagram.com/kevinveenbirkenbach/"
}
],
"company": {
"titel": "Kevin Veen-Birkenbach",
"subtitel": "Consulting and Coaching Solutions",
@ -107,6 +95,365 @@
"postal_code": "DE-13351",
"city": "Berlin",
"country": "Germany"
},
"imprint_url": "https://s.veen.world/imprint"
},
"navigation": {
"header":[
{
"name": "Microblog",
"description": "Read my microblogs",
"icon_class": "fa-brands fa-mastodon",
"href": "https://microblog.veen.world/@kevinveenbirkenbach",
"subitems": []
},
{
"name": "Pictures",
"description": "View my photo gallery",
"icon_class": "fa-solid fa-camera",
"href": "https://picture.veen.world/kevinveenbirkenbach",
"subitems": []
},
{
"name": "Videos",
"description": "Watch my videos",
"icon_class": "fa-solid fa-video",
"href": "https://video.veen.world/a/kevinveenbirkenbach",
"subitems": []
},
{
"name": "Blog",
"description": "Read my blog",
"icon_class": "fa-solid fa-blog",
"href": "https://blog.veen.world",
"subitems": []
},
{"name": "Code",
"icon_class": "fa-solid fa-laptop-code",
"description": "Check out my Code",
"subitems": [
{
"name": "Github",
"description": "View my GitHub profile",
"icon_class": "bi bi-github",
"href": "https://github.com/kevinveenbirkenbach",
"subitems": []
},
{
"name": "Gitea",
"description": "Explore my code repositories",
"icon_class": "fa-solid fa-code",
"href": "https://git.veen.world/kevinveenbirkenbach",
"subitems": []
}
]
},
{
"name": "Logbooks",
"description": "My activity logs",
"icon_class": "fa-solid fa-book",
"href": null,
"subitems": [
{
"name": "Skydiver",
"description": "View my skydiving logs",
"icon_class": "fa-solid fa-parachute-box",
"href": "https://s.veen.world/skydiverlog",
"subitems": []
},
{
"name": "Skipper",
"description": "See my sailing records",
"icon_class": "fa-solid fa-sailboat",
"href": "https://s.veen.world/meilenbuch",
"subitems": []
},
{
"name": "Diver",
"description": "Check my diving logs",
"icon_class": "fa-solid fa-fish",
"href": "https://s.veen.world/diverlog",
"subitems": []
},
{
"name": "Pilot",
"description": "Review my flight logs",
"icon_class": "fa-solid fa-plane",
"href": "https://s.veen.world/pilotlog",
"subitems": []
},
{
"name": "Nature",
"description": "Explore my nature logs",
"icon_class": "fa-solid fa-tree",
"href": "https://s.veen.world/naturejournal"
}
]
},
{
"name": "Contact",
"description": "Get in touch",
"icon_class": "fa-solid fa-envelope",
"href": null,
"subitems": [
{
"name": "Email",
"description": "Send me an email",
"icon_class": "fa-solid fa-envelope",
"href": "kevin@veen.world",
"href_praefix": "mailto",
"subitems": []
},
{
"name": "Matrix",
"description": "Chat with me on Matrix",
"icon_class": "fa-solid fa-cubes",
"popup": true,
"address": "@kevinveenbirkenbach:veen.world"
},
{
"name": "Mobile",
"description": "Call me",
"icon_class": "fa-solid fa-phone",
"href": "+491781798023",
"href_praefix": "tel",
"subitems": []
},
{
"name": "PGP",
"description": "Access my PGP key",
"icon_class": "fa-solid fa-key",
"href": "https://s.veen.world/pgp",
"subitems": []
},
{
"name": "Signal",
"description": "Message me on Signal",
"icon_class": "fa-brands fa-signal-messenger",
"popup": true,
"href": "+491781798023",
"subitems": []
},
{
"name": "Telegram",
"description": "Message me on Telegram",
"icon_class": "fa-brands fa-telegram",
"target":"_blank",
"href": "https://t.me/kevinveenbirkenbach",
"subitems": []
},
{
"name": "WhatsApp",
"description": "Chat with me on WhatsApp",
"icon_class": "fa-brands fa-whatsapp",
"href": "https://wa.me/491781798023",
"subitems": []
}
]
}
],
"footer":
[
{
"name": "External Accounts",
"description" : "Me on other plattforms",
"icon_class" : "fa-solid fa-external-link-alt",
"subitems":[
{
"name": "Meta",
"description": "Social and developer networks",
"icon_class": "fa-brands fa-meta",
"href": null,
"subitems": [
{
"name": "Instagram",
"description": "Follow me on Instagram",
"icon_class": "fa-brands fa-instagram",
"href": "https://www.instagram.com/kevinveenbirkenbach/",
"subitems": []
},
{
"name": "Facebook",
"description": "Like my Facebook page",
"icon_class": "fa-brands fa-facebook",
"href": "https://www.facebook.com/kevinveenbirkenbach",
"subitems": []
}
]
},
{
"name": "Carreer Profiles",
"icon_class": "fa-solid fa-user-tie",
"subitems": [
{
"name": "XING",
"description": "Visit my XING profile",
"icon_class": "bi bi-building",
"href": "https://www.xing.com/profile/Kevin_VeenBirkenbach",
"subitems": []
},
{
"name": "LinkedIn",
"description": "Connect on LinkedIn",
"icon_class": "bi bi-linkedin",
"href": "https://www.linkedin.com/in/kevinveenbirkenbach",
"subitems": []
}
]
},
{
"name": "Sports",
"description": "My sport activities",
"icon_class": "fa-solid fa-running",
"href": null,
"subitems": [
{
"name": "Garmin",
"description": "My Garmin activities",
"icon_class": "fa-solid fa-person-running",
"href": "https://s.veen.world/garmin",
"subitems": []
},
{
"name": "Eversports",
"description": "My Eversports sessions",
"icon_class": "fa-solid fa-dumbbell",
"href": "https://s.veen.world/eversports",
"subitems": []
}
]
},
{
"name": "Duolingo",
"description": "Learn with me on Duolingo",
"icon_class": "fa-solid fa-language",
"href": "https://www.duolingo.com/profile/kevinbirkenbach",
"subitems": []
},
{
"name": "Spotify",
"description": "Listen to my playlists",
"icon_class": "fa-brands fa-spotify",
"href": "https://open.spotify.com/user/31vebfzbjf3p7oualis76qfpr5ty",
"subitems": []
},
{
"name": "Patreon",
"description": "Support me on Patreon",
"icon_class": "fa-brands fa-patreon",
"href": "https://patreon.com/kevinveenbirkenbach",
"subitems": []
}
]
},
{
"name": "Community",
"description": "My presence in the Fediverse",
"icon_class": "fa-solid fa-users",
"subitems": [
{
"name": "Forum",
"description": "Join the discussion",
"icon_class": "fa-brands fa-discourse",
"href": "https://forum.veen.world/u/kevinveenbirkenbach",
"subitems": []
},
{
"name": "Newsletter",
"description": "Subscribe to my newsletter",
"icon_class": "fa-solid fa-envelope-open-text",
"href": "https://newsletter.veen.world/subscription/form",
"subitems": []
}
]
},
{
"name": "Work Hub",
"description": "Curated collection of self hosted tools for work, organization, and learning.",
"icon_class": "fa-solid fa-toolbox",
"href": null,
"subitems": [
{
"name": "Open Project",
"description": "Explore my projects",
"icon_class": "fa-solid fa-chart-line",
"href": "https://project.veen.world/",
"subitems": []
},
{
"name": "Taiga",
"description": "View my Kanban board",
"icon_class": "bi bi-clipboard2-check-fill",
"href": "https://kanban.veen.world/",
"subitems": []
},
{
"name": "Matomo",
"description": "Analyze with Matomo",
"icon_class": "fa-solid fa-chart-simple",
"href": "https://matomo.veen.world/",
"subitems": []
},
{
"name": "Baserow",
"description": "Organize with Baserow",
"icon_class": "fa-solid fa-table",
"href": "https://baserow.veen.world/",
"subitems": []
},
{
"name": "Elements",
"description": "Chat with me",
"icon_class": "fa-solid fa-comment",
"href": "https://element.veen.world/",
"subitems": []
},
{
"name": "Big Blue Button",
"description": "Join live events",
"icon_class": "fa-solid fa-video",
"href": "https://meet.veen.world/",
"subitems": []
},
{
"name": "Mailu",
"description": "Send me a mail",
"icon_class": "fa-solid fa-envelope",
"href": "https://mail.veen.world/",
"subitems": []
},
{
"name": "Moodel",
"description": "Learn with my academy",
"icon_class": "fa-solid fa-graduation-cap",
"href": "https://academy.veen.world/",
"subitems": []
},
{
"name": "Yourls",
"description": "Find my curated links",
"icon_class": "bi bi-link",
"href": "https://s.veen.world/admin/",
"subitems": []
},
{
"name": "Nextcloud",
"description": "Access my cloud storage",
"icon_class": "fa-solid fa-cloud",
"href": "https://cloud.veen.world/",
"subitems": []
}
]
},
{
"name":"Imprint",
"icon_class":"fa-solid fa-scale-balanced",
"href":"https://s.veen.world/imprint"
}
}
] }
}

View File

@ -1,67 +1,99 @@
a {
text-decoration: none;
color: #000000;
}
.header img {
float: right;
width: 100px;
height: 100px;
}
text-decoration: none;
color: #000000;
}
.header img {
float: right;
width: 100px;
height: 100px;
}
.header h1 {
position: relative;
}
.equal-height {
display: flex;
flex: 1;
}
.card-body {
display: flex;
flex-direction: column;
align-items: center; /* Zentriert die Inhalte horizontal */
text-align: center; /* Zentriert den Text */
}
.header h1 {
position: relative;
}
.equal-height {
display: flex;
flex: 1;
}
.card-body {
display: flex;
flex-direction: column;
align-items: center; /* Zentriert die Inhalte horizontal */
text-align: center; /* Zentriert den Text */
}
.card-icon {
display: flex;
justify-content: center; /* Zentriert das Icon horizontal */
}
.card-text,
.card ul {
text-align: left; /* Stellt sicher, dass der Text linksbündig ist */
}
.card-icon {
display: flex;
justify-content: center; /* Zentriert das Icon horizontal */
}
.card{
flex: 1; /* Stellt sicher, dass die Karten die ganze Höhe ihrer Container ausfüllen */
border-width: 3px;
/*border-color: #000000;*/
}
.card-text,
.card ul {
text-align: left; /* Stellt sicher, dass der Text linksbündig ist */
}
h3.card-title{
font-size: 1.3em;
}
.card{
flex: 1; /* Stellt sicher, dass die Karten die ganze Höhe ihrer Container ausfüllen */
border-width: 3px;
/*border-color: #000000;*/
}
.card .stretched-link{
font-size: 0.7em;
}
h3.card-title{
font-size: 1.3em;
}
.card-column{
padding-top: 12px;
padding-bottom: 12px;
}
.card .stretched-link{
font-size: 0.7em;
}
h3.footer-title{
font-size: 1.3em;
}
.card-column{
padding-top: 12px;
padding-bottom: 12px;
}
.footer {
margin-top: 12px;
text-align: center;
font-size: 0.7em;
}
h3.footer-title{
font-size: 1.3em;
}
.footer p, h3{
margin: 0px;
padding: 0px;
}
.footer {
margin-top: 12px;
text-align: center;
font-size: 0.7em;
}
.footer p, h3{
margin: 0px;
padding: 0px;
}
.dropdown-menu {
position: absolute !important;
}
.dropdown-menu-footer {
position: absolute !important;
top: auto !important;
bottom: 100%; /* Positioniert das Menü über dem Auslöser */
transform: translateY(-10px); /* Optional: Sanfter Abstand */
}
.dropdown-submenu {
position: relative;
list-style: none;
}
.navbar-nav {
padding: 0;
margin: 0;
}
/* Stellt sicher, dass Submenüs korrekt positioniert sind */
.dropdown-submenu {
position: relative;
}
.dropdown-submenu > .dropdown-menu {
position: absolute;
top: 0;
left: 100%; /* Positioniert das Submenü rechts vom Hauptmenü */
margin-top: -1px;
}

View File

@ -0,0 +1,18 @@
function openDynamicPopup(subitem) {
// Set modal title and content
document.getElementById('dynamicModalLabel').innerText = subitem.description;
const modalContent = document.getElementById('dynamicModalContent');
modalContent.value = subitem.address;
// Add copy functionality
document.getElementById('dynamicCopyButton').addEventListener('click', function () {
modalContent.select();
navigator.clipboard.writeText(modalContent.value)
.then(() => alert('Content copied to clipboard!'))
.catch(() => alert('Failed to copy content.'));
});
// Show the modal
const modal = new bootstrap.Modal(document.getElementById('dynamicModal'));
modal.show();
}

7
app/static/js/tooltip.js Normal file
View File

@ -0,0 +1,7 @@
// Initialisiert alle Tooltips auf der Seite
document.addEventListener('DOMContentLoaded', function () {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.forEach(function (tooltipTriggerEl) {
new bootstrap.Tooltip(tooltipTriggerEl);
});
});

View File

@ -1,474 +0,0 @@
<html>
</head>
<body>
<div class="container">
<div class="header">
<img src="512x512/logo_face.png" alt="logo"/>
<h1>Kevin Veen-Birkenbach</h1>
<h2>Consulting and Coaching Solutions</h2>
</div>
<div class="row">
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_agile-coach.png" alt="Agile Coach" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Agile Coach</h3>
<p class="card-text">I lead agile transformations and improve team dynamics through Scrum, DevOps, and Agile Coaching. My goal is to enhance collaboration and efficiency in organizations, ensuring agile principles are effectively implemented for sustainable success.</p>
<a href="https://www.agile-coach.world" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.agile-coach.world</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_personal_coach.png" alt="Personal Coach" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Personal Coach</h3>
<p class="card-text">Offering personalized coaching for growth and development, I utilize a blend of hypnotherapy, mediation, and holistic techniques. My approach is tailored to help you achieve personal and professional milestones, fostering holistic well-being.</p>
<a href="https://www.personalcoach.berlin" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.personalcoach.berlin</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_yachtmaster.png" alt="Yachtmaster" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Yachtmaster</h3>
<p class="card-text">As a Yachtmaster, I provide comprehensive sailing education, yacht delivery, and voyage planning services. Whether you're learning to sail or need an experienced skipper, my expertise ensures a safe and enjoyable experience on the water.</p>
<a href="https://www.yachtmaster.world" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.yachtmaster.world</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_polymath.png" alt="Cross Domain Consultant" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Polymath</h3>
<p class="card-text">I support the evaluation and execution of complex cross-domain projects, offering insights across land, sea, sky, and digital realms. My expertise helps clients navigate and succeed in multifaceted environments with strategic precision.</p>
<a href="https://www.crossdomain.consulting/" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.crossdomain.consulting</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_cybermaster.png" alt="Cyber Master" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Cybermaster</h3>
<p class="card-text">Specializing in open-source IT solutions for German SMBs, I focus on automation, security, and reliability. My services are designed to create robust infrastructures that streamline operations and safeguard digital assets.</p>
<a href="https://www.cybermaster.space" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.cybermaster.space</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_prompt_master.png" alt="Prompt Master" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Prompt Engineer</h3>
<p class="card-text">Leveraging AI's power, I specialize in crafting custom prompts and creative content for AI-driven applications. My services are aimed at businesses, creatives, and researchers looking to harness AI technology for innovation, efficiency, and exploring new possibilities.</p>
<a href="https://promptmaster.nexus" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.promptmaster.nexus</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_mediator.png" alt="Mediator" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Mediator</h3>
<p class="card-text">Specializing in resolving interpersonal and business conflicts with empathy and neutrality, I facilitate open communication to achieve lasting agreements and strengthen relationships. My mediation services are designed for individuals, teams, and organizations to foster a harmonious and productive environment.</p>
<a href="https://www.mediator.veen.world" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.mediator.veen.world</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_hypnotherapist.png" alt="Hypnotherapist" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Hypnotherapist</h3>
<p class="card-text">As a certified Hypnotherapist, I offer tailored sessions to address mental and emotional challenges through hypnosis. My approach helps unlock the subconscious to overcome negative beliefs and stress, empowering you to activate self-healing and embrace positive life changes.</p>
<a href="https://www.hypno.veen.world" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> www.hypno.veen.world</a>
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_skydiver.png" alt="Skydiver" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Aerospace Consultant</h3>
<p class="card-text">As an Aerospace Consultant with aviation credentials, including a Sport Pilot License for Parachutes, and a Restricted Radiotelephony and Operator's Certificate I deliver expert consulting services. Currently training for my Private Pilot License, I specialize in guiding clients through aviation regulations, safety standards, and operational efficiency.</p>
<i class="fa-solid fa-hourglass"></i> Website under construction.
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_hunter.png" alt="Hunter" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Wildlife Expert</h3>
<p class="card-text">
As a certified hunter and wildlife coach, I offer educational programs, nature walks, survival trainings, and photo expeditions, merging ecological knowledge with nature respect. My goal is to foster sustainable conservation and enhance appreciation for the natural world through responsible practices.</p>
<i class="fa-solid fa-hourglass"></i> Website under construction.
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_diver.png" alt="Diver" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Master Diver</h3>
<p class="card-text">As a certified master diver with trainings in various specialties, I offer diving instruction, underwater photography, and guided dive tours. My experience ensures safe and enriching underwater adventures, highlighting marine conservation and the wonders of aquatic ecosystems.</p>
<i class="fa-solid fa-hourglass"></i> Website under construction.
</div>
</div>
</div>
<div class="card-column col-lg-3 col-md-6 col-12">
<div class="card h-100 d-flex flex-column">
<div class="card-body d-flex flex-column">
<div class="card-img-top">
<img src="512x512/logo_massage_therapist.png" alt="Massgage Therapist" style="width: 100px; height: auto;">
</div>
<hr />
<h3 class="card-title">Massage Therapist</h3>
<p class="card-text">
Certified in Tantra Massage, I offer unique full-body rituals to awaken senses and harmonize body and mind. My sessions, a blend of ancient Tantra and modern relaxation, focus on energy flow, personal growth, and spiritual awakening.</p>
<i class="fa-solid fa-hourglass"></i> Website under construction.
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-2 col-md-4 col-sm-6 col-12 mt-4">
<h3 class="footer-title">Networks</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a rel="me" href="https://github.com/kevinveenbirkenbach">
<i class="bi bi-github"></i>
GitHub
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://www.instagram.com/kevinveenbirkenbach/">
<i class="fa-brands fa-instagram"></i>
Instagram
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://www.xing.com/profile/Kevin_VeenBirkenbach">
<i class="bi bi-building"></i>
XING
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://www.linkedin.com/in/kevinveenbirkenbach">
<i class="bi bi-linkedin"></i>
LinkedIn
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://www.facebook.com/kevinveenbirkenbach">
<i class="fa-brands fa-facebook"></i> Facebook
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://www.duolingo.com/profile/kevinbirkenbach">
<i class="fa-solid fa-language"></i> Duolingo
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://open.spotify.com/user/31vebfzbjf3p7oualis76qfpr5ty">
<i class="fa-brands fa-spotify"></i> Spotify
</a>
</li>
<ul>
</div>
<div class="col-lg-2 col-md-4 col-sm-6 col-12 mt-4">
<h3 class="footer-title">Fediverse</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a rel="me" href="https://microblog.veen.world/@kevinveenbirkenbach">
<i class="fa-brands fa-mastodon"></i>
Microblog
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://picture.veen.world/kevinveenbirkenbach">
<i class="fa-solid fa-camera"></i>
Pictures
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://video.veen.world/a/kevinveenbirkenbach">
<i class="fa-solid fa-video"></i>
Videos
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://blog.veen.world">
<i class="fa-solid fa-blog"></i>
Blog
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://git.veen.world/kevinveenbirkenbach" class="link">
<i class="fa-solid fa-code"></i>
Code
</a>
</li>
<li class="list-group-item">
<s><a rel="me" href="https://music.veen.world">
<i class="fa-solid fa-music"></i>
Music
</a></s>
</li>
<li class="list-group-item">
<a rel="me" href="https://forum.veen.world/u/kevinveenbirkenbach">
<i class="fa-brands fa-discourse"></i> Forum
</a>
</li>
<ul>
</div>
<div class="col-lg-2 col-md-4 col-sm-6 col-12 mt-4">
<h3 class="footer-title">Engagement</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a rel="me" href="https://newsletter.veen.world/subscription/form" class="link">
<i class="fa-solid fa-envelope-open-text"></i>
Newsletter
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://meet.veen.world/" class="link">
<i class="fa-solid fa-video"></i>
Summits
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://mail.veen.world/">
<i class="fa-solid fa-envelope"></i>
Mail
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://academy.veen.world/">
<i class="fa-solid fa-graduation-cap"></i>
Academy
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://element.veen.world/">
<i class="fa-solid fa-comment"></i> Chat
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/admin/">
<i class="bi bi-link"></i>
Links
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://patreon.com/kevinveenbirkenbach">
<i class="fa-brands fa-patreon"></i> Patreon
</a>
</li>
<ul>
</div>
<div class="col-lg-2 col-md-4 col-sm-6 col-12 mt-4">
<h3 class="footer-title">Workflow</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a rel="me" href="https://project.veen.world/" class="link">
<i class="fa-solid fa-chart-line"></i>
Projects
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://kanban.veen.world/" class="link">
<i class="bi bi-clipboard2-check-fill"></i>
Kanban
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://matomo.veen.world/" class="link">
<i class="fa-solid fa-chart-simple"></i>
Matomo
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://baserow.veen.world/" class="link">
<i class="fa-solid fa-table"></i>
Baserow
</a>
</li>
<li class="list-group-item">
<s><a rel="me" href="https://finance.veen.world/">
<i class="bi bi-currency-exchange"></i>
Controlling
</a></s>
</li>
<li class="list-group-item">
<s><a rel="me" href="https://tickets.veen.world/">
<i class="bi bi-ticket-perforated"></i>
Tickets
</a></s>
</li>
<li class="list-group-item">
<a rel="me" href="https://cloud.veen.world/u/kevinveenbirkenbach" class="link">
<i class="fa-solid fa-cloud"></i>
Cloud
</a>
</li>
<ul>
</div>
<div class="col-lg-2 col-md-4 col-sm-6 col-12 mt-4">
<h3 class="footer-title">Logbooks</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/skydiverlog" class="link">
<i class="fa-solid fa-parachute-box"></i>
Skydiver
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/meilenbuch" class="link">
<i class="fa-solid fa-sailboat"></i>
Skipper
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/diverlog" class="link">
<i class="fa-solid fa-fish"></i>
Diver
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/pilotlog">
<i class="fa-solid fa-plane"></i>
Pilote
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/naturejournal">
<i class="fa-solid fa-tree"></i>
Nature
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/garmin">
<i class="fa-solid fa-person-running"></i>
Garmin
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/eversports">
<i class="fa-solid fa-dumbbell"></i>
Eversports
</a>
</li>
<ul>
</div>
<div class="col-lg-2 col-md-4 col-sm-6 col-12 mt-4">
<h3 class="footer-title">Contact</h3>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a rel="me" href="mailto:kevin@veen.world">
<i class="fa-solid fa-envelope"></i>
Email
</a>
</li>
<li class="list-group-item">
<a alt="@kevinveenbirkenbach:veen.world" title="@kevinveenbirkenbach:veen.world" href="#" onclick="openPopup()">
<i class="bi bi-chat-left-text-fill"></i>
Matrix
</a>
<script>
function openPopup() {
alert("Matrix: @kevinveenbirkenbach:veen.world");
}
</script>
</li>
<li class="list-group-item">
<a rel="me" href="tel:+491781798023">
<i class="fa-solid fa-phone"></i>
Mobile
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://s.veen.world/pgp">
<i class="fa-solid fa-key"></i>
PGP
</a>
</li>
<li class="list-group-item">
<a rel="me" href="tel:+491781798023" class="link">
<i class="fa-brands fa-signal-messenger"></i>
Signal
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://t.me/kevinveenbirkenbach" class="link">
<i class="fa-brands fa-telegram"></i>
Telegram
</a>
</li>
<li class="list-group-item">
<a rel="me" href="https://wa.me/491781798023" class="link">
<i class="fa-brands fa-whatsapp"></i>
Whatsapp
</a>
</li>
<ul>
</div>
</div>
<div class="footer">
<div itemscope itemtype="http://schema.org/LocalBusiness" class="small">
<span itemprop="name">
Kevin Veen-Birkenbach <br />
Beratungs- und Coachingdienstleistungen
</span>
<p>
<i class="fa-solid fa-location-dot"></i>
<span itemprop="address">Afrikanische Straße 43, DE-13351 Berlin, Germany</span>
</p>
<p>
<a rel="me" href="imprint.html">
<i class="fa-solid fa-scale-balanced"></i> Imprint
</a>
</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -20,16 +20,25 @@
<img src="{{company.logo}}" alt="logo"/>
<h1>{{company.titel}}</h1>
<h2>{{company.subtitel}}</h2>
<br />
</header>
{% set menu_type = "header" %}
{% include "moduls/navigation.html.j2"%}
{% block content %}{% endblock %}
<footer class="footer" itemscope itemtype="http://schema.org/LocalBusiness" class="small">
<p itemprop="name">{{ company.titel }} <br />
{{ company.subtitel }}</p>
<span><i class="fa-solid fa-location-dot"></i> {{ company.address.values() | join(", ") }}</span>
<p><a href="/imprint"><i class="fa-solid fa-scale-balanced"></i> Imprint</a></p>
{% set menu_type = "footer" %}
{% include "moduls/navigation.html.j2" %}
<footer class="footer">
<div itemscope itemtype="http://schema.org/LocalBusiness" class="small">
<p itemprop="name">{{ company.titel }} <br />
{{ company.subtitel }}</p>
<span><i class="fa-solid fa-location-dot"></i> {{ company.address.values() | join(", ") }}</span>
<p><a href="{{company.imprint_url}}"><i class="fa-solid fa-scale-balanced"></i> Imprint</a></p>
</div>
</footer>
</div>
<!-- Include modal -->
{% include "moduls/modal.html.j2" %}
<script src="{{ url_for('static', filename='js/dynamic-modal.js') }}"></script>
<script src="{{ url_for('static', filename='js/tooltip.js') }}"></script>
</body>
</html>

View File

@ -7,7 +7,11 @@
<hr />
<h3 class="card-title">{{ card.title }}</h3>
<p class="card-text">{{ card.text }}</p>
<a href="{{ card.link }}" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> {{ card.link_text }}</a>
{% if card.link %}
<a href="{{ card.link }}" class="mt-auto btn btn-light stretched-link" ><i class="fa-solid fa-globe"></i> {{ card.link_text }}</a>
{% else %}
<i class="fa-solid fa-hourglass"></i> {{ card.link_text }}
{% endif %}
</div>
</div>
</div>

View File

@ -0,0 +1,20 @@
<!-- Universal Modal Structure -->
<div class="modal fade" id="dynamicModal" tabindex="-1" aria-labelledby="dynamicModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="dynamicModalLabel"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="input-group">
<input type="text" id="dynamicModalContent" class="form-control" readonly>
<button class="btn btn-outline-secondary" type="button" id="dynamicCopyButton">Copy</button>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,63 @@
<!-- Template for Subitems -->
{% macro render_subitems(subitems) %}
{% for subitem in subitems %}
{% if subitem.subitems %}
<li class="dropdown-submenu">
<a class="dropdown-item" title="{{ subitem.description }}">
<i class="{{ subitem.icon_class }}"></i> {{ subitem.name }}
</a>
<ul class="dropdown-submenu">
{{ render_subitems(subitem.subitems) }}
</ul>
</li>
{% elif subitem.popup %}
<li>
<a class="dropdown-item" onclick='openDynamicPopup({{subitem|tojson|safe}})' data-bs-toggle="tooltip" title="{{ subitem.description }}">
<i class="{{ subitem.icon_class }}"></i> {{ subitem.name }}
</a>
</li>
{% else %}
<li>
<a class="dropdown-item" href="{{ subitem.href }}" target="{{ subitem.target|default('_blank') }}" data-bs-toggle="tooltip" title="{{ subitem.description }}">
<i class="{{ subitem.icon_class }}"></i> {{ subitem.name }}
</a>
</li>
{% endif %}
{% endfor %}
{% endmacro %}
<!-- Navigation Bar -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<!--
<a class="navbar-brand" href="#">Navbar</a>
-->
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav {% if menu_type == 'header' %}ms-auto{% endif %}">
{% for item in navigation[menu_type] %}
{% if item.href %}
<!-- Single Item -->
<li class="nav-item">
<a class="nav-link" href="{{ item.href }}" target="{{ item.target|default('_blank') }}" data-bs-toggle="tooltip" title="{{ item.description }}">
<i class="{{ item.icon_class }}"></i> {{ item.name }}
</a>
</li>
{% else %}
<!-- Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown{{ loop.index }}" role="button" data-bs-toggle="dropdown" data-bs-display="dynamic" data-popper-placement="top" title="{{ item.description }}" aria-expanded="false">
<i class="{{ item.icon_class }}" data-bs-toggle="tooltip"></i> {{ item.name }}
</a>
<ul class="dropdown-menu dropdown-menu-{{menu_type}}" aria-labelledby="navbarDropdown{{ loop.index }}">
{{ render_subitems(item.subitems) }}
</ul>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
</nav>

View File

@ -1,41 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>General Terms and Conditions</title>
<style>
body {font-family: Arial, sans-serif; line-height: 1.6;}
h1, h2 {color: #333;}
.container {width: 80%; margin: 0 auto; padding: 20px;}
</style>
</head>
<body>
<div class="container">
<h1>General Terms and Conditions</h1>
<h2>1. Scope of Services</h2>
<p>Kevin Veen-Birkenbach, operating under the business name "Beratungs- und Coachingdienstleistungen," provides various services including consulting, coaching, educational services, freelance assignments, and project-based work.</p>
<h2>2. Payment Terms</h2>
<ul>
<li>Payment is due upon booking any service.</li>
<li>In case of cancellation more than 30 days before the scheduled service, the client is entitled to a full refund.</li>
<li>If cancellation occurs less than 30 days but more than 14 days before the service, 50% of the total fee will be retained.</li>
<li>For cancellations less than 14 days prior to the service, 100% of the total fee will be retained.</li>
<li>If the service is cancelled by Kevin Veen-Birkenbach for any reason, the client is entitled to a full refund.</li>
</ul>
<h2>3. Contact Information</h2>
<p>Kevin Veen-Birkenbach<br>
Beratungs- und Coachingdienstleistungen<br>
Afrikanische Straße 43, 13351 Berlin, Germany<br>
Phone: +491781798023<br>
Email: <a href="mailto:kevin@veen.world">kevin@veen.world</a></p>
<h2>4. Tax Identification</h2>
<p>VAT ID: 23/569/00564</p>
<h2>5. Amendments and Validity</h2>
<p>These terms and conditions are subject to change. The version valid at the time of booking will apply.</p>
</div>
</body>
</html>

View File

@ -1,40 +0,0 @@
<html>
<header>
<title>Impressum</title>
<meta charset="utf-8" >
</header>
<body>
<h1>Impressum</h1>
<h2>Angaben gem&auml;&szlig; &sect; 5 TMG</h2>
<p>Kevin Veen-Birkenbach<br />
Beratungs- und Coachingdienstleistungen<br />
Afrikanische Stra&szlig;e 43<br />
13351 Berlin</p>
<h2>Kontakt</h2>
<p>Telefon: +491781798023<br />
E-Mail: kevin@veen.world</p>
<h2>Umsatzsteuer-ID</h2>
<p>Umsatzsteuer-Identifikationsnummer gem&auml;&szlig; &sect; 27 a Umsatzsteuergesetz:<br />
23/569/00564</p>
<h2>Angaben zur Berufs&shy;haftpflicht&shy;versicherung</h2>
<p><strong>Name und Sitz des Versicherers:</strong><br />
Markel Insurance SE<br />
Sophienstr. 26<br />
80333 M&uuml;nchen<br />
Registergericht: Amtsgericht M&uuml;nchen<br />
Handelsregisternummer: HRB 233618</p>
<p><strong>Geltungsraum der Versicherung:</strong><br />Weltweit</p>
<h2>Redaktionell verantwortlich</h2>
<p>Kevin Veen-Birkenbach</p>
<h2>Verbraucher&shy;streit&shy;beilegung/Universal&shy;schlichtungs&shy;stelle</h2>
<p>Universalschlichtungsstelle des Bundes<br>
Zentrums für Schlichtung e.V.<br>
Straßburger Straße 8<br>
77694 Kehl am Rhein</p>
</body>

View File

@ -1,23 +1,9 @@
{% extends "base.html" %}
{% extends "moduls/base.html.j2" %}
{% block content %}
<div class="row">
{% for card in cards %}
{% include "card.html.j2" %}
{% include "moduls/card.html.j2" %}
{% endfor %}
</div>
<div class="row">
<div class="col">
<h3>Networks</h3>
<ul>
{% for network in networks %}
<li>
<a href="{{ network.link }}">
<i class="{{ network.icon }}"></i> {{ network.name }}
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endblock %}