Initial commit: TimeClock v3 - Node.js/Vue.js Zeiterfassung

Features:
- Backend: Node.js/Express mit MySQL/MariaDB
- Frontend: Vue.js 3 mit Composition API
- UTC-Zeithandling für korrekte Zeiterfassung
- Timewish-basierte Überstundenberechnung
- Wochenübersicht mit Urlaubs-/Krankheits-/Feiertagshandling
- Bereinigtes Arbeitsende (Generell/Woche)
- Überstunden-Offset für historische Daten
- Fixed Layout mit scrollbarem Content
- Kompakte UI mit grünem Theme
This commit is contained in:
Torsten Schulz (local)
2025-10-17 14:11:28 +02:00
commit e95bb4cb76
86 changed files with 19530 additions and 0 deletions

View File

@@ -0,0 +1,158 @@
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
background-color: #ffffff;
color: #000000;
}
#app {
min-height: 100vh;
display: flex;
flex-direction: column;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
}
button {
cursor: pointer;
font-family: inherit;
}
.container {
max-width: 100%;
margin: 0 auto;
padding: 0 3rem;
}
/* Utility Classes */
.card {
background: #fafafa;
border: 1px solid #e0e0e0;
padding: 1.5rem;
margin-bottom: 1.5rem;
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
transition: box-shadow 0.2s, border-color 0.2s;
}
.card:hover {
border-color: #ccc;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08);
}
.btn {
padding: 0.5rem 1rem;
border: 1px solid #ccc;
border-radius: 4px;
font-weight: normal;
font-size: 0.95rem;
cursor: pointer;
background-color: #f5f5f5;
color: #333;
transition: background-color 0.2s;
}
.btn:hover {
background-color: #e5e5e5;
}
.btn-primary {
background-color: #5bc0de;
border-color: #46b8da;
color: white;
}
.btn-primary:hover {
background-color: #31b0d5;
border-color: #269abc;
}
.btn-success {
background-color: #5cb85c;
border-color: #4cae4c;
color: white;
}
.btn-success:hover {
background-color: #449d44;
border-color: #398439;
}
.btn-danger {
background-color: #d9534f;
border-color: #d43f3a;
color: white;
}
.btn-danger:hover {
background-color: #c9302c;
border-color: #ac2925;
}
.btn-secondary {
background-color: #6c757d;
border-color: #6c757d;
color: white;
}
.btn-secondary:hover {
background-color: #5a6268;
}
.input {
width: 100%;
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
transition: border-color 0.2s, box-shadow 0.2s;
}
.input:focus {
outline: none;
border-color: #5bc0de;
box-shadow: 0 0 0 3px rgba(91, 192, 222, 0.1);
}
.form-group {
margin-bottom: 1.25rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: #333;
}
.grid {
display: grid;
gap: 1.5rem;
}
.grid-2 {
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
.text-center {
text-align: center;
}
.mt-1 { margin-top: 0.5rem; }
.mt-2 { margin-top: 1rem; }
.mt-3 { margin-top: 1.5rem; }
.mt-4 { margin-top: 2rem; }
.mb-1 { margin-bottom: 0.5rem; }
.mb-2 { margin-bottom: 1rem; }
.mb-3 { margin-bottom: 1.5rem; }
.mb-4 { margin-bottom: 2rem; }