Skip to content

Commit 2025e0b

Browse files
Dale-Blackclaude
andcommitted
Add dark mode toggle to JST docs (same as Therapy.jl)
- DarkModeToggle component: module-level shared signal, js() for classList/localStorage - Added to nav bar alongside GitHub icon - Head script reads localStorage → OS preference → sets dark class before render - Persists across page loads Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 2a7e63e commit 2025e0b

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# ── DarkModeToggle ──
2+
# Module-level signal — shared across ALL DarkModeToggle instances on the page.
3+
# The nav bar toggle and the examples page toggle stay in sync automatically.
4+
# This follows the standard pattern: create_signal at file scope, capture in @island.
5+
6+
const dark_mode = create_signal(0)
7+
8+
@island function DarkModeToggle()
9+
# Capture the module-level signal (auto-detected as shared by the compiler)
10+
is_dark, set_dark = dark_mode
11+
12+
# Sync signal with actual DOM state on hydration
13+
# (head script already set 'dark' class from localStorage/OS preference)
14+
js("if(document.documentElement.classList.contains('dark'))\$1(1)", set_dark)
15+
16+
return Button(
17+
:on_click => () -> begin
18+
set_dark(1 - is_dark())
19+
js("document.documentElement.classList.toggle('dark')")
20+
js("var bp = document.documentElement.getAttribute('data-base-path') || ''")
21+
js("var sk = bp ? 'therapy-theme:' + bp : 'therapy-theme'")
22+
js("localStorage.setItem(sk, document.documentElement.classList.contains('dark') ? 'dark' : 'light')")
23+
end,
24+
:class => "text-warm-500 dark:text-warm-400 hover:text-warm-700 dark:hover:text-warm-300 transition-colors cursor-pointer",
25+
RawHtml("""<svg class="w-5 h-5 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg class="w-5 h-5 hidden dark:block" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>""")
26+
)
27+
end

docs/src/components/Layout.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ function Layout(content)
2626
A(:href => "https://github.com/GroupTherapyOrg/JavaScriptTarget.jl", :target => "_blank",
2727
:class => "text-warm-600 dark:text-warm-400 hover:text-warm-700 dark:hover:text-warm-300 transition-colors",
2828
RawHtml("""<svg class="w-5 h-5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>""")
29-
)
29+
),
30+
DarkModeToggle()
3031
)
3132
)
3233
),

0 commit comments

Comments
 (0)