]> git.scottworley.com Git - vopamoi/commitdiff
Dark mode
authorScott Worley <scottworley@scottworley.com>
Sun, 22 Oct 2023 11:01:32 +0000 (04:01 -0700)
committerScott Worley <scottworley@scottworley.com>
Sun, 22 Oct 2023 11:01:32 +0000 (04:01 -0700)
Using opacity to darken tags isn't great: It grays the text too much.
But it's a lot simpler than making the tag color depend on dark-mode
state, which would require touching every tag during dark-mode switch,
which would require locking to ensure that a dark-mode switch completes
before another one is started, because tag color calculations are done
asynchronously because crypto's interface forces this.  :(

vopamoi.css
vopamoi.ts

index 0a7e6786d124a65750276444c4ad3dd77f7427ed..4b566f155341d00f947cfdb6037c6c4198e2e3db 100644 (file)
@@ -6,6 +6,9 @@ input {
   margin-left: 1em;
   font-size: 80%;
 }
+body.dark .tag {
+  opacity: 60%;
+}
 span.tag {
   color: white;
   padding: 1px .5em;
@@ -23,10 +26,16 @@ input.tag {
   color: #555;
   white-space: pre;
 }
+body.dark .content, body.dark textarea {
+  color: #bbb;
+}
 textarea {
   width: 90%;
   height: 5em;
 }
+body.dark textarea {
+  background-color: black;
+}
 .hide {
   display: none;
 }
@@ -42,11 +51,17 @@ textarea {
   padding: 0 .2em;
   border-radius: 1em;
 }
+body.dark .statedate { opacity: 60%; }
 .task[data-state=cancelled]     > .statedate { background-color: #fee; }
 .task[data-state=deleted]       > .statedate { background-color: #ddd; }
 .task[data-state=done]          > .statedate { background-color: #efe; }
 .task[data-state=someday-maybe] > .statedate { background-color: #eef; }
 .task[data-state=waiting]       > .statedate { background-color: #faf; }
+body.dark .task[data-state=cancelled]     > .statedate { background-color: #600; }
+body.dark .task[data-state=deleted]       > .statedate { background-color: #222; }
+body.dark .task[data-state=done]          > .statedate { background-color: #060; }
+body.dark .task[data-state=someday-maybe] > .statedate { background-color: #006; }
+body.dark .task[data-state=waiting]       > .statedate { background-color: #303; }
 #ui {
   padding: 15px 10px;
 }
@@ -70,3 +85,7 @@ body {
   border-left: 5px solid var(--view-state-indicator-color);
   border-right: 5px solid var(--view-state-indicator-color);
 }
+body.dark, body.dark input {
+  color: #eee;
+  background-color: black;
+}
index b739747c43158ca458b60eb66e1e8e0d078f7f6a..d5afbecf92a46ee871cf38c74be8deb8468cec5e 100644 (file)
@@ -322,7 +322,7 @@ function BrowserUI() {
     deleted: "Black",
     done: "LawnGreen",
     "someday-maybe": "DeepSkyBlue",
-    todo: "White",
+    todo: "rgb(0 0 0 / 0)",
     waiting: "MediumOrchid",
   };
   var currentTagFilter: TagFilter | null = null;
@@ -692,6 +692,11 @@ function BrowserUI() {
       this.setTagFilter({description: "(untagged)", include: task => task.getElementsByClassName("tag").length === 0});
     },
 
+    toggleDark: function () {
+      document.body.classList.toggle("dark");
+      this.setView(currentViewState);
+    },
+
     undo: function () {
       const ret = ui.undo();
       if (ret && ret instanceof HTMLElement) ret.focus();
@@ -774,6 +779,7 @@ function handleKey(event: any) {
       if (event.key == "a") return browserUI.setView("all");
       if (event.key == "C") return browserUI.setView("cancelled");
       if (event.key == "c") return browserUI.setTagView("comp");
+      if (event.key == "D") return browserUI.toggleDark();
       if (event.key == "d") return browserUI.setView("done");
       if (event.key == "e") return browserUI.setTagView("errand");
       if (event.key == "h") return browserUI.setTagView("home");