Releases: posit-dev/py-shiny
Shiny 0.10.2
Shiny 0.10.1
Bug fixes
- Fixed an issue with opacity dimming occurring too often/quickly when outputs are recalculating. (#1415)
Shiny 0.10.0
Deprecations
-
Restored
@render.data_frame
's (prematurely removed in v0.9.0) input valueinput.<ID>_selected_rows()
. Please use<ID>.cell_selection()["rows"]
and considerinput.<ID>_selected_rows()
deprecated. (#1345, #1377) -
@render.data_frame
's method.input_cell_selection()
has been renamed to.cell_selection()
. Please use.cell_selection()
and consider.input_cell_selection()
deprecated. (#1407) -
@render.data_frame
's input valueinput.<ID>_data_view_indices
has been renamed toinput.<ID>_data_view_rows
for consistent naming. Please useinput.<ID>_data_view_rows
and considerinput.<ID>_data_view_indices
deprecated. (#1377)
New features
-
Added busy indicators to provide users with a visual cue when the server is busy calculating outputs or otherwise serving requests to the client. More specifically, a spinner is shown on each calculating/recalculating output, and a pulsing banner is shown at the top of the page when the app is otherwise busy. Use the new
ui.busy_indicator.options()
function to customize the appearance of the busy indicators andui.busy_indicator.use()
to disable/enable them. (#918) -
Added support for creating modules using Shiny Express syntax, and using modules in Shiny Express apps. (#1220)
-
ui.page_*()
functions gain atheme
argument that allows you to replace the Bootstrap CSS file with a new CSS file.theme
can be a local CSS file, a URL, or a shinyswatch theme. In Shiny Express apps,theme
can be set viaexpress.ui.page_opts()
. (#1334)
Bug fixes
-
Fixed an issue that prevented Shiny from serving the
font.css
file referenced in Shiny's Bootstrap CSS file. (#1342) -
Removed temporary state where a data frame renderer would try to subset to selected rows that did not exist. (#1351, #1377)
-
Fix an issue in the data frame output which caused the table to freeze when filters removed previously selected cells. (#1412)
Other changes
-
Session
is now an abstract base class, andAppSession
is a concrete subclass of it. Also,ExpressMockSession
has been renamedExpressStubSession
and is a concrete subclass ofSession
. (#1331) -
The
Session
class now has a methodis_stub_session()
. ForExpressStubSession
, this method returnsTrue
for , andAppSession
objects it returnsFalse
. (#1331) -
Closed #1293: The error console would display error messages if an app was disconnected and the user changed an input. (#1339)
-
Fixed an issue where some CSS files were larger than necessary because they had source maps embedded in them. (#1339)
Shiny 0.9.0
Breaking Changes
-
@render.data_frame
return values ofDataTable
andDataGrid
had their parameter ofrow_selection: Literal["single", "multiple"]
become deprecated. Please useselection_mode="row"
orselection_mode="rows"
instead. (#1198) -
The
col_widths
argument ofui.layout_columns()
now sets thesm
breakpoint by default, rather than themd
breakpoint. For example,col_widths=(12, 6, 6)
is now equivalent to{"sm": (12, 6, 6)}
rather than{"md": (12, 6, 6)}
. (#1222)
New features
-
Session
objects now have aset_message_handler(name, fn)
method that allows you to register a message handler function that will be called when a request message with the given name is received from the client (viaShiny.shinyapp.makeRequest()
(JS)). (#1253) -
Experimental:
@render.data_frame
return values ofDataTable
andDataGrid
supporteditable=True
to enable editing of the data table cells. (#1198) -
ui.card()
andui.value_box()
now take anid
argument that, when provided, is used to report the full screen state of the card or value box to the server. For example, when usingui.card(id = "my_card", full_screen = TRUE)
you can determine if the card is currently in full screen mode by reading the boolean value ofinput.my_card_full_screen()
. (#1215, #1266) -
Added support for using
shiny.express
in Quarto Dashboards. (#1217) -
ui.value_box()
,ui.layout_columns()
andui.layout_column_wrap()
now all havemin_height
andmax_height
arguments. These are useful in filling layouts, likeui.page_fillable()
,ui.page_sidebar(fillable=True)
orui.page_navbar(fillable=True)
. For example, you can useui.layout_columns(min_height=300, max_height=500)
to ensure that a set of items (likely arranged in a row of columns) are always between 300 and 500 pixels tall. (#1223) -
Added an error console which displays errors in the browser's UI. This is enabled by default when running applications locally, and can be disabled with
shiny run --no-dev-mode
. It is not enabled for applications that are deployed to a server. (#1060) -
shiny create
was updated to include some additional templates as well as an option to choose from the new templates website. (#1273, #1277, #1274) -
shiny.express.ui.page_opts()
now accepts additional keyword arguments that are passed to the underlying page layout chosen byshiny.ui.page_auto()
. (#1314)
Bug fixes
-
On Windows, Shiny Express app files are now read in as UTF-8. (#1203)
-
input_dark_mode()
now accepts astyle
argument that can be used to customize the appearance and position of the dark mode toggle switch. (#1207) -
Calling
ui.update_selectize()
withchoices
andselected
now clears the current selection before updating the choices and selected value. (#1221) -
Fixed an issue that could happen with a
ui.card()
orui.value_box()
that is rendered dynamically via@render.ui
when an updated card replaces a card that the user has expanded into full screen mode. Now the full screen state is reset for the new card or value box. If you want to update a card without potentially exiting the full-screen mode, update specific parts of the card usingui.output_ui()
orui.output_text()
. (#1221) -
ui.layout_columns()
now correctly applies therow_heights
at thexs
breakpoint, if supplied. (#1222) -
ui.panel_conditional()
now adds the.shiny-panel-conditional
class to the<div>
element wrapping the conditional panel contents. (#1257) -
ui.panel_conditional()
no longer results in unwanted double padding when the parent container usesgap
for spacing multiple elements (e.g., when used inui.layout_columns()
,ui.page_fillable()
, etc). (#1266) -
Error messages now use
var(--bs-danger)
instead ofvar(--bs-danger-text-emphasis)
for the text color. (#1266)
Other changes
- The fill CSS used by fillable containers (i.e. when
fillable=True
) now uses a CSS cascade layer namedhtmltools
to reduce the precedence order of the fill CSS. (#1228)
Shiny 0.8.1
Breaking Changes
ui.page_sidebar()
now places thetitle
element in a.navbar
container that matches the structure ofpage_navbar()
. This ensures that the title elements ofpage_sidebar()
andpage_navbar()
have consistent appearance. (#1176)
Bug fixes
-
Shiny now compiles the Bootstrap 5-based stylesheets for component styles imported from https://github.com/rstudio/shiny. (#1191)
-
Fixed the CSS for
ui.output_ui()
to avoid unwanted double padding when its parent container usesgap
for spacing multiple elements (e.g.,ui.layout_columns()
,ui.page_fillable()
, etc). (#1176)
Other changes
-
Closed #1178: Removed run-time dependency on asgiref. (#1183)
-
The uvicorn and click packages are no longer needed when running on Emscripten. (#1187)
-
We adjusted the shadows used for cards and popovers. Cards now use a slightly smaller shadow and the same shadow style is also now used by popovers. (#1176)
-
We increased the spacing between elements just slightly. This change is most noticeable in the
layout_columns()
orlayout_column_wrap()
component. In these and other components, you can usegap
andpadding
arguments to choose your own values, or you can set the--bslib-spacer
(CSS) variable. (#1176)
Shiny 0.8.0
Breaking Changes
-
Page-level sidebars used in
ui.page_sidebar()
andui.page_navbar()
will now default to being initially open but collapsible on desktop devices and always open on mobile devices. You can adjust this default choice by settingui.sidebar(open=)
. (#1129) -
ui.sidebar()
is now a thin wrapper for the internalui.Sidebar
class. Theui.Sidebar
class has been updated to store the sidebar's contents and settings and to delay rendering until the sidebar HTML is actually used. Because most users callui.sidebar()
instead of using the class directly, this change is not expected to affect many apps. (#1129)
New features
-
Added
ui.input_dark_mode()
, a toggle switch that allows users to switch between light and dark mode. By default, whenui.input_dark_mode()
is added to an app, the app's color mode follows the users's system preferences, unless the app author sets themode
argument. Whenui.input_dark_mode(id=)
is set, the color mode is reported to the server, and server-side color mode updating is possible usingui.update_dark_mode()
. (#1149) -
ui.sidebar(open=)
now accepts a dictionary with keysdesktop
andmobile
, allowing you to independently control the initial state of the sidebar at desktop and mobile screen sizes. (#1129) -
Closed #984: In Shiny Express apps, if there is a
"www"
subdirectory in the app's directory, Shiny will serve the files in that directory as static assets, mounted at/
. (#1170) -
For Shiny Express apps, added
express.app_opts()
, which allows setting application-level options, likestatic_assets
anddebug
. (#1170) -
Closed #1079: For Shiny Express apps, automatically run a
globals.py
file in the same directory as the app file, if it exists. The code inglobals.py
will be run with the session context set toNone
. (#1172)
Other changes
-
@render.data_frame
now properly fills its container by default. (#1126) -
We improved the accessibility of the full screen toggle button in cards created with
ui.card(full_screen=True)
. Full-screen cards are now also supported on mobile devices. (#1129) -
When entering and exiting full-screen card mode, Shiny now emits a client-side custom
bslib.card
event that JavaScript-oriented users can use to react to the full screen state change. (#1129) -
The sidebar's collapse toggle now has a high
z-index
value to ensure it always appears above elements in the main content area ofui.layout_sidebar()
. The sidebar overlay also now receives the same highz-index
on mobile layouts. (#1129) -
Updated example apps to use lower-case versions of
reactive.Calc
->reactive.calc
,reactive.Effect
->reactive.effect
, andreactive.Value
->reactive.value
. (#1164) -
Closed #1081: The
@expressify()
function now has an optionhas_docstring
. This allows the decorator to be used with functions that contain a docstring. (#1163)
Bug fixes
-
Fixed
input_task_button
not working in a Shiny module. (#1108) -
Fixed several issues with
page_navbar()
styling. (#1124) -
Fixed
Renderer.output_id
to not contain the module namespace prefix, only the output id. (#1130) -
Fixed gap-driven spacing between children in fillable
nav_panel()
containers. (#1152) -
Fixed #1138: An empty value in a date or date range input would cause an error; now it is treated as
None
. (#1139)
Other changes
Shiny 0.7.1
Shiny 0.7.0
Breaking Changes
New features
-
Added
shiny.ui.input_task_button()
for creating buttons that launch longer-running tasks thanshiny.ui.input_action_button()
was designed for. Task buttons give visual feedback that the task is running, and cannot be clicked again until the task is complete. (#907) -
Added
@extended_task
decorator for creating long-running tasks that can be cancelled. (#907) -
Added
@render.download
as a replacement for@session.download
, which is now deprecated. (#977) -
Added
ui.output_code()
, which is currently an alias forui.output_text_verbatim()
. (#997) -
Added
@render.code
, which is an alias for@render.text
, but in Express mode, it displays the result usingui.output_code()
. (#997) -
Added
App.on_shutdown
method for registering a callback to be called when the app is shutting down. (#907) -
You can now pass options to
ui.input_selectize
see the selectize.js docs for available options. (#914, #158) -
ui.input_selectize
gains theremove_button
argument which allows you to control the visibility of the remove button.
Bug fixes
-
CLI command
shiny create
... (#965)- has added a
-d
/--dir
flag for saving to a specific output directory - will raise an error if if will overwrite existing files
- prompt users to install
requirements.txt
- has added a
-
Fixed
js-react
template build error. (#965) -
Fixed #1007: Plot interaction with plotnine provided incorrect values. (#999)
Developer features
- Output renderers should now be created with the
shiny.render.renderer.Renderer
class. This class should contain either a.transform(self, value)
method (common) or a.render(self)
(rare). These two methods should return something can be converted to JSON. In addition,.default_ui(self, id)
should be implemented by returninghtmltools.Tag
-like content for use within Shiny Express. To make your own output renderer, please inherit from theRenderer[IT]
class whereIT
is the type (excludingNone
) required to be returned from the App author. (#964)- Legacy renderers that will be removed in the near future:
shiny.render.RenderFunction
shiny.render.RenderFunctionAsync
shiny.render.transformer.OutputRenderer
shiny.render.transformer.OutputRendererSync
shiny.render.transformer.OutputRendererAsync
- Legacy renderers that will be removed in the near future:
Shiny 0.6.1.1
Shiny 0.6.1
New features
shiny create
now allows you to select from a list of template apps.shiny create
provides templates which help you build your own custom JavaScript components.- Closed #814: The functions
reactive.Calc
andreactive.Effect
have been changed to have lowercase names:reactive.calc
, andreactive.effect
. The old capitalized names are now aliases to the new lowercase names, so existing code will continue to work. Similarly, the classreactive.Value
has a new alias,reactive.value
, but in this case, since the original was a class, it keeps the original capitalized name as the primary name. The examples have not been changed yet, but will be changed in a future release. (#822) - Added
ui.layout_columns()
for creating responsive column-forward layouts based on Bootstrap's 12-column CSS Grid. (#856) - Added support for Shiny Express apps, which has a simpler, easier-to-use API than the existing API (Shiny Core). Please note that this API is still experimental and may change. (#767)
Bug fixes
- Fix support for
shiny.ui.accordion(multiple=)
(#799).
Other changes
- Closed #492:
shiny.ui.nav()
is now deprecated in favor of the more aptly namedshiny.ui.nav_panel()
(#876). - Update penguins example to credit Allison Horst and drop usage of
shiny.experimental
(#798). as_fillable_container()
andas_fill_item()
no longer mutate theTag
object that was passed in. Instead, it returns a newTag
object. Also closed #856: these functions now put thehtml-fill-container
andhtml-fill-item
CSS classes last, instead of first. (#862)App()
now accepts a server function with a singleinput
parameter, or a server function with parametersinput
,output
andsession
. Server functions with two or more than three parameters now raise an exception. (#920)