countdown() timer no longer provides global
styles for all other countdown timers. Instead, use
countdown_style() with the same style-related arguments to
set global styles for all countdown timers. (#36)The countdown JavaScript implementation was entirely re-written
as a custom <countdown-timer> element. This improves
lifecycle management of the timer component, making it possible to use
countdown timers with dynamic UI in Shiny apps. (#59)
Rewritten countdown timer CSS now uses CSS variables rather than a template rendered in R. This improves how countdown’s dependencies are handled and makes it easier to customize and use countdown in other projects and settings. (#36)
Implemented emitting of native browser events alongside Shiny communication. (#37)
Added two new event types: "finished" when the timer
completes its cycle and "warning" when it reaches the
warning period. (#37)
Set class = "inline" in countdown() to
create an inline, rather than absolute-positioned, countdown timer.
(#36)
Set class = "no-controls" in
countdown() to create a countdown timer without the
controls. (#40)
Fixed an issue where custom URLs for play_sound were
not used for the timer end sound. (thanks @jannismain, #38)
Fixed countdown_fullscreen() not passing along
class and start_immediately parameters.
(#43)
Switched to using {bslib} to stylize the demo
countdown shiny app. (#37)
Clarified play_sound documentation to emphasize
custom sounds require the countdown clock to be embedded in
a website, presentation, or Shiny app to be played due to JavaScript
limitations on local files. (#44)
{countdown} now uses {prismatic} for color calculations.
The JavaScript implementation of countdown has been completely rewritten. It now supports a wide range of new interactions:
Start, pause, and reset the timer (click, click again, double click).
+ or - buttons to bump timer up or
down.
Keyboard shortcuts: Space/Enter to start/stop, Escape to reset, and up/down arrows to bump timer.
The timers now work on mobile devices (in particular in xaringan slides).
countdown timers can now be used in or controlled by Shiny apps:
Use countdown_update() to update key initial timer
settings.
Use countdown_action() to trigger common action:
start, stop, reset, bump up or bump down.
State changes are reported back to the Shiny app, e.g. Shiny apps
can use input$timer to receive event data from the timer
with id = "timer".
countdown_shiny_example() runs a Shiny app that
demonstrates key Shiny app features.
Timers can now start immediately by setting the argument
start_immediately = TRUE. When TRUE, timers
will start as soon as they are visible. This feature works in xaringan
slides, Quarto slides and general HTML web pages (thanks @Dr-Joe-Roberts,
@davidkane9,
#12).
The countdown_app() now supports bookmarking, making
it possible to share pre-configured timer URLs. This feature improves
the usability of the timer available at https://apps.garrickadenbuie.com/countdown.
Any sound file hosted online can no be played in place of the
default sound by setting play_sound to the absolute or
relative URL of the sound file.
The default CSS styles were updated for better automatic vertical centering of the countdown digits.
Added .countdown-time class to
<code> element of timer. Renamed .digits
class to .countdown-digits. This ensures that it’s possible
to write CSS rules with high specificity values (#10).
Added style argument to countdown() for
inlining CSS rules to the parent div of the timer.
Added a warning state to the coundown timer that is enabled by
setting warn_when = N. The warning class is
applied to the timer for the last N seconds, and the colors
of this state are configured with the arguments with
color_warning_ prefix (thanks @hadley, #5).
Added a new convenience function for full-screen (and
stand-alone) countdown timers, countdown_fullscreen(). This
function’s defaults work best when called from RStudio, in xaringan
slides it will still be necessary to fiddle with font_size,
margin, and padding (thanks @hadley, #6).
Add countdown_app() to launch an interactive Shiny
app with a full-screen countdown timer.
Added update_every argument to
countdown() to only update the timer every N seconds.
Normal updating (second-by-second) is always used for the last two
periods of the countdown time. Thanks @mine-cetinkaya-rundel for the
suggestion.
Added blink_colon argument to
countdown() to animate the : in the countdown
timer colon to blink every second. Enabled by default when the
update_every interval is greater than 1 to provide feedback
that the timer is running.