Upgrade notes for Shiny 1.8.0

Breaking changes

  • Closed #3899: The JS function Shiny.bindAll() is now asynchronous. This change is driven by the recent push toward making dynamic UI rendering asynchronous, which is necessary for shinylive (and should’ve happened when it was first introduced in Shiny v1.7.5). The vast majority of existing Shiny.bindAll() uses should continue to work as before, but some cases may break if downstream code relies on it being synchronous (i.e., blocking the main thread). In this case, consider placing any downstream code in a .then() callback (or await the result in a async function). (#3929)
    • Since renderContent() calls bindAll() (after it inserts content), it now returns a Promise<void> instead of void, which can be useful if downstream code needs to wait for the binding to complete.

New features and improvements

  • Updated selectizeInput()’s selectize.js dependency from v0.12.4 to v0.15.2. In addition to many bug fixes and improvements, this update also adds several new plugin options. (#3875)

  • Shiny’s CSS styling (for things like showNotification(), withProgress(), inputPanel(), etc.), has been updated with bslib’s upcoming CSS-only dark mode feature in mind. (#3882, #3914)

  • Default styles for showNotification() were tweaked slightly to improve accessibility, sizing, and padding. (#3913)

  • Shiny inputs and htmlwidgets are no longer treated as draggable inside of absolutePanel()/fixedPanel() with draggable = TRUE. As a result, interactions like zooming and panning now work as expected with widgets like plotly and leaflet when they appear in a draggable panel. (#3752, #3933)

  • For InputBindings, the .receiveMessage() method can now be asynchronous or synchronous (previously it could only be synchronous). (#3930)

Bug fixes

  • fileInput() no longer has unwanted round corners applied to the buttonLabel. (#3879)

  • Fixed #3898: wrapFunctionLabel() no longer throws an error if the name is longer than 10000 bytes. (#3903)