Releases: jupyter-widgets/ipywidgets
Release 8.0.7
What's Changed
- fixed typo in docs by @djp52 in #3714
- DOC: added instruction to "Installing with pip" section by @StefanieSenger in #3779
- Lint by @jasongrout in #3782
- Fix tab widget with JupyterLab 4 by @martinRenou in #3787
- Explain that ipywidgets is part of jupyter-widgets software subproject by @paddymul in #3776
- Add support for building against JupyterLab 4 and Lumino 2 by @martinRenou in #3752
- docs/environment: Use jupyterlab-myst from pypi by @ferdnyc in #3794
New Contributors
- @djp52 made their first contribution in #3714
- @StefanieSenger made their first contribution in #3779
- @paddymul made their first contribution in #3776
- @ferdnyc made their first contribution in #3794
Full Changelog: 8.0.6...8.0.7
Release 8.0.6
What's Changed
- BUG: comm.kernel should be None when it has no kernel by @pllim in #3732
- Run prettier by @martinRenou in #3734
- add comm_manager check by @TTianshun in #3740
- Fix kernel attribute check by @martinRenou in #3737
- Add default
pack_models
by @bollwyvl in #3738 - fix: revert ipykernel dependency removal by @maartenbreddels in #3749
New Contributors
- @pllim made their first contribution in #3732
- @TTianshun made their first contribution in #3740
Full Changelog: 8.0.5...8.0.6
Release 8.0.5
What's Changed
- Fix deprecation warning by @jasongrout in #3670
- Overhaul docs toolchain by @bollwyvl in #3673
- More docs updates by @bollwyvl in #3674
- guard assignment of
Element.prototype
by @stevejpurves in #3644 - Add html colors "grey" in addition to "gray" by @Aztah in #3671
- Pass change options into update calls by @jasongrout in #3618
- Replace datalist children instead of appending by @jasongrout in #3682
- fix: deepcopy with
structuredClone
over JSON.parse/stringify by @manzt in #3689 - Fix notifications changing our visual tests by @jasongrout in #3694
- Fix CI by @martinRenou in #3720
- Using the new Comm Python package by @martinRenou in #3533
- chore: refine
IClassicCom
types by @manzt in #3722
New Contributors
Full Changelog: 8.0.4...8.0.5
Release 8.0.4
What's Changed
- Fix slider change event issue with tapping by @ibdafna in #3617
- Fix unintentional deprecation warnings by @jasongrout in #3650
- define
process.env
for jlab dependencies by @stevejpurves in #3643 - Fix registry state lookup by @bollwyvl in #3653
Full Changelog: 8.0.3...8.0.4
Release 8.0.3
What's Changed
- fix: make .widget and .widget_types deprecated by @maartenbreddels in #3567
- Button tooltip fix - default to description by @jmk89 in #3589
- Backport PR #3590: using _comm_default shadows possible bugs by @maartenbreddels in #3591
- Add dev meeting info to readme by @jasongrout in #3594
- Stricter typescript + some cleanups by @vidartf in #3570
- Calculate correct stack level for deprecation warnings to show them to the user by @jasongrout in #3569
- Bump d3-color from 3.0.1 to 3.1.0 by @dependabot in #3603
- WidgetRenderer: Soften manager type requirement by @martinRenou in #3625
- Update to
jupyterlite==0.1.0b14
by @jtpio in #3624 - Re-add the custom widget tutorial by @jtpio in #3611
- Handle
KernelWidgetManager
in the JupyterLabOutputModel
by @jtpio in #3561 - fix: do not hold sync during set_state by @maartenbreddels in #3642
New Contributors
Full Changelog: 8.0.2...8.0.3
Release 8.0.2
What's Changed
- Update to lerna 5.4.3 by @jtpio in #3548
- Deserialize state before setting it, as is done elsewhere set_state is used by @jasongrout in #3549
- Make the selection widgets mapping options error more helpful. by @jasongrout in #3556
- Allow the 'class' attribute to pass the sanitizer by @jasongrout in #3565
- Tweak some typings by @vidartf in #3554
- Fix slider update on readout text change by @jtpio in #3568
- Allow Mappings to be given as the options in a selection widget again. by @jasongrout in #3557
- Make the widget renderer higher priority in JupyterLab by @jasongrout in #3579
- Datetime widget fixes by @vidartf in #3581
- Narrow deserialize and improve strictness by @vidartf in #3571
- Add a note about defining widget model defaults with es6 inheritance. by @jasongrout in #3582
- Remove migration note about selection widgets and dictionaries by @jasongrout in #3583
Full Changelog: 8.0.1...8.0.2
Release 8.0.1
Full Changelog: 8.0.0...8.0.1
8.0.0
What's Changed
See the 8.0.0 changelog for a more comprehensive summary of changes. To see the full list of pull requests and issues, see the 8.0 milestone on GitHub, or the full list of changes since 7.x.
Users
Here are some highlights of user-visible changes in ipywidgets 8.0.
Date and time pickers
In addition to the existing DatePicker widget, we now have new DatetimePicker and TimePicker widgets. (#2715)
from ipywidgets import VBox, TimePicker, DatetimePicker
VBox([
TimePicker(description='Time'),
DatetimePicker(description='Date/Time')
])
Tags input widget
The new TagsInput widget provides an easy way to collect and manage tags in a widget. You can drag and drop tags to reorder them, limit them to a set of allowed values, or even prevent making duplicate tags. (#2591, #3272)
from ipywidgets import TagsInput
TagsInput(
value=['pizza', 'fries'],
allowed_tags=['pizza', 'fries', 'tomatoes', 'steak'],
allow_duplicates=False
)
Similarly, the new ColorsInput widget provides a way to select colors as tags
from ipywidgets import ColorsInput
ColorsInput(
value=['red', '#2f6d30'],
# allowed_tags=['red', 'blue', 'green'],
# allow_duplicates=False
)
Stack widget
The new Stack container widget shows only the selected child widget, while other child widgets remain hidden. This can be useful if you want to have a area that displays different widgets depending on some other interaction.
from ipywidgets import Stack, Button, IntSlider, Dropdown, VBox, link
s = Stack([Button(description='Click here'), IntSlider()], selected_index=0)
d = Dropdown(options=['button', 'slider'])
link((dropdown, 'index'), (stacked, 'selected_index'))
VBox([d, s])
File upload widget
The file upload widget has been overhauled to handle multiple files in a more useful format:
- The
.value
attribute is now a list of dictionaries, rather than a dictionary mapping the uploaded name to the content. - The contents of each uploaded file is a memory view in the
.content
key, e.g.,uploader.value[0].content
. - The
.data
attribute has been removed. - The
.metadata
attribute has been removed.
See the user migration guide for details on how to migrate your code.
More styling options
Many style and layout options have been added to core widgets:
- Tooltips are now supported for many core widgets, rather than just a few description tooltips (#2680)
from ipywidgets import Button Button(description="Click me", tooltip='An action')
- Borders can be styled independently with the layout's
border_top
,border_right
,border_bottom
,border_left
attributes (#2757, #3269)from ipywidgets import Button Button(description="Click me", layout={'border_bottom': '3px solid blue'})
- Descriptions are now plain text by default for security, but you can set them to allow HTML with the
description_allow_html
attribute (HTML content is still sanitized for security). (#2785)from ipywidgets import Text Text(description="<b>Name</b>", description_allow_html=True)
- Many other styling attributes can be set on core widgets, such as font family, size, style, weight, text color, and text decoration. See the table in the documentation for a reference. (#2728)
- The SelectionSlider now has a
handle_color
style attribute (#3142) - To control keyboard navigation, widgets can be set to be tabbable or not (i.e., that the tab key will traverse to the widget) (#2640)
Selection container titles
The Accordion, Tab, and Stack widgets now have a .titles
attribute that you can use to get and set titles from the constructor or as an attribute. (#2746, #3296, #3477)
from ipywidgets import Tab, IntSlider, Text
Tab([IntSlider(), Text()], titles=('Slider', 'Text'))
Slider implementation
The slider implementation in the core widgets now uses nouislider. This enables us to fix long-standing bugs and introduce new features, like dragging the range in a RangeSlider. (#2712, #630, #3216, #2834)
Collaboration
By default, ipywidgets 8 enables a collaboration mode, where widget updates from one frontend are reflected back to other frontends, enabling a consistent state between multiple users and fixing synchronization between the kernel and frontend. You may want to disable these update echo messages if they are using too much bandwidth or causing slower interactivity. To disable echo update messages across ipywidgets, set the environment variable JUPYTER_WIDGETS_ECHO
to 0
. For widget authors, to opt a specific attribute of custom widget out of echo updates (for example, if the attribute contains a lot of data that does not need to be synchronized), tag the attribute with echo_update=False
metadata (we do this in core for the FileUpload widget's data
attribute). (#3195, #3343, #3394, #3407)
CDN for html manager
We have made it easier to load widgets from content delivery networks.
- The default CDN is changed from unpkg to jsDelivr (#3121, #1627)
- You can use the
data-jupyter-widgets-cdn-only
attribute to load modules only from CDN (#2792, #2786) - We have updated the webpack public path settings so the HTMLManager and the Jupyter Notebook extensions pull assets from wherever they are loaded, rather than only from CDN. If you author a custom widget, we highly encourage you to apply similar changes to your widget by adapting the changes at https://github.com/jupyter-widgets/widget-cookiecutter/pull/103/files. #3464, #3508
Other changes
Here is a short list of some of the other changes in ipywidgets 8.0.
- Add a cookiecutter-based tutorial to build a custom widget (#2919)
- Change media widgets to use memory views. (#2723)
- Upgrade to FontAwesome 5 in html-manager (#2713)
- Play widget now toggles between play and pause button as needed (#2703, #2671)
- Drop support for mapping types as selection options (#2679, #1958)
- Focus or blur a widget. (#2664, #2692, #2691, #2690)
- Drop notebook dependency from widgetsnbextension (#2590)
- Cast 'value' in range sliders to a tuple (#2441)
- Play widget: expose playing and repeat (#2283, #1897)
- Fix debouncing and throttling code (#3060)
- Fix regression on spinning icons (#2685, #2477)
- Fix selection container default index (#1823)
- Remove deprecated overflow properties (#2688)
- Select: Do not force a selec...
7.7.1
7.7.1
To see the full list of pull requests, see the 7.7.1 milestone on GitHub.
Highlights include:
- Fix broken link icon for FontAwesome 4 and 5 #3495
- Fix message throttling bug #3494
- Fix state message parsing to be more permissive #3486
- Fix tests on Python 3.11 #3480
- Add better front-page docs #3496
7.7
To see the full list of pull requests and issues, see the 7.7 milestone on GitHub.
Highlights include:
- Fix installation on Python 3.10. #3368
- Throw an error if we cannot render a widget, enabling the rendering system to fall back to rendering a different data type if available. #3290
- Create a new widget control comm channel, enabling more efficient fetching of kernel widget state. #3201
- Refactor logic for fetching kernel widget state to the manager base class. This logic first tries to use the new widget control comm channel, falling back to the existing method of requesting each widget's state individually. #3337
- Enable HTMLManager output widgets to render state updates. #3372
- Do not reset JupyterLab CSS variables if they are already defined. #3344
- Fix variable inspector example. #3302
- Introduce new widget manager
has_model
method for synchronously checking if a widget model is registered. #3377 - Work around bug in Chrome rendering Combobox arrows. #3375
- Optionally echo update messages from frontends to other frontends. This enables widget views in different frontends to maintain consistent state simultaneously, and also makes sure that simultaneous updates from the kernel and frontend resolve to a consistent state. This is off by default in ipywidgets 7.7, and it is anticipated this will be on by default in ipywidgets 8.0. To enable echo update messages across ipywidgets, set the environment variable
JUPYTER_WIDGETS_ECHO
to 1. To opt a specific attribute out of echo updates, tag the attribute withecho_update=False
metadata (we do this in core for the FileUpload widget'sdata
attribute). #3400, #3394
7.6.3
7.6.3
A minor release in 7.6.x series.
From changelog.md:
7.6
To see the full list of pull requests and issues, see the 7.6.0 milestone on GitHub.
The main change in this release is that installing ipywidgets
7.6.0 will now automatically enable ipywidgets support in JupyterLab 3.0—a user has no extra JupyterLab installation step and no rebuild of JupyterLab, nor do they need Node.js installed. Simply install the python ipywidgets package with pip (pip install ipywidgets==7.6.0
) or conda/mamba (conda install -c conda-forge ipywidgets=7.6.0
) and ipywidgets will automatically work in classic Jupyter Notebook and in JupyterLab 3.0.
This is accomplished with the new python package jupyterlab_widgets
version 1.0, on which ipywidgets
7.6.0 now depends (similar to how ipywidgets
already depends on the widgetsnbextension
package to configure ipywidgets for the classic Jupyter Notebook). The jupyterlab_widgets
Python package is a JupyterLab 3.0 prebuilt extension, meaning that it can be installed into JupyterLab 3.0 without rebuilding JupyterLab and without needing Node.js installed.
Updates for Widget Maintainers
Custom widget maintainers will need to make two changes to update for JupyterLab 3:
-
Update the
@jupyter-widgets/base
dependency version to include^4
to work in JupyterLab 3.0. For example, if you had a dependency on@jupyter-widgets/base
version^2 || ^3
, update to^2 || ^3 || ^4
for your widget to work in classic Jupyter Notebook, JupyterLab 1, JupyterLab 2, and JupyterLab 3. See #2472 for background. -
In the
package.json
, add the followingsharedPackages
configuration inside thejupyterlab
key. See the JupyterLab extension documentation for more information."jupyterlab": { "sharedPackages": { "@jupyter-widgets/base": { "bundled": false, "singleton": true } } }
Separate from these two steps to update for JupyterLab 3, we also recommend that you make your widget's JupyterLab extension a prebuilt extension for JupyterLab 3.0. Users will be able to install your JupyterLab 3.0 prebuilt extension without rebuilding JupyterLab or needing Node.js. See the JupyterLab 3 extension developer documentation or the new widget extension cookiecutter for more details.