Skip to content

Commit 41a5d17

Browse files
committed
Site generated at Sun 3 Aug 2025 13:39:34 BST
1 parent 127edc7 commit 41a5d17

147 files changed

Lines changed: 8473 additions & 3 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

about/index.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,49 @@
4949
<link rel="alternate" type="application/rss+xml" title="StackToHeap" href="https://stacktoheap.com/feed.xml">
5050
<link rel="manifest" href="/manifest.json">
5151

52+
<!-- Theme switching script -->
53+
<script>
54+
// Check for saved theme preference or use system preference
55+
function getTheme() {
56+
const savedTheme = localStorage.getItem('theme');
57+
if (savedTheme) {
58+
return savedTheme;
59+
}
60+
61+
// Use system preference if no saved theme
62+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
63+
}
64+
65+
const currentTheme = getTheme();
66+
document.documentElement.setAttribute('data-theme', currentTheme);
67+
68+
// Set the theme controller checkbox state
69+
document.addEventListener('DOMContentLoaded', function() {
70+
const themeController = document.querySelector('.theme-controller');
71+
if (themeController) {
72+
themeController.checked = currentTheme === 'dark';
73+
74+
themeController.addEventListener('change', function() {
75+
const newTheme = this.checked ? 'dark' : 'light';
76+
document.documentElement.setAttribute('data-theme', newTheme);
77+
localStorage.setItem('theme', newTheme);
78+
});
79+
}
80+
81+
// Listen for system theme changes (when user hasn't manually set a preference)
82+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
83+
if (!localStorage.getItem('theme')) {
84+
const systemTheme = e.matches ? 'dark' : 'light';
85+
document.documentElement.setAttribute('data-theme', systemTheme);
86+
if (themeController) {
87+
themeController.checked = systemTheme === 'dark';
88+
}
89+
}
90+
});
91+
});
92+
</script>
93+
94+
5295
<script type="text/javascript">
5396
var _gaq = _gaq || [];
5497
_gaq.push(['_setAccount', 'UA-35693303-1']);
@@ -313,6 +356,19 @@
313356

314357

315358
<li><a href="/feed.xml">RSS</a></li>
359+
<li>
360+
<label class="swap swap-rotate btn btn-ghost btn-sm">
361+
<input type="checkbox" class="theme-controller" value="dark" />
362+
<!-- sun icon -->
363+
<svg class="swap-off fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
364+
<path d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z"/>
365+
</svg>
366+
<!-- moon icon -->
367+
<svg class="swap-on fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
368+
<path d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z"/>
369+
</svg>
370+
</label>
371+
</li>
316372
</ul>
317373
</div>
318374
</div>

archives/2012/index.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,49 @@
5252
<link rel="alternate" type="application/rss+xml" title="StackToHeap" href="https://stacktoheap.com/feed.xml">
5353
<link rel="manifest" href="/manifest.json">
5454

55+
<!-- Theme switching script -->
56+
<script>
57+
// Check for saved theme preference or use system preference
58+
function getTheme() {
59+
const savedTheme = localStorage.getItem('theme');
60+
if (savedTheme) {
61+
return savedTheme;
62+
}
63+
64+
// Use system preference if no saved theme
65+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
66+
}
67+
68+
const currentTheme = getTheme();
69+
document.documentElement.setAttribute('data-theme', currentTheme);
70+
71+
// Set the theme controller checkbox state
72+
document.addEventListener('DOMContentLoaded', function() {
73+
const themeController = document.querySelector('.theme-controller');
74+
if (themeController) {
75+
themeController.checked = currentTheme === 'dark';
76+
77+
themeController.addEventListener('change', function() {
78+
const newTheme = this.checked ? 'dark' : 'light';
79+
document.documentElement.setAttribute('data-theme', newTheme);
80+
localStorage.setItem('theme', newTheme);
81+
});
82+
}
83+
84+
// Listen for system theme changes (when user hasn't manually set a preference)
85+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
86+
if (!localStorage.getItem('theme')) {
87+
const systemTheme = e.matches ? 'dark' : 'light';
88+
document.documentElement.setAttribute('data-theme', systemTheme);
89+
if (themeController) {
90+
themeController.checked = systemTheme === 'dark';
91+
}
92+
}
93+
});
94+
});
95+
</script>
96+
97+
5598
<script type="text/javascript">
5699
var _gaq = _gaq || [];
57100
_gaq.push(['_setAccount', 'UA-35693303-1']);
@@ -316,6 +359,19 @@
316359

317360

318361
<li><a href="/feed.xml">RSS</a></li>
362+
<li>
363+
<label class="swap swap-rotate btn btn-ghost btn-sm">
364+
<input type="checkbox" class="theme-controller" value="dark" />
365+
<!-- sun icon -->
366+
<svg class="swap-off fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
367+
<path d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z"/>
368+
</svg>
369+
<!-- moon icon -->
370+
<svg class="swap-on fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
371+
<path d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z"/>
372+
</svg>
373+
</label>
374+
</li>
319375
</ul>
320376
</div>
321377
</div>

archives/2013/index.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,49 @@
5252
<link rel="alternate" type="application/rss+xml" title="StackToHeap" href="https://stacktoheap.com/feed.xml">
5353
<link rel="manifest" href="/manifest.json">
5454

55+
<!-- Theme switching script -->
56+
<script>
57+
// Check for saved theme preference or use system preference
58+
function getTheme() {
59+
const savedTheme = localStorage.getItem('theme');
60+
if (savedTheme) {
61+
return savedTheme;
62+
}
63+
64+
// Use system preference if no saved theme
65+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
66+
}
67+
68+
const currentTheme = getTheme();
69+
document.documentElement.setAttribute('data-theme', currentTheme);
70+
71+
// Set the theme controller checkbox state
72+
document.addEventListener('DOMContentLoaded', function() {
73+
const themeController = document.querySelector('.theme-controller');
74+
if (themeController) {
75+
themeController.checked = currentTheme === 'dark';
76+
77+
themeController.addEventListener('change', function() {
78+
const newTheme = this.checked ? 'dark' : 'light';
79+
document.documentElement.setAttribute('data-theme', newTheme);
80+
localStorage.setItem('theme', newTheme);
81+
});
82+
}
83+
84+
// Listen for system theme changes (when user hasn't manually set a preference)
85+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
86+
if (!localStorage.getItem('theme')) {
87+
const systemTheme = e.matches ? 'dark' : 'light';
88+
document.documentElement.setAttribute('data-theme', systemTheme);
89+
if (themeController) {
90+
themeController.checked = systemTheme === 'dark';
91+
}
92+
}
93+
});
94+
});
95+
</script>
96+
97+
5598
<script type="text/javascript">
5699
var _gaq = _gaq || [];
57100
_gaq.push(['_setAccount', 'UA-35693303-1']);
@@ -316,6 +359,19 @@
316359

317360

318361
<li><a href="/feed.xml">RSS</a></li>
362+
<li>
363+
<label class="swap swap-rotate btn btn-ghost btn-sm">
364+
<input type="checkbox" class="theme-controller" value="dark" />
365+
<!-- sun icon -->
366+
<svg class="swap-off fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
367+
<path d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z"/>
368+
</svg>
369+
<!-- moon icon -->
370+
<svg class="swap-on fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
371+
<path d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z"/>
372+
</svg>
373+
</label>
374+
</li>
319375
</ul>
320376
</div>
321377
</div>

archives/2015/index.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,49 @@
5252
<link rel="alternate" type="application/rss+xml" title="StackToHeap" href="https://stacktoheap.com/feed.xml">
5353
<link rel="manifest" href="/manifest.json">
5454

55+
<!-- Theme switching script -->
56+
<script>
57+
// Check for saved theme preference or use system preference
58+
function getTheme() {
59+
const savedTheme = localStorage.getItem('theme');
60+
if (savedTheme) {
61+
return savedTheme;
62+
}
63+
64+
// Use system preference if no saved theme
65+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
66+
}
67+
68+
const currentTheme = getTheme();
69+
document.documentElement.setAttribute('data-theme', currentTheme);
70+
71+
// Set the theme controller checkbox state
72+
document.addEventListener('DOMContentLoaded', function() {
73+
const themeController = document.querySelector('.theme-controller');
74+
if (themeController) {
75+
themeController.checked = currentTheme === 'dark';
76+
77+
themeController.addEventListener('change', function() {
78+
const newTheme = this.checked ? 'dark' : 'light';
79+
document.documentElement.setAttribute('data-theme', newTheme);
80+
localStorage.setItem('theme', newTheme);
81+
});
82+
}
83+
84+
// Listen for system theme changes (when user hasn't manually set a preference)
85+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
86+
if (!localStorage.getItem('theme')) {
87+
const systemTheme = e.matches ? 'dark' : 'light';
88+
document.documentElement.setAttribute('data-theme', systemTheme);
89+
if (themeController) {
90+
themeController.checked = systemTheme === 'dark';
91+
}
92+
}
93+
});
94+
});
95+
</script>
96+
97+
5598
<script type="text/javascript">
5699
var _gaq = _gaq || [];
57100
_gaq.push(['_setAccount', 'UA-35693303-1']);
@@ -316,6 +359,19 @@
316359

317360

318361
<li><a href="/feed.xml">RSS</a></li>
362+
<li>
363+
<label class="swap swap-rotate btn btn-ghost btn-sm">
364+
<input type="checkbox" class="theme-controller" value="dark" />
365+
<!-- sun icon -->
366+
<svg class="swap-off fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
367+
<path d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z"/>
368+
</svg>
369+
<!-- moon icon -->
370+
<svg class="swap-on fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
371+
<path d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z"/>
372+
</svg>
373+
</label>
374+
</li>
319375
</ul>
320376
</div>
321377
</div>

archives/2016/index.html

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,49 @@
5252
<link rel="alternate" type="application/rss+xml" title="StackToHeap" href="https://stacktoheap.com/feed.xml">
5353
<link rel="manifest" href="/manifest.json">
5454

55+
<!-- Theme switching script -->
56+
<script>
57+
// Check for saved theme preference or use system preference
58+
function getTheme() {
59+
const savedTheme = localStorage.getItem('theme');
60+
if (savedTheme) {
61+
return savedTheme;
62+
}
63+
64+
// Use system preference if no saved theme
65+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
66+
}
67+
68+
const currentTheme = getTheme();
69+
document.documentElement.setAttribute('data-theme', currentTheme);
70+
71+
// Set the theme controller checkbox state
72+
document.addEventListener('DOMContentLoaded', function() {
73+
const themeController = document.querySelector('.theme-controller');
74+
if (themeController) {
75+
themeController.checked = currentTheme === 'dark';
76+
77+
themeController.addEventListener('change', function() {
78+
const newTheme = this.checked ? 'dark' : 'light';
79+
document.documentElement.setAttribute('data-theme', newTheme);
80+
localStorage.setItem('theme', newTheme);
81+
});
82+
}
83+
84+
// Listen for system theme changes (when user hasn't manually set a preference)
85+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
86+
if (!localStorage.getItem('theme')) {
87+
const systemTheme = e.matches ? 'dark' : 'light';
88+
document.documentElement.setAttribute('data-theme', systemTheme);
89+
if (themeController) {
90+
themeController.checked = systemTheme === 'dark';
91+
}
92+
}
93+
});
94+
});
95+
</script>
96+
97+
5598
<script type="text/javascript">
5699
var _gaq = _gaq || [];
57100
_gaq.push(['_setAccount', 'UA-35693303-1']);
@@ -316,6 +359,19 @@
316359

317360

318361
<li><a href="/feed.xml">RSS</a></li>
362+
<li>
363+
<label class="swap swap-rotate btn btn-ghost btn-sm">
364+
<input type="checkbox" class="theme-controller" value="dark" />
365+
<!-- sun icon -->
366+
<svg class="swap-off fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
367+
<path d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z"/>
368+
</svg>
369+
<!-- moon icon -->
370+
<svg class="swap-on fill-current w-5 h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
371+
<path d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z"/>
372+
</svg>
373+
</label>
374+
</li>
319375
</ul>
320376
</div>
321377
</div>

0 commit comments

Comments
 (0)