Initial commit: TillTheEnd website with Vite + Tailwind CSS

This commit is contained in:
Loto 2026-03-02 17:50:40 +01:00
parent 6abeaf95e7
commit b5a1673ed2
12 changed files with 294 additions and 0 deletions

1
.commitmsg Normal file
View file

@ -0,0 +1 @@
Initial commit: project specification and README

13
Dockerfile Normal file
View file

@ -0,0 +1,13 @@
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Serve stage
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

6
docker-compose.yml Normal file
View file

@ -0,0 +1,6 @@
services:
website:
build: .
ports:
- "8080:80"
restart: unless-stopped

95
index.html Normal file
View file

@ -0,0 +1,95 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TillTheEnd - Delivering results, not promises</title>
<meta name="description" content="IT consulting and freelancing services">
</head>
<body class="bg-white">
<div id="app">
<!-- Header -->
<header class="container mx-auto py-6 flex justify-between items-center">
<div class="text-2xl font-bold">TillTheEnd</div>
<nav class="space-x-6">
<a href="#services" class="text-gray-600 hover:text-orange-500">Services</a>
<a href="#about" class="text-gray-600 hover:text-orange-500">About</a>
<a href="#contact" class="text-gray-600 hover:text-orange-500">Contact</a>
</nav>
</header>
<!-- Hero Section -->
<section class="container mx-auto py-20 text-center">
<h1 class="text-5xl font-bold mb-4">TillTheEnd</h1>
<p class="text-2xl text-gray-600 mb-8">Delivering results, not promises.</p>
<div class="flex justify-center space-x-4 mb-8">
<a href="#contact" class="bg-orange-500 text-white px-6 py-3 rounded hover:bg-orange-600">Contact</a>
<a href="https://github.com/iRave" class="border border-gray-300 px-6 py-3 rounded hover:bg-gray-100">GitHub</a>
</div>
<p class="text-gray-500">Software Development • Infrastructure • Consulting</p>
</section>
<!-- Services Section -->
<section id="services" class="container mx-auto py-20">
<h2 class="text-3xl font-bold text-center mb-12">Services</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="text-center p-6">
<div class="text-4xl mb-4">💻</div>
<h3 class="text-xl font-bold mb-2">Software Development</h3>
<p class="text-gray-600">Custom solutions tailored to your needs</p>
</div>
<div class="text-center p-6">
<div class="text-4xl mb-4">⚙️</div>
<h3 class="text-xl font-bold mb-2">Infrastructure</h3>
<p class="text-gray-600">Reliable systems architecture</p>
</div>
<div class="text-center p-6">
<div class="text-4xl mb-4">💬</div>
<h3 class="text-xl font-bold mb-2">Consulting</h3>
<p class="text-gray-600">Expert guidance from concept to completion</p>
</div>
</div>
</section>
<!-- About Section -->
<section id="about" class="container mx-auto py-20 bg-gray-50 rounded-lg">
<h2 class="text-3xl font-bold text-center mb-8">About</h2>
<div class="text-center max-w-2xl mx-auto">
<p class="text-gray-600">
TillTheEnd is an IT consulting and freelancing service focused on delivering
exceptional results for clients. With expertise in software development,
infrastructure, and strategic consulting, we help businesses achieve their
technology goals.
</p>
</div>
</section>
<!-- Contact Section -->
<section id="contact" class="container mx-auto py-20">
<h2 class="text-3xl font-bold text-center mb-12">Contact</h2>
<div class="max-w-2xl mx-auto">
<div class="space-y-4">
<div class="flex items-center">
<span class="font-semibold w-24">Email:</span>
<a href="mailto:contact@tilltheend.de" class="text-orange-500 hover:underline">contact@tilltheend.de</a>
</div>
<div class="flex items-center">
<span class="font-semibold w-24">GitHub:</span>
<a href="https://github.com/iRave" class="text-purple-500 hover:underline" target="_blank">github.com/iRave</a>
</div>
<div class="flex items-center">
<span class="font-semibold w-24">LinkedIn:</span>
<a href="https://de.linkedin.com/in/tilltheend" class="text-purple-500 hover:underline" target="_blank">de.linkedin.com/in/tilltheend</a>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="container mx-auto py-10 border-t mt-10 text-center text-gray-500">
<p>© 2026 TillTheEnd. All rights reserved.</p>
</footer>
</div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

27
package.json Normal file
View file

@ -0,0 +1,27 @@
{
"name": "tilltheend-website",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.2.1",
"autoprefixer": "^10.4.27",
"postcss": "^8.5.6",
"tailwindcss": "^4.2.1",
"vite": "^7.3.1"
},
"description": "Personal website for IT consulting and freelancing.",
"main": "index.js",
"repository": {
"type": "git",
"url": "gitea@192.168.178.123:Loto/tilltheend-website.git"
},
"keywords": [],
"author": "",
"license": "ISC"
}

6
postcss.config.js Normal file
View file

@ -0,0 +1,6 @@
export default {
plugins: {
'@tailwindcss/postcss': {},
autoprefixer: {},
}
}

9
src/counter.js Normal file
View file

@ -0,0 +1,9 @@
export function setupCounter(element) {
let counter = 0
const setCounter = (count) => {
counter = count
element.innerHTML = `count is ${counter}`
}
element.addEventListener('click', () => setCounter(counter + 1))
setCounter(0)
}

1
src/javascript.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="32" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path fill="#F7DF1E" d="M0 0h256v256H0V0Z"></path><path d="m67.312 213.932l19.59-11.856c3.78 6.701 7.218 12.371 15.465 12.371c7.905 0 12.89-3.092 12.89-15.12v-81.798h24.057v82.138c0 24.917-14.606 36.259-35.916 36.259c-19.245 0-30.416-9.967-36.087-21.996m85.07-2.576l19.588-11.341c5.157 8.421 11.859 14.607 23.715 14.607c9.969 0 16.325-4.984 16.325-11.858c0-8.248-6.53-11.17-17.528-15.98l-6.013-2.58c-17.357-7.387-28.87-16.667-28.87-36.257c0-18.044 13.747-31.792 35.228-31.792c15.294 0 26.292 5.328 34.196 19.247l-18.732 12.03c-4.125-7.389-8.591-10.31-15.465-10.31c-7.046 0-11.514 4.468-11.514 10.31c0 7.217 4.468 10.14 14.778 14.608l6.014 2.577c20.45 8.765 31.963 17.7 31.963 37.804c0 21.654-17.012 33.51-39.867 33.51c-22.339 0-36.774-10.654-43.819-24.574"></path></svg>

After

Width:  |  Height:  |  Size: 995 B

20
src/main.css Normal file
View file

@ -0,0 +1,20 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background-color: #fafafa;
color: #111;
}
body {
margin: 0;
padding: 0;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}

4
src/main.js Normal file
View file

@ -0,0 +1,4 @@
import './main.css'
// TillTheEnd website initialization
console.log('TillTheEnd website loaded')

96
src/style.css Normal file
View file

@ -0,0 +1,96 @@
:root {
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vanilla:hover {
filter: drop-shadow(0 0 2em #f7df1eaa);
}
.card {
padding: 2em;
}
.read-the-docs {
color: #888;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

16
tailwind.config.js Normal file
View file

@ -0,0 +1,16 @@
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {
colors: {
orange: '#f97316',
purple: '#a855f7',
}
},
},
plugins: [],
}