Releases: posit-dev/py-shiny
shiny 1.5.0
New features
-
Added AI-powered test generator for Shiny applications. Use
shiny add testto automatically generate comprehensive Playwright tests for your apps using AI models from Anthropic or OpenAI. (#2041) -
ui.sidebar()is now interactively resizable. (#2020) -
ui.sidebar()gains afillableargument to support vertical fill behavior in sidebars. (#2077) -
Added
ui.insert_nav_panel(),ui.remove_nav_panel(), andui.update_nav_panel()to support dynamic navigation. (#90) -
navset_card_*()now gains afull_screenoption. (#1451) -
ui.update_*()functions now acceptui.TagChild(i.e., HTML) as input to thelabelandiconarguments. (#2020) -
The
.output_*()methods of theClientDataclass (e.g.,session.clientdata.output_height()) can now be called without anidwhen called inside a@renderfunction. (#1978) -
playwright.controller.InputActionButtongains aexpect_icon()method. As a result, the already existingexpect_label()no longer includes the icon. (#2020)
Breaking changes
-
The
ui.Chatandui.MarkdownStreamcomponents are now imported from the newshinychatlibrary. Future versions ofshinychatwill likely deprecate and remove some features fromChat. If you still want to use those features with the latest Shiny, we suggest pinningshinychatto it's initial release (v0.1.0). (#2051) -
express.ui.insert_accordion_panel()'s function signature has changed to be more ergonomic. Now you can pass thepanel_titleandpanel_contentsdirectly instead ofui.hold()ing theui.accordion_panel()context manager. (#2042)
Improvements
-
Improved the styling and readability of markdown tables rendered by
ui.Chat()andui.MarkdownStream(). (#1973) -
input_date(),input_date_range(),update_date(), andupdate_date_range()now support""for values, mins, and maxes. In this case, no date will be specified on the client. (#1713) (#1689) -
Restricted the allowable types of the
choicesparameter ofinput_select(),input_selectize(),update_select(), andupdate_selectize()to actual set of allowable types (previously, the type was suggesting HTML-like values were supported). (#2048) -
Added module support for
session.clientdatamethods. This allows you to access client data values in Shiny modules without needing to namespace the keys explicitly. (#1978) -
Added
timeout_secsparameter tocreate_app_fixtureto allow testing apps with longer startup times. (#2033) -
Add support for selecting menu items in
Navsetcontrollers to improve dropdown navigation test coverage. (#2066) -
Python 3.13 is now offically supported and tested. (#1711)
Bug fixes
-
Fixed issue where apps run in Workbench were unexpectedly crashing. Apps running in Workbench will now have
ws_per_message_deflate=Falseenforced. (#2005) -
include_js()andinclude_css()now work as expected in multi-user settings and also when multiple files from the same directory are included. (#2061, #2069) -
Fixed numerous issues related to programmatically updating selectize options. (#2053)
update_selectize(options=...)no longer gets ignored whenserver=False(the default).update_selectize(options=...)now works as expected in a module.
-
Fixed an issue with
update_selectize(server=True)not properly displaying labels with HTML reserved characters like "&" (#1330) -
Fixed an issue with
ui.Chat()sometimes wanting to scroll a parent element. (#1996) -
Fix several issues with bookmarking error reporting and documentation. (#2076, #1984, #1983)
-
input_date()andinput_date_range()once again use the client's (not the server) current date as the defaultvalue. (#2060) -
Fixed false positive warning in
layout_columns()about number of widths vs elements. (#1704) -
Fixed
set()method of theInputSelectizetest controller so it clears existing selections before applying new values. (#2024)
Deprecations
-
ui.update_navs()is deprecated in favor ofui.update_navset(). (#2047) -
ui.panel_well()is deprecated in favor ofui.card(). (#2038) -
selectize,remove_button, andoptionsparameters ofui.input_select()have been deprecated; useui.input_selectize()instead. (Thanks, @ErdaradunGaztea!) (#1947)
shiny 1.4.0
New features
-
Added support for bookmarking Shiny applications. Bookmarking allows users to save the current state of an application and return to it later. This feature is available in both Shiny Core and Shiny Express. (#1870, #1915, #1919, #1920, #1922, #1934, #1938, #1945, #1955)
- To enable bookmarking in Express mode, set
shiny.express.app_opts(bookmark_store=)during the app's initial construction. - To enable bookmarking in Core mode, set
shiny.App(bookmark_store=)when constructing theappobject.
- To enable bookmarking in Express mode, set
-
Added a new
.enable_bookmarking(client)method toui.Chat(). This method will attach bookmark hooks to save and restore the chat's messages and client state. (#1951, #1954) -
Both
ui.Chat()andui.MarkdownStream()now support the inclusion of Shiny UI elements inside of messages. This allows for gathering input from the user (e.g.,ui.input_select()), displaying of rich output (e.g.,render.DataGrid()), and more. (#1868) -
Added a new
.message_stream_context()method toui.Chat(). This context manager is a useful alternative to.append_message_stream()when you want to: (1) Nest a stream within another and/or (2) Overwrite/replace streaming content. (#1906)
Changes
-
Express mode's
app_opts()requires all arguments to be keyword-only. If you are using positional arguments, you will need to update your code. (#1895) -
The
.get_latest_stream_result()method onui.MarkdownStream()was deprecated in favor of the new.latest_streamproperty. Call.result()on the property to get the latest result,.statusto check the status, and.cancel()to cancel the stream. -
MarkdownStream()now has a default maximum width of680pxfor better readability. Also, similar toChat(), it now also horizontally centers itself. (#1944) -
ui.page_navbar()andui.navset_bar()now correctly applythemeand additional attributes fromnavbar_optionscreated withui.navbar_options(). (#1942)
Bug fixes
-
Fixed an issue where the
<main>areas ofui.page_sidebar()andui.page_navbar()(with asidebar) were made to be a fillable containers even whenfillable=False. (#1816) -
Fixed an issue where the
.update_user_input()method onui.Chat()isn't working in shinylive. (#1891) -
Fixed an issue where
widthandheightonMarkdownStream()were not working as intended. (#1944) -
Fixed an issue with the
.click()method on InputActionButton controllers inshiny.playwright.controllerswhere the method would not work as expected. (#1886)
shiny 1.3.0
New features
-
Added a new
ui.MarkdownStream()component for performantly streaming in chunks of markdown/html strings into the UI. This component is primarily useful for text-based generative AI where responses are received incrementally. (#1782) -
The
ui.Chat()component now supports input suggestion links. This feature is useful for providing users with clickable suggestions that can be used to quickly input text into the chat. This can be done in 2 different ways (see #1845 for more details):- By adding a
.suggestionCSS class to an HTML element (e.g.,<span class="suggestion">A suggestion</span>) - Add a
data-suggestionattribute to an HTML element, and set the value to the input suggestion text (e.g.,<span data-suggestion="Suggestion value">Suggestion link</span>) - To auto-submit the suggestion when clicked by the user, include the
.submitclass or thedata-suggestion-submit="true"attribute on the HTML element. Alternatively, use Cmd/Ctrl + click to auto-submit any suggestion or Alt/Opt + click to apply any suggestion to the chat input without submitting.
- By adding a
-
The
ui.Chat()component also gains the following:- The
.on_user_submit()decorator method now passes the user input to the decorated function. This makes it a bit easier to access the user input. See the new templates (mentioned below) for examples. (#1801) - The assistant icon is now configurable via
ui.chat_ui()(or theui.Chat.ui()method in Shiny Express) or for individual messages in the.append_message()and.append_message_stream()methods ofui.Chat(). (#1853) - A new
latest_message_streamproperty was added for an easy way to reactively read the stream's status, result, and also cancel an in progress stream. (#1846) - The
.append_message_stream()method now returns thereactive.extended_taskinstance that it launches. (#1846) - The
ui.Chat()component's.update_user_input()method gainssubmitandfocusoptions that allow you to submit the input on behalf of the user and to choose whether the input receives focus after the update. (#1851)
- The
-
shiny createincludes new and improvedui.Chat()template options. Most of these templates leverage the new{chatlas}package, our opinionated approach to interfacing with various LLM. (#1806) -
Client data values (e.g., url info, output sizes/styles, etc.) can now be accessed in the server-side Python code via
session.clientdata. For example,session.clientdata.url_search()reactively reads the URL search parameters. (#1832) -
Available
inputids can now be listed viadir(input). This also works on the newsession.clientdataobject. (#1832) -
ui.input_text(),ui.input_text_area(),ui.input_numeric()andui.input_password()all gain anupdate_onoption.update_on="change"is the default and previous behavior, where the input value updates immediately whenever the value changes. Withupdate_on="blur", the input value will update only when the text input loses focus or when the user presses Enter (or Cmd/Ctrl + Enter forui.input_text_area()). (#1874) -
Added a new
.add_sass_layer_file()method toui.Themethat supports reading a Sass file with layer boundary comments, e.g./*-- scss:defaults --*/. This format is supported by Quarto and makes it easier to store Sass rules and declarations that need to be woven into Shiny's Sass Bootstrap files. (#1790) -
Added a new
expect_max_height()method to the Valuebox controllers to check the maximum height of a value box (#1816) -
shiny.pytest.create_app_fixture(app)gained support for multiple app file paths when creating your test fixture. If multiple file paths are given, it will behave as a parameterized fixture value and execute the test for each app path. (#1869)
Breaking changes
-
The navbar-related style options of
ui.page_navbar()andui.navset_bar()have been consolidated into a singlenavbar_optionsargument that pairs with a newui.navbar_options()helper. Using the directposition,bg,inverse,collapsible, andunderlinearguments will continue to work with a deprecation message.Related to this change,
ui.navset_bar()now defaults to usingunderline=Trueso that it uses the same set of defaultui.navbar_options()as the page variant. Inui.navbar_options(),inverseis replaced bytheme, which takes values"light"(dark text on a light background),"dark"(light text on a dark background), or"auto"(follow page settings). -
The Shiny Core component
shiny.ui.Chat()no longer has a.ui()method. This method
was never intended to be used in Shiny Core (in that case, useshiny.ui.chat_ui()) to create the UI element. Note that theshiny.express.ui.Chat()class still has a.ui()method. (#1840)
Bug fixes
shiny 1.2.1
shiny 1.2.0
Breaking changes
-
.expect_inverse()for Navset controllers inshiny.playwright.controllersnow requires aboolvalue. To keep behavior the same, use.expect_inverse(False). (#1668) -
.expect_layout()for Navset controllers inshiny.playwright.controllersis now renamed to.expect_fluid()and requires aboolvalue. To keep behavior the same, use.expect_fluid(True)(#1668) -
.expect_icon()for Accordion controllers inshiny.playwright.controllersnow requires aboolvalue instead of astr. (#1710)
New features
-
New features for
@render.data_frame:-
Added narwhals support for
@render.data_frame. This allows for any eager data frame supported by narwhals to be returned from a@render.data_frameoutput method. All internal methods and helper methods now leverage thenarwhalsAPI to be data frame agnostic. (#1570) -
Added
.data_patched()reactive calculation that applies all.cell_patches()to.data(). (#1719) -
Added
.update_cell_value()method to programmatically update the contents of a data frame cell. (#1719) -
Added
.update_data()method to update the rendered data without resetting any user sort or filter. Note, all user edits will be forgotten. (#1719)
-
-
Added narwhals support for
@render.table. This allows for any eager data frame supported by narwhals to be returned from a@render.tableoutput method. (#1570) -
Shiny now supports theming via brand.yml with a single
_brand.ymlfile. Callui.Theme.from_brand()with__file__or the path to a_brand.ymlfile and pass the resulting theme to thethemeargument ofexpress.ui.page_opts()(Shiny Express) orui.page_*()functions (Shiny Core) to apply the brand theme to the entire app. (#1743) -
chat_ui()andChat.ui()gain amessagesparameter for providing starting messages. (#1736)
Other changes
-
Incorporated
orjsonfor faster data serialization in@render.data_frameoutputs. (#1570) -
Added
PageNavbarclass to the list ofshiny.playwright.controllersfor testingui.page_navbar(). (#1668) -
Added
.expect_widths()toNavsetPillListinshiny.playwright.controllersfor testingui.navset_pill_list(widths=). (#1668) -
Added
.expect_title()forPopoverinshiny.playwright.controllers(#1683) -
Added
.expect_disabled()forInputActionButtoninshiny.playwright.controllers(#1705) -
Small improvements to the default pulse busy indicator to better blend with any background. It's also now slightly smaller by default.(#1707)
-
Added
.expect_class(),.expect_gap(),.expect_bg_color(),.expect_desktop_state(),.expect_mobile_state(),.expect_mobile_max_height(),.expect_title(), and.expect_padding()forSidebarinshiny.playwright.controllers(#1715) -
Modified
.expect_text()forSidebarinshiny.playwright.controllersto use.loc_contentinstead oflocfor text. Also modified.expect_width()to check the.loc_container's style instead of the.locelement. (#1715) -
Modified
.expect_text()and.expect_width()forSidebarinshiny.playwright.controllersto useloc_contentinstead oflocfor text. (#1715) -
Added
.expect_class()and.expect_multiple()forAccordioninshiny.playwright.controllers(#1710)
Bug fixes
-
A few fixes for
ui.Chat(), including: -
shiny createnow uses the templateidrather than the directory name as the default directory. (#1666) -
ui.Theme()now works correctly on Windows when the theme requires Sass compilation. (Thanks, @yuuuxt!) (#1684) -
Fixed multiple input controllers (
InputSlider,InputDate,InputDateRange,InputCheckbox, andInputCheckboxGroup) inshiny.playwright.controllerto check thewidthproperty within thestyleattribute. (#1691, #1696, #1702) -
Fixed multiple input controllers (
InputSwitch,InputRadioButtons,InputNumeric,InputText,InputTextArea,InputPassword,InputActionButton, andInputActionLink) inshiny.playwright.controllerto correctly validate thewidthstyle property in `.expect_width(). (#1705) -
Fixed input controller
InputTextAreainshiny.playwright.controllerto correctly validate theresizestyle property in.expect_resize(). (#1705) -
Fixed a bug in
ui.conditional_panel()that would cause the panel to repeatedly show/hide itself when the provided condition did not evaluate to a boolean value. (#1707) -
Fixed a bug with
ui.input_slider()when used as a range slider that made it impossible to change the slider value when both handles were at the maximum value. (#1707) -
Fixed bug in
@render.data_framewhereboolorobjectcolumns were not being rendered. (#1570) -
Fixed output controller
OutputDataFrameinshiny.playwright.controllerto correctly assert the number of rows in.expect_nrow()as the total number of virtual rows, not the number of currently displaying rows. (#1719) -
Fixed issue where
@render.downloaddid not respect the module namespacing. (Thanks, @nsiicm0!) (#1732) -
Added workaround in
Accordioninshiny.playwright.controllerwhere.expect_open()and.expect_panels()would hang while resolving a playwright locator. (Thanks, @joesho112358!) (#1165)
Shiny 1.1.0
New features
-
ui.Chat()gains a new.update_user_input()method, which adds the ability to update the input placeholder message. As a result,.set_user_message()is now deprecated (since the new method can also be used to update the message). (#1594) -
shiny createnow supports a succinct format for specifying the GitHub repository via the--githubflag, e.g.--github posit-dev/py-shiny-templates. You can now also use--githuband--templatetogether, in which case--githubshould point to a repository containing a directory matching the name provided in--template. (#1623) -
shiny createnow identifies templates in external repositories using a_template.jsonmetadata file. This file should contain at an"id"and optionally a"title"and"description". Whenshiny createis called with the--githubflag but without a--templateflag, it will offer a menu listing all available templates in the repository. (#1631)
Other changes
- A few changes for
ui.Chat(), including:- The
.messages()method no longer trims messages by default (i.e., the default value oftoken_limitsis nowNoneinstead of the overly generic and conservative value of(4096, 1000)). See the new generative AI in production templates (viashiny create) for examples of settingtoken_limitsbased on the model being used. (#1657) - User input that contains markdown now renders the expected HTML. (#1607)
- Busy indication is now visible/apparent during the entire lifecycle of response generation. (#1607)
- The
Bug fixes
-
A few fixes for
ui.Chat(), including: -
An empty
ui.input_date()value no longer crashes Shiny. (#1528) -
Fixed bug where calling
.update_filter(None)on a data frame renderer did not visually reset non-numeric column filters. (It did reset the column's filtering, just not the label). Now it resets filter's label. (#1557) -
Require shinyswatch >= 0.7.0 and updated examples accordingly. (#1558)
-
ui.input_text_area(autoresize=True)now resizes properly even when it's not visible when initially rendered (e.g. in a closed accordion or a hidden tab). (#1560) -
ui.notification_show(duration=None)now persists the notification until the app user closes it. (#1577) -
Some copies of Windows 10 have registry entries mapping .js files to content type "text/plain", which was causing all sorts of problems for browsers. (#1624)
-
Added missing support for
express.ui.navset_card_pill(placement:). (#1602) -
Added
.expect_sidebar()and.expect_title()methods forNavsetCardTab,NavsetCardPill,NavsetCardUnderline, andNavsetBar. (#1602) -
Added
.expect_placement()method forNavsetCardPillandNavsetCardUnderline. (#1602)
Shiny 1.0.0
New features
-
Added a new
shiny.ui.Chatclass for building conversational interfaces with fully customizable and performant response generation. (#1453) -
Expose
shiny.playwright,shiny.run, andshiny.pytestmodules that allow users to testing their Shiny apps. (#1448, #1456, #1481)shiny.playwrightcontainscontrollerandexpectsubmodules.controllerwill contain many classes to interact with (and verify!) your Shiny app using Playwright.expectcontains expectation functions that enhance standard Playwright expectation methods.shiny.runcontains therun_shiny_appcommand and the return typeShinyAppProc.ShinyAppProccan be used to type the Shiny app pytest fixtures.shiny.pytestcontains pytest test fixtures. Thelocal_apppytest fixture is automatically available and runs a siblingapp.pyfile. Where ascreate_app_fixture(PATH_TO_APP)allows for a relative path to a Shiny app to be instantiated from a different folder.
-
Added CLI command
shiny add testto add a test file to an existing Shiny app. (#1461) -
@render.data_frame,render.DataGrid, andrender.DataTablenow supportpolarsdata frames (#1474). -
@render.data_frame,render.DataGrid, andrender.DataTableare now type aware. This means that the data frame renderer object's.data()and.data_view()methods will return the same type of data given the the renderer. E.g. If aDataGridwrapping apolarsdata frame is returned to the renderer function,.data_view()will returnpolarsdata. (#1502) -
@render.data_frame'srender.DataGridandrender.DataTableadded support for cell styling with the newstyles=parameter. This parameter can receive a style info object (or a list of style info objects), or a function that accepts a data frame and returns a list of style info objects. Each style info object can contain therowsandcolslocations where the inlinestyleand/or CSSclassshould be applied. (#1475) -
@render.data_framehas added a few new methods:.data_view_rows()is a reactive value representing the sorted and filtered row numbers. This value wrapsinput.<ID>_data_view_rows()(#1374).sort()is a reactive value representing the sorted column information (dictionaries containingcol: intanddesc: bool). This value wrapsinput.<ID>_sort(). (#1374).filter()is a reactive value representing the filtered column information (dictionaries containingcol: intandvaluewhich is either a string or a length 2 array of at least one non-Nonenumber). This value wrapsinput.<ID>_filter(). (#1374).update_sort(sort=)allows app authors to programmatically update the sorting of the data frame. (#1374).update_filter(filter=)allows app authors to programmatically update the filtering of the data frame. (#1374)
-
@render.data_framenow accepts both a non-"none"selection_modevalue andeditable=True. (#1454, #1534) -
@render.data_frame's<ID>.cell_selection()no longer returns aNonevalue and now always returns a dictionary containing both therowsandcolskeys. This is done to achieve more consistent author code when working with cell selection. When the value'stype="none", bothrowsandcolsare empty tuples. Whentype="row",colsrepresents all column numbers of the data. In the future, whentype="col",rowswill represent all row numbers of the data. These extra values are not available ininput.<ID>_cell_selection()as they are independent of cells being selected and are removed to reduce information being sent to and from the browser. (#1376) -
Relative imports, like
from . import utils, now can be used in Shiny Express apps. (#1464) -
ui.Themeallows you to create custom themes for your Shiny app by recompiling Bootstrap and Shiny's Sass files with your own customizations. Themes created withui.Themecan be passed directly to thethemeargument ofexpress.ui.page_opts()(Shiny Express) orui.page_*()functions (Shiny Core) to apply the theme to the entire app. This feature requires the libsass package which can be installed withpip install libsass. (#1358) -
ui.card_body()can be used to wrap the contents of elements inui.card(), allowing you to change parameters likefillableorpaddingandgapfor groups of elements in the card. (#1506)
Other changes
-
ui.input_action_button()andui.update_action_button()gain adisabledargument. When the button is disabled, it appears grayed out and cannot be clicked. (#1465) -
The main content area of
ui.page_sidebar()andui.page_navbar()with a page-levelsidebarnow have a minimum height and width to avoid squashed content in fillable layouts. The minimum height and width are controllable via--bslib-page-main-min-{width,height}CSS variables. (#1436) -
Added a new option to place an always-open sidebar above the main content on mobile screens by providing
open={"mobile": "always-above"}toui.sidebar(). (#1436)
Bug fixes
-
Fixed #1440: When a Shiny Express app with a
www/subdirectory was deployed to shinyapps.io or a Connect server, it would not start correctly. (#1442) -
Fixed #1498: Update table related TypeScript dependencies to their latest versions. This fixed an issue where the Row Virtualizer would scroll to the end when hidden. This would cause the DOM to update numerous times, locking up the browser tab for multiple seconds. (#1524, #1550)
-
The return type for the data frame patch function now returns a list of
render.CellPatchobjects (which supporthtmltools.TagNodefor thevalueattribute). These values will be set inside the data frame's.data_view()result. This also means that.cell_patches()will be a list ofrender.CellPatchobjects. (#1526) -
Made sure all
@render.data_framecells that have been edited are now restored back to ready state to handle the off chance that the returned patches are at different locations the the original edit patches. (#1529) -
remove_all_fill(tag)no longer modifies the originaltaginput and instead returns a modified copy oftag. (#1538)
Deprecations
-
The following deprecated functions have now been removed (#1546):
shiny.ui.panel_sidebar()was deprecated in v0.6.0; useshiny.ui.sidebar()instead.shiny.ui.panel_main()was deprecated in v0.6.0; instead pass items directly toshiny.ui.layout_sidebar().shiny.ui.navset_pill_card()was deprecated in v0.6.0; useshiny.ui.navset_card_pill()instead.shiny.ui.navset_tab_card()was deprecated in v0.6.0; useshiny.ui.navset_card_tab()instead.shiny.ui.nav()was deprecated in v0.6.1; useshiny.ui.nav_panel()instead.
-
@render.data_frame,render.DataGrid, andrender.DataTablehave deprecated support for data frame types that arepandascompatible. Please call.to_pandas()on your data before it is returned to the renderer (#1502). Currently, bothpolarsandpandasdata frames are supported (#1474). If you'd like to add support for a new data frame type, please open an issue or a pull request. -
@render.data_frame's.cell_selection()will no longer returnNonewhen the selection mode is"none". In addition, missingrowsorcolsinformation will be populated with appropiate values. This allows for consistent handling of the cell selection object. (#1374) -
@render.data_frame's input valueinput.<ID>_data_view_indices()has been deprecated. Please use<ID>.data_view_rows()to retrieve the same information. (#1377) -
@render.data_frame's input valueinput.<ID>_column_sort()has been deprecated. Please use<ID>.sort()to retrieve the same information. (#1374) -
@render.data_frame's input valueinput.<ID>_column_filter()has been deprecated. Please use<ID>.filter()to retrieve the same information. (#1374) -
Deprecated functions in
shiny.experimentalhave been removed. By and large, these functions are now available in the mainshinynamespace. (#1540) -
We've deprecated several card-related
shiny.experimental.uifunctions that were moved to the mainshiny.uinamespace in v0.6.0. Bothcard()andcard_body()are no longer experimental and can be called viashiny.ui.card()andshiny.ui.card_body()directly.shiny.experimental.ui.card_title()is now deprecated, but can be replaced withshiny.ui.tags.h5()orshiny.ui.card_header(). (#1543)
Shiny 0.10.2
Bug fixes
- Fixed an issue with output spinners only showing for a split second. (#1429)
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_indiceshas been renamed toinput.<ID>_data_view_rowsfor consistent naming. Please useinput.<ID>_data_view_rowsand considerinput.<ID>_data_view_indicesdeprecated. (#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 athemeargument that allows you to replace the Bootstrap CSS file with a new CSS file.themecan be a local CSS file, a URL, or a shinyswatch theme. In Shiny Express apps,themecan be set viaexpress.ui.page_opts(). (#1334)
Bug fixes
-
Fixed an issue that prevented Shiny from serving the
font.cssfile 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
-
Sessionis now an abstract base class, andAppSessionis a concrete subclass of it. Also,ExpressMockSessionhas been renamedExpressStubSessionand is a concrete subclass ofSession. (#1331) -
The
Sessionclass now has a methodis_stub_session(). ForExpressStubSession, this method returnsTruefor , andAppSessionobjects 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)