diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab1752cad..ffa347f45 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,490 +6,426 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
### Added
-- #### Accordion, Expansion panel
- - Find-in-page now searches the content of a collapsed expansion panel. A match, a text fragment or a link to an element in the content opens the panel at once and the browser scrolls to the match. The panel sends `igcOpening`, which can be canceled, and `igcOpened`, as for a user toggle. A disabled panel stays closed and its content is not searchable. In an accordion with `single-expand`, the other panels close at once, without the animation, so the match stays in view. The content uses `hidden="until-found"` (Chrome 102, Firefox 139, Safari 26.2); other browsers hide it as before.
+- #### Accordion, Expansion panel, Tabs, Tree
+ - Find-in-page, text fragments and links to an element now find content in collapsed panels, in tabs that are not selected and in collapsed tree items. The component shows the match and emits its usual events. [#2594](https://github.com/IgniteUI/igniteui-webcomponents/pull/2594)
+ - Expansion panel: opens and emits `igcOpening`, which you can cancel, and `igcOpened`. In an accordion with `single-expand`, the other panels close with no animation.
+ - Tabs: selects the tab and emits `igcChange`. The focus does not move, and a link tab does not follow its link.
+ - Tree: expands the collapsed items above the match. Each item emits `igcItemExpanding`, which you can cancel, and `igcItemExpanded`. In WebKit, the tree does not scroll to a match in an item that skips its rendering.
+ - A disabled panel, tab or item stays closed, and its content is not searchable.
+ - The browser must support `hidden="until-found"` (Chrome 102, Firefox 139, Safari 26.2). Other browsers hide the content as before.
- #### API documentation
- - The manifest and the API documentation now list the custom states: `ig-invalid` of the form controls, `disabled` and `label-before` of the radio group, and `start-collapsed` and `end-collapsed` of the splitter. Style them with `:state()`, for example `igc-input:state(ig-invalid)`.
- - They also list the parts that were not documented: `prefixed`, `suffixed`, `filled`, `labelled`, `start`, `notch`, `filler` and `end` of the input, mask input, file input, date time input and textarea, `placeholder` of the textarea, `file-parts` of the file input, `dialog-base`, `title` and `footer` of the date pickers in dialog mode, `tabs`, `inner` and `scrollable` of the tabs, `indicator` and `inactive` of the carousel, and `counter` and `fraction` of the progress indicators.
- - The description of the splitter now includes its keyboard table.
-- #### Button, Icon button
- - A host `aria-pressed` now goes to the native button, so a button can be a toggle button. A link does not get it, also when it is disabled, because the link role does not allow it. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - A host `aria-expanded`, `aria-haspopup` and `aria-controls` now go to the native button and to the link, so a button that opens a menu, a panel or a drawer can tell its state to assistive technology. This also applies to the `aria-haspopup` and `aria-expanded` that the dropdown writes on a button target, and to the `aria-controls` of the carousel navigation buttons. [#2513](https://github.com/IgniteUI/igniteui-webcomponents/issues/2513)
+ - The manifest and the API documentation now list the custom states and 20 parts that were not documented. The states are `ig-invalid` of the form controls, `disabled` and `label-before` of the radio group, and `start-collapsed` and `end-collapsed` of the splitter. Style a state with `:state()`, for example `igc-input:state(ig-invalid)`. [#2489](https://github.com/IgniteUI/igniteui-webcomponents/pull/2489)
- #### Calendar, Date picker, Date range picker
- - `DateRangeDescriptor` has an optional `label`. The calendar adds the labels of the matching `specialDates` and `disabledDates` descriptors to the accessible name of a date, for example "Thursday, October 8, 2026, Free delivery". Before, the special state was only visual. [#2423](https://github.com/IgniteUI/igniteui-webcomponents/pull/2423)
+ - `DateRangeDescriptor` has an optional `label`. The calendar adds the labels of the matching `specialDates` and `disabledDates` to the accessible name of a date, for example "Thursday, October 8, 2026, Free delivery". [#2423](https://github.com/IgniteUI/igniteui-webcomponents/pull/2423)
- #### Chat
- - `focusInput()` moves the focus to the text area, for example after the application sets `draftMessage`. It returns a promise. In a new chat, it waits for the first render, and in a server-rendered chat, for the render after the hydration. It does nothing when a custom `input` renderer replaces the text area. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - `igcNavigate` is emitted when a plain click or Enter opens a link in a message in the same tab, before the browser navigates. Cancel it to route on the client. The detail has the message and the absolute URL. The event does not bubble and is not composed, so listen to it on the chat.
-- #### Chip
- - A host `aria-expanded`, `aria-haspopup` and `aria-controls` now go to the action button, so a chip that opens a menu or a filter panel can tell its state to assistive technology. A selectable chip keeps its `aria-pressed`.
+ - `focusInput()` moves the focus to the text area, for example after you set `draftMessage`. It waits for the first render. It does nothing when a custom `input` renderer replaces the text area. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474) [#2539](https://github.com/IgniteUI/igniteui-webcomponents/pull/2539)
+ - `igcNavigate` is emitted before a plain click or Enter opens a message link in the same tab. Cancel it to route on the client. The detail has the message and the absolute URL. The event does not bubble, so listen to it on the chat. [#2573](https://github.com/IgniteUI/igniteui-webcomponents/pull/2573)
- #### Combo
- - Remote data: with `filteringOptions.mode` set to `remote`, the combo does not filter the options and keeps the search input. `igcSearchInput` reports the search text in `detail.searchText`, in both modes, so the application can search on the server and set `data` to the results. It also reports an empty text when a selection, a blur or the clear button clears the text, and the same text when the case-sensitive icon changes the case. The icon also shows in remote mode, so the application reads `filteringOptions.caseSensitive` for the server search. In remote mode, `igcDataRequest` asks for more items when the user scrolls near the end of `data`: append `count` items at `startIndex`, which is `data.length`. The new `ComboFilteringMode` and `IgcComboSearchInputEventArgs` types describe the mode and the detail. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519)
- - `totalItemCount` gives the number of all the items of a remote source. In remote mode, the list shows a placeholder option for each item that `data` does not hold yet, so the scrollbar shows the full list, and `igcDataRequest` asks for the placeholders that the list renders, up to the total. Each placeholder is the skeleton of an item, with a wave that sweeps across it. `loading` shows a spinner, an indeterminate circular progress, in place of the toggle icon, and an empty list shows "Loading" instead of the empty message. The `loading` slot replaces the spinner. The spinner and the skeletons have the text color of the `loading` and `placeholder` parts, so `::part(loading)` and `::part(placeholder)` can set their colors. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519)
- - `bindComboDataSource()` in `igniteui-webcomponents/extras/combo-data-source` binds a combo to a server that searches and pages: you give it a `load` function that returns one page, and an optional `resolve` for the items of preset values. `load` gets the search text and `caseSensitive`. A new search text or a click on the case-sensitive icon loads the first page again. It sets `totalItemCount` from the total of the pages, and `loading` while a search waits or a page loads. A request loads at least `pageSize` items, and after a jump, such as End, all the items up to it. See "Extras" in the README. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519)
- - `selectAllItems()` and `deselectAllItems()` select and deselect the items that the list shows after the filter. With `ignoreFilter`, they act on all the items of `data`. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535)
- - `showSelectAll` puts a "Select all" option first in the list in multiple selection mode. It selects the items that the list shows after the filter, or deselects them when all of them are selected, with one `igcChange`. While only some of them are selected, its checkbox is indeterminate. Like the other options in multiple selection, it reports `aria-checked`, which is `true` while all the shown items are selected and `mixed` while only some of them are. It is the first option in `aria-posinset` and `aria-setsize`. The `select-all` part styles the option, and the `indeterminate` part its checkbox. The text comes from the `combo_select_all` resource string. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535)
- - `groupSelection` makes each group header an option that works like the select-all option for the items of its group that the list shows, in multiple selection mode with `groupKey`. The header keeps the text style of a group header and the `group-header` part, and gets the `selected` and `active` parts and the checkbox parts with `indeterminate`. Like the select-all option, it reports `aria-checked`, which is `mixed` while only some of the shown items of its group are selected. It counts in `aria-posinset` and `aria-setsize`, and the arrow keys and Home stop on it. The items are one level in under their header, as in the tree, and `--ig-combo-item-indent` changes the indent. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535)
- - `selectionCommit` set to `confirm` holds the changes of the user while the list is open, in multiple selection mode. A toggle changes a pending selection and emits the cancelable `igcPendingChange`. Enter applies the pending selection with one `igcChange`, whose new `commit` type lists the items that it selects or deselects. Any other close drops it. While the list is open, `select()`, `deselect()`, `selectAllItems()` and `deselectAllItems()` change the pending selection. The footer shows Cancel and Apply, with the texts of the `combo_cancel` and `combo_apply` resource strings. Apply applies the pending selection as Enter does, and Cancel drops it. The `actions`, `cancel-button` and `apply-button` parts style them. Content in the `footer` slot replaces them: `pendingValue` gives the pending values, `commitSelection()` applies them, and `cancelSelection()` puts `value` back. These methods emit no events. The new `ComboSelectionCommit` type describes the property. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533)
- - `igcClosing` and `igcClosed` have a `detail` with the `trigger` that closes the list: `enter`, `escape`, `tab`, `arrow-up`, `outside-click`, `scroll`, `toggle` (a click on the input), `selection` (an item click in single selection), or `apply` and `cancel` (the buttons of the confirm mode). The new `IgcComboClosingEventArgs` and `ComboCloseTrigger` types describe the detail. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533)
- - The group header template gets `key`: the `groupKey` value that the items of the group share. The new `ComboGroupHeaderTemplate` and `ComboGroupHeaderContext` types describe the template and its context. Current templates continue to work. [#2462](https://github.com/IgniteUI/igniteui-webcomponents/issues/2462) [#2468](https://github.com/IgniteUI/igniteui-webcomponents/pull/2468)
-- #### Date time input, File input, Input, Mask input, Textarea
- - A host `role="combobox"`, `aria-expanded`, `aria-haspopup`, `aria-autocomplete`, `aria-controls` and `aria-activedescendant` now also go to the native input or textarea, so a page can make the field a combobox over its own listbox, for example in a command palette or a search with suggestions. The focus stays in the field, and the screen reader reads the active option. Another host role stays on the host, and so does `aria-expanded` without the combobox role, because a text box does not support it.
- - For @mention suggestions in a textarea, use `aria-autocomplete`, `aria-controls` and `aria-activedescendant` with no `role`, because HTML allows no role on a `textarea`.
+ - Remote data: set `filteringOptions.mode` to `remote` to stop the local filter. Read `detail.searchText` of `igcSearchInput`, search on the server, and set `data` to the results. When the user scrolls near the end of `data`, `igcDataRequest` asks for `count` more items at `startIndex`. New types: `ComboFilteringMode`, `IgcComboSearchInputEventArgs`. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `totalItemCount` gives the size of a remote source. The list shows a skeleton for each item that is not loaded, so the scrollbar shows the full length. `loading` shows a spinner in place of the toggle icon. Change them with the `loading` slot and the `loading` and `placeholder` parts. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `bindComboDataSource()` from `igniteui-webcomponents/extras/combo-data-source` connects a combo to a server that searches and pages. You give it a `load` function that returns one page, and an optional `resolve` function for the items of preset values. It sets `totalItemCount` and `loading`. See "Extras" in the README. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `showSelectAll` adds a "Select all" option in multiple selection. `selectAllItems()` and `deselectAllItems()` do the same from code. Both act on the items that the filter shows. Give `ignoreFilter` to the methods to act on all of `data`. Part: `select-all`. Resource string: `combo_select_all`. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `groupSelection` makes each group header an option that selects or deselects the shown items of its group, in multiple selection with `groupKey`. The items are indented under their header. Set `--ig-combo-item-indent` to change the indent. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `selectionCommit="confirm"` holds the changes of the user while the list is open, in multiple selection. Each toggle emits `igcPendingChange`, which you can cancel. Enter or the Apply button applies the changes with one `igcChange`. Any other close drops them. For a custom `footer`, use `pendingValue`, `commitSelection()` and `cancelSelection()`. New type: `ComboSelectionCommit`. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - The `detail` of `igcClosing` and `igcClosed` gives the `trigger` of the close, for example `enter`, `escape`, `outside-click` or `apply`. New types: `IgcComboClosingEventArgs`, `ComboCloseTrigger`. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - The group header template gets `key`, the `groupKey` value of the group. New types: `ComboGroupHeaderTemplate`, `ComboGroupHeaderContext`. [#2462](https://github.com/IgniteUI/igniteui-webcomponents/issues/2462) [#2468](https://github.com/IgniteUI/igniteui-webcomponents/pull/2468)
- #### Dropdown
- - `header` and `footer` slots render content before and after the list items, outside the `listbox` role, such as a text field, a radio group or action buttons. Their content keeps its own keys. [#2531](https://github.com/IgniteUI/igniteui-webcomponents/issues/2531)
+ - The `header` and `footer` slots hold content before and after the items, outside the `listbox` role. Use them for a search field or action buttons. [#2531](https://github.com/IgniteUI/igniteui-webcomponents/issues/2531) [#2585](https://github.com/IgniteUI/igniteui-webcomponents/pull/2585)
- #### File input
- - `directory` lets the user select a folder instead of files. The selection holds all files in the folder and its subfolders, and `webkitRelativePath` gives the path of each file from the folder. The control shows the folder name. In Chromium, a multipart form submission sends the relative path as the file name. [#2481](https://github.com/IgniteUI/igniteui-webcomponents/pull/2481)
+ - `directory` lets the user select a folder. The selection holds all the files in the folder and its subfolders. `webkitRelativePath` gives the path of each file. [#2481](https://github.com/IgniteUI/igniteui-webcomponents/pull/2481)
- #### Form controls
- - `--ig-helper-min-lines` keeps space below a control for `1`, `2` or `3` message lines, also when no helper text or validation message shows. A message that shows then does not move the content below. Set it on a container, such as a form, to apply it to all the controls in it. It applies to the checkbox, color picker, combo, date picker, date range picker, date time input, file input, input, mask input, radio, select and textarea. In a radio group, only the last radio keeps the space, because the group shows its message there. A browser without container style queries keeps no space.
+ - `--ig-helper-min-lines` keeps space for `1`, `2` or `3` message lines below a control, so a validation message does not move the content below. Set it on a form to apply it to all its controls. The browser must support container style queries. [#2491](https://github.com/IgniteUI/igniteui-webcomponents/pull/2491)
+- #### Host ARIA attributes
+ - Button, Chip, Icon button: a host `aria-expanded`, `aria-haspopup` and `aria-controls` now go to the inner button or link. So assistive technology knows that the control opens a menu or a panel. A selectable chip keeps its `aria-pressed`. [#2513](https://github.com/IgniteUI/igniteui-webcomponents/issues/2513) [#2517](https://github.com/IgniteUI/igniteui-webcomponents/pull/2517) [#2581](https://github.com/IgniteUI/igniteui-webcomponents/pull/2581)
+ - Button, Icon button: a host `aria-pressed` now goes to the native button, so the button can be a toggle button. A link does not get it. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
+ - Date time input, File input, Input, Mask input, Textarea: a host `role="combobox"`, `aria-expanded`, `aria-haspopup`, `aria-autocomplete`, `aria-controls` and `aria-activedescendant` now go to the native field. Use them to make the field a combobox over your own listbox, for example in a command palette. Do not set `role` on a textarea, because HTML does not allow it. [#2548](https://github.com/IgniteUI/igniteui-webcomponents/pull/2548)
- #### Library
- - When another class already defines the tag of a component, the component does not define the tag and writes one warning to the console. An example is a second copy or version of the library on the page. Before, it gave no warning. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - A component no longer defines its tag when another class already defines it, for example a second copy of the library on the page. It writes one warning to the console. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- #### Localization
- - The color picker, dialog, splitter, tile and tooltip have `locale` and `resourceStrings`. The strings come from `igniteui-i18n-core`, and the languages from `igniteui-i18n-resources`. Before, these default texts were always in English: [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477) [#2480](https://github.com/IgniteUI/igniteui-webcomponents/pull/2480)
- - Color picker: the labels of its buttons, dialog, sliders, canvas marker, alpha input, color value input and format select. The English label of the color value input is now "Color value", not "Color value input".
- - Dialog: the default action.
- - Splitter: the default name of the bar.
- - Tile: the names of the maximize and fullscreen actions.
- - Tooltip: the name of the close button of a sticky tooltip.
- - The chat and the tile manager have `locale`. The chat uses it for its resource strings. The tile manager has no strings of its own. It gives the locale to its tiles that have no `locale`, also to tiles that you add later. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475) [#2478](https://github.com/IgniteUI/igniteui-webcomponents/pull/2478)
+ - The color picker, dialog, splitter, tile and tooltip have `locale` and `resourceStrings`. Before, their default labels were English only. The English label of the color value input is now "Color value". [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477) [#2480](https://github.com/IgniteUI/igniteui-webcomponents/pull/2480)
+ - The chat and the tile manager have `locale`. The tile manager gives its locale to the tiles that have no `locale`. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475) [#2478](https://github.com/IgniteUI/igniteui-webcomponents/pull/2478)
- #### QR code
- - `copyToClipboard()` copies the code as a PNG image. With `format: 'svg'`, it copies an SVG image and also a PNG image for applications that do not read SVG. A browser that cannot copy SVG gets only the PNG image. `scale` multiplies the image size. The promise resolves with the format that the clipboard got: `'png'` or `'svg'`. The new `QrCodeCopyFormat` and `QrCodeCopyOptions` types describe the format and the options. Browsers accept a clipboard write only during a user action. So call the method directly in the event handler, for example of a click, with no `await` before it. [#2483](https://github.com/IgniteUI/igniteui-webcomponents/pull/2483)
+ - `copyToClipboard()` copies the code as a PNG image. With `format: 'svg'`, it copies an SVG image and a PNG image. `scale` multiplies the size. The promise resolves with the format that the clipboard got. Browsers allow the copy only during a user action. So call the method directly in the event handler, with no `await` before it. New types: `QrCodeCopyFormat`, `QrCodeCopyOptions`. [#2483](https://github.com/IgniteUI/igniteui-webcomponents/pull/2483)
- #### Tabs
- - `header-background` theme token. It paints the full header strip behind the tab items. Until you set it, it follows `item-background`, so a translucent `item-background` does not stack on a copy of itself. You can also make only the header transparent. The `tabs-theme` function of `igniteui-theming` 29.1.0 has the matching `$header-background` parameter. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- - Link tabs: with `href`, a tab renders its header as a link with the tab role. The user can open the link in a new browser tab with a middle click, Ctrl/Cmd+click or Ctrl/Cmd+Enter, and copy its address. These do not change the selection. A plain click, Enter or Space selects the tab, emits `igcChange`, emits `igcNavigate` on the tab and follows the link. Cancel `igcNavigate` to route on the client; a click in the panel does not emit it. The event does not bubble and is not composed. `target` and `rel` go to the link. A click on a tab whose `target`, or the target of the page's ` ` element, is not `_self` does not change the selection. In a page that is not in a frame, `_parent` and `_top` count as `_self`. A disabled tab has no URL.
- - `headerPosition` (`header-position`) puts the headers in a column on the `start` or `end` side of the panels. The default, `top`, keeps the row above the panels. The sides follow the direction, so a `start` column is on the right in a right-to-left layout. In a column, Up and Down move between the tabs, the tab list has `aria-orientation="vertical"`, `alignment` applies along the column, and the indicator is on the side of the panels in every theme. The column is as wide as the widest header, up to the width limit of a header. In a narrow column, a long label wraps and the panel keeps part of the width. Each header is at least as tall as in a row. Without a set height, the tabs grow with the selected panel. Give the tabs a `height` or a `max-height`, or put them in a parent that sets a height, to make a taller panel scroll its content and to show scroll buttons above and below the headers when they do not fit. A parent that sizes the tabs from their content, such as a grid row with an auto height, lets them grow with the panel. The new `TabsHeaderPosition` type describes the values. [#2553](https://github.com/IgniteUI/igniteui-webcomponents/issues/2553)
- - Find-in-page now searches the panels that are not selected. A match, a text fragment or a link to an element in a panel selects its tab and sends `igcChange`, as a click does. The reveal does not move the focus, and a link tab does not follow its link. The panel of a disabled tab is not searchable. The panels use `hidden="until-found"` (Chrome 102, Firefox 139, Safari 26.2); other browsers hide them as before.
+ - `headerPosition` (`header-position`) puts the headers in a column on the `start` or `end` side of the panels. The default is `top`. In a column, Up and Down move between the tabs. Give the tabs a `height` or a `max-height` to scroll a tall panel and to show the scroll buttons. New type: `TabsHeaderPosition`. [#2553](https://github.com/IgniteUI/igniteui-webcomponents/issues/2553) [#2556](https://github.com/IgniteUI/igniteui-webcomponents/pull/2556)
+ - Link tabs: a tab with `href` renders its header as a link. A plain click, Enter or Space selects the tab, emits `igcChange` and `igcNavigate`, and follows the link. Cancel `igcNavigate` to route on the client. A middle click, Ctrl/Cmd+click and Ctrl/Cmd+Enter open the link in a new browser tab and do not change the selection. `target` and `rel` go to the link. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
+ - The `header-background` theme token paints the full header strip. Until you set it, it follows `item-background`. The `tabs-theme` function of `igniteui-theming` 29.1.0 has the matching `$header-background` parameter. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- #### Text selection
- - The date picker, date time input, input, mask input and textarea have read-only `selectionStart` and `selectionEnd`. Before, you could set the selection with `setSelectionRange()`, but not read it. In the input, both are `null` for the `email` and `number` types, as on the native input. In the mask input and the date time input, they give the selection from `setRangeText()` when `updateComplete` resolves. [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451) [#2452](https://github.com/IgniteUI/igniteui-webcomponents/pull/2452)
+ - The date picker, date time input, input, mask input and textarea have read-only `selectionStart` and `selectionEnd`. In the input, both are `null` for the `email` and `number` types, as in the native input. [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451) [#2452](https://github.com/IgniteUI/igniteui-webcomponents/pull/2452)
- #### Theming
- - Four export conditions keep only one theme in your bundle: `igc-theme-material`, `igc-theme-bootstrap`, `igc-theme-indigo` and `igc-theme-fluent`. Set one in your bundler, or with `node --conditions`. The bundle then has only the light and dark styles of that theme, and is approximately 15–17% smaller after gzip. Without a condition, the bundle has all four themes. With a theme that is not in the bundle, `configureTheme()` gives only the structural styles. See "Bundling a single theme" in the README. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - Four export conditions keep only one theme in your bundle: `igc-theme-material`, `igc-theme-bootstrap`, `igc-theme-indigo` and `igc-theme-fluent`. Set one in your bundler or with `node --conditions`. The bundle is then approximately 15–17% smaller after gzip. With a theme that is not in the bundle, `configureTheme()` gives only the structural styles. See "Bundling a single theme" in the README. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- #### Tile manager
- - `--grid-padding` sets the padding of the grid. The default is still `1.25rem`. For example, set it to `0` to align the tiles with the rest of the page. The resize handles then stay inside the tiles, so they do not make the grid scroll. With a smaller padding, they stand out of the tiles only by the padding. Set the padding with this variable, not on the `base` part. A padding of more than one value, such as `0 1rem`, also keeps the handles inside the tiles.
+ - `--grid-padding` sets the padding of the grid. The default is `1.25rem`. Use it, not a padding on the `base` part, so that the resize handles stay inside the tiles. [#2501](https://github.com/IgniteUI/igniteui-webcomponents/pull/2501)
- #### Tooltip
- - `showAt()` shows the tooltip at a point or against a rectangle, in viewport coordinates. Use it for the pointer over a canvas, a chart or an SVG drawing, for example `tooltip.showAt({ x: event.clientX, y: event.clientY })`. A `DOMRect` also fits the new `TooltipRect` type. A call while the tooltip shows at a point moves it, with no animation and no events. `placement`, `offset`, `withArrow` and the flip at the viewport edges apply. The point binds no triggers and no `aria-describedby`, and the tooltip does not hide when the pointer leaves it, so the application shows and hides it. `Escape` still closes it. After it closes, the `anchor` applies again, also an `anchor` that changed while the tooltip showed at the point. The triggers of the `anchor` wait until then. The position is also correct inside an ancestor with `transform` or `zoom`. [#2538](https://github.com/IgniteUI/igniteui-webcomponents/issues/2538)
-- #### Tree
- - Find-in-page now searches the children of a collapsed tree item. A match, a text fragment or a link to an element in them expands the collapsed items above it, from the inside out, and each item sends `igcItemExpanding`, which can be canceled, and `igcItemExpanded`, as for a user toggle. The items expand at once, without the animation, and with `singleBranchExpand` the path to the match stays expanded. A disabled item stays collapsed and its children are not searchable. In WebKit, the tree expands the path but does not scroll to a match in a collapsed item that skips its rendering.
+ - `showAt()` shows the tooltip at a point or a rectangle, in viewport coordinates. For example, `tooltip.showAt({ x: event.clientX, y: event.clientY })` shows it at the pointer over a canvas. Call it again to move the tooltip. The application shows and hides the tooltip, and Escape still closes it. After it closes, `anchor` applies again. New type: `TooltipRect`. [#2538](https://github.com/IgniteUI/igniteui-webcomponents/issues/2538) [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
### Changed
- #### Avatar, Badge, Carousel
- - The avatar, the badge and the carousel slide no longer have an `aria-roledescription`. Screen readers now announce the role ("image", "status" or "tab panel") in the language of the user. Before, they announced the English words "avatar", "badge" and "slide" in all languages. The carousel keeps its role description, which now comes from the `carousel_role_description` resource string. To set a role description, put an `aria-roledescription` attribute on the element. [#2472](https://github.com/IgniteUI/igniteui-webcomponents/pull/2472) [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477)
+ - The avatar, the badge and the carousel slide no longer set `aria-roledescription`. Screen readers now announce their role in the language of the user, not the English words "avatar", "badge" and "slide". To set a role description, add an `aria-roledescription` attribute. The carousel keeps its role description, from the `carousel_role_description` resource string. [#2472](https://github.com/IgniteUI/igniteui-webcomponents/pull/2472) [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477)
+- #### Calendar, Chat, Color picker, Combo
+ - **Behavioral change:** The events of inner components no longer leave the component. Listen to the events of the component. [#2530](https://github.com/IgniteUI/igniteui-webcomponents/issues/2530) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545) [#2568](https://github.com/IgniteUI/igniteui-webcomponents/pull/2568)
+ - Chat: use `igcInputChange`, not `igcInput` or `igcChange` of the text area. Use `igcAttachmentRemoved`, not `igcRemove` of the attachment chip.
+ - Combo: use `igcSearchInput`, not `igcInput` of the inputs. A listener on the combo no longer gets a second `igcChange` from the search input. For more data on scroll, use `igcDataRequest` of the combo in remote mode, not the events of the inner list.
+ - Color picker: the `igcInput` of its inputs and the open and close events of its format select stay inside.
+ - Calendar: the internal `igcActiveDateChange` and `igcRangePreviewDateChange` stay inside, also in the date pickers.
- #### Carousel
- - The carousel now takes the height of its tallest slide, so the text of a slide no longer runs out of it. Before, the slides did not size the carousel: it took the height of its parent, and at least 240px. A `height` or `max-height` on the carousel, or a height from its parent, also in a flex or grid layout, still sets the height, and a taller slide is cut. Set a height also to keep the page from moving when the content of a slide loads late. The slides do not set the width. An image that is a direct child of a slide still fills the carousel and does not size it. Other content, such as an image in a `` element, now adds its height.
+ - **Behavioral change:** The carousel takes the height of its tallest slide, so the text of a slide no longer overflows. Before, it took the height of its parent, at least 240px. A `height` or `max-height` on the carousel, or a height from its parent, still sets the height. Set a height to keep the page stable when slide content loads late. An image that is a direct child of a slide does not add height. [#2550](https://github.com/IgniteUI/igniteui-webcomponents/pull/2550)
- #### Chat
- - The Markdown renderer of `igniteui-webcomponents/extras` does less work:
- - It loads shiki only when syntax highlighting is on. Before, a page that used `noHighlighter: true` still loaded shiki, about 128 KB (40 KB gzipped).
- - It loads only the light and dark themes that it uses, not all 65 bundled themes. With one theme for both modes, it highlights each code block once, not twice.
- - While a message streams, it no longer highlights the finished code blocks again for each chunk. `createMarkdownRenderer()` parses a message again only when its text changes.
- - A code block of more than 2 KB that still streams shows as plain code until its closing fence arrives. Before, the renderer highlighted it again for each chunk, at about 12 ms per KB.
- - Renderers with the same languages and themes share one highlighter. Before, each renderer created a highlighter that nothing freed, and shiki warned after ten renderers.
- - `colorReplacements` of the Markdown renderer now applies to every theme. Before, it applied only to the GitHub themes.
- - The Markdown renderer no longer opens links in the same origin, such as `/register` or `#top`, or links such as `mailto:`, in a new tab. Before, it gave each Markdown link `target="_blank"`, which a custom `sanitizer` or a DOMPurify configuration that allows `target` kept. With the default sanitizer, the renderer now also removes the `target` that the HTML sets on these links.
- - The Markdown renderer no longer uses `marked-shiki`, so it is no longer a peer dependency. You can remove it from your dependencies.
+ - The message area follows the newest message only while it is at the bottom. When the user scrolls up, new messages do not move it. A new message of the current user, or a new conversation, scrolls to the bottom again. At the bottom, the area also stays there when content grows late. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461) [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474) [#2594](https://github.com/IgniteUI/igniteui-webcomponents/pull/2594)
+ - The Markdown renderer of `igniteui-webcomponents/extras` does less work. It loads shiki only when syntax highlighting is on, and it loads only the themes that it uses. While a message streams, it highlights each finished code block one time. Renderers with the same languages and themes share one highlighter. A code block of more than 2 KB that still streams shows as plain code until its closing fence. [#2494](https://github.com/IgniteUI/igniteui-webcomponents/pull/2494)
+ - The Markdown renderer opens links to another origin in a new tab, with `rel="noopener noreferrer"`. Links in the same origin, such as `/register` or `#top`, and `mailto:` links open in the same tab, so the application can route them. Before, the result depended on the sanitizer. [#2494](https://github.com/IgniteUI/igniteui-webcomponents/pull/2494) [#2500](https://github.com/IgniteUI/igniteui-webcomponents/pull/2500)
+ - `colorReplacements` of the Markdown renderer applies to every theme, not only to the GitHub themes. [#2494](https://github.com/IgniteUI/igniteui-webcomponents/pull/2494)
+- #### Chat, List, Tree
+ - Tree items, list items and chat messages that are far from the view skip their rendering (`content-visibility: auto`). Long lists render faster. For example, the first render of a tree with 2,000 items takes 41% less time. [#2594](https://github.com/IgniteUI/igniteui-webcomponents/pull/2594)
+ - In a container that takes its width from its content, the width follows the items near the view. It can change while the user scrolls.
+ - `innerText` of a skipped item is an empty string. Use `textContent`.
+ - In Safari before 26, find-in-page does not find the text of a skipped item.
+ - To render every item, set `content-visibility: visible` on `igc-tree-item`, on `igc-list-item` or on `igc-chat::part(message-item)`.
- #### Chip
- - The `end` slot now renders after the `suffix` slot, at the end of the chip, as the `start` slot renders before the `prefix` slot. Before, it rendered before the `suffix` slot.
+ - The `end` slot renders after the `suffix` slot, at the end of the chip. Before, it rendered before the `suffix` slot. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
- #### Combo
- - **Behavioral change:** A new `data` keeps the selection. Before, a selected item that the new `data` did not hold dropped out of `selection` and the input text, although `value` kept it, and the next selection by the user removed it from `value` too. Now it stays selected until the user or the application deselects it. To clear the selection with the data, as for cascading combos, set `value` to `[]`. `select()` also selects an object that `data` does not hold, so an application can select the records of a saved filter before their page loads; with `valueKey`, the object resolves by its key first. Without an argument, `select()` keeps the selected items that `data` does not hold. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519)
- - **Behavioral change:** In multiple selection, a value of `value` that has no record in `data`, such as a value of a saved filter that a remote page does not hold yet, now stays in `value` when the user or a method changes other items. Before, the next change of the selection removed it, although the user could not see or deselect it. `deselect()` with that value or without an argument, `deselectAllItems(true)`, the clear icon and a new `value` remove it. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
- - **Behavioral change:** In single selection, `Enter` with the list closed now submits the form, as in a native input with a list, and the combo counts as a text field of the form. So a form with the combo and another text field needs a submit button. While the list is open, `Enter` still selects the active option and does not submit. In multiple selection, `Enter` does not submit, as in a native `select`. Before, `Enter` with the list closed did nothing. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
- - In multiple selection, the options report the state of their checkbox in `aria-checked`, not in `aria-selected`, as the WAI-ARIA listbox pattern allows for lists with checkboxes. So screen readers announce them as checked or not checked, as their checkboxes show. In single selection, the options keep `aria-selected`. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535)
- - The `igcInput` of the search input, and of the main input in single selection, no longer leaves the combo. Use `igcSearchInput`. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519)
- - `igcClosing` and `igcClosed` are typed `CustomEvent`, not `CustomEvent`. In TypeScript, change a handler that declares its parameter as `CustomEvent`. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533)
- - The `igcStateChange` and `igcDataRequest` events of the list inside the combo no longer leave the combo. For more data on scroll, use the `igcDataRequest` of the combo in remote filtering mode. [#2530](https://github.com/IgniteUI/igniteui-webcomponents/issues/2530)
+ - **Behavioral change:** A new `data` keeps the selection. A selected item or value that `data` does not hold stays selected until the user or the application deselects it. To clear the selection with the data, for example in cascading combos, set `value` to `[]`. `select()` also accepts objects that `data` does not hold, for example the records of a saved filter. [#2519](https://github.com/IgniteUI/igniteui-webcomponents/issues/2519) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - In multiple selection, the options report their checkbox state in `aria-checked`, not in `aria-selected`. Screen readers announce them as checked or not checked. [#2535](https://github.com/IgniteUI/igniteui-webcomponents/issues/2535) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - In TypeScript, `igcClosing` and `igcClosed` are `CustomEvent`, not `CustomEvent`. Change the handlers that declare `CustomEvent`. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+- #### Date picker, Date range picker, Date time input
+ - **Behavioral change:** `igcChange` reports only the changes of the user. A value that code sets no longer emits `igcChange` on the next blur or on Done. This applies to `value`, `clear()`, `stepUp()`, `stepDown()`, `setRangeText()`, `select()` and a form reset. The `clear()` of the date pickers still emits it, because their clear icon calls it. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488) [#2489](https://github.com/IgniteUI/igniteui-webcomponents/pull/2489) [#2580](https://github.com/IgniteUI/igniteui-webcomponents/pull/2580)
- #### Date picker, Date range picker, Dialog
- - **Behavioral change:** The backdrop of the dialog is now the native `::backdrop` of the `` element, in the top layer. So it covers the full page, also when an ancestor has a `transform`, a `filter` or a stacking context, for example a dialog in a tab panel. Before, the backdrop was an element with `position: fixed`, and such an ancestor kept it inside its own area. The `backdrop` and `animating` parts of the dialog, and the `overlay` part of the date picker and the date range picker in dialog mode, are removed. Styles for these parts do nothing now. To style the backdrop, use `igc-dialog::part(base)::backdrop`, or `::part(dialog-base)::backdrop` on a date picker. The backdrop also covers a toast or a snackbar that opened before the dialog. When `open` is set to `false` directly, the backdrop goes away at once with the dialog. With reduced motion, the backdrop does not fade.
-- #### Date time input
- - **Behavioral change:** A value that you set from code is no longer reported by `igcChange`, also while the input has the focus. This applies to `value`, `clear()`, `stepUp()`, `stepDown()`, `setRangeText()` and a form reset. The next blur compares the edit of the user with that value. Before, a blur after such a set emitted `igcChange` as if the user made the change. The date picker and the date range picker already did not report a `value` set from code. Their `clear()` still emits `igcChange` on the next blur, because their clear icon calls it.
+ - **Breaking change:** The dialog backdrop is now the native `::backdrop`, in the top layer. It covers the full page, also when an ancestor has a `transform`, a `filter` or a stacking context. It also covers a toast or a snackbar that opened before the dialog. [#2549](https://github.com/IgniteUI/igniteui-webcomponents/pull/2549)
+ - Removed parts: `backdrop` and `animating` of the dialog, and `overlay` of the date pickers in dialog mode.
+ - To style the backdrop, use `igc-dialog::part(base)::backdrop`, or `::part(dialog-base)::backdrop` on a date picker.
+ - **Behavioral change:** In dialog mode, the date pickers fade in and out, as the dialog does. `igcOpened` and `igcClosed` come after the animation, and `open` stays `true` until the exit ends. A change of `open` from code still applies at once. [#2574](https://github.com/IgniteUI/igniteui-webcomponents/pull/2574)
+- #### Date range picker
+ - **Behavioral change:** In dialog mode, Done emits `igcChange` after `igcClosing`. Done and Cancel change the range only when the close continues. So a canceled `igcClosing` keeps the dialog open with the selected range. To ask for a confirmation before a close, restore the range through `value` when the user declines. [#2577](https://github.com/IgniteUI/igniteui-webcomponents/pull/2577)
+ - **Behavioral change:** "Last 7 Days" selects 7 days: today and the 6 days before it. Before, it selected 8 days. [#2528](https://github.com/IgniteUI/igniteui-webcomponents/issues/2528) [#2540](https://github.com/IgniteUI/igniteui-webcomponents/pull/2540)
- #### Form controls
- - **Behavioral change:** `Enter` in a form control now submits the form as in a native form. The first submit button of the form gets a click, and the click submits the form. So the button is the `submitter` of the `submit` event, and a `click` listener can cancel the submission. A disabled first submit button blocks the submission. A form with no submit button submits only from its one text field, so a form with two text fields needs a submit button. The checkbox, radio and switch submit only through a submit button. An `igc-button` with `type="submit"` counts as a submit button. The browser's own `Enter` in a native input still sees only native controls. The text fields are the text-like native inputs and the input, mask input, date time input, date picker and date range picker. Before, `Enter` in these controls always submitted the form, with no submitter.
+ - **Behavioral change:** Enter in a text field submits the form as in a native form. It clicks the first submit button of the form. So that button is the `submitter`, and a `click` listener can stop the submission. Before, Enter submitted the form with no submitter. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545) [#2586](https://github.com/IgniteUI/igniteui-webcomponents/pull/2586) [#2590](https://github.com/IgniteUI/igniteui-webcomponents/pull/2590)
+ - The text fields are the input, mask input, date time input, date picker, date range picker, and the combo in single selection with its list closed. The combo in multiple selection does not submit, as a native `select`.
+ - An `igc-button` with `type="submit"` counts as a submit button. A disabled first submit button blocks the submission.
+ - A form without a submit button submits only when it has one text field.
+ - The checkbox, radio and switch submit only through a submit button.
+ - Enter does not submit when a `keypress` listener cancels it, or when it commits an IME composition.
- #### Highlight
- - Setting `searchText` or `caseSensitive` to its current value no longer runs the search again, so the active match stays. Before, a framework that sets each property on each render, such as React, moved the active match back to the first match on each render. [#2516](https://github.com/IgniteUI/igniteui-webcomponents/issues/2516)
- - The highlight now searches again when its content changes, so you no longer call `search()` after a change. The active match stays while it starts at the same place in the same text node. Otherwise the first match becomes active. Each change searches all the content again. `search()` still searches at once and makes the first match active.
-- #### Chat, List, Tree
- - Tree items, list items and chat messages that are far from the view now skip their rendering until they come near it (`content-visibility: auto`). A long tree, list or chat renders faster, and a resize or a change of `--ig-size` costs less. In our measurements, style and layout took 70-90% less time, and the first render of a tree with 2,000 items took 41% less. A skipped collapsed tree item keeps the space of one row, so scroll positions do not change, and the active item and the item with the focus always render. A list item and a chat message keep an estimated space until their first render, then their real size.
- - In a container that takes its width from its content, a long list or tree now takes the width of the items near the view, and the width can change while the user scrolls. `innerText` of an item that skips its rendering returns an empty string; `textContent` works. In Safari before 26, which includes iOS 18, find-in-page does not find the text of an item that skips its rendering. To render every item, set `content-visibility: visible` on `igc-tree-item` or `igc-list-item`, or on `igc-chat::part(message-item)`.
- - While the chat follows the newest message, it now also stays at the bottom when the message list grows for another reason, such as a message that renders late, a resize of the chat, or content that loads in a message.
+ - **Behavioral change:** The match colors come only from `--background`, `--foreground`, `--background-active` and `--foreground-active` on the highlight. A match inside a list, a tree, a button or a nested highlight now shows the colors of the highlight. Before, it took the colors of that component. [#2554](https://github.com/IgniteUI/igniteui-webcomponents/pull/2554)
+ - The highlight searches again when its content changes. You no longer call `search()` after a change. [#2572](https://github.com/IgniteUI/igniteui-webcomponents/pull/2572)
- #### Library
- Dependencies:
- - New runtime dependency `tslib`. The components import the TypeScript helpers from it, so a bundle has one copy of each helper. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - `igniteui-i18n-core` 2.0, with the new resource strings of the carousel, chat, color picker, dialog, splitter, tile and tooltip. If you register languages from `igniteui-i18n-resources`, update it to 2.0 too. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474) [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477)
- - The minimum versions of the optional peer dependencies are now `dompurify` 3.4.16, `marked` 18.1.0 and `shiki` 4.5.0. [#2450](https://github.com/IgniteUI/igniteui-webcomponents/pull/2450)
- - The themes are built with `igniteui-theming` 30.0.0. The built-in palettes still use the `legacy` generator, so the themes have the same colors as before. [#2487](https://github.com/IgniteUI/igniteui-webcomponents/pull/2487)
+ - New runtime dependency: `tslib`. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - `igniteui-i18n-core` 2.0. If you register languages from `igniteui-i18n-resources`, update it to 2.0 too. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474) [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477) [#2595](https://github.com/IgniteUI/igniteui-webcomponents/pull/2595)
+ - The optional peer dependency `shiki` must be 4.5.0 or later. [#2575](https://github.com/IgniteUI/igniteui-webcomponents/pull/2575)
+ - `marked-shiki` is no longer a peer dependency. You can remove it. [#2494](https://github.com/IgniteUI/igniteui-webcomponents/pull/2494)
+ - The themes are built with `igniteui-theming` 30.2.0. The built-in palettes keep their colors. [#2487](https://github.com/IgniteUI/igniteui-webcomponents/pull/2487) [#2570](https://github.com/IgniteUI/igniteui-webcomponents/pull/2570) [#2576](https://github.com/IgniteUI/igniteui-webcomponents/pull/2576)
- Bundle size:
- - The bundle of all components is approximately 6% smaller after gzip. The components share one copy of their common styles, and the dark theme styles have only the values that are different from the light theme. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - The carousel, chat, chip, combo, file input and tree no longer bundle the date formatter of `igniteui-i18n-core`, because they use only resource strings. The bundle of each of these components is approximately 7 KB smaller after minification. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
- - The component styles no longer have vendor prefixes for KaiOS, Opera Mini, UC Browser and QQ Browser. The library does not support these browsers. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - All the components together are approximately 6% smaller after gzip. The components share their common styles, and the dark themes hold only the values that are different from the light themes. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - The carousel, chat, chip, combo, file input and tree no longer bundle the date formatter of `igniteui-i18n-core`. Each one is approximately 7 KB smaller after minification. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
+ - The styles no longer have vendor prefixes for KaiOS, Opera Mini, UC Browser and QQ Browser. The library does not support these browsers. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- #### Localization
- - The calendar, carousel, chat, chip, color picker, combo, date picker, date range picker, date time input, dialog, file input, splitter, tile, tile manager, tooltip and tree now inherit the locale. Without its own `locale`, a component uses the locale of the nearest ancestor component that sets one, then the global locale. The search goes up the DOM tree and from a shadow root to its host, but not through slots. So a `locale` on a dialog, splitter or tile manager also applies to the components in it, also to components added later. An invalid `locale` does not pass down. Before, a component without `locale` always used the global locale. Server-side rendering cannot see the ancestors, so set `locale` on a server-rendered component that must not use the global locale. [#2478](https://github.com/IgniteUI/igniteui-webcomponents/pull/2478)
- - **Behavioral change:** The components that inherit the locale now also read `lang`. Without its own `locale`, a component takes its own `lang`, else the locale of the nearest ancestor that has a `locale` (a component) or a `lang`, and then the global locale. So `` gives the Italian locale to the components in it, also in a shadow root of your application, and the components follow a change of `lang`. Before, a component in that section used the global locale. If your application puts `lang` on an element below ``, for example on ``, and sets the language with `setCurrentI18n()`, the components in that element now use the `lang`. Set `locale` on a component to keep a different locale. An empty or invalid `lang` gives the global locale. The `lang` of `` still sets the global locale through `igniteui-i18n-core`.
- - The components no longer register their English resource strings with `igniteui-i18n-core`. They still show their English strings for the keys that a locale does not have. `getCurrentResourceStrings()` of `igniteui-i18n-core` now returns only the strings that you register. [#2476](https://github.com/IgniteUI/igniteui-webcomponents/pull/2476)
- - In TypeScript, the core strings that the `resourceStrings` of the date picker and the date range picker return now have the type `string`, as in the calendar. Before, their type was `string | undefined`, although the component always resolves them. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
+ - **Behavioral change:** A component without `locale` now inherits the locale. It uses its own `lang`, then the `locale` or `lang` of the nearest ancestor, then the global locale. The search goes up through shadow roots, but not through slots. For example, `` gives the Italian locale to the components in it. [#2478](https://github.com/IgniteUI/igniteui-webcomponents/pull/2478) [#2493](https://github.com/IgniteUI/igniteui-webcomponents/pull/2493)
+ - If you set `lang` on `` or on another element below ``, the components in it now use that `lang`, not the language from `setCurrentI18n()`. Set `locale` on a component to keep a different locale.
+ - Server-side rendering cannot see the ancestors. Set `locale` on a server-rendered component that must not use the global locale.
+ - This applies to the calendar, carousel, chat, chip, color picker, combo, date picker, date range picker, date time input, dialog, file input, splitter, tile, tile manager, tooltip and tree.
+ - The components no longer register their English strings with `igniteui-i18n-core`. `getCurrentResourceStrings()` now returns only the strings that you register. [#2476](https://github.com/IgniteUI/igniteui-webcomponents/pull/2476)
+ - In TypeScript, the core strings in `resourceStrings` of the date picker and the date range picker are `string`, not `string | undefined`. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
+- #### Navigation drawer
+ - **Behavioral change:** In Firefox and Safari, a drawer at an edge position slides out and its backdrop fades out, as in Chromium. `hide()` and `toggle()` resolve, and `igcClosed` comes, after the exit. `open` still changes at once. With reduced motion, the drawer changes at once. [#2578](https://github.com/IgniteUI/igniteui-webcomponents/pull/2578)
- #### Snackbar, Toast
- - The display time now stops while the pointer is on the component or the keyboard focus is in it, and starts again in full when both leave. Before, the component closed under the pointer, and a keyboard user could lose the action before they got to it. A pointer click on the action does not keep the component open, also when the action has the keyboard focus. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- - `show()` on an open component now starts the display time again. It still resolves `false`. Before, a new message closed with the time that remained from the previous message. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
+ - The display time pauses while the pointer or the keyboard focus is on the component. It starts again in full when both leave. A click on the action does not keep the component open. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
+ - `show()` on an open component starts the display time again. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- #### Splitter
- - **Behavioral change:** A change of `orientation` now keeps the sizes, the minimum and maximum sizes and their attributes that you set, and returns the panes to these sizes. The minimum and maximum sizes now also apply on the new axis, so bind them together with the orientation when they differ per axis. It drops only the sizes from a drag, a key press or a collapse, which were measured on the other axis. Before, it removed all sizes and their attributes, also the sizes set in the same update. A template that binds the orientation and the sizes together, for example to stack the panes on a narrow screen, lost the sizes, because the template does not set unchanged values again.
- - Each pane now has its own stacking context, so slotted content with any `z-index` stays under the focus ring of the bar. Before, content with a `z-index` of 99 or more could cover the ring. Content that reaches over the bar, for example with `position: fixed`, now shows under the bar while the bar has focus.
+ - **Behavioral change:** A change of `orientation` keeps the sizes and the minimum and maximum sizes that you set. Only the sizes from a drag, a key or a collapse go back to the default. The minimum and maximum sizes now also apply on the new axis, so change them together with the orientation when they are different. [#2527](https://github.com/IgniteUI/igniteui-webcomponents/pull/2527)
+ - Each pane has its own stacking context, so slotted content with any `z-index` stays under the focus ring of the bar. [#2567](https://github.com/IgniteUI/igniteui-webcomponents/pull/2567)
- #### Tabs
- - With `prefers-reduced-motion: reduce`, the scroll buttons and the selection now scroll the header strip at once. Before, the strip always scrolled smoothly. The scroll buttons now also follow a `scroll-behavior` that you set on the `tabs` part.
- - Changes inside a tab panel, such as a list that updates or content that grows, no longer make the tabs measure all their headers. The tabs measure the strip when a tab header or the width of the strip changes.
- - The strip no longer snaps to the edge of a tab when you scroll it by touch after a scroll button press.
+ - With `prefers-reduced-motion: reduce`, the header strip scrolls at once. The scroll buttons also follow a `scroll-behavior` on the `tabs` part. [#2579](https://github.com/IgniteUI/igniteui-webcomponents/pull/2579)
+ - Changes inside a panel no longer make the tabs measure all the headers. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
- #### Textarea
- - With `resize="auto"`: [#2479](https://github.com/IgniteUI/igniteui-webcomponents/pull/2479)
- - A browser that supports the CSS `field-sizing` property sizes the control to its content. Other browsers still measure the height. The minimum height is still `rows` lines. In a shrink-to-fit layout, such as a flex item without a width, such a browser makes the control approximately 20 characters wide.
- - The control uses the content box. So a `max-height` or `max-block-size` on the `input` part no longer includes the padding and the border. To keep the same maximum height, subtract the padding and the border from your value, or give the maximum in lines, for example `max-block-size: 8lh`.
+ - With `resize="auto"`, a browser that supports CSS `field-sizing` sizes the control to its content. Other browsers measure the height as before. [#2479](https://github.com/IgniteUI/igniteui-webcomponents/pull/2479)
+ - The control uses the content box. So a `max-height` or `max-block-size` on the `input` part no longer includes the padding and the border. Subtract them from your value, or give the maximum in lines, for example `max-block-size: 8lh`.
+ - In a shrink-to-fit layout, such as a flex item with no width, the control is approximately 20 characters wide.
- #### Theming
- - A theme change now updates only the components that render differently for each theme. A `configureTheme()` call with the active theme and variant updates no component. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - The component styles no longer declare `--ig-theme` and `--ig-theme-variant`. The library reads the two variables from the document root only. So `getComputedStyle()` on a component gives the inherited values, usually the values of the document root. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - **Breaking change**: The components take their surface color from the `base` surface role, `--ig-surface-base`, not from `--ig-surface-500`. The themes now also define the other surface roles: `--ig-surface-raised`, `--ig-surface-overlay`, `--ig-surface-sunken` and `--ig-surface-container`. To change the surface at runtime, set the surface roles. Before, you set `--ig-surface-500`, which now has no effect on the components. [#2487](https://github.com/IgniteUI/igniteui-webcomponents/pull/2487)
+ - **Breaking change:** The components take their surface color from `--ig-surface-base`, not from `--ig-surface-500`. The themes also define `--ig-surface-raised`, `--ig-surface-overlay`, `--ig-surface-sunken` and `--ig-surface-container`. To change the surface at runtime, set these surface roles. `--ig-surface-500` has no effect on the components. [#2487](https://github.com/IgniteUI/igniteui-webcomponents/pull/2487)
+ - A theme change updates only the components that render differently for each theme. A `configureTheme()` call with the active theme and variant does nothing. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - The component styles no longer declare `--ig-theme` and `--ig-theme-variant`. The library reads them from the document root only. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- #### Tile manager
- - The default actions of a tile now have names that tell what they do: "Maximize" or "Restore", and "Enter full screen" or "Exit full screen". Before, screen readers announced the icon names, such as "expand_content". [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456) [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477)
- - A tile is now a region, and the content of its `title` slot gives its name. So screen reader users can move from tile to tile. An `aria-label` or `aria-labelledby` on the tile replaces the title as the name. Before, a tile had no role. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - In Chromium, the Tab order and the reading order of screen readers now follow the layout: the `position` of the tiles and the gaps that later tiles fill. Other browsers do not support `reading-flow` yet and keep the DOM order. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - `igcTileDragEnd` and `igcTileDragCancel` now fire after the tiles have their new or restored positions, as `igcTileResizeEnd` does, so a handler can call `saveLayout()` and `loadLayout()`. The end or cancel event still comes before the `igcTileDragStart` of the next drag. Before, the events fired before the view transition applied the positions: `saveLayout()` returned the old layout, and the transition overwrote a layout from `loadLayout()`. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - The content container of a tile now fills the tile under the header, so content with `block-size: 100%`, such as a chart, takes the free height. Before, the container had the height of its content, and such content collapsed to its minimum height. The `::part(base)` and `::part(content-container)` flex rules that did this are no longer necessary.
- - A tile no longer spans past the last column, with a column count and in the responsive layout. A tile that starts after the last column moves back so that its span fits, for example `col-start="6" col-span="3"` in four columns takes columns 2 to 4. A resize that changes the column span of such a tile sets `colStart` to the column where the tile is, so the tile does not move. `colSpan` and `colStart` keep their values, also after a resize that changes only the height, so one layout works at every column count, and `saveLayout()` returns the values that you set. A `--column-count` from a style sheet, for example in a media query, works the same way. Its value must be a whole number; `initial` gives the responsive layout. A resize no longer gives a tile more columns than there are after its start. Before, a change of `columnCount` made `colSpan` smaller and removed a `colStart` after the last column, so the tiles did not go back to their places when the count grew again. With a `--column-count` from a style sheet, a wide tile added columns. In the responsive layout, a wide tile or a late start added columns of 0px: a tile in them was invisible but stayed in the Tab order, and a wide tile ended one gap after the others.
- - The default resize handles now stand out of the tile through a negative margin, not through `bottom` and `inset-inline-end`. If you move them with `bottom`, `right` or `inset-inline-end` on the `trigger`, `trigger-side` or `trigger-bottom` part, also set `margin: 0` on the part.
- - A press on a resize handle no longer cancels its `pointerdown` event, so the focus and the mouse events follow it as on any other press. The grid no longer reads the undocumented `--auto-rows` and `--auto-columns` variables.
- - The tile manager no longer inherits `--column-count` and `--grid-gap` from an ancestor element, so that a nested manager does not take the values of the outer one. If you set them on a wrapper element, set them on the manager instead, for example `igc-tile-manager { --column-count: 2; }`.
- - A tile now has a `view-transition-name` only during a view transition of its manager: a swap, the restore of a canceled drag, a maximize, a restore and a resize. Before, every tile had a name at all times, so each transition also captured the tiles of the other managers on the page and of nested managers, and took more time. If your application runs its own view transition that moves tiles, give these tiles a `view-transition-name` for that transition, for example from their `id`. You can start the transition with a type and name the tiles in an `:active-view-transition-type()` rule, as the ProjectBoard story does. The manager does not change a name that you set inline.
- - The content of a tile, with its header, now has its own stacking context. So the resize handles stay above content with any `z-index`, and content with a negative `z-index` shows above the background of the tile. Before, content with a `z-index` of 11111 or more covered the handles, and the background of the tile hid content with a negative `z-index`.
- - During a drag, the tile under the pointer stays the drop target while the pointer is in its box, so a pointer move does less work. The tile also stays the target where an ancestor clips it, for example in a nested manager.
+ - **Behavioral change:** A tile no longer spans past the last column. A tile that starts after the last column moves back so that its span fits. `colSpan` and `colStart` keep the values that you set at every column count. So one layout works for all column counts, and `saveLayout()` returns your values. A `--column-count` from a style sheet must be a whole number, and `initial` gives the responsive layout. [#2496](https://github.com/IgniteUI/igniteui-webcomponents/pull/2496) [#2565](https://github.com/IgniteUI/igniteui-webcomponents/pull/2565)
+ - **Behavioral change:** The tile manager no longer inherits `--column-count` and `--grid-gap` from an ancestor. Set them on the tile manager, for example `igc-tile-manager { --column-count: 2; }`. [#2565](https://github.com/IgniteUI/igniteui-webcomponents/pull/2565)
+ - A tile is a region. The content of its `title` slot gives its name. An `aria-label` or `aria-labelledby` on the tile replaces that name. The default actions have names: "Maximize" or "Restore", and "Enter full screen" or "Exit full screen". In Chromium, the Tab order and the screen reader order follow the layout. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456) [#2477](https://github.com/IgniteUI/igniteui-webcomponents/pull/2477)
+ - `igcTileDragEnd` and `igcTileDragCancel` are emitted after the tiles have their new positions, as `igcTileResizeEnd` is. So a handler can call `saveLayout()` and `loadLayout()`. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
+ - The content container fills the tile under the header. So content with `block-size: 100%`, such as a chart, takes the free height. You can remove the flex rules that you added on `::part(base)` or `::part(content-container)` for this. [#2496](https://github.com/IgniteUI/igniteui-webcomponents/pull/2496)
+ - The default resize handles stand out of the tile through a negative margin. If you move them with `bottom`, `right` or `inset-inline-end` on the `trigger`, `trigger-side` or `trigger-bottom` part, also set `margin: 0`. [#2501](https://github.com/IgniteUI/igniteui-webcomponents/pull/2501)
+ - A tile has a `view-transition-name` only during a view transition of its manager. If your own view transition moves tiles, give them a name for that transition. [#2566](https://github.com/IgniteUI/igniteui-webcomponents/pull/2566)
+ - The content of a tile has its own stacking context. So the resize handles stay above content with any `z-index`. [#2566](https://github.com/IgniteUI/igniteui-webcomponents/pull/2566)
### Deprecated
- #### Combo
- - The `item` of the group header template is deprecated, because it is not a data item. Use `key`. [#2462](https://github.com/IgniteUI/igniteui-webcomponents/issues/2462) [#2468](https://github.com/IgniteUI/igniteui-webcomponents/pull/2468)
+ - The `item` of the group header template. Use `key`. [#2462](https://github.com/IgniteUI/igniteui-webcomponents/issues/2462) [#2468](https://github.com/IgniteUI/igniteui-webcomponents/pull/2468)
- #### Theming
- - The numbered surface shades, such as `--ig-surface-500`, are deprecated, and a future release of `igniteui-theming` removes them. The themes still define them. Use the surface roles. [#2487](https://github.com/IgniteUI/igniteui-webcomponents/pull/2487)
+ - The numbered surface shades, such as `--ig-surface-500`. A future release of `igniteui-theming` removes them. Use the surface roles. [#2487](https://github.com/IgniteUI/igniteui-webcomponents/pull/2487)
### Fixed
-- #### Accordion
- - The arrow keys, `Home` and `End` now skip a panel that does not render, such as a panel with the `hidden` attribute or `display: none`. Before, the focus stayed on the current panel. [#2418](https://github.com/IgniteUI/igniteui-webcomponents/pull/2418)
+- #### Accordion, Tabs
+ - The arrow keys, Home and End skip a panel or a tab that does not render, such as one with the `hidden` attribute. [#2418](https://github.com/IgniteUI/igniteui-webcomponents/pull/2418) [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
- #### AI-Assisted Development
- - The `igniteui-wc-migrate-grid-lite-to-premium` skill now shows a correct custom sort strategy for the Premium Grid: an object with a `sort()` method that reads the cell values through `valueResolver`. Before, the example extended `DefaultSortingStrategy`, which the grid package does not export. [#2407](https://github.com/IgniteUI/igniteui-webcomponents/pull/2407)
+ - The `igniteui-wc-migrate-grid-lite-to-premium` skill shows a correct custom sort strategy for the Premium Grid. [#2407](https://github.com/IgniteUI/igniteui-webcomponents/pull/2407)
- #### Banner
- - A closed banner now takes no space in a column flex container. Before, its `flex-basis` of 320px kept 320px of empty space before the next element. In a row flex container, the banner now starts from the width of its content, as other block elements do. [#2543](https://github.com/IgniteUI/igniteui-webcomponents/issues/2543)
- - The banner is now never wider than its container. Its minimum width is 320px or the width of the container, whichever is smaller. Before, in a container narrower than 320px, the banner overflowed and the container scrolled sideways.
- - A change of `open` against a running `show()` or `hide()` now ends it, and the banner keeps the new state, as in the dialog. Before, the exit closed the banner when its animation ended, also when `open` was set to `true` again. After `open = false` during `show()`, a new `show()` did nothing until the entrance animation ended.
+ - The banner stays inside its container. A closed banner takes no space in a column flex container, and the banner is never wider than its container. [#2543](https://github.com/IgniteUI/igniteui-webcomponents/issues/2543) [#2546](https://github.com/IgniteUI/igniteui-webcomponents/pull/2546)
+- #### Banner, Dialog, Expansion panel, Snackbar, Toast, Tooltip
+ - A change of `open` during a running `show()`, `hide()` or animation now ends it, and the component keeps the new state. The running method resolves `false`. Before, the end of the animation replaced the new state. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447) [#2549](https://github.com/IgniteUI/igniteui-webcomponents/pull/2549) [#2571](https://github.com/IgniteUI/igniteui-webcomponents/pull/2571)
+ - Dialog, Snackbar, Toast: `open` stays `true` during the exit. To keep the component open, set `open` to `false` and then to `true`.
+ - Snackbar, Toast: `show()` and `toggle()` during the fade-out keep the component open.
+ - Tooltip: when the pointer leaves the anchor during the show animation, the animation ends at once. The pointer can then move onto the tooltip to keep it open.
- #### Button, Icon button
- - A button with `href` now keeps the link role of its anchor. Before, the anchor had `role="button"`, so screen readers announced a link as a button. [#2421](https://github.com/IgniteUI/igniteui-webcomponents/pull/2421)
- - A disabled link now renders a disabled native `` with `role="link"` in place of the anchor. So it leaves the tab order, cannot navigate and dispatches no click. Before, the link stayed in the tab order, and `Enter` still followed it. While the link is disabled, the `base` part is the ``. [#2421](https://github.com/IgniteUI/igniteui-webcomponents/pull/2421)
- - The form action of a `submit` or `reset` button now runs after the `click` listeners, as for a native button. A listener that cancels the click, or that disables the button, stops the submit or the reset. Before, the button submitted or reset the form before the listeners on the button ran, so they could not stop it.
- - Setting `commandfor` on a detached button no longer throws `getElementById is not a function`. A change made while detached now also applies once the button is attached again. [#2592](https://github.com/IgniteUI/igniteui-webcomponents/pull/2592)
+ - A button with `href` keeps the link role. [#2421](https://github.com/IgniteUI/igniteui-webcomponents/pull/2421)
+ - A disabled link renders a disabled native `` with `role="link"`. It leaves the tab order and cannot navigate. While the link is disabled, the `base` part is this ``. [#2421](https://github.com/IgniteUI/igniteui-webcomponents/pull/2421)
+ - The form action of a `submit` or `reset` button runs after the `click` listeners, as in a native button. So a listener can stop it. [#2590](https://github.com/IgniteUI/igniteui-webcomponents/pull/2590)
+ - Setting `commandfor` on a detached button no longer throws an error. The change applies when the button is attached. [#2592](https://github.com/IgniteUI/igniteui-webcomponents/pull/2592)
- #### Button group, Stepper
- - The arrow keys that the orientation does not use are no longer canceled, so the page can scroll with them. Before, a horizontal group or stepper canceled Up and Down, and a vertical group canceled Left and Right.
+ - The arrow keys that the orientation does not use are no longer canceled, so the page can scroll with them. [#2556](https://github.com/IgniteUI/igniteui-webcomponents/pull/2556)
- #### Calendar
- - A calendar without `activeDate` now gets the active date from its value before the first render, so it renders once. Before, it rendered a second time, and Lit in development mode warned that an update was scheduled after an update completed. [#2423](https://github.com/IgniteUI/igniteui-webcomponents/pull/2423)
- - The internal `igcActiveDateChange` and `igcRangePreviewDateChange` events of the days view now stay inside the calendar, also in the date picker and the date range picker. Before, a click on a date, and a range preview by focus or hover, sent them to the listeners on the calendar and on the page. These events are not part of the public API.
+ - A calendar without `activeDate` renders one time. Before, it rendered two times, and Lit in development mode showed a warning. [#2423](https://github.com/IgniteUI/igniteui-webcomponents/pull/2423)
- #### Card
- - In the dark Bootstrap theme, the last card content now has its bottom padding. Before, the dark variant did not apply the Bootstrap layout styles of the card. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - Header text that does not fit on one line now wraps next to the thumbnail. Before, the text moved to a line under the thumbnail. The text area also takes the full width next to the thumbnail, so block content in the default slot, such as a progress bar, fills it.
+ - In the dark Bootstrap theme, the last card content has its bottom padding. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - Header text that does not fit on one line wraps next to the thumbnail, not under it. [#2551](https://github.com/IgniteUI/igniteui-webcomponents/pull/2551)
- #### Carousel
- - The styles no longer set the icon color variables of the navigation buttons to uncompiled Sass text. The variables now get the arrow color tokens of the theme, so an icon in the `previous-button` or `next-button` slot uses these tokens directly, not only through inheritance.
+ - An icon in the `previous-button` or `next-button` slot gets the arrow color tokens of the theme. [#2550](https://github.com/IgniteUI/igniteui-webcomponents/pull/2550)
- #### Chat
- - The chat now creates one object URL for each attached file. It revokes the URL when you remove the attachment, or when a listener cancels `igcAttachmentAdded`. Before, each render created a new object URL and did not revoke the old one, so the memory use increased. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - The message area now follows the newest message only while it is at the bottom. When the user scrolls up, new messages, the typing indicator and new suggestions do not move it. A new message of the current user, or a `messages` array without the previous last message, such as a different conversation, scrolls to the bottom again. Other updates, such as a change of `headerText` or of an earlier message, do not scroll. Before, each update scrolled to the bottom, also while the user read earlier messages. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461) [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - An attachment with an image MIME type in `type`, such as `image/png`, now renders as an image. Before, only the type `image` and attachments with an image `file` rendered as images. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - The file picker now attaches only the files that `acceptedFiles` allows, as a drop does. Before, the chat attached any file that the user picked. A pick or a drop that adds no file, because `acceptedFiles` does not allow the files or they are already attached, no longer emits an empty `igcAttachmentAdded`. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - The header of an attachment in a message is now in the tab order, and `Enter` and `Space` activate it and emit `igcAttachmentClick`. Before, it had the button role, but keyboard users could not reach it. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - The message actions and the input controls now take their names from resource strings. Before, the actions had no names, and the input controls had English names only: [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - The copy, like, dislike and regenerate actions use the `chat_reaction_*` strings. Like and dislike tell their state with `aria-pressed`.
- - The text area, the attach button, the file input and the send button use `chat_input_label`, `chat_attach_files`, `chat_file_input_label` and `chat_send_message`. The attachments list uses `chat_attachments_list_label`.
- - The remove button of an attachment chip names the file with `chat_remove_attachment`, for example "Remove photo.png". Before, each remove button said "remove chip".
- - Elements in the `suggestion` slot now replace the default suggestions. Before, the chat rendered a `suggestion` slot for each suggestion, so only the first suggestion took the slotted elements.
- - Content in the `suggestions` or `suggestion` slot now shows the suggestions area also without `options.suggestions`. Before, the area and its slots rendered only while `options.suggestions` had items. Without suggestions, the area now stays in the DOM, hidden.
- - **Behavioral change:** The `igcInput` and `igcChange` events of the text area and the `igcRemove` event of an attachment chip now stay inside the chat. Before, they reached the listeners on the chat and on the page. Use `igcInputChange` for the text and `igcAttachmentRemoved` for a removed attachment.
- - Fixes in the Markdown renderer of `igniteui-webcomponents/extras`:
- - A `theme` object with only `light` or only `dark` now uses the default theme for the other mode.
- - A `theme` object that pairs `none` with another theme now gives valid colors. Before, the code had no colors in either mode.
- - Links now render the formatting in their text, and the renderer escapes their `href` and `title`. Before, `[**Docs**](…)` showed the asterisks, and a title with a quotation mark was cut off.
- - With the default sanitizer, Markdown and HTML links to another origin now open in a new tab, with `rel="noopener noreferrer"`, also when the HTML sets other values. Before, DOMPurify removed `target`, so the links opened in the same tab. Links in the same origin, such as `/register` or `#top`, and links such as `mailto:` open in the same tab, so the app can route them.
- - When a code block cannot be highlighted, for example because its language is not in `languages`, the code now shows as escaped text with a `language-*` class, the same as with `noHighlighter`. Before, the renderer read the code as HTML, so a tag such as `` in the code rendered as an element.
- - The code colors of the default GitHub themes now use the `--shiki-purple`, `--shiki-dark-blue`, `--shiki-red`, `--shiki-blue`, `--shiki-green` and `--shiki-orange` variables in light and dark mode, with the GitHub colors as fallbacks. Set a variable on the chat to change a color in both modes. Before, a dark chat used fixed colors, and outside a chat, the code had no token colors in light mode.
+ - The chat creates one object URL for each attached file and revokes it when the attachment goes. Before, the memory use increased with each render. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - An attachment with an image MIME type, such as `image/png`, renders as an image. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
+ - The file picker attaches only the files that `acceptedFiles` allows. A pick or a drop that adds no file does not emit `igcAttachmentAdded`. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
+ - Keyboard users can get to the attachment header in a message. Enter and Space emit `igcAttachmentClick`. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
+ - The message actions and the input controls take their names from resource strings, such as the `chat_reaction_*` strings and `chat_send_message`. Like and dislike report their state with `aria-pressed`. The remove button of an attachment names the file, for example "Remove photo.png". [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
+ - Elements in the `suggestion` slot replace the default suggestions. Content in the `suggestions` or `suggestion` slot shows also without `options.suggestions`. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488) [#2489](https://github.com/IgniteUI/igniteui-webcomponents/pull/2489)
+ - Markdown renderer of `igniteui-webcomponents/extras`: [#2494](https://github.com/IgniteUI/igniteui-webcomponents/pull/2494) [#2573](https://github.com/IgniteUI/igniteui-webcomponents/pull/2573)
+ - A `theme` with only `light` or only `dark` uses the default theme for the other mode. A `theme` that pairs `none` with another theme gives valid colors.
+ - The text of a link keeps its formatting, and the renderer escapes `href` and `title`.
+ - A code block that cannot be highlighted shows as escaped text. Before, HTML in the code, such as ``, rendered as elements.
+ - The default GitHub themes use the `--shiki-purple`, `--shiki-dark-blue`, `--shiki-red`, `--shiki-blue`, `--shiki-green` and `--shiki-orange` variables in the two modes. Set a variable on the chat to change a color.
- #### Checkbox
- - The indicator icon is now hidden from assistive technologies. Before, each checkbox had an unnamed image next to it in the accessibility tree. [#2425](https://github.com/IgniteUI/igniteui-webcomponents/pull/2425)
+ - The indicator icon is hidden from assistive technology. Before, each checkbox had an unnamed image next to it. [#2425](https://github.com/IgniteUI/igniteui-webcomponents/pull/2425)
- #### Chip
- - The chip now delegates the focus to its action control, so `focus()` and `blur()` work on the host. Before, `focus()` did nothing, so an application could not move the focus to a chip, for example after a removal. [#2426](https://github.com/IgniteUI/igniteui-webcomponents/pull/2426)
+ - `focus()` and `blur()` work on the chip. The chip delegates the focus to its action control. [#2426](https://github.com/IgniteUI/igniteui-webcomponents/pull/2426)
- #### Circular progress, Linear progress
- - The default `aria-valuetext` is now the percentage that the label shows. Before, it was the value with a percent sign: "50%" for 50 of 200, while the label showed 25%. [#2427](https://github.com/IgniteUI/igniteui-webcomponents/pull/2427)
- - The percentage is now correct. It rounds to two decimals: 12.996% shows as 13%, not "12.100%", and 1.005% shows as 1.01%, not 1%. A fractional `max` also works: 0.25 of 0.5 shows as 50%, not 25%. [#2427](https://github.com/IgniteUI/igniteui-webcomponents/pull/2427)
- - With `prefers-reduced-motion: reduce`, the indeterminate animation now runs at a third of its speed, and a new value shows at once. Before, the motion did not change.
-- #### Circular progress
- - In forced colors, the ring now has the text color and the track is `GrayText`, also with a custom gradient. Before, the ring kept the theme colors, so the track was almost invisible.
- - The element is now an inline block of the size of the ring. Before, a line box around the ring made the element taller than the ring, so a small ring sat above the center of its parent.
+ - The percentage rounds to two decimals and is correct for a fractional `max`. The default `aria-valuetext` is the percentage that the label shows. [#2427](https://github.com/IgniteUI/igniteui-webcomponents/pull/2427)
+ - With `prefers-reduced-motion: reduce`, the indeterminate animation runs at a third of its speed, and a new value shows at once. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - Circular progress: in forced colors mode, the ring has the text color and the track is `GrayText`. The element has the size of the ring, so a small ring is at the center of its parent. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+- #### Color picker
+ - The initial `value` has the notation of `format`, also when the `value` attribute comes before `format`. [#2413](https://github.com/IgniteUI/igniteui-webcomponents/pull/2413)
+ - The HSL saturation is no longer infinite for a very small saturation at full value. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
+ - The hue and alpha slider tracks match the thumb positions, also in right-to-left layouts. [#2466](https://github.com/IgniteUI/igniteui-webcomponents/pull/2466)
- #### Color picker, Combo, Date picker, Date range picker, Dropdown, Select, Slider, Tooltip
- - In browsers without CSS anchor positioning, a popup inside an ancestor with CSS `zoom` is now placed at its anchor. Before, the zoom moved it away from the anchor, and its arrow was off center.
- - In browsers without CSS anchor positioning, a popup whose anchor is in a modal dialog or another top-layer element now stays at the anchor while the page scrolls. Before, it moved with the page for a frame.
+ - In browsers without CSS anchor positioning, a popup stays at its anchor inside an ancestor with CSS `zoom`. It also stays at an anchor in a modal dialog while the page scrolls. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
- #### Color picker, Combo, Date picker, Date time input, Mask input
- - The keys that an IME handles, such as the Enter that commits a composition, no longer act in these components. Before, the Enter that accepted a candidate in the main input of a single-selection combo selected the active option and closed the list, Escape closed the combo, the date picker and the color picker, and the arrow keys spun the date time input. In the mask input, Ctrl+Z and Ctrl+Y in a composition no longer cancel the key. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
-- #### Color picker, Date picker, Date range picker
- - While closed, the picker no longer cancels Escape. Before, a dropdown, a select or a combo list with the picker in its content stayed open when the user pressed Escape in the closed picker.
-- #### Color picker
- - The initial `value` is now in the notation of `format` when the `value` attribute comes before the `format` attribute. Before, `value` and the form data stayed in hex until the color changed. [#2413](https://github.com/IgniteUI/igniteui-webcomponents/pull/2413)
- - The HSL saturation no longer becomes infinite for a very small saturation at full value. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
- - The hue and alpha slider tracks now match the thumb positions. Before, the thumb for yellow was on the orange part of the hue track. At 0% and 100%, the alpha track under the thumb was approximately 4% and 96% opaque. In right-to-left layouts, the tracks went from left to right, so each thumb was on the wrong color. [#2466](https://github.com/IgniteUI/igniteui-webcomponents/pull/2466)
- - The events of the inner controls now stay inside the color picker: the `igcInput` of the alpha input, the color value input and the input anchor, the `igcOpening`, `igcOpened`, `igcClosing` and `igcClosed` of the format select, and the internal `igcColorPicked` of the canvas. Before, they reached the listeners on the picker and on the page. A listener for `igcInput` also got the raw text of these fields as the detail, and the open and close events of the format select looked like the events of the picker. A listener that canceled `igcClosing` on the picker also kept the format select open.
+ - The keys that an IME uses, such as the Enter that commits a composition, no longer act in these components. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+- #### Color picker, Date picker, Date range picker, Select
+ - A closed component no longer cancels Escape. So a parent popup, such as a dropdown, can close on the key. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545) [#2585](https://github.com/IgniteUI/igniteui-webcomponents/pull/2585)
- #### Combo
- - Arrow Down no longer closes the list, or moves the focus back to the search input, when a search finds one match or none. [#2428](https://github.com/IgniteUI/igniteui-webcomponents/pull/2428)
- - A form reset now clears the invalid styles of a required single-selection combo that had the focus. [#2428](https://github.com/IgniteUI/igniteui-webcomponents/pull/2428)
- - The native input no longer has `aria-disabled`. Its native `disabled` state is sufficient. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
- - The removal of the `locale` attribute no longer causes a `TypeError`. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
- - Setting `singleSelect` or `disableFiltering` to the value that the combo already has no longer clears the search text and the filter. Before, a framework that sets each property on each render, such as React, cleared the search text after each key, and the list did not filter. [#2516](https://github.com/IgniteUI/igniteui-webcomponents/issues/2516)
- - Tab and Shift+Tab now move through the focusable content of the `header`, `empty` and `footer` slots while the list is open. Before, Tab closed the list, so a keyboard user could not reach a button in these slots. Tab from the last footer element, and Shift+Tab from the search input, close the list and move the focus on, as before. Escape from this content no longer closes the list when the content handled the key. [#2529](https://github.com/IgniteUI/igniteui-webcomponents/issues/2529)
- - When the list closes while the focus is in it, for example on `hide()` from a button in the footer, the focus moves to the main input. Before, the closed list could not keep the focus, and it went to the document. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533)
- - `igcChange.newValue` now has the order of the `value` that follows the change: the selected values first, then the new ones. Before, it listed the new values first, so an app that saved `newValue` as a staged selection did not match `value` after the change. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533)
- - The `igcChange` of the search input no longer leaves the combo. Before, a listener on the combo got a second `igcChange` with the search text as its `detail` when the search input lost the focus. [#2530](https://github.com/IgniteUI/igniteui-webcomponents/issues/2530)
- - A new `itemTemplate` or `groupHeaderTemplate` now re-renders the open list. Before, the items kept the old content until the list rendered again for another reason, such as a `data` change or a move of the active item. [#2555](https://github.com/IgniteUI/igniteui-webcomponents/issues/2555)
- - Setting `filteringOptions` to the options that the combo already has no longer updates the combo. Before, a framework that sets each property on each render, such as React, made the combo filter and group the items again on each render. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
-- #### Date picker
- - `stepUp()` and `stepDown()` now update `value` and the form value at once, also while the input has the focus. Before, only the input showed the new date.
- - A `value` that you set from code, also with `stepUp()` or `stepDown()`, no longer emits `igcChange` on a later blur, in any mode.
- - In a non-editable dropdown, a selection in the calendar now emits one `igcChange`. Before, the blur after it emitted a second one.
+ - Arrow Down no longer closes the list or moves the focus to the search input when a search finds one match or none. [#2428](https://github.com/IgniteUI/igniteui-webcomponents/pull/2428)
+ - A form reset clears the invalid styles of a required single-selection combo. [#2428](https://github.com/IgniteUI/igniteui-webcomponents/pull/2428)
+ - The native input no longer has `aria-disabled`. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
+ - Removing the `locale` attribute no longer throws a `TypeError`. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
+ - When the list closes while it has the focus, the focus goes to the main input, not to the document. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `newValue` of `igcChange` has the same order as the `value` after the change. [#2533](https://github.com/IgniteUI/igniteui-webcomponents/issues/2533) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - A new `itemTemplate` or `groupHeaderTemplate` renders the open list again. [#2555](https://github.com/IgniteUI/igniteui-webcomponents/issues/2555) [#2557](https://github.com/IgniteUI/igniteui-webcomponents/pull/2557)
+- #### Combo, Dropdown, Highlight, Select
+ - Setting a property to its current value no longer resets the state. This fixes React and other frameworks that set every property on each render. [#2515](https://github.com/IgniteUI/igniteui-webcomponents/issues/2515) [#2516](https://github.com/IgniteUI/igniteui-webcomponents/issues/2516) [#2518](https://github.com/IgniteUI/igniteui-webcomponents/pull/2518) [#2523](https://github.com/IgniteUI/igniteui-webcomponents/pull/2523) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545) [#2572](https://github.com/IgniteUI/igniteui-webcomponents/pull/2572)
+ - Combo: `singleSelect`, `disableFiltering` and `filteringOptions` no longer clear the search text or filter the items again.
+ - Dropdown, Select: `selected` on an item no longer moves the active item.
+ - Highlight: `searchText` and `caseSensitive` no longer move the active match back to the first match.
+ - Select: `value` no longer moves the active item. When you remove the active item, the navigation goes back to the selected item.
+- #### Combo, Dropdown, Select
+ - Interactive content in the `header` and `footer` slots, and in the `empty` slot of the combo, keeps its keys while the list is open. A text field gets the typed text, the arrow keys, Home and End. A button gets Enter and Space. [#2529](https://github.com/IgniteUI/igniteui-webcomponents/issues/2529) [#2531](https://github.com/IgniteUI/igniteui-webcomponents/issues/2531) [#2532](https://github.com/IgniteUI/igniteui-webcomponents/issues/2532) [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545) [#2585](https://github.com/IgniteUI/igniteui-webcomponents/pull/2585)
+ - Tab and Shift+Tab move through this content. Past either end, Tab closes the list, as before.
+ - Escape from this content closes the list only when the content does not use the key.
+ - When the list closes with the focus in it, the focus goes back to the input or to the target.
+ - In the select, the two slots are outside the `listbox` role, so they pass the accessibility audit. In the dropdown, put this content in the new `header` and `footer` slots.
- #### Date picker, Date range picker
- - **Behavioral change:** In dialog mode, the dialog now fades in and out, as a standalone dialog does. `igcOpened` comes after the entrance. On a close, the backdrop also fades, `open` stays `true` until the exit ends, and `igcClosed` comes after it. Before, the dialog had no animation, and the backdrop went away at once. User actions, `show()`, `hide()` and `toggle()` animate; a change of `open` from code still applies at once. With reduced motion, there is no animation.
- - In dialog mode, a canceled `igcClosing` now keeps the dialog open, and an outside click commits the range only when the close goes on. Before, an outside click closed the dialog, and `open` stayed `true`.
- - During the exit, the calendar and the predefined ranges ignore a selection, Done, Cancel and Escape do nothing, and a `show()` keeps the picker open without an animation. During the entrance or the exit, `open` set to `false` and then to `true` keeps the picker open, and `open` set to `false` closes the dialog at once.
+ - In dialog mode, a canceled `igcClosing` keeps the dialog open. An outside click commits the range only when the close continues. [#2574](https://github.com/IgniteUI/igniteui-webcomponents/pull/2574)
+ - Enter in the content of the `prefix` or `suffix` slot no longer submits the form a second time. [#2590](https://github.com/IgniteUI/igniteui-webcomponents/pull/2590)
+ - Date picker: in a dropdown that is not editable, a selection in the calendar emits one `igcChange`, not two. [#2489](https://github.com/IgniteUI/igniteui-webcomponents/pull/2489)
+- #### Date picker, Date time input
+ - `stepUp()` and `stepDown()` update `value` and the form value at once, also while the input has the focus. A step of a part that is not in the input format no longer goes away on blur. The arrow keys and the mouse wheel still change only the text until blur. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488) [#2489](https://github.com/IgniteUI/igniteui-webcomponents/pull/2489)
- #### Date range picker
- - **Behavioral change:** In dialog mode, Done now emits `igcChange` after `igcClosing`, and Done and Cancel change the range only when the close goes on, as Escape and an outside click do. So a canceled `igcClosing` keeps the dialog open with the selected range. Before, Done emitted `igcChange` before `igcClosing` and committed the range, and Cancel restored it, also when a handler canceled the close. A `hide()` after a canceled close still does not commit or restore, so the selected range stays the value, with no `igcChange`. To ask for a confirmation before a close, restore the range through `value` when the user declines.
- - **Behavioral change:** The **Last 7 Days** predefined range selects 7 days: today and the 6 days before it. Before, it selected 8 days. [#2528](https://github.com/IgniteUI/igniteui-webcomponents/issues/2528)
- - The predefined ranges now use the date of the click. Before, they used the date of the first render, so a page that stayed open past midnight selected old ranges.
+ - The predefined ranges use the date of the click, not the date of the first render. [#2540](https://github.com/IgniteUI/igniteui-webcomponents/pull/2540)
+ - A change of `mode` no longer sets `keepOpenOnSelect`. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
+ - A `min` or `max` that you set before the first render no longer throws a `TypeError`. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
- #### Date range picker, Date time input, Mask input
- - A mask position holds one UTF-16 code unit. So the editors now reject an astral character, such as an emoji, as input and as a prompt. Before, it moved the positions after it or split into two halves. A mask or input format with an astral literal now edits at the correct positions. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
- - In the mask input, an empty value is no longer a bad input. Only `required` makes an empty control invalid. A value that fits no position of a letter mask, such as `12` for `LLL`, is now a bad input. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
- - In the date time input and the date range picker: [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
- - A mask flag in the input format, such as `A` or `0`, now stays literal. The letters of a date range separator, such as the `t` of `' to '`, also stay literal.
- - A `yyyy` year of three or four typed digits now stays as typed, also in the calendar: `0049` is year 49, and `02/29/0000` is valid. One or two typed digits still resolve to the range 1950 to 2049.
- - A `y` or `yyy` year format now widens to four characters in the mask and in the default placeholder, and keeps its case.
- - In the date range picker, a `min` or `max` that you set before the first render no longer causes a `TypeError`.
- - In the date range picker, a change of `mode` no longer sets `keepOpenOnSelect`. Before, the change to `dialog` set it to `true`, and it stayed `true` after a change back to `dropdown`, so the dropdown stayed open after a selection.
- - In the date range picker, a `value` that you set from code no longer emits `igcChange` when the user clicks Done, also after `select()`, or on a blur of the input.
- - In the date time input, `stepUp()` and `stepDown()` now update `value` at once, also while the input has the focus, as `setRangeText()` does. A step of a part that is not in the input format, such as the minutes of `yyyy/MM/dd`, now stays after blur. Before, `value` changed only on blur, and that step was lost. The arrow keys and the mouse wheel still change only the text until blur.
+ - The editors reject an astral character, such as an emoji, as input and as a prompt. A mask or an input format with an astral literal edits at the correct positions. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
+ - Mask input: an empty value is not a bad input. Only `required` makes an empty control invalid. A value that fits no position of a letter mask, such as `12` for `LLL`, is a bad input. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
+ - Date range picker, Date time input: [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
+ - Mask flags in the input format, such as `A` or `0`, stay literal. So do the letters of a range separator, such as the `t` of `' to '`.
+ - A `yyyy` year of three or four typed digits stays as typed, so `0049` is the year 49. One or two typed digits still give a year from 1950 to 2049.
+ - A `y` or `yyy` year format widens to four characters.
- #### Date time input
- - The `filled` part is now only on an input that shows a date or a part of one. Before, an empty input without the focus also had it, so its text, prefix and suffix used the colors of a filled input.
+ - An empty input without the focus no longer has the `filled` part. [#2580](https://github.com/IgniteUI/igniteui-webcomponents/pull/2580)
- #### Dialog
- - A `hide()` in the same task as `show()` now closes the dialog at once. Before, the dialog showed and then faded out.
- - A dialog that you move in the document, or remove and append again, now keeps its state. An open dialog, also one in its exit, is modal again after the append, with its backdrop. A dialog that closed while it was out of the document, also at the end of an exit, stays closed, and a `show()` while it was out makes it modal when you append it. Before, the inner `` came back as a non-modal dialog with no backdrop, or stayed open after a close, and the next `show()` could throw an `InvalidStateError`. This also applies to the date picker and the date range picker in dialog mode.
- - A change of `open` against a running `show()` or `hide()` now ends it, and the dialog keeps the new state. `open` stays `true` during the exit, so set it to `false` and then to `true` to keep the dialog open. The method, and `toggle()`, then resolve `false`, and a close by the user emits `igcClosing` but not `igcClosed`. Before, the exit closed the dialog when its animation ended, for example when a date picker in dialog mode opened again quickly. After `open = false` during `show()`, a new `show()` did nothing until the entrance animation ended.
- - An `aria-label` on the dialog is now its only accessible name. Before, the inner `` also got `aria-labelledby` with the text of the label, which is not a valid ID reference. [#2429](https://github.com/IgniteUI/igniteui-webcomponents/pull/2429)
- - When the platform closes the dialog while `open` stays `true`, the dialog now opens again. An example is a second Escape when an `igcClosing` handler cancels the close. Before, only `keepOpenOnEscape` did this. In other cases, `open` stayed `true` with a closed dialog, the backdrop still covered the page, and `show()` did nothing. [#2441](https://github.com/IgniteUI/igniteui-webcomponents/pull/2441)
-- #### Dropdown
- - Content that is not an item now keeps its keys while the dropdown is open. A text field takes the typed text, the arrow keys, Home and End, a radio group takes the arrow keys, and a button takes Enter. Before, the dropdown used these keys for the navigation, and Enter selected the active item. Tab and Shift+Tab now move through the target and the focusable content. Past either end, Tab selects the active item and closes the dropdown, as before. Escape from the content closes the dropdown, unless the content handled the key. When the dropdown closes with the focus in its content, the target gets the focus. Before, the content became inert and the focus went to the page body. Put interactive content in the new `header` and `footer` slots, because the default slot is inside the `listbox` role. [#2531](https://github.com/IgniteUI/igniteui-webcomponents/issues/2531)
-- #### Dropdown, Select
- - Setting `selected` on an item to its current value no longer changes its `active` state. Before, a framework that sets each property on each render, such as React, made the selected item active again on each render, and the item that the user moved to with the arrow keys lost its highlight. In the select, it also lost its tab stop.
-- #### Expansion panel
- - A change of `open` against a running `show()` or `hide()` now ends it: the method resolves `false`, the animation stops, and the panel sends no `igcOpened` or `igcClosed`. Before, the animation ran to its end, the panel sent the trailing event, and after `open = false` during `show()`, a new `show()` did nothing until the animation ended.
+ - `hide()` in the same task as `show()` closes the dialog at once. [#2574](https://github.com/IgniteUI/igniteui-webcomponents/pull/2574)
+ - A dialog that you move, or remove and append again, keeps its state. An open dialog is modal again, with its backdrop, and a closed dialog stays closed. This also applies to the date pickers in dialog mode. [#2577](https://github.com/IgniteUI/igniteui-webcomponents/pull/2577)
+ - An `aria-label` on the dialog is its only accessible name. [#2429](https://github.com/IgniteUI/igniteui-webcomponents/pull/2429)
+ - When the browser closes the dialog while `open` stays `true`, the dialog opens again. An example is a second Escape after a canceled `igcClosing`. [#2441](https://github.com/IgniteUI/igniteui-webcomponents/pull/2441)
- #### File input
- - In the Bootstrap, Fluent and Indigo themes, a long file name ends with an ellipsis again. Before, the file names did not shrink and went outside the component. [#2384](https://github.com/IgniteUI/igniteui-webcomponents/issues/2384) [#2411](https://github.com/IgniteUI/igniteui-webcomponents/pull/2411)
- - An empty string in `value` now also clears the form value and updates the validity. Before, the control showed no file, but the form still submitted the old files, and a `required` control stayed valid. [#2481](https://github.com/IgniteUI/igniteui-webcomponents/pull/2481)
+ - In the Bootstrap, Fluent and Indigo themes, a long file name ends with an ellipsis again. [#2384](https://github.com/IgniteUI/igniteui-webcomponents/issues/2384) [#2411](https://github.com/IgniteUI/igniteui-webcomponents/pull/2411)
+ - An empty string in `value` clears the form value and updates the validity. [#2481](https://github.com/IgniteUI/igniteui-webcomponents/pull/2481)
- #### Focus
- - A `focus()` call on a component right after it connects now moves the focus to the component after its first render, as on a native control. Before, the call did nothing, and in the checkbox, radio, select and switch, `focus()` and `blur()` threw a `TypeError`. A `blur()` of the component, or another element that takes the focus before the render, cancels the call. This applies to the button, carousel, checkbox, chip, color picker, combo, date picker, date range picker, date time input, file input, icon button, input, mask input, radio, range slider, rating, select, slider, switch, textarea and toggle button.
- - The button, carousel, chip, color picker, date picker, date range picker, icon button and textarea now list `focus()` and `blur()` in their API.
+ - `focus()` right after a component connects moves the focus to the component after its first render, as on a native control. Before, the call did nothing, and in the checkbox, radio, select and switch it threw a `TypeError`. [#2569](https://github.com/IgniteUI/igniteui-webcomponents/pull/2569)
+ - This applies to the button, carousel, checkbox, chip, color picker, combo, date picker, date range picker, date time input, file input, icon button, input, mask input, radio, range slider, rating, select, slider, switch, textarea and toggle button.
- #### Form controls
- - A failed form submit or `form.reportValidity()` now moves the focus to the first invalid control, as for native controls, also when an invalid native control comes after it. `reportValidity()` of an invalid control focuses that control. `form.checkValidity()` does not move the focus. Before, the focus did not move, because the controls cancel the `invalid` event to hide the browser message. Only the select took the focus on `reportValidity()`. To tell a submit from `form.checkValidity()`, the library wraps `checkValidity()`, `reportValidity()` and `requestSubmit()` of `HTMLFormElement.prototype`. [#2430](https://github.com/IgniteUI/igniteui-webcomponents/pull/2430)
- - The controls no longer send an `invalid` event while the user edits or leaves an invalid field. Only `checkValidity()`, `reportValidity()`, the same methods of the form, and a failed submit send it, as for a native control. [#2430](https://github.com/IgniteUI/igniteui-webcomponents/pull/2430)
- - In the rating, slider and range slider, `focus()` now focuses the control, and `blur()` removes the focus. The rating focuses its slider element, the slider its thumb, and the range slider its lower thumb, unless one of its thumbs already has the focus. A disabled control does not take the focus. Before, `focus()` did nothing, so a failed submit and `reportValidity()` did not focus an invalid rating or slider. [#2448](https://github.com/IgniteUI/igniteui-webcomponents/pull/2448)
- - The asterisk of a required control is no longer part of its accessible name. Before, screen readers read the label as "Email star". [#2428](https://github.com/IgniteUI/igniteui-webcomponents/pull/2428)
- - In the date picker, the date range picker, the date time input and the mask input, `required` now sets `aria-required` on the native input of each editor, also in the two-input mode of the date range picker. Before, screen readers did not announce these fields as required. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
- - A press on a button below a control now clicks the button, also when the control shows or hides a validation message as it loses the focus. The message changes when the press ends. Before, the message moved the button before the pointer was released, so the click went to a different element, and a submit button did nothing.
- - `Enter` in a form control no longer submits the form when a `keypress` listener cancels the key, or when a `keydown` or `keypress` listener disables the control, as for a native control. A real key press now submits after its `keypress`. A `keydown` that code dispatches still submits by itself.
- - In the date picker and the date range picker, `Enter` in the content of the `prefix` or `suffix` slot no longer submits the form a second time, and `Enter` on a button there no longer submits it. Before, the picker also submitted the form for the keys of its slotted content.
+ - A failed submit or `form.reportValidity()` moves the focus to the first invalid control, as for native controls. For this, the library wraps `checkValidity()`, `reportValidity()` and `requestSubmit()` of `HTMLFormElement.prototype`. [#2430](https://github.com/IgniteUI/igniteui-webcomponents/pull/2430)
+ - The controls send `invalid` only from `checkValidity()`, `reportValidity()` or a failed submit, not while the user edits. [#2430](https://github.com/IgniteUI/igniteui-webcomponents/pull/2430)
+ - `focus()` and `blur()` work in the rating, slider and range slider. [#2448](https://github.com/IgniteUI/igniteui-webcomponents/pull/2448)
+ - The asterisk of a required control is no longer part of its accessible name. [#2428](https://github.com/IgniteUI/igniteui-webcomponents/pull/2428)
+ - The date picker, date range picker, date time input and mask input set `aria-required` on each native input. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
+ - A click on a button below a control works also when the control shows or hides a validation message on blur. [#2491](https://github.com/IgniteUI/igniteui-webcomponents/pull/2491)
- #### Hidden ancestors
- - The button, button group, carousel, checkbox, radio, slider, splitter and switch now hide at the same time as a hidden ancestor, for example a carousel slide that goes out of view. So do the textarea in the Material and Indigo themes, the tabs in the Fluent theme, and in the Indigo theme the prefix and the suffix of a focused input, mask input, date time input or file input. Before, they stayed visible for the length of their transition, because the transition applied to all properties, `visibility` included. They now transition only the properties that change between their states.
- - A carousel in a hidden ancestor, for example in a slide of another carousel, now also hides its active slide and its active indicator dot, and the tabs hide their selected indicator. Before, these stayed visible, because they set `visibility: visible`.
- - After an orientation change, the splitter bar now takes its new size at once, and in the Indigo theme also its new scale. Before, the size changed over 150 ms, and the panes measured 0 during that time. The Indigo bar also kept the scale of the old orientation for 0.75 s.
+ - Components hide at the same time as a hidden ancestor, such as a carousel slide that goes out of view. Before, some stayed visible for the length of their transition. The active slide and indicator of a carousel and the selected indicator of the tabs also hide. [#2552](https://github.com/IgniteUI/igniteui-webcomponents/pull/2552)
+ - After an orientation change, the splitter bar takes its new size at once. [#2552](https://github.com/IgniteUI/igniteui-webcomponents/pull/2552)
- #### Highlight
- - A space in `searchText` now matches any sequence of whitespace in the content, such as a line break in the HTML source. Before, "cold brew" did not find the two words when a line break separated them. [#2430](https://github.com/IgniteUI/igniteui-webcomponents/pull/2430)
- - **Behavioral change:** The match colors now come only from `--background`, `--foreground`, `--background-active` and `--foreground-active` on the highlight. A value that you set on an element inside the highlight no longer changes the matches. So the matches inside other components that set these names for their own colors, such as a list, a tree, a button or a nested highlight, now show the colors of the highlight. Before, they took the colors of that component, so a match in a list had no visible background.
- - A `searchText` or `caseSensitive` set after the highlight connects and before its first render now runs the search. Before, the highlight showed the matches of the old values until the next change.
+ - A space in `searchText` matches any sequence of whitespace, such as a line break. [#2430](https://github.com/IgniteUI/igniteui-webcomponents/pull/2430)
+ - A `searchText` or `caseSensitive` that you set before the first render runs the search. [#2572](https://github.com/IgniteUI/igniteui-webcomponents/pull/2572)
- #### Host ARIA attributes
- - A host `aria-label`, `aria-labelledby` and `aria-describedby` now name and describe the inner element that has the role. Before, these attributes stayed on the host, where screen readers did not use them, or only `aria-label` got to the inner element: [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
- - Button, Icon button: the native button or link. A `` for the button also names it, and an `igc-tooltip` on the button describes it. A host `aria-label` has priority over a ``, as for a native button.
- - Button group: the native button of each toggle button.
- - Chip: the action button.
- - Dialog: the inner ``. The host `aria-labelledby` has priority over `aria-label` and the title.
- - Expansion panel: the header.
- - Form controls: the host `aria-describedby` describes the native control, after the helper text. So an `igc-tooltip` on the control also describes it. In the two-input date range picker, the end editor gets only the host description.
- - Navigation drawer: the drawer. `label` still has priority over the host `aria-label`.
- - QR code: the SVG. The exported SVG does not include `aria-labelledby` and `aria-describedby`.
- - Splitter: the bar. A bar without a host name keeps the default name, "Resize panes" in English. Before, all bars had this name, so the bars of nested splitters had the same name. [#2449](https://github.com/IgniteUI/igniteui-webcomponents/pull/2449)
- - Stepper: the header of each step.
- - Tabs: the header of each tab.
- - Tree: the link that takes the role of a tree item, unless the link has its own attributes.
- - A change of the host `aria-label` alone now updates the name. Before, the change applied only after the next change of a different property, such as `open` on the dialog: [#2414](https://github.com/IgniteUI/igniteui-webcomponents/pull/2414) [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
- - Button, Icon button, Button group: the native button or link.
- - Dialog: the dialog. When you remove `aria-label`, the title gives the name again.
- - QR code: the `` of the code.
+ - A host `aria-label`, `aria-labelledby` and `aria-describedby` name and describe the inner element that has the role. A change of these attributes applies at once. [#2414](https://github.com/IgniteUI/igniteui-webcomponents/pull/2414) [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432) [#2449](https://github.com/IgniteUI/igniteui-webcomponents/pull/2449)
+ - This applies to the button, icon button, button group, chip, dialog, expansion panel, navigation drawer, QR code, splitter, stepper, tabs and tree, and to `aria-describedby` of the form controls.
+ - Button, Icon button: a `` for the button also names it, and an `igc-tooltip` on it describes it.
+ - Dialog: the host `aria-labelledby` has priority over `aria-label` and the title.
+ - Splitter: the bars of nested splitters no longer have the same name.
- #### Icon
- - The SVG of an icon is now hidden from assistive technologies, because the host carries the name. Before, the SVG of an icon without a title was an unnamed image. A change of `aria-label` or `aria-labelledby` now updates the role of the icon. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
+ - The SVG is hidden from assistive technology, because the host has the name. A change of `aria-label` or `aria-labelledby` updates the role. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
- #### Input
- - `pattern` must now match the full value, as for a native input. Before, a match in a part of the value was sufficient, so `[0-9]{3}` accepted `1234`. The pattern also compiles with the `v` flag. An invalid pattern sets no constraint. Before, it caused an error in `checkValidity()`. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
- - In the Material theme, the floated label of an outlined search field now stays inside the box, as in the filled search field. Before, the box cut off the top of the label when the field had a placeholder, a value or focus. The label of a read-only outlined search field also no longer moves up out of the box on focus.
+ - `pattern` must match the full value, as in a native input. So `[0-9]{3}` no longer accepts `1234`. An invalid pattern sets no constraint. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432)
+ - In the Material theme, the floated label of an outlined search field stays inside the box. [#2526](https://github.com/IgniteUI/igniteui-webcomponents/pull/2526)
- #### Library
- - The custom elements manifest no longer lists an event without a name for each component that emits events. It also no longer lists the chat events on the chat input, which does not dispatch them.
- - A server-rendered component with slotted content now hydrates without an error and then shows its slotted content. Before, the first render in the browser read the slotted content, which the server render does not have. So the circular progress and the linear progress threw a hydration error, and the button group, chip, dialog, expansion panel, navigation drawer, navigation drawer item, rating, step and tooltip kept the server state of their slot-dependent parts. For example, the prefix and the suffix of a chip stayed hidden.
+ - The custom elements manifest no longer lists an event without a name, or chat events on the chat input. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
+ - A server-rendered component with slotted content hydrates without an error and shows its slotted content. [#2580](https://github.com/IgniteUI/igniteui-webcomponents/pull/2580)
- #### List
- - `igc-list-header` now has the `listitem` role, not `separator`. A list cannot contain a separator, and a separator hides its content from assistive technologies, so screen readers could skip the header text. Screen readers now read the header and count it with the items. Put a heading in the header, so that users can move from group to group. [#2439](https://github.com/IgniteUI/igniteui-webcomponents/pull/2439)
- - The title and subtitle container of `igc-list-item` is now a `div`, not a `header` element. Before, Chromium exposed it as a `sectionheader` in each item. The `header` part does not change. [#2439](https://github.com/IgniteUI/igniteui-webcomponents/pull/2439)
+ - `igc-list-header` has the `listitem` role, not `separator`, so screen readers read its text. Put a heading in the header, so that users can move from group to group. [#2439](https://github.com/IgniteUI/igniteui-webcomponents/pull/2439)
+ - The title container of `igc-list-item` is a `div`, not a `header`. So browsers no longer expose a section header in each item. [#2439](https://github.com/IgniteUI/igniteui-webcomponents/pull/2439)
- #### Localization
- - A change of the global locale now updates these components. Before, they kept a previous locale: [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474) [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
- - Chat: the names of the message actions and the input controls. A change of its `locale` or `resourceStrings` also updates them.
- - Combo: the group sort order. Before, it kept the collation of the locale that was active when the combo was created.
- - Date time input: an input that was not in the document during the change uses the new locale when you add it again.
- - Tree: the expand and collapse labels of the tree items.
- - The calendar, the date picker, the date range picker and the chat now resolve every core resource string of the component. Before, they kept only the strings that also have an older resource name, so a string that `igniteui-i18n-core` added later was `undefined`. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
- - The date picker and the date range picker now give the calendar strings of `resourceStrings` to their calendar. Before, the calendar used its default strings, so for example a custom `calendar_previous_month` did not name the navigation button. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
- - English strings that you register with `registerI18n(strings, 'en-US')` before the first instance of a component now apply. Before, that instance registered the default English strings of the component over them. [#2476](https://github.com/IgniteUI/igniteui-webcomponents/pull/2476)
- - The API documentation now shows the type of `resourceStrings` for the calendar, carousel, chip, combo, file input and tree. Before, it showed `TGet`. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
- - `validationMessage` of the form controls now uses the validation strings of the locale, also after a change of the locale. A number uses the decimal separator of the locale, and a date shows as the control shows it. Before, the message was always in English, a number always used a decimal point, a date used the `Date.toString()` format, and the date range picker showed "[object Object]" for its range.
+ - A change of the global locale updates the chat labels, the combo group sort order, the tree item labels, and a date time input that was outside the document. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474) [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
+ - The calendar, date picker, date range picker and chat resolve every core resource string. Before, the newer strings were `undefined`. [#2474](https://github.com/IgniteUI/igniteui-webcomponents/pull/2474)
+ - The date pickers give the calendar strings of `resourceStrings` to their calendar. [#2475](https://github.com/IgniteUI/igniteui-webcomponents/pull/2475)
+ - English strings that you register with `registerI18n(strings, 'en-US')` before the first component apply. [#2476](https://github.com/IgniteUI/igniteui-webcomponents/pull/2476)
+ - `validationMessage` of the form controls uses the strings, the number format and the date format of the locale. Before, it was always in English, and the date range picker showed "[object Object]". [#2492](https://github.com/IgniteUI/igniteui-webcomponents/pull/2492)
- #### Navigation drawer
- - When a drawer with a `mini` variant closes, the focus now goes back to the element that had the focus when the drawer opened, such as a menu button in the rail. Before, the drawer closed its dialog while the rail was still hidden, so the focus went to the page body. [#2440](https://github.com/IgniteUI/igniteui-webcomponents/pull/2440)
- - When the platform closes the dialog of a drawer that stays open, the drawer now opens the dialog again. An example is a second Escape after an `igcClosing` handler cancels the close. When the drawer then closes, the focus goes back to the element that had it when the drawer first opened. Before, `open` stayed `true` with a closed dialog, and `show()` did nothing. [#2440](https://github.com/IgniteUI/igniteui-webcomponents/pull/2440)
- - In the Material theme, the hover and active highlight of an item now shows in a drawer with `position="relative"`. Before, the background of the drawer covered it.
- - **Behavioral change:** In Firefox and Safari, a drawer at an edge position now slides out and its backdrop fades out, as in Chromium. The dialog stays modal until this exit ends, so `hide()` and `toggle()` resolve, and `igcClosed` comes, after the exit. `open` still changes at once, and a change of `open` to `false` also runs the exit. A `show()` or a change of `open` to `true` during the exit keeps the drawer open, and the running `hide()` resolves `false`. With reduced motion, the drawer, its mini variant and its backdrop now change at once, with no slide and no fade. Before, `hide()` resolved and `igcClosed` came when the exit started, and in Firefox and Safari the drawer and its backdrop went away at once.
- - Content with `position: fixed` in an open drawer with `position="top"` or `position="bottom"`, or in the mini variant, is now placed against the viewport. Before, the drawer or the mini variant was its containing block.
+ - When a drawer with a `mini` variant closes, the focus goes back to the element that had it when the drawer opened. [#2440](https://github.com/IgniteUI/igniteui-webcomponents/pull/2440)
+ - When the browser closes the dialog of a drawer that stays open, the drawer opens the dialog again. [#2440](https://github.com/IgniteUI/igniteui-webcomponents/pull/2440)
+ - In the Material theme, the item highlight shows in a drawer with `position="relative"`. [#2499](https://github.com/IgniteUI/igniteui-webcomponents/pull/2499)
+ - Content with `position: fixed` in a `top` or `bottom` drawer, or in the mini variant, is placed against the viewport. [#2578](https://github.com/IgniteUI/igniteui-webcomponents/pull/2578)
- #### QR code
- - Codes of versions 30 to 40 now agree with ISO/IEC 18004:
- - At the `M` error correction level, they use the correct data codeword counts. Before, they had the wrong block structure. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
- - In versions 31 and 32, the alignment patterns are at the correct positions. Before, the last alignment pattern of each row and column was two modules out of position, so a scanner could fail to read these codes. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - Without `error-level`, a logo larger than the safe area of level `M` now raises the error correction level to the smallest level that holds the logo, as documented. Before, the default `M` always applied, so the logo became smaller. An explicit `error-level`, `M` included, still limits the size of the logo. [#2414](https://github.com/IgniteUI/igniteui-webcomponents/pull/2414)
- - The logo in an exported SVG now also has `xlink:href`, so SVG 1.1 consumers show it, such as Illustrator, the Office import, Batik and older librsvg. Before, they left a blank area in the code. [#2414](https://github.com/IgniteUI/igniteui-webcomponents/pull/2414)
- - `toImage()` now reads `size` after pending property changes render, as it already did for the other properties. Before, a `size` set right after the call did not change the size of the image. [#2483](https://github.com/IgniteUI/igniteui-webcomponents/pull/2483)
- - When the value does not fit the `version`, or does not fit version 40, the code now renders nothing and writes a warning to the console, and `toBlob()` and `toImage()` reject with the reason. Before, the render threw an error, and the component still showed the previous code. A `version` that is not a whole number from 1 to 40 now selects the version automatically, as when it is not set.
+ - Codes of versions 30 to 40 agree with ISO/IEC 18004. The `M` level uses the correct data codeword counts, and versions 31 and 32 have their alignment patterns at the correct positions. Before, a scanner could fail to read these codes. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409) [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - Without `error-level`, a logo that is too large for level `M` raises the error correction level, as documented. [#2414](https://github.com/IgniteUI/igniteui-webcomponents/pull/2414)
+ - The logo in an exported SVG also has `xlink:href`, so SVG 1.1 tools, such as Illustrator, show it. [#2414](https://github.com/IgniteUI/igniteui-webcomponents/pull/2414)
+ - `toImage()` reads `size` after pending changes render. [#2483](https://github.com/IgniteUI/igniteui-webcomponents/pull/2483)
+ - A value that does not fit renders nothing and writes a warning to the console. `toBlob()` and `toImage()` reject with the reason. A `version` that is not a whole number from 1 to 40 selects the version automatically. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
- #### Radio group
- - In the horizontal alignment, the helper text and the validation messages of the radios now show under the radios, each in a row of its own. Before, the messages of two radios showed on top of each other. With a `label` element in the group, they showed between the label and the radios. [#2442](https://github.com/IgniteUI/igniteui-webcomponents/pull/2442)
+ - In the horizontal alignment, the helper text and the validation messages show under the radios, each in its own row. [#2442](https://github.com/IgniteUI/igniteui-webcomponents/pull/2442)
- #### Range slider, Slider
- - A value on a fractional step now stays where it is. Before, each change of a constraint moved it down by one step: 0.5 with `step="0.01"` became 0.47. With `step="0.1"` on a scale of 0 to 1, the arrow keys, Page Up and `stepUp()` stopped at 0.4. [#2433](https://github.com/IgniteUI/igniteui-webcomponents/issues/2433) [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - A value now snaps to the nearest step, as for a native range input. A tie goes to the higher step, and the steps count from `min`. Before, a value went down to the step below it, and the steps counted from `lowerBound`, so the values did not match the discrete track and the ticks. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - The order of `value`, `lower`, `upper`, `min`, `max` and `step` no longer changes the result, as attributes or as properties set in one task. For example, `` gives 0.5, `` gives 150, and `` gives a `min` of 150. Before, the slider checked each value against the constraints of that moment. When an update ends with `min` above `max`, the slider keeps the previous `min` and `max`. [#2434](https://github.com/IgniteUI/igniteui-webcomponents/issues/2434) [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - A negative `step` now keeps the previous step. Before, the slider accepted it and reversed the arrow keys. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - The removal of the `lower-bound` or `upper-bound` attribute, or a `null` or `undefined` value, now unsets the bound, so it follows `min` or `max` again. Before, the removal set the bound to 0, which could move the value, and `undefined` kept the previous bound. [#2445](https://github.com/IgniteUI/igniteui-webcomponents/pull/2445)
- - When the projected `igc-slider-label` elements go, `min`, `max` and `step` return to the values that the author set. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - `upper` of the range slider now follows `upperBound` until you set it, and again after you remove the attribute. So `` covers the full scale. Before, `upper` was 0. A `lower` above `upper` from code or markup now swaps the two values, as a drag does. Before, the thumbs crossed and the fill had a negative width. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - The keyboard no longer emits `igcInput` and `igcChange` when the value stays the same, for example End on the last step below `max`. A right click no longer moves a thumb, and a second pointer, such as a second finger, no longer takes control of a drag. A drag now sends one `igcChange`. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - Each thumb of the range slider now announces its own value: the label text, or the formatted value. Before, the focused thumb announced label indexes such as "0 - 2", and the other thumb announced English text such as "min 20". The host `aria-label` and `aria-labelledby` now name the group of the two thumbs, and the host `aria-describedby` describes the two thumbs. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - The thumb label is now in the top layer, so a container that clips its overflow, such as a card or a dialog body, no longer cuts it off. The label also shows while a thumb has the keyboard focus, and Escape hides it, also while the focus is on a different element. A modifier key alone, such as Shift, no longer counts as keyboard focus. [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
- - The box of the slider now holds the ticks and their labels, so a slider with tick labels is taller. Before, the labels went outside the box, by approximately 25 px for the `end` orientation and more for rotated labels, and the next element covered them. You can remove the space that you added for the labels. Each tick label is now next to its tick in the shadow DOM, not absolutely positioned, and stays on one line. Before, a label at the end of the track wrapped at each space, such as "1,000" and "GB" on two lines. Rotated labels at the start are 4 px nearer to the ticks, at the same distance as the other labels. [#2445](https://github.com/IgniteUI/igniteui-webcomponents/pull/2445)
+ - Values: [#2433](https://github.com/IgniteUI/igniteui-webcomponents/issues/2433) [#2434](https://github.com/IgniteUI/igniteui-webcomponents/issues/2434) [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438) [#2445](https://github.com/IgniteUI/igniteui-webcomponents/pull/2445)
+ - A value snaps to the nearest step, counted from `min`, as in a native range input. A value on a fractional step, such as 0.5 with `step="0.01"`, stays where it is.
+ - The order of `value`, `lower`, `upper`, `min`, `max` and `step` no longer changes the result. When `min` ends above `max`, the slider keeps the previous `min` and `max`.
+ - A negative `step` keeps the previous step.
+ - Removing `lower-bound` or `upper-bound` unsets the bound.
+ - `upper` of the range slider follows `upperBound` until you set it, so the default range covers the full scale. A `lower` above `upper` swaps the two values.
+ - When the `igc-slider-label` elements go, `min`, `max` and `step` go back to your values.
+ - Interaction: [#2438](https://github.com/IgniteUI/igniteui-webcomponents/pull/2438)
+ - The keyboard emits no `igcInput` or `igcChange` when the value stays the same. A drag emits one `igcChange`. A right click or a second pointer no longer moves a thumb.
+ - Each thumb of the range slider announces its own value. The host `aria-label` and `aria-labelledby` name the group of the two thumbs.
+ - The thumb label is in the top layer, so a container that clips its overflow does not cut it. It also shows on keyboard focus, and Escape hides it.
+ - The box of the slider holds the ticks and their labels, so a slider with tick labels is taller. You can remove the space that you added for the labels. A tick label stays on one line. [#2445](https://github.com/IgniteUI/igniteui-webcomponents/pull/2445)
- #### Select
- - Setting `value` to the value that the select already has no longer moves the active item of an open list back to the selected item. Before, a framework that sets each property on each render, such as React, reset the keyboard position on each render, and Enter could then select the wrong item. A user selection, `select()` and `clearSelection()` still move the active item, also when the selection does not change. While the list is open, removing the active item now moves the navigation back to the selected item. Before, Enter could select the removed item. [#2515](https://github.com/IgniteUI/igniteui-webcomponents/issues/2515)
- - In forced colors mode, the list now has a border. Before, the style applied to an element that does not exist. In the indigo theme, the list has only this border, not also the outline of the theme.
- - The content of the `header` and `footer` slots now keeps its keys while the list is open. A text field takes the typed text, the arrow keys, Home and End, and a button takes Space and Enter. Before, the select used these keys for the navigation and the type-ahead, and Enter selected the active option. Tab and Shift+Tab now move through the input, the header content, the active option and the footer content. Past either end, Tab selects the active option and closes the list, as before. Escape from the content closes the list, unless the content handled the key. When the list closes with the focus in it, the input gets the focus. The two slots are now outside the `listbox` role, so a text field or a button in them no longer fails the accessibility audit. While the list is closed, the select no longer cancels Escape, so an element around it, such as a dropdown, can close on the key. [#2532](https://github.com/IgniteUI/igniteui-webcomponents/issues/2532)
+ - In forced colors mode, the list has a border. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
- #### Snackbar, Toast
- - `container` positioning now adds an anchor name to the inline `anchor-name` of the container while the component is open. It adds the name again when a new `style` attribute removes it. Before, the container was the `source` of the popover, so the browser moved the snackbar to the start of the container in the tab order. Some containers stay the `source` and keep their anchor names: a container with its own anchor names, also names added while the component is open, and a container in a different tree, such as the host of the shadow root that holds the component. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- - A component that moves while it is open now shows again in its new place, with a full display time. Before, it stayed hidden with `open` set. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- - `show()` and `toggle()` during the fade-out of `hide()` now keep the component open, and `hide()` during the fade-out resolves `false`. Before, `show()` resolved `false` and the component closed. `toggle()` or a second `hide()` closed the component immediately, without the remaining fade-out. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- - The default action of the snackbar now shows the keyboard focus style of a flat button in every theme, also on hover. Before, it showed none in the Material and Fluent themes, and none in any theme when the `action-text` attribute was set. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- - A change of `open` against a running fade now ends it, and the component keeps the new state, as in the dialog. `open` stays `true` during the fade-out, so set it to `false` and then to `true` to keep the component open. The display time then starts again, and `hide()` resolves `false`. `open = false` during the fade-in of `show()` stops it, and `show()` resolves `false`. Before, the fade-out closed the component when it ended, also when `open` was set to `true` again.
+ - `container` positioning no longer moves the component to the start of the container in the tab order. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
+ - A component that moves while it is open shows again in its new place, with a full display time. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
+ - The default action of the snackbar shows the keyboard focus style in every theme. [#2447](https://github.com/IgniteUI/igniteui-webcomponents/pull/2447)
- #### Splitter
- - The bar no longer has the English description "Start pane expanded and End pane expanded". Its value already tells which pane is collapsed: 0% for the start pane and 100% for the end pane. [#2449](https://github.com/IgniteUI/igniteui-webcomponents/pull/2449)
+ - The bar no longer has the English description "Start pane expanded and End pane expanded". Its value tells which pane is collapsed. [#2449](https://github.com/IgniteUI/igniteui-webcomponents/pull/2449)
- #### Stacking order
- - The z-index values of the parts of a component now stay inside the component, so they no longer compete with the layers of the page. Before, a page element with a `z-index` that came before the component could show under its parts. For example, the tab labels showed through a sticky page header with `z-index: 1`. This applies to the button group, carousel, checkbox, color picker, date range picker, date time input, file input, input, mask input, navigation drawer with `position="relative"`, radio, splitter, stepper, switch, tabs, textarea and tile manager. Slotted content with a `z-index` now also stays inside these components.
+ - The `z-index` values of the parts stay inside each component, so they no longer compete with the layers of the page. For example, the tab labels no longer show through a sticky page header with `z-index: 1`. Slotted content with a `z-index` also stays inside. [#2499](https://github.com/IgniteUI/igniteui-webcomponents/pull/2499)
+ - This applies to the button group, carousel, checkbox, color picker, date range picker, date time input, file input, input, mask input, navigation drawer with `position="relative"`, radio, splitter, stepper, switch, tabs, textarea and tile manager.
- #### Stepper
- - A click in the content of a step no longer activates that step. Before, the same click undid the change of a content button that called `next()`, `prev()`, `navigateTo()` or `reset()`, with an `igcActiveStepChanging` and `igcActiveStepChanged` pair. A click on a header of a nested stepper no longer changes the outer stepper. [#2453](https://github.com/IgniteUI/igniteui-webcomponents/pull/2453)
- - The content of the inactive steps is now `inert`. Before, it was only transparent, so Tab moved into the fields of hidden steps, and screen readers read every panel. [#2453](https://github.com/IgniteUI/igniteui-webcomponents/pull/2453)
- - The header of a disabled step, and of a step that linear mode locks, now has `aria-disabled`. Before, screen readers did not announce these steps as unavailable. [#2453](https://github.com/IgniteUI/igniteui-webcomponents/pull/2453)
- - `navigateTo()` no longer activates a disabled step. A step that linear mode locks stays available to `navigateTo()`.
- - Setting `active` now activates the step at once, so of several steps that become active in one task, through `active`, `navigateTo()`, `next()`, `prev()` or `reset()`, the last one is active. Before, a change of another step in the same task, for example by a binding such as `?active=${index === current}`, kept the previous step active. A step added with `active` still follows the rules of the markup.
- - When an `igcActiveStepChanging` handler activates a step, through `active` or `navigateTo()`, the click now stops and does not emit `igcActiveStepChanged`. Before, the click still changed the step or emitted the event, and the animation started from the wrong step.
- - `next()`, `prev()` and the arrow keys now move from a disabled active step to its neighbours, and the arrow keys, Home and End can move the focus back to its header. `prev()` moves back from an active step that linear mode locks. Before, `next()` and `prev()` did nothing, and the arrow keys moved the focus to the first or the last step.
- - When no step is active because all steps are disabled, enabling a step now activates the first enabled step. Before, no step was active, so the Tab key could not reach the stepper.
- - A control in the title or the subtitle of a step, such as a button or a text field, now keeps its keys. Before, the stepper handled Enter , Space , the arrow keys, Home and End on the control and prevented their default action: Enter and Space activated the step, and the arrow keys moved the focus to another step header.
+ - A click in the content of a step no longer activates the step. A click on a header of a nested stepper no longer changes the outer stepper. [#2453](https://github.com/IgniteUI/igniteui-webcomponents/pull/2453)
+ - The content of an inactive step is `inert`, so Tab and screen readers skip it. [#2453](https://github.com/IgniteUI/igniteui-webcomponents/pull/2453)
+ - The header of a disabled step, or of a step that linear mode locks, has `aria-disabled`. [#2453](https://github.com/IgniteUI/igniteui-webcomponents/pull/2453)
+ - `navigateTo()` no longer activates a disabled step. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
+ - Setting `active` activates the step at once. When several steps become active in one task, the last one is active. [#2547](https://github.com/IgniteUI/igniteui-webcomponents/pull/2547)
+ - When an `igcActiveStepChanging` handler activates a step, the click stops and does not emit `igcActiveStepChanged`. [#2547](https://github.com/IgniteUI/igniteui-webcomponents/pull/2547)
+ - `next()`, `prev()` and the arrow keys move from a disabled active step to its neighbors. `prev()` moves back from a step that linear mode locks. [#2547](https://github.com/IgniteUI/igniteui-webcomponents/pull/2547)
+ - When all the steps are disabled, enabling a step activates the first enabled step. [#2547](https://github.com/IgniteUI/igniteui-webcomponents/pull/2547)
+ - A control in the title or the subtitle of a step, such as a button, keeps its keys. [#2563](https://github.com/IgniteUI/igniteui-webcomponents/pull/2563)
- #### Tabs
- - With `alignment="justify"`, a hidden tab no longer leaves an empty space. Before, each hidden tab kept a share of the width.
- - Tabs in a panel of a tabs with `alignment="justify"` now keep the width limit of a header. Before, they took the `justify` width of the outer tabs.
- - The scroll buttons and the selection of a hidden tab no longer scroll the header strip by the position of the tabs on the page.
- - `alignment` now works in the Material, Fluent and Indigo themes. Before, `center`, `end` and `justify` rendered like `start`, because outside the Bootstrap theme the header grid did not take the full width of the strip. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- - `justify` now gives every tab the same width, as the Angular tabs do. Before, each tab got its content width and an equal part of the free space. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- - The Material and Fluent themes now paint the full header strip, as the Angular tabs do. Before, the color stopped at the last tab. [IgniteUI/igniteui-angular#17421](https://github.com/IgniteUI/igniteui-angular/issues/17421) [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- - A tab that you select through its `selected` property, from markup or by a framework binding, now scrolls into view, as for click, keyboard or `select()`. The scroll stays in the header strip and never moves the page. The fix for [#2267](https://github.com/IgniteUI/igniteui-webcomponents/issues/2267) stays in effect. A tab added as selected that makes the strip overflow now scrolls fully into view. Before, the new end scroll button covered part of it. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- - The scroll buttons now go away when the removal of tabs makes the strip fit again. Before, the buttons stayed, because the overflow measurement included their own columns. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
- - A tab added as selected now gets the selection, also when the selected tab is deselected or removed at the same time, as a framework render or new `innerHTML` does. A selected tab that moves keeps the selection. Before, the first tab got the selection in these cases. When several tabs become selected at the same time, the last one in document order gets the selection, as in the initial markup. [#2446](https://github.com/IgniteUI/igniteui-webcomponents/pull/2446)
- - Tabs that you remove before their first frame no longer throw `Failed to execute 'observe' on 'ResizeObserver'`. This occurs when a framework renders the tabs and replaces them at once, for example in a grid detail row. When you add these tabs again, the selected indicator and the scroll buttons now follow a change of size. [#2416](https://github.com/IgniteUI/igniteui-webcomponents/issues/2416) [#2467](https://github.com/IgniteUI/igniteui-webcomponents/pull/2467)
- - The arrow keys, Enter and Space now work when the tabs are projected through the slot of another component. Before, the arrow keys moved the focus to the first or the last tab, and Enter and Space did nothing.
- - The selected indicator now follows a change of size of a tab header, for example a new label. Before, it kept its old width and position until the strip changed its size.
- - The arrows of the scroll buttons now point the right way when `dir="rtl"` is on the `html` element, on the tabs or on another ancestor. Before, only `dir="rtl"` on `body` turned them.
- - The selected indicator now moves when the direction changes, also through `dir` on an ancestor. Before, it kept its position until the next update of the tabs.
- - Tabs that another component projects through its slot are now followed after the first render: a change of `selected` or `disabled`, and tabs that are added or removed. Before, two tabs could show as selected, and a new tab got no position in the set.
- - Changes to the tabs made while the component is detached now apply when it connects again. Before, a removed selected tab stayed the selection, and the Tab key could not reach the strip.
- - The arrow keys now skip a tab that does not render, such as a tab with the `hidden` attribute. Before, the focus stayed on the current tab and the hidden tab was selected.
- - The tabs now measure in their own CSS pixels under an ancestor `zoom`. Before, the panels could be wider than the strip, and a selected tab could scroll out of view.
- - An element with `position: fixed` in the selected panel is now placed against the viewport. Before, the panel had a `transform`, so the panel was the containing block of the element.
+ - `alignment` works in the Material, Fluent and Indigo themes. With `justify`, all the tabs have the same width, and a hidden tab leaves no space. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431) [#2556](https://github.com/IgniteUI/igniteui-webcomponents/pull/2556)
+ - The Material and Fluent themes paint the full header strip. [IgniteUI/igniteui-angular#17421](https://github.com/IgniteUI/igniteui-angular/issues/17421) [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
+ - A tab that you select through its `selected` property scrolls into view inside the strip. A new selected tab that makes the strip overflow scrolls fully into view. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
+ - The scroll buttons go away when the tabs fit again. [#2431](https://github.com/IgniteUI/igniteui-webcomponents/pull/2431)
+ - A tab added as selected keeps the selection when the previous selected tab goes at the same time, as in a framework render. [#2446](https://github.com/IgniteUI/igniteui-webcomponents/pull/2446)
+ - Tabs that you remove before their first frame no longer throw `Failed to execute 'observe' on 'ResizeObserver'`. [#2416](https://github.com/IgniteUI/igniteui-webcomponents/issues/2416) [#2467](https://github.com/IgniteUI/igniteui-webcomponents/pull/2467)
+ - Tabs that another component projects through its slot: the keyboard works, and changes to the tabs apply. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
+ - The selected indicator follows a change of size of a header and a change of direction. The scroll button arrows follow `dir="rtl"` on any ancestor. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
+ - Changes made while the tabs are detached apply when they connect again. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
+ - The tabs measure correctly under an ancestor with `zoom`. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
+ - The strip no longer snaps to the edge of a tab when you scroll it by touch after a scroll button press. [#2497](https://github.com/IgniteUI/igniteui-webcomponents/pull/2497)
+ - Tabs in a panel of `justify` tabs keep the width limit of a header. [#2556](https://github.com/IgniteUI/igniteui-webcomponents/pull/2556)
+ - The scroll buttons and the selection of a hidden tab no longer scroll the strip. [#2556](https://github.com/IgniteUI/igniteui-webcomponents/pull/2556)
+ - An element with `position: fixed` in the selected panel is placed against the viewport. [#2549](https://github.com/IgniteUI/igniteui-webcomponents/pull/2549)
- #### Text selection
- - In the input and the textarea, `setRangeText()` without `start` and `end` now replaces the selected text, as the native method does. Before, it inserted the text at the start of the value. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432) [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451)
- - In the date picker, the `start` and `end` parameters of `setRangeText()` are now optional, as in the date time input. Without them, the method replaces the selected text. Before, the TypeScript signature required them, although the method worked without them. [#2452](https://github.com/IgniteUI/igniteui-webcomponents/pull/2452)
+ - In the input and the textarea, `setRangeText()` without `start` and `end` replaces the selected text, as the native method does. [#2432](https://github.com/IgniteUI/igniteui-webcomponents/pull/2432) [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451)
+ - In the date picker, the `start` and `end` parameters of `setRangeText()` are optional in TypeScript. [#2452](https://github.com/IgniteUI/igniteui-webcomponents/pull/2452)
- #### Textarea
- - A height that the user sets with the resize handle now stays. Before, the control went back to its `rows` height at once. [#2479](https://github.com/IgniteUI/igniteui-webcomponents/pull/2479)
- - A change of `minLength` or `maxLength` now updates the validity immediately. Before, the validity changed only at the next change of the value. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
- - Whitespace in the default slot, such as the indentation around a slotted helper text, no longer clears the value. Before, it replaced the value from the `value` attribute or the property with an empty string, and whitespace added later cleared the text that the user typed. Projected text still sets the value, and its removal still clears the value. [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451)
- - The `spellcheck` attribute now works as the native attribute: only `false` turns the spell check off. Before, an empty attribute, such as ``, and a removed attribute turned it off. [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451)
+ - A height that the user sets with the resize handle stays. [#2479](https://github.com/IgniteUI/igniteui-webcomponents/pull/2479)
+ - A change of `minLength` or `maxLength` updates the validity at once. [#2461](https://github.com/IgniteUI/igniteui-webcomponents/pull/2461)
+ - Whitespace in the default slot, such as the indentation around a helper text, no longer clears the value. [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451)
+ - `spellcheck` works as the native attribute: only `false` turns the spell check off. [#2451](https://github.com/IgniteUI/igniteui-webcomponents/pull/2451)
- #### Theming
- - The breadcrumbs, button and combo now fall back to their default sizes when `--ig-size-small`, `--ig-size-medium` and `--ig-size-large` are not registered, for example with a theme used only from a shadow root. Before, they could take the wrong size. [igniteui-theming#652](https://github.com/IgniteUI/igniteui-theming/issues/652)
- - A theme change now replaces only the theme style sheets of a component. It keeps the style sheets that other code adopted into the shadow root, after the theme style sheets. Before, a theme change removed them. [#2436](https://github.com/IgniteUI/igniteui-webcomponents/pull/2436)
+ - The breadcrumbs, button and combo use their default sizes when `--ig-size-small`, `--ig-size-medium` and `--ig-size-large` are not registered, for example with a theme used only in a shadow root. [igniteui-theming#652](https://github.com/IgniteUI/igniteui-theming/issues/652) [#2544](https://github.com/IgniteUI/igniteui-webcomponents/pull/2544)
+ - A theme change keeps the style sheets that other code adopted into the shadow root. [#2436](https://github.com/IgniteUI/igniteui-webcomponents/pull/2436)
- #### Tile manager
- Focus and accessibility: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - Maximize and full screen now keep the focus on the action, also when resizing is on. Before, the tile rendered its content again, so the focus went to the page body.
- - While a tile is maximized, the other tiles are hidden, and Tab skips their content. Before, Tab moved the focus into the tiles under the maximized tile.
- - The divider under the tile header is hidden from assistive technologies. Before, screen readers found a separator in each tile.
- - Maximize: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - Two quick clicks on the maximize action now set the state that the two `igcTileMaximize` events report. Before, the tile toggled two times, and a skipped view transition caused an unhandled error.
- - When you remove a maximized tile, the manager now releases the grid height that it kept for that tile.
- - The tile manager keeps its background while a tile is maximized.
- - Full screen: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - `fullscreen` now follows the browser. It becomes `false` after Escape, also when a listener cancels `igcTileFullscreen`. It becomes `true` when a custom `fullscreen-action` calls `requestFullscreen()` on the tile. The `igcTileFullscreen` event after such a change is not cancelable, because the change already occurred. Before, the tile could show the wrong actions and keep resizing off.
- - When the browser rejects a request to enter full screen, the tile now emits `igcTileFullscreen` with `state: false`, which is not cancelable. A rejected exit works the same way, with `state: true`. Before, a rejected entry rolled back the state without an event, and after a rejected exit the tile showed the normal state while it stayed in full screen.
- - A fullscreen tile that you remove from the page and add again is no longer `fullscreen`. Before, the tile kept the state, and drag and resize stayed off.
- - Touch: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - A maximized or fullscreen tile now scrolls by touch while dragging is on. Before, the tile canceled each `touchstart`, although you cannot drag it in that state.
- - With `drag-mode="tile-header"`, the tile content now scrolls by touch, and you can drag an image or a link in it natively. The actions and the resize handles no longer cancel a touch. Before, the tile canceled every `touchstart` and `dragstart`, also where a drag cannot start.
- - Drag and resize: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - A drag no longer swaps with a tile that leaves the manager before the swap applies. Before, the dragged tile could take the position of the removed tile, so two tiles had the same position.
- - A drag now swaps with a tile that the pointer gets to directly from a different tile, as in a fast move. Before, the drag swapped only after the pointer went through a gap between the tiles.
- - A dragged tile keeps its size. Before, the line around its placeholder was a border, which made the tile 2 px larger in a grid that sizes to its content.
- - Escape after a drag that moved a tile back and forth now restores every tile, also when tiles leave the manager during the drag or the next drag starts at once. A tile that moves to a different manager during the drag keeps its place there. A start column that a smaller `columnCount` removed stays removed. A layout from `loadLayout()` during the drag stays. Before, two tiles could get the same position, and a tile could get a width of 0.
- - A drag or a resize now cancels when the tile leaves the page, also from an `igcTileDragStart` or `igcTileResizeStart` listener, or when the browser sends `pointercancel`. The tile then emits `igcTileDragCancel` or `igcTileResizeCancel`. Before, the tile stayed invisible or half transparent and did not accept clicks. The events of a second pointer no longer move or end the operation.
- - A tile that moves out of its manager no longer drags or resizes. The tiles of a manager that the browser defines after them now connect to it.
- - The drag and resize styles of a tile now apply also when the tile has a `part` attribute of its own.
- - Resizing now works for a tile whose `grid-column` or `grid-row` comes from author CSS, and the spans and the starts take whole numbers. A start from a negative line, such as `-1 / span 2`, now comes from the place of the tile. Before, the resize caused an error and left its preview in the page, and it read a negative line as a line from the start.
- - A resize below the last row now reads `min-row-height` and `min-column-width` in any CSS length, such as `rem`. Before, `10rem` counted as 10 pixels, so the tile got too many new rows.
- - In a right-to-left layout, the side and corner resize handles are on the left edge, and the tile and its preview both grow to the left. Before, the handles were on the right edge, and the preview grew to the right while the tile grew to the left.
- - Layout: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - When tiles move in the DOM, for example when a framework reorders a list, their positions no longer change. Before, a moved tile changed places with the tile before it.
- - `loadLayout` now gives every tile a unique position, and `position` takes a whole number. A value that applies to no tile changes no position. Before, a layout with two equal positions gave two tiles the same place, and a fractional position did not change the CSS `order`.
- - A fractional `columnCount`, such as `column-count="2.5"`, is now truncated to a whole number. Before, the grid had no columns.
- - In a manager that is narrower than `minColumnWidth`, a responsive column now takes the width of the manager. Before, the column kept the minimum width, and the manager scrolled horizontally.
- - Nested tile managers:
- - An inner manager no longer takes the column count or the gap of the outer manager. Before, an inner manager without `column-count` or `gap` used the values of the outer manager.
- - A drag moves only the innermost tile, and it changes places only with the tiles of its own manager. Before, the outer tile also started a drag, and an inner tile could change places with the outer tile that held it. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - The tiles of an inner manager no longer take the spans and the starts of the tile that holds the manager. Before, a resize of the outer tile to two columns or two rows made each inner tile two columns wide or two rows tall. [#2457](https://github.com/IgniteUI/igniteui-webcomponents/pull/2457)
- - The swaps of a tile that holds a nested tile manager now animate. Before, the drag preview copied the view transition names of the inner tiles, so the browser skipped each swap transition and logged a duplicate name. [#2457](https://github.com/IgniteUI/igniteui-webcomponents/pull/2457)
+ - Maximize and full screen keep the focus on the action.
+ - While a tile is maximized, Tab skips the other tiles.
+ - Screen readers no longer find a separator in each tile.
+ - Maximize and full screen: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
+ - Two quick clicks on the maximize action no longer cause an unhandled error.
+ - When you remove a maximized tile, the manager releases the grid height that it kept for the tile.
+ - `fullscreen` follows the browser, also after Escape or after a custom action calls `requestFullscreen()`. When the browser rejects a change, the tile emits an `igcTileFullscreen` with the real state, which you cannot cancel.
+ - A fullscreen tile that you remove and add again is no longer `fullscreen`.
+ - Touch: a maximized or fullscreen tile scrolls by touch. With `drag-mode="tile-header"`, the content scrolls by touch, and the native drag of images and links works. [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
+ - Drag and resize: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456) [#2565](https://github.com/IgniteUI/igniteui-webcomponents/pull/2565)
+ - A drag swaps with the tile under the pointer also during a fast move. It no longer swaps with a tile that left the manager.
+ - Escape after a drag restores every tile.
+ - A drag or a resize cancels when the tile leaves the page or the browser sends `pointercancel`. The tile then emits `igcTileDragCancel` or `igcTileResizeCancel`. A second pointer no longer moves or ends the operation.
+ - A resize works with a `grid-column` or `grid-row` from your CSS, with `min-row-height` and `min-column-width` in any CSS unit, and with a percentage `gap`.
+ - In a right-to-left layout, the resize handles are on the left edge, and a drag reads the CSS `direction`.
+ - The copy of the tile during a drag no longer acts as a second tile. Its form controls, frames and media do nothing.
+ - A dragged tile keeps its size.
+ - A drag gives an inline `user-select` back to the page body when it ends. A resize also stops text selection and touch scrolling.
+ - Layout: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456) [#2565](https://github.com/IgniteUI/igniteui-webcomponents/pull/2565)
+ - Tiles that move in the DOM, for example in a list that a framework sorts, keep their positions.
+ - `loadLayout()` gives every tile a unique position.
+ - A fractional `columnCount` is truncated to a whole number.
+ - In a manager that is narrower than `minColumnWidth`, a responsive column takes the width of the manager.
+ - Nested tile managers: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456) [#2457](https://github.com/IgniteUI/igniteui-webcomponents/pull/2457) [#2565](https://github.com/IgniteUI/igniteui-webcomponents/pull/2565)
+ - An inner manager no longer takes the column count, the gap, the spans or the starts of the outer manager or tile.
+ - A drag moves only the innermost tile, and it swaps only with the tiles of its own manager.
+ - The swaps of a tile that holds a nested manager animate.
- Previews and animations: [#2456](https://github.com/IgniteUI/igniteui-webcomponents/pull/2456)
- - The drag and resize previews now render in the nearest modal dialog, fullscreen element or open popover that holds the manager, such as the dialog of `igc-dialog`. There, a preview does not scroll or clip with its container, and it covers the tile also when the container has a translate or a scale, such as the one that centers a modal. Rotation is not supported. Before, the previews went into the document body, under the container.
- - The drag and resize previews in the page body now cover the tile, also when the body is positioned or has a filter, and when the page scrolls during the operation. Before, the drag preview was off by the margin of the body. In a positioned body, both previews were off.
- - The maximize, restore and resize animations now keep the tile content sharp. The tile box grows or shrinks and shows the content at its real size. The new content fades in, and the tiles under a maximized tile fade in place. The drag preview stays on the pointer during a swap. Before, the animation stretched the tile images, so the text was blurred and out of shape, and the covered tiles moved. The animation rules are in the theme style sheets, such as `themes/light/bootstrap.css`. Your view transition classes stay on the tile. Browsers without view transition classes keep the default animation.
- - A drag no longer clears an inline `user-select` on the page body. The body gets its value back when the drag ends. A resize now also stops text selection and touch scrolling while it runs, as a drag does.
- - The copy of the tile that shows during a drag no longer acts as a second tile. Before, a checked radio in it unchecked the radio that the user chose in the tile, a form control in it added a second value to a form, a frame loaded its page again, and audio or video with `autoplay` played.
- - A resize now snaps to the tracks with a percentage gap, such as `gap="5%"`. Before, it read the percentage as pixels, so the tile could get one more column or row.
- - A drag now reads the layout direction from the CSS `direction`, as a resize does. Before, with `direction: rtl` and no `dir` attribute, the drag read the pointer moves as left to right, so a tile did not swap back toward the start of the row.
+ - The drag and resize previews render in the nearest modal dialog, fullscreen element or open popover. They cover the tile also when the page body is positioned or the page scrolls.
+ - The maximize, restore and resize animations keep the content sharp. The animation rules are in the theme style sheets.
- #### Tooltip
- - An event in both `show-triggers` and `hide-triggers`, such as `click` with `show-triggers="click"`, is now handled one time. Before, the tooltip handled it two times and emitted `igcOpening` two times.
- - `show()` with the configured anchor, after a show at another target, now binds the triggers of the anchor one time. Before, they were bound two times, so the anchor emitted each event two times.
- - `show(target)` after a change of `anchor` in the same task now shows the tooltip at the target. Before, the new `anchor` replaced the target.
- - An open tooltip that moves in the DOM now closes on Escape and hides when the pointer leaves it. Before, it ignored both.
- - A tooltip that is removed while it opens, or that opens before it is in the page, no longer takes the Escape key. Before, Escape could close that tooltip and not the visible one.
- - Removing the `placement` attribute no longer throws an error. The tooltip uses the default placement, `bottom`.
- - With `with-arrow` and a `-start` or `-end` placement on a small anchor, the arrow now stays inside the tooltip. Before, the 8 px offset of these placements could move the arrow out.
- - With `with-arrow`, the arrow is now centered on the anchor also on the first show. Before, it was off center by half its width until the tooltip opened a second time, in browsers with CSS anchor positioning. In all browsers, it was also off center after a change of the placement from the top or bottom side to the left or right side, or back. [#2520](https://github.com/IgniteUI/igniteui-webcomponents/issues/2520)
- - A change of `open` now ends a show or a hide that waits for its delay or animates, and the tooltip keeps the new state. The method then resolves `false`, and the tooltip sends no `igcOpened` or `igcClosed`. Before, the show or the hide ran at the end of the delay or the animation. It overwrote `open`, for example `open = false` during the show animation opened the tooltip again, or it played again over the new state, for example `open = true` during the show delay played the show animation again over the open tooltip.
- - When the pointer leaves the anchor during the show animation, the animation now ends at once, and the tooltip is not inert during the hide delay. A pointer on the tooltip then keeps it open. Before, the tooltip stayed inert until the animation ended. When the pointer entered the anchor again, or `show()` was called, before the hide delay ended, the tooltip stayed inert until it closed again, so the close button of a sticky tooltip did not work.
- - `message` now shows when there is only white space between the tags, for example a line break between `` and ` `. Before, the white space replaced `message`, and the tooltip was empty.
+ - An event in both `show-triggers` and `hide-triggers` emits `igcOpening` one time, not two. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
+ - After a show at another target, the triggers of the anchor bind one time, not two. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
+ - `show(target)` after a change of `anchor` in the same task shows the tooltip at the target. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
+ - A tooltip that moves in the DOM still closes on Escape and hides when the pointer leaves it. A tooltip that you remove while it opens no longer takes the Escape key. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
+ - Removing the `placement` attribute no longer throws an error. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
+ - With `with-arrow`, the arrow is at the center of the anchor on the first show, and it stays inside the tooltip for the `-start` and `-end` placements. [#2520](https://github.com/IgniteUI/igniteui-webcomponents/issues/2520) [#2524](https://github.com/IgniteUI/igniteui-webcomponents/pull/2524) [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
+ - `message` shows when there is only whitespace between the tags. [#2561](https://github.com/IgniteUI/igniteui-webcomponents/pull/2561)
- #### Tree
- - A tree item outside a tree no longer renders a selection checkbox.
+ - A tree item outside a tree no longer renders a selection checkbox. [#2488](https://github.com/IgniteUI/igniteui-webcomponents/pull/2488)
- #### Virtual scroll
- - `layoutComplete` now resolves after the rendered items are measured. Before, it could resolve first. So `scrollToIndex` stopped its correction early, and an item with a size different from the estimate landed up to tens of pixels from the requested edge. [#2410](https://github.com/IgniteUI/igniteui-webcomponents/pull/2410)
- - A list larger than the maximum scroll size of the browser now shows its last items at the end of the scroll range, and `scrollToIndex` puts the item at the requested edge. The items also move evenly during a scroll. Before, the last items were out of reach, the item landed tens of pixels off, and the items jumped some pixels each time the rendered window changed. [#2410](https://github.com/IgniteUI/igniteui-webcomponents/pull/2410)
- - A new `data` array with new items at the rendered indices now measures those items again. Before, an item element that kept its index was not measured again. So the scroll size and the item positions used the estimate until the item left the rendered window. [#2412](https://github.com/IgniteUI/igniteui-webcomponents/pull/2412)
- - A `data` change in the same task as `scrollToIndex()` now renders at the new offset. Before, the list rendered the window of the old offset until the `scroll` event. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
+ - `scrollToIndex` puts the item at the requested edge, also when its size is different from the estimate. `layoutComplete` resolves after the rendered items are measured. [#2410](https://github.com/IgniteUI/igniteui-webcomponents/pull/2410)
+ - A list larger than the maximum scroll size of the browser shows its last items, and its items move evenly during a scroll. [#2410](https://github.com/IgniteUI/igniteui-webcomponents/pull/2410)
+ - A new `data` array measures the new items at the rendered indices again. [#2412](https://github.com/IgniteUI/igniteui-webcomponents/pull/2412)
+ - A `data` change in the same task as `scrollToIndex()` renders at the new offset. [#2545](https://github.com/IgniteUI/igniteui-webcomponents/pull/2545)
### Security
- #### Tile manager
- - `loadLayout` now copies only the serialized tile properties: the spans, the positions, the flags and `id`. A layout from storage or a server can no longer set `innerHTML` on a tile or replace its prototype through `__proto__`. The method ignores a value that is not an array and an entry that is not an object. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
+ - `loadLayout` copies only the serialized tile properties: the spans, the positions, the flags and `id`. So a layout from storage or a server can no longer set `innerHTML` on a tile or change its prototype through `__proto__`. The method ignores a value that is not an array, and an entry that is not an object. [#2409](https://github.com/IgniteUI/igniteui-webcomponents/pull/2409)
## [7.4.1] - 2026-09-25
### Added