# shiny (development version) ## OpenTelemetry support (#4269) * Added support for [OpenTelemetry](https://opentelemetry.io/) via [`{otel}`](https://otel.r-lib.org/index.html). By default, if `otel::is_tracing_enabled()` returns `TRUE`, then `{shiny}` will record all OpenTelemetery spans. See [`{otelsdk}`'s Collecting Telemetry Data](https://otelsdk.r-lib.org/reference/collecting.html) for more details on configuring OpenTelemetry. * Supported values for `options(shiny.otel.bind)` (or `Sys.getenv("SHINY_OTEL_BIND")`): * `"none"` - No Shiny OpenTelemetry tracing. * `"session"` - Adds session start/end spans. * `"reactive_update"` - Spans for any synchronous/asynchronous reactive update. (Includes `"session"` features). * `"reactivity"` - Spans for all reactive expressions. (Includes `"reactive_update"` features). * `"all"` [default] - All Shiny OpenTelemetry tracing. Currently equivalent to `"reactivity"`. * Spans are recorded for: * `session_start`: Wraps the calling of the `server()` function. Also contains HTTP request within the attributes. * `session_end`: Wraps the calling of the `onSessionEnded()` handlers. * `reactive_update`: Signals the start of when Shiny knows something is to be calculated. This span ends when there are no more reactive updates (promises or synchronous) to be calculated. * `reactive`, `observe`, `output`: Captures the calculation (including any async promise chains) of a reactive expression (`reactive()`), an observer (`observe()`), or an output render function (`render*()`). * `reactive debounce`, `reactive throttle`: Captures the calculation (including any async promise chains) of a `debounce()`d or `throttle()`d reactive expression. * `ExtendedTask`: Captures the calculation (including any async promise chains) of an `ExtendedTask`. * OpenTelemetry Logs are recorded for: * `Set reactiveVal ` - When a `reactiveVal()` is set * `Set reactiveValues $` - When a `reactiveValues()` element is set * Fatal or unhandled errors - When an error occurs that causes the session to end, or when an unhandled error occurs in a reactive context. Contains the error within the attributes. To unsantize the error message being collected, set `options(shiny.otel.sanitize.errors = FALSE)`. * `Set ExtendedTask ` - When an `ExtendedTask`'s respective reactive value (e.g., `status`, `value`, and `error`) is set. * ` add to queue` - When an `ExtendedTask` is added to the task queue. * All logs and spans contain the `session.id` attribute. ## New features * The `icon` argument of `updateActionButton()`/`updateActionLink()` nows allows values other than `shiny::icon()` (e.g., `fontawesome::fa()`, `bsicons::bs_icon()`, etc). (#4249) ## Bug fixes * `updateActionButton()`/`updateActionLink()` now correctly renders HTML content passed to the `label` argument. (#4249) * Fixed an issue where `updateSelectizeInput(options = list(plugins="remove_button"))` could lead to multiple remove buttons. (#4275) * The default label for `reactiveValues()`, `reactivePoll()`, `reactiveFileReader()`, `debounce()`, and `throttle()` will now attempt to retrieve the assigned name if the srcref is available. If a value can not easily be produced, a default label will be used instead. (#4269) ## Changes * Markdown rendering in showcase mode now uses server-side rendering with the `{commonmark}` package, providing support for GitHub Flavored Markdown features (tables, strikethrough, autolinks, task lists). While most existing README.md files should continue to work as expected, some minor rendering differences may occur due to the change in markdown processor. (#4202, #4201) * The return value of `actionButton()`/`actionLink()` changed slightly: `label` and `icon` are wrapped in an additional HTML container element. This allows for: 1. `updateActionButton()`/`updateActionLink()` to distinguish between the `label` and `icon` when making updates and 2. spacing between `label` and `icon` to be more easily customized via CSS. # shiny 1.11.1 This is a patch release primarily for addressing the bugs introduced in v1.11.0. ## Bug fixes * Fixed an issue where `InputBinding` implementations that don't pass a value to their `subscribe` callback were no longer notifying Shiny of input changes. (#4243) * `updateActionButton()` and `updateActionLink()` once again handle `label` updates correctly. (#4245) # shiny 1.11.0 ## Improvements * When auto-reload is enabled, Shiny now reloads the entire app when support files, like Shiny modules, additional script files, or web assets, change. To enable auto-reload, call `devmode(TRUE)` to enable Shiny's developer mode, or set `options(shiny.autoreload = TRUE)` to specifically enable auto-reload. You can choose which files are watched for changes with the `shiny.autoreload.pattern` option. (#4184) * When busy indicators are enabled (i.e., `useBusyIndicators()`), Shiny now: * Shows a spinner on recalculating htmlwidgets that have previously rendered an error (including `req()` and `validate()`). (#4172) * Shows a spinner on `tableOutput()`. (#4172) * Places a minimum height on recalculating outputs so that the spinner is always visible. (#4172) * Shiny now uses `{cli}` instead of `{crayon}` for rich log messages. (thanks @olivroy, #4170) * `renderPlot()` was updated to accommodate changes in ggplot2 v4.0.0. (#4226) * When adding the new tab via `insertTab()` or `bslib::nav_insert()`, the underlying JavaScript no longer renders content twice. (#4179) ## New features * `textInput()`, `textAreaInput()`, `numericInput()` and `passwordInput()` all gain an `updateOn` option. `updateOn = "change"` is the default and previous behavior, where the input value updates immediately whenever the value changes. With `updateOn = "blur"`, the input value will update only when the text input loses focus or when the user presses Enter (or Cmd/Ctrl + Enter for `textAreaInput()`). (#4183) * `textAreaInput()` gains a `autoresize` option, which automatically resizes the text area to fit its content. (#4210) * The family of `update*Input()` functions can now render HTML content passed to the `label` argument (e.g., `updateInputText(label = tags$b("New label"))`). (#3996) * `ExtendedTask` now catches synchronous values and errors and returns them via `$result()`. Previously, the extended task function was required to always return a promise. This change makes it easier to use `ExtendedTask` with a function that may return early or do some synchronous work before returning a promise. (#4225) * The `callback` argument of Shiny.js' `InputBinding.subscribe()` method gains support for a value of `"event"`. This makes it possible for an input binding to use event priority when updating the value (i.e., send immediately and always resend, even if the value hasn't changed). (#4211) ## Changes * Shiny no longer suspends input changes when _any_ `` or `