Keine Buchung gefunden. Bitte Grund der Abwesenheit eingeben!
- ")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -266,7 +266,7 @@ func dayComponent(workDay models.WorkDay) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
")
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -299,7 +299,7 @@ func changeButtonComponent(id string) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var22 string
- templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04"))
+ var templ_7745c5c3_Var23 string
+ templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04"))
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 143, Col: 97}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 150, Col: 97}
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -491,12 +520,12 @@ func bookingComponent(booking models.Booking) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var23 string
- templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs("booking_" + strconv.Itoa(booking.CounterId))
+ var templ_7745c5c3_Var24 string
+ templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs("booking_" + strconv.Itoa(booking.CounterId))
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 144, Col: 70}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 151, Col: 70}
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -504,12 +533,12 @@ func bookingComponent(booking models.Booking) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var24 string
- templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04"))
+ var templ_7745c5c3_Var25 string
+ templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04"))
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 144, Col: 126}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 151, Col: 126}
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24))
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -517,12 +546,12 @@ func bookingComponent(booking models.Booking) templ.Component {
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var25 string
- templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(booking.GetBookingType())
+ var templ_7745c5c3_Var26 string
+ templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(booking.GetBookingType())
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 145, Col: 29}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 152, Col: 29}
}
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -550,9 +579,9 @@ func LegendComponent() templ.Component {
}()
}
ctx = templ.InitializeContext(ctx)
- templ_7745c5c3_Var26 := templ.GetChildren(ctx)
- if templ_7745c5c3_Var26 == nil {
- templ_7745c5c3_Var26 = templ.NopComponent
+ templ_7745c5c3_Var27 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var27 == nil {
+ templ_7745c5c3_Var27 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 37, "Arbeitszeit unter regulär ")
From 0c33ae22bf01d26ed0d50d68f866b152662becbb Mon Sep 17 00:00:00 2001
From: tom
Date: Wed, 2 Apr 2025 10:44:23 +0200
Subject: [PATCH 04/21] added abwesenheiten table
---
DB/initdb/01_create_tables.sql | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/DB/initdb/01_create_tables.sql b/DB/initdb/01_create_tables.sql
index 839b396..60a91e6 100644
--- a/DB/initdb/01_create_tables.sql
+++ b/DB/initdb/01_create_tables.sql
@@ -70,6 +70,14 @@ CREATE TABLE "wochen_report" (
UNIQUE ("personal_nummer", "woche_start")
);
+DROP TABLE IF EXISTS "abwesenheiten";
+CREATE TABLE "abwesenheiten" (
+ "counter_id" bigserial PRIMARY KEY,
+ "card_uid" varchar(255),
+ "abwesenheit_typ" int2,
+ "datum" timestamptz(6) DEFAULT NOW()::DATE,
+ );
+
-- Adds crypto extension
CREATE EXTENSION IF NOT EXISTS pgcrypto;
From e60f19ee27f78aaef7ea1e04f3111b1fe682bad1 Mon Sep 17 00:00:00 2001
From: tom
Date: Wed, 2 Apr 2025 10:44:55 +0200
Subject: [PATCH 05/21] seperated create abwesenheit button + added first part
of frontend logic
---
Backend/models/workDay.go | 10 +-
Backend/src/main.css | 100 +++++------
Backend/static/css/styles.css | 125 ++------------
Backend/templates/timeComponents.templ | 38 +++--
Backend/templates/timeComponents_templ.go | 194 +++++++++++++++-------
5 files changed, 226 insertions(+), 241 deletions(-)
diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go
index 78094e8..f1dc6d0 100644
--- a/Backend/models/workDay.go
+++ b/Backend/models/workDay.go
@@ -101,12 +101,7 @@ func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay
workDay.calcPauseTime()
}
- //TODO: remove
- if len(workDay.Bookings) == 1 && workDay.Bookings[0].CounterId == 0 {
- log.Println("No booking")
- } else {
- workDays = append(workDays, workDay)
- }
+ workDays = append(workDays, workDay)
}
if err = rows.Err(); err != nil {
return workDays
@@ -130,6 +125,9 @@ func (d *WorkDay) calcPauseTime() {
// Gets the duration someone worked that day
func (d *WorkDay) getWorkTime() {
+ if len(d.Bookings) <= 1 && d.Bookings[0].CounterId == 0 {
+ return
+ }
var workTime, pauseTime time.Duration
var lastBooking Booking
for _, booking := range d.Bookings {
diff --git a/Backend/src/main.css b/Backend/src/main.css
index 2330065..4b3439b 100644
--- a/Backend/src/main.css
+++ b/Backend/src/main.css
@@ -2,62 +2,62 @@
@source "../templates/*.templ";
@theme {
- --color-accent-50: #e7fdea;
- --color-accent-100: #cbfbd1;
- --color-accent-200: #9cf7a8;
- --color-accent-300: #68f37a;
- --color-accent-400: #33ef4d;
- --color-accent-500: #11db2d;
- --color-accent-600: #0eaf23;
- --color-accent-700: #0a851b;
- --color-accent-800: #075a12;
- --color-accent-900: #032b09;
- --color-accent-950: #021805;
- --color-accent: #0eaf23;
- --color-text-50: #f7f8f7;
- --color-text-100: #f2f3f2;
- --color-text-200: #e2e4e2;
- --color-text-300: #d2d6d2;
- --color-text-400: #c2c7c2;
- --color-text-500: #afb6af;
- --color-text-600: #97a097;
- --color-text-700: #7d877d;
- --color-text-800: #5a625a;
- --color-text-900: #161816;
- --color-text-950: #000000;
+ --color-accent-50: #e7fdea;
+ --color-accent-100: #cbfbd1;
+ --color-accent-200: #9cf7a8;
+ --color-accent-300: #68f37a;
+ --color-accent-400: #33ef4d;
+ --color-accent-500: #11db2d;
+ --color-accent-600: #0eaf23;
+ --color-accent-700: #0a851b;
+ --color-accent-800: #075a12;
+ --color-accent-900: #032b09;
+ --color-accent-950: #021805;
+ --color-accent: #0eaf23;
+ --color-text-50: #f7f8f7;
+ --color-text-100: #f2f3f2;
+ --color-text-200: #e2e4e2;
+ --color-text-300: #d2d6d2;
+ --color-text-400: #c2c7c2;
+ --color-text-500: #afb6af;
+ --color-text-600: #97a097;
+ --color-text-700: #7d877d;
+ --color-text-800: #5a625a;
+ --color-text-900: #161816;
+ --color-text-950: #000000;
}
@layer components {
+ .grid-main {
+ display: grid;
+ grid-template-columns: 2fr auto 1fr;
+ align-items: stretch;
+ }
+
+ .grid-sub {
+ display: grid;
+ grid-template-columns: subgrid;
+ grid-column: 1 / -1;
+ border-color: var(--color-neutral-400);
+ transition: background-color 0.2s ease-in-out;
+ }
+
+ .grid-sub:hover {
+ background-color: var(--color-neutral-200);
+ }
+
+ .grid-cell {
+ padding: calc(var(--spacing) * 2);
+ border-color: var(--color-neutral-400);
+ }
+
+ @media (width >=48rem) {
.grid-main {
- display: grid;
- grid-template-columns: repeat(6, 1fr);
- align-items: stretch;
+ grid-template-columns: repeat(5, 1fr);
+ margin: 0 10%;
}
.grid-sub {
- display: grid;
- grid-template-columns: subgrid;
- grid-column: 1 / -1;
- border-color: var(--color-neutral-400);
- transition: background-color 0.2s ease-in-out;
- }
-
- .grid-sub:hover {
- background-color: var(--color-neutral-200);
- }
-
- .grid-cell {
- padding: calc(var(--spacing) * 2);
- border-color: var(--color-neutral-400);
- }
-
- @media (width >=48rem) {
- .grid-main {
- grid-template-columns: repeat(5, 1fr);
- margin: 0 10%;
- }
-
- .grid-sub {
- }
}
+ }
}
diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css
index 1476a73..481b265 100644
--- a/Backend/static/css/styles.css
+++ b/Backend/static/css/styles.css
@@ -541,12 +541,6 @@
}
}
@layer utilities {
- .collapse {
- visibility: collapse;
- }
- .relative {
- position: relative;
- }
.static {
position: static;
}
@@ -565,27 +559,15 @@
.mb-2 {
margin-bottom: calc(var(--spacing) * 2);
}
- .block {
- display: block;
- }
.flex {
display: flex;
}
- .grid {
- display: grid;
- }
.hidden {
display: none;
}
.inline {
display: inline;
}
- .inline-flex {
- display: inline-flex;
- }
- .list-item {
- display: list-item;
- }
.table {
display: table;
}
@@ -612,9 +594,6 @@
.w-4 {
width: calc(var(--spacing) * 4);
}
- .w-9 {
- width: calc(var(--spacing) * 9);
- }
.w-9\/10 {
width: calc(9/10 * 100%);
}
@@ -633,18 +612,9 @@
.grow-1 {
flex-grow: 1;
}
- .border-collapse {
- border-collapse: collapse;
- }
- .transform {
- transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y);
- }
.cursor-pointer {
cursor: pointer;
}
- .resize {
- resize: both;
- }
.grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
@@ -789,20 +759,9 @@
.uppercase {
text-transform: uppercase;
}
- .underline {
- text-decoration-line: underline;
- }
- .outline {
- outline-style: var(--tw-outline-style);
- outline-width: 1px;
- }
.filter {
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
}
- .backdrop-filter {
- -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
- backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
- }
.transition {
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -817,9 +776,10 @@
--tw-duration: 300ms;
transition-duration: 300ms;
}
- .ease-in-out {
- --tw-ease: var(--ease-in-out);
- transition-timing-function: var(--ease-in-out);
+ .group-\[\.edit\]\:block {
+ &:is(:where(.group):is(.edit) *) {
+ display: block;
+ }
}
.group-\[\.edit\]\:hidden {
&:is(:where(.group):is(.edit) *) {
@@ -959,6 +919,11 @@
width: calc(1/2 * 100%);
}
}
+ .md\:flex-row-reverse {
+ @media (width >= 48rem) {
+ flex-direction: row-reverse;
+ }
+ }
.md\:px-4 {
@media (width >= 48rem) {
padding-inline: calc(var(--spacing) * 4);
@@ -980,7 +945,7 @@
@layer components {
.grid-main {
display: grid;
- grid-template-columns: repeat(6, 1fr);
+ grid-template-columns: 2fr auto 1fr;
align-items: stretch;
}
.grid-sub {
@@ -1030,31 +995,6 @@
animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
}
}
-@property --tw-rotate-x {
- syntax: "*";
- inherits: false;
- initial-value: rotateX(0);
-}
-@property --tw-rotate-y {
- syntax: "*";
- inherits: false;
- initial-value: rotateY(0);
-}
-@property --tw-rotate-z {
- syntax: "*";
- inherits: false;
- initial-value: rotateZ(0);
-}
-@property --tw-skew-x {
- syntax: "*";
- inherits: false;
- initial-value: skewX(0);
-}
-@property --tw-skew-y {
- syntax: "*";
- inherits: false;
- initial-value: skewY(0);
-}
@property --tw-divide-x-reverse {
syntax: "*";
inherits: false;
@@ -1074,11 +1014,6 @@
syntax: "*";
inherits: false;
}
-@property --tw-outline-style {
- syntax: "*";
- inherits: false;
- initial-value: solid;
-}
@property --tw-blur {
syntax: "*";
inherits: false;
@@ -1115,47 +1050,7 @@
syntax: "*";
inherits: false;
}
-@property --tw-backdrop-blur {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-brightness {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-contrast {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-grayscale {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-hue-rotate {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-invert {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-opacity {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-saturate {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-sepia {
- syntax: "*";
- inherits: false;
-}
@property --tw-duration {
syntax: "*";
inherits: false;
}
-@property --tw-ease {
- syntax: "*";
- inherits: false;
-}
diff --git a/Backend/templates/timeComponents.templ b/Backend/templates/timeComponents.templ
index 518ead4..e760250 100644
--- a/Backend/templates/timeComponents.templ
+++ b/Backend/templates/timeComponents.templ
@@ -14,14 +14,14 @@ templ inputForm() {
user := ctx.Value("user").(models.User)
}}
-
+
{ user.Vorname + " " + user.Name }
-
}
+
+templ TeamPresencePage(teamPresence map[bool][]models.User) {
+ @Base()
+ @headerComponent()
+
+
+
Anwesend
+
+ for _, user := range teamPresence[true] {
+
+ @userPresenceComponent(user, true)
+ }
+
+
+
+
Nicht Anwesend
+
+ for _, user := range teamPresence[false] {
+ @userPresenceComponent(user, false)
+ }
+
+
+
+}
diff --git a/Backend/templates/pages_templ.go b/Backend/templates/pages_templ.go
index c16ffac..d93ac8d 100644
--- a/Backend/templates/pages_templ.go
+++ b/Backend/templates/pages_templ.go
@@ -344,4 +344,61 @@ func NavPage() templ.Component {
})
}
+func TeamPresencePage(teamPresence map[bool][]models.User) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var11 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var11 == nil {
+ templ_7745c5c3_Var11 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Err = Base().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = headerComponent().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
Anwesend
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ for _, user := range teamPresence[true] {
+ templ_7745c5c3_Err = userPresenceComponent(user, true).Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "
Nicht Anwesend
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ for _, user := range teamPresence[false] {
+ templ_7745c5c3_Err = userPresenceComponent(user, false).Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return nil
+ })
+}
+
var _ = templruntime.GeneratedTemplate
diff --git a/Backend/templates/teamComponents.templ b/Backend/templates/teamComponents.templ
index ab917cb..9cebb77 100644
--- a/Backend/templates/teamComponents.templ
+++ b/Backend/templates/teamComponents.templ
@@ -56,3 +56,14 @@ templ employeComponent(week models.WorkWeek) {
}
+
+templ userPresenceComponent(user models.User, present bool){
+
+ if present {
+
Anwesend
+ } else {
+
Abwesend
+ }
+
{user.Vorname} {user.Name}
+
+}
diff --git a/Backend/templates/teamComponents_templ.go b/Backend/templates/teamComponents_templ.go
index c096fc6..2a56f46 100644
--- a/Backend/templates/teamComponents_templ.go
+++ b/Backend/templates/teamComponents_templ.go
@@ -250,4 +250,74 @@ func employeComponent(week models.WorkWeek) templ.Component {
})
}
+func userPresenceComponent(user models.User, present bool) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var15 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var15 == nil {
+ templ_7745c5c3_Var15 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ if present {
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
Anwesend
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ } else {
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
Abwesend
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var16 string
+ templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(user.Vorname)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 67, Col: 17}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, " ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var17 string
+ templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(user.Name)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 67, Col: 29}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return nil
+ })
+}
+
var _ = templruntime.GeneratedTemplate
From b7171d77c71b705e7209e0d6dc42b12af6b6d427 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=20Tr=C3=B6ger?=
Date: Thu, 10 Apr 2025 09:22:28 +0200
Subject: [PATCH 09/21] updated styles
---
Backend/static/css/styles.css | 705 +++++++++++++++++++++++++++++++++-
1 file changed, 704 insertions(+), 1 deletion(-)
diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css
index 23fdbbe..f77f9ee 100644
--- a/Backend/static/css/styles.css
+++ b/Backend/static/css/styles.css
@@ -1,2 +1,705 @@
/*! tailwindcss v4.0.8 | MIT License | https://tailwindcss.com */
-@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:oklch(.808 .114 19.571);--color-red-500:oklch(.637 .237 25.331);--color-red-600:oklch(.577 .245 27.325);--color-orange-500:oklch(.705 .213 47.604);--color-green-300:oklch(.871 .15 154.449);--color-purple-600:oklch(.558 .288 302.321);--color-neutral-100:oklch(.97 0 0);--color-neutral-200:oklch(.922 0 0);--color-neutral-300:oklch(.87 0 0);--color-neutral-400:oklch(.708 0 0);--color-neutral-500:oklch(.556 0 0);--color-neutral-700:oklch(.371 0 0);--color-neutral-800:oklch(.269 0 0);--color-neutral-900:oklch(.205 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--font-weight-bold:700;--radius-md:.375rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-font-feature-settings:var(--font-sans--font-feature-settings);--default-font-variation-settings:var(--font-sans--font-variation-settings);--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:var(--font-mono--font-feature-settings);--default-mono-font-variation-settings:var(--font-mono--font-variation-settings);--color-accent:#0eaf23}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}body{line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1;color:color-mix(in oklab,currentColor 50%,transparent)}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.grid-main{grid-template-columns:2fr auto 1fr;align-items:stretch;display:grid}.grid-sub{grid-template-columns:subgrid;border-color:var(--color-neutral-400);grid-column:1/-1;transition:background-color .2s ease-in-out;display:grid}.grid-sub:hover{background-color:var(--color-neutral-200)}.grid-cell{padding:calc(var(--spacing)*2);border-color:var(--color-neutral-400)}@media (width>=48rem){.grid-main{grid-template-columns:repeat(5,1fr);margin:0 10%}}}@layer utilities{.static{position:static}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-50{grid-row:span 50/span 50}.row-span-full{grid-row:1/-1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.m-2{margin:calc(var(--spacing)*2)}.-my-1{margin-block:calc(var(--spacing)*-1)}.mt-1{margin-top:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.flex{display:flex}.hidden{display:none}.inline{display:inline}.table{display:table}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.h-4{height:calc(var(--spacing)*4)}.h-8{height:calc(var(--spacing)*8)}.h-\[100vh\]{height:100vh}.h-full{height:100%}.w-2{width:calc(var(--spacing)*2)}.w-4{width:calc(var(--spacing)*4)}.w-9{width:calc(var(--spacing)*9)}.w-9\/10{width:90%}.w-20{width:calc(var(--spacing)*20)}.w-\[2px\]{width:2px}.w-full{width:100%}.flex-grow,.grow,.grow-1{flex-grow:1}.transform{transform:var(--tw-rotate-x)var(--tw-rotate-y)var(--tw-rotate-z)var(--tw-skew-x)var(--tw-skew-y)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.content-end{align-content:flex-end}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}:where(.divide-x-1>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y-1>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}.self-center{align-self:center}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-900{border-color:var(--color-neutral-900)}.bg-accent{background-color:var(--color-accent)}.bg-green-300{background-color:var(--color-green-300)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-300{background-color:var(--color-red-300)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-2{padding-block:calc(var(--spacing)*2)}.text-center{text-align:center}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-accent{color:var(--color-accent)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-red-600{color:var(--color-red-600)}.text-transparent{color:#0000}.uppercase{text-transform:uppercase}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}@media (hover:hover){.group-hover\:text-black:is(:where(.group):hover *){color:var(--color-black)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}}.group-\[\.edit\]\:block:is(:where(.group).edit *){display:block}.group-\[\.edit\]\:hidden:is(:where(.group).edit *){display:none}.group-\[\.edit\]\:inline:is(:where(.group).edit *){display:inline}.placeholder\:text-neutral-400::placeholder{color:var(--color-neutral-400)}@media (hover:hover){.hover\:border-neutral-300:hover{border-color:var(--color-neutral-300)}.hover\:border-neutral-500:hover{border-color:var(--color-neutral-500)}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.focus\:bg-neutral-700:focus{background-color:var(--color-neutral-700)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:bg-neutral-700:active{background-color:var(--color-neutral-700)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}@media (width<48rem){.max-md\:flex{display:flex}.max-md\:grid{display:grid}.max-md\:flex-col{flex-direction:column}}@media (width>=48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:mx-\[10\%\]{margin-inline:10%}.md\:block{display:block}.md\:hidden{display:none}.md\:inline{display:inline}.md\:w-1\/2{width:50%}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:text-transparent{color:#0000}.group-\[\.edit\]\:md\:block:is(:where(.group).edit *){display:block}}@media print{.print\:hidden{display:none}}}@property --tw-rotate-x{syntax:"*";inherits:false;initial-value:rotateX(0)}@property --tw-rotate-y{syntax:"*";inherits:false;initial-value:rotateY(0)}@property --tw-rotate-z{syntax:"*";inherits:false;initial-value:rotateZ(0)}@property --tw-skew-x{syntax:"*";inherits:false;initial-value:skewX(0)}@property --tw-skew-y{syntax:"*";inherits:false;initial-value:skewY(0)}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
\ No newline at end of file
+@layer theme, base, components, utilities;
+@layer theme {
+ :root, :host {
+ --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
+ "Courier New", monospace;
+ --color-red-600: oklch(0.577 0.245 27.325);
+ --color-orange-500: oklch(0.705 0.213 47.604);
+ --color-purple-600: oklch(0.558 0.288 302.321);
+ --color-neutral-100: oklch(0.97 0 0);
+ --color-neutral-200: oklch(0.922 0 0);
+ --color-neutral-300: oklch(0.87 0 0);
+ --color-neutral-400: oklch(0.708 0 0);
+ --color-neutral-500: oklch(0.556 0 0);
+ --color-neutral-700: oklch(0.371 0 0);
+ --color-neutral-800: oklch(0.269 0 0);
+ --color-neutral-900: oklch(0.205 0 0);
+ --color-black: #000;
+ --color-white: #fff;
+ --spacing: 0.25rem;
+ --text-xs: 0.75rem;
+ --text-xs--line-height: calc(1 / 0.75);
+ --text-sm: 0.875rem;
+ --text-sm--line-height: calc(1.25 / 0.875);
+ --text-xl: 1.25rem;
+ --text-xl--line-height: calc(1.75 / 1.25);
+ --font-weight-bold: 700;
+ --radius-md: 0.375rem;
+ --default-transition-duration: 150ms;
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ --default-font-family: var(--font-sans);
+ --default-font-feature-settings: var(--font-sans--font-feature-settings);
+ --default-font-variation-settings: var(
+ --font-sans--font-variation-settings
+ );
+ --default-mono-font-family: var(--font-mono);
+ --default-mono-font-feature-settings: var(
+ --font-mono--font-feature-settings
+ );
+ --default-mono-font-variation-settings: var(
+ --font-mono--font-variation-settings
+ );
+ --color-accent: #0eaf23;
+ }
+}
+@layer base {
+ *, ::after, ::before, ::backdrop, ::file-selector-button {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ border: 0 solid;
+ }
+ html, :host {
+ line-height: 1.5;
+ -webkit-text-size-adjust: 100%;
+ tab-size: 4;
+ font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" );
+ font-feature-settings: var(--default-font-feature-settings, normal);
+ font-variation-settings: var( --default-font-variation-settings, normal );
+ -webkit-tap-highlight-color: transparent;
+ }
+ body {
+ line-height: inherit;
+ }
+ hr {
+ height: 0;
+ color: inherit;
+ border-top-width: 1px;
+ }
+ abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ }
+ h1, h2, h3, h4, h5, h6 {
+ font-size: inherit;
+ font-weight: inherit;
+ }
+ a {
+ color: inherit;
+ -webkit-text-decoration: inherit;
+ text-decoration: inherit;
+ }
+ b, strong {
+ font-weight: bolder;
+ }
+ code, kbd, samp, pre {
+ font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace );
+ font-feature-settings: var( --default-mono-font-feature-settings, normal );
+ font-variation-settings: var( --default-mono-font-variation-settings, normal );
+ font-size: 1em;
+ }
+ small {
+ font-size: 80%;
+ }
+ sub, sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+ sub {
+ bottom: -0.25em;
+ }
+ sup {
+ top: -0.5em;
+ }
+ table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+ }
+ :-moz-focusring {
+ outline: auto;
+ }
+ progress {
+ vertical-align: baseline;
+ }
+ summary {
+ display: list-item;
+ }
+ ol, ul, menu {
+ list-style: none;
+ }
+ img, svg, video, canvas, audio, iframe, embed, object {
+ display: block;
+ vertical-align: middle;
+ }
+ img, video {
+ max-width: 100%;
+ height: auto;
+ }
+ button, input, select, optgroup, textarea, ::file-selector-button {
+ font: inherit;
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ border-radius: 0;
+ background-color: transparent;
+ opacity: 1;
+ }
+ :where(select:is([multiple], [size])) optgroup {
+ font-weight: bolder;
+ }
+ :where(select:is([multiple], [size])) optgroup option {
+ padding-inline-start: 20px;
+ }
+ ::file-selector-button {
+ margin-inline-end: 4px;
+ }
+ ::placeholder {
+ opacity: 1;
+ color: color-mix(in oklab, currentColor 50%, transparent);
+ }
+ textarea {
+ resize: vertical;
+ }
+ ::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+ ::-webkit-date-and-time-value {
+ min-height: 1lh;
+ text-align: inherit;
+ }
+ ::-webkit-datetime-edit {
+ display: inline-flex;
+ }
+ ::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+ }
+ ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
+ padding-block: 0;
+ }
+ :-moz-ui-invalid {
+ box-shadow: none;
+ }
+ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
+ appearance: button;
+ }
+ ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
+ height: auto;
+ }
+ [hidden]:where(:not([hidden="until-found"])) {
+ display: none !important;
+ }
+}
+@layer utilities {
+ .static {
+ position: static;
+ }
+ .col-span-2 {
+ grid-column: span 2 / span 2;
+ }
+ .col-span-3 {
+ grid-column: span 3 / span 3;
+ }
+ .-my-1 {
+ margin-block: calc(var(--spacing) * -1);
+ }
+ .mt-1 {
+ margin-top: calc(var(--spacing) * 1);
+ }
+ .mb-2 {
+ margin-bottom: calc(var(--spacing) * 2);
+ }
+ .flex {
+ display: flex;
+ }
+ .hidden {
+ display: none;
+ }
+ .inline {
+ display: inline;
+ }
+ .table {
+ display: table;
+ }
+ .size-2 {
+ width: calc(var(--spacing) * 2);
+ height: calc(var(--spacing) * 2);
+ }
+ .size-4 {
+ width: calc(var(--spacing) * 4);
+ height: calc(var(--spacing) * 4);
+ }
+ .h-4 {
+ height: calc(var(--spacing) * 4);
+ }
+ .h-8 {
+ height: calc(var(--spacing) * 8);
+ }
+ .h-\[100vh\] {
+ height: 100vh;
+ }
+ .h-full {
+ height: 100%;
+ }
+ .w-2 {
+ width: calc(var(--spacing) * 2);
+ }
+ .w-4 {
+ width: calc(var(--spacing) * 4);
+ }
+ .w-9\/10 {
+ width: calc(9/10 * 100%);
+ }
+ .w-\[2px\] {
+ width: 2px;
+ }
+ .w-full {
+ width: 100%;
+ }
+ .flex-grow {
+ flex-grow: 1;
+ }
+ .grow {
+ flex-grow: 1;
+ }
+ .grow-1 {
+ flex-grow: 1;
+ }
+ .cursor-pointer {
+ cursor: pointer;
+ }
+ .grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ .flex-col {
+ flex-direction: column;
+ }
+ .flex-row {
+ flex-direction: row;
+ }
+ .content-end {
+ align-content: flex-end;
+ }
+ .items-center {
+ align-items: center;
+ }
+ .justify-between {
+ justify-content: space-between;
+ }
+ .justify-center {
+ justify-content: center;
+ }
+ .gap-2 {
+ gap: calc(var(--spacing) * 2);
+ }
+ .gap-4 {
+ gap: calc(var(--spacing) * 4);
+ }
+ .divide-x-1 {
+ :where(& > :not(:last-child)) {
+ --tw-divide-x-reverse: 0;
+ border-inline-style: var(--tw-border-style);
+ border-inline-start-width: calc(1px * var(--tw-divide-x-reverse));
+ border-inline-end-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
+ }
+ }
+ .divide-y-1 {
+ :where(& > :not(:last-child)) {
+ --tw-divide-y-reverse: 0;
+ border-bottom-style: var(--tw-border-style);
+ border-top-style: var(--tw-border-style);
+ border-top-width: calc(1px * var(--tw-divide-y-reverse));
+ border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
+ }
+ }
+ .justify-self-end {
+ justify-self: flex-end;
+ }
+ .truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .overflow-hidden {
+ overflow: hidden;
+ }
+ .rounded-full {
+ border-radius: calc(infinity * 1px);
+ }
+ .rounded-md {
+ border-radius: var(--radius-md);
+ }
+ .border {
+ border-style: var(--tw-border-style);
+ border-width: 1px;
+ }
+ .border-neutral-200 {
+ border-color: var(--color-neutral-200);
+ }
+ .border-neutral-300 {
+ border-color: var(--color-neutral-300);
+ }
+ .border-neutral-800 {
+ border-color: var(--color-neutral-800);
+ }
+ .border-neutral-900 {
+ border-color: var(--color-neutral-900);
+ }
+ .bg-accent {
+ background-color: var(--color-accent);
+ }
+ .bg-neutral-100 {
+ background-color: var(--color-neutral-100);
+ }
+ .bg-neutral-300 {
+ background-color: var(--color-neutral-300);
+ }
+ .bg-neutral-400 {
+ background-color: var(--color-neutral-400);
+ }
+ .bg-orange-500 {
+ background-color: var(--color-orange-500);
+ }
+ .bg-purple-600 {
+ background-color: var(--color-purple-600);
+ }
+ .bg-red-600 {
+ background-color: var(--color-red-600);
+ }
+ .p-1 {
+ padding: calc(var(--spacing) * 1);
+ }
+ .p-2 {
+ padding: calc(var(--spacing) * 2);
+ }
+ .px-3 {
+ padding-inline: calc(var(--spacing) * 3);
+ }
+ .py-2 {
+ padding-block: calc(var(--spacing) * 2);
+ }
+ .text-center {
+ text-align: center;
+ }
+ .text-sm {
+ font-size: var(--text-sm);
+ line-height: var(--tw-leading, var(--text-sm--line-height));
+ }
+ .text-xl {
+ font-size: var(--text-xl);
+ line-height: var(--tw-leading, var(--text-xl--line-height));
+ }
+ .text-xs {
+ font-size: var(--text-xs);
+ line-height: var(--tw-leading, var(--text-xs--line-height));
+ }
+ .font-bold {
+ --tw-font-weight: var(--font-weight-bold);
+ font-weight: var(--font-weight-bold);
+ }
+ .text-accent {
+ color: var(--color-accent);
+ }
+ .text-neutral-500 {
+ color: var(--color-neutral-500);
+ }
+ .text-neutral-700 {
+ color: var(--color-neutral-700);
+ }
+ .text-neutral-800 {
+ color: var(--color-neutral-800);
+ }
+ .text-red-600 {
+ color: var(--color-red-600);
+ }
+ .uppercase {
+ text-transform: uppercase;
+ }
+ .filter {
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
+ }
+ .transition {
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+ .transition-colors {
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+ .duration-300 {
+ --tw-duration: 300ms;
+ transition-duration: 300ms;
+ }
+ .group-hover\:text-black {
+ &:is(:where(.group):hover *) {
+ @media (hover: hover) {
+ color: var(--color-black);
+ }
+ }
+ }
+ .group-hover\:text-white {
+ &:is(:where(.group):hover *) {
+ @media (hover: hover) {
+ color: var(--color-white);
+ }
+ }
+ }
+ .group-\[\.edit\]\:block {
+ &:is(:where(.group):is(.edit) *) {
+ display: block;
+ }
+ }
+ .group-\[\.edit\]\:hidden {
+ &:is(:where(.group):is(.edit) *) {
+ display: none;
+ }
+ }
+ .group-\[\.edit\]\:inline {
+ &:is(:where(.group):is(.edit) *) {
+ display: inline;
+ }
+ }
+ .placeholder\:text-neutral-400 {
+ &::placeholder {
+ color: var(--color-neutral-400);
+ }
+ }
+ .hover\:border-neutral-300 {
+ &:hover {
+ @media (hover: hover) {
+ border-color: var(--color-neutral-300);
+ }
+ }
+ }
+ .hover\:border-neutral-500 {
+ &:hover {
+ @media (hover: hover) {
+ border-color: var(--color-neutral-500);
+ }
+ }
+ }
+ .hover\:bg-neutral-200 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-neutral-200);
+ }
+ }
+ }
+ .hover\:bg-neutral-700 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-neutral-700);
+ }
+ }
+ }
+ .hover\:text-accent {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-accent);
+ }
+ }
+ }
+ .hover\:text-white {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-white);
+ }
+ }
+ }
+ .focus\:border-neutral-400 {
+ &:focus {
+ border-color: var(--color-neutral-400);
+ }
+ }
+ .focus\:bg-neutral-700 {
+ &:focus {
+ background-color: var(--color-neutral-700);
+ }
+ }
+ .focus\:outline-none {
+ &:focus {
+ --tw-outline-style: none;
+ outline-style: none;
+ }
+ }
+ .active\:bg-neutral-700 {
+ &:active {
+ background-color: var(--color-neutral-700);
+ }
+ }
+ .disabled\:pointer-events-none {
+ &:disabled {
+ pointer-events: none;
+ }
+ }
+ .disabled\:opacity-50 {
+ &:disabled {
+ opacity: 50%;
+ }
+ }
+ .max-md\:flex {
+ @media (width < 48rem) {
+ display: flex;
+ }
+ }
+ .max-md\:grid {
+ @media (width < 48rem) {
+ display: grid;
+ }
+ }
+ .max-md\:flex-col {
+ @media (width < 48rem) {
+ flex-direction: column;
+ }
+ }
+ .md\:col-span-1 {
+ @media (width >= 48rem) {
+ grid-column: span 1 / span 1;
+ }
+ }
+ .md\:col-span-3 {
+ @media (width >= 48rem) {
+ grid-column: span 3 / span 3;
+ }
+ }
+ .md\:col-span-4 {
+ @media (width >= 48rem) {
+ grid-column: span 4 / span 4;
+ }
+ }
+ .md\:mx-\[10\%\] {
+ @media (width >= 48rem) {
+ margin-inline: 10%;
+ }
+ }
+ .md\:block {
+ @media (width >= 48rem) {
+ display: block;
+ }
+ }
+ .md\:hidden {
+ @media (width >= 48rem) {
+ display: none;
+ }
+ }
+ .md\:inline {
+ @media (width >= 48rem) {
+ display: inline;
+ }
+ }
+ .md\:w-1\/2 {
+ @media (width >= 48rem) {
+ width: calc(1/2 * 100%);
+ }
+ }
+ .md\:px-4 {
+ @media (width >= 48rem) {
+ padding-inline: calc(var(--spacing) * 4);
+ }
+ }
+ .md\:text-transparent {
+ @media (width >= 48rem) {
+ color: transparent;
+ }
+ }
+ .group-\[\.edit\]\:md\:block {
+ &:is(:where(.group):is(.edit) *) {
+ @media (width >= 48rem) {
+ display: block;
+ }
+ }
+ }
+ .print\:hidden {
+ @media print {
+ display: none;
+ }
+ }
+}
+@layer components {
+ .grid-main {
+ display: grid;
+ grid-template-columns: 2fr auto 1fr;
+ align-items: stretch;
+ }
+ .grid-sub {
+ display: grid;
+ grid-template-columns: subgrid;
+ grid-column: 1 / -1;
+ border-color: var(--color-neutral-400);
+ transition: background-color 0.2s ease-in-out;
+ }
+ .grid-sub:hover {
+ background-color: var(--color-neutral-200);
+ }
+ .grid-cell {
+ padding: calc(var(--spacing) * 2);
+ border-color: var(--color-neutral-400);
+ }
+ @media (width >=48rem) {
+ .grid-main {
+ grid-template-columns: repeat(5, 1fr);
+ margin: 0 10%;
+ }
+ }
+}
+@property --tw-divide-x-reverse {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+@property --tw-border-style {
+ syntax: "*";
+ inherits: false;
+ initial-value: solid;
+}
+@property --tw-divide-y-reverse {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+@property --tw-font-weight {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-blur {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-brightness {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-contrast {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-grayscale {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-hue-rotate {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-invert {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-opacity {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-saturate {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-sepia {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-drop-shadow {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-duration {
+ syntax: "*";
+ inherits: false;
+}
From 9918c43527db560076506aee57375749ea9668d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=20Tr=C3=B6ger?=
Date: Thu, 24 Apr 2025 17:48:03 +0200
Subject: [PATCH 10/21] fixed autoLogout
---
Backend/endpoints/auto_logout.go | 6 ++++--
Backend/models/user.go | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/Backend/endpoints/auto_logout.go b/Backend/endpoints/auto_logout.go
index b27f75f..7ff899c 100644
--- a/Backend/endpoints/auto_logout.go
+++ b/Backend/endpoints/auto_logout.go
@@ -5,6 +5,7 @@ import (
"arbeitszeitmessung/models"
"encoding/json"
"fmt"
+ "log"
"net/http"
)
@@ -29,8 +30,9 @@ func autoLogout(w http.ResponseWriter) {
err = user.Logout()
if err != nil {
fmt.Printf("Error logging out user %v\n", err)
- }else {
- logged_out_users = append(logged_out_users, user)
+ } else {
+ logged_out_users = append(logged_out_users, user)
+ log.Printf("Automaticaly logged out user %s, %s ", user.Name, user.Vorname)
}
}
diff --git a/Backend/models/user.go b/Backend/models/user.go
index e5f5bd0..92a6a21 100644
--- a/Backend/models/user.go
+++ b/Backend/models/user.go
@@ -68,7 +68,7 @@ func (u *User) GetAll() ([]User, error) {
// Returns true if there is a booking 1 for today -> meaning the user is at work
// Returns false if there is no booking today or the user is already booked out of the system
func (u *User) CheckAnwesenheit() bool {
- qStr, err := DB.Prepare((`SELECT check_in_out FROM anwesenheit WHERE card_uid = $1 AND "timestamp" >= now()::date + interval '1h' ORDER BY "timestamp" DESC LIMIT 1;`))
+ qStr, err := DB.Prepare((`SELECT check_in_out FROM anwesenheit WHERE card_uid = $1 AND "timestamp"::date = now()::date ORDER BY "timestamp" DESC LIMIT 1;`))
if err != nil {
fmt.Printf("Error preparing query statement %v\n", err)
return false
From 35ec575a051d41a18152cecf20b0de32d15ea411 Mon Sep 17 00:00:00 2001
From: tom
Date: Fri, 25 Apr 2025 17:03:05 +0200
Subject: [PATCH 11/21] added new booking Button + ui for abwesenheit
---
Backend/endpoints/time.go | 80 +-
Backend/models/booking.go | 39 +-
Backend/static/css/styles.css | 1084 ++++++++++++++++++++-
Backend/static/script.js | 14 +-
Backend/templates/timeComponents.templ | 43 +-
Backend/templates/timeComponents_templ.go | 211 ++--
6 files changed, 1328 insertions(+), 143 deletions(-)
diff --git a/Backend/endpoints/time.go b/Backend/endpoints/time.go
index abe2c89..548be64 100644
--- a/Backend/endpoints/time.go
+++ b/Backend/endpoints/time.go
@@ -88,27 +88,67 @@ func getBookings(w http.ResponseWriter, r *http.Request) {
func updateBooking(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
- for index, possibleBooking := range r.PostForm {
- if index[:7] == "booking" {
- booking_id, err := strconv.Atoi(index[8:])
- if err != nil {
- log.Println("Error parsing bookingId", err)
- continue
- }
- booking, err := (*models.Booking).GetBookingById(nil, booking_id)
- if err != nil {
- log.Println("Error getting booking!", err)
- continue
- }
- parsedTime, err := time.ParseInLocation("15:04", possibleBooking[0], booking.Timestamp.Location())
- if err != nil {
- log.Println("Error parsing time!", err)
- continue
- }
- log.Println("Parsing time", parsedTime)
- booking.UpdateTime(parsedTime)
- }
+ var loc *time.Location
+ loc, err := time.LoadLocation(helper.GetEnv("TZ", "Europe/Berlin"))
+ if err != nil {
+ log.Println("Error loading location", err)
+ loc = time.Local
}
+ switch r.FormValue("action") {
+ case "add":
+ log.Println("Adding Booking")
+ user, err := (*models.User).GetUserFromSession(nil, Session, r.Context())
+ if err != nil {
+ log.Println("No user found!", err)
+ }
+
+ timestamp, err := time.ParseInLocation("2006-01-02|15:04", r.FormValue("date")+"|"+r.FormValue("timestamp"), loc)
+ log.Println(timestamp)
+ if err != nil {
+ log.Println("Error parsing timestamp", err)
+ return
+ }
+
+ var check_in_out int
+ check_in_out, err = strconv.Atoi(r.FormValue("check_in_out"))
+ if err != nil {
+ log.Println("Error parsing check_in_out", err)
+ return
+ }
+
+ newBooking := (*models.Booking).New(nil, user.CardUID, 0, int16(check_in_out))
+ newBooking.Timestamp = timestamp
+ err = newBooking.InsertTimestamp()
+ if err != nil {
+ log.Println("Error inserting booking", err)
+ }
+ break
+ case "change":
+ log.Println("Changing Booking")
+ for index, possibleBooking := range r.PostForm {
+ if len(index) > 7 && index[:7] == "booking" {
+ booking_id, err := strconv.Atoi(index[8:])
+ if err != nil {
+ log.Println("Error parsing bookingId", err)
+ continue
+ }
+ booking, err := (*models.Booking).GetBookingById(nil, booking_id)
+ if err != nil {
+ log.Println("Error getting booking!", err)
+ continue
+ }
+ parsedTime, err := time.ParseInLocation("15:04", possibleBooking[0], booking.Timestamp.Location())
+ if err != nil {
+ log.Println("Error parsing time!", err)
+ continue
+ }
+ // log.Println("Parsing time", parsedTime)
+ booking.UpdateTime(parsedTime)
+ }
+ }
+ break
+ }
+
getBookings(w, r)
}
diff --git a/Backend/models/booking.go b/Backend/models/booking.go
index fd3e1ff..0ac7313 100644
--- a/Backend/models/booking.go
+++ b/Backend/models/booking.go
@@ -69,6 +69,21 @@ func (b *Booking) Insert() error {
return nil
}
+func (b *Booking) InsertTimestamp() error {
+ if b.Timestamp.IsZero() {
+ b.Timestamp = time.Now()
+ }
+ stmt, err := DB.Prepare((`INSERT INTO anwesenheit (card_uid, geraet_id, check_in_out, timestamp) VALUES ($1, $2, $3, $4) RETURNING counter_id`))
+ if err != nil {
+ return err
+ }
+ err = stmt.QueryRow(b.CardUID, b.GeraetID, b.CheckInOut, b.Timestamp).Scan(&b.CounterId)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
func (b *Booking) GetBookingById(booking_id int) (Booking, error) {
var booking Booking
qStr, err := DB.Prepare((`SELECT counter_id, timestamp, card_uid, geraet_id, check_in_out FROM anwesenheit WHERE counter_id = $1`))
@@ -79,10 +94,10 @@ func (b *Booking) GetBookingById(booking_id int) (Booking, error) {
if err != nil {
return booking, err
}
- if !booking.Verify() {
- fmt.Printf("Booking verification failed")
- return booking, nil
- }
+ // if !booking.Verify() {
+ // fmt.Printf("Booking verification failed! %d", )
+ // return booking, nil
+ // }
return booking, nil
}
@@ -167,17 +182,17 @@ func (b *Booking) GetBookingType() string {
case 1: //manuelle Änderung
return "kommen"
case 3:
- if(debug){
- return "kommen manuell"
- }
- return "kommen"
+ if debug {
+ return "kommen manuell"
+ }
+ return "kommen"
case 2: //manuelle Änderung
return "gehen"
case 4:
- if(debug){
- return "gehen manuell"
- }
- return "gehen"
+ if debug {
+ return "gehen manuell"
+ }
+ return "gehen"
case 254:
return "abgemeldet"
default:
diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css
index 23fdbbe..de29344 100644
--- a/Backend/static/css/styles.css
+++ b/Backend/static/css/styles.css
@@ -1,2 +1,1082 @@
-/*! tailwindcss v4.0.8 | MIT License | https://tailwindcss.com */
-@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:oklch(.808 .114 19.571);--color-red-500:oklch(.637 .237 25.331);--color-red-600:oklch(.577 .245 27.325);--color-orange-500:oklch(.705 .213 47.604);--color-green-300:oklch(.871 .15 154.449);--color-purple-600:oklch(.558 .288 302.321);--color-neutral-100:oklch(.97 0 0);--color-neutral-200:oklch(.922 0 0);--color-neutral-300:oklch(.87 0 0);--color-neutral-400:oklch(.708 0 0);--color-neutral-500:oklch(.556 0 0);--color-neutral-700:oklch(.371 0 0);--color-neutral-800:oklch(.269 0 0);--color-neutral-900:oklch(.205 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--font-weight-bold:700;--radius-md:.375rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-font-feature-settings:var(--font-sans--font-feature-settings);--default-font-variation-settings:var(--font-sans--font-variation-settings);--default-mono-font-family:var(--font-mono);--default-mono-font-feature-settings:var(--font-mono--font-feature-settings);--default-mono-font-variation-settings:var(--font-mono--font-variation-settings);--color-accent:#0eaf23}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}body{line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1;color:color-mix(in oklab,currentColor 50%,transparent)}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.grid-main{grid-template-columns:2fr auto 1fr;align-items:stretch;display:grid}.grid-sub{grid-template-columns:subgrid;border-color:var(--color-neutral-400);grid-column:1/-1;transition:background-color .2s ease-in-out;display:grid}.grid-sub:hover{background-color:var(--color-neutral-200)}.grid-cell{padding:calc(var(--spacing)*2);border-color:var(--color-neutral-400)}@media (width>=48rem){.grid-main{grid-template-columns:repeat(5,1fr);margin:0 10%}}}@layer utilities{.static{position:static}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-50{grid-row:span 50/span 50}.row-span-full{grid-row:1/-1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.m-2{margin:calc(var(--spacing)*2)}.-my-1{margin-block:calc(var(--spacing)*-1)}.mt-1{margin-top:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.flex{display:flex}.hidden{display:none}.inline{display:inline}.table{display:table}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.h-4{height:calc(var(--spacing)*4)}.h-8{height:calc(var(--spacing)*8)}.h-\[100vh\]{height:100vh}.h-full{height:100%}.w-2{width:calc(var(--spacing)*2)}.w-4{width:calc(var(--spacing)*4)}.w-9{width:calc(var(--spacing)*9)}.w-9\/10{width:90%}.w-20{width:calc(var(--spacing)*20)}.w-\[2px\]{width:2px}.w-full{width:100%}.flex-grow,.grow,.grow-1{flex-grow:1}.transform{transform:var(--tw-rotate-x)var(--tw-rotate-y)var(--tw-rotate-z)var(--tw-skew-x)var(--tw-skew-y)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.content-end{align-content:flex-end}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}:where(.divide-x-1>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y-1>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}.self-center{align-self:center}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-900{border-color:var(--color-neutral-900)}.bg-accent{background-color:var(--color-accent)}.bg-green-300{background-color:var(--color-green-300)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-300{background-color:var(--color-red-300)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-2{padding-block:calc(var(--spacing)*2)}.text-center{text-align:center}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.text-accent{color:var(--color-accent)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-red-600{color:var(--color-red-600)}.text-transparent{color:#0000}.uppercase{text-transform:uppercase}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}@media (hover:hover){.group-hover\:text-black:is(:where(.group):hover *){color:var(--color-black)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}}.group-\[\.edit\]\:block:is(:where(.group).edit *){display:block}.group-\[\.edit\]\:hidden:is(:where(.group).edit *){display:none}.group-\[\.edit\]\:inline:is(:where(.group).edit *){display:inline}.placeholder\:text-neutral-400::placeholder{color:var(--color-neutral-400)}@media (hover:hover){.hover\:border-neutral-300:hover{border-color:var(--color-neutral-300)}.hover\:border-neutral-500:hover{border-color:var(--color-neutral-500)}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.focus\:bg-neutral-700:focus{background-color:var(--color-neutral-700)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:bg-neutral-700:active{background-color:var(--color-neutral-700)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}@media (width<48rem){.max-md\:flex{display:flex}.max-md\:grid{display:grid}.max-md\:flex-col{flex-direction:column}}@media (width>=48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:mx-\[10\%\]{margin-inline:10%}.md\:block{display:block}.md\:hidden{display:none}.md\:inline{display:inline}.md\:w-1\/2{width:50%}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:text-transparent{color:#0000}.group-\[\.edit\]\:md\:block:is(:where(.group).edit *){display:block}}@media print{.print\:hidden{display:none}}}@property --tw-rotate-x{syntax:"*";inherits:false;initial-value:rotateX(0)}@property --tw-rotate-y{syntax:"*";inherits:false;initial-value:rotateY(0)}@property --tw-rotate-z{syntax:"*";inherits:false;initial-value:rotateZ(0)}@property --tw-skew-x{syntax:"*";inherits:false;initial-value:skewX(0)}@property --tw-skew-y{syntax:"*";inherits:false;initial-value:skewY(0)}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
\ No newline at end of file
+/*! tailwindcss v4.0.6 | MIT License | https://tailwindcss.com */
+@layer theme, base, components, utilities;
+@layer theme {
+ :root, :host {
+ --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
+ "Courier New", monospace;
+ --color-red-50: oklch(0.971 0.013 17.38);
+ --color-red-100: oklch(0.936 0.032 17.717);
+ --color-red-200: oklch(0.885 0.062 18.334);
+ --color-red-300: oklch(0.808 0.114 19.571);
+ --color-red-400: oklch(0.704 0.191 22.216);
+ --color-red-500: oklch(0.637 0.237 25.331);
+ --color-red-600: oklch(0.577 0.245 27.325);
+ --color-red-700: oklch(0.505 0.213 27.518);
+ --color-red-800: oklch(0.444 0.177 26.899);
+ --color-red-900: oklch(0.396 0.141 25.723);
+ --color-red-950: oklch(0.258 0.092 26.042);
+ --color-orange-50: oklch(0.98 0.016 73.684);
+ --color-orange-100: oklch(0.954 0.038 75.164);
+ --color-orange-200: oklch(0.901 0.076 70.697);
+ --color-orange-300: oklch(0.837 0.128 66.29);
+ --color-orange-400: oklch(0.75 0.183 55.934);
+ --color-orange-500: oklch(0.705 0.213 47.604);
+ --color-orange-600: oklch(0.646 0.222 41.116);
+ --color-orange-700: oklch(0.553 0.195 38.402);
+ --color-orange-800: oklch(0.47 0.157 37.304);
+ --color-orange-900: oklch(0.408 0.123 38.172);
+ --color-orange-950: oklch(0.266 0.079 36.259);
+ --color-amber-50: oklch(0.987 0.022 95.277);
+ --color-amber-100: oklch(0.962 0.059 95.617);
+ --color-amber-200: oklch(0.924 0.12 95.746);
+ --color-amber-300: oklch(0.879 0.169 91.605);
+ --color-amber-400: oklch(0.828 0.189 84.429);
+ --color-amber-500: oklch(0.769 0.188 70.08);
+ --color-amber-600: oklch(0.666 0.179 58.318);
+ --color-amber-700: oklch(0.555 0.163 48.998);
+ --color-amber-800: oklch(0.473 0.137 46.201);
+ --color-amber-900: oklch(0.414 0.112 45.904);
+ --color-amber-950: oklch(0.279 0.077 45.635);
+ --color-yellow-50: oklch(0.987 0.026 102.212);
+ --color-yellow-100: oklch(0.973 0.071 103.193);
+ --color-yellow-200: oklch(0.945 0.129 101.54);
+ --color-yellow-300: oklch(0.905 0.182 98.111);
+ --color-yellow-400: oklch(0.852 0.199 91.936);
+ --color-yellow-500: oklch(0.795 0.184 86.047);
+ --color-yellow-600: oklch(0.681 0.162 75.834);
+ --color-yellow-700: oklch(0.554 0.135 66.442);
+ --color-yellow-800: oklch(0.476 0.114 61.907);
+ --color-yellow-900: oklch(0.421 0.095 57.708);
+ --color-yellow-950: oklch(0.286 0.066 53.813);
+ --color-lime-50: oklch(0.986 0.031 120.757);
+ --color-lime-100: oklch(0.967 0.067 122.328);
+ --color-lime-200: oklch(0.938 0.127 124.321);
+ --color-lime-300: oklch(0.897 0.196 126.665);
+ --color-lime-400: oklch(0.841 0.238 128.85);
+ --color-lime-500: oklch(0.768 0.233 130.85);
+ --color-lime-600: oklch(0.648 0.2 131.684);
+ --color-lime-700: oklch(0.532 0.157 131.589);
+ --color-lime-800: oklch(0.453 0.124 130.933);
+ --color-lime-900: oklch(0.405 0.101 131.063);
+ --color-lime-950: oklch(0.274 0.072 132.109);
+ --color-green-50: oklch(0.982 0.018 155.826);
+ --color-green-100: oklch(0.962 0.044 156.743);
+ --color-green-200: oklch(0.925 0.084 155.995);
+ --color-green-300: oklch(0.871 0.15 154.449);
+ --color-green-400: oklch(0.792 0.209 151.711);
+ --color-green-500: oklch(0.723 0.219 149.579);
+ --color-green-600: oklch(0.627 0.194 149.214);
+ --color-green-700: oklch(0.527 0.154 150.069);
+ --color-green-800: oklch(0.448 0.119 151.328);
+ --color-green-900: oklch(0.393 0.095 152.535);
+ --color-green-950: oklch(0.266 0.065 152.934);
+ --color-emerald-50: oklch(0.979 0.021 166.113);
+ --color-emerald-100: oklch(0.95 0.052 163.051);
+ --color-emerald-200: oklch(0.905 0.093 164.15);
+ --color-emerald-300: oklch(0.845 0.143 164.978);
+ --color-emerald-400: oklch(0.765 0.177 163.223);
+ --color-emerald-500: oklch(0.696 0.17 162.48);
+ --color-emerald-600: oklch(0.596 0.145 163.225);
+ --color-emerald-700: oklch(0.508 0.118 165.612);
+ --color-emerald-800: oklch(0.432 0.095 166.913);
+ --color-emerald-900: oklch(0.378 0.077 168.94);
+ --color-emerald-950: oklch(0.262 0.051 172.552);
+ --color-teal-50: oklch(0.984 0.014 180.72);
+ --color-teal-100: oklch(0.953 0.051 180.801);
+ --color-teal-200: oklch(0.91 0.096 180.426);
+ --color-teal-300: oklch(0.855 0.138 181.071);
+ --color-teal-400: oklch(0.777 0.152 181.912);
+ --color-teal-500: oklch(0.704 0.14 182.503);
+ --color-teal-600: oklch(0.6 0.118 184.704);
+ --color-teal-700: oklch(0.511 0.096 186.391);
+ --color-teal-800: oklch(0.437 0.078 188.216);
+ --color-teal-900: oklch(0.386 0.063 188.416);
+ --color-teal-950: oklch(0.277 0.046 192.524);
+ --color-cyan-50: oklch(0.984 0.019 200.873);
+ --color-cyan-100: oklch(0.956 0.045 203.388);
+ --color-cyan-200: oklch(0.917 0.08 205.041);
+ --color-cyan-300: oklch(0.865 0.127 207.078);
+ --color-cyan-400: oklch(0.789 0.154 211.53);
+ --color-cyan-500: oklch(0.715 0.143 215.221);
+ --color-cyan-600: oklch(0.609 0.126 221.723);
+ --color-cyan-700: oklch(0.52 0.105 223.128);
+ --color-cyan-800: oklch(0.45 0.085 224.283);
+ --color-cyan-900: oklch(0.398 0.07 227.392);
+ --color-cyan-950: oklch(0.302 0.056 229.695);
+ --color-sky-50: oklch(0.977 0.013 236.62);
+ --color-sky-100: oklch(0.951 0.026 236.824);
+ --color-sky-200: oklch(0.901 0.058 230.902);
+ --color-sky-300: oklch(0.828 0.111 230.318);
+ --color-sky-400: oklch(0.746 0.16 232.661);
+ --color-sky-500: oklch(0.685 0.169 237.323);
+ --color-sky-600: oklch(0.588 0.158 241.966);
+ --color-sky-700: oklch(0.5 0.134 242.749);
+ --color-sky-800: oklch(0.443 0.11 240.79);
+ --color-sky-900: oklch(0.391 0.09 240.876);
+ --color-sky-950: oklch(0.293 0.066 243.157);
+ --color-blue-50: oklch(0.97 0.014 254.604);
+ --color-blue-100: oklch(0.932 0.032 255.585);
+ --color-blue-200: oklch(0.882 0.059 254.128);
+ --color-blue-300: oklch(0.809 0.105 251.813);
+ --color-blue-400: oklch(0.707 0.165 254.624);
+ --color-blue-500: oklch(0.623 0.214 259.815);
+ --color-blue-600: oklch(0.546 0.245 262.881);
+ --color-blue-700: oklch(0.488 0.243 264.376);
+ --color-blue-800: oklch(0.424 0.199 265.638);
+ --color-blue-900: oklch(0.379 0.146 265.522);
+ --color-blue-950: oklch(0.282 0.091 267.935);
+ --color-indigo-50: oklch(0.962 0.018 272.314);
+ --color-indigo-100: oklch(0.93 0.034 272.788);
+ --color-indigo-200: oklch(0.87 0.065 274.039);
+ --color-indigo-300: oklch(0.785 0.115 274.713);
+ --color-indigo-400: oklch(0.673 0.182 276.935);
+ --color-indigo-500: oklch(0.585 0.233 277.117);
+ --color-indigo-600: oklch(0.511 0.262 276.966);
+ --color-indigo-700: oklch(0.457 0.24 277.023);
+ --color-indigo-800: oklch(0.398 0.195 277.366);
+ --color-indigo-900: oklch(0.359 0.144 278.697);
+ --color-indigo-950: oklch(0.257 0.09 281.288);
+ --color-violet-50: oklch(0.969 0.016 293.756);
+ --color-violet-100: oklch(0.943 0.029 294.588);
+ --color-violet-200: oklch(0.894 0.057 293.283);
+ --color-violet-300: oklch(0.811 0.111 293.571);
+ --color-violet-400: oklch(0.702 0.183 293.541);
+ --color-violet-500: oklch(0.606 0.25 292.717);
+ --color-violet-600: oklch(0.541 0.281 293.009);
+ --color-violet-700: oklch(0.491 0.27 292.581);
+ --color-violet-800: oklch(0.432 0.232 292.759);
+ --color-violet-900: oklch(0.38 0.189 293.745);
+ --color-violet-950: oklch(0.283 0.141 291.089);
+ --color-purple-50: oklch(0.977 0.014 308.299);
+ --color-purple-100: oklch(0.946 0.033 307.174);
+ --color-purple-200: oklch(0.902 0.063 306.703);
+ --color-purple-300: oklch(0.827 0.119 306.383);
+ --color-purple-400: oklch(0.714 0.203 305.504);
+ --color-purple-500: oklch(0.627 0.265 303.9);
+ --color-purple-600: oklch(0.558 0.288 302.321);
+ --color-purple-700: oklch(0.496 0.265 301.924);
+ --color-purple-800: oklch(0.438 0.218 303.724);
+ --color-purple-900: oklch(0.381 0.176 304.987);
+ --color-purple-950: oklch(0.291 0.149 302.717);
+ --color-fuchsia-50: oklch(0.977 0.017 320.058);
+ --color-fuchsia-100: oklch(0.952 0.037 318.852);
+ --color-fuchsia-200: oklch(0.903 0.076 319.62);
+ --color-fuchsia-300: oklch(0.833 0.145 321.434);
+ --color-fuchsia-400: oklch(0.74 0.238 322.16);
+ --color-fuchsia-500: oklch(0.667 0.295 322.15);
+ --color-fuchsia-600: oklch(0.591 0.293 322.896);
+ --color-fuchsia-700: oklch(0.518 0.253 323.949);
+ --color-fuchsia-800: oklch(0.452 0.211 324.591);
+ --color-fuchsia-900: oklch(0.401 0.17 325.612);
+ --color-fuchsia-950: oklch(0.293 0.136 325.661);
+ --color-pink-50: oklch(0.971 0.014 343.198);
+ --color-pink-100: oklch(0.948 0.028 342.258);
+ --color-pink-200: oklch(0.899 0.061 343.231);
+ --color-pink-300: oklch(0.823 0.12 346.018);
+ --color-pink-400: oklch(0.718 0.202 349.761);
+ --color-pink-500: oklch(0.656 0.241 354.308);
+ --color-pink-600: oklch(0.592 0.249 0.584);
+ --color-pink-700: oklch(0.525 0.223 3.958);
+ --color-pink-800: oklch(0.459 0.187 3.815);
+ --color-pink-900: oklch(0.408 0.153 2.432);
+ --color-pink-950: oklch(0.284 0.109 3.907);
+ --color-rose-50: oklch(0.969 0.015 12.422);
+ --color-rose-100: oklch(0.941 0.03 12.58);
+ --color-rose-200: oklch(0.892 0.058 10.001);
+ --color-rose-300: oklch(0.81 0.117 11.638);
+ --color-rose-400: oklch(0.712 0.194 13.428);
+ --color-rose-500: oklch(0.645 0.246 16.439);
+ --color-rose-600: oklch(0.586 0.253 17.585);
+ --color-rose-700: oklch(0.514 0.222 16.935);
+ --color-rose-800: oklch(0.455 0.188 13.697);
+ --color-rose-900: oklch(0.41 0.159 10.272);
+ --color-rose-950: oklch(0.271 0.105 12.094);
+ --color-slate-50: oklch(0.984 0.003 247.858);
+ --color-slate-100: oklch(0.968 0.007 247.896);
+ --color-slate-200: oklch(0.929 0.013 255.508);
+ --color-slate-300: oklch(0.869 0.022 252.894);
+ --color-slate-400: oklch(0.704 0.04 256.788);
+ --color-slate-500: oklch(0.554 0.046 257.417);
+ --color-slate-600: oklch(0.446 0.043 257.281);
+ --color-slate-700: oklch(0.372 0.044 257.287);
+ --color-slate-800: oklch(0.279 0.041 260.031);
+ --color-slate-900: oklch(0.208 0.042 265.755);
+ --color-slate-950: oklch(0.129 0.042 264.695);
+ --color-gray-50: oklch(0.985 0.002 247.839);
+ --color-gray-100: oklch(0.967 0.003 264.542);
+ --color-gray-200: oklch(0.928 0.006 264.531);
+ --color-gray-300: oklch(0.872 0.01 258.338);
+ --color-gray-400: oklch(0.707 0.022 261.325);
+ --color-gray-500: oklch(0.551 0.027 264.364);
+ --color-gray-600: oklch(0.446 0.03 256.802);
+ --color-gray-700: oklch(0.373 0.034 259.733);
+ --color-gray-800: oklch(0.278 0.033 256.848);
+ --color-gray-900: oklch(0.21 0.034 264.665);
+ --color-gray-950: oklch(0.13 0.028 261.692);
+ --color-zinc-50: oklch(0.985 0 0);
+ --color-zinc-100: oklch(0.967 0.001 286.375);
+ --color-zinc-200: oklch(0.92 0.004 286.32);
+ --color-zinc-300: oklch(0.871 0.006 286.286);
+ --color-zinc-400: oklch(0.705 0.015 286.067);
+ --color-zinc-500: oklch(0.552 0.016 285.938);
+ --color-zinc-600: oklch(0.442 0.017 285.786);
+ --color-zinc-700: oklch(0.37 0.013 285.805);
+ --color-zinc-800: oklch(0.274 0.006 286.033);
+ --color-zinc-900: oklch(0.21 0.006 285.885);
+ --color-zinc-950: oklch(0.141 0.005 285.823);
+ --color-neutral-50: oklch(0.985 0 0);
+ --color-neutral-100: oklch(0.97 0 0);
+ --color-neutral-200: oklch(0.922 0 0);
+ --color-neutral-300: oklch(0.87 0 0);
+ --color-neutral-400: oklch(0.708 0 0);
+ --color-neutral-500: oklch(0.556 0 0);
+ --color-neutral-600: oklch(0.439 0 0);
+ --color-neutral-700: oklch(0.371 0 0);
+ --color-neutral-800: oklch(0.269 0 0);
+ --color-neutral-900: oklch(0.205 0 0);
+ --color-neutral-950: oklch(0.145 0 0);
+ --color-stone-50: oklch(0.985 0.001 106.423);
+ --color-stone-100: oklch(0.97 0.001 106.424);
+ --color-stone-200: oklch(0.923 0.003 48.717);
+ --color-stone-300: oklch(0.869 0.005 56.366);
+ --color-stone-400: oklch(0.709 0.01 56.259);
+ --color-stone-500: oklch(0.553 0.013 58.071);
+ --color-stone-600: oklch(0.444 0.011 73.639);
+ --color-stone-700: oklch(0.374 0.01 67.558);
+ --color-stone-800: oklch(0.268 0.007 34.298);
+ --color-stone-900: oklch(0.216 0.006 56.043);
+ --color-stone-950: oklch(0.147 0.004 49.25);
+ --color-black: #000;
+ --color-white: #fff;
+ --spacing: 0.25rem;
+ --breakpoint-sm: 40rem;
+ --breakpoint-md: 48rem;
+ --breakpoint-lg: 64rem;
+ --breakpoint-xl: 80rem;
+ --breakpoint-2xl: 96rem;
+ --container-3xs: 16rem;
+ --container-2xs: 18rem;
+ --container-xs: 20rem;
+ --container-sm: 24rem;
+ --container-md: 28rem;
+ --container-lg: 32rem;
+ --container-xl: 36rem;
+ --container-2xl: 42rem;
+ --container-3xl: 48rem;
+ --container-4xl: 56rem;
+ --container-5xl: 64rem;
+ --container-6xl: 72rem;
+ --container-7xl: 80rem;
+ --text-xs: 0.75rem;
+ --text-xs--line-height: calc(1 / 0.75);
+ --text-sm: 0.875rem;
+ --text-sm--line-height: calc(1.25 / 0.875);
+ --text-base: 1rem;
+ --text-base--line-height: calc(1.5 / 1);
+ --text-lg: 1.125rem;
+ --text-lg--line-height: calc(1.75 / 1.125);
+ --text-xl: 1.25rem;
+ --text-xl--line-height: calc(1.75 / 1.25);
+ --text-2xl: 1.5rem;
+ --text-2xl--line-height: calc(2 / 1.5);
+ --text-3xl: 1.875rem;
+ --text-3xl--line-height: calc(2.25 / 1.875);
+ --text-4xl: 2.25rem;
+ --text-4xl--line-height: calc(2.5 / 2.25);
+ --text-5xl: 3rem;
+ --text-5xl--line-height: 1;
+ --text-6xl: 3.75rem;
+ --text-6xl--line-height: 1;
+ --text-7xl: 4.5rem;
+ --text-7xl--line-height: 1;
+ --text-8xl: 6rem;
+ --text-8xl--line-height: 1;
+ --text-9xl: 8rem;
+ --text-9xl--line-height: 1;
+ --font-weight-thin: 100;
+ --font-weight-extralight: 200;
+ --font-weight-light: 300;
+ --font-weight-normal: 400;
+ --font-weight-medium: 500;
+ --font-weight-semibold: 600;
+ --font-weight-bold: 700;
+ --font-weight-extrabold: 800;
+ --font-weight-black: 900;
+ --tracking-tighter: -0.05em;
+ --tracking-tight: -0.025em;
+ --tracking-normal: 0em;
+ --tracking-wide: 0.025em;
+ --tracking-wider: 0.05em;
+ --tracking-widest: 0.1em;
+ --leading-tight: 1.25;
+ --leading-snug: 1.375;
+ --leading-normal: 1.5;
+ --leading-relaxed: 1.625;
+ --leading-loose: 2;
+ --radius-xs: 0.125rem;
+ --radius-sm: 0.25rem;
+ --radius-md: 0.375rem;
+ --radius-lg: 0.5rem;
+ --radius-xl: 0.75rem;
+ --radius-2xl: 1rem;
+ --radius-3xl: 1.5rem;
+ --radius-4xl: 2rem;
+ --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
+ --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);
+ --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);
+ --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);
+ --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);
+ --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);
+ --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);
+ --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);
+ --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);
+ --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
+ --animate-spin: spin 1s linear infinite;
+ --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
+ --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+ --animate-bounce: bounce 1s infinite;
+ --blur-xs: 4px;
+ --blur-sm: 8px;
+ --blur-md: 12px;
+ --blur-lg: 16px;
+ --blur-xl: 24px;
+ --blur-2xl: 40px;
+ --blur-3xl: 64px;
+ --perspective-dramatic: 100px;
+ --perspective-near: 300px;
+ --perspective-normal: 500px;
+ --perspective-midrange: 800px;
+ --perspective-distant: 1200px;
+ --aspect-video: 16 / 9;
+ --default-transition-duration: 150ms;
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ --default-font-family: var(--font-sans);
+ --default-font-feature-settings: var(--font-sans--font-feature-settings);
+ --default-font-variation-settings: var(
+ --font-sans--font-variation-settings
+ );
+ --default-mono-font-family: var(--font-mono);
+ --default-mono-font-feature-settings: var(
+ --font-mono--font-feature-settings
+ );
+ --default-mono-font-variation-settings: var(
+ --font-mono--font-variation-settings
+ );
+ --color-accent-50: #e7fdea;
+ --color-accent-100: #cbfbd1;
+ --color-accent-200: #9cf7a8;
+ --color-accent-300: #68f37a;
+ --color-accent-400: #33ef4d;
+ --color-accent-500: #11db2d;
+ --color-accent-600: #0eaf23;
+ --color-accent-700: #0a851b;
+ --color-accent-800: #075a12;
+ --color-accent-900: #032b09;
+ --color-accent-950: #021805;
+ --color-accent: #0eaf23;
+ --color-text-50: #f7f8f7;
+ --color-text-100: #f2f3f2;
+ --color-text-200: #e2e4e2;
+ --color-text-300: #d2d6d2;
+ --color-text-400: #c2c7c2;
+ --color-text-500: #afb6af;
+ --color-text-600: #97a097;
+ --color-text-700: #7d877d;
+ --color-text-800: #5a625a;
+ --color-text-900: #161816;
+ --color-text-950: #000000;
+ }
+}
+@layer base {
+ *, ::after, ::before, ::backdrop, ::file-selector-button {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ border: 0 solid;
+ }
+ html, :host {
+ line-height: 1.5;
+ -webkit-text-size-adjust: 100%;
+ tab-size: 4;
+ font-family: var( --default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" );
+ font-feature-settings: var(--default-font-feature-settings, normal);
+ font-variation-settings: var( --default-font-variation-settings, normal );
+ -webkit-tap-highlight-color: transparent;
+ }
+ body {
+ line-height: inherit;
+ }
+ hr {
+ height: 0;
+ color: inherit;
+ border-top-width: 1px;
+ }
+ abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ }
+ h1, h2, h3, h4, h5, h6 {
+ font-size: inherit;
+ font-weight: inherit;
+ }
+ a {
+ color: inherit;
+ -webkit-text-decoration: inherit;
+ text-decoration: inherit;
+ }
+ b, strong {
+ font-weight: bolder;
+ }
+ code, kbd, samp, pre {
+ font-family: var( --default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace );
+ font-feature-settings: var( --default-mono-font-feature-settings, normal );
+ font-variation-settings: var( --default-mono-font-variation-settings, normal );
+ font-size: 1em;
+ }
+ small {
+ font-size: 80%;
+ }
+ sub, sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+ sub {
+ bottom: -0.25em;
+ }
+ sup {
+ top: -0.5em;
+ }
+ table {
+ text-indent: 0;
+ border-color: inherit;
+ border-collapse: collapse;
+ }
+ :-moz-focusring {
+ outline: auto;
+ }
+ progress {
+ vertical-align: baseline;
+ }
+ summary {
+ display: list-item;
+ }
+ ol, ul, menu {
+ list-style: none;
+ }
+ img, svg, video, canvas, audio, iframe, embed, object {
+ display: block;
+ vertical-align: middle;
+ }
+ img, video {
+ max-width: 100%;
+ height: auto;
+ }
+ button, input, select, optgroup, textarea, ::file-selector-button {
+ font: inherit;
+ font-feature-settings: inherit;
+ font-variation-settings: inherit;
+ letter-spacing: inherit;
+ color: inherit;
+ border-radius: 0;
+ background-color: transparent;
+ opacity: 1;
+ }
+ :where(select:is([multiple], [size])) optgroup {
+ font-weight: bolder;
+ }
+ :where(select:is([multiple], [size])) optgroup option {
+ padding-inline-start: 20px;
+ }
+ ::file-selector-button {
+ margin-inline-end: 4px;
+ }
+ ::placeholder {
+ opacity: 1;
+ color: color-mix(in oklab, currentColor 50%, transparent);
+ }
+ textarea {
+ resize: vertical;
+ }
+ ::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+ ::-webkit-date-and-time-value {
+ min-height: 1lh;
+ text-align: inherit;
+ }
+ ::-webkit-datetime-edit {
+ display: inline-flex;
+ }
+ ::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+ }
+ ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
+ padding-block: 0;
+ }
+ :-moz-ui-invalid {
+ box-shadow: none;
+ }
+ button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
+ appearance: button;
+ }
+ ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
+ height: auto;
+ }
+ [hidden]:where(:not([hidden="until-found"])) {
+ display: none !important;
+ }
+}
+@layer utilities {
+ .static {
+ position: static;
+ }
+ .col-span-2 {
+ grid-column: span 2 / span 2;
+ }
+ .col-span-3 {
+ grid-column: span 3 / span 3;
+ }
+ .-my-1 {
+ margin-block: calc(var(--spacing) * -1);
+ }
+ .mt-1 {
+ margin-top: calc(var(--spacing) * 1);
+ }
+ .mb-2 {
+ margin-bottom: calc(var(--spacing) * 2);
+ }
+ .flex {
+ display: flex;
+ }
+ .hidden {
+ display: none;
+ }
+ .inline {
+ display: inline;
+ }
+ .table {
+ display: table;
+ }
+ .size-2 {
+ width: calc(var(--spacing) * 2);
+ height: calc(var(--spacing) * 2);
+ }
+ .size-4 {
+ width: calc(var(--spacing) * 4);
+ height: calc(var(--spacing) * 4);
+ }
+ .h-4 {
+ height: calc(var(--spacing) * 4);
+ }
+ .h-8 {
+ height: calc(var(--spacing) * 8);
+ }
+ .h-\[100vh\] {
+ height: 100vh;
+ }
+ .h-full {
+ height: 100%;
+ }
+ .w-2 {
+ width: calc(var(--spacing) * 2);
+ }
+ .w-4 {
+ width: calc(var(--spacing) * 4);
+ }
+ .w-9\/10 {
+ width: calc(9/10 * 100%);
+ }
+ .w-\[2px\] {
+ width: 2px;
+ }
+ .w-full {
+ width: 100%;
+ }
+ .flex-grow {
+ flex-grow: 1;
+ }
+ .grow {
+ flex-grow: 1;
+ }
+ .grow-1 {
+ flex-grow: 1;
+ }
+ .cursor-pointer {
+ cursor: pointer;
+ }
+ .grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+ .flex-col {
+ flex-direction: column;
+ }
+ .flex-row {
+ flex-direction: row;
+ }
+ .content-end {
+ align-content: flex-end;
+ }
+ .items-center {
+ align-items: center;
+ }
+ .justify-between {
+ justify-content: space-between;
+ }
+ .justify-center {
+ justify-content: center;
+ }
+ .gap-2 {
+ gap: calc(var(--spacing) * 2);
+ }
+ .gap-4 {
+ gap: calc(var(--spacing) * 4);
+ }
+ .divide-x-1 {
+ :where(& > :not(:last-child)) {
+ --tw-divide-x-reverse: 0;
+ border-inline-style: var(--tw-border-style);
+ border-inline-start-width: calc(1px * var(--tw-divide-x-reverse));
+ border-inline-end-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
+ }
+ }
+ .divide-y-1 {
+ :where(& > :not(:last-child)) {
+ --tw-divide-y-reverse: 0;
+ border-bottom-style: var(--tw-border-style);
+ border-top-style: var(--tw-border-style);
+ border-top-width: calc(1px * var(--tw-divide-y-reverse));
+ border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
+ }
+ }
+ .justify-self-end {
+ justify-self: flex-end;
+ }
+ .truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .overflow-hidden {
+ overflow: hidden;
+ }
+ .rounded-full {
+ border-radius: calc(infinity * 1px);
+ }
+ .rounded-md {
+ border-radius: var(--radius-md);
+ }
+ .border {
+ border-style: var(--tw-border-style);
+ border-width: 1px;
+ }
+ .border-neutral-200 {
+ border-color: var(--color-neutral-200);
+ }
+ .border-neutral-300 {
+ border-color: var(--color-neutral-300);
+ }
+ .border-neutral-800 {
+ border-color: var(--color-neutral-800);
+ }
+ .border-neutral-900 {
+ border-color: var(--color-neutral-900);
+ }
+ .bg-accent {
+ background-color: var(--color-accent);
+ }
+ .bg-neutral-100 {
+ background-color: var(--color-neutral-100);
+ }
+ .bg-neutral-300 {
+ background-color: var(--color-neutral-300);
+ }
+ .bg-neutral-400 {
+ background-color: var(--color-neutral-400);
+ }
+ .bg-orange-500 {
+ background-color: var(--color-orange-500);
+ }
+ .bg-purple-600 {
+ background-color: var(--color-purple-600);
+ }
+ .bg-red-600 {
+ background-color: var(--color-red-600);
+ }
+ .p-1 {
+ padding: calc(var(--spacing) * 1);
+ }
+ .p-2 {
+ padding: calc(var(--spacing) * 2);
+ }
+ .px-3 {
+ padding-inline: calc(var(--spacing) * 3);
+ }
+ .py-2 {
+ padding-block: calc(var(--spacing) * 2);
+ }
+ .text-center {
+ text-align: center;
+ }
+ .text-sm {
+ font-size: var(--text-sm);
+ line-height: var(--tw-leading, var(--text-sm--line-height));
+ }
+ .text-xl {
+ font-size: var(--text-xl);
+ line-height: var(--tw-leading, var(--text-xl--line-height));
+ }
+ .font-bold {
+ --tw-font-weight: var(--font-weight-bold);
+ font-weight: var(--font-weight-bold);
+ }
+ .text-accent {
+ color: var(--color-accent);
+ }
+ .text-neutral-500 {
+ color: var(--color-neutral-500);
+ }
+ .text-neutral-700 {
+ color: var(--color-neutral-700);
+ }
+ .text-neutral-800 {
+ color: var(--color-neutral-800);
+ }
+ .text-red-600 {
+ color: var(--color-red-600);
+ }
+ .uppercase {
+ text-transform: uppercase;
+ }
+ .filter {
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
+ }
+ .transition {
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+ .transition-colors {
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
+ }
+ .duration-300 {
+ --tw-duration: 300ms;
+ transition-duration: 300ms;
+ }
+ .group-hover\:text-black {
+ &:is(:where(.group):hover *) {
+ @media (hover: hover) {
+ color: var(--color-black);
+ }
+ }
+ }
+ .group-hover\:text-white {
+ &:is(:where(.group):hover *) {
+ @media (hover: hover) {
+ color: var(--color-white);
+ }
+ }
+ }
+ .group-\[\.edit\]\:block {
+ &:is(:where(.group):is(.edit) *) {
+ display: block;
+ }
+ }
+ .group-\[\.edit\]\:flex {
+ &:is(:where(.group):is(.edit) *) {
+ display: flex;
+ }
+ }
+ .group-\[\.edit\]\:hidden {
+ &:is(:where(.group):is(.edit) *) {
+ display: none;
+ }
+ }
+ .group-\[\.edit\]\:inline {
+ &:is(:where(.group):is(.edit) *) {
+ display: inline;
+ }
+ }
+ .placeholder\:text-neutral-400 {
+ &::placeholder {
+ color: var(--color-neutral-400);
+ }
+ }
+ .hover\:border-neutral-300 {
+ &:hover {
+ @media (hover: hover) {
+ border-color: var(--color-neutral-300);
+ }
+ }
+ }
+ .hover\:border-neutral-500 {
+ &:hover {
+ @media (hover: hover) {
+ border-color: var(--color-neutral-500);
+ }
+ }
+ }
+ .hover\:bg-neutral-200 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-neutral-200);
+ }
+ }
+ }
+ .hover\:bg-neutral-700 {
+ &:hover {
+ @media (hover: hover) {
+ background-color: var(--color-neutral-700);
+ }
+ }
+ }
+ .hover\:text-accent {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-accent);
+ }
+ }
+ }
+ .hover\:text-white {
+ &:hover {
+ @media (hover: hover) {
+ color: var(--color-white);
+ }
+ }
+ }
+ .focus\:border-neutral-400 {
+ &:focus {
+ border-color: var(--color-neutral-400);
+ }
+ }
+ .focus\:bg-neutral-700 {
+ &:focus {
+ background-color: var(--color-neutral-700);
+ }
+ }
+ .focus\:outline-none {
+ &:focus {
+ --tw-outline-style: none;
+ outline-style: none;
+ }
+ }
+ .active\:bg-neutral-700 {
+ &:active {
+ background-color: var(--color-neutral-700);
+ }
+ }
+ .disabled\:pointer-events-none {
+ &:disabled {
+ pointer-events: none;
+ }
+ }
+ .disabled\:opacity-50 {
+ &:disabled {
+ opacity: 50%;
+ }
+ }
+ .max-md\:flex {
+ @media (width < 48rem) {
+ display: flex;
+ }
+ }
+ .max-md\:grid {
+ @media (width < 48rem) {
+ display: grid;
+ }
+ }
+ .max-md\:flex-col {
+ @media (width < 48rem) {
+ flex-direction: column;
+ }
+ }
+ .md\:col-span-1 {
+ @media (width >= 48rem) {
+ grid-column: span 1 / span 1;
+ }
+ }
+ .md\:col-span-3 {
+ @media (width >= 48rem) {
+ grid-column: span 3 / span 3;
+ }
+ }
+ .md\:col-span-4 {
+ @media (width >= 48rem) {
+ grid-column: span 4 / span 4;
+ }
+ }
+ .md\:mx-\[10\%\] {
+ @media (width >= 48rem) {
+ margin-inline: 10%;
+ }
+ }
+ .md\:block {
+ @media (width >= 48rem) {
+ display: block;
+ }
+ }
+ .md\:hidden {
+ @media (width >= 48rem) {
+ display: none;
+ }
+ }
+ .md\:inline {
+ @media (width >= 48rem) {
+ display: inline;
+ }
+ }
+ .md\:w-1\/2 {
+ @media (width >= 48rem) {
+ width: calc(1/2 * 100%);
+ }
+ }
+ .md\:px-4 {
+ @media (width >= 48rem) {
+ padding-inline: calc(var(--spacing) * 4);
+ }
+ }
+ .md\:text-transparent {
+ @media (width >= 48rem) {
+ color: transparent;
+ }
+ }
+ .group-\[\.edit\]\:md\:block {
+ &:is(:where(.group):is(.edit) *) {
+ @media (width >= 48rem) {
+ display: block;
+ }
+ }
+ }
+ .print\:hidden {
+ @media print {
+ display: none;
+ }
+ }
+}
+@layer components {
+ .grid-main {
+ display: grid;
+ grid-template-columns: 2fr auto 1fr;
+ align-items: stretch;
+ }
+ .grid-sub {
+ display: grid;
+ grid-template-columns: subgrid;
+ grid-column: 1 / -1;
+ border-color: var(--color-neutral-400);
+ transition: background-color 0.2s ease-in-out;
+ }
+ .grid-sub:hover {
+ background-color: var(--color-neutral-200);
+ }
+ .grid-cell {
+ padding: calc(var(--spacing) * 2);
+ border-color: var(--color-neutral-400);
+ }
+ @media (width >=48rem) {
+ .grid-main {
+ grid-template-columns: repeat(5, 1fr);
+ margin: 0 10%;
+ }
+ }
+}
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+@keyframes ping {
+ 75%, 100% {
+ transform: scale(2);
+ opacity: 0;
+ }
+}
+@keyframes pulse {
+ 50% {
+ opacity: 0.5;
+ }
+}
+@keyframes bounce {
+ 0%, 100% {
+ transform: translateY(-25%);
+ animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
+ }
+ 50% {
+ transform: none;
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+ }
+}
+@property --tw-divide-x-reverse {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+@property --tw-border-style {
+ syntax: "*";
+ inherits: false;
+ initial-value: solid;
+}
+@property --tw-divide-y-reverse {
+ syntax: "*";
+ inherits: false;
+ initial-value: 0;
+}
+@property --tw-font-weight {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-blur {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-brightness {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-contrast {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-grayscale {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-hue-rotate {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-invert {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-opacity {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-saturate {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-sepia {
+ syntax: "*";
+ inherits: false;
+}
+@property --tw-duration {
+ syntax: "*";
+ inherits: false;
+}
diff --git a/Backend/static/script.js b/Backend/static/script.js
index 2d10459..7b8a3c6 100644
--- a/Backend/static/script.js
+++ b/Backend/static/script.js
@@ -1,10 +1,9 @@
function editDay(element, event, formId) {
var form = element
.closest(".grid-sub")
- .querySelector(".time-component > form");
+ .querySelector(".all-booking-component > form");
form.classList.toggle("edit");
element.classList.toggle("edit");
- console.log(form);
if (element.classList.contains("edit")) {
event.preventDefault();
form.querySelectorAll("input, select").forEach((input) => {
@@ -14,3 +13,14 @@ function editDay(element, event, formId) {
form.submit();
}
}
+
+function editAbwesenheit(element, event) {
+ var newBookingComponent = element
+ .closest(".grid-sub")
+ .querySelector(".new-booking-component");
+ if (element.value == 0) {
+ newBookingComponent.style.display = "";
+ } else {
+ newBookingComponent.style.display = "none";
+ }
+}
diff --git a/Backend/templates/timeComponents.templ b/Backend/templates/timeComponents.templ
index 117c0fa..616ee18 100644
--- a/Backend/templates/timeComponents.templ
+++ b/Backend/templates/timeComponents.templ
@@ -1,7 +1,6 @@
package templates
import (
- "arbeitszeitmessung/helper"
"arbeitszeitmessung/models"
"fmt"
"net/url"
@@ -19,7 +18,7 @@ templ inputForm() {
{ user.Vorname + " " + user.Name }
Überstunden
-
4h 32min
+
0h 0min (statisch)