<!-- Please refer to our contributing documentation for any questions on submitting a pull request, or let us know here if you need any help: https://ionicframework.com/docs/building/contributing --> <!-- Some docs updates need to be made in the `ionic-docs` repo, in a separate PR. See https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#modifying-documentation for details. --> <!-- Please do not submit updates to dependencies unless it fixes an issue. --> <!-- Please try to limit your pull request to one type (bugfix, feature, etc). Submit multiple pull requests if needed. --> ## What is the current behavior? <!-- Please describe the current behavior that you are modifying. --> Breaking changes for v6 and v7 are in the same file <!-- Issues are required for both bug fixes and features. --> ## What is the new behavior? <!-- Please describe the behavior or changes that are being added by this PR. --> - Breaking changes for v6 are in their own file - BREAKING.md only includes breaking changes for v7 - BREAKING.md links to breaking changes for v6 ## Does this introduce a breaking change? - [ ] Yes - [x] No <!-- If this introduces a breaking change, please describe the impact and migration path for existing applications below. --> ## Other information <!-- Any other information that is important to this PR such as screenshots of how the component looks before and after the change. -->
18 KiB
Breaking Changes
This is a comprehensive list of the breaking changes introduced in the major version releases of Ionic Framework.
Versions
Version 7.x
Browser and Platform Support
This section details the desktop browser, JavaScript framework, and mobile platform versions that are supported by Ionic 7.
Minimum Browser Versions
| Desktop Browser | Supported Versions |
|---|---|
| Chrome | 79+ |
| Safari | 14+ |
| Firefox | 70+ |
| Edge | 79+ |
Minimum JavaScript Framework Versions
| Framework | Supported Version |
|---|---|
| Angular | 14+ |
| React | 17+ |
| Vue | 3.0.6+ |
Minimum Mobile Platform Versions
| Platform | Supported Version |
|---|---|
| iOS | 14+ |
| Android | 5.1+ with Chromium 79+ |
Components
Accordion Group
-
ionChangeis no longer emitted when thevalueofion-accordion-groupis modified externally.ionChangeis only emitted from user committed changes, such as clicking or tapping the accordion header. -
Accordion Group no longer automatically adjusts the
valueproperty when passed an array andmultiple="false". Developers should update their apps to ensure they are using the API correctly.
Action Sheet
- Action Sheet is updated to align with the design specification.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
--height |
100% |
auto |
Button
- Button is updated to align with the design specification for iOS.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
$button-ios-letter-spacing |
-0.03em |
0 |
$button-ios-clear-letter-spacing |
0 |
Removed |
$button-ios-height |
2.8em |
3.1em |
$button-ios-border-radius |
10px |
14px |
$button-ios-large-height |
2.8em |
3.1em |
$button-ios-large-border-radius |
12px |
16px |
Back Button
- Back Button is updated to align with the design specification for iOS.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
--icon-margin-end |
-5px |
1px |
--icon-font-size |
1.85em |
1.6em |
Card Header
- The card header has ben changed to a flex container with direction set to
column(top to bottom). Iniosmode the direction is set tocolumn-reversewhich results in the subtitle displaying on top of the title.
Checkbox
-
ionChangeis no longer emitted when thecheckedproperty ofion-checkboxis modified externally.ionChangeis only emitted from user committed changes, such as clicking or tapping the checkbox. -
The
--backgroundand--background-checkedCSS variables have been renamed to--checkbox-backgroundand--checkbox-background-checkedrespectively.
Datetime
-
ionChangeis no longer emitted when thevalueproperty ofion-datetimeis modified externally.ionChangeis only emitted from user committed changes, such as clicking or tapping a date. -
Datetime no longer automatically adjusts the
valueproperty when passed an array andmultiple="false". Developers should update their apps to ensure they are using the API correctly. -
Datetime no longer incorrectly reports the time zone when
valueis updated. Datetime does not manage time zones, so any time zone information provided is ignored. -
Passing the empty string to the
valueproperty will now error as it is not a valid ISO-8601 value. -
The haptics when swiping the wheel picker are now enabled only on iOS.
Input
-
ionChangeis no longer emitted when thevalueofion-inputis modified externally.ionChangeis only emitted from user committed changes, such as typing in the input and the input losing focus, clicking the clear action within the input, or pressing the "Enter" key.- If your application requires immediate feedback based on the user typing actively in the input, consider migrating your event listeners to using
ionInputinstead.
- If your application requires immediate feedback based on the user typing actively in the input, consider migrating your event listeners to using
-
The
debounceproperty has been updated to control the timing in milliseconds to delay the event emission of theionInputevent after each keystroke. Previously it would delay the event emission ofionChange. -
The
debounceproperty's default value has changed from0toundefined. Ifdebounceis undefined, theionInputevent will fire immediately. -
The
detailpayload for theionInputevent now contains an object with the currentvalueas well as the native event that triggeredionInput.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
--placeholder-opacity |
0.5 |
0.6 |
Item
Design tokens
iOS:
| Token | Previous Value | New Value |
|---|---|---|
$item-ios-font-size |
17px |
16px |
--inner-padding-end |
10px |
16px |
--padding-start |
20px |
16px |
Modal
- The
swipeToCloseproperty has been removed in favor ofcanDismiss. - The
canDismissproperty now defaults totrueand can no longer be set toundefined.
Overlays
Ionic now listens on the keydown event instead of the keyup event when determining when to dismiss overlays via the "Escape" key. Any applications that were listening on keyup to suppress this behavior should listen on keydown instead.
Picker
- The
refreshkey has been removed from thePickerColumninterface. Developers should use thecolumnsproperty to refresh theion-pickerview.
Radio Group
ionChangeis no longer emitted when thevalueofion-radio-groupis modified externally.ionChangeis only emitted from user committed changes, such as clicking or tapping anion-radioin the group.
Range
-
Range is updated to align with the design specification for supported modes.
Design tokens
iOS:
Token Previous Value New Value --bar-border-radius0px$range-ios-bar-border-radius(2pxdefault)--knob-size28px$range-ios-knob-width(26pxdefault)$range-ios-bar-height2px4px$range-ios-bar-background-colorrgba(var(--ion-text-color-rgb, 0, 0, 0), .1)var(--ion-color-step-900, #e6e6e6)$range-ios-knob-box-shadow0 3px 1px rgba(0, 0, 0, .1), 0 4px 8px rgba(0, 0, 0, .13), 0 0 0 1px rgba(0, 0, 0, .02)0px 0.5px 4px rgba(0, 0, 0, 0.12), 0px 6px 13px rgba(0, 0, 0, 0.12)$range-ios-knob-width28px26px -
ionChangeis no longer emitted when thevalueofion-rangeis modified externally.ionChangeis only emitted from user committed changes, such as dragging and releasing the range knob or selecting a new value with the keyboard arrows.- If your application requires immediate feedback based on the user actively dragging the range knob, consider migrating your event listeners to using
ionInputinstead.
- If your application requires immediate feedback based on the user actively dragging the range knob, consider migrating your event listeners to using
-
The
debounceproperty's value value has changed from0toundefined. Ifdebounceis undefined, theionInputevent will fire immediately. -
Range no longer clamps assigned values within bounds. Developers will need to validate the value they are assigning to
ion-rangeis within theminandmaxbounds when programmatically assigning a value. -
The
nameproperty defaults toion-r-${rangeIds++}whererangeIdsis a number that is incremented for every instance ofion-range.
Searchbar
-
ionChangeis no longer emitted when thevalueofion-searchbaris modified externally.ionChangeis only emitted from user committed changes, such as typing in the searchbar and the searchbar losing focus or pressing the "Enter" key.- If your application requires immediate feedback based on the user typing actively in the searchbar, consider migrating your event listeners to using
ionInputinstead.
- If your application requires immediate feedback based on the user typing actively in the searchbar, consider migrating your event listeners to using
-
The
debounceproperty has been updated to control the timing in milliseconds to delay the event emission of theionInputevent after each keystroke. Previously it would delay the event emission ofionChange. -
The
debounceproperty's default value has changed from 250 toundefined. Ifdebounceis undefined, theionInputevent will fire immediately. -
The
detailpayload for theionInputevent now contains an object with the currentvalueas well as the native event that triggeredionInput.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
--placeholder-opacity |
0.5 |
0.6 |
Segment
-
ionChangeis no longer emitted when thevalueofion-segmentis modified externally.ionChangeis only emitted from user committed changes, such as clicking a segment button or dragging to activate a segment button. -
The type signature of
valuesupportsstring | undefined. Previously the type signature wasstring | null | undefined.- Developers needing to clear the checked segment item should assign a value of
''instead ofnull.
- Developers needing to clear the checked segment item should assign a value of
Select
-
ionChangeis no longer emitted when thevalueofion-selectis modified externally.ionChangeis only emitted from user committed changes, such as confirming a selected option in the select's overlay. -
The
iconCSS Shadow Part now targets anion-iconcomponent.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
--placeholder-opacity |
0.33 |
0.6 |
Slides
ion-slides, ion-slide, and the IonicSwiper plugin have been removed from Ionic.
Developers using these components will need to migrate to using Swiper.js directly, optionally using the IonicSlides plugin. Guides for migration and usage are linked below:
Textarea
-
ionChangeis no longer emitted when thevalueofion-textareais modified externally.ionChangeis only emitted from user committed changes, such as typing in the textarea and the textarea losing focus.- If your application requires immediate feedback based on the user typing actively in the textarea, consider migrating your event listeners to using
ionInputinstead.
- If your application requires immediate feedback based on the user typing actively in the textarea, consider migrating your event listeners to using
-
The
debounceproperty has been updated to control the timing in milliseconds to delay the event emission of theionInputevent after each keystroke. Previously it would delay the event emission ofionChange. -
The
debounceproperty's default value has changed from0toundefined. Ifdebounceis undefined, theionInputevent will fire immediately. -
ionInputdispatches an event detail ofnullwhen the textarea is cleared as a result ofclear-on-edit="true". -
The
detailpayload for theionInputevent now contains an object with the currentvalueas well as the native event that triggeredionInput.
Design tokens
| Token | Previous Value | New Value |
|---|---|---|
--placeholder-opacity |
0.5 |
0.6 |
Toggle
-
ionChangeis no longer emitted when thecheckedproperty ofion-toggleis modified externally.ionChangeis only emitted from user committed changes, such as clicking the toggle to set it on or off. -
The
--backgroundand--background-checkedvariables have been renamed to--track-backgroundand--track-background-checked, respectively.
Virtual Scroll
ion-virtual-scroll has been removed from Ionic.
Developers using the component will need to migrate to a virtual scroll solution provided by their framework:
Any references to the virtual scroll types from @ionic/core have been removed. Please remove or replace these types: Cell, VirtualNode, CellType, NodeChange, HeaderFn, ItemHeightFn, FooterHeightFn, ItemRenderFn and DomRenderFn.
Config
innerHTMLTemplatesEnableddefaults tofalse. Developers who wish to use theinnerHTMLfunctionality inside ofion-alert,ion-infinite-scroll-content,ion-loading,ion-refresher-content, andion-toastmust set this config totrueand properly sanitize their content.
Types
Overlay Attribute Interfaces
ActionSheetAttributes, AlertAttributes, AlertTextareaAttributes, AlertInputAttributes, LoadingAttributes, ModalAttributes, PickerAttributes, PopoverAttributes, and ToastAttributes have been removed. Developers should use { [key: string]: any } instead.
JavaScript Frameworks
Angular
-
Angular v14 is now required to use
@ionic/angularand@ionic/angular-server. Upgrade your project to Angular v14 by following the Angular v14 update guide. -
nullvalues on form components will no longer be converted to the empty string ('') orfalse. This impactsion-checkbox,ion-datetime,ion-input,ion-radio,ion-radio-group,ion-range,ion-searchbar,ion-segment,ion-select,ion-textarea, andion-toggle. -
The dev-preview
environmentInjectorproperty has been removed fromion-tabsandion-router-outlet. Standalone component routing is now available without additional custom configuration. Remove theenvironmentInjectorproperty from yourion-tabsandion-router-outletcomponents.
React
@ionic/react and @ionic/react-router no longer ship a CommonJS entry point. Instead, only an ES Module entry point is provided for improved compatibility with Vite.
Vue
@ionic/vue and @ionic/vue-router no longer ship a CommonJS entry point. Instead, only an ES Module entry point is provided for improved compatibility with Vite.
CSS Utilities
`hidden` attribute
The [hidden] attribute has been removed from Ionic's global stylesheet. The [hidden] attribute can continue to be used, but developers will get the native hidden implementation instead. The main difference is that the native implementation is easier to override using display than Ionic's implementation.
Developers can add the following CSS to their global stylesheet if they need the old behavior:
[hidden] {
display: none !important;
}