<feed xmlns='http://www.w3.org/2005/Atom'>
<title>albumen.git/public/js/slideshow.js, branch v1.1</title>
<subtitle>Ruby/Sinatra photo album</subtitle>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/'/>
<entry>
<title>Reverse default slideshow order to show newest photos first</title>
<updated>2026-05-12T12:35:58+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T12:35:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=67a19fed3ff7ff9a40d489863fcef432cdba0913'/>
<id>67a19fed3ff7ff9a40d489863fcef432cdba0913</id>
<content type='text'>
When not shuffled, reverse SS_ENTRIES so the most recently added
photos play first instead of last.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When not shuffled, reverse SS_ENTRIES so the most recently added
photos play first instead of last.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Move slideshow interval control to album page; fix mobile viewport clipping</title>
<updated>2026-05-12T12:33:17+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T12:33:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=ca717d9625cdd60272226db50f0f148c949565c7'/>
<id>ca717d9625cdd60272226db50f0f148c949565c7</id>
<content type='text'>
- Interval input (default 5 s) now lives beside Shuffle/Full screen on
  the album page; passed as ?interval= param to the slideshow and seeded
  into the hidden ss-interval input on load.
- Added "Interval" label text next to the input.
- Fixed slideshow controls being pushed off-screen on mobile by using
  100dvh (dynamic viewport height) with 100vh as a fallback, so the
  layout accounts for mobile browser chrome.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Interval input (default 5 s) now lives beside Shuffle/Full screen on
  the album page; passed as ?interval= param to the slideshow and seeded
  into the hidden ss-interval input on load.
- Added "Interval" label text next to the input.
- Fixed slideshow controls being pushed off-screen on mobile by using
  100dvh (dynamic viewport height) with 100vh as a fallback, so the
  layout accounts for mobile browser chrome.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix slideshow photos showing too briefly due to preload timing</title>
<updated>2026-05-12T12:00:55+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T12:00:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=a06f0f9b22e0eed2328fb4062b75dd19c7a2c65f'/>
<id>a06f0f9b22e0eed2328fb4062b75dd19c7a2c65f</id>
<content type='text'>
The next timer was starting as soon as ssShow() was called, so preload
time + 500ms crossfade ate into the visible interval. Now the timer
starts only after applyEntry() fires (photo is actually on screen),
guaranteeing each photo gets a full interval of visibility.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The next timer was starting as soon as ssShow() was called, so preload
time + 500ms crossfade ate into the visible interval. Now the timer
starts only after applyEntry() fires (photo is actually on screen),
guaranteeing each photo gets a full interval of visibility.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Keep screen awake during slideshow via Wake Lock API</title>
<updated>2026-05-12T06:12:37+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-12T06:12:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=9072f98160a12945a8706b64b226bdf3ea63ee2d'/>
<id>9072f98160a12945a8706b64b226bdf3ea63ee2d</id>
<content type='text'>
Acquire a screen wake lock when the slideshow is playing; release on
pause or page hide; re-acquire when the tab returns to the foreground.
Failures are silently ignored so older browsers degrade gracefully.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Acquire a screen wake lock when the slideshow is playing; release on
pause or page hide; re-acquire when the tab returns to the foreground.
Failures are silently ignored so older browsers degrade gracefully.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix slideshow timer burst when returning from background tab</title>
<updated>2026-05-11T20:17:05+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-11T20:17:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=e1e93e4ded6d8f8bfa12a99b12abe7e7e3b29775'/>
<id>e1e93e4ded6d8f8bfa12a99b12abe7e7e3b29775</id>
<content type='text'>
Use Page Visibility API to cancel the timer when the tab hides and
reschedule fresh on return, so no queued ticks fire in a burst.
Also fix stale #photo= → ?photo= in stage click-through.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Use Page Visibility API to cancel the timer when the tab hides and
reschedule fresh on return, so no queued ticks fire in a burst.
Also fix stale #photo= → ?photo= in stage click-through.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add slideshow: root-level, shuffle, fullscreen, click-to-album</title>
<updated>2026-05-10T14:38:04+00:00</updated>
<author>
<name>Ken D'Ambrosio</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-10T14:38:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=a7c16b99a4284826ac5ac0ace4ee0f760a548ff4'/>
<id>a7c16b99a4284826ac5ac0ace4ee0f760a548ff4</id>
<content type='text'>
- Root slideshow: all_media_entries walks the full media tree so
  /slideshow/ shows every photo across all albums; Slideshow button
  always appears on the root album page
- Shuffle and Full screen checkboxes sit next to the Slideshow button
  on the album page; options pass as ?shuffle=1&amp;fullscreen=1 URL params
- Fullscreen uses a tap-to-activate overlay (browsers block auto-entry
  on page load); webkit-prefixed for Safari; ⛶ button and F key for
  mid-session toggle
- Fullscreen mode hides controls, counter, caption bar, and site header
- Exiting fullscreen auto-pauses so the current photo stays visible
- Click/tap anywhere in the stage navigates to the photo's album
  lightbox; reads the live src attribute instead of ssIdx to avoid a
  race where ssIdx advances during the cross-fade while the old photo
  is still on screen
- layout.erb excluded from slideshow (layout: false) so the site header
  never appears there
- CSS cache-busted with ?v=2

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Root slideshow: all_media_entries walks the full media tree so
  /slideshow/ shows every photo across all albums; Slideshow button
  always appears on the root album page
- Shuffle and Full screen checkboxes sit next to the Slideshow button
  on the album page; options pass as ?shuffle=1&amp;fullscreen=1 URL params
- Fullscreen uses a tap-to-activate overlay (browsers block auto-entry
  on page load); webkit-prefixed for Safari; ⛶ button and F key for
  mid-session toggle
- Fullscreen mode hides controls, counter, caption bar, and site header
- Exiting fullscreen auto-pauses so the current photo stays visible
- Click/tap anywhere in the stage navigates to the photo's album
  lightbox; reads the live src attribute instead of ssIdx to avoid a
  race where ssIdx advances during the cross-fade while the old photo
  is still on screen
- layout.erb excluded from slideshow (layout: false) so the site header
  never appears there
- CSS cache-busted with ?v=2

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Initial commit — Albumen photo album</title>
<updated>2026-05-09T04:41:03+00:00</updated>
<author>
<name>Ken</name>
<email>ken@jots.org</email>
</author>
<published>2026-05-09T04:41:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.jots.org/albumen.git/commit/?id=c75beda743dfd6af63f512e928d0889d9ead3973'/>
<id>c75beda743dfd6af63f512e928d0889d9ead3973</id>
<content type='text'>
Ruby/Sinatra self-hosted photo album with directory hierarchy,
per-photo captions and visibility, lightbox, slideshow, admin UI,
and Let's Encrypt HTTPS via Apache reverse proxy on prouter.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Ruby/Sinatra self-hosted photo album with directory hierarchy,
per-photo captions and visibility, lightbox, slideshow, admin UI,
and Let's Encrypt HTTPS via Apache reverse proxy on prouter.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
