Compare commits
18
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b404ff5bc9 | ||
|
|
c3b7321005 | ||
|
|
dfb031949b | ||
|
|
b030e133a2 | ||
|
|
810d554cb9 | ||
|
|
2e6bd2a781 | ||
|
|
390630886e | ||
|
|
0ee20e2833 | ||
|
|
b7f8df624c | ||
|
|
8a9c9efbcc | ||
|
|
c31375573f | ||
|
|
b2daed8e99 | ||
|
|
076bd6c545 | ||
|
|
a42897de9f | ||
|
|
3154e3de44 | ||
|
|
bf0197adae | ||
|
|
c6a4a24fb6 | ||
|
|
52387f7333 |
@@ -26,3 +26,4 @@ frontend/node_modules/
|
|||||||
# Added by cargo
|
# Added by cargo
|
||||||
|
|
||||||
/target
|
/target
|
||||||
|
.antigravitycli/
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ pub async fn get_current_user(
|
|||||||
/// - `404 Not Found` if user doesn't exist
|
/// - `404 Not Found` if user doesn't exist
|
||||||
/// - `500 Internal Server Error` if database error occurs
|
/// - `500 Internal Server Error` if database error occurs
|
||||||
pub async fn delete_user(
|
pub async fn delete_user(
|
||||||
Path(id): Path<i32>,
|
Path(id): Path<i16>,
|
||||||
State(data): State<Arc<AppState>>,
|
State(data): State<Arc<AppState>>,
|
||||||
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
||||||
let query = sqlx::query(r#"DELETE FROM users WHERE id = $1"#)
|
let query = sqlx::query(r#"DELETE FROM users WHERE id = $1"#)
|
||||||
@@ -414,10 +414,11 @@ pub async fn get_user_by_id(
|
|||||||
/// - Passwords are hashed using Argon2 before storage.
|
/// - Passwords are hashed using Argon2 before storage.
|
||||||
/// - This endpoint typically requires admin privileges (enforced by middleware).
|
/// - This endpoint typically requires admin privileges (enforced by middleware).
|
||||||
pub async fn update_user(
|
pub async fn update_user(
|
||||||
Path(id): Path<i32>,
|
Path(id): Path<i16>,
|
||||||
State(data): State<Arc<AppState>>,
|
State(data): State<Arc<AppState>>,
|
||||||
Json(body): Json<UserUpdateScheme>,
|
Json(body): Json<UserUpdateScheme>,
|
||||||
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
||||||
|
let update_result = if !body.new_pwd.is_empty() {
|
||||||
let argon = Argon2::default();
|
let argon = Argon2::default();
|
||||||
let salt = SaltString::generate(&mut OsRng);
|
let salt = SaltString::generate(&mut OsRng);
|
||||||
let hashed_pwd = match argon.hash_password(body.new_pwd.clone().as_bytes(), &salt) {
|
let hashed_pwd = match argon.hash_password(body.new_pwd.clone().as_bytes(), &salt) {
|
||||||
@@ -425,15 +426,25 @@ pub async fn update_user(
|
|||||||
Err(e) => panic!("Error hashing {:}", e),
|
Err(e) => panic!("Error hashing {:}", e),
|
||||||
};
|
};
|
||||||
|
|
||||||
let update_result = sqlx::query(r#"UPDATE users SET first_name = $1, last_name = $2, username = $3, pwd = $4, is_admin = $5 WHERE id = $6"#)
|
sqlx::query(r#"UPDATE users SET first_name = $1, last_name = $2, username = $3, pwd = $4, is_admin = $5 WHERE id = $6"#)
|
||||||
.bind(body.first_name.to_owned())
|
.bind(body.first_name.to_owned())
|
||||||
.bind(body.last_name.to_owned())
|
.bind(body.last_name.to_owned())
|
||||||
.bind(body.username.to_owned())
|
.bind(body.username.to_owned())
|
||||||
.bind(&hashed_pwd)
|
.bind(hashed_pwd)
|
||||||
.bind(body.make_admin.to_owned())
|
.bind(body.make_admin.to_owned())
|
||||||
.bind(id)
|
.bind(id)
|
||||||
.execute(&data.db)
|
.execute(&data.db)
|
||||||
.await
|
.await
|
||||||
|
} else {
|
||||||
|
sqlx::query(r#"UPDATE users SET first_name = $1, last_name = $2, username = $3, is_admin = $4 WHERE id = $5"#)
|
||||||
|
.bind(body.first_name.to_owned())
|
||||||
|
.bind(body.last_name.to_owned())
|
||||||
|
.bind(body.username.to_owned())
|
||||||
|
.bind(body.make_admin.to_owned())
|
||||||
|
.bind(id)
|
||||||
|
.execute(&data.db)
|
||||||
|
.await
|
||||||
|
}
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
(
|
(
|
||||||
StatusCode::INTERNAL_SERVER_ERROR,
|
StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[serve]
|
[serve]
|
||||||
# The address to serve on LAN.
|
# The address to serve on LAN.
|
||||||
addresses = ["127.0.0.1"] #,"10.150.9.116"]
|
addresses = ["127.0.0.1"] #,"10.150.9.7"]
|
||||||
# The address to serve on WAN.
|
# The address to serve on WAN.
|
||||||
# address = "0.0.0.0"
|
# address = "0.0.0.0"
|
||||||
# The port to serve on.
|
# The port to serve on.
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
<head>
|
<head>
|
||||||
<link data-trunk rel="rust" data-bin="bin" />
|
<link data-trunk rel="rust" data-bin="bin" />
|
||||||
<link data-trunk rel="scss" href="src/styles/main.scss" />
|
<link data-trunk rel="scss" href="src/styles/main.scss" />
|
||||||
|
<link data-trunk rel="icon" href="src/assets/favicon.ico" type="image/x-icon" />
|
||||||
|
<link data-trunk rel="copy-dir" href="src/assets" />
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>Yew App</title>
|
<title>Yew App</title>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
@@ -269,6 +269,7 @@ fn switch(route: Route) -> Html {
|
|||||||
pub fn app() -> Html {
|
pub fn app() -> Html {
|
||||||
html! {
|
html! {
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
|
<basic_pages::Icon/>
|
||||||
<Switch<Route> render={switch} />
|
<Switch<Route> render={switch} />
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,15 +56,11 @@ pub fn home_component() -> Html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
<div class="form-container">
|
<div class="rundbg">
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "Welcome" }</h1>
|
|
||||||
</div>
|
|
||||||
<crate::utilities::TicketCount/>
|
<crate::utilities::TicketCount/>
|
||||||
<div>
|
|
||||||
<p>{ "You are logged in as: " }</p>
|
<p>{ "You are logged in as: " }</p>
|
||||||
<p class="text-muted">{ &*name }</p>
|
<p>{ &*name }</p>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,12 +80,9 @@ pub fn home_component() -> Html {
|
|||||||
pub fn not_found_component() -> Html {
|
pub fn not_found_component() -> Html {
|
||||||
let message = "404 Not found";
|
let message = "404 Not found";
|
||||||
html! {
|
html! {
|
||||||
<div class="form-container">
|
<div>
|
||||||
<div class="empty-state">
|
|
||||||
<h1>{&message}</h1>
|
<h1>{&message}</h1>
|
||||||
<p>{ "The page you are looking for does not exist." }</p>
|
<Link<crate::Route> to={crate::Route::Home}>{ "Zurück zum Start" }</Link<crate::Route>>
|
||||||
<Link<crate::Route> to={crate::Route::Home}>{ "Back to Home" }</Link<crate::Route>>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,13 +102,17 @@ pub fn not_found_component() -> Html {
|
|||||||
#[component(PermissionDenied)]
|
#[component(PermissionDenied)]
|
||||||
pub fn denied_component() -> Html {
|
pub fn denied_component() -> Html {
|
||||||
html! {
|
html! {
|
||||||
<div class="form-container">
|
<div>
|
||||||
<div class="empty-state">
|
<h1>{ "Sie haben nicht die benötigten Rechte um diese Seite aufzurufen" }</h1>
|
||||||
<h1>{ "Access Denied" }</h1>
|
<h3>{ "Wenn sie denken, dass dies ein Fehler ist kontaktieren sie Herrn Winter" }</h3>
|
||||||
<p>{ "Sie haben nicht die benötigten Rechte um diese Seite aufzurufen" }</p>
|
<Link<crate::Route> to={crate::Route::Home}>{ "Zurück zum Start" }</Link<crate::Route>>
|
||||||
<p class="text-muted">{ "Wenn sie denken, dass dies ein Fehler ist kontaktieren sie Herrn Winter" }</p>
|
|
||||||
<Link<crate::Route> to={crate::Route::Home}>{ "Back to Home" }</Link<crate::Route>>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[component(Icon)]
|
||||||
|
pub fn icon_component() -> Html {
|
||||||
|
html! {
|
||||||
|
<img src="assets/csg.png" class="csg-icon" />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -287,17 +287,15 @@ pub fn submit_ticket_component() -> Html {
|
|||||||
let room_valid = (*room).is_some();
|
let room_valid = (*room).is_some();
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
<div class="form-container">
|
<form class="rundbg" {onsubmit}>
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "Create Ticket" }</h1>
|
|
||||||
</div>
|
|
||||||
<form {onsubmit}>
|
|
||||||
<label>{ "Betreff:" }
|
<label>{ "Betreff:" }
|
||||||
<input type="text" value={(*betreff).clone()} oninput={betreff_change}/>
|
<input type="text" value={(*betreff).clone()} oninput={betreff_change}/>
|
||||||
</label>
|
</label>
|
||||||
|
<br/>
|
||||||
<label>{ "Beschreibung:" }
|
<label>{ "Beschreibung:" }
|
||||||
<textarea value={(*description).clone()} oninput={description_change}/>
|
<input type="text" value={(*description).clone()} oninput={description_change}/>
|
||||||
</label>
|
</label>
|
||||||
|
<br/>
|
||||||
<label>{ "Kategorie:" }
|
<label>{ "Kategorie:" }
|
||||||
<select value={(*category).clone()} onchange={category_change}>
|
<select value={(*category).clone()} onchange={category_change}>
|
||||||
<option value="Whiteboard Beamer">{ "Whiteboard Beamer" }</option>
|
<option value="Whiteboard Beamer">{ "Whiteboard Beamer" }</option>
|
||||||
@@ -308,32 +306,33 @@ pub fn submit_ticket_component() -> Html {
|
|||||||
<option value="Sonstiges">{ "Sonstiges" }</option>
|
<option value="Sonstiges">{ "Sonstiges" }</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
<br/>
|
||||||
<label>{ "Raum:" }
|
<label>{ "Raum:" }
|
||||||
<input type="text" value={(*room_input).clone()} oninput={room_change}/>
|
<input type="text" value={(*room_input).clone()} oninput={room_change}/>
|
||||||
</label>
|
</label>
|
||||||
{
|
{
|
||||||
if !room_valid {
|
if !room_valid {
|
||||||
html! {
|
html! {
|
||||||
<p class="alert error">{ "Ungültiger oder nicht erlaubter Raum (z. B. 101, K12, D5)" }</p>
|
<p style="color: red;">{ "Ungültiger oder nicht erlaubter Raum (z. B. 101, K12, D5)" }</p>
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
html! {}
|
html! {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
<br/>
|
||||||
<button type="submit">{ "Send" }</button>
|
<button type="submit">{ "Send" }</button>
|
||||||
|
|
||||||
<Link<crate::Route> to={crate::Route::AllTickets}>{ "View All Tickets" }</Link<crate::Route>>
|
<Link<crate::Route> to={crate::Route::AllTickets}>{ "Tickets ansehen" }</Link<crate::Route>>
|
||||||
|
|
||||||
{
|
{
|
||||||
if let Some(s) = &*status {
|
if let Some(s) = &*status {
|
||||||
html!{ <p class="alert success">{ s }</p> }
|
html!{ <p>{ s }</p> }
|
||||||
} else {
|
} else {
|
||||||
html!{}
|
html!{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -665,11 +664,7 @@ pub fn all_tickets_component() -> Html {
|
|||||||
html! { <p>{ format!("Error: {}", e) }</p> }
|
html! { <p>{ format!("Error: {}", e) }</p> }
|
||||||
} else {
|
} else {
|
||||||
html! {
|
html! {
|
||||||
<div>
|
<ul class= "postits">
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "All Tickets" }</h1>
|
|
||||||
</div>
|
|
||||||
<ul class="ticket-list">
|
|
||||||
{ for tickets.iter().filter(|t| t.status != "Archived" && (if user.is_admin { true } else if let Some(uid) = user.id { t.user_id == uid } else { false })).map(|t| {
|
{ for tickets.iter().filter(|t| t.status != "Archived" && (if user.is_admin { true } else if let Some(uid) = user.id { t.user_id == uid } else { false })).map(|t| {
|
||||||
let status_class = match t.status.as_str() {
|
let status_class = match t.status.as_str() {
|
||||||
"ToDo" => "To-Do",
|
"ToDo" => "To-Do",
|
||||||
@@ -679,17 +674,24 @@ pub fn all_tickets_component() -> Html {
|
|||||||
_ => "To-Do"
|
_ => "To-Do"
|
||||||
};
|
};
|
||||||
html! {
|
html! {
|
||||||
<li key={t.id.to_string()} class={status_class}>
|
<div class={classes!{status_class, "listbox"}}>
|
||||||
<Link<crate::Route> to={crate::Route::TicketById{id: t.id}}><h3>{ format!("{}", t.betreff) }</h3></Link<crate::Route>>
|
<li key={t.id.to_string()}>
|
||||||
|
<Link<crate::Route> to={crate::Route::TicketById{id: t.id}}><h3>{ format!("{} - #{}", t.betreff, t.id) }</h3></Link<crate::Route>>
|
||||||
<p>{ &t.description }</p>
|
<p>{ &t.description }</p>
|
||||||
|
<p>{ match t.status.as_str() {
|
||||||
|
"ToDo" => "Zu tun",
|
||||||
|
"InProgress" => "In Bearbeitung",
|
||||||
|
"Completed" => "Erledigt",
|
||||||
|
"Archived" => "Archiviert",
|
||||||
|
_ => "Ungültiger Status"
|
||||||
|
}}</p>
|
||||||
</li>
|
</li>
|
||||||
}
|
|
||||||
})}
|
</div>
|
||||||
</ul>
|
}})}
|
||||||
<div class="ticket-list-actions">
|
|
||||||
<Link<crate::Route> to={crate::Route::Ticket}>{ "Zurück zur Startseite" }</Link<crate::Route>>
|
<Link<crate::Route> to={crate::Route::Ticket}>{ "Zurück zur Startseite" }</Link<crate::Route>>
|
||||||
</div>
|
</ul>
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -805,23 +807,24 @@ pub fn archived_tickets_component() -> Html {
|
|||||||
html! { <p>{ format!("Error: {}", e) }</p> }
|
html! { <p>{ format!("Error: {}", e) }</p> }
|
||||||
} else {
|
} else {
|
||||||
html! {
|
html! {
|
||||||
<div>
|
<ul>
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "Archivierte Tickets" }</h1>
|
|
||||||
</div>
|
|
||||||
<ul class="ticket-list">
|
|
||||||
{ for tickets.iter().filter(|t| t.status == "Archived" && (user.is_admin || if let Some(uid) = user.id { t.user_id == uid } else { false })).map(|t| html! {
|
{ for tickets.iter().filter(|t| t.status == "Archived" && (user.is_admin || if let Some(uid) = user.id { t.user_id == uid } else { false })).map(|t| html! {
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
<li key={t.id.to_string()}>
|
<li key={t.id.to_string()}>
|
||||||
<Link<crate::Route> to={crate::Route::TicketById{id: t.id}}><h3>{ format!("{}", t.betreff) }</h3></Link<crate::Route>>
|
<Link<crate::Route> to={crate::Route::TicketById{id: t.id}}><h3>{ format!("{} - #{}", t.betreff, t.id) }</h3></Link<crate::Route>>
|
||||||
<p>{ &t.description }</p>
|
<p>{ &t.description }</p>
|
||||||
|
<p>{ match t.status.as_str() {
|
||||||
|
"ToDo" => "Zu tun",
|
||||||
|
"InProgress" => "In Bearbeitung",
|
||||||
|
"Completed" => "Erledigt",
|
||||||
|
"Archived" => "Archiviert",
|
||||||
|
_ => "Ungültiger Status"
|
||||||
|
}}</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
})}
|
})}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-38
@@ -222,11 +222,7 @@ pub fn register_component() -> Html {
|
|||||||
};
|
};
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
<div class="form-container">
|
<form {onsubmit} class="rundbg">
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "Register User" }</h1>
|
|
||||||
</div>
|
|
||||||
<form {onsubmit}>
|
|
||||||
<label>{ "Vorname:" }
|
<label>{ "Vorname:" }
|
||||||
<input type="text" value={(*first_name).clone()} oninput={fn_change}/>
|
<input type="text" value={(*first_name).clone()} oninput={fn_change}/>
|
||||||
</label>
|
</label>
|
||||||
@@ -244,7 +240,6 @@ pub fn register_component() -> Html {
|
|||||||
</label>
|
</label>
|
||||||
<button type="submit">{ "Bestätigen" }</button>
|
<button type="submit">{ "Bestätigen" }</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,12 +328,9 @@ pub fn login_component() -> Html {
|
|||||||
};
|
};
|
||||||
|
|
||||||
html! {
|
html! {
|
||||||
<main class="content">
|
<div>
|
||||||
<div class="form-container">
|
<h1 class="headline">{ "Anmeldung" }</h1>
|
||||||
<div class="page-header">
|
<form {onsubmit} class="rundbg login">
|
||||||
<h1>{ "Login" }</h1>
|
|
||||||
</div>
|
|
||||||
<form {onsubmit}>
|
|
||||||
<input
|
<input
|
||||||
placeholder="username"
|
placeholder="username"
|
||||||
value={(*username).clone()}
|
value={(*username).clone()}
|
||||||
@@ -357,10 +349,9 @@ pub fn login_component() -> Html {
|
|||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
<button type="submit" disabled={*loading}>{ if *loading { "Logging in..." } else { "Login" } }</button>
|
<button type="submit" disabled={*loading}>{ if *loading { "Logging in..." } else { "Login" } }</button>
|
||||||
if !error.is_empty() { <p class="alert error">{(*error).clone()}</p> }
|
if !error.is_empty() { <p style="color:red">{(*error).clone()}</p> }
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,37 +420,18 @@ pub fn all_users_component() -> Html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if *loading {
|
if *loading {
|
||||||
html! {
|
html! {<p>{ "Loading" }</p>}
|
||||||
<div class="form-container">
|
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "All Users" }</h1>
|
|
||||||
</div>
|
|
||||||
<p>{ "Loading..." }</p>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
} else if let Some(e) = &*error {
|
} else if let Some(e) = &*error {
|
||||||
html! {
|
html! { <p>{ format!("Error: {}", e) }</p> }
|
||||||
<div class="form-container">
|
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "All Users" }</h1>
|
|
||||||
</div>
|
|
||||||
<p class="alert error">{ format!("Error: {}", e) }</p>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
html! {
|
html! {
|
||||||
<div class="form-container">
|
<ul class="posti8s">
|
||||||
<div class="page-header">
|
|
||||||
<h1>{ "All Users" }</h1>
|
|
||||||
</div>
|
|
||||||
<ul class="user-list">
|
|
||||||
{ for users.iter().map(|t| html! {
|
{ for users.iter().map(|t| html! {
|
||||||
<li key={t.id.to_string()}>
|
<li key={t.id.to_string()} class="listbox">
|
||||||
<Link<crate::Route> to={crate::Route::UserByID{id: t.id}}><h3>{ format!("{} {}", t.first_name, t.last_name) }</h3></Link<crate::Route>>
|
<Link<crate::Route> to={crate::Route::UserByID{id: t.id}}><h3>{ format!("{} {}- #{}", t.first_name, t.last_name, t.id) }</h3></Link<crate::Route>>
|
||||||
</li>
|
</li>
|
||||||
})}
|
})}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -594,6 +566,7 @@ pub fn user_by_id_component(props: &UserProps) -> Html {
|
|||||||
let last_name = (*last_name).clone();
|
let last_name = (*last_name).clone();
|
||||||
let username = (*username).clone();
|
let username = (*username).clone();
|
||||||
let make_admin = *make_admin;
|
let make_admin = *make_admin;
|
||||||
|
let new_pwd_state = new_pwd.clone();
|
||||||
let new_pwd = (*new_pwd).clone();
|
let new_pwd = (*new_pwd).clone();
|
||||||
|
|
||||||
saving.set(true);
|
saving.set(true);
|
||||||
@@ -628,6 +601,7 @@ pub fn user_by_id_component(props: &UserProps) -> Html {
|
|||||||
if let Ok(updated) = resp.json::<FilteredUser>().await {
|
if let Ok(updated) = resp.json::<FilteredUser>().await {
|
||||||
user_state.set(Some(updated));
|
user_state.set(Some(updated));
|
||||||
}
|
}
|
||||||
|
new_pwd_state.set(String::new());
|
||||||
save_success.set(true);
|
save_success.set(true);
|
||||||
}
|
}
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ pub fn ticket_count_component() -> Html {
|
|||||||
html! {
|
html! {
|
||||||
<div>
|
<div>
|
||||||
<h2>{ "Offene Tickets" }</h2>
|
<h2>{ "Offene Tickets" }</h2>
|
||||||
<h4 class="ticket_count">{ count }</h4>
|
<h4>{ count }</h4>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
@use "variables" as *;
|
@use "variables" as *;
|
||||||
|
|
||||||
@mixin card {
|
@mixin card {
|
||||||
background: $color-container;
|
backgroud: #fff;
|
||||||
border-radius: $border-radius;
|
border-radius: &border-radius;
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 1px 3px rgba(0,0,0,0.06);
|
||||||
padding: $spacing-md;
|
padding: $spacing-md;
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-container-dark;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,3 +3,4 @@
|
|||||||
.u-hidden { display: none !important; }
|
.u-hidden { display: none !important; }
|
||||||
.u-gap-sm { gap: $spacing-sm; }
|
.u-gap-sm { gap: $spacing-sm; }
|
||||||
.text-muted { color: $color-muted; }
|
.text-muted { color: $color-muted; }
|
||||||
|
|
||||||
|
|||||||
@@ -1,34 +1,8 @@
|
|||||||
// Color Palette (Reference Style)
|
$color-bg: #ffffff;
|
||||||
$color-bg: #f0f2f5;
|
$color-sidebar: #570000;
|
||||||
$color-bg-dark: #121212;
|
$color-accent: #2563eb;
|
||||||
$color-container: #ffffff;
|
|
||||||
$color-container-dark: #333333;
|
|
||||||
$color-sidebar: #0f172a;
|
|
||||||
$color-primary: #2b79c2;
|
|
||||||
$color-primary-hover: #1d5fa0;
|
|
||||||
$color-accent: #2b79c2;
|
|
||||||
$color-muted: #6b7280;
|
$color-muted: #6b7280;
|
||||||
$color-text: #111827;
|
|
||||||
$color-text-dark: #e2e2e2;
|
|
||||||
|
|
||||||
// Status Colors
|
|
||||||
$color-status-todo: #ffcccc;
|
|
||||||
$color-status-todo-text: #a00;
|
|
||||||
$color-status-inprogress: #fff3cd;
|
|
||||||
$color-status-inprogress-text: #856404;
|
|
||||||
$color-status-done: #d4edda;
|
|
||||||
$color-status-done-text: #155724;
|
|
||||||
$color-status-archived: #e0e0e0;
|
|
||||||
$color-status-archived-text: #666666;
|
|
||||||
|
|
||||||
// Action Colors
|
|
||||||
$color-logout: #ff4d4d;
|
|
||||||
$color-logout-hover: #e60000;
|
|
||||||
|
|
||||||
// Spacing
|
|
||||||
$spacing-sm: 8px;
|
$spacing-sm: 8px;
|
||||||
$spacing-md: 16px;
|
$spacing-md: 16px;
|
||||||
$spacing-lg: 2rem;
|
$border-radius: 6px;
|
||||||
$border-radius: 0.5rem;
|
$rundbgbackgroundcolor: #a0a0a0;
|
||||||
$border-radius-lg: 10px;
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,82 +0,0 @@
|
|||||||
@use "../variables" as *;
|
|
||||||
|
|
||||||
.ticket-list {
|
|
||||||
list-style: none;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: $spacing-lg;
|
|
||||||
|
|
||||||
li {
|
|
||||||
border-left: 4px solid;
|
|
||||||
padding: 1rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
border-radius: $border-radius-lg;
|
|
||||||
background: $color-container;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-container-dark;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: $spacing-md;
|
|
||||||
color: $color-primary;
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: $color-primary;
|
|
||||||
text-decoration: none;
|
|
||||||
transition: color 0.2s ease-in-out;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: $color-primary-hover;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0.3rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.To-Do {
|
|
||||||
border-left-color: $color-status-todo-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.InProgress {
|
|
||||||
border-left-color: $color-status-inprogress-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.Completed {
|
|
||||||
border-left-color: $color-status-done-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.Archived {
|
|
||||||
border-left-color: $color-status-archived-text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.ticket-list-actions {
|
|
||||||
display: flex;
|
|
||||||
gap: $spacing-md;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin-top: $spacing-lg;
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: inline-block;
|
|
||||||
padding: $spacing-md $spacing-lg;
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
@use "../variables" as *;
|
|
||||||
|
|
||||||
.user-list {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 0;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
li {
|
|
||||||
h3 {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,18 +8,14 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.diagnostics-section {
|
.diagnostics-section {
|
||||||
background-color: $color-container;
|
background-color: $color-bg;
|
||||||
border-radius: $border-radius;
|
border-radius: $border-radius;
|
||||||
padding: $spacing-md;
|
padding: $spacing-md;
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: $color-container-dark;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
margin: 0 0 $spacing-md 0;
|
margin: 0 0 $spacing-md 0;
|
||||||
color: $color-primary;
|
color: #1f2937;
|
||||||
font-size: 1.1rem;
|
font-size: 1.1rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
@@ -31,12 +27,7 @@
|
|||||||
gap: 12px;
|
gap: 12px;
|
||||||
border: 1px solid #e5e7eb;
|
border: 1px solid #e5e7eb;
|
||||||
border-radius: $border-radius;
|
border-radius: $border-radius;
|
||||||
background-color: $color-container;
|
background-color: #f9fafb;
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: $color-container-dark;
|
|
||||||
border-color: #555;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.weekday-bars {
|
.weekday-bars {
|
||||||
@@ -59,7 +50,7 @@
|
|||||||
|
|
||||||
.bar {
|
.bar {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: $color-primary;
|
background-color: $color-accent;
|
||||||
border-radius: 4px 4px 0 0;
|
border-radius: 4px 4px 0 0;
|
||||||
transition: background-color 0.2s ease;
|
transition: background-color 0.2s ease;
|
||||||
|
|
||||||
@@ -85,12 +76,8 @@
|
|||||||
.day {
|
.day {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: $color-text;
|
color: #1f2937;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
color: $color-text-dark;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.value {
|
.value {
|
||||||
@@ -107,12 +94,7 @@
|
|||||||
padding: $spacing-md;
|
padding: $spacing-md;
|
||||||
border: 1px solid #e5e7eb;
|
border: 1px solid #e5e7eb;
|
||||||
border-radius: $border-radius;
|
border-radius: $border-radius;
|
||||||
background-color: $color-container;
|
background-color: #f9fafb;
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: $color-container-dark;
|
|
||||||
border-color: #555;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.room-bar-item {
|
.room-bar-item {
|
||||||
@@ -128,12 +110,8 @@
|
|||||||
.room-label {
|
.room-label {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: $color-text;
|
color: #1f2937;
|
||||||
min-width: 50px;
|
min-width: 50px;
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
color: $color-text-dark;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.room-count {
|
.room-count {
|
||||||
@@ -150,13 +128,9 @@
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
.room-bar {
|
.room-bar {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: $color-primary;
|
background-color: #570000;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,97 +0,0 @@
|
|||||||
@use "../variables" as *;
|
|
||||||
|
|
||||||
.form-container {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: $spacing-lg;
|
|
||||||
margin-bottom: $spacing-lg;
|
|
||||||
|
|
||||||
form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: $spacing-md;
|
|
||||||
|
|
||||||
label {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: $spacing-sm;
|
|
||||||
font-weight: 500;
|
|
||||||
color: $color-text;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
color: $color-text-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input, textarea, select {
|
|
||||||
padding: $spacing-md;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
font-size: 1rem;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: #6b6b6b;
|
|
||||||
color: $color-text-dark;
|
|
||||||
border-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
outline: none;
|
|
||||||
border-color: $color-primary;
|
|
||||||
box-shadow: 0 0 0 2px rgba($color-primary, 0.2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
min-height: 120px;
|
|
||||||
resize: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
align-self: flex-start;
|
|
||||||
padding: $spacing-md $spacing-lg;
|
|
||||||
background-color: $color-primary;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-size: 1rem;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: scale(0.98);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: inline-block;
|
|
||||||
padding: $spacing-md $spacing-lg;
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
text-align: center;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
align-self: flex-start;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 0;
|
|
||||||
|
|
||||||
li h3 {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
.headline {
|
||||||
|
font-size: 40px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
color: #570000;
|
||||||
|
margin-top: 150px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
.csg-icon {
|
||||||
|
position: fixed;
|
||||||
|
top: 1rem;
|
||||||
|
right: 1rem;
|
||||||
|
z-index: 9999;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
@use "../variables" as *;
|
|
||||||
|
|
||||||
.login-btn {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 12px 400px;
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
border-radius: $border-radius-lg;
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 1rem;
|
|
||||||
cursor: pointer;
|
|
||||||
border: none;
|
|
||||||
transition: all 0.2s ease-in-out;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: $color-primary-hover;
|
|
||||||
transform: scale(1.05);
|
|
||||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.logout-btn {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 10px 20px;
|
|
||||||
background: $color-logout;
|
|
||||||
color: white;
|
|
||||||
border-radius: $border-radius-lg;
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: bold;
|
|
||||||
transition: 0.2s ease-in-out;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: $color-logout-hover;
|
|
||||||
transform: scale(1.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,272 +0,0 @@
|
|||||||
@use "../variables" as *;
|
|
||||||
|
|
||||||
.page-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: $spacing-lg;
|
|
||||||
padding-bottom: $spacing-md;
|
|
||||||
border-bottom: 2px solid #e5e7eb;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
border-bottom-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin: 0;
|
|
||||||
color: $color-primary;
|
|
||||||
font-size: 1.75rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-actions {
|
|
||||||
display: flex;
|
|
||||||
gap: $spacing-md;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
|
|
||||||
a, button {
|
|
||||||
display: inline-block;
|
|
||||||
padding: $spacing-md;
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
border: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type="checkbox"] {
|
|
||||||
width: fit-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-list {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
|
||||||
gap: $spacing-lg;
|
|
||||||
margin-top: $spacing-lg;
|
|
||||||
|
|
||||||
.grid-item {
|
|
||||||
background: $color-container;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
padding: $spacing-md;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
||||||
transition: box-shadow 0.2s ease, transform 0.2s ease;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-container-dark;
|
|
||||||
border-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
box-shadow: 0 0 15px rgba(0, 0, 0, 0.15);
|
|
||||||
transform: translateY(-2px);
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
color: $color-primary;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: $spacing-md;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: $spacing-sm 0;
|
|
||||||
color: $color-muted;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-actions {
|
|
||||||
display: flex;
|
|
||||||
gap: $spacing-md;
|
|
||||||
margin-top: $spacing-md;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
|
|
||||||
a, button {
|
|
||||||
flex: 1;
|
|
||||||
min-width: 100px;
|
|
||||||
padding: $spacing-md;
|
|
||||||
border: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: none;
|
|
||||||
text-align: center;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.view, button.view {
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.edit, button.edit {
|
|
||||||
background: #f59e0b;
|
|
||||||
color: white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #d97706;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.delete, button.delete {
|
|
||||||
background: $color-logout;
|
|
||||||
color: white;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-logout-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-container {
|
|
||||||
overflow-x: auto;
|
|
||||||
margin-top: $spacing-lg;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
width: 100%;
|
|
||||||
border-collapse: collapse;
|
|
||||||
background: $color-container;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-container-dark;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead {
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
|
|
||||||
th {
|
|
||||||
padding: $spacing-md;
|
|
||||||
text-align: left;
|
|
||||||
font-weight: 600;
|
|
||||||
border-bottom: 2px solid darken($color-primary, 10%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody {
|
|
||||||
tr {
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
transition: background-color 0.2s ease;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
border-bottom-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #f9fafb;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: #444;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
td {
|
|
||||||
padding: $spacing-md;
|
|
||||||
color: $color-text;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
color: $color-text-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.alert {
|
|
||||||
padding: $spacing-md;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
margin-bottom: $spacing-lg;
|
|
||||||
border-left: 4px solid;
|
|
||||||
|
|
||||||
&.success {
|
|
||||||
background: $color-status-done;
|
|
||||||
color: $color-status-done-text;
|
|
||||||
border-left-color: $color-status-done-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.error {
|
|
||||||
background: $color-status-todo;
|
|
||||||
color: $color-status-todo-text;
|
|
||||||
border-left-color: $color-status-todo-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.warning {
|
|
||||||
background: $color-status-inprogress;
|
|
||||||
color: $color-status-inprogress-text;
|
|
||||||
border-left-color: $color-status-inprogress-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.info {
|
|
||||||
background: #dbeafe;
|
|
||||||
color: #1e40af;
|
|
||||||
border-left-color: #1e40af;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: #1e3a8a;
|
|
||||||
color: #93c5fd;
|
|
||||||
border-left-color: #93c5fd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-spinner {
|
|
||||||
display: inline-block;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
border: 3px solid #e5e7eb;
|
|
||||||
border-top-color: $color-primary;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 0.8s linear infinite;
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
to { transform: rotate(360deg); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-state {
|
|
||||||
text-align: center;
|
|
||||||
padding: $spacing-lg;
|
|
||||||
color: $color-muted;
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 1.1rem;
|
|
||||||
margin-bottom: $spacing-md;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: inline-block;
|
|
||||||
padding: $spacing-md $spacing-lg;
|
|
||||||
background: $color-primary;
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
@use "../variables" as *;
|
|
||||||
|
|
||||||
.setup-container {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
min-height: 100vh;
|
|
||||||
background: $color-bg;
|
|
||||||
padding: $spacing-lg;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-bg-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.setup-box {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 400px;
|
|
||||||
background: $color-container;
|
|
||||||
padding: $spacing-lg;
|
|
||||||
border-radius: 1rem;
|
|
||||||
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-container-dark;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
color: $color-primary;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: $spacing-md;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
text-align: center;
|
|
||||||
color: $color-muted;
|
|
||||||
margin-bottom: $spacing-lg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.setup-form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: $spacing-md;
|
|
||||||
|
|
||||||
.form-group {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: $spacing-sm;
|
|
||||||
|
|
||||||
label {
|
|
||||||
font-weight: 500;
|
|
||||||
color: $color-text;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
color: $color-text-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input {
|
|
||||||
padding: $spacing-md;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
font-size: 1rem;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: #6b6b6b;
|
|
||||||
color: $color-text-dark;
|
|
||||||
border-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus {
|
|
||||||
outline: none;
|
|
||||||
border-color: $color-primary;
|
|
||||||
box-shadow: 0 0 0 2px rgba($color-primary, 0.2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
padding: $spacing-md;
|
|
||||||
background-color: $color-primary;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
font-size: 1rem;
|
|
||||||
font-weight: bold;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
margin-top: $spacing-md;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: $color-primary-hover;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: scale(0.98);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.success-message {
|
|
||||||
background: $color-status-done;
|
|
||||||
color: $color-status-done-text;
|
|
||||||
padding: $spacing-md;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
margin-bottom: $spacing-md;
|
|
||||||
border-left: 4px solid $color-status-done-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-message {
|
|
||||||
background: $color-status-todo;
|
|
||||||
color: $color-status-todo-text;
|
|
||||||
padding: $spacing-md;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
margin-bottom: $spacing-md;
|
|
||||||
border-left: 4px solid $color-status-todo-text;
|
|
||||||
}
|
|
||||||
@@ -4,30 +4,31 @@
|
|||||||
.sidebar {
|
.sidebar {
|
||||||
width: 260px;
|
width: 260px;
|
||||||
background: $color-sidebar;
|
background: $color-sidebar;
|
||||||
color: #fff;
|
color: #fffefe;
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
padding: $spacing-md;
|
padding: $spacing-md;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: $spacing-sm; flex: 1; }
|
ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: $spacing-sm; flex: 1; }
|
||||||
|
|
||||||
a, .menu-toggle {
|
a, .menu-toggle {
|
||||||
color: #fff;
|
color: #ffffff;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
display: block;
|
display: block;
|
||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
border-radius: $border-radius;
|
border-radius: 4px;
|
||||||
transition: background 0.2s ease-in-out;
|
&:hover { background: rgba(158, 45, 1, 0.842); }
|
||||||
&:hover { background: rgba(255,255,255,0.1); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu-toggle { background: transparent; border: none; text-align: left; width: 100%; cursor: pointer; }
|
.menu-toggle { background: #ff5a316c; border: none; text-align: left; width: 100%; cursor: pointer; }
|
||||||
|
|
||||||
.submenu {
|
.submenu {
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
background: rgba(255,255,255,0.05);
|
background: rgba(255,255,255,0.02);
|
||||||
border-radius: $border-radius;
|
border-radius: 4px;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
li { padding: 4px 0; }
|
li { padding: 4px 0; }
|
||||||
}
|
}
|
||||||
@@ -39,14 +40,16 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.logout-button {
|
.logout-button {
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(255, 93, 43, 0.527);
|
||||||
color: #fff;
|
color: #ffffff;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
border: 1px solid rgba(255, 255, 255, 0.801);
|
||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
&:hover { background: rgba(255,255,255,0.15); }
|
||||||
|
&:active { background: rgba(255,255,255,0.2); }
|
||||||
}
|
}
|
||||||
|
|
||||||
&.user { width: 220px; background: darken($color-sidebar, 6%); }
|
&.user { width: 220px; background: darken($color-sidebar, 6%); }
|
||||||
|
|||||||
@@ -1,78 +1,54 @@
|
|||||||
@use "../mixins" as *;
|
@use "../mixins" as *;
|
||||||
@use "../variables" as *;
|
@use "../variables" as *;
|
||||||
|
|
||||||
.ticket {
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
padding: 1rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
border-radius: $border-radius-lg;
|
|
||||||
background: $color-container;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: $color-container-dark;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
margin-top: 0;
|
|
||||||
color: $color-primary;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0.3rem 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.ticket-card {
|
.ticket-card {
|
||||||
@include card();
|
@include card();
|
||||||
border-left: 4px solid $color-primary;
|
border-left: 4px solid $color-accent;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: $spacing-sm;
|
gap: $spacing-sm;
|
||||||
|
|
||||||
.meta { color: $color-muted; font-size: 0.9rem; }
|
.meta { color: $color-muted; font-size: 0.9rem; }
|
||||||
.title { font-weight: 600; }
|
.title { font-weight: 600; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.status {
|
.listbox {
|
||||||
display: inline-block;
|
max-width: auto;
|
||||||
padding: 4px 10px;
|
margin:0 0;
|
||||||
border-radius: 8px;
|
background-color: $rundbgbackgroundcolor;
|
||||||
font-size: 0.8rem;
|
padding-bottom: 96px;
|
||||||
font-weight: bold;
|
color: white;
|
||||||
margin-top: 8px;
|
padding-left: 32px;
|
||||||
|
padding-right: 32px;
|
||||||
|
padding-top: 96px;
|
||||||
|
border-radius: 20px;
|
||||||
|
border-color: #000000;
|
||||||
|
border-style: double;
|
||||||
|
box-shadow: 10px 10px 10px rgba(43, 43, 43, 0.8);
|
||||||
|
font-size: 26px;
|
||||||
|
list-style-type: none;
|
||||||
|
|
||||||
|
|
||||||
&.To-Do {
|
&.To-Do {
|
||||||
background: $color-status-todo;
|
background-color: #b1003b;
|
||||||
color: $color-status-todo-text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.InProgress {
|
&.InProgress {
|
||||||
background: $color-status-inprogress;
|
background-color: #fff385;
|
||||||
color: $color-status-inprogress-text;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.Done {
|
|
||||||
background: $color-status-done;
|
|
||||||
color: $color-status-done-text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.Completed {
|
&.Completed {
|
||||||
background: $color-status-done;
|
background-color: #90ff82;
|
||||||
color: $color-status-done-text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.Archived {
|
&.Archived {
|
||||||
background: $color-status-archived;
|
background-color: #af69ee;
|
||||||
color: $color-status-archived-text;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.ticket_count {
|
.postits {
|
||||||
text-align: center;
|
display: grid;
|
||||||
align-content: center;
|
grid-template-columns: auto auto auto;
|
||||||
color: #005f00;
|
gap: 8px;
|
||||||
border: 2px solid #848484;
|
|
||||||
border-radius: 10px;
|
|
||||||
height: 50px;
|
|
||||||
width: 250px;
|
|
||||||
}
|
}
|
||||||
|
|||||||
+72
-138
@@ -3,173 +3,107 @@
|
|||||||
@use "utilities";
|
@use "utilities";
|
||||||
@use "components/sidebar";
|
@use "components/sidebar";
|
||||||
@use "components/tickets";
|
@use "components/tickets";
|
||||||
@use "components/alltickets";
|
|
||||||
@use "components/allusers";
|
|
||||||
@use "components/forms";
|
|
||||||
@use "components/login";
|
|
||||||
@use "components/diagnostics";
|
@use "components/diagnostics";
|
||||||
@use "components/pages";
|
@use "components/frontpage";
|
||||||
@use "components/setup";
|
@use "components/home";
|
||||||
|
@use "components/icon";
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: variables.$color-bg;
|
background: variables.$color-bg;
|
||||||
font-family: Arial, sans-serif;
|
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
|
||||||
color: variables.$color-text;
|
color: #111827;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: variables.$color-bg-dark;
|
|
||||||
color: variables.$color-text-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input, textarea, select {
|
|
||||||
width: 100%;
|
|
||||||
padding: variables.$spacing-md;
|
|
||||||
font-size: 1rem;
|
|
||||||
border-radius: variables.$border-radius;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background-color: #6b6b6b;
|
|
||||||
color: variables.$color-text-dark;
|
|
||||||
border-color: #555;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
padding: variables.$spacing-md;
|
|
||||||
font-size: 1rem;
|
|
||||||
border-radius: variables.$border-radius;
|
|
||||||
background-color: variables.$color-primary;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
font-weight: bold;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: variables.$color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: variables.$spacing-md;
|
|
||||||
|
|
||||||
label {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: variables.$spacing-sm;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: inline-block;
|
|
||||||
padding: variables.$spacing-md;
|
|
||||||
background: variables.$color-primary;
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
border-radius: variables.$border-radius;
|
|
||||||
text-align: center;
|
|
||||||
transition: background-color 0.2s ease-in-out;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: variables.$color-primary-hover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
max-width: 900px;
|
|
||||||
margin: auto;
|
|
||||||
background: variables.$color-container;
|
|
||||||
padding: variables.$spacing-lg;
|
|
||||||
border-radius: 1rem;
|
|
||||||
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: variables.$color-container-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-with-image {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-with-image img {
|
|
||||||
height: 60px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.admin { display: flex; }
|
.admin { display: flex; }
|
||||||
|
|
||||||
.layout {
|
.layout {
|
||||||
display: flex;
|
display: flex;
|
||||||
min-height: 100vh;
|
height: 100vh;
|
||||||
margin: 0;
|
overflow: hidden;
|
||||||
padding: 0;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar {
|
.sidebar {
|
||||||
width: 260px;
|
width: 260px;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
position: fixed;
|
height: 100%;
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
height: 100vh;
|
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
margin-left: 260px;
|
height: 100%;
|
||||||
padding: variables.$spacing-lg;
|
overflow-y: auto;
|
||||||
|
padding: variables.$spacing-md;
|
||||||
> :first-child {
|
box-sizing: border-box;
|
||||||
max-width: 900px;
|
|
||||||
margin: 0 auto;
|
|
||||||
background: variables.$color-container;
|
|
||||||
padding: variables.$spacing-lg;
|
|
||||||
border-radius: 1rem;
|
|
||||||
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
background: variables.$color-container-dark;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3 {
|
|
||||||
color: variables.$color-primary;
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.sidebar {
|
.sidebar {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
left: -260px;
|
top: 0;
|
||||||
transition: left .3s ease-in-out;
|
bottom: 0;
|
||||||
|
left: -100%;
|
||||||
|
transition: left .2s;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
.sidebar.open {
|
.sidebar.open { left: 0; }
|
||||||
left: 0;
|
.content { margin-left: 0; padding: variables.$spacing-md; box-sizing: border-box; }
|
||||||
}
|
}
|
||||||
.content {
|
|
||||||
margin-left: 0;
|
.rundbg {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
max-width: 40%;
|
||||||
|
margin:0 auto;
|
||||||
|
background-color: variables.$rundbgbackgroundcolor;
|
||||||
|
padding-bottom: 96px;
|
||||||
|
padding-left: 32px;
|
||||||
|
padding-right: 32px;
|
||||||
|
padding-top: 96px;
|
||||||
|
border-radius: 20px;
|
||||||
|
gap: 8px;
|
||||||
|
border-color: #000000;
|
||||||
|
border-style: double;
|
||||||
|
box-shadow: 20px 20px 10px rgb(43, 43, 43);
|
||||||
|
font-size: 26px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
input, select, button {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 16px;
|
||||||
|
font-size: 1.8rem;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
box-shadow: #6d6d6d;
|
||||||
|
box-shadow: 6px 6px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"] {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
margin: 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.login {
|
||||||
|
margin-top: 96px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.setup-form input {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user