From 5fbf454b522fe4a3293d72c967446c0f63604a10 Mon Sep 17 00:00:00 2001
From: trisua <me@trisua.com>
Date: Mon, 23 Jun 2025 21:20:12 -0400
Subject: [PATCH] add: better checkboxes

---
 crates/app/src/assets.rs                    |  2 +-
 crates/app/src/public/css/style.css         | 37 +++++++++++++++++++++
 crates/app/src/public/js/atto.js            |  2 +-
 crates/app/src/routes/mod.rs                |  4 +++
 sql_changes/users_secondary_permissions.sql |  2 ++
 5 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 sql_changes/users_secondary_permissions.sql

diff --git a/crates/app/src/assets.rs b/crates/app/src/assets.rs
index a556acc..08a328d 100644
--- a/crates/app/src/assets.rs
+++ b/crates/app/src/assets.rs
@@ -155,7 +155,7 @@ pub(crate) async fn pull_icon(icon: &str, icons_dir: &str) {
         "https://raw.githubusercontent.com/lucide-icons/lucide/refs/heads/main/icons/{icon}.svg"
     );
 
-    let file_path = PathBufD::current().extend(&[icons_dir, icon]);
+    let file_path = PathBufD::current().extend(&[icons_dir, &format!("{icon}.svg")]);
 
     if exists(&file_path).unwrap() {
         writer.insert(icon.to_string(), read_to_string(&file_path).unwrap());
diff --git a/crates/app/src/public/css/style.css b/crates/app/src/public/css/style.css
index 5e2094b..e41edac 100644
--- a/crates/app/src/public/css/style.css
+++ b/crates/app/src/public/css/style.css
@@ -413,6 +413,43 @@ select:focus {
     overflow-wrap: anywhere;
 }
 
+input[type="checkbox"] {
+    --color: #c9b1bc;
+    appearance: none;
+    border-radius: var(--radius);
+    transition:
+        box-shadow 0.15s,
+        background 0.15s;
+    background-color: var(--color-super-raised);
+    background-position: center;
+    background-origin: padding-box;
+    background-size: 14px;
+    background-repeat: no-repeat;
+    width: 1em !important;
+    height: 1em;
+    outline: none;
+    border: solid 1px var(--color-super-lowered);
+    padding: 0;
+    cursor: pointer;
+    color: var(--color-text-primary);
+}
+
+input[type="checkbox"]:hover {
+    box-shadow: var(--shadow-x-offset) var(--shadow-y-offset) var(--shadow-size)
+        var(--color-shadow);
+}
+
+input[type="checkbox"]:focus {
+    outline: solid 2px var(--color);
+    outline-offset: 2px;
+}
+
+input[type="checkbox"]:checked {
+    border-color: var(--color);
+    background-color: var(--color);
+    background-image: url("/icons/check.svg");
+}
+
 /* pillmenu */
 .pillmenu {
     display: flex;
diff --git a/crates/app/src/public/js/atto.js b/crates/app/src/public/js/atto.js
index 56ac698..56b85f8 100644
--- a/crates/app/src/public/js/atto.js
+++ b/crates/app/src/public/js/atto.js
@@ -919,7 +919,7 @@ media_theme_pref();
             }
 
             if (option.input_element_type === "checkbox") {
-                into_element.innerHTML += `<div class="card flex gap-2">
+                into_element.innerHTML += `<div class="card flex items-center gap-2">
                 <input
                     type="checkbox"
                     onchange="window.set_setting_field${id_key}('${option.key}', event.target.checked)"
diff --git a/crates/app/src/routes/mod.rs b/crates/app/src/routes/mod.rs
index de1b240..d67dc0c 100644
--- a/crates/app/src/routes/mod.rs
+++ b/crates/app/src/routes/mod.rs
@@ -24,6 +24,10 @@ pub fn routes(config: &Config) -> Router {
             "/public",
             get_service(tower_http::services::ServeDir::new(&config.dirs.assets)),
         )
+        .nest_service(
+            "/icons",
+            get_service(tower_http::services::ServeDir::new(&config.dirs.icons)),
+        )
         .nest_service(
             "/reference",
             get_service(tower_http::services::ServeDir::new(&config.dirs.rustdoc)),
diff --git a/sql_changes/users_secondary_permissions.sql b/sql_changes/users_secondary_permissions.sql
new file mode 100644
index 0000000..7172889
--- /dev/null
+++ b/sql_changes/users_secondary_permissions.sql
@@ -0,0 +1,2 @@
+ALTER TABLE users
+ADD COLUMN secondary_permissions INT NOT NULL DEFAULT 1;