summaryrefslogtreecommitdiff
path: root/static/styles
diff options
context:
space:
mode:
authorchers <admin@tilde.tailb619f6.ts.net>2026-07-31 09:18:39 +0000
committerchers <admin@tilde.tailb619f6.ts.net>2026-07-31 09:18:39 +0000
commit7023e4c7c8f158df78b5e71ddc2640290409eca1 (patch)
tree077fb46bdb484bbbf7f9a81fd1d512f66650be10 /static/styles
Update cl-bbsHEADmaster
Diffstat (limited to 'static/styles')
-rw-r--r--static/styles/about.css82
-rw-r--r--static/styles/common.css248
-rw-r--r--static/styles/syntax/colorful.css13
-rw-r--r--static/styles/syntax/simple.css19
-rw-r--r--static/styles/themes/colored.css6
-rw-r--r--static/styles/themes/default.css288
-rw-r--r--static/styles/themes/light.css287
-rw-r--r--static/styles/themes/matrix.css423
-rw-r--r--static/styles/themes/no.css1
9 files changed, 1367 insertions, 0 deletions
diff --git a/static/styles/about.css b/static/styles/about.css
new file mode 100644
index 0000000..d305c5f
--- /dev/null
+++ b/static/styles/about.css
@@ -0,0 +1,82 @@
+@import url("common.css");
+
+body {
+ width: 98%;
+ font-family: serif;
+ margin: 2em auto;
+ max-width: 800px;
+ padding: 0 1em;
+ box-sizing: border-box;
+ background-color: #1c2023;
+ color: #95aec7;
+}
+img {
+ max-width: 100%;
+ height: auto;
+}
+del {
+ text-decoration: none;
+ background-color: #95aec7;
+}
+del:hover {
+ background-color: transparent;
+}
+th {
+ text-align: left;
+ font-weight: normal;
+ text-decoration: underline;
+ padding-bottom: 1em;
+ color: #666666;
+}
+td {
+ padding: 0.2em 2em 0.2em 0;
+}
+pre {
+ background-color: #1f2427;
+ color: #95aec7;
+ padding: 0.4em;
+}
+blockquote {
+ color: #9aae86;
+ border-left: 2px solid #859774;
+ padding-left: 0.5em;
+ margin-left: 0;
+}
+h1 {
+ margin: 0;
+ padding: 0;
+ font-size: 2em;
+ font-weight: bold;
+ color: #c7ae95;
+}
+h2 {
+ margin: 0;
+ padding: 0;
+ font-size: 1.5em;
+ font-weight: bold;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ color: #c7ae95;
+}
+h2 samp {
+ font-size: 0.66em;
+}
+hr {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ height: 1px;
+ background-color: #716356;
+ color: #716356;
+}
+a, a:visited, a:active {
+ color: #c7ae95;
+ text-decoration: none;
+}
+a:hover {
+ text-decoration: underline;
+}
+a:target {
+ background-color: #22272a;
+ text-decoration: underline;
+}
diff --git a/static/styles/common.css b/static/styles/common.css
new file mode 100644
index 0000000..8e385c2
--- /dev/null
+++ b/static/styles/common.css
@@ -0,0 +1,248 @@
+/* Structural and Shared Core Styles for cl-bbs */
+
+/* Base alignment margins and layouts */
+h1 {
+ margin: 0.5em 2% 0.3em 2%;
+}
+
+h2 {
+ margin: 0.5em 2%;
+}
+
+.nav {
+ margin: 0.5em 2% 0.5em 2%;
+}
+
+.preferences-form {
+ margin: 1.5em 2% 2em 2%;
+ padding: 0;
+ max-width: 600px;
+}
+
+.preferences-form p {
+ margin: 0.5em 0;
+}
+
+.theme-options-title {
+ font-weight: bold;
+ margin-bottom: 0.5em;
+}
+
+.theme-selector-container {
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: flex-start !important;
+ gap: 0.8em;
+ width: 100%;
+ margin: 1em 0;
+}
+
+.theme-option-label {
+ display: flex !important;
+ width: auto !important;
+ align-items: center;
+ gap: 0.5em;
+ cursor: pointer;
+ user-select: none;
+ clear: both;
+}
+
+.theme-option-text {
+ text-transform: capitalize;
+}
+
+.preferences-form input[type=submit] {
+ cursor: pointer;
+}
+
+/* Base mobile responsive layout changes */
+@media (max-width: 768px) {
+ .preferences-form {
+ margin: 1.5em 0;
+ }
+}
+
+/* Error page styling */
+.error-container {
+ margin: 2em 2%;
+ padding: 1.5em;
+ border-left: 5px solid red;
+ background-color: #fff8f8;
+ font-family: serif;
+}
+
+.error-container p {
+ margin: 0.5em 0;
+}
+
+.error-container .error-title {
+ color: red;
+ font-size: 1.2em;
+ font-weight: bold;
+ margin-top: 0;
+}
+
+.error-back-button {
+ padding: 8px 16px;
+ font-weight: bold;
+ border-radius: 4px;
+ cursor: pointer;
+}
+
+/* Moderation Panel Styles (Theme-Adaptive) */
+body.moderation {
+ max-width: 900px;
+ margin: 0 auto !important;
+ padding: 1em 2% !important;
+}
+
+body.moderation h1 {
+ margin-left: 0 !important;
+}
+
+body.moderation h2 {
+ margin-left: 0 !important;
+ border-bottom: 1px solid currentColor;
+ padding-bottom: 0.3em;
+}
+
+body.moderation ul {
+ padding-left: 1.5em;
+ margin-top: 1em;
+}
+
+body.moderation li {
+ margin-bottom: 0.8em;
+ display: flex;
+ align-items: center;
+ gap: 1em;
+}
+
+body.moderation form {
+ margin: 0;
+}
+
+body.moderation table {
+ width: 100% !important;
+ margin: 1.5em 0 !important;
+ border-collapse: collapse;
+}
+
+body.moderation th {
+ padding: 8px !important;
+ font-weight: bold;
+}
+
+body.moderation td {
+ padding: 8px !important;
+ vertical-align: middle;
+}
+
+body.moderation dd form {
+ margin-top: 1em;
+ padding: 1em;
+ border: 1px dashed currentColor;
+ opacity: 0.9;
+}
+
+body.moderation dd form p {
+ margin: 0.3em 0;
+}
+
+body.moderation input[type=submit].delete-button {
+ color: #ff3333 !important;
+ border-color: #ff3333 !important;
+ cursor: pointer;
+}
+
+body.moderation input[type=submit].delete-button:hover {
+ background-color: #ff3333 !important;
+ color: white !important;
+}
+
+body.moderation input[type=submit].shame-button {
+ color: #ff9900 !important;
+ border-color: #ff9900 !important;
+ cursor: pointer;
+}
+
+body.moderation input[type=submit].shame-button:hover {
+ background-color: #ff9900 !important;
+ color: white !important;
+}
+
+body.moderation .comment-preview {
+ margin-bottom: 0.5em;
+ padding: 0.5em;
+ background-color: #fafafa;
+ border-left: 3px solid #ccc;
+}
+
+/* Global button reset — all submit inputs and bare buttons share the canonical style */
+input[type=submit],
+button {
+ padding: 4px 10px;
+ font-size: 0.85em;
+ font-family: inherit;
+ background: transparent;
+ color: inherit;
+ border: 1px solid currentColor;
+ cursor: pointer;
+ border-radius: 3px;
+ user-select: none;
+ margin: 0.4em 0;
+}
+
+input[type=submit]:hover,
+button:hover {
+ background-color: rgba(128, 128, 128, 0.15);
+}
+
+input[type=submit]:active,
+button:active {
+ background-color: rgba(128, 128, 128, 0.3);
+}
+
+input[type=submit]:disabled,
+button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+/* Lisp Interactive Snippets & Playground Styles */
+.lisp-btn {
+ padding: 4px 10px;
+ font-size: 0.85em;
+ font-family: inherit;
+ background: transparent;
+ color: inherit;
+ border: 1px solid currentColor;
+ cursor: pointer;
+ border-radius: 3px;
+ user-select: none;
+}
+
+.lisp-btn:hover {
+ background-color: rgba(128, 128, 128, 0.15);
+}
+
+.lisp-btn:active {
+ background-color: rgba(128, 128, 128, 0.3);
+}
+
+.lisp-btn:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+@media (max-width: 768px) {
+ #playground-editor {
+ width: 100% !important;
+ }
+ #playground-output {
+ width: 100% !important;
+ }
+}
+
+/* Syntax highlighting is now handled via separate syntax theme CSS files */
+
diff --git a/static/styles/syntax/colorful.css b/static/styles/syntax/colorful.css
new file mode 100644
index 0000000..217f235
--- /dev/null
+++ b/static/styles/syntax/colorful.css
@@ -0,0 +1,13 @@
+/* Colorful Syntax Highlighting for Lisp (Colorize output) */
+.lisp-code-block .string { color: #d14; }
+.lisp-code-block .comment { color: #998; font-style: italic; }
+.lisp-code-block .symbol { color: #008080; }
+.lisp-code-block .keyword { color: #000080; font-weight: bold; }
+.lisp-code-block .character { color: #099; }
+.lisp-code-block .special { color: #0086B3; }
+.lisp-code-block .paren1 { color: #aa0000; }
+.lisp-code-block .paren2 { color: #00aa00; }
+.lisp-code-block .paren3 { color: #0000aa; }
+.lisp-code-block .paren4 { color: #aaaa00; }
+.lisp-code-block .paren5 { color: #00aaaa; }
+.lisp-code-block .paren6 { color: #aa00aa; }
diff --git a/static/styles/syntax/simple.css b/static/styles/syntax/simple.css
new file mode 100644
index 0000000..ddf0ff5
--- /dev/null
+++ b/static/styles/syntax/simple.css
@@ -0,0 +1,19 @@
+/* Simple Syntax Highlighting for Lisp (Colorize output) */
+.lisp-code-block {
+ background-color: #121214 !important; /* Rich dark background to improve contrast */
+ color: #b0b0b0 !important; /* Slightly lighter/clearer gray for base code */
+ padding: 10px !important;
+}
+
+.lisp-code-block .string { color: #b0b0b0; }
+.lisp-code-block .comment { color: #808080; font-style: italic; }
+.lisp-code-block .symbol { color: #1e90ff; font-style: normal !important; } /* Explicitly remove italic */
+.lisp-code-block .keyword { color: #5c87ff; font-weight: bold; } /* Vibrant royalblue for dark contrast */
+.lisp-code-block .character { color: #b0b0b0; }
+.lisp-code-block .special { color: #b0b0b0; }
+.lisp-code-block .paren1 { color: #b0b0b0; }
+.lisp-code-block .paren2 { color: #b0b0b0; }
+.lisp-code-block .paren3 { color: #b0b0b0; }
+.lisp-code-block .paren4 { color: #b0b0b0; }
+.lisp-code-block .paren5 { color: #b0b0b0; }
+.lisp-code-block .paren6 { color: #b0b0b0; }
diff --git a/static/styles/themes/colored.css b/static/styles/themes/colored.css
new file mode 100644
index 0000000..487d414
--- /dev/null
+++ b/static/styles/themes/colored.css
@@ -0,0 +1,6 @@
+@import url("default.css");
+
+/* Extra styles for random theme */
+dd {
+ transition: background-color 0.3s ease;
+}
diff --git a/static/styles/themes/default.css b/static/styles/themes/default.css
new file mode 100644
index 0000000..79bcd8b
--- /dev/null
+++ b/static/styles/themes/default.css
@@ -0,0 +1,288 @@
+@import url("../common.css");
+
+body {
+ margin: 0;
+ padding: 0;
+ background-color: #1c2023;
+ color: #95aec7;
+ font-family: serif;
+ font-size: 100%;
+}
+/* Board Name */
+h1 {
+ margin: 0.5em 2% 0.3em 2%;
+ padding: 0;
+ font-size: 2em;
+ font-weight: bold;
+}
+/* Headlines */
+h2 {
+ margin: 0.5em 2%;
+ padding: 0.5em 0 0 0;
+ font-size: 1.5em;
+ font-weight: bold;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+/* Links */
+h2 samp {
+ font-size: 0.66em;
+}
+hr {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ height: 1px;
+ background-color: #716356;
+ color: #716356;
+}
+p.newthread {
+ margin: 1em 2% 2em 2%;
+ padding: 1em 2%;
+ background-color: #202427;
+}
+/* boardlist */
+p.boardlist {
+ margin: 0.8em 2% 0 2%;
+ font-size: 0.8em;
+ color: #999;
+}
+
+/* menu */
+p.nav {
+ margin: 0.5em 2% 0.5em 2%;
+ padding: 0;
+ font-size: .9em;
+ font-style: italic;
+}
+/* thread navigation */
+pre.jump {
+ margin: 0 2% -1em 0;
+ padding: 0;
+ font-size: 1em;
+ font-family: serif;
+ font-weight: bold;
+ word-spacing: 1em;
+ text-align: right;
+}
+pre.jump a {
+text-decoration: none;
+}
+a, a:visited, a:active {
+ color: #c7ae95;
+ text-decoration: none;
+}
+a:hover {
+ text-decoration: underline;
+}
+a:target {
+ background-color: #22272a;
+ text-decoration: underline;
+}
+dl {
+ margin: 0.5em 2% 0 2%;
+ padding: 0;
+}
+dt {
+ margin: 0;
+ padding: 0;
+}
+/* post number */
+dt a {
+ font-size: 1.4em;
+}
+/* post date */
+dt code {
+ font-size: 1em;
+ font-family: monospace;
+ color: #8bafd2;
+}
+dt samp {
+ font-size: 1em;
+ font-family: monospace;
+ color: #8bafd2;
+ margin-left: 1%;
+}
+
+dd {
+ margin: 0 2%;
+ padding: 0;
+ line-height: 1.4em;
+}
+dd p {
+ margin: 1em 0;
+ padding: 0;
+ background-color: transparent;
+ word-wrap: break-word;
+}
+
+dd pre, dd code {
+ font-size: 1em;
+ font-family: monospace;
+}
+
+dd pre {
+ margin: 1.2em 0;
+ padding: 2px;
+ color: #95aec7;
+ background-color: #1f2427;
+ line-height: 1.4em;
+ overflow: auto;
+}
+blockquote {
+ border-left: solid 2px #859774;
+ margin: 1em 0 1em 0;
+ padding: 0 0 0 1em;
+ background-color: inherit;
+ color: #9aae86;
+}
+blockquote:hover {
+ background-color: #252b2f;
+}
+
+/* spoilers */
+del {
+ background-color: #95aec7;
+ text-decoration: none;
+}
+del:hover {
+ background-color: transparent;
+}
+/* thread list */
+table {
+ margin: 1em 2%;
+ padding: 0;
+ border-collapse: collapse;
+}
+th {
+ color: #666666;
+ background-color: #1c2023;
+ padding: 0.1em 0.5em;
+ font-family: monospace;
+ font-weight: normal;
+ text-align: left;
+ font-size: 1em;
+}
+td {
+ border: 0;
+ padding: 0.1em 0.5em;
+ line-height: 1em;
+}
+
+tr:nth-child(odd) {
+ background: #252a2e;
+}
+tr:hover {
+ background-color: #536883;
+}
+td p, td pre, td blockquote {
+ margin: .5em 0;
+}
+
+/* forms */
+
+textarea {
+ margin: 0.2em 0 0.2em 0;
+ border: 1px solid #334a68;
+ padding: 2px;
+ max-width: 98%;
+ color: #95aec7;
+ background-color: #293035;
+ font-size: 1em;
+ font-family: monospace;
+}
+input[type=text] {
+ margin: 0.2em 0 0.5em 0;
+ border: 1px solid #334a68;
+ background-color: #293035;
+ color: #95aec7;
+ padding: 2px;
+ max-width: 98%;
+ font-size: 1em;
+ font-family: monospace;
+}
+input[type=checkbox] {
+ border: 1px solid #334a68;
+ background-color: #293035 !important;
+ vertical-align: middle;
+ margin: 0 2px;
+}
+
+fieldset.comment {
+ display: none;
+}
+/* preferences */
+fieldset {
+ border: none;
+}
+ul {
+ margin: 0 0 1em 0;
+ padding: 0 0 1em 1em;
+}
+/* flash messages */
+p.flash {
+ background: transparent;
+ color: red;
+}
+
+/* New Thread Form Styling */
+.newthread-form {
+ margin: 1.5em 2% 2em 2%;
+ padding: 1.5em 2%;
+ background-color: #202427;
+ border: 1px solid #334a68;
+ border-radius: 4px;
+ max-width: 600px;
+}
+.newthread-form h2 {
+ margin: 0 0 1em 0;
+ padding: 0;
+ color: #c7ae95;
+}
+.newthread-form p {
+ margin: 0.5em 0;
+}
+.newthread-form input[type=text], .newthread-form textarea {
+ width: 100%;
+ box-sizing: border-box;
+ padding: 8px;
+ font-size: 1em;
+ border: 1px solid #334a68;
+ background-color: #293035;
+ color: #95aec7;
+ border-radius: 4px;
+}
+p.footer {
+font-size: 0.9em;
+font-family: monospace;
+background: transparent;
+text-align: center;
+}
+
+/* Dark Error page styling */
+.error-container {
+ background-color: #202427;
+ color: #95aec7;
+ border-left: 5px solid #ff3333;
+ font-family: inherit;
+}
+
+.error-container .error-title {
+ color: #ff5555;
+}
+
+.error-back-button {
+ background-color: #293035;
+ color: #95aec7;
+ border: 1px solid #334a68;
+}
+
+.error-back-button:hover {
+ background-color: #536883;
+}
+
+/* Dark Moderation Panel styling overrides */
+body.moderation .comment-preview {
+ background-color: #202427;
+ border-left: 3px solid #334a68;
+}
diff --git a/static/styles/themes/light.css b/static/styles/themes/light.css
new file mode 100644
index 0000000..0e4ee47
--- /dev/null
+++ b/static/styles/themes/light.css
@@ -0,0 +1,287 @@
+@import url("../common.css");
+
+body {
+ margin: 0;
+ padding: 0;
+ background-color: white;
+ color: #000000;
+ font-family: serif;
+ font-size: 100%;
+}
+/* Board Name */
+h1 {
+ margin: 0.5em 2% 0.3em 2%;
+ padding: 0;
+ font-size: 2em;
+ font-weight: bold;
+}
+/* Headlines */
+h2 {
+ margin: 0.5em 2%;
+ padding: 0.5em 0 0 0;
+ font-size: 1.5em;
+ font-weight: bold;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+/* Links */
+h2 samp {
+ font-size: 0.66em;
+}
+hr {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ height: 1px;
+ background-color: #aaaaaa;
+ color: #aaaaaa;
+}
+p.newthread {
+ margin: 1em 2% 2em 2%;
+ padding: 1em 2%;
+ background-color: #efefef;
+}
+/* menu */
+p.nav {
+ margin: 0.5em 2% 0.5em 2%;
+ padding: 0;
+ font-size: .9em;
+ font-style: italic;
+ background-color: white;
+}
+/* thread navigation */
+pre.jump {
+ margin: 0 2% -1em 0;
+ padding: 0;
+ background-color: white;
+ font-size: 1em;
+ font-family: serif;
+ font-weight: bold;
+ word-spacing: 1em;
+ text-align: right;
+}
+pre.jump a {
+text-decoration: none;
+}
+a, a:visited, a:active {
+ color: #882200;
+ text-decoration: none;
+}
+a:hover {
+ text-decoration: underline;
+}
+a:target {
+ background-color: #f3f3f3;
+ text-decoration: underline;
+}
+dl {
+ margin: 0.5em 2% 0 2%;
+ padding: 0;
+}
+dt {
+ margin: 0;
+ padding: 0;
+}
+/* post number */
+dt a {
+ font-size: 1.4em;
+}
+/* post date */
+dt code {
+ font-size: 1em;
+ font-family: monospace;
+ color: #555555;
+}
+dt samp {
+ font-size: 1em;
+ font-family: monospace;
+ margin-left: 1%;
+}
+
+dd {
+ margin: 0 2%;
+ padding: 0;
+ line-height: 1.4em;
+}
+dd p {
+ margin: 1em 0;
+ padding: 0;
+ background-color: transparent;
+ word-wrap: break-word;
+}
+
+dd pre, dd code {
+ font-size: 1em;
+ font-family: monospace;
+}
+
+dd pre {
+ margin: 1.2em 0;
+ padding: 2px;
+ background-color: #f7f7f7;
+ line-height: 1.4em;
+ overflow: auto;
+}
+blockquote {
+ border-left: solid 2px #cccccc;
+ margin: 1em 0 1em 0;
+ padding: 0 0 0 1em;
+ background-color: inherit;
+ color: #555555;
+}
+blockquote:hover {
+ background-color: #fafafa;
+}
+
+/* spoilers */
+del {
+ background-color: #200200;
+ text-decoration: none;
+}
+del:hover {
+ background-color: transparent;
+}
+/* thread list */
+table {
+ margin: 1em 2%;
+ padding: 0;
+ border-collapse: collapse;
+}
+th {
+ color: #666666;
+ padding: 0.1em 0.5em;
+ font-family: monospace;
+ font-weight: normal;
+ text-align: left;
+ font-size: 1em;
+}
+td {
+ border: 0;
+ padding: 0.1em 0.5em;
+// background-color: #fafafa;
+ line-height: 1em;
+}
+
+tr:nth-child(odd) {
+ background: #fafafa;
+}
+tr:hover {
+ background-color: yellow;
+}
+td p, td pre, td blockquote {
+ margin: .5em 0;
+}
+
+/* forms */
+
+textarea {
+ margin: 0.2em 0 0.2em 0;
+ border: 1px solid #bababa;
+ padding: 2px;
+ max-width: 98%;
+ //overflow: hidden;
+
+ font-size: 1em;
+ font-family: monospace;
+}
+input[type=text] {
+ margin: 0.2em 0 0.5em 0;
+ border: 1px solid #bababa;
+ padding: 2px;
+ max-width: 98%;
+ font-size: 1em;
+ font-family: monospace;
+}
+input[type=checkbox] {
+ border: 1px solid #bababa;
+ vertical-align: middle;
+ margin: 0 2px;
+}
+
+fieldset.comment {
+ display: none;
+}
+/* preferences */
+fieldset {
+ border: none;
+}
+ul {
+ margin: 0 0 1em 0;
+ padding: 0 0 1em 1em;
+}
+/* flash messages */
+p.flash {
+ background: transparent;
+ color: red;
+}
+
+p.footer {
+font-size: 0.9em;
+font-family: monospace;
+background: transparent;
+text-align: center;
+}
+
+/* New Thread Form Styling */
+.newthread-form {
+ margin: 1.5em 2% 2em 2%;
+ padding: 1.5em 2%;
+ background-color: #fcfcfc;
+ border: 1px solid #e2e2e2;
+ border-radius: 4px;
+ max-width: 600px;
+}
+.newthread-form h2 {
+ margin: 0 0 1em 0;
+ padding: 0;
+}
+.newthread-form p {
+ margin: 0.5em 0;
+}
+.newthread-form input[type=text], .newthread-form textarea {
+ width: 100%;
+ box-sizing: border-box;
+ padding: 8px;
+ font-size: 1em;
+ border: 1px solid #bababa;
+ border-radius: 4px;
+}
+/* Mobile Responsiveness Rules */
+@media (max-width: 768px) {
+ body {
+ padding: 0.5em 1em;
+ }
+ h1 {
+ font-size: 1.8em;
+ margin: 0.5em 0 0.3em 0;
+ }
+ h2 {
+ font-size: 1.3em;
+ margin: 0 0 0.5em 0;
+ }
+ p.nav {
+ margin: 0.5em 0;
+ line-height: 1.5em;
+ }
+ dl {
+ margin: 0.5em 0;
+ }
+ dd {
+ margin: 0 0 1em 0;
+ }
+ textarea, input[type=text] {
+ width: 100% !important;
+ max-width: 100% !important;
+ box-sizing: border-box;
+ }
+ table {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ margin: 1em 0;
+ }
+ th, td {
+ padding: 0.2em 0.4em;
+ font-size: 0.9em;
+ }
+}
diff --git a/static/styles/themes/matrix.css b/static/styles/themes/matrix.css
new file mode 100644
index 0000000..b1e3766
--- /dev/null
+++ b/static/styles/themes/matrix.css
@@ -0,0 +1,423 @@
+@import url("../common.css");
+
+body {
+ margin: 0;
+ padding: 0;
+ background-color: #0d0d0d;
+ color: #00ff41;
+ font-family: "Courier New", Courier, monospace;
+ font-size: 100%;
+ animation: pulse-glow 4s infinite alternate;
+ text-shadow: 0 0 3px #00ff41;
+}
+
+@keyframes pulse-glow {
+ 0% {
+ text-shadow: 0 0 1px #00ff41, 0 0 3px #00ff41;
+ }
+ 100% {
+ text-shadow: 0 0 2px #00ff41, 0 0 4px #008f11, 0 0 8px #003b00;
+ }
+}
+
+/* Board Name */
+h1 {
+ margin: 0.5em 2% 0.3em 2%;
+ padding: 0;
+ font-size: 2em;
+ font-weight: bold;
+ color: #d1ffdf;
+ text-shadow: 0 0 5px #00ff41, 0 0 10px #00ff41;
+ animation: glitch 1.5s ease-in-out infinite alternate;
+}
+
+@keyframes glitch {
+ 0% { transform: translate(0) }
+ 20% { transform: translate(-2px, 1px) }
+ 40% { transform: translate(-1px, -1px) }
+ 60% { transform: translate(2px, 1px) }
+ 80% { transform: translate(1px, -1px) }
+ 100% { transform: translate(0) }
+}
+
+/* Headlines */
+h2 {
+ margin: 0.5em 2%;
+ padding: 0.5em 0 0 0;
+ font-size: 1.5em;
+ font-weight: bold;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ color: #a4ffbd;
+ text-shadow: 0 0 4px #00ff41;
+}
+
+/* Links */
+h2 samp {
+ font-size: 0.66em;
+}
+hr {
+ border: 0;
+ margin: 1em 0;
+ padding: 0;
+ height: 1px;
+ background: linear-gradient(to right, #0d0d0d, #00ff41, #0d0d0d);
+}
+
+p.newthread {
+ margin: 1em 2% 2em 2%;
+ padding: 1em 2%;
+ background-color: #051405;
+ border: 1px solid #00ff41;
+}
+
+/* boardlist */
+p.boardlist {
+ margin: 0.8em 2% 0 2%;
+ font-size: 0.8em;
+ color: #008f11;
+}
+
+div.newthread-form {
+ border: 1px solid #008f11;
+ padding: 1em;
+ margin: 1em 2%;
+ background-color: rgba(0, 59, 0, 0.2);
+ box-shadow: inset 0 0 5px #003b00;
+ transition: all 0.3s ease;
+}
+
+div.newthread-form:hover {
+ box-shadow: inset 0 0 10px #008f11;
+ border-color: #00ff41;
+}
+
+
+/* menu */
+p.nav {
+ margin: 0.5em 2% 0.5em 2%;
+ padding: 0;
+ font-size: .9em;
+ font-style: italic;
+ font-weight: bold;
+ background-color: #0d0d0d;
+}
+
+/* thread navigation */
+pre.jump {
+ margin: 0 2% -1em 0;
+ padding: 0;
+ background-color: transparent;
+ font-size: 1em;
+ font-family: inherit;
+ font-weight: bold;
+ word-spacing: 1em;
+ text-align: right;
+}
+pre.jump a {
+ text-decoration: none;
+ color: #d1ffdf;
+ transition: text-shadow 0.2s;
+}
+
+pre.jump a:hover {
+ text-shadow: 0 0 8px #00ff41;
+}
+
+a, a:visited, a:active {
+ color: #d1ffdf;
+ text-decoration: none;
+ font-weight: bold;
+ transition: color 0.3s, text-shadow 0.3s;
+}
+a:hover {
+ color: #ffffff;
+ text-shadow: 0 0 5px #00ff41, 0 0 10px #00ff41;
+ text-decoration: underline dashed #00ff41;
+}
+a:target {
+ background-color: #003b00;
+ text-decoration: underline dashed #00ff41;
+}
+dl {
+ margin: 0.5em 2% 0 2%;
+ padding: 0;
+}
+dt {
+ margin: 0;
+ padding: 0;
+}
+/* post number */
+dt a {
+ font-size: 1.4em;
+ color: #008f11;
+ text-shadow: none;
+}
+dt a:hover {
+ color: #00ff41;
+}
+
+/* post date */
+dt code {
+ font-size: 1em;
+ font-family: inherit;
+ color: #008f11;
+ text-shadow: none;
+}
+dt samp {
+ font-size: 1em;
+ font-family: inherit;
+ margin-left: 1%;
+ color: #00ff41;
+ text-shadow: none;
+ font-weight: bold;
+}
+
+dd {
+ margin: 0 2% 1em 2%;
+ padding: 1em;
+ line-height: 1.4em;
+ background: rgba(0, 255, 65, 0.03);
+ border-left: 2px solid #008f11;
+ transition: background 0.3s, border-color 0.3s;
+}
+
+dd:hover {
+ background: rgba(0, 255, 65, 0.08);
+ border-left: 2px solid #00ff41;
+}
+
+dd p {
+ margin: 1em 0;
+ padding: 0;
+ background-color: transparent;
+ word-wrap: break-word;
+}
+
+dd pre, dd code {
+ font-size: 1em;
+ font-family: monospace;
+ text-shadow: none !important;
+}
+
+dd pre {
+ margin: 1.2em 0;
+ padding: 10px;
+ background-color: rgba(0, 0, 0, 0.8);
+ border: 1px dotted #008f11;
+ line-height: 1.4em;
+ overflow: auto;
+ color: #00ff41;
+}
+blockquote {
+ border-left: dashed 2px #008f11;
+ margin: 1em 0 1em 0;
+ padding: 0 0 0 1em;
+ background-color: rgba(0, 59, 0, 0.3);
+ color: #8cffab;
+ font-style: italic;
+}
+blockquote:hover {
+ background-color: rgba(0, 89, 0, 0.4);
+}
+
+/* spoilers */
+del {
+ background-color: #000;
+ color: #000;
+ text-decoration: none;
+ transition: all 0.5s ease;
+ user-select: none;
+}
+del:active, del:hover {
+ background-color: transparent;
+ color: #00ff41;
+ text-shadow: 0 0 3px #00ff41;
+}
+
+/* thread list */
+table {
+ margin: 1em 2%;
+ padding: 0;
+ border-collapse: collapse;
+ width: 96%;
+}
+th {
+ color: #00ff41;
+ padding: 0.5em;
+ font-family: inherit;
+ font-weight: bold;
+ text-align: left;
+ font-size: 1em;
+ border-bottom: 1px solid #008f11;
+ text-transform: uppercase;
+}
+td {
+ border: 0;
+ border-bottom: 1px dashed #003b00;
+ padding: 0.8em 0.5em;
+ line-height: 1.2em;
+}
+
+tr:nth-child(odd) {
+ background: rgba(0, 255, 65, 0.05);
+}
+tr:hover {
+ background-color: rgba(0, 255, 65, 0.2);
+}
+td p, td pre, td blockquote {
+ margin: .5em 0;
+}
+
+/* forms */
+
+textarea, input[type=text] {
+ margin: 0.2em 0 0.2em 0;
+ border: 1px solid #008f11;
+ padding: 5px;
+ max-width: 98%;
+ font-size: 1em;
+ font-family: inherit;
+ background-color: black;
+ color: #00ff41;
+}
+
+textarea:focus, input[type=text]:focus {
+ outline: none;
+ border-color: #00ff41;
+ box-shadow: 0 0 5px rgba(0, 255, 65, 0.5);
+}
+
+input[type=submit], button, .lisp-btn {
+ font-family: inherit;
+ font-weight: bold;
+ font-size: 1em;
+ margin: 0.6em 0;
+ border: 1px solid #00ff41;
+ padding: 5px 15px;
+ background-color: black;
+ color: #00ff41;
+ cursor: pointer;
+ text-transform: uppercase;
+ transition: all 0.2s;
+ box-shadow: 0 0 3px #008f11;
+}
+
+input[type=submit]:hover, button:hover, .lisp-btn:hover {
+ background-color: #00ff41;
+ color: black;
+ box-shadow: 0 0 8px #00ff41;
+}
+
+input[type=submit]:active, button:active, .lisp-btn:active {
+ transform: scale(0.95);
+}
+
+input[type=submit]:disabled, button:disabled, .lisp-btn:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+input[type=checkbox] {
+ border: 1px solid #00ff41;
+ vertical-align: middle;
+ margin: 0 2px;
+ background-color: black;
+}
+
+fieldset.comment {
+ display: none;
+}
+/* preferences */
+fieldset {
+ border: 1px solid #008f11;
+ padding: 1em;
+ margin-top: 1em;
+}
+
+legend {
+ color: #00ff41;
+ font-weight: bold;
+ padding: 0 5px;
+}
+
+select {
+ background-color: black;
+ color: #00ff41;
+ border: 1px solid #008f11;
+ padding: 3px;
+ font-family: inherit;
+}
+
+select:focus {
+ outline: none;
+ border-color: #00ff41;
+ box-shadow: 0 0 5px rgba(0, 255, 65, 0.4);
+}
+
+
+ul {
+ margin: 0 0 1em 0;
+ padding: 0 0 1em 2em;
+ list-style-type: square;
+}
+
+li {
+ margin-bottom: 0.5em;
+}
+
+/* flash messages */
+p.flash {
+ background: rgba(255, 0, 0, 0.2);
+ color: #ff3333;
+ border: 1px solid #ff0000;
+ padding: 10px;
+ text-shadow: none;
+}
+
+p.footer {
+ font-size: 0.8em;
+ font-family: inherit;
+ background: transparent;
+ text-align: center;
+ color: #00aa1a;
+ text-shadow: none;
+ margin-top: 3em;
+ border-top: 1px solid #003b00;
+ padding-top: 1em;
+}
+
+/* Matrix Error page styling */
+.error-container {
+ background-color: #0d0d0d;
+ color: #00ff41;
+ border-left: 5px solid #00ff41;
+ box-shadow: 0 0 5px #003b00;
+ font-family: inherit;
+}
+
+.error-container .error-title {
+ color: #ff3333;
+ text-shadow: 0 0 3px #ff3333;
+}
+
+.error-back-button {
+ background-color: black;
+ color: #00ff41;
+ border: 1px solid #00ff41;
+ box-shadow: 0 0 3px #008f11;
+}
+
+.error-back-button:hover {
+ background-color: #00ff41;
+ color: black;
+ box-shadow: 0 0 8px #00ff41;
+}
+
+/* Matrix Moderation Panel styling overrides */
+body.moderation .comment-preview {
+ background-color: rgba(0, 59, 0, 0.2);
+ border-left: 3px solid #008f11;
+ box-shadow: inset 0 0 3px #003b00;
+}
+\n.lisp-code-block {\n text-shadow: none !important;\n}
diff --git a/static/styles/themes/no.css b/static/styles/themes/no.css
new file mode 100644
index 0000000..1bf0411
--- /dev/null
+++ b/static/styles/themes/no.css
@@ -0,0 +1 @@
+@import url("../common.css");