From 4386421459e9854d9ab7411616ce7619b4abe0f7 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:07:31 +0000 Subject: [PATCH 01/21] Add web/static/themes/win95-beta-neon.css --- web/static/themes/win95-beta-neon.css | 353 ++++++++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 web/static/themes/win95-beta-neon.css diff --git a/web/static/themes/win95-beta-neon.css b/web/static/themes/win95-beta-neon.css new file mode 100644 index 0000000..e2df518 --- /dev/null +++ b/web/static/themes/win95-beta-neon.css @@ -0,0 +1,353 @@ +/* =============================== + Windows 95 — Nostalgia Mode + =============================== */ +/* Palette + notes: + - 3D light: #FFFFFF + - Face: #C0C0C0 + - Dark face: #A0A0A0 + - Shadow: #808080 + - Dark: #000000 + - Title Bar: #000080 + - Text: #000000 +*/ + +html[data-theme="win95"] { + --w95-face: #C0C0C0; + --w95-face-dark: #A0A0A0; + --w95-light: #FFFFFF; + --w95-shadow: #808080; + --w95-dark: #000000; + --w95-blue: #000080; +} + +html[data-theme="win95"] body{ + background:#00808010; /* faint teal tint */ + color:#000; + min-height:100vh; + font-family: "Tahoma","MS Sans Serif",system-ui,Segoe UI,Arial,sans-serif; +} + +/* Selection */ +html[data-theme="win95"] ::selection{ + background:var(--w95-blue); + color:#fff; +} + +/* ---------- Top bar ---------- */ +html[data-theme="win95"] .topbar-wrap{ + background:var(--w95-blue); + border-bottom:2px solid var(--w95-dark); + box-shadow:none; + position: sticky; + top: 0; + z-index: 1000; +} +html[data-theme="win95"] .brand-title, +html[data-theme="win95"] .brand .tagline, +html[data-theme="win95"] .version-link{ + color:#fff !important; + text-decoration:none; +} +html[data-theme="win95"] .version-link:hover{ + text-decoration:underline; +} + +/* ---------- Nav Buttons (Find/Create/Insights) ---------- */ +html[data-theme="win95"] .topbar .nav-btn{ + background:var(--w95-face) !important; + color:#000 !important; + border:2px solid var(--w95-face) !important; + border-top-color:var(--w95-light) !important; + border-left-color:var(--w95-light) !important; + border-right-color:var(--w95-shadow) !important; + border-bottom-color:var(--w95-shadow) !important; + border-radius:0 !important; + display:inline-flex !important; + align-items:center !important; + justify-content:center !important; + padding:6px 14px !important; /* consistent size */ + height:36px !important; /* lock height */ + box-sizing:border-box !important; + font-size:15px !important; + line-height:1 !important; + box-shadow: inset -1px -1px 0 var(--w95-dark) !important; +} +html[data-theme="win95"] .topbar .nav-btn:active{ + border-top-color:var(--w95-shadow) !important; + border-left-color:var(--w95-shadow) !important; + border-right-color:var(--w95-light) !important; + border-bottom-color:var(--w95-light) !important; + box-shadow: inset 1px 1px 0 var(--w95-dark) !important; +} + +/* ---------- Topbar .btn/.btn-success match nav buttons (for CREATE) ---------- */ +html[data-theme="win95"] .topbar .btn, +html[data-theme="win95"] .topbar .btn-success{ + background:var(--w95-face) !important; + color:#000 !important; + border:2px solid var(--w95-face) !important; + border-top-color:var(--w95-light) !important; + border-left-color:var(--w95-light) !important; + border-right-color:var(--w95-shadow) !important; + border-bottom-color:var(--w95-shadow) !important; + border-radius:0 !important; + + display:inline-flex !important; + align-items:center !important; + justify-content:center !important; + + padding:6px 14px !important; + height:36px !important; + box-sizing:border-box !important; + font-size:15px !important; + line-height:1 !important; + + box-shadow: inset -1px -1px 0 var(--w95-dark) !important; +} +html[data-theme="win95"] .topbar .btn:active, +html[data-theme="win95"] .topbar .btn-success:active{ + border-top-color:var(--w95-shadow) !important; + border-left-color:var(--w95-shadow) !important; + border-right-color:var(--w95-light) !important; + border-bottom-color:var(--w95-light) !important; + box-shadow: inset 1px 1px 0 var(--w95-dark) !important; +} + +/* ---------- Username Chip ---------- */ +html[data-theme="win95"] .topbar .user-chip{ + background:var(--w95-face-dark) !important; + color:#000 !important; + border:2px solid var(--w95-face-dark) !important; + border-top-color:var(--w95-light) !important; + border-left-color:var(--w95-light) !important; + border-right-color:var(--w95-shadow) !important; + border-bottom-color:var(--w95-shadow) !important; + border-radius:0 !important; + display:inline-flex !important; + align-items:center !important; + justify-content:center !important; + padding:6px 14px !important; + height:36px !important; + box-sizing:border-box !important; + font-size:15px !important; + line-height:1 !important; + box-shadow: inset -1px -1px 0 var(--w95-dark) !important; +} + +/* ---------- 3D Windows (cards/panels) ---------- */ +html[data-theme="win95"] .card, +html[data-theme="win95"] .result-card, +html[data-theme="win95"] .search-form, +html[data-theme="win95"] .form-card, +html[data-theme="win95"] .mobile-menu-inner, +html[data-theme="win95"] .user-menu{ + background:var(--w95-face); + color:#000; + border: 2px solid var(--w95-face); + border-top-color: var(--w95-light); + border-left-color: var(--w95-light); + border-right-color: var(--w95-shadow); + border-bottom-color: var(--w95-shadow); + border-radius: 0; + box-shadow: 1px 1px 0 var(--w95-dark) inset; +} + +/* Section headers */ +html[data-theme="win95"] .cc-panel-head, +html[data-theme="win95"] .page-title, +html[data-theme="win95"] .cc-panel-title{ + color:#000; +} +html[data-theme="win95"] .cc-kicker, +html[data-theme="win95"] .muted, +html[data-theme="win95"] .page-subtitle, +html[data-theme="win95"] .meta-label, +html[data-theme="win95"] .section-label{ + color:#000; + opacity:.75; +} + +/* Tables */ +html[data-theme="win95"] table{ border-collapse:collapse; } +html[data-theme="win95"] th, +html[data-theme="win95"] td{ + border:1px solid var(--w95-shadow); + background:#DFDFDF; + color:#000; +} + +/* ---------- Inputs ---------- */ +html[data-theme="win95"] .search-input, +html[data-theme="win95"] .form-control, +html[data-theme="win95"] .login-input, +html[data-theme="win95"] .tool-input, +html[data-theme="win95"] textarea{ + background:#fff; + color:#000; + border:2px solid var(--w95-face); + border-top-color:var(--w95-light); + border-left-color:var(--w95-light); + border-right-color:var(--w95-shadow); + border-bottom-color:var(--w95-shadow); + border-radius:0; + box-shadow:none; +} +html[data-theme="win95"] .search-input:focus, +html[data-theme="win95"] .form-control:focus, +html[data-theme="win95"] .login-input:focus, +html[data-theme="win95"] .tool-input:focus{ + outline: 1px dotted #000; +} + +/* ---------- Pills & Chips ---------- */ +html[data-theme="win95"] .check-pill, +html[data-theme="win95"] .chip, +html[data-theme="win95"] .chip-link, +html[data-theme="win95"] .chip-muted{ + background:var(--w95-face); + color:#000; + border:1px solid var(--w95-shadow); + border-radius:0; +} + +/* ---------- Buttons ---------- */ +html[data-theme="win95"] .btn{ + background:var(--w95-face); + color:#000; + border:2px solid var(--w95-face); + border-top-color:var(--w95-light); + border-left-color:var(--w95-light); + border-right-color:var(--w95-shadow); + border-bottom-color:var(--w95-shadow); + border-radius:0; + padding:6px 12px; + box-shadow: inset -1px -1px 0 var(--w95-dark); + cursor: default; +} +html[data-theme="win95"] .btn:active{ + border-top-color:var(--w95-shadow); + border-left-color:var(--w95-shadow); + border-right-color:var(--w95-light); + border-bottom-color:var(--w95-light); + box-shadow: inset 1px 1px 0 var(--w95-dark); +} +html[data-theme="win95"] .btn-danger{ color:#8B0000; } + +/* ---------- Menus ---------- */ +html[data-theme="win95"] .user-menu .menu-item, +html[data-theme="win95"] .mobile-link{ + color:#000; + border-radius:0; +} +html[data-theme="win95"] .user-menu .menu-item:hover, +html[data-theme="win95"] .mobile-link:hover{ + background:var(--w95-blue); + color:#fff; +} + +/* ---------- Messages ---------- */ +html[data-theme="win95"] .msg{ + background:#DFDFDF; + color:#000; + border:2px solid var(--w95-face); + border-top-color:var(--w95-light); + border-left-color:var(--w95-light); + border-right-color:var(--w95-shadow); + border-bottom-color:var(--w95-shadow); + border-radius:0; +} +html[data-theme="win95"] .msg.info { background:#eaf2ff; border-color:#8aaad6; color:#003366; } +html[data-theme="win95"] .msg.success { background:#e8f5e8; border-color:#6aa86a; color:#104010; } +html[data-theme="win95"] .msg.warning { background:#fff7e0; border-color:#d4b96a; color:#5a4100; } +html[data-theme="win95"] .msg.error { background:#fff0f0; border-color:#cc6666; color:#7a1d1d; } + +/* ---------- Links ---------- */ +html[data-theme="win95"] a{ color:#0000EE; } +html[data-theme="win95"] a:hover{ color:#551A8B; text-decoration: underline; } + +/* ---------- Command Center ---------- */ +html[data-theme="win95"] .settings-console .sec-tile{ + background:var(--w95-face); + color:#000; + border:2px solid var(--w95-face); + border-top-color:var(--w95-light); + border-left-color:var(--w95-light); + border-right-color:var(--w95-shadow); + border-bottom-color:var(--w95-shadow); + border-radius:0; +} +html[data-theme="win95"] .settings-console .sec-tile:hover{ + background:#DFDFDF; +} +html[data-theme="win95"] .settings-console .sec-icon{ + background:#DFDFDF; + color:#000; + border:1px solid var(--w95-shadow); + border-right-color:#fff; + border-bottom-color:#fff; + border-radius:0; +} +html[data-theme="win95"] .settings-console .swatch{ + border-radius:0; +} + +/* ---------- Highlights & Validation ---------- */ +html[data-theme="win95"] .mark-hit { + background: #ffff88; + color: #000; + padding: 0 2px; + border: 1px solid #c0c0c0; +} +html[data-theme="win95"] .form-control.scripture-valid, +html[data-theme="win95"] .search-input.scripture-valid { + border: 2px inset #008000; + background: #e8f5e8; +} +html[data-theme="win95"] .form-control.scripture-invalid, +html[data-theme="win95"] .search-input.scripture-invalid { + border: 2px inset #a00000; + background: #fff0f0; +} +html[data-theme="win95"] .scripture-pill-invalid { + background: #ffeaea; + border: 2px outset #cc6666; + color: #7a1d1d; +} +html[data-theme="win95"] .scripture-pill-wol { + background: #e8f4ff; + border: 2px outset #8aaad6; + color: #003366; +} +html[data-theme="win95"] a.chip:hover, +html[data-theme="win95"] .chip-link:hover { + filter: brightness(0.96); + outline: 1px dotted #000; + outline-offset: 1px; +} + +/* ---------- Misc ---------- */ +html[data-theme="win95"] .topbar-wrap.is-scrolled{ + box-shadow:none; + border-bottom-color:#000; +} + +/* ===== Win95 • Beta Neon ===== */ +html[data-theme="win95-beta-neon"] { --w95-blue:#002f6c; } +html[data-theme="win95-beta-neon"] body{ + background: + linear-gradient(135deg, rgba(0,0,0,.02), rgba(0,0,0,.02)), + url("data:image/svg+xml;utf8,\ +\ +\ +\ + \ + \ + \ +\ +\ +\ +BETA BETA BETA BETA\ +BETA BETA BETA BETA\ +") repeat; + background-size: 420px 260px; +} \ No newline at end of file From 90c76418db02feddb06c6cc73419edc69c970ba2 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:08:12 +0000 Subject: [PATCH 02/21] Update web/static/themes/win95-beta-neon.css --- web/static/themes/win95-beta-neon.css | 30 ++++++++++++--------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/web/static/themes/win95-beta-neon.css b/web/static/themes/win95-beta-neon.css index e2df518..58a501e 100644 --- a/web/static/themes/win95-beta-neon.css +++ b/web/static/themes/win95-beta-neon.css @@ -331,23 +331,19 @@ html[data-theme="win95"] .topbar-wrap.is-scrolled{ border-bottom-color:#000; } -/* ===== Win95 • Beta Neon ===== */ -html[data-theme="win95-beta-neon"] { --w95-blue:#002f6c; } -html[data-theme="win95-beta-neon"] body{ +/* ===== Win95 • Beta Grid ===== */ +html[data-theme="win95-beta-grid"] { --w95-blue:#0b3a9a; } +html[data-theme="win95-beta-grid"] body{ background: - linear-gradient(135deg, rgba(0,0,0,.02), rgba(0,0,0,.02)), url("data:image/svg+xml;utf8,\ -\ -\ -\ - \ - \ - \ -\ -\ -\ -BETA BETA BETA BETA\ -BETA BETA BETA BETA\ -") repeat; - background-size: 420px 260px; +\ +\ +\ +BETA BETA BETA\ +BETA BETA BETA\ +\ +\ +\ +") repeat; + background-size: 320px 200px; } \ No newline at end of file From d7e475e41a6c66ae3148b78eca23b6261549aef2 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:08:38 +0000 Subject: [PATCH 03/21] Update web/version.txt --- web/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/version.txt b/web/version.txt index 7fb4b7b..e9c6674 100644 --- a/web/version.txt +++ b/web/version.txt @@ -1 +1 @@ -v4.1.22 \ No newline at end of file +v4.1.23 \ No newline at end of file From bd9db790cbe84c8091bc18b72df84d92db3870c9 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:09:32 +0000 Subject: [PATCH 04/21] Delete web/static/themes/win95-beta-neon.css --- web/static/themes/win95-beta-neon.css | 349 -------------------------- 1 file changed, 349 deletions(-) delete mode 100644 web/static/themes/win95-beta-neon.css diff --git a/web/static/themes/win95-beta-neon.css b/web/static/themes/win95-beta-neon.css deleted file mode 100644 index 58a501e..0000000 --- a/web/static/themes/win95-beta-neon.css +++ /dev/null @@ -1,349 +0,0 @@ -/* =============================== - Windows 95 — Nostalgia Mode - =============================== */ -/* Palette + notes: - - 3D light: #FFFFFF - - Face: #C0C0C0 - - Dark face: #A0A0A0 - - Shadow: #808080 - - Dark: #000000 - - Title Bar: #000080 - - Text: #000000 -*/ - -html[data-theme="win95"] { - --w95-face: #C0C0C0; - --w95-face-dark: #A0A0A0; - --w95-light: #FFFFFF; - --w95-shadow: #808080; - --w95-dark: #000000; - --w95-blue: #000080; -} - -html[data-theme="win95"] body{ - background:#00808010; /* faint teal tint */ - color:#000; - min-height:100vh; - font-family: "Tahoma","MS Sans Serif",system-ui,Segoe UI,Arial,sans-serif; -} - -/* Selection */ -html[data-theme="win95"] ::selection{ - background:var(--w95-blue); - color:#fff; -} - -/* ---------- Top bar ---------- */ -html[data-theme="win95"] .topbar-wrap{ - background:var(--w95-blue); - border-bottom:2px solid var(--w95-dark); - box-shadow:none; - position: sticky; - top: 0; - z-index: 1000; -} -html[data-theme="win95"] .brand-title, -html[data-theme="win95"] .brand .tagline, -html[data-theme="win95"] .version-link{ - color:#fff !important; - text-decoration:none; -} -html[data-theme="win95"] .version-link:hover{ - text-decoration:underline; -} - -/* ---------- Nav Buttons (Find/Create/Insights) ---------- */ -html[data-theme="win95"] .topbar .nav-btn{ - background:var(--w95-face) !important; - color:#000 !important; - border:2px solid var(--w95-face) !important; - border-top-color:var(--w95-light) !important; - border-left-color:var(--w95-light) !important; - border-right-color:var(--w95-shadow) !important; - border-bottom-color:var(--w95-shadow) !important; - border-radius:0 !important; - display:inline-flex !important; - align-items:center !important; - justify-content:center !important; - padding:6px 14px !important; /* consistent size */ - height:36px !important; /* lock height */ - box-sizing:border-box !important; - font-size:15px !important; - line-height:1 !important; - box-shadow: inset -1px -1px 0 var(--w95-dark) !important; -} -html[data-theme="win95"] .topbar .nav-btn:active{ - border-top-color:var(--w95-shadow) !important; - border-left-color:var(--w95-shadow) !important; - border-right-color:var(--w95-light) !important; - border-bottom-color:var(--w95-light) !important; - box-shadow: inset 1px 1px 0 var(--w95-dark) !important; -} - -/* ---------- Topbar .btn/.btn-success match nav buttons (for CREATE) ---------- */ -html[data-theme="win95"] .topbar .btn, -html[data-theme="win95"] .topbar .btn-success{ - background:var(--w95-face) !important; - color:#000 !important; - border:2px solid var(--w95-face) !important; - border-top-color:var(--w95-light) !important; - border-left-color:var(--w95-light) !important; - border-right-color:var(--w95-shadow) !important; - border-bottom-color:var(--w95-shadow) !important; - border-radius:0 !important; - - display:inline-flex !important; - align-items:center !important; - justify-content:center !important; - - padding:6px 14px !important; - height:36px !important; - box-sizing:border-box !important; - font-size:15px !important; - line-height:1 !important; - - box-shadow: inset -1px -1px 0 var(--w95-dark) !important; -} -html[data-theme="win95"] .topbar .btn:active, -html[data-theme="win95"] .topbar .btn-success:active{ - border-top-color:var(--w95-shadow) !important; - border-left-color:var(--w95-shadow) !important; - border-right-color:var(--w95-light) !important; - border-bottom-color:var(--w95-light) !important; - box-shadow: inset 1px 1px 0 var(--w95-dark) !important; -} - -/* ---------- Username Chip ---------- */ -html[data-theme="win95"] .topbar .user-chip{ - background:var(--w95-face-dark) !important; - color:#000 !important; - border:2px solid var(--w95-face-dark) !important; - border-top-color:var(--w95-light) !important; - border-left-color:var(--w95-light) !important; - border-right-color:var(--w95-shadow) !important; - border-bottom-color:var(--w95-shadow) !important; - border-radius:0 !important; - display:inline-flex !important; - align-items:center !important; - justify-content:center !important; - padding:6px 14px !important; - height:36px !important; - box-sizing:border-box !important; - font-size:15px !important; - line-height:1 !important; - box-shadow: inset -1px -1px 0 var(--w95-dark) !important; -} - -/* ---------- 3D Windows (cards/panels) ---------- */ -html[data-theme="win95"] .card, -html[data-theme="win95"] .result-card, -html[data-theme="win95"] .search-form, -html[data-theme="win95"] .form-card, -html[data-theme="win95"] .mobile-menu-inner, -html[data-theme="win95"] .user-menu{ - background:var(--w95-face); - color:#000; - border: 2px solid var(--w95-face); - border-top-color: var(--w95-light); - border-left-color: var(--w95-light); - border-right-color: var(--w95-shadow); - border-bottom-color: var(--w95-shadow); - border-radius: 0; - box-shadow: 1px 1px 0 var(--w95-dark) inset; -} - -/* Section headers */ -html[data-theme="win95"] .cc-panel-head, -html[data-theme="win95"] .page-title, -html[data-theme="win95"] .cc-panel-title{ - color:#000; -} -html[data-theme="win95"] .cc-kicker, -html[data-theme="win95"] .muted, -html[data-theme="win95"] .page-subtitle, -html[data-theme="win95"] .meta-label, -html[data-theme="win95"] .section-label{ - color:#000; - opacity:.75; -} - -/* Tables */ -html[data-theme="win95"] table{ border-collapse:collapse; } -html[data-theme="win95"] th, -html[data-theme="win95"] td{ - border:1px solid var(--w95-shadow); - background:#DFDFDF; - color:#000; -} - -/* ---------- Inputs ---------- */ -html[data-theme="win95"] .search-input, -html[data-theme="win95"] .form-control, -html[data-theme="win95"] .login-input, -html[data-theme="win95"] .tool-input, -html[data-theme="win95"] textarea{ - background:#fff; - color:#000; - border:2px solid var(--w95-face); - border-top-color:var(--w95-light); - border-left-color:var(--w95-light); - border-right-color:var(--w95-shadow); - border-bottom-color:var(--w95-shadow); - border-radius:0; - box-shadow:none; -} -html[data-theme="win95"] .search-input:focus, -html[data-theme="win95"] .form-control:focus, -html[data-theme="win95"] .login-input:focus, -html[data-theme="win95"] .tool-input:focus{ - outline: 1px dotted #000; -} - -/* ---------- Pills & Chips ---------- */ -html[data-theme="win95"] .check-pill, -html[data-theme="win95"] .chip, -html[data-theme="win95"] .chip-link, -html[data-theme="win95"] .chip-muted{ - background:var(--w95-face); - color:#000; - border:1px solid var(--w95-shadow); - border-radius:0; -} - -/* ---------- Buttons ---------- */ -html[data-theme="win95"] .btn{ - background:var(--w95-face); - color:#000; - border:2px solid var(--w95-face); - border-top-color:var(--w95-light); - border-left-color:var(--w95-light); - border-right-color:var(--w95-shadow); - border-bottom-color:var(--w95-shadow); - border-radius:0; - padding:6px 12px; - box-shadow: inset -1px -1px 0 var(--w95-dark); - cursor: default; -} -html[data-theme="win95"] .btn:active{ - border-top-color:var(--w95-shadow); - border-left-color:var(--w95-shadow); - border-right-color:var(--w95-light); - border-bottom-color:var(--w95-light); - box-shadow: inset 1px 1px 0 var(--w95-dark); -} -html[data-theme="win95"] .btn-danger{ color:#8B0000; } - -/* ---------- Menus ---------- */ -html[data-theme="win95"] .user-menu .menu-item, -html[data-theme="win95"] .mobile-link{ - color:#000; - border-radius:0; -} -html[data-theme="win95"] .user-menu .menu-item:hover, -html[data-theme="win95"] .mobile-link:hover{ - background:var(--w95-blue); - color:#fff; -} - -/* ---------- Messages ---------- */ -html[data-theme="win95"] .msg{ - background:#DFDFDF; - color:#000; - border:2px solid var(--w95-face); - border-top-color:var(--w95-light); - border-left-color:var(--w95-light); - border-right-color:var(--w95-shadow); - border-bottom-color:var(--w95-shadow); - border-radius:0; -} -html[data-theme="win95"] .msg.info { background:#eaf2ff; border-color:#8aaad6; color:#003366; } -html[data-theme="win95"] .msg.success { background:#e8f5e8; border-color:#6aa86a; color:#104010; } -html[data-theme="win95"] .msg.warning { background:#fff7e0; border-color:#d4b96a; color:#5a4100; } -html[data-theme="win95"] .msg.error { background:#fff0f0; border-color:#cc6666; color:#7a1d1d; } - -/* ---------- Links ---------- */ -html[data-theme="win95"] a{ color:#0000EE; } -html[data-theme="win95"] a:hover{ color:#551A8B; text-decoration: underline; } - -/* ---------- Command Center ---------- */ -html[data-theme="win95"] .settings-console .sec-tile{ - background:var(--w95-face); - color:#000; - border:2px solid var(--w95-face); - border-top-color:var(--w95-light); - border-left-color:var(--w95-light); - border-right-color:var(--w95-shadow); - border-bottom-color:var(--w95-shadow); - border-radius:0; -} -html[data-theme="win95"] .settings-console .sec-tile:hover{ - background:#DFDFDF; -} -html[data-theme="win95"] .settings-console .sec-icon{ - background:#DFDFDF; - color:#000; - border:1px solid var(--w95-shadow); - border-right-color:#fff; - border-bottom-color:#fff; - border-radius:0; -} -html[data-theme="win95"] .settings-console .swatch{ - border-radius:0; -} - -/* ---------- Highlights & Validation ---------- */ -html[data-theme="win95"] .mark-hit { - background: #ffff88; - color: #000; - padding: 0 2px; - border: 1px solid #c0c0c0; -} -html[data-theme="win95"] .form-control.scripture-valid, -html[data-theme="win95"] .search-input.scripture-valid { - border: 2px inset #008000; - background: #e8f5e8; -} -html[data-theme="win95"] .form-control.scripture-invalid, -html[data-theme="win95"] .search-input.scripture-invalid { - border: 2px inset #a00000; - background: #fff0f0; -} -html[data-theme="win95"] .scripture-pill-invalid { - background: #ffeaea; - border: 2px outset #cc6666; - color: #7a1d1d; -} -html[data-theme="win95"] .scripture-pill-wol { - background: #e8f4ff; - border: 2px outset #8aaad6; - color: #003366; -} -html[data-theme="win95"] a.chip:hover, -html[data-theme="win95"] .chip-link:hover { - filter: brightness(0.96); - outline: 1px dotted #000; - outline-offset: 1px; -} - -/* ---------- Misc ---------- */ -html[data-theme="win95"] .topbar-wrap.is-scrolled{ - box-shadow:none; - border-bottom-color:#000; -} - -/* ===== Win95 • Beta Grid ===== */ -html[data-theme="win95-beta-grid"] { --w95-blue:#0b3a9a; } -html[data-theme="win95-beta-grid"] body{ - background: - url("data:image/svg+xml;utf8,\ -\ -\ -\ -BETA BETA BETA\ -BETA BETA BETA\ -\ -\ -\ -") repeat; - background-size: 320px 200px; -} \ No newline at end of file From 1c019b6c08d720ed24b09d95e448ba12aebedd84 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:17:54 +0000 Subject: [PATCH 05/21] Add web/static/data/wol-pub-codes.v1.json --- web/static/data/wol-pub-codes.v1.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 web/static/data/wol-pub-codes.v1.json diff --git a/web/static/data/wol-pub-codes.v1.json b/web/static/data/wol-pub-codes.v1.json new file mode 100644 index 0000000..e113c2c --- /dev/null +++ b/web/static/data/wol-pub-codes.v1.json @@ -0,0 +1,10 @@ +{ + "pub_codes": [ + "wp", "ws", "yb", "mwb", "w", "g", + "ap", "apf", "be", "bh", "br", "bt", "btg", "cf", "cl", "ct", "dp", + "fg", "fy", "gt", "hb", "im", "ip", "it", "jv", "ka", "kj", "kl", + "lf", "lff", "ll", "ly", "my", "od", "pe", "po", "pt", "rr", "rs", + "sg", "sh", "si", "td", "tp", "tr", "ts", "un", "jy", + "uw", "su", "re", "lvs", "lp", "yy", "yp2", "yp", "sl", "pm" + ] +} \ No newline at end of file From 2cf518b903877c4350ba4cd39565702fd6a55d01 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:18:17 +0000 Subject: [PATCH 06/21] Update web/static/js/source-validator.v1.js --- web/static/js/source-validator.v1.js | 100 +++++++++++++++------------ 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/web/static/js/source-validator.v1.js b/web/static/js/source-validator.v1.js index ea18b2b..95a34cc 100644 --- a/web/static/js/source-validator.v1.js +++ b/web/static/js/source-validator.v1.js @@ -1,22 +1,47 @@ /* source-validator.v1.js Centralizes logic for deciding if a "Source" string should link to WOL. + Loads publication codes from /static/data/wol-pub-codes.v1.json. + Exposes: - SourceValidator.isWOLSource(text) -> boolean - SourceValidator.buildWOLSearchURL(text) -> string */ window.SourceValidator = (function () { - // Publications / codes that produce valid WOL links. - // Added: uw, su, re, lvs, rs (rs was already present). - const PUB_CODES = [ - "wp","ws","yb","mwb","w","g","ap","apf","be","bh","br","bt","btg","cf","cl","ct","dp", - "fg","fy","gt","hb","im","ip","it","jv","ka","kj","kl","lf","lff","ll","ly","my","od", - "pe","po","pt","rr","rs","sg","sh","si","td","tp","tr","ts","un","jy", - "uw","su","re","lvs","lp","yy","yp2","yp","jv","sl","pm"// new - ]; + // ---- Load publication codes (sync so callers can use API immediately) ---- + function loadPubCodesSync() { + try { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "/static/data/wol-pub-codes.v1.json", false); // synchronous + xhr.send(null); + if (xhr.status >= 200 && xhr.status < 300) { + var data = JSON.parse(xhr.responseText || "{}"); + if (data && Array.isArray(data.pub_codes)) { + // de-duplicate and normalize to lowercase strings + var uniq = Object.create(null), out = []; + for (var i = 0; i < data.pub_codes.length; i++) { + var c = String(data.pub_codes[i] || "").trim().toLowerCase(); + if (!c) continue; + if (!uniq[c]) { uniq[c] = 1; out.push(c); } + } + return out; + } + } + } catch (e) { + // fall through to fallback + } + // Fallback (very small set) — only used if JSON cannot be loaded + return ["w", "wp", "ws", "g", "rs"]; + } + + // Publications / codes loaded from JSON + var PUB_CODES = loadPubCodesSync(); + + // Choose the longest matching code at the start (so "ws" beats "w"). + var PUB_CODES_SORTED = PUB_CODES.slice().sort(function (a, b) { return b.length - a.length; }); // Year validation rules (applies only if a year can be parsed from the source). // Watchtower (w/wp/ws) back to 1950; Awake (g) back to 1970. - const YEAR_RULES = [ + var YEAR_RULES = [ { codes: ["w","wp","ws"], minYear: 1950 }, { codes: ["g"], minYear: 1970 } ]; @@ -24,12 +49,10 @@ window.SourceValidator = (function () { // Normalize helper function normalize(s) { return (s || "").trim().toLowerCase(); } - // Choose the longest matching code at the start (so "ws" beats "w"). - const PUB_CODES_SORTED = [...PUB_CODES].sort((a,b)=>b.length-a.length); - function leadingCode(textLower) { - for (const code of PUB_CODES_SORTED) { - if (textLower.startsWith(code)) return code; + for (var i = 0; i < PUB_CODES_SORTED.length; i++) { + var code = PUB_CODES_SORTED[i]; + if (textLower.indexOf(code) === 0) return code; } return null; } @@ -37,60 +60,51 @@ window.SourceValidator = (function () { // Try to extract a year that appears right after the leading code (allow spaces), // accepting either 4-digit (e.g., 1955, 2001) or 2-digit (e.g., 55, 95, 12) forms. function extractYearAfterCode(textLower, code) { - let s = textLower.slice(code.length).trim(); + var s = textLower.slice(code.length).trim(); - // 1) Look for a 4-digit year first - let m = s.match(/\b(1[89]\d{2}|20\d{2})\b/); // 1800-2099 (broad, but OK) - if (m) { - return parseInt(m[1], 10); - } + // 1) Look for a 4-digit year first (1800–2099) + var m = s.match(/\b(1[89]\d{2}|20\d{2})\b/); + if (m) return parseInt(m[1], 10); - // 2) If not found, accept a 2-digit year at the *start* of the remainder, - // or right after an optional space: e.g., "w55 1/1", "w 95", "g70 1/22" + // 2) If not found, accept a 2-digit year at the *start* of the remainder + // (e.g., "w55 1/1", "w 95", "g70 1/22") m = s.match(/^\s*(\d{2})\b/); if (m) { - const yy = parseInt(m[1], 10); - // Infer century based on publication + threshold logic - // - For Watchtower: 50–99 -> 1950–1999; 00–49 -> 2000–2049 - // - For Awake: 70–99 -> 1970–1999; 00–69 -> 2000–2069 - if (code === "g") { - return yy >= 70 ? (1900 + yy) : (2000 + yy); - } - if (code === "w" || code === "wp" || code === "ws") { - return yy >= 50 ? (1900 + yy) : (2000 + yy); - } - // For other pubs, if they ever include 2-digit years, assume 1900+yy≥70 else 2000+yy + var yy = parseInt(m[1], 10); + if (code === "g") return yy >= 70 ? (1900 + yy) : (2000 + yy); + if (code === "w" || code === "wp" || code === "ws") + return yy >= 50 ? (1900 + yy) : (2000 + yy); return yy >= 70 ? (1900 + yy) : (2000 + yy); } - // No recognizable year → don't enforce year limits return null; } function passesYearRuleIfPresent(textLower, code) { - const rule = YEAR_RULES.find(r => r.codes.includes(code)); + var rule = null; + for (var i=0;i= rule.minYear; } function isWOLSource(text) { - const t = normalize(text); + var t = normalize(text); if (!t) return false; - - const code = leadingCode(t); + var code = leadingCode(t); if (!code) return false; - // If starts with a known pub code, it’s WOL-capable — but enforce year rules where applicable. return passesYearRuleIfPresent(t, code); } function buildWOLSearchURL(text) { - const q = encodeURIComponent(text || ""); - return `https://wol.jw.org/en/wol/l/r1/lp-e?q=${q}`; + var q = encodeURIComponent(text || ""); + return "https://wol.jw.org/en/wol/l/r1/lp-e?q=" + q; } - return { isWOLSource, buildWOLSearchURL }; + return { isWOLSource: isWOLSource, buildWOLSearchURL: buildWOLSearchURL }; })(); \ No newline at end of file From b947b942022e8e189179c9d47546aff000539fd1 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:23:13 +0000 Subject: [PATCH 07/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index 4132680..7de7845 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -54,6 +54,7 @@ urlpatterns = [ path("api/get-recent-views/", feat_views.api_get_recent_views, name="api_get_recent_views"), path("settings/", core_views.settings_home, name="settings_home"), path("settings/theme/", core_views.set_theme, name="set_theme"), # ✅ FIXED + path("api/update-pub-codes/", views.api_update_pub_codes, name="api_update_pub_codes"), # --- NEW (PWA) --- re_path( From 1676c774bd21795530c1b9a31ac6842174c43ca1 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:23:46 +0000 Subject: [PATCH 08/21] Update web/core/views.py --- web/core/views.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/web/core/views.py b/web/core/views.py index e28c2c2..315baa1 100644 --- a/web/core/views.py +++ b/web/core/views.py @@ -1245,4 +1245,51 @@ def set_theme(request): request.session["theme"] = theme messages.success(request, f"Theme set to {theme.title()}.") - return redirect("settings_home") \ No newline at end of file + return redirect("settings_home") + +# web/core/views.py +import json +import os +from django.conf import settings +from django.contrib.auth.decorators import login_required, user_passes_test +from django.http import JsonResponse, HttpResponseBadRequest +from django.views.decorators.http import require_POST + +@require_POST +@login_required +@user_passes_test(lambda u: u.is_superuser) +def api_update_pub_codes(request): + """ + Accepts a 'json' field (string) that should parse to {"pub_codes": [..]}. + Normalizes, de-duplicates, and writes to web/static/data/wol-pub-codes.v1.json. + """ + payload = request.POST.get("json") or (request.body.decode("utf-8") if request.body else "") + if not payload: + return HttpResponseBadRequest("Missing 'json'.") + + try: + data = json.loads(payload) + except Exception as e: + return HttpResponseBadRequest(f"Invalid JSON: {e}") + + if not isinstance(data, dict) or "pub_codes" not in data or not isinstance(data["pub_codes"], list): + return HttpResponseBadRequest('JSON must be an object with a "pub_codes" array.') + + # Normalize to unique, lowercase, trimmed strings + seen = set() + codes = [] + for c in data["pub_codes"]: + s = str(c or "").strip().lower() + if s and s not in seen: + seen.add(s) + codes.append(s) + + # Write back to static data file + target_path = os.path.join(settings.BASE_DIR, "web", "static", "data", "wol-pub-codes.v1.json") + try: + with open(target_path, "w", encoding="utf-8") as f: + json.dump({"pub_codes": codes}, f, ensure_ascii=False, indent=2) + except Exception as e: + return HttpResponseBadRequest(f"Could not write file: {e}") + + return JsonResponse({"ok": True, "count": len(codes)}) \ No newline at end of file From 6d63a736cde3cf2b327ec5c22e7a1bf4ad2bac62 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:26:18 +0000 Subject: [PATCH 09/21] Update web/templates/settings/home.html --- web/templates/settings/home.html | 85 ++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/web/templates/settings/home.html b/web/templates/settings/home.html index 4e9c309..eba120e 100644 --- a/web/templates/settings/home.html +++ b/web/templates/settings/home.html @@ -162,6 +162,26 @@ + +
+
+
Comms
+

Publication Codes (JSON)

+
+
+
+ + +
+
+ + +
+
+
+
+ {% endif %} @@ -335,6 +355,71 @@ textarea.tool-input{min-height:140px;resize:vertical;width:100%;} }); window.addEventListener('keydown', (e)=>{ if (e.key === 'Escape' && modal.style.display === 'flex') closeModal(); }); })(); + + // === Publication Codes Editor (superuser) === + (function(){ + const ta = document.getElementById('pubCodesEditor'); + const btnR = document.getElementById('pubCodesReloadBtn'); + const btnS = document.getElementById('pubCodesSaveBtn'); + const stat = document.getElementById('pubCodesStatus'); + if (!ta || !btnR || !btnS) return; // not superuser or card missing + + function setStatus(msg, ok=true){ + if (!stat) return; + stat.textContent = msg; + stat.style.color = ok ? '#64748b' : '#b91c1c'; + } + + async function reloadJSON(){ + try{ + setStatus('Loading…'); + const r = await fetch('/static/data/wol-pub-codes.v1.json', { cache:'no-store' }); + if (!r.ok) throw new Error('HTTP '+r.status); + const data = await r.json(); + ta.value = JSON.stringify(data, null, 2); + setStatus('Loaded.'); + }catch(err){ + setStatus('Failed to load JSON: ' + (err?.message||err), false); + } + } + + async function saveJSON(){ + let parsed; + try{ + parsed = JSON.parse(ta.value); + if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.pub_codes)) + throw new Error('JSON must be an object with a "pub_codes" array.'); + }catch(err){ + setStatus('Invalid JSON: ' + (err?.message||err), false); + return; + } + + try{ + setStatus('Saving…'); + const fd = new FormData(); + fd.append('json', JSON.stringify(parsed)); + const r = await fetch("{% url 'api_update_pub_codes' %}", { + method: 'POST', + body: fd, + credentials: 'same-origin', + headers: { 'X-CSRFToken': (document.cookie.match(/(^|;)\s*csrftoken\s*=\s*([^;]+)/)||[]).pop() || '' } + }); + if (!r.ok) { + const txt = await r.text().catch(()=>String(r.status)); + throw new Error(txt.slice(0,200)); + } + const out = await r.json().catch(()=>({ok:false})); + if (!out.ok) throw new Error('Server rejected the update.'); + setStatus('Saved. ' + out.count + ' codes.'); + }catch(err){ + setStatus('Save failed: ' + (err?.message||err), false); + } + } + + btnR.addEventListener('click', reloadJSON); + btnS.addEventListener('click', saveJSON); + reloadJSON(); // initial load + })(); })(); From 71b1dc353257a046d2361b608d7d71470e0f7ff8 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:27:56 +0000 Subject: [PATCH 10/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index 7de7845..1d2f082 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -1,12 +1,13 @@ # illustrations/urls.py from django.contrib import admin -from django.urls import path, re_path +from django.urls import path, re_path, include from django.contrib.auth import views as auth_views from django.views.generic import TemplateView # NEW: for manifest / service worker / offline from core import views as core_views from core import views_user_features as feat_views # NEW from core import views_tts +from web import views urlpatterns = [ # Core app From e22f523f2c85004a04e924b2edc141abf6cb58f8 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:28:50 +0000 Subject: [PATCH 11/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index 1d2f082..099c021 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -7,7 +7,7 @@ from django.views.generic import TemplateView # NEW: for manifest / service wor from core import views as core_views from core import views_user_features as feat_views # NEW from core import views_tts -from web import views +from web.views import api_update_pub_codes urlpatterns = [ # Core app From 2a5d1d504e092ee8e91068f4f66c93c6922a8a24 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:30:27 +0000 Subject: [PATCH 12/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index 099c021..60cd0da 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -7,7 +7,7 @@ from django.views.generic import TemplateView # NEW: for manifest / service wor from core import views as core_views from core import views_user_features as feat_views # NEW from core import views_tts -from web.views import api_update_pub_codes +from illustrations.web.views import api_update_pub_codes urlpatterns = [ # Core app From 9b9cf0d40077f38458f7b8fba72e497f8649fb25 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:31:59 +0000 Subject: [PATCH 13/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index 60cd0da..dab900b 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -55,7 +55,7 @@ urlpatterns = [ path("api/get-recent-views/", feat_views.api_get_recent_views, name="api_get_recent_views"), path("settings/", core_views.settings_home, name="settings_home"), path("settings/theme/", core_views.set_theme, name="set_theme"), # ✅ FIXED - path("api/update-pub-codes/", views.api_update_pub_codes, name="api_update_pub_codes"), + path("api/update-pub-codes/", api_update_pub_codes, name="api_update_pub_codes"), # --- NEW (PWA) --- re_path( From 5f681ae589b28e3c175a598d61f132d520210b9a Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:33:13 +0000 Subject: [PATCH 14/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index dab900b..c69fd38 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -55,7 +55,7 @@ urlpatterns = [ path("api/get-recent-views/", feat_views.api_get_recent_views, name="api_get_recent_views"), path("settings/", core_views.settings_home, name="settings_home"), path("settings/theme/", core_views.set_theme, name="set_theme"), # ✅ FIXED - path("api/update-pub-codes/", api_update_pub_codes, name="api_update_pub_codes"), + path("api/update-pub-codes/", core_views.api_update_pub_codes, name="api_update_pub_codes"), # --- NEW (PWA) --- re_path( From c888b1995e99a8e8ab686a68d281a7a395e26637 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:37:28 +0000 Subject: [PATCH 15/21] Update web/illustrations/urls.py --- web/illustrations/urls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/web/illustrations/urls.py b/web/illustrations/urls.py index c69fd38..14bf051 100644 --- a/web/illustrations/urls.py +++ b/web/illustrations/urls.py @@ -7,7 +7,6 @@ from django.views.generic import TemplateView # NEW: for manifest / service wor from core import views as core_views from core import views_user_features as feat_views # NEW from core import views_tts -from illustrations.web.views import api_update_pub_codes urlpatterns = [ # Core app From 742c817d397cefe8bc66fc86075c482bd4fcedbf Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:45:50 +0000 Subject: [PATCH 16/21] Update web/templates/settings/home.html --- web/templates/settings/home.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/web/templates/settings/home.html b/web/templates/settings/home.html index eba120e..9a17a61 100644 --- a/web/templates/settings/home.html +++ b/web/templates/settings/home.html @@ -170,15 +170,12 @@
-
-
-
From d1213f68ddb5b13b19a5529612b957f0b03b40d8 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:46:38 +0000 Subject: [PATCH 17/21] Update web/templates/settings/home.html --- web/templates/settings/home.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/templates/settings/home.html b/web/templates/settings/home.html index 9a17a61..f20262a 100644 --- a/web/templates/settings/home.html +++ b/web/templates/settings/home.html @@ -174,8 +174,10 @@ style="width:100%; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">
+
+
From e3bc69f0f878fde1da5ef5af2a4ff4c41920f1a0 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:47:02 +0000 Subject: [PATCH 18/21] Update web/templates/settings/home.html --- web/templates/settings/home.html | 1 - 1 file changed, 1 deletion(-) diff --git a/web/templates/settings/home.html b/web/templates/settings/home.html index f20262a..ae3ea10 100644 --- a/web/templates/settings/home.html +++ b/web/templates/settings/home.html @@ -174,7 +174,6 @@ style="width:100%; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">
-
From 03a5a405f3793dfbf8a6fc647e537ad03e90704e Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Sun, 7 Sep 2025 21:48:03 +0000 Subject: [PATCH 19/21] Update web/templates/settings/home.html --- web/templates/settings/home.html | 1 + 1 file changed, 1 insertion(+) diff --git a/web/templates/settings/home.html b/web/templates/settings/home.html index ae3ea10..f20262a 100644 --- a/web/templates/settings/home.html +++ b/web/templates/settings/home.html @@ -174,6 +174,7 @@ style="width:100%; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">
+
From 59bccd5ca8f36a4a623752f06b4bc93b66a92614 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Tue, 9 Sep 2025 00:39:43 +0000 Subject: [PATCH 20/21] Update web/static/data/wol-pub-codes.v1.json --- web/static/data/wol-pub-codes.v1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/static/data/wol-pub-codes.v1.json b/web/static/data/wol-pub-codes.v1.json index e113c2c..b6cc314 100644 --- a/web/static/data/wol-pub-codes.v1.json +++ b/web/static/data/wol-pub-codes.v1.json @@ -5,6 +5,6 @@ "fg", "fy", "gt", "hb", "im", "ip", "it", "jv", "ka", "kj", "kl", "lf", "lff", "ll", "ly", "my", "od", "pe", "po", "pt", "rr", "rs", "sg", "sh", "si", "td", "tp", "tr", "ts", "un", "jy", - "uw", "su", "re", "lvs", "lp", "yy", "yp2", "yp", "sl", "pm" + "uw", "su", "re", "lvs", "lp", "yy", "yp2", "yp", "sl", "pm", "kc" ] } \ No newline at end of file From 228e52b9a49d751e61b12d0be76ef01fddd3aa39 Mon Sep 17 00:00:00 2001 From: Joshua Laymon Date: Tue, 9 Sep 2025 00:48:05 +0000 Subject: [PATCH 21/21] Update web/version.txt --- web/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/version.txt b/web/version.txt index e9c6674..45596cd 100644 --- a/web/version.txt +++ b/web/version.txt @@ -1 +1 @@ -v4.1.23 \ No newline at end of file +v4.1.24 \ No newline at end of file