Skip to content

Commit bdeeb53

Browse files
merge release-8.8.1 (#30999)
v8.8.1
2 parents 21fbb72 + e925d85 commit bdeeb53

40 files changed

+454
-96
lines changed

CHANGELOG.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,23 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
7+
8+
9+
### Bug Fixes
10+
11+
* **accordion:** update tabindex based on disabled state ([#30986](https://github.com/ionic-team/ionic-framework/issues/30986)) ([0e76a69](https://github.com/ionic-team/ionic-framework/commit/0e76a69370083702568825c29d63cf257d6b88f1))
12+
* **angular:** export RefresherPullEnd types ([#30991](https://github.com/ionic-team/ionic-framework/issues/30991)) ([72abcca](https://github.com/ionic-team/ionic-framework/commit/72abccaad8df3c1db004da28610fddd95ac93c02))
13+
14+
15+
### Features
16+
17+
* **toast:** add wrapper and content parts (originally intended for 8.8.0 but omitted from that release) ([#30992](https://github.com/ionic-team/ionic-framework/issues/30992)) ([366f00e](https://github.com/ionic-team/ionic-framework/commit/366f00e25f06e28aa7166275445716c2d301e44a)), closes [#30735](https://github.com/ionic-team/ionic-framework/issues/30735)
18+
19+
20+
21+
22+
623
# [8.8.0](https://github.com/ionic-team/ionic-framework/compare/v8.7.18...v8.8.0) (2026-03-04)
724

825

@@ -16,7 +33,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
1633
* **item-option:** add inner and container parts ([#30929](https://github.com/ionic-team/ionic-framework/issues/30929)) ([f8f7ffd](https://github.com/ionic-team/ionic-framework/commit/f8f7ffda318c0143d9bb5c79fe55b4ecb88e6ce3))
1734
* **item:** add inner and container parts ([#30927](https://github.com/ionic-team/ionic-framework/issues/30927)) ([a2c6559](https://github.com/ionic-team/ionic-framework/commit/a2c655923bb1cff51864949575e19028623c695d))
1835
* **list-header:** add inner part ([#30930](https://github.com/ionic-team/ionic-framework/issues/30930)) ([ef73476](https://github.com/ionic-team/ionic-framework/commit/ef73476e08670630907e775a38f9ed30a84e3f1f))
19-
* **modal:** add drag events for sheet and card modals ([#30962](https://github.com/ionic-team/ionic-framework/issues/30962)) ([d29ac71](https://github.com/ionic-team/ionic-framework/commit/d29ac713fad604c256fb385eb0c26eb9717e1ff4))
36+
* **modal:** add drag events for sheet and card modals ([#30962](https://github.com/ionic-team/ionic-framework/issues/30962)) ([d29ac71](https://github.com/ionic-team/ionic-framework/commit/d29ac713fad604c256fb385eb0c26eb9717e1ff4)), closes [#23955](https://github.com/ionic-team/ionic-framework/issues/23955)
2037
* **range:** add classes and expose parts to allow individual styling of dual knobs ([#30941](https://github.com/ionic-team/ionic-framework/issues/30941)) ([5bcf921](https://github.com/ionic-team/ionic-framework/commit/5bcf92184118055483bf306ab9e319b8e3e61870)), closes [#29862](https://github.com/ionic-team/ionic-framework/issues/29862)
2138
* **range:** add classes to the range when the value is at the min or max ([#30932](https://github.com/ionic-team/ionic-framework/issues/30932)) ([fac1a66](https://github.com/ionic-team/ionic-framework/commit/fac1a6673c88a531f1d79656be4eb544f235f819))
2239
* **refresher:** add ionPullStart and ionPullEnd events ([#30946](https://github.com/ionic-team/ionic-framework/issues/30946)) ([814c2e5](https://github.com/ionic-team/ionic-framework/commit/814c2e5ccd6d5bfda12bdf13a566cd66ff830d5b)), closes [#24524](https://github.com/ionic-team/ionic-framework/issues/24524)

core/CHANGELOG.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,23 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6+
## [8.8.1](https://github.com/ionic-team/ionic-framework/compare/v8.8.0...v8.8.1) (2026-03-06)
7+
8+
9+
### Bug Fixes
10+
11+
* **accordion:** update tabindex based on disabled state ([#30986](https://github.com/ionic-team/ionic-framework/issues/30986)) ([0e76a69](https://github.com/ionic-team/ionic-framework/commit/0e76a69370083702568825c29d63cf257d6b88f1))
12+
* **angular:** export RefresherPullEnd types ([#30991](https://github.com/ionic-team/ionic-framework/issues/30991)) ([72abcca](https://github.com/ionic-team/ionic-framework/commit/72abccaad8df3c1db004da28610fddd95ac93c02))
13+
14+
15+
### Features
16+
17+
* **toast:** add wrapper and content parts (originally intended for 8.8.0 but omitted from that release) ([#30992](https://github.com/ionic-team/ionic-framework/issues/30992)) ([366f00e](https://github.com/ionic-team/ionic-framework/commit/366f00e25f06e28aa7166275445716c2d301e44a)), closes [#30735](https://github.com/ionic-team/ionic-framework/issues/30735)
18+
19+
20+
21+
22+
623
# [8.8.0](https://github.com/ionic-team/ionic-framework/compare/v8.7.18...v8.8.0) (2026-03-04)
724

825

@@ -15,7 +32,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
1532
* **item-option:** add inner and container parts ([#30929](https://github.com/ionic-team/ionic-framework/issues/30929)) ([f8f7ffd](https://github.com/ionic-team/ionic-framework/commit/f8f7ffda318c0143d9bb5c79fe55b4ecb88e6ce3))
1633
* **item:** add inner and container parts ([#30927](https://github.com/ionic-team/ionic-framework/issues/30927)) ([a2c6559](https://github.com/ionic-team/ionic-framework/commit/a2c655923bb1cff51864949575e19028623c695d))
1734
* **list-header:** add inner part ([#30930](https://github.com/ionic-team/ionic-framework/issues/30930)) ([ef73476](https://github.com/ionic-team/ionic-framework/commit/ef73476e08670630907e775a38f9ed30a84e3f1f))
18-
* **modal:** add drag events for sheet and card modals ([#30962](https://github.com/ionic-team/ionic-framework/issues/30962)) ([d29ac71](https://github.com/ionic-team/ionic-framework/commit/d29ac713fad604c256fb385eb0c26eb9717e1ff4))
35+
* **modal:** add drag events for sheet and card modals ([#30962](https://github.com/ionic-team/ionic-framework/issues/30962)) ([d29ac71](https://github.com/ionic-team/ionic-framework/commit/d29ac713fad604c256fb385eb0c26eb9717e1ff4)), closes [#23955](https://github.com/ionic-team/ionic-framework/issues/23955)
1936
* **range:** add classes and expose parts to allow individual styling of dual knobs ([#30941](https://github.com/ionic-team/ionic-framework/issues/30941)) ([5bcf921](https://github.com/ionic-team/ionic-framework/commit/5bcf92184118055483bf306ab9e319b8e3e61870)), closes [#29862](https://github.com/ionic-team/ionic-framework/issues/29862)
2037
* **range:** add classes to the range when the value is at the min or max ([#30932](https://github.com/ionic-team/ionic-framework/issues/30932)) ([fac1a66](https://github.com/ionic-team/ionic-framework/commit/fac1a6673c88a531f1d79656be4eb544f235f819))
2138
* **refresher:** add ionPullStart and ionPullEnd events ([#30946](https://github.com/ionic-team/ionic-framework/issues/30946)) ([814c2e5](https://github.com/ionic-team/ionic-framework/commit/814c2e5ccd6d5bfda12bdf13a566cd66ff830d5b)), closes [#24524](https://github.com/ionic-team/ionic-framework/issues/24524)

core/api.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,9 +2059,11 @@ ion-toast,css-prop,--width,md
20592059
ion-toast,part,button
20602060
ion-toast,part,button cancel
20612061
ion-toast,part,container
2062+
ion-toast,part,content
20622063
ion-toast,part,header
20632064
ion-toast,part,icon
20642065
ion-toast,part,message
2066+
ion-toast,part,wrapper
20652067

20662068
ion-toggle,shadow
20672069
ion-toggle,prop,alignment,"center" | "start" | undefined,undefined,false,false

core/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ionic/core",
3-
"version": "8.8.0",
3+
"version": "8.8.1",
44
"description": "Base components for Ionic",
55
"engines": {
66
"node": ">= 16"

core/src/components.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8046,7 +8046,7 @@ declare namespace LocalJSX {
80468046
*/
80478047
"onIonRefresh"?: (event: IonRefresherCustomEvent<RefresherEventDetail>) => void;
80488048
/**
8049-
* Emitted when the user begins to start pulling down. TODO(FW-7044): Remove this in a major release
8049+
* Emitted when the user begins to start pulling down.
80508050
* @deprecated Use `ionPullStart` instead.
80518051
*/
80528052
"onIonStart"?: (event: IonRefresherCustomEvent<void>) => void;

core/src/components/accordion/accordion.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ export class Accordion implements ComponentInterface {
514514

515515
'accordion-animated': this.shouldAnimate(),
516516
}}
517+
tabindex={disabled ? '-1' : undefined}
517518
>
518519
<div
519520
onClick={() => this.toggleExpanded()}

core/src/components/refresher/refresher.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ export class Refresher implements ComponentInterface {
141141
*/
142142
@Event() ionPull!: EventEmitter<void>;
143143

144+
// TODO(FW-7044): Remove this in a major release
144145
/**
145146
* Emitted when the user begins to start pulling down.
146-
* TODO(FW-7044): Remove this in a major release
147147
*
148148
* @deprecated Use `ionPullStart` instead.
149149
*/
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import { expect } from '@playwright/test';
2+
import { configs, test } from '@utils/test/playwright';
3+
4+
/**
5+
* This behavior does not vary across directions
6+
*/
7+
configs({ directions: ['ltr'] }).forEach(({ config, title }) => {
8+
test.describe(title('toast: custom'), () => {
9+
test('should be able to customize toast wrapper, container, and content using css parts', async ({ page }) => {
10+
await page.setContent(
11+
`
12+
<ion-toast is-open="true" header="Header" message="Hello World"></ion-toast>
13+
14+
<style>
15+
ion-toast::part(wrapper) {
16+
background-color: red;
17+
}
18+
ion-toast::part(container) {
19+
background-color: green;
20+
}
21+
ion-toast::part(content) {
22+
background-color: blue;
23+
}
24+
</style>
25+
`,
26+
config
27+
);
28+
29+
const wrapperColor = await page.locator('ion-toast').evaluate((el: any) => {
30+
const partEl = el.shadowRoot?.querySelector('[part="wrapper"]') as HTMLElement | null;
31+
return partEl ? getComputedStyle(partEl).backgroundColor : null;
32+
});
33+
34+
expect(wrapperColor).toBe('rgb(255, 0, 0)');
35+
36+
const containerColor = await page.locator('ion-toast').evaluate((el: any) => {
37+
const partEl = el.shadowRoot?.querySelector('[part="container"]') as HTMLElement | null;
38+
return partEl ? getComputedStyle(partEl).backgroundColor : null;
39+
});
40+
41+
expect(containerColor).toBe('rgb(0, 128, 0)');
42+
43+
const contentColor = await page.locator('ion-toast').evaluate((el: any) => {
44+
const partEl = el.shadowRoot?.querySelector('[part="content"]') as HTMLElement | null;
45+
return partEl ? getComputedStyle(partEl).backgroundColor : null;
46+
});
47+
48+
expect(contentColor).toBe('rgb(0, 0, 255)');
49+
});
50+
51+
test('should be able to customize toast header and message using css parts', async ({ page }) => {
52+
await page.setContent(
53+
`
54+
<ion-toast is-open="true" header="Header" message="Hello World"></ion-toast>
55+
56+
<style>
57+
ion-toast::part(header) {
58+
color: red;
59+
}
60+
ion-toast::part(message) {
61+
color: green;
62+
}
63+
</style>
64+
`,
65+
config
66+
);
67+
68+
const headerColor = await page.locator('ion-toast').evaluate((el: any) => {
69+
const partEl = el.shadowRoot?.querySelector('[part="header"]') as HTMLElement | null;
70+
return partEl ? getComputedStyle(partEl).color : null;
71+
});
72+
73+
expect(headerColor).toBe('rgb(255, 0, 0)');
74+
75+
const messageColor = await page.locator('ion-toast').evaluate((el: any) => {
76+
const partEl = el.shadowRoot?.querySelector('[part="message"]') as HTMLElement | null;
77+
return partEl ? getComputedStyle(partEl).color : null;
78+
});
79+
80+
expect(messageColor).toBe('rgb(0, 128, 0)');
81+
});
82+
83+
test('should be able to customize toast icon, button, and button cancel using css parts', async ({ page }) => {
84+
await page.setContent(
85+
`
86+
<ion-toast is-open="true" header="Header" message="Hello World" icon="alert"></ion-toast>
87+
88+
<style>
89+
ion-toast::part(icon) {
90+
color: red;
91+
}
92+
ion-toast::part(button) {
93+
color: green;
94+
}
95+
ion-toast::part(button cancel) {
96+
color: blue;
97+
}
98+
</style>
99+
100+
<script>
101+
const toast = document.querySelector('ion-toast');
102+
toast.buttons = [
103+
{ text: 'Cancel', role: 'cancel' },
104+
{ text: 'OK' }
105+
];
106+
</script>
107+
`,
108+
config
109+
);
110+
111+
const iconColor = await page.locator('ion-toast').evaluate((el: any) => {
112+
const partEl = el.shadowRoot?.querySelector('[part="icon"]') as HTMLElement | null;
113+
return partEl ? getComputedStyle(partEl).color : null;
114+
});
115+
116+
expect(iconColor).toBe('rgb(255, 0, 0)');
117+
118+
const buttonColor = await page.locator('ion-toast').evaluate((el: any) => {
119+
const partEl = el.shadowRoot?.querySelector('[part="button"]') as HTMLElement | null;
120+
return partEl ? getComputedStyle(partEl).color : null;
121+
});
122+
123+
expect(buttonColor).toBe('rgb(0, 128, 0)');
124+
125+
const buttonCancelColor = await page.locator('ion-toast').evaluate((el: any) => {
126+
const partEl = el.shadowRoot?.querySelector('[part="button cancel"]') as HTMLElement | null;
127+
return partEl ? getComputedStyle(partEl).color : null;
128+
});
129+
130+
expect(buttonCancelColor).toBe('rgb(0, 0, 255)');
131+
});
132+
});
133+
});

core/src/components/toast/toast.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ import type {
4747
/**
4848
* @virtualProp {"ios" | "md"} mode - The mode determines which platform styles to use.
4949
*
50-
* @part button - Any button element that is displayed inside of the toast.
51-
* @part button cancel - Any button element with role "cancel" that is displayed inside of the toast.
52-
* @part container - The element that wraps all child elements.
50+
* @part wrapper - The outer wrapper for the toast overlay.
51+
* @part container - Groups the icon, content, and buttons.
52+
* @part content - The live region that contains the header and message.
5353
* @part header - The header text of the toast.
5454
* @part message - The body text of the toast.
5555
* @part icon - The icon that appears next to the toast content.
56+
* @part button - Any button element that is displayed inside of the toast.
57+
* @part button cancel - Any button element with role "cancel" that is displayed inside of the toast.
5658
*/
5759
@Component({
5860
tag: 'ion-toast',
@@ -727,7 +729,7 @@ export class Toast implements ComponentInterface, OverlayInterface {
727729
})}
728730
onIonToastWillDismiss={this.dispatchCancelHandler}
729731
>
730-
<div class={wrapperClass}>
732+
<div class={wrapperClass} part="wrapper">
731733
<div class="toast-container" part="container">
732734
{this.renderButtons(startButtons, 'start')}
733735

@@ -746,7 +748,7 @@ export class Toast implements ComponentInterface, OverlayInterface {
746748
not interrupt the user which is why this has
747749
a "status" role and a "polite" presentation.
748750
*/}
749-
<div class="toast-content" role="status" aria-atomic="true" aria-live="polite">
751+
<div class="toast-content" part="content" role="status" aria-atomic="true" aria-live="polite">
750752
{/*
751753
This logic below is done to improve consistency
752754
across platforms when showing and updating live regions.

0 commit comments

Comments
 (0)