All notable changes to Shiny for Python will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
session.destroy()now accepts an optional moduleid. The parent that inserted a module's UI under anidcan tear down that module's scope withsession.destroy(id), without the module having to hand back a cleanup handle. (#2264)
- Fixed
ui.input_submit_textarea()failing inside module namespaces. The internal submit button's ID was built from the already-resolved (namespaced) textarea ID, causing a double-namespace wheninput_task_buttonresolved it again. (#2262)
-
Adapted py-shiny to the
htmltools0.7.0 sibling-classes refactor. No runtime behavior change. (#2244) -
Bumped
lodash/lodash-esto4.18.1in thejs-reacttemplate lockfile for CVE-2025-13465. (#2233) -
Fixed
render.DataGrid()column headers and hovered rows not adapting to dark mode whenui.input_dark_mode()is enabled. The data grid now uses Bootstrap 5.3 mode-aware color tokens (--bs-tertiary-bg,--bs-primary-bg-subtle,--bs-emphasis-color,--bs-secondary-color), with the legacy values preserved as fallbacks. (#1635)
- Added
session.destroy()andsession.on_destroy()for cleaning up reactive objects (effects, calcs, values) when dynamically inserted module UI is removed. Callingsession.destroy()on a module's session fires all registered destroy callbacks, which stop effects, invalidate calcs and values, and remove namespaced inputs and outputs from the reactive graph. Reactive objects automatically register weak destroy callbacks so they can be garbage collected when no longer referenced, even before session end. (#2209)
-
@reactive.calc,@reactive.effect, and render decorators (e.g.@render.text) now raise aTypeErrorif the decorated function has required parameters, since Shiny never supplies arguments to these functions. Functions with default parameter values emit a warning, as the defaults will always be used. (Thanks, @mvanhorn!) (#2200) -
Output resize/visibility detection now uses native browser observers (
ResizeObserver,IntersectionObserver) instead of relying on jQueryshown/hiddenevents andwindow.resize. This makes Shiny's client-side output-info pipeline (image/plot sizing, hidden-state tracking, theme reporting) work automatically in any layout — including CSS-only show/hide, third-party tab components, and non-Bootstrap frameworks — without requiring custom event hooks. This also introduces ashiny:themechangeevent for code that needs to trigger theme clientdata refreshes after changing surrounding visual theme context. (rstudio/shiny#3682) -
panel_conditional()no longer briefly flashes its contents on app start when the condition is initiallyFalse. (rstudio/shiny#3505)
-
Fixed server-side input deduplication so that all values received from the client always trigger reactive invalidation. (#1600, #2219)
-
Fixed a caret drift issue in
ui.input_code_editor()where the cursor would appear to the right of the actual text insertion point when certain themes or on some operating systems. (#2223) -
Fixed OpenTelemetry name inference for
reactive.Valueto handle type-annotated assignments (e.g.,counter: reactive.Value[int] = reactive.Value(0)), generic subscript calls (e.g.,reactive.Value[int](0)), and multiline assignments where theValue()call is on a continuation line (e.g., assignments split across lines with parentheses or multiline type annotations). This fixes anonymous OTel labels for packages likeshinychatthat use multilinereactive.Valueassignments. (#2205)
-
Added the
SHINY_OTEL_COLLECTenvironment variable to set the default collection level globally. Available levels: (#2143)"none"- Disables all Shiny-specific telemetry collection. Use this for sensitive operations where you don't want Shiny to emit any spans or logs."session"- Captures session lifecycle spans that track when user sessions are starting and ending. This provides basic visibility into session activity without detailed reactive execution information."reactive_update"- Captures everything from"session"plus reactive flush cycle spans that show when reactive invalidation and re-execution occurs. This helps identify performance bottlenecks in reactive updates without the overhead of per-reactive-component instrumentation."reactivity"- Captures everything from"reactive_update"plus individual reactive execution spans (reactive.calc,reactive.effect,extended_task), info-level logs for reactive value updates (including source file, line number, and column position), and debug-level logs for extended task queue operations. This provides comprehensive visibility into reactive execution flow and timing."all"[Default] - Currently equivalent to"reactivity"and represents the most comprehensive telemetry available. This is the default collection level whenSHINY_OTEL_COLLECTis not set (or is explicitly set toall).
-
Added
otel.suppressandotel.collectto control Shiny's internal OpenTelemetry instrumentation per-function or per-block. Use@otel.suppress/@otel.collect(no-parens decorators) to stamp a single function, orwith otel.suppress():/with otel.collect():(context managers) to control telemetry during reactive object creation.otel.suppressdisables Shiny's internal reactivity telemetry;otel.collectre-enables reactivity telemetry when the global default has been lowered. Both only affect Shiny's internal spans — user-defined OpenTelemetry spans are unaffected. (#2143) -
Added OpenTelemetry example application (
examples/open-telemetry/) demonstrating console exporter, collection control with@otel.suppressand@otel.collect, and side-by-side comparison of normal, suppressed, and force-enabled telemetry. The OpenTelemetry SDK is available via the optional[otel]dependency group:pip install shiny[otel]. Note: If you're already using an observability package with OpenTelemetry integration (e.g.,logfire), it likely already includesopentelemetry-sdk, so you may not need to explicitly install the[otel]group. (#2143)
-
Added toolbar component with
ui.toolbar(),ui.toolbar_input_button(),ui.toolbar_input_select(),ui.toolbar_divider(),ui.toolbar_spacer(),ui.update_toolbar_input_button(), andui.update_toolbar_input_select(). Toolbars are compact UI containers designed for small form elements suitable for card headers, footers, and other constrained spaces. They support flexible alignment (left/right), custom spacing and width, icon-only or labeled buttons with optional tooltips, select inputs with grouped choices, visual dividers for separating elements, and flexible spacers for split layouts. Server-side updates allow dynamic modification of button and select properties. (#2155) -
Added a new
ui.input_code_editor()element that allows for light-weight code editing with syntax highlighting, using the prism-code-editor library. The editor supports 20+ languages, more than a dozen themes, and automatic light/dark mode switching. (#2128)
-
Reduced installed package size by ~400KB by excluding
api-examples/directories from wheel and source distributions. These examples are only needed when building documentation from the source repository. (#2126) -
Improved reactive value name inference to support all import styles:
reactive.Value(),reactive.value(),Value(), andvalue()now all correctly infer variable names for better OpenTelemetry log messages. (#2178) -
Enhanced OpenTelemetry source reference attributes by adding
code.column.numberto track the column position of reactive value updates alongside existing file path, line number, and function name. (#2178) -
Improved OpenTelemetry collection level handling: reactive values now capture the collection level at initialization time (matching behavior of
CalcandEffect), ensuring consistent telemetry behavior throughout the value's lifetime. (#2178)
- Updated
palmerpenguinsdependency to version>=0.1.5to include type stubs, removing the need for type ignore comments in tests. (#2157)
-
Added toast notification system with
ui.toast(),ui.toast_header(),ui.show_toast(), andui.hide_toast(). Toast notifications are temporary, non-intrusive messages that support multiple semantic types (success, warning, error, etc.), flexible positioning (9 positions: top/middle/bottom × left/center/right), auto-hide with configurable duration, optional headers with icons, and programmatic control. (#2111) -
Added a new
input_submit_textarea()input element, which is similar toinput_text_area(), but includes a submit button to only submit the text changes to the server on click. This is especially useful when the input text change triggers a long-running operation and/or the user wants to type longer-form input and review it before submitting it. (#2099)
-
Fixed
ui.tooltip()'soptionsparameter to properly pass Bootstrap tooltip options to the underlying web component. (#2101) -
Fixed an issue where
session.bookmark()would error when non-existentinputvalues are read. (#2117) -
Revised
accordion()'sopenlogic to close all panels when an empty list is passed. (#2109)
-
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)
-
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)
-
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)
-
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)
-
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)
-
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)
-
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)
-
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)
-
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)
-
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. (#1822)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)
-
ui.Chat()now correctly handles newollama.chat()return value introduced inollamav0.4. (#1787) -
Updated
expect_height()for Valuebox controllers to check the height property instead of max-height. (#1816)
-
Branded theming via
ui.Theme.from_brand()now correctly applies monospace inline and block font family choices. (#1762) -
Compatibility with
websockets>=14.0, which has changed its public APIs. Shiny now requires websockets 13 or later. (#1769)
-
.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 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)
-
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)
-
A few fixes for
ui.Chat(), including:- Fixed a bug with
Chat()sometimes silently dropping errors. (#1672) - Fixed a bug with
Chat()sometimes not removing it's loading icon (on error or aNonetransform). (#1679) .messages(format="anthropic")correctly removes non-user starting messages (once again). (#1685)
- Fixed a bug with
-
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)
-
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)
- 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
-
A few fixes for
ui.Chat(), including:- A fix for use inside Shiny modules. (#1582)
.messages(format="google")now returns the correct role. (#1622)transform_assistant_responsecan now returnNoneand correctly handles change of content on the last chunk. (#1641)
-
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)
-
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)
-
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)
-
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)
-
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)
- Fixed an issue with output spinners only showing for a split second. (#1429)
- Fixed an issue with opacity dimming occurring too often/quickly when outputs are recalculating. (#1415)
-
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)
-
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)
-
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)
-
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)
-
@render.data_framereturn values ofDataTableandDataGridhad their parameter ofrow_selection: Literal["single", "multiple"]become deprecated. Please useselection_mode="row"orselection_mode="rows"instead. (#1198) -
The
col_widthsargument ofui.layout_columns()now sets thesmbreakpoint by default, rather than themdbreakpoint. For example,col_widths=(12, 6, 6)is now equivalent to{"sm": (12, 6, 6)}rather than{"md": (12, 6, 6)}. (#1222)
-
Sessionobjects 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_framereturn values ofDataTableandDataGridsupporteditable=Trueto enable editing of the data table cells. (#1198) -
ui.card()andui.value_box()now take anidargument 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.expressin Quarto Dashboards. (#1217) -
ui.value_box(),ui.layout_columns()andui.layout_column_wrap()now all havemin_heightandmax_heightarguments. 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 createwas 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)
-
On Windows, Shiny Express app files are now read in as UTF-8. (#1203)
-
input_dark_mode()now accepts astyleargument that can be used to customize the appearance and position of the dark mode toggle switch. (#1207) -
Calling
ui.update_selectize()withchoicesandselectednow 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.uiwhen 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_heightsat thexsbreakpoint, if supplied. (#1222) -
ui.panel_conditional()now adds the.shiny-panel-conditionalclass to the<div>element wrapping the conditional panel contents. (#1257) -
ui.panel_conditional()no longer results in unwanted double padding when the parent container usesgapfor 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)
- The fill CSS used by fillable containers (i.e. when
fillable=True) now uses a CSS cascade layer namedhtmltoolsto reduce the precedence order of the fill CSS. (#1228)
ui.page_sidebar()now places thetitleelement in a.navbarcontainer that matches the structure ofpage_navbar(). This ensures that the title elements ofpage_sidebar()andpage_navbar()have consistent appearance. (#1176)
-
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 usesgapfor spacing multiple elements (e.g.,ui.layout_columns(),ui.page_fillable(), etc). (#1176)
-
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 usegapandpaddingarguments to choose your own values, or you can set the$bslib-spacer(Sass) or--bslib-spacer(CSS) variable. (#1176)
-
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.Sidebarclass. Theui.Sidebarclass 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)
-
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 themodeargument. 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 keysdesktopandmobile, 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_assetsanddebug. (#1170) -
Closed #1079: For Shiny Express apps, automatically run a
globals.pyfile in the same directory as the app file, if it exists. The code inglobals.pywill be run with the session context set toNone. (#1172)
-
Fixed
input_task_buttonnot working in a Shiny module. (#1108) -
Fixed several issues with
page_navbar()styling. (#1124) -
Fixed
Renderer.output_idto 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)
-
@render.data_framenow 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.cardevent 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-indexvalue to ensure it always appears above elements in the main content area ofui.layout_sidebar(). The sidebar overlay also now receives the same highz-indexon 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) -
Replaced use of
sys.stderr.write()withprint(file=sys.stderr), because on some platformssys.stderrcan beNone. (#1131) -
Replaced soon-to-be deprecated
datetimemethod calls when handlingshiny.datetimeinputs. (#1146)
-
Fixed
render.downloadnot working in Express. (#1085) -
express.ui.hold()can now accept any type of object, instead of justTagChildobjects. (#1089) -
Fixed an issue where
input_selectizewould not initialize correctly when created within a Shiny module. (#1091)
- Closed #938:
page_sidebar()andpage_navbar()now usefillable=Falseby default. (#990)
-
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_taskdecorator for creating long-running tasks that can be cancelled. (#907) -
Added
@render.downloadas 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_shutdownmethod for registering a callback to be called when the app is shutting down. (#907) -
You can now pass options to
ui.input_selectizesee the selectize.js docs for available options. (#914, #158) -
ui.input_selectizegains theremove_buttonargument which allows you to control the visibility of the remove button.
-
CLI command
shiny create... (#965)- has added a
-d/--dirflag 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-reacttemplate build error. (#965) -
Fixed #1007: Plot interaction with plotnine provided incorrect values. (#999)
- Output renderers should now be created with the
shiny.render.renderer.Rendererclass. 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 whereITis the type (excludingNone) required to be returned from the App author. (#964)- Legacy renderers that will be removed in the near future:
shiny.render.RenderFunctionshiny.render.RenderFunctionAsyncshiny.render.transformer.OutputRenderershiny.render.transformer.OutputRendererSyncshiny.render.transformer.OutputRendererAsync
- Legacy renderers that will be removed in the near future:
- Pinned Starlette to version <0.35.0; versions 0.35.0 and 0.35.1 caused problems when deploying on Posit Connect. (#1009 )
- Fixed #935:
shiny createrequired therequestspackage, but it was not listed as a dependency. It now usesurllibinstead, which is part of the Python standard library. (#940)
-
shiny createnow allows you to select from a list of template apps. -
shiny createprovides templates which help you build your own custom JavaScript components. -
Closed #814: The functions
reactive.Calcandreactive.Effecthave 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.Valuehas 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)
- Fix support for
shiny.ui.accordion(multiple=)(#799).
-
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 theTagobject that was passed in. Instead, it returns a newTagobject. Also closed #856: these functions now put thehtml-fill-containerandhtml-fill-itemCSS classes last, instead of first. (#862) -
App()now accepts a server function with a singleinputparameter, or a server function with parametersinput,outputandsession. Server functions with two or more than three parameters now raise an exception. (#920)
shiny.runonly allows positional arguments forapp,host, andport, all other arguments must be specified with keywords.
-
shiny runnow takesreload-includesandreload-excludesto allow you to define which files trigger a reload (#780). -
shiny.runnow passes keyword arguments touvicorn.run(#780). -
The
@outputdecorator is no longer required for rendering functions;@render.xxxdecorators now register themselves automatically. You can still use@outputexplicitly if you need to set specific output options (#747, #790). -
Added support for integration with Quarto (#746).
-
Added
shiny.render.renderer_componentsdecorator to help create new output renderers (#621). -
Added
shiny.experimental.ui.popover(),update_popover(), andtoggle_popover()for easy creation (and server-side updating) of Bootstrap popovers. Popovers are similar to tooltips, but are more persistent, and should primarily be used with button-like UI elements (e.g.input_action_button()or icons) (#680). -
Added CSS classes to UI input methods (#680) .
-
Sessionobjects can now accept an asynchronous (or synchronous) function for.on_flush(fn=),.on_flushed(fn=), and.on_ended(fn=)(#686). -
App()now allowsstatic_assetsto represent multiple paths. To do this, pass in a dictionary instead of a string (#763). -
The
showcase_layoutargument ofvalue_box()now accepts one of three character values:"left center","top right","bottom". (#772) -
value_box()now supports many new themes and styles, or fully customizable themes using the newvalue_box_theme()function. To reflect the new capabilities, we've replacedtheme_colorwith a newthemeargument. The previous argument will continue work as expected, but with a deprecation warning. (#772)In addition to the Bootstrap theme names (
primary,secondary, etc.), you can now use the main Boostrap colors (purple,blue,red, etc.). You can also choose to apply the color to the background or foreground by prepending abg-ortext-prefix to the theme or color name. Finally, we've also added new gradient themes allowing you to pair any two color names asbg-gradient-{from}-{to}(e.g.,bg-gradient-purple-blue).These named color themes aren't limited to value boxes: because they're powered by small utility classes, you can use them anywhere within your bslib-powered UI.
-
Added
shiny.ui.showcase_bottom(), a newshiny.ui.value_box()layout that places the showcase below the value boxtitleandvalue, perfect for a full-bleed plot. (#772)
-
shiny runnow respects the user providedreload-dirargument (#765). -
Fixed #646: Wrap bare value box value in
<p />tags. (#668) -
Fixed #676: The
render.data_frameselection feature was underdocumented and buggy (sometimes returningNoneas a row identifier if the pandas data frame's index had gaps in it). With this release, the selection is consistently a tuple of the 0-based row numbers of the selected rows--orNoneif no rows are selected. (#677) -
Added tests to verify that ui input methods, ui labels, ui update (value) methods, and ui output methods work within modules (#696).
-
Adjusted the
@render.plotinput type to beobjectto allow for any object (if any) to be returned (#712). -
In
layout_column_wrap(), whenwidthis a CSS unit -- e.g.width = "400px"orwidth = "25%"-- andfixed_width = FALSE,layout_column_wrap()will ensure that the columns are at leastwidthwide, unless the parent container is narrower thanwidth. (#772)
-
input_action_button()now defaults to having whitespace around it. (#758) -
layout_sidebar()now uses an<aside>element for the sidebar's container and a<header>element for the sidebar title. The classes of each element remain the same, but the semantic meaning of the elements is now better reflected in the HTML markup. (#772) -
layout_sidebar()no longer gives the sidebar main content area therole="main"attribute. (#772) -
Improved the style and appearance of the button to enter full screen in
card()s andvalue_box()es to better adapt to Bootstrap's dark mode. (#772)
-
Added
shiny.ui.navset_underline()andshiny.ui.navset_card_underline()whose navigation container is similar toshiny.ui.navset_tab()andshiny.ui.navset_card_tab()respectively, but its active/focused navigation links are styled with an underline. (#772) -
shiny.ui.layout_column_wrap(width, *args)was rearranged toshiny.ui.layout_column_wrap(*args, width). Now,widthwill default to200pxis no value is provided. (#772) -
shiny.ui.showcase_left_center()andshiny.ui.showcase_top_right()no longer take two values for thewidthargument. Instead, they now take a single value (e.g.,width = "30%") representing the width of the showcase are in the value box. Furthermore, they've both gainedwidth_full_screenarguments that determine the width of the showcase area when the value box is expanded to fill the screen. (#772) -
shiny.ui.panel_main()andshiny.ui.panel_sidebar()are deprecated in favor of new API forshiny.ui.layout_sidebar(). Please useshiny.ui.sidebar()to construct asidebar=and supply it toshiny.ui.layout_sidebar(sidebar, *args, **kwargs). (#788) -
shiny.experimental.ui.toggle_sidebar()has been renamed toshiny.ui.update_sidebar(). It'sopenvalue now only supportsboolvalues. (#788)
shiny.ui'snavset_pill_card()andnavset_tab_card()have been renamed tonavset_card_pill()andnavset_card_tab()respectively (#492).
The following methods have been moved from shiny.experimental.ui and integrated into shiny.ui (final locations under shiny.ui are displayed) (#680):
-
Sidebar - Sidebar layout or manipulation
sidebar(),page_sidebar(),update_sidebar(),layout_sidebar(),Sidebar
-
Filling layout - Allow UI components to expand into the parent container and/or allow its content to expand
page_fillable(),fill.as_fillable_container(),fill.as_fill_item(),fill.remove_all_fill()output_plot(fill=),output_image(fill=),output_ui(fill=, fillable=)
-
CSS units - CSS units and padding
css.as_css_unit(),css.as_css_padding(),css.CssUnit
-
Tooltip - Hover-based context UI element
tooltip(),update_tooltip()
-
Popover - Click-based context UI element
popover(),update_popover()
-
Accordion - Vertically collapsible UI element
accordion(),accordion_panel(),insert_accordion_panel(),remove_accordion_panel(),update_accordion(),update_accordion_panel(),Accordion,AccordionPanel
-
Card - A general purpose container for grouping related UI elements together
card(),card_header(),card_footer(),CardItem
-
Valuebox - Opinionated container for displaying a value and title
valuebox()showcase_left_center()showcase_top_right()
-
Navs - Navigation within a page
navset_bar(),navset_tab_card(),navset_pill_card()page_navbar(sidebar=, fillable=, fillable_mobile=, gap=, padding=),navset_card_tab(sidebar=),navset_card_pill(sidebar=),navset_bar(sidebar=, fillable=, gap=, padding=)
-
Layout - Layout of UI elements
layout_column_wrap()
-
Inputs - UI elements for user input
input_text_area(autoresize=)
If a ported method is called from shiny.experimental.ui, a deprecation warning will be displayed.
Methods still under consideration in shiny.experimental.ui:
-
card(wrapper=): A function (which returns a UI element) to call on unnamed arguments incard(*args)which are not alreadyshiny.ui.CardItemobjects. -
card_body(): A container for grouping related UI elements together -
card_image(): A general container for an image within ashiny.ui.card. -
card_title(): A general container for the "title" of ashiny.ui.card.
-
shiny.experimental.ui.FillingLayouthas been removed. (#481) -
shiny.experimental.ui.toggle_switch()has been made defunct. Please remove it from your code and useshiny.ui.update_switch()instead. (#772) -
shiny.experimental.ui.as_width_unit()has been made defunct. Please remove it from your code. (#772) -
shiny.experimental.ui'as_fill_carrier(),is_fill_carrier(),is_fillable_container(), andis_fill_item()have been made defunct. Remove them from your code. (#680, #788) -
Support for
min_height=,max_height=, andgap=inshiny.experimental.ui.as_fillable_container()andas_fill_item()has been removed. (#481) -
shiny.experimental.ui.TagCallablehas been made defunct. Please use its type is equivalent tohtmltools.TagFunction. (#680)
- Fixed #666: Added missing sidebar stylesheet dependency. (#667)
-
The new fast-scrolling data table/grid feature (
ui.output_data_frame/render.data_frame) now has a filtering feature. To enable, pass the argumentfilters=Trueto therender.DataTableorrender.DataGridconstructors. (#592) -
shiny runnow takes a--reload-dir <DIR>argument that indicates a directory--reloadshould (recursively) monitor for changes, in addition to the app's parent directory. Can be used more than once. (#353) -
The default theme has been updated to use Bootstrap 5 with custom Shiny style enhancements. (#624)
-
Added experimental UI
tooltip(),update_tooltip(), andtoggle_tooltip()for easy creation (and server-side updating) of Bootstrap tooltips (a way to display additional information when focusing (or hovering over) a UI element). (#629)
- Using
update_sliderto update a slider's value to adatetimeobject or other non-numeric value would result in an error. (#649)
-
Documentation updates. (#591)
-
Removed Python 3.7 support. (#590)
-
Added new fast-scrolling data table and data grid outputs. (#538)
-
Added
include_js()andinclude_css(), for easily including JS and CSS files in an application. (#127) -
Added sidebar, card, value box, and accordion methods into
shiny.experimental.ui. (#481) -
Added
fillandfillablemethods intoshiny.experimental.ui. IffillisTrue, then the UI component is allowed to expand into the parent container. IffillableisTrue, then the UI component will allow its content to expand. Bothfillon the child component andfillableon the parent component must beTruefor the child component to expand. (#481) -
Added sidebar methods into
shiny.experimental.ui.shiny.experimental.ui.layout_sidebar()does not requireui.panel_main()andui.panel_sidebar(). These two methods have been deprecated.x.ui.page_navbar(),x.ui.navset_bar(),x.navset_tab_card(), andx.navset.pill_card()addedsidebar=support. (#481) -
feat(sidebar):
ui.layout_sidebar()internally usesx.ui.layout_sidebar(), enabling filling layout features. (#568)
-
Fixed #496: Previously, when
shiny run --reloadwas used, the app would only reload when a .py file changed. Now it will reload when .py, .css, .js, and .html files change. (#505) -
Closed #535: Added a meta viewport tag, so that page layout will adapt to mobile device screens. (#540)
-
Added
shiny.experimentalas a place to put experimental features. When using Shiny's experimental features, we recommend importing them by callingimport shiny.experimental as x, so that all local function calls must start withx(e.g.x.ui.card()) to signify the method may be changed/removed without warning or future support. (#462) -
Added
penguinsexample. (#462) -
The bootstrap HTMLDependency is now created using the dev version of
{bslib}to get the latest features. (#462) -
Added
shiny.experimental.ui.input_text_area(), which supports auto-resizing height to fit the content whenautoresize=True. (#463)
shiny.reactive.lockis now exported. (#458)
- Fixed #456: plot interaction with datetimes raised errors on 32-bit platforms. (#457)
- When pyright creates type stubs for shiny, it now will include types imported in
_typing_extensions.py.
- Fixed #443: Errors in streaming downloads previously resulted in a partially downloaded file; now Shiny responds with a
Transfer-Encoding: chunkedheader, which allows the browser to detect the error and abort the download. (#447)
page_navbarnow accepts shinyswatch themes. (#455)
- Added support for URL based HTMLDependencies.
{htmltools}(v0.1.5.9001) added support for URL based HTMLDependencies in posit-dev/py-htmltools#53. (#437)
-
Added support for interacting with plots made with matplotlib, seaborn, and plotnine. (#392)
-
The
req()function now returns its first argument (assuming none of its arguments are falsey). This lets you perform validation on expressions as you assign, return, or pass them, without needing to introduce a separate statement just to callreq(). -
Added
Input.__contains__method, so that (for example) one could write an expression likeif "x" in inputs. (#402)
-
The
widthparameters forinput_selectandinput_slidernow work properly. (Thanks, @bartverweire!) (#386) -
When
input_selectorinput_selectizewere not given an explicitselectargument, they always chose the first item, which is correct whenmultiple=False, but not whenmultiple=True. Now whenmultiple=True, the first item is no longer automatically selected. (#396)
- Switched to new types from htmltools 0.1.5. (#416)
-
Closed #240, #330: Fixed live examples with additional files. (#340)
-
Fixed
shiny runhandling on Windows of absolute paths with drive letter, as inshiny run c:/myapp/app.py. (#370)
-
panel_conditionalnow works correctly inside of Shiny modules. (Thanks, @gcaligari!) (#336) -
Fix compatibility with Uvicorn 0.19.0 (#357)
shiny runnow takes a--launch-browserargument that causes the default web browser to be launched after the app is successfully loaded. Also, the--portargument now interprets a value of0as "listen on a random port". (#329)
- Updated API document generation with updated paths to work with new version of Shinylive. (#331)
-
Closed #312: Matplotlib plots in a
@render.plotcan now use the global figure, instead of returning afigureobject. (#314) -
Disabled
shiny staticcommand, in favor ofshinylive exportfrom the shinylive package. (#326)
-
Closed #269: The UI for a
shiny.Appobject can now be provided as a function. (#299) -
When a Shinylive deployment is made with
shiny static, it the deployment code is now delegated to Shinylive. (#310)
-
Fixed #279: When a Shiny application is mounted to a Starlette route, reactivity did not work. (#294)
-
Fixed #290:
@render.plotnow works as intended inside@module.server. (#292) -
Fixed #289:
input_selectize()now resolves the input id before using for other id-like attributes (#291)
- Fixed #281: Directory creation for Shinylive assets could fail if the parent directory did not exist. (#283)
Initial release of Shiny for Python https://shiny.posit.co/py/