{"ecosystem":"cran","package":"shiny","from_version":null,"to_version":null,"changes":[{"from_version":"v1.7.5.1","to_version":"v1.8.0","change_type":"breaking","description":"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](https://shinylive.io/r) (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, ","migration_hint":null},{"from_version":"v1.7.5.1","to_version":"v1.8.0","change_type":"breaking","description":"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.","migration_hint":null},{"from_version":"v1.11.1","to_version":"v1.12.0","change_type":"breaking","description":"The return value of `actionButton()` and `actionLink()` now wraps `label` and `icon` in an additional HTML container element. This allows `updateActionButton()` and `updateActionLink()` to distinguish between the `label` and `icon` when making updates, and allows spacing between `label` and `icon` to be more easily customized via CSS.","migration_hint":null}],"total":3,"note":"Curated major-version breaking changes. Always verify against the package's official changelog before migrating.","_cache":"hit"}